Salve a tutti,
Sono nuovo di qui.
Frequento l'ultimo anno di ing. Aerospaziale e sono alle prese con l'esame di Elementi di informatica.
Ho svolto questa esercitazione tratta dall'ultimo esame e mi chiedevo se ci fosse qualcuno di voi così gentile da "correggere" e darmi qualche dritta.
Il corso è molto basico. Si tiene in C e non comprende concetti come allocazione dinamica, puntatori e gestione di files.
Non ho seguito il corso e ho appreso tutto tramite il libro "Linguaggio C" di Bellini-Guidi.
Ecco la traccia:
IMG_20190223_155516.jpg
E questo è il mio codice:
codice:#include <stdio.h> #define MAX_CARATTERI 100 #define CaratteriDaCopiare 3 char T[MAX_CARATTERI]; void gestioneSequenza (void); //Permette l'interazione dell'utente con un MENU'. int inserimentoEstampaRovescia (void); //Gestisce l'inserimento degli n caratteri immessi e stampa al contrario. void stampaElemento (int numeroInserimenti, int posizione); //Stampa uno specifico carattere tramite posizione immessa //da tastiera. int aggiungiCaratteri (void); //Aggiunge in coda al vettore T i primi tre caratteri dell' array // {'n', 'a', 'p', 'o', 'l', 'i'}. int numeroElementi (void); //Ritorna il numero di caratteri del vettore T. void stampa (int numeroInserimenti); //Stampa il vettore T. void immissioneStringa (void); //Consente l'immissione di una stringa di caratteri. int main () { gestioneSequenza (); } void gestioneSequenza () { int scelta = -1; int numeroInserimenti; int posizione; while (scelta != 0) { printf ("\n***** MENU' *****"); printf ("\n1. Immissione caratteri e stampa rovescia.\n"); printf ("\n2. Stampa vettore.\n"); printf ("\n3. Stampa carattere.\n"); printf ("\n4. Aggiungi caratteri.\n"); printf ("\n5. Conta caratteri.\n"); printf ("\n6. Inserisci una stringa.\n"); printf ("\n0. Esci dal programma.\n"); printf ("***** FINE MENU' *****\n"); printf("\nScegli un'opzione dal MENU': "); scanf ("%d", &scelta); switch (scelta) { case 1: numeroInserimenti = inserimentoEstampaRovescia (); //Viene reso noto il numero di elementi inseriti dall' utente // in modo da poter facilmente stampare il vettore successivamente. break; case 2: stampa (numeroInserimenti); break; case 3: printf ("\nInserisci la posizione che desideri stampare: "); scanf ("%d", &posizione); stampaElemento (numeroInserimenti, posizione); break; case 4: printf ("\nAggiungo i primi tre caratteri in coda al vettore.\n"); numeroInserimenti = aggiungiCaratteri (); //Con la funzione "aggiungiCaratteri" restituisco anche il nuovo numero di caratteri // e con questa chiamata li rendo noti in modo da stampare il vettore, senza prima passare per la funzione // "numeroElementi". printf ("\nFatto!\n"); break; case 5: numeroInserimenti = numeroElementi (); //Ritorna il numero di cratteri contati tramite l'apposita funzione // e li rende noti in modo da poter stampare il nuovo vettore tramite funzione "stampa". printf ("\nIl vettore contiene %d caratteri\n", numeroInserimenti); break; case 6: immissioneStringa (); break; } //case } //while } int inserimentoEstampaRovescia () { int i, n; char invio; do { printf ("\nQuanti caratteri vuoi inserire? "); scanf ("%d", &n); } while (n < 1 || n > MAX_CARATTERI); for (i = 0; i < n; i++) { printf ("\nInserisci carattere n.%d: ", i + 1); scanf ("%c", &invio); scanf ("%c", &T[i]); //Mi serve per "pulire" la console dal "newspace" dovuto dall'inserimento precedente. } T[i] = '\0'; //Aggiungo il carattere terminatore così da rendere più semplice la conta dei caratteri. for (i = n-1; i >= 0; i--) { printf ("\nCarattere n.%d: %c \n", i + 1, T[i]); } return n; } void stampaElemento (int numeroInserimenti, int posizione) { if (posizione >= 0 && posizione < numeroInserimenti) { printf ("\nLa poszione %d e' occupata dal carattere *%c* \n", posizione, T[posizione]); } else { printf ("\nInserisci una posizione esistente!\n"); } } int aggiungiCaratteri () { int i, j; char CaratteriDaAggiungere[] = {'n', 'a', 'p', 'o', 'l', 'i'}; for (i = 0; T[i] != '\0' && (i < MAX_CARATTERI); i++) //Con questo primo ciclo, l'indice "i" scorre il vettore e si posiziona sul //carattere terminatore. Potrebbe sembrare una ripetizione di quanto eseguito dalla funzione "numeroElemeni" (vedi funzione successiva), //ma ho scelto questo approccio per rendere l'operazione di conta "autonoma", senza passare per forza per un'altra funzione. ; for (j = 0; (T[i] = CaratteriDaAggiungere[j]) && (j < CaratteriDaCopiare); i++, j++) //Una volta che l'indice "i" "contiene" la posizione //del carattere terminatore, si passa alla copia dei vari caratteri grazie all'indice "j" che scorre i caratteri da copiare e li assegna //in coda al vettore T. ; T[i] = '\0'; //Termino correttamente il vettore. return i; } int numeroElementi () { int i; for (i = 0; T[i] != '\0' && (i < MAX_CARATTERI); i++) //Conta i caratteri e si ferma quando incontra il terminatore. ; return i; } void stampa (int numeroInserimenti) { int i; for (i = 0; i < numeroInserimenti; i++) { printf ("\nCarattere n. %d: %c \n", i+1, T[i]); } } void immissioneStringa () { int i; char invio; scanf ("%c", &invio); //Mi serve per "pulire" la console dal "newspace" dovuto dall'inserimento precedente. printf ("\nInserisci una stringa: "); for (i=0; (T[i] = getchar()) != '\n' && (i < 20) ; i++) ; T[i] = '\0'; }
Grazie a tutti.

Rispondi quotando