[C] Array di caratteri

di il
38 risposte

38 Risposte - Pagina 2

  • Re: [C] Array di caratteri

    nicolap ha scritto:


    Definisci (nel programma) cosa è una stringa! E trasforma il vettore in stringa (sempre stando attendo al numero di caratteri).
    Non saprei dire se è compatibile con la traccia, perché insiste un po' troppe volte sull'espressione "array di caratteri" senza mai aggiungere "terminato da '\0'". In uno dei quesiti aggiunge pure "nota la dimensione dell'array", quasi a sottolineare l'esclusione della possibilità di considerarlo una vera stringa C. Se fosse possibile considerare stringhe C gli array di caratteri sarebbe tutto molto più lineare, perché esiste la pletora di funzioni standard di <string.h> (o <cstring> se si è in cpp).

    L'unico punto che non saprei risolvere senza considerare l'array una stringa C è il 6, "una funzione capace di tornare il numero di elementi di una stringa" (e, in effetti, la richiesta non parla più di "array di caratteri" ma esplicitamente di stringhe).

    Dunque, il punto chiave dovrebbe essere: l'inserimento del terminatore '\0' in coda all'array dei caratteri è vietato dalla traccia oppure no?
  • Re: [C] Array di caratteri

    AldoBaldo ha scritto:


    Dunque, il punto chiave dovrebbe essere: l'inserimento del terminatore '\0' in coda all'array dei caratteri è vietato dalla traccia oppure no?
    Ciao, grazie per la risposta!

    Siccome il professore non risponde alle mie mail, ieri sera ho chiesto ad una collega che ha avuto la stessa traccia e che è passata alla prova.
    Mi ha ha detto che lei ha ragionato come fosse un array di interi, solo che gli elementi sono di tipo char e che va "ricordata'' la presenza del terminatore '\0' (Lei ha sviluppato in C++ però).

    Inoltre, e di questo sono sicuro al 100%, non permette l'utilizzo di funzioni di libreria che non siano stdio.h e la sua affine per C++.

    nicolap ha scritto:


    La funzione "copiaCaratteri" è sbagliata, troppo. Rileggi attentamente la consegna. Metti un commento nella funzione che richiama il numero della consegna: aiuti te e, soprattutto, il prof!
    Non riesco a venirne a capo allora, ieri ci ho perso tutto il pomeriggio...
    L'allocazione dinamica non è in programma, così come i puntatori e la gestione dei files...
    Se potessi darmi qualche (altro) suggerimento te ne sarei grato!

    Grazie a tutti e due
  • Re: [C] Array di caratteri

    AldoBaldo ha scritto:


    L'unico punto che non saprei risolvere senza considerare l'array una stringa C è il 6, "una funzione capace di tornare il numero di elementi di una stringa" (e, in effetti, la richiesta non parla più di "array di caratteri" ma esplicitamente di stringhe).

    Dunque, il punto chiave dovrebbe essere: l'inserimento del terminatore '\0' in coda all'array dei caratteri è vietato dalla traccia oppure no?
    Infatti. Dipende da quanto ha spiegato il prof a lezione.
  • Re: [C] Array di caratteri

    leo95nf ha scritto:


    AldoBaldo ha scritto:


    Dunque, il punto chiave dovrebbe essere: l'inserimento del terminatore '\0' in coda all'array dei caratteri è vietato dalla traccia oppure no?
    Siccome il professore non risponde alle mie mail, ieri sera ho chiesto ad una collega che ha avuto la stessa traccia e che è passata alla prova.
    Mi ha ha detto che lei ha ragionato come fosse un array di interi, solo che gli elementi sono di tipo char e che va "ricordata'' la presenza del terminatore '\0' (Lei ha sviluppato in C++ però).
    Quindi devi inserire tu il terminatore. E ricorda che occupa 1 carattere...

    Non riesco a venirne a capo allora, ieri ci ho perso tutto il pomeriggio...
    L'allocazione dinamica non è in programma, così come i puntatori e la gestione dei files...
    Se potessi darmi qualche (altro) suggerimento te ne sarei grato!
    5. una funzione capace di costruire un vettore di caratteri costituito da tutti gli elementi di un vettore dato in input, e in aggiunta i primi 3 caratteri del vettore di in input stesso;
    Se non puoi usare l'allocazione dinamica questo significa che il vettore viene allocato PRIMA della chiamata alla funzione e passato come parametro.
    A quel punto la cosa è banale.
    Il succo di quell'esercizio, secondo me, consiste in:
    - scelta dei parametri da passare (semplice)
    - determinazione della dimensione (massima) del vettore, considerando input utente, terminatore e 3 caratteri.
  • Re: [C] Array di caratteri

    nicolap ha scritto:


    Se non puoi usare l'allocazione dinamica questo significa che il vettore viene allocato PRIMA della chiamata alla funzione e passato come parametro.
    A quel punto la cosa è banale.
    Il succo di quell'esercizio, secondo me, consiste in:
    - scelta dei parametri da passare (semplice)
    - determinazione della dimensione (massima) del vettore, considerando input utente, terminatore e 3 caratteri.
    Ma anche se ho definito il vettore come variabile globale devo passarlo alla funzione?
  • Re: [C] Array di caratteri

    leo95nf ha scritto:


    nicolap ha scritto:


    Se non puoi usare l'allocazione dinamica questo significa che il vettore viene allocato PRIMA della chiamata alla funzione e passato come parametro.
    A quel punto la cosa è banale.
    Il succo di quell'esercizio, secondo me, consiste in:
    - scelta dei parametri da passare (semplice)
    - determinazione della dimensione (massima) del vettore, considerando input utente, terminatore e 3 caratteri.
    Ma anche se ho definito il vettore come variabile globale devo passarlo alla funzione?
    Io lo farei, magari facendolo notare in un commento: con conoscenze maggiori faresti in altro modo.
  • Re: [C] Array di caratteri

    nicolap ha scritto:


    Io lo farei, magari facendolo notare in un commento: con conoscenze maggiori faresti in altro modo.
    Ok, grazie per la dritta!

    Un'ultima cosa, poi farò parlare il codice completo!

    E' lecito, per inserire il carattere di fine stringa, scrivere qualcosa del genere?
    
    for (i = 0; i < n; i++)
        
      {
          
     
       printf ("\nInserisci %d° carattere: ", i + 1);
          
     
       scanf ("%c", &invio);
          
     
       scanf ("%c", &V[i]);
        
     
       }
      
     V[i+1] = '\0';
     
    In rete e su alcuni manuali ho visto che esistono metodi forse più eleganti, ma con altre funzioni di I/O che non ho visto essere in programma (e che mi renderebbero la vita più facile!).

    Poi, una volta che il vettore include anche il carattere terminatore, è inutile a questo punto passare alle varie funzioni l'informazione "numeroElementi" in quanto questa informazione è contenuta nel vettore stesso... Quindi posso e devo modificare anche le funzioni di stampa vettore e stampa elemento, giusto?

    Grazie ancora
  • Re: [C] Array di caratteri

    leo95nf ha scritto:


    nicolap ha scritto:


    Io lo farei, magari facendolo notare in un commento: con conoscenze maggiori faresti in altro modo.
    Ok, grazie per la dritta!

    Un'ultima cosa, poi farò parlare il codice completo!

    E' lecito, per inserire il carattere di fine stringa, scrivere qualcosa del genere?
    
    for (i = 0; i < n; i++)
        
      {
          
     
       printf ("\nInserisci %d° carattere: ", i + 1);
          
     
       scanf ("%c", &invio);
          
     
       scanf ("%c", &V[i]);
        
     
       }
      
     V[i+1] = '\0';
     
    In rete e su alcuni manuali ho visto che esistono metodi forse più eleganti, ma con altre funzioni di I/O che non ho visto essere in programma (e che mi renderebbero la vita più facile!).

    Poi, una volta che il vettore include anche il carattere terminatore, è inutile a questo punto passare alle varie funzioni l'informazione "numeroElementi" in quanto questa informazione è contenuta nel vettore stesso... Quindi posso e devo modificare anche le funzioni di stampa vettore e stampa elemento, giusto?
    Uhm... sono due strade diverse, ogniuna con pro e contro.
    Se mantieni la lunghezza della stringa non devi calcolarla ogni volta che ti serve.
    D'altra parte devi fare una funzione che ti restituisca la lunghezza della stringa quindi tanto vale usarla!
  • Re: [C] Array di caratteri

    Questo punto 5 mi sta dando veramente del filo da torcere
  • Re: [C] Array di caratteri

    Ecco la traccia completa, spero sia tutto giusto...

    
    #include <stdio.h>
    #define MAX_C 20     // La dimensine è modificabile in base alle esigenze. Ho scritto il valore basandomi sul punto 11 della traccia.
    
     char V[MAX_C];     
    
     
    void gestioneSequenza (void);     // Permette all'utente di interagire con un Menu'.
    
    int immissione (void);     // Permette l'immissione di n caratteri scelti dall'utente.
    
    void stampa (int dimensioneArray);     // Stampa il vettore, nota la dimensione dello stesso.
    
    void stampaElemento (int posizione, int dimensioneArray);     // Stampa un elemento j-esimo scelto da tastiera.
    
    void inserimentoStringa (void);     // Permette di inserire una stringa.
    
    int numeroElementi (void);     // Torna il numero di caratteri dell'array di caratteri null terminated.
    
    int aggiungiCaratteri (int caratteriDaCopiare);     // Aggiunge i primi n elemeni del vettore in coda allo stesso.
    //Nella traccia n=3, ma ho dato libertà all'utente.
    
     
     
    int
    main ()
    {
      
    gestioneSequenza ();
    
    } 
     
    void
    
    gestioneSequenza ()
    {
      
     
    int scelta = -1;
      
    int dimensioneArray;
      
    int posizione;
      
    int caratteriDaCopiare;
      
     
    while (scelta != 0)
        {
          
    printf ("\n***** MENU' *****");
          
    printf ("\n1. Immissione e stampa inversa.\n");
          
    printf ("\n2. Stampa vettore.\n");
          
    printf ("\n3. Stampa elemento.\n");
          
    printf ("\n4. Inserisci caratteri in coda.\n");
          
    printf ("\n5. Conta caratteri.\n");
          
    printf ("\n6. Inserisci stringa.\n");
          
    printf ("\n0. Fine.");
          
    printf ("\n***** FINE MENU' *****");
          
     
    printf ("\nScegli un'opzione dal MENU': ");
          
    scanf ("%d", &scelta);
          
     
    switch (scelta)
    	{
    	
    case 1:
    	  dimensioneArray = immissione ();     // Prima viene resa nota la dimensione quando si inseriscono gli n caratteri.
    	  
     
    break;
    	
    case 2:
    	  stampa (dimensioneArray);
    	  
    break;
    	
    case 3:
    	  printf ("\nInserisci la posizione da stampare: ");
    	  
    scanf ("%d", &posizione);
    	  
    stampaElemento (posizione, dimensioneArray);
    	  
    break;
    	
    case 4:
    	  printf
    	    ("\nQuanti caratteri desideri aggiungere in coda al vettore? ");
    	  
    scanf ("%d", &caratteriDaCopiare);
    	  
    printf ("\nFatto!\n");
    	  
    dimensioneArray = aggiungiCaratteri (caratteriDaCopiare);      // Questa è la dimensione dell'array coi suoi primi n caratteri in coda. Riutilizzo facile delle varie funzioni.
    	  
    break;
    	
    case 5:
    	  dimensioneArray = numeroElementi ();     // Idem qui; serve per appilcare il punto 12 della traccia.
    	  
    printf ("\nIl vettore contiene %d caratteri.\n", dimensioneArray);
    	  
    break;
    	
    case 6:
    	  inserimentoStringa ();
    	  
    break;
    	
    }			//case
        }				//while
    }
    
    
     
     
     
    void
    stampa (int dimensioneArray)
    {
      
    int i;
      
     
    for (i = 0; i < dimensioneArray; i++)
        {
          
    printf ("\nCarattere n.%d: %c \n", i + 1, V[i]);
        
    }
    
    }
    
    
     
    int
    immissione ()
    {
      
     
    int n;
      
     
    int i;
      
     
    char invio;
      
     
      do
        {
          
    printf ("\nQuanti elementi desideri inserire? ");
          
    scanf ("%d", &n);
        
    }
      
     
    while (n < 1 || n > MAX_C);
      
     
    for (i = 0; i < n; i++)
        {
          
    printf ("\nInserisci il carattere n.%d: ", i + 1);
          
    scanf ("%c", &invio);
          
    scanf ("%c", &V[i]);
        
    }
      
     
    V[i] = '\0';     // Aggiungo il carattere terminatore alla fine.
      
     
    for (i = n - 1; i >= 0; i--)
        {
          
    printf ("\nCarattere n. %d: %c\n", i + 1, V[i]);
        
    }
      
     
    return n;
    
    }
    
    
     
    int
    numeroElementi ()
    {
      
     
    int i;
      
     
    for (i = 0; (V[i]) != '\0'; i++)
        
    ;
      
     
    return i;
    
    }
    
    
     
     
    void
    stampaElemento (int posizione, int dimensioneArray)
    {
      
     
     
    if (posizione >= 0 && posizione < dimensioneArray)
        {
          
     
    printf ("\nLa poszione %d e' occupata dall'elemento %c\n", posizione,
    		 V[posizione]);
        
    }
      
     
      else
        {
          
    printf ("\nScegli una posizione esistente!\n");
        
     
    }
    
     
    }
    
    
     
     
    void
    inserimentoStringa ()
    {
      
     
    int i;
      
     
    char invio;
      
     
    scanf ("%c", &invio);
      
     
    printf ("\nInserisci una stringa: ");
      
     
     
    for (i = 0; (((V[i] = getchar ()) != '\n') && (i < MAX_C)); i++)
        
    ;
      
     
    V[i] = '\0';     // Aggiungo il carattere terminatore alla fine.
    
    }
    
    
     
    int
    aggiungiCaratteri (int caratteriDaCopiare)
    {
      
    int i;
      
    int j;
      
     
    for (i = 0; (V[i]) != '\0'; i++)     //Questo ciclo scorre l'array V e posiziona l'indice i sul carattere terminatore.
        
    ;
      
    for (j = 0; ((V[i] = V[j]) && (j < caratteriDaCopiare)); i++, j++)     // A quensto punto, l'indice i contiene la posizione del carattere terminatore. 
    // L'indice j scorre l'array V a partire dalla posizione iniziale mentre i a partire dal carattere terminaotre e quindi sostituisce i caratteri in coda al vettore stesso. 
         
    ;
      
    V[i] = '\0';     // Aggiungo il carattere terminatore alla fine.
      
     
    return i;     // Ritorno il numero di caratteri di questo 'maledetto' array.
    
     
    }
  • Re: [C] Array di caratteri

    leo95nf ha scritto:


    Ecco la traccia completa, spero sia tutto giusto...
    Cosa succede se
    - l'utente sceglie di inserire esattamente MAX_C caratteri? (brutto nome per una costante)
    - l'utente scegli di inserire esattamente MAX_C -2 caratteri?
    - cosa succede se l'utente decide di copiare

    *) Tu chiedi all'utente quanti caratteri copiare ma non è questo che ti chiede il prof e non è neppure come ti è stato suggerito.
    *) Spiega nel commento PERCHÉ aggiungi il terminatore: i commenti sono spesso utili non quando spiegano COSA fai ma PERCHÉ!
    *) numeroElementi: a parte un paio di parentesi posizionate a caso, non fai un controllo di NON superamento della fine del vettore, molto male!
    *) aggiungiCaratteri: io userei la funzione numeroElementi invece che contarli nuovamente
    *) togli "maledettoE dai commenti

    PS: la formattazione del codice fa veramente schifo, non so se sia per come lo incolli o se sia quella originale...
    PPS: spero che tu abbia anche provato ad eseguirlo, io no!
  • Re: [C] Array di caratteri

    nicolap ha scritto:


    Cosa succede se
    - l'utente sceglie di inserire esattamente MAX_C caratteri? (brutto nome per una costante)
    - l'utente scegli di inserire esattamente MAX_C -2 caratteri?
    - cosa succede se l'utente decide di copiare

    *) Tu chiedi all'utente quanti caratteri copiare ma non è questo che ti chiede il prof e non è neppure come ti è stato suggerito.
    *) Spiega nel commento PERCHÉ aggiungi il terminatore: i commenti sono spesso utili non quando spiegano COSA fai ma PERCHÉ!
    *) numeroElementi: a parte un paio di parentesi posizionate a caso, non fai un controllo di NON superamento della fine del vettore, molto male!
    *) aggiungiCaratteri: io userei la funzione numeroElementi invece che contarli nuovamente
    *) togli "maledettoE dai commenti

    PS: la formattazione del codice fa veramente schifo, non so se sia per come lo incolli o se sia quella originale...
    PPS: spero che tu abbia anche provato ad eseguirlo, io no!
    Sul mio libro di testo consigliato dal professore le costanti tipo dimensioni di vettori le indica così.
    Non lo so, la traccia chiede 20 caratteri se l'utente ne mette 20, i vari punti che chiedono l'inserimento in coda non funzionano. Non so che escamotage usare, le slide non trattano queste cose, nemmeno il mio libro. Non ho fatto allocazione dinamica e non è in programma...

    Non ho compreso cosa dovrebbe copiare l'utente...

    L'altro giorno quando ho creato maldestramente la funzione che aggiunge i caratteri, ho messo come indicazione del numero di caratteri il '2' nel ciclo for e mi hai suggerito di non piazzare interi nella funzione, bensì sempre una variabile ed è per questo che chiedo all'utente quanti caratteri mettere.

    nicolap ha scritto:


    leo95nf ha scritto:


      
      for (i = 0; i <= 2; i++) 
    
    Abituati a non usare MAI costanti.
    Sono ammessi 0 e 1, il 2 e il 10 solo quando rappresentano la base numerica.
    Tutto il resto DEVE essere dichiarato come "costante simbolica".
    Idem per le stringhe e i caratteri.

    Pensaci: stavi pensando al 3 ma hai scritto 2...
    Aggiungerò && i<MAX_C al ciclo for della funzione numeroElementi, mi era sfuggito.

    Il "maledetto" era scherzoso perché questo piccolo blocco di codice mi ha portato via 48h...

    La formattazione del codice la fa in automatico questo IDE online che uso (non ho PC) https://www.onlinegdb.com e so che fa schifo..

    Ho eseguito e compila. Ho preso nota delle note //.

    Ti ringrazio per la risposta e per aver perso tempo nel correggere queste mie castronerie, come detto questo esame per me è più difficile di un Analisi I e II messi assieme.
  • Re: [C] Array di caratteri

    leo95nf ha scritto:


    Sul mio libro di testo consigliato dal professore le costanti tipo dimensioni di vettori le indica così.
    Non lo so, la traccia chiede 20 caratteri se l'utente ne mette 20, i vari punti che chiedono l'inserimento in coda non funzionano. Non so che escamotage usare, le slide non trattano queste cose, nemmeno il mio libro. Non ho fatto allocazione dinamica e non è in programma...
    Sbagli: 20 è il numero massimo di caratteri inseribili dall'utente.
    Se aggiungi il terminatore diventano 21.
    Se aggiungi i 3 caratteri da copiare in fondo diventano 24.
    Se il vettore avrà dimensione inferiore a 24 sarà un errore. Se il vettore avrà dimensione DIVERSA (in questo contesto) sarà un errore!
    Questo nulla ha a che vedere con l'allocazione dinamica.
    Il nome della costante è brutto, cosa scriva il libro non me ne frega niente, è un mio giudizio estetico.
    Non ho compreso cosa dovrebbe copiare l'utente...
    Non ho completato la frase che, comunque, ripeteva il concetto precedente: se il numero di caratteri che stai "elaborando" è superiore a quanto allocato fai un errore.

    L'altro giorno quando ho creato maldestramente la funzione che aggiunge i caratteri, ho messo come indicazione del numero di caratteri il '2' nel ciclo for e mi hai suggerito di non piazzare interi nella funzione, bensì sempre una variabile ed è per questo che chiedo all'utente quanti caratteri mettere.
    ATTENZIONE: non confondere variabili con costanti e costanti simboliche. Sono 3 cose ben diverse. Se hai dubbi ripassa o cerca con google o wikipedia.
    Aggiungerò && i<MAX_C al ciclo for della funzione numeroElementi, mi era sfuggito.
    Tali controlli (noiosi) vanno messi sempre. Tieni conto che la maggior parte degli errori di cui senti parlare ogni giorno dipendono da questo!
    Il "maledetto" era scherzoso perché questo piccolo blocco di codice mi ha portato via 48h...
    I professori scherzano in modo diverso dalle persone normali...
    La formattazione del codice la fa in automatico questo IDE online che uso (non ho PC) https://www.onlinegdb.com e so che fa schifo..
    Cercane un altro. Se la birra fa schifo la bevi?
    Ti ringrazio per la risposta e per aver perso tempo nel correggere queste mie castronerie, come detto questo esame per me è più difficile di un Analisi I e II messi assieme.
  • Re: [C] Array di caratteri

    nicolap ha scritto:


    Sbagli: 20 è il numero massimo di caratteri inseribili dall'utente.
    Se aggiungi il terminatore diventano 21.
    Se aggiungi i 3 caratteri da copiare in fondo diventano 24.
    Se il vettore avrà dimensione inferiore a 24 sarà un errore. Se il vettore avrà dimensione DIVERSA (in questo contesto) sarà un errore!
    Questo nulla ha a che vedere con l'allocazione dinamica.
    Il nome della costante è brutto, cosa scriva il libro non me ne frega niente, è un mio giudizio estetico.
    Hai ragione, preso dallo sconforto non ci ho riflettuto bene. Domani ci ritorno su questa cosa e sulle costanti simboliche.
  • Re: [C] Array di caratteri

    nicolap ha scritto:


    .
    Comunque grazie ancora perché so di essere negato e so che non è facile seguirmi
Devi accedere o registrarti per scrivere nel forum
38 risposte