Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Le vocali in maiuscolo e le consonanti in minuscolo?
Forum - C/C++ - Le vocali in maiuscolo e le consonanti in minuscolo?

Avatar
perillitommaso (Normal User)
Pro


Messaggi: 186
Iscritto: 28/01/2014

Segnala al moderatore
Postato alle 17:13
Domenica, 02/02/2014
Ciao a tutti, ho un "piccolo" problemino nel creare un programma che, letta una stringa di caratteri, trasformi le vocali minuscole in maiuscolo, e le consonanti maiuscole in minuscolo ... ho cercato un po' su internet ma non ho trovato un gran che, vi lascio il codice sorgente, ci sto lavorando..
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h> // libreria della stringa
  4.  
  5. #define MAX 30 // stabiliamo la lunghezza massima della stringa, quindi 29 caratteri
  6. /*
  7. Aquisito una stringa, calcolarne la lunghezza attuale, trasformare in maiuscolo le vocali e
  8. in minuscolo le consonanti, lasciando in pace i caratteri speciali e le cifre numeriche
  9. */
  10.  
  11. int main()
  12. {
  13.     //dichiariamo le variabili di tipo char e int
  14.     char stringa[MAX];
  15.     int lung, i;
  16.    
  17.     printf("Inserisci una frase: ");
  18.     fgets (stringa, MAX, stdin); // leggiamo la variabile stringa inserita da tastiera
  19.     lung = strlen(stringa); //contiamo i caratteri della stringa con la funzione "strlen"
  20.     printf("\nLa stringa e' composta da: %d caratteri", lung); //stampiamo i caratteri della stringa
  21.     i=0; // inizializziamo il contatore dei caratteri a 0
  22.     while (i<lung){ // entriamo nel ciclo fin quando i diventa uguale alla lunghezza della stringa
  23.       //selezione delle vocali minuscole
  24.       if((stringa[i]=='a')||(stringa[i]=='e')||(stringa[i]=='i')||(stringa[i]=='o')||(stringa[i]=='u'))
  25.       {
  26.         stringa[i] = toupper(stringa[i]); //funzione "toupper" che trasforma il carattere in maiuscolo
  27.       }
  28.         i=i+1; //incrementiamo il contatore dei caratteri
  29.     }
  30.    
  31.  
  32.     return 0;
  33. }


il codice non è finito.. se ho codificato per bene mi mancano le consonanti, grazie a tutti :)

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 18:34
Domenica, 02/02/2014
Ciao!

Per utilizzare la funzione toupper( ) , è necessario includere l' header ctype.h.
( http://www.cplusplus.com/reference/cctype/ )

Per le consonanti aggiungi else all' if e usa il metodo tolower( ) .

PM Quote
Avatar
perillitommaso (Normal User)
Pro


Messaggi: 186
Iscritto: 28/01/2014

Segnala al moderatore
Postato alle 18:48
Domenica, 02/02/2014
Grazie molte per la risposta, ho modificato il mio sorgente ma ho un dubbio, quando vado ad aggiungere l'else all'if, il programma poi mi considera tutti gli altri casi come per esempio le vocali in maiuscolo oppure i numeri o i caratteri speciali, mi sbaglio oppure no?

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 19:08
Domenica, 02/02/2014
E' esattamente come dici. In questi casi, è più utile usare lo switch.
Per i caratteri simbolici, numerici o lettere accentate, i metodi toupper( ) e tolower( ) non efettuano cambiamenti.

PM Quote
Avatar
perillitommaso (Normal User)
Pro


Messaggi: 186
Iscritto: 28/01/2014

Segnala al moderatore
Postato alle 16:31
Lunedì, 03/02/2014
Grazie mille Marco ^^ il programma funziona perfettamente, posto il codice sorgente in modo che tutti possano vederlo se ne hanno bisogno
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h> // libreria della stringa
  4. #include <ctype.h> // libreria per utilizzare le funzioni " toupper" e "tolower"
  5.  
  6. #define MAX 30 // stabiliamo la lunghezza massima della stringa, quindi 29 caratteri
  7. /*
  8. Aquisito una stringa, calcolarne la lunghezza attuale, trasformare in maiuscolo le vocali e
  9. in minuscolo le consonanti, lasciando in pace i caratteri speciali e le cifre numeriche
  10. */
  11.  
  12. int main()
  13. {
  14.     //dichiariamo le variabili di tipo char e int
  15.     char stringa[MAX];
  16.     int lung, i;
  17.    
  18.     printf("Inserisci una frase: ");
  19.     fgets (stringa, MAX, stdin); // leggiamo la variabile stringa inserita da tastiera
  20.     lung = strlen(stringa); //contiamo i caratteri della stringa con la funzione "strlen"
  21.     lung = lung-1;//togliamo 1 perchè la funzione "strlen" conta anche il carattere "a capo"
  22.     printf("\nLa stringa e' composta da: %d caratteri\n", lung); //stampiamo i caratteri della stringa
  23.     i=0; // inizializziamo il contatore dei caratteri a 0
  24.     while (i<lung){ // entriamo nel ciclo fin quando i diventa uguale alla lunghezza della stringa
  25.       //selezione delle vocali minuscole
  26.       if((stringa[i]=='a')||(stringa[i]=='e')||(stringa[i]=='i')||(stringa[i]=='o')||(stringa[i]=='u'))
  27.       {
  28.         stringa[i] = toupper(stringa[i]); //funzione "toupper" che trasforma il carattere in maiuscolo
  29.       }
  30.       else
  31.       {
  32.            switch(stringa[i]) //selezione multipla delle consonati maiuscole
  33.            {
  34.              case 'B': stringa[i] = tolower(stringa[i]);//funzione "tolower" che strasforma il carattere in minuscolo
  35.              case 'C': stringa[i] = tolower(stringa[i]);
  36.              case 'D': stringa[i] = tolower(stringa[i]);
  37.              case 'F': stringa[i] = tolower(stringa[i]);
  38.              case 'G': stringa[i] = tolower(stringa[i]);
  39.              case 'H': stringa[i] = tolower(stringa[i]);
  40.              case 'L': stringa[i] = tolower(stringa[i]);
  41.              case 'M': stringa[i] = tolower(stringa[i]);
  42.              case 'N': stringa[i] = tolower(stringa[i]);
  43.              case 'P': stringa[i] = tolower(stringa[i]);
  44.              case 'Q': stringa[i] = tolower(stringa[i]);
  45.              case 'R': stringa[i] = tolower(stringa[i]);
  46.              case 'S': stringa[i] = tolower(stringa[i]);
  47.              case 'T': stringa[i] = tolower(stringa[i]);
  48.              case 'V': stringa[i] = tolower(stringa[i]);
  49.              case 'Z': stringa[i] = tolower(stringa[i]);
  50.              break;
  51.            }
  52.       }
  53.      
  54.         i=i+1; //incrementiamo il contatore dei caratteri
  55.     }
  56.     printf("\n Stringa trasformata:\n %s\n\n",stringa); //visualizzazione della stringa strasformata
  57.  
  58.     system("PAUSE");
  59. }


PM Quote
Avatar
Qwertj (Dev Team)
Guru


Messaggi: 678
Iscritto: 30/05/2011

Segnala al moderatore
Postato alle 14:44
Martedì, 04/02/2014
Un tantino ridondante!
E non funzionerebbe in caso di vocali già maiuscole o consonanti già minuscole.
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. #define MAX 30
  7. /*
  8. Aquisito una stringa, calcolarne la lunghezza attuale, trasformare in maiuscolo le vocali e
  9. in minuscolo le consonanti, lasciando in pace i caratteri speciali e le cifre numeriche
  10. */
  11.  
  12. int main()
  13. {
  14.     char stringa[MAX];
  15.     int lung;
  16.    
  17.     printf("Inserisci una frase: ");
  18.     fgets (stringa, MAX, stdin);
  19.     lung = strlen(stringa);
  20.     lung = lung-1;
  21.     printf("\nLa stringa e' composta da: %d caratteri\n", lung);
  22.  
  23.     for(int i = 0; i < lung; ++i) //il for è fatto per questo!!
  24.     {
  25.         //mettiamo tutto minuscolo
  26.         stringa[i] = tolower(stringa[i]);
  27.         //se è una vocale
  28.         if(stringa[i] == 'a' || stringa[i] == 'e' || stringa[i] == 'i' || stringa[i] == 'o' || stringa[i]=='u')
  29.         {
  30.             stringa[i] = toupper(stringa[i]);
  31.         } //altrimenti è una consonante, ma è già stata trasformata in minuscolo all'inizio del ciclo
  32.     }
  33.    
  34.     printf("\n Stringa trasformata:\n %s\n\n", stringa);
  35.  
  36.     system("PAUSE");
  37. }


Basta che metti minuscolo ogni carattere, e se è una vocale (ti conviene così e non il contrario perchè le vocali sono solo 5...) lo metti maiuscolo. Così hai la garanzia di lavorare solo con caratteri minuscoli nella condizione.

Quel while(i < lung) non si può vedere: esistono i cicli for per un motivo, una cosa del genere è illeggibile (devi andare a cercarti in tutto il corpo del while l'incremento di i per capirci qualcosa)
Tra l'altro i contatori è buona norma dichiararli nell'istruzione di inizializzazione per far si che non abbiano scope al di fuori del for: questo garantische che (a) non si lavori con contatori non azzerati per sbaglio, (b) sia facilmente individuabile un loro uso scorretto all'esterno del ciclo e (c) lavori sempre con gli stessi contatori (nessuno ti impedirebbe di dichiare di nuovo i successivamente nel programma) senza riempire il programma di dichiarazioni fantastiose (tipo int i, j, k, n, m, a, b, c, c1, c2 (visto, sigh) :pat: )
In generale, meno scope riesci a dare a una variabile, meglio è (per questo globale = evil solitamente)

Nello switch, se non metti il break dopo le etichette case, l'esecuzione non salta ed esegue anche tutte le etichette seguenti: se nel tuo programma qualcuno avesse inserito una 'B', il carattere sarebbe stato passato a tolower() ben 14 volte!
Per proseguire sulla tua falsa riga, sarebbe stato
Codice sorgente - presumibilmente C++

  1. switch(stringa[i]) {
  2.     //l'istruzione "case x:" dice al programma: inizia a eseguire lo switch da qua
  3.     //con break invece lo fai uscire dallo switch
  4.     //tutto quello che incontra tra il case corrispondente e il primo "break" dopo,
  5.     //viene eseguito, anche se fa parte di altri case!
  6.     case 'B':
  7.     case 'C':
  8.     case 'D':
  9.     case 'F':
  10.     case 'G':
  11.     case 'H':
  12.     case 'L':
  13.     case 'M':
  14.     case 'N':
  15.     case 'P':
  16.     case 'Q':
  17.     case 'R':
  18.     case 'S':
  19.     case 'T':
  20.     case 'V':
  21.     case 'Z':
  22.          stringa[i] = tolower(stringa[i]);
  23.     break; //superfluo, visto che è in fondo, ma metterlo non fa male (se dovessi aggiungere delle etichette dopo?)
  24. }


In ogni caso, analizzando la condizione dell'if, capiamo che è inutile perdere del tempo su questo switch:
Codice sorgente - presumibilmente C/C++

  1. if(stringa[j] == 'a' || stringa[j] == 'e' || stringa[j] == 'i' || stringa[j] == 'o' || stringa[j] == 'u') {
  2.     //1
  3. } else {
  4.     //2
  5. }


Il blocco di codice 1 verrà eseguito solo se stringa[j] è una vocale, di conseguenza, il blocco 2 verrà eseguito solo se stringa[j] non è una vocale: per definizione quindi, il blocco 2 sarà eseguito quando stringa[j] è una consonante. Quindi controllare che sia una consonante è superfluo.
Potrebbe essere un carattere non alafabetico: in questo caso però nè toupper() nè tolower() lo modificheranno, quindi eseguirlo o meno non cambierà l'output del programma.

:yup:

Ultima modifica effettuata da Qwertj il 04/02/2014 alle 14:46
PM Quote