Oppure

Loading
05/01/10 12:51
riccardobucco
Postato originariamente da Astaroth:

Questa volta devo scrivere una funzione che visualizzi le vocali comprese tra due caratteri inseriti dall'utente e il loro numero. Se i caratteri non sono inseriti nell'ordine corretto (ad esempio se 'z' è inserito prima di 'a'), la funzione restituisce il valore -1. Se dovessi inserire due caratteri separati da uno spazio, come dovrei modificare il codice?

#include<stdio.h>
#include<stdlib.h>

int Vocali(char c1, char c2);

main()
{
    char car1, car2;
    int voc;
    
    printf("Inserire due caratteri separati da spazio: ");
    scanf("%c%c", &car1, &car2);
    
    voc=Vocali(car1, car2);
    
    printf("\nIl numero di vocali tra i due caratteri e': %d", voc);
    
    printf("\n");
    
    system("pause");
    return 0;   
}

int Vocali(char c1, char c2)
{
    int dif=c2-c1;
    int i;
    int v=0;
    
    if(dif>0)
    {
        for(i=0; i<dif; i++)
        { 
            if(c1=='a' || c1=='e' || c1=='i' || c1=='o' || c1=='u' || c1=='A' || c1=='E' || c1=='I' || c1=='O' || c1=='U')
            {
                printf("%c", c1);
                
                v++;
            }c1++;
                
        }
        return v;
    }
    else
        return -1;
}


allora, il tuo programma dovrebbe funzionare correttamente solo se i caratteri che tu inserisci in input non sono separati da uno spazio (giusto, no?).
ad es:
input "bf"
output "1" (corretto)

input "b f"
output "-1" (errato)

quindi o ti adegui a scrivere i due caratteri senza separarli dallo spazio altrimenti, invece di leggere in input due caratteri come hai fatto tu
printf("Inserire due caratteri separati da spazio: ");
scanf("%c%c", &car1, &car2); 

ne leggi tre (il secondo, quello intermedio, è lo spazio). quindi:
printf("Inserire due caratteri separati da spazio: ");
scanf("%c%c%c", &car1, &car2, &car3); 


il programma risulterà quindi questo (basta sostituire car3 a car2):
#include<stdio.h>
#include<stdlib.h>

int Vocali(char c1, char c2);

main()
{
    char car1, car2, car3;
    int voc;
    
    printf("Inserire due caratteri separati da spazio: ");
    scanf("%c%c%c", &car1, &car2, &car3);
    
    voc=Vocali(car1, car3);
    
    printf("\nIl numero di vocali tra i due caratteri e': %d", voc);
    
    printf("\n");
    
    system("pause");
    return 0;  
}

int Vocali(char c1, char c2)
{
    int dif=c2-c1;
    int i;
    int v=0;
    
    if(dif>0)
    {
        for(i=0; i<dif; i++)
        {
            if(c1=='a' || c1=='e' || c1=='i' || c1=='o' || c1=='u' || c1=='A' || c1=='E' || c1=='I' || c1=='O' || c1=='U')
            {
                printf("%c", c1);
                
                v++;
            }c1++;
                
        }
        return v;
    }
    else
        return -1;
}

aaa
05/01/10 14:52
Zonzo
Ho fatto una piccolissima modifica al tuo programma.
Invece di effettuare molti controlli sia sulle maiuscole che minuscole, puoi ridurre i controlli convertendo in maiuscolo (con la funzione toupper()) i due caratteri prima di passargli alla funzione, facendo così solamente il test sulle maiuscole.
Ora passiamo alla domanda riguardante la scanf() il cui prototipo è:
int scanf(char *format,lista argomenti)
La stringa format viene letta da sinistra a destra e le direttive di conversione (%s,%d,%c,%e,..etc) sono messe in corrispondenza con i corrispettivi argomenti della lista.
La scanf() ignora uno o più caratteri di spaziatura (spazio,tabulazione,nuova linea) fino ad arrivare ad un carattere non di spaziatura.
Ad esempio se nel format c'è:
%d,%d
la scanf() legge il primo intero, legge e ignora la virgola e legge un'altro intero.
Questo perchè il confronto tra la format e il valore digitato confermano il confronto, cioè se io digitassi (mantenendo il format %d,%d) la stringa 3;4 non sarebbe accettato dalla scanf(), mentre se io scrivessi 3,4 la virgola conferma il confronto con la format e assegna alle variabili il loro valore ignorando la virgola.
Mentre nel nostro caso dobbiamo ignorare un carattere di spaziatura e basterà quindi scrivere così:
scanf("%c %c", &car1, &car2);

o così
scanf("%c%*c%c", &car1, &car2);//L'asterisco sopprime l'assegnamento alla variabile


Infine il tuo programma è questo qui.
#include<stdio.h> 
#include<stdlib.h> 
#include<ctype.h>

int Vocali(char c1, char c2); 

main() 
{ 
    char car1, car2; 
    int voc; 

    printf("Inserire due caratteri separati da spazio: ");
    scanf("%c %c", &car1, &car2); 
     
    car1=toupper(car1); 
    car2=toupper(car2); 
     
    voc=Vocali(car1, car2); 
     
    printf("\nIl numero di vocali tra i due caratteri e': %d\n", voc); 

    system("pause"); 
    return 0;   
} 

int Vocali(char c1, char c2) 
{ 
    int dif=c2-c1; 
    int i; 
    int v=0; 
     
    if(dif>0) 
    { 
        for(i=0; i<dif; i++ , c1++) 
        { 
            if(c1=='A' || c1=='E' || c1=='I' || c1=='O' || c1=='U') 
            { 
                printf("%c", c1); 
                v++; 
            }                 
        } 
        return v; 
    } 
    else 
        return -1; 
}


Ultima modifica effettuata da Zonzo 05/01/10 14:55
aaa
06/01/10 9:27
Astaroth
Grazie ad entrambi! :k:

@Zonzo: il fatto che l'asterisco sopprimesse l'assegnamento del valore alla variabile non lo sapevo... grazie! ;)
Ultima modifica effettuata da Astaroth 06/01/10 9:28
aaa