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.