Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2019
    Messaggi
    0

    [C] Esercizio su array di caratteri e stringhe

    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.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,232
    Un forum di questo tipo non funziona come un tutor/revisore.

    Piuttosto si tende a dare consigli/soluzioni specifici su problemi specifici.

    Quindi, tu che problemi hai con il tuo codice? Esegue quello che è indicato nella traccia o no? Hai notato malfunzionamenti?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2019 vBulletin Solutions, Inc. All rights reserved.