ERRATA CORRIGE
Transcript
ERRATA CORRIGE
ERRATA CORRIGE Pulizia del buffer di input: come fare? (1) Dopo aver richiamato getchar() per prelevare un carattere dal buffer di input, inseriamo una seconda chiamata a getchar(), senza assegnare il valore restituito ad alcuna variabile. Questa soluzione va bene nel caso in cui l’utente abbia premuto un solo tasto (prima dell’ENTER), se non è così questa soluzione non funziona correttamente (2) Servirsi della funzione ricorsiva presentata alla fine della seconda settimana. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} } (3) Usare un costrutto iterativo per svolgere il medesimo compito ... istruzioni ... while(getchar()!=10) {;} ... ancora istruzioni ... ! IMPORTANTE ! Con il passare del tempo le indicazioni relative ai codici da implementare diventeranno via via meno dettagliate .... Scrivere una funzione che accetta due parametri di tipo intero e restituisce un valore di tipo intero. La funzione deve sommare i due valori ricevuti come parametro, calcolare l’ottava potenza della somma e e restituire il valore così ottenuto. Scrivere una funzione che calcola l’ottava potenza della somma di due numeri. Abituatevi a preparare un diagramma, PRIMA di iniziare a scrivere il codice, che vi serva per organizzare le idee e capire quali operazioni svolgere per ottenere il risultato. valore1 valore2 + for( ... ; ... ; ... ) 7 volte return NOTA: da qui in avanti cercate di inserire prototipo ed implementazione delle funzioni in un file separato (ad esempio funzioni.h) e di richiamare tale file (usando la direttiva #include). Durante il corso useremo questo file per esaminare ulteriormente il processo di compilazione. Gli array Gli array (o vettori) sono degli insiemi di variabili (tutte dello stesso tipo). L’insieme possiede un nome e ciascun elemento dell’insieme è identificato da un indice progressivo che parte dal valore 0. Gli elementi sono posizionati in memoria in modo tale da essere uno adiacente all’altro. #include <stdio.h> Questo valore deve essere NOTO al momento della compilazione -> costante o MACRO int main() {int i; int gruppo[50]; // ecco la dichiarazione di un array formato da 50 interi // se ci sono 50 elementi, l’indice può arrivare solo fino a 49 gruppo[6] = 90; // assegno un valore al settimo elemento gruppo[45]=23 + gruppo[6]; // assegno un valore al 46-esimo elemento basandomi sul valore del settimo printf(“Ecco il settimo elemento dell’array: %d\n”,gruppo[6]); // visualizzo il valore di un elemento gruppo[54]=2; // ERRORE !! l’indice non può superare il valore 49 !!! // assegniamo un valore a tutti gli elementi dell’array for(i=0;i<50;i++) {gruppo[i] = 4 + i*2;} // visualizziamo il valore di tutti gli elementi dell’array for(i=0;i<50;i++) {printf(“Ecco il valore dell’elemento num. %d: %d\n”,i,gruppo[i]);} } Inizializziamo un array di interi usando dei numeri casuali ... #include <stdio.h> #include “funzioni.h” int main() {int i, array[60]; // dichiaro l’array i=0; while(i<50) {array[i] = IntCasuale(97,122); // un intero compreso tra 97 e 122 rappresenta il codice ASCII di una lettera minuscola printf(“Ecco il numero casuale: %d / ed il corrispondente carattere: %c\n”,array[i],array[i]); i++; } return 0;} Lasciamo inizializzare l’array all’utente ... #include <stdio.h> #include “funzioni.h” int main() {int i; char array[200]; // stiamo larghi, nel caso l’utente sia prolisso ... i=0; printf(“Inserisci tanti caratteri! “); while(i<200) // al massimo l’array può contenere 200 caratteri {array[i] = getchar(); // prelevo un carattere if(array[i]!=10) {i++;} else {break;} } i++; // devo individuare l’indice del primo elemento non ancora inizializzato for( ; i<200 ; i++) // inizializzo a 0 i rimanenti (se ve ne sono) array[i]=0; return 0;} Esercizi proposti (1) Definire ed implementare una funzione che riceva come parametro un valore di tipo char e restituisca un valore di tipo intero. La funzione deve controllare il codice ASCII del carattere che riceve come parametro: se il carattere e’ una lettera maiuscola deve restituire 1, altrimenti 0. (2) Definire ed implementare una funzione che riceva come parametro un valore di tipo char e restituisca un valore di tipo intero. La funzione deve controllare il codice ASCII del carattere che riceve come parametro: se il carattere e’ una lettera minuscola deve restituire 1, altrimenti 0. (3) Scrivere un programma in cui si dichiari un array di 100 caratteri. Chiedere all’utente di inserire (tanti, ma meno di 90) caratteri mediante la tastiera. Utilizzando un ciclo while() prelevare tutti i caratteri del buffer, compreso il terminatore, ed inserirli nell’array di char precedentemente dichiarato. Fatto questo, mediante un ciclo for, scorrere l’array di caratteri; ogni volta che si incontra una lettera minuscola, trasformarla nella corrispondente maiuscola, ogni volta che si incontra una lettera maiuscola, trasformarla nella corrispondente minuscola. Servirsi delle funzioni definite ai punti (1) e (2). Fatto questo visualizzare il risultato. (4) Partendo dal programma precedente, servendosi di un ciclo while(), scorrere tutto l’array di caratteri e contare quante lettere maiuscole e quante lettere minuscole siano presenti. NOTA: nell’espressione di continuazione del ciclo while() DEVE essere presente un elemento dell’array. (5) Partendo dal programma precedente, servendosi di un ciclo for(), scorrere tutto l’array di caratteri e contare quante volte ciascuna lettera minuscola compaia. Per fare questo, dichiarare un array di 26 int (tanti quante sono le lettere dell’alfabeto), ogni elemento dell’array deve essere inizialmente posto uguale a 0. Ogni elemento dovrà poi contenere il numero di occorrenze di ciascuna lettera all’interno del gruppo di caratteri inseriti dall’utente. Nell’implementare questa parte NON servirsi di controlli (ad esempio usando if()) e NEMMENO del costrutto switch-case.