Programma in linguaggio C
Buonasera a tutti!
Ho il seguente esercizio:
Codifica un programma che richieda all'utente di immettere una serie di 10 caratteri e visualizzi quante volte è presente nella serie il carattere "a". Suggerimento: utilizza un'istruzione if all'interno di un for.
Come posso procedere? In particolare non capisco come far "contare" il carattere "a" nella serie di caratteri che introduco.
Ringrazio anticipatamente chi mi darà dei chiarimenti in merito.
Andrea
Ho il seguente esercizio:
Codifica un programma che richieda all'utente di immettere una serie di 10 caratteri e visualizzi quante volte è presente nella serie il carattere "a". Suggerimento: utilizza un'istruzione if all'interno di un for.
Come posso procedere? In particolare non capisco come far "contare" il carattere "a" nella serie di caratteri che introduco.
Ringrazio anticipatamente chi mi darà dei chiarimenti in merito.
Andrea
Risposte
non capisco il tuo problema tu fai inserire i caratteri nel ciclo ogni volta lo memorizzi in una variabile e nell'if fai il controllo se il caratteri inserito è uguale ad "a" in questo caso incrementi un contatore altrimenti continuerà il ciclo
Non ho problemi a far funzionare il programma se in luogo del carattere "a", considero una costante numerica. Con "a" (dichiarata come char) il programma non funziona. Potreste propormi il vostro codice sorgente in modo da rendermi conto dell'errore? Vi ringrazio.
Invece di chiedere a noi di scrivere e postare il codice sorgente è buona norma che lo faccia chi non riesce a scrivere il codice. In questo modo possiamo dirti quali sono gli errori che hai commesso. Immagino che il problema sia nel modo diverso in cui vengono letti i char. Quando viene letto un char, non vengono infatti eliminati gli spazi e i caratteri '\n' dallo stream come avviene in tutti gli altri casi.
E' quindi possibile che tu debba scrivere un codice come il seguente:
Questo codice legge il primo carattere inserito diverso da caratteri di spazi (quindi anche tabulazioni e terminatori di riga). A seconda dei caratteri del quale vuoi permettere l'inserimento e di come leggi i caratteri, si dovrà gestire il problema in modo diverso.
E' quindi possibile che tu debba scrivere un codice come il seguente:
char c; do { c = getchar(); } while(!isspace(c));
Questo codice legge il primo carattere inserito diverso da caratteri di spazi (quindi anche tabulazioni e terminatori di riga). A seconda dei caratteri del quale vuoi permettere l'inserimento e di come leggi i caratteri, si dovrà gestire il problema in modo diverso.
Il codice da me ideato è il seguente:
Scusatemi in anticipo per errori/orrori (!) ma sono alle prime armi con il linguaggio C! Credo che il ragionamento di base sia corretto, solo che non riesco a far funzionare il programma.
Dove sbaglio?
#include <stdio.h> main() { int i=1, counter=0; char carattere, a; { for (i=1; i<=10; ++i); { printf("Immetti carattere: ", i); scanf("%c", &carattere); } if (carattere==a) counter++; } printf("La a compare %d volte", counter); }
Scusatemi in anticipo per errori/orrori (!) ma sono alle prime armi con il linguaggio C! Credo che il ragionamento di base sia corretto, solo che non riesco a far funzionare il programma.
Dove sbaglio?
Il modo corretto per confrontare una variabile c di tipo char con la lettera a è:
Devi cioè inserire la lettera tra apici. Nel tuo codice invece stai confrontando due variabili di tipo char tra di loro, una delle quali non inizializzata. Qualsiasi compilatore decente avrebbe dovuto fartelo notare con uno warning. Che compilatore stai usando?
Un secondo problema del tuo codice è nella lettura dei caratteri. scanf("%c", &carattere) legge il successivo carattere da console, senza eliminare eventuali spazi o terminatori di riga come avviene per gli altri tipi. In questo caso è quindi necessario eliminare esplicitamente questi caratteri dallo stream. Per esempio con:
getchar() è una funzione che legge da console un singolo carattere. Si comporta in modo equivalente a scanf("%c", &c), ma è più efficiente e più facile da usare.
E' poi sbagliato il ciclo: c'è un punto e virgola di troppo subito dopo le parentesi tonde del for e le parentesi graffe sembrano messe un po' a caso.
Con tutte queste modifiche il tuo codice apparirebbe nel seguente modo:
if (c == 'a') { /* ... */ }
Devi cioè inserire la lettera tra apici. Nel tuo codice invece stai confrontando due variabili di tipo char tra di loro, una delle quali non inizializzata. Qualsiasi compilatore decente avrebbe dovuto fartelo notare con uno warning. Che compilatore stai usando?
Un secondo problema del tuo codice è nella lettura dei caratteri. scanf("%c", &carattere) legge il successivo carattere da console, senza eliminare eventuali spazi o terminatori di riga come avviene per gli altri tipi. In questo caso è quindi necessario eliminare esplicitamente questi caratteri dallo stream. Per esempio con:
while (getchar() != '\n');
getchar() è una funzione che legge da console un singolo carattere. Si comporta in modo equivalente a scanf("%c", &c), ma è più efficiente e più facile da usare.
E' poi sbagliato il ciclo: c'è un punto e virgola di troppo subito dopo le parentesi tonde del for e le parentesi graffe sembrano messe un po' a caso.
Con tutte queste modifiche il tuo codice apparirebbe nel seguente modo:
#include <stdio.h> int main() { int i=0, counter=0; char c; for (i=1; i<=10; ++i); { printf("Immetti %d-esimo carattere: ", i); c = getchar(); if (carattere == 'a') { ++counter; } /* elimino la riga attuale dal buffer di lettura */ while(getchar() != '\n') ; } printf("La \'a\' compare %d volte", counter); return 0; /* in C il main restituisce un intero, 0 quando si esce con successo. */ }
Ti ringrazio infinitamente! Sostanzialmente il problema proveniva dalla lettura dei caratteri. Infatti inserendo:
il programma funziona correttamente.
Tuttavia non ho ben chiaro quando bisogna utilizzare tale scrittura. Potresti chiarirmi questo punto?
Ti ringrazio ancora e mi scuso per l'imprecisione (altamente probabile!) con cui mi sono espresso.
while(getchar()!='\n')
il programma funziona correttamente.
Tuttavia non ho ben chiaro quando bisogna utilizzare tale scrittura. Potresti chiarirmi questo punto?
Ti ringrazio ancora e mi scuso per l'imprecisione (altamente probabile!) con cui mi sono espresso.
"Andrea90":
Tuttavia non ho ben chiaro quando bisogna utilizzare tale scrittura. Potresti chiarirmi questo punto?
Se da tastiera digiti "ABC" e poi premi invio, l'invio viene visto come se fosse un quarto carattere (un carattere speciale ma pur sempre un carattere). Con questa istruzione puoi controllare quando incontri un invio.
Se tu digiti 10 caratteri 'a', uno per ogni riga allora vengono inseriti, tra ogni 'a' un carattere di "a capo". Quando leggi ad esempio un numero o una stringa con scanf questo carattere viene semplicemente ignorato, ma quando leggi carattere per carattere viene considerato un carattere qualsiasi e quindi viene letto normalmente. Il codice che ti ho scritto ignora tutti i caratteri presenti in una riga. E' quindi un modo per passare alla riga successiva dell'input. E' utile in tutti i casi in cui non sia necessario leggere altri caratteri da una riga e si voglia passare alla riga successiva. Ti consiglio di provare a vedere cosa viene stampato dal seguente codice:
Stampa tutti i caratteri contenuti in una riga di testo.
#include <stdio.h> int main() { char c; puts("Scrivi una riga di testo qualsiasi."); do { c = getchar(); printf("Carattere inserito: %u \'%c\'\n", c, c); } while(c != '\n'); return 0; }
Stampa tutti i caratteri contenuti in una riga di testo.
Ok! Tutto chiaro, vi ringrazio infinitamente!
Andrea
Andrea