Enrere Mòdul 6
Fonaments de programació. Llenguatge C/C++---
Pràctica    Resum teòric Exercicis
Pràctica d'ampliació

 

Inversió d'una paraula

Com a primera pràctica de cadenes de caràcters, començarem a manipular una cadena caràcter a caràcter per tal d'invertir-la.

 

Desenvolupament de la pràctica

Abans de tot, creeu un nou espai de treball per aquest mòdul amb el nom: m6. Aneu afegint un projecte nou del tipus Win32 Console Application per cada nova pràctica o exercici amb els noms que cada vegada es proposi.

Definiu un projecte nou anomenat m6p01 i afegiu-li un arxiu de font C/C++ anomenat m6p01.cpp. Escriviu el següent codi:

// m6p01.cpp: Inversió una paraula

#include <stdio.h>

void main (void){

    char paraula[21];
    int i;

    printf("Teclegi una paraula:\n");
    scanf("%s", paraula);

    i = 0;

    while(paraula[i++] != '\0');

    i=i-2;

    printf("%s té %d lletres.\n", paraula, i-1);
    printf("%s escrita al revés és: ", paraula);
    while (i >= 0) printf("%c", paraula[i--]);

    printf("\n");

}

Explicació del programa

En primer lloc, es declara una variable char i una variable de cadena paraula[21]. Aquesta variable és un vector de caràcters. Es reserva espai per 21 caràcters (21 octets).

La lectura de la paraula es fa amb la funció scanf(). La forma d’obtenir el número de caràcters és una alternativa curiosa a la funció strlen(), és la línia:

while(paraula[i++] != '\0');

Aquest bucle buit s’executa fins que es trobi el caràcter ‘\0’. Encara que el cos del bucle està buit, cada vegada que es comprova la condició, s’incrementa el valor de la variable i en una unitat, per tant, quan se surt del bucle per què s’ha trobat el caràcter de fi de cadena (‘\0’), el valor de la variable i és igual a la longitud de la cadena més una unitat (més una unitat ja que quan se troba amb el caràcter fi de cadena encara incrementa en un el valor de i). És evident que aquesta línia es podria haver substituït per:

i=strlen(paraula);

(per aquesta línia seria necessari l'arxiu capçalera string.h).

La línia que imprimeix en pantalla la paraula al revés és:

while (i >= 0) printf("%c", paraula[i--]);

És un bucle format per una única sentència, però, cada vegada que s’escriu un dels caràcters de la paraula (començant per l’últim) es decrementa el valor de la variable en 1.

Si en lloc de llegir una paraula només, es vol llegir una frase, s’ha de modificar el programa anterior ja que la funció scanf() només llegeix la primera paraula de la frase, la lectura es deté quan s’arriba al primer caràcter en blanc. 

Hi ha dues possibilitats per llegir línies senceres. Una és canviar la línia:

scanf("%s", paraula);

per la línia:

scanf("%[^\n]", paraula);

Això indica que s'ha de llegir tots els caràcters menys el caràcter de nova línia.

L'altra forma és amb la funció gets(). Aquesta funció es farà servir en les pròximes pràctiques.

Si es vol llegir un text amb més d'una línia es pot fer amb la següent sentència:

while ((c=getchar())!=EOF) frase[i++]=c;
frase[i]=’\0’

En aquest cas, la lectura es fa fins que es trobi el caràcter FI D’ARXIU (EOF). Aquest és equivalent a control z.