Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - problema programma stringhe
Forum - C/C++ - problema programma stringhe

Avatar
904 (Normal User)
Newbie


Messaggi: 4
Iscritto: 22/12/2011

Segnala al moderatore
Postato alle 12:48
Mercoledì, 28/12/2011
Salve non riesco col seguente programma non stampa quello che dovrebbe stampare!

Codice sorgente - presumibilmente C/C++

  1. /*  Corso di laurea:    Ingegneria Informatica
  2. *   Esame:              Fondamenti di Informatica
  3. *   Prova scritta del:  23 gennaio 2006
  4. *
  5. *   Si scriva un programma che soddisfi le seguenti specifiche:
  6. *       - carica da un file di testo un elenco di modelli di autovetture; per
  7. *         ogni modello di autovettura le informazioni sono: marca, modello e
  8. *         prezzo
  9. *       - visualizza a video l'elenco caricato;
  10. *       - ordina l'elenco in base alla marca e quindi al modello;
  11. *       - visualizza a video l'elenco ordinato;
  12. *       - elimina record duplicati nell'elenco: due o più record sono da
  13. *         considerarsi duplicati se coincidono tutti e tre i relativi campi;
  14. *         nel caso vengano rilevati dati duplicati il programma elimina tutte
  15. *         le copie del dato tranne una;
  16. *       - visualizza a video l'elenco
  17. *       - salva in un file l'elenco rispettando la sintassi del file riportata
  18. *         in basso nelle ulteriori specifiche
  19. *
  20. *   Ulteriori specifiche:  
  21. *       - il file di testo contentente l'elenco è strutturato come segue:
  22. *         la prima riga contiene un numero intero che rappresenta quanti record
  23. *         sono presenti nell'elenco salvato su file;
  24. *         su ogni riga c'è un record riportato secondo la seguente sintassi:
  25. *         !Campo_Marca!Campo_Modello!Campo_Prezzo!
  26. *       - la dimensione massima dell'elenco gestito è pari a 100
  27. *       - oltre al main si scrivano funzioni per effettuare le operazioni di:
  28. *          -> caricamento dell'elenco da file
  29. *          -> ordinamento dell'elenco mediante algoritmo di bubble sort
  30. *          -> elimina i record duplicati nell'elenco
  31. *          -> visualizzazione a video dell'elenco
  32. *          -> salvataggio elenco su file
  33. *
  34. *    Altro:
  35. *       - per maggiore chiarezza è stato allegato al presente compito un file di
  36. *         input di esempio ("auto.txt")
  37. */
  38.  
  39. #include <stdio.h>
  40. #include <stdlib.h>
  41. #define MAX 100
  42. int carica(char marca[][MAX],char modello[][MAX],float prezzo[][MAX]);
  43. void stampa(char marca[][MAX],char modello[][MAX],float prezzo[][MAX],int rec);
  44. int main()
  45. {
  46.     int rec,i;
  47.     char marca[MAX][MAX],modello[MAX][MAX];
  48.     float prezzo[MAX][MAX];
  49.     rec=carica(marca,modello,prezzo);
  50.     stampa(marca,modello,prezzo,rec);
  51.  
  52.       system("PAUSE");
  53.       return 0;
  54.      
  55. }
  56. int carica(char marca[][MAX],char modello[][MAX],float prezzo[][MAX])
  57. {
  58.      int rec,i;
  59.      FILE *autom;
  60.      char nome[MAX];
  61.      printf("Inserisci il nome del file da aprire:\n");
  62.      scanf("%s", nome);
  63.      autom=fopen(nome,"r");
  64.      if(autom==NULL)
  65.      {
  66.          printf("Errore nell'apertura del file\n");
  67.          system("pause");
  68.          exit(1);
  69.      }
  70.      fscanf(autom,"%d", &rec);
  71.      for(i=0;i<rec;++i)
  72.          fscanf(autom,"!%s!%s!%s!", marca[i],modello[i],prezzo[i]);
  73.      return rec;
  74. }    
  75. void stampa(char marca[][MAX],char modello[][MAX],float prezzo[][MAX],int rec)
  76. {
  77.      int i;
  78.      printf("\tMARCA\tMODELLO\tPREZZO\n");
  79.      for(i=0;i<rec;++i)
  80.          printf("\t%s\t%s\t%f\n",marca[i],modello[i],prezzo[i] );
  81. }


PM
Avatar
Nullable (Normal User)
Expert


Messaggi: 217
Iscritto: 12/07/2011

Up
1
Down
V
Segnala al moderatore
Postato alle 13:21
Mercoledì, 28/12/2011
Attento, guarda che marca, modello e prezzo sono array multidimensionali. Quando richiami printf logicamente stampi solo una parte dell'array.

Infatti ho richiamato printf con un ciclo - 904 - 28/12/11 15:30
Sì ma avresti dovuto usare i puntatori, come ti ha giustamente mostrato tasx. - Nullable - 28/12/11 17:29
scriverlo sottoforma di puntatore che sottoforma di puntatore è la sessa cosa cioè scrivere **marca e scrivere marca[][MAX] è esattamente la stessa cosa poi lui ha utilizzato l'allocazione dinamica cosa che non posso utilizzare - 904 - 28/12/11 17:48
PM
Avatar
tasx (Dev Team)
Expert


Messaggi: 439
Iscritto: 15/12/2008

Up
0
Down
V
Segnala al moderatore
Postato alle 13:27
Mercoledì, 28/12/2011
così funge ;)

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAX 100
  5.  
  6. int carica(char **marca,char **modello,float *prezzo)
  7. {
  8.     int rec,i;
  9.     FILE *autom;
  10.     char nome[MAX];
  11.     printf("Inserisci il nome del file da aprire:\n");
  12.     scanf("%s", nome);
  13.     autom=fopen(nome,"r");
  14.     if(autom==NULL)
  15.     {
  16.         printf("Errore nell'apertura del file\n");
  17.         system("pause");
  18.         exit(1);
  19.     }
  20.     fscanf(autom,"%d", &rec);
  21.     printf("Trovati %d record\n", rec);
  22.     char *t = malloc(sizeof(char) * 1024);
  23.     for(i=0;i<rec;++i)
  24.         {      
  25.                 marca[i] = malloc(sizeof(char) * MAX);
  26.                 modello[i] = malloc(sizeof(char) * MAX);
  27.                 fscanf(autom, "%s\n", t);
  28.                 marca[i] = strdup(strtok(t, "!"));
  29.                 modello[i] = strdup(strtok(NULL, "!"));
  30.                 prezzo[i] = atof(strtok(NULL, "!"));
  31.         /* fscanf(autom,"!%s!%s!%s!", marca[i],modello[i],prezzo[i]); */
  32.                 printf("marca trovata: %s\n", marca[i]);
  33.                 memset(t, 0, 1024);
  34.         }
  35.     free(t);
  36.     return rec;
  37. }    
  38. void stampa(char **marca,char **modello,float *prezzo,int rec)
  39. {
  40.      int i;
  41.      printf("\tMARCA\tMODELLO\tPREZZO\n");
  42.      for(i=0;i<rec;++i)
  43.          printf("\t%s\t%s\t%f\n",marca[i],modello[i],prezzo[i] );
  44. }
  45.  
  46. int main()
  47. {
  48.     int rec,i;
  49.     char **marca,**modello;
  50.     float *prezzo;
  51.     marca = malloc(sizeof(char*) * MAX);
  52.     modello = malloc(sizeof(char*) * MAX);
  53.         prezzo = malloc(sizeof(float) * MAX);
  54.     rec=carica(marca,modello,prezzo);
  55.     stampa(marca,modello,prezzo,rec);
  56.  
  57.       system("PAUSE");
  58.       return 0;
  59.      
  60. }



manca molta roba, ma il suo dovere lo fà ;)

ciaociao

Grazie per il tuo aiuto ma non posso assolutamente usare l'allocazione dinamica non è argomento di questo esame puoi aiutarmi in modo diverso? - 904 - 28/12/11 15:30
PM