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.