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++ - alternativa a questo programma
Forum - C/C++ - alternativa a questo programma

Avatar
gtsolid (Normal User)
Newbie


Messaggi: 2
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 18:32
Sabato, 18/09/2010
ciao a tutti
qui ho il testo del problema: http://img541.imageshack.us/img541/7929/immagineht.jpg

e qui la soluzione che ho scritto:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define N_AZIENDE 5
  5.  
  6. int main (int argc, char* argv[])
  7. {
  8. FILE *fin, *fout;
  9. int cliente, azienda, operazione, q[N_AZIENDE], salva, totale = 0,cc;
  10. float qta;
  11. if(argc != 7)
  12.     {
  13.     fprintf (stderr,"Errore nel numero di argomenti passati al programma\n");
  14.     return (-1);
  15.     }
  16. if((fin = fopen(argv[1],"r")) == NULL)
  17.     {
  18.     fprintf (stderr,"Errore in apertura file di ingresso\n");
  19.     return (-2);
  20.     }
  21. /* il file di output lo apriamo solo se necessario */
  22. cliente = atoi(argv[2]);
  23. azienda = atoi(argv[3]) - 1;
  24. operazione = argv[4][0];
  25. qta = atof(argv[5]);
  26. if (argv[6][1] == 'S')
  27.     {
  28.     salva = 0;
  29.     }
  30. else /* non sono previsti errori ....*/
  31.     {
  32.     salva = 1;
  33. /* apriamo il file di output */
  34. if((fout=fopen(argv[7],"w")) == NULL)
  35.     fprintf (stderr,"Errore in apertura file di uscita\n");
  36.     }
  37. /* tutte e tre le operazioni richiedono di scandire il file */
  38. while(fscanf(fin,"%d %d %d %d %d %d", &cc, &q[0], &q[1], &q[2], &q[3], &q[4]) == 6)
  39. {
  40. if(cc == cliente)
  41. {
  42. switch(operazione) {
  43. case 'A':
  44. q[azienda] += qta;
  45. break;
  46. case 'V':
  47. q[azienda] -= qta;
  48. break;
  49. case 'G':
  50. q[azienda] = q[azienda] * (1 + qta/100.0);
  51. break;
  52. }
  53. }
  54. if (salva)
  55. {
  56. fprintf(fout,"%d %d %d %d %d %d\n", cc, q[0], q[1], q[2], q[3], q[4]);
  57. }
  58. else
  59. {
  60. /* accumulo il totale dell’azienda, da stampare alla fine */
  61. totale += q[azienda];
  62. }
  63. }
  64. if (!salva)
  65. {
  66. printf("Numero totale di azione dell’azienda %d: %4d\n", azienda, totale);
  67. }
  68. fclose(fin);
  69. if (salva)
  70. {
  71. fclose(fout);
  72. }
  73. }



vorrei innanzitutto un parere e soprattutto un'alternativa... nel senso di una struttura in cui siano presenti struct.

grazie

PM
Avatar
matrix90 (Normal User)
Newbie


Messaggi: 3
Iscritto: 19/09/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 11:08
Domenica, 19/09/2010
in quel problema devi utilizzare per forza una struttura dati dinamica, poichè il problema di dice che i nomi che stanno sul file non sono prefissati... quindi io farei una bella lista e procederei di conseguenza

PM
Avatar
matrix90 (Normal User)
Newbie


Messaggi: 3
Iscritto: 19/09/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 12:06
Domenica, 19/09/2010
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct user{
  5.         int name;
  6.         int company_a;
  7.         int company_b;
  8.         int company_c;
  9.         int company_d;
  10.         int company_e;
  11. };
  12.  
  13. typedef struct user user;
  14.  
  15. struct list{
  16.         user data_user;
  17.         void *next;
  18. };
  19.  
  20. typedef struct list list;
  21.  
  22. list *
  23. list_alloc();
  24.  
  25. list *
  26. list_load(list *p, FILE *fp, char *name_file);
  27.  
  28. list *
  29. list_create(list *p, int user, int company_a, int company_b, int company_c, int company_d, int company_e);
  30.  
  31. list *
  32. list_tail(list *p);
  33.  
  34. void
  35. list_insert(list *p, int user, int company_a, int company_b, int company_c, int company_d, int company_e);
  36.  
  37. void
  38. list_print(list *p);
  39.  
  40. int
  41. main (int argc, char **argv){
  42.         list *p=(list *)NULL;
  43.         FILE *fp;
  44.  
  45.         p=list_load(p, fp, argv[1]);
  46.  
  47.         list_print(p); 
  48.  
  49.         exit(0);
  50. }
  51.  
  52. list *
  53. list_alloc(){
  54.         list *new=(list *)NULL;
  55.  
  56.         new=(list *)malloc(sizeof(list));
  57.  
  58.         if(new){
  59.                 new->next=(list *)NULL;
  60.         }
  61.                
  62.         return new;
  63. }
  64.  
  65. list *
  66. list_load(list *p, FILE *fp, char *name_file){
  67.         int ret_val, user, company_a, company_b, company_c, company_d, company_e;
  68.        
  69.         fp=fopen(name_file, "r");
  70.  
  71.         if(fp){
  72.                 do{
  73.                         ret_val=fscanf(fp, "%d %d %d %d %d %d", &user, &company_a, &company_b, &company_c, &company_d, &company_e);
  74.  
  75.                         if(ret_val==6){
  76.                                 p=list_create(p, user, company_a, company_b, company_c, company_d, company_e);
  77.                         }
  78.  
  79.                 }while(ret_val==6);
  80.  
  81.                 fclose(fp);
  82.         }
  83.  
  84.         return p;
  85. }
  86.  
  87. list *
  88. list_create(list *p, int user, int company_a, int company_b, int company_c, int company_d, int company_e){
  89.         list *new, *temp;
  90.  
  91.         new=list_alloc();
  92.  
  93.         if(new){
  94.                 list_insert(new, user, company_a, company_b, company_c, company_d, company_e);
  95.         }else{
  96.                 printf("error to alloc\n");
  97.         }
  98.  
  99.         if(!p){
  100.                 p=new;
  101.         }else{
  102.                 temp=p;
  103.  
  104.                 temp=list_tail(temp);
  105.  
  106.                 temp->next=new;
  107.         }
  108.  
  109.         return p;
  110. }
  111.  
  112. list *
  113. list_tail(list *p){
  114.         while(p->next){
  115.                 p=p->next;
  116.         }
  117.         return p;
  118. }
  119.  
  120. void
  121. list_insert(list *p, int user, int company_a, int company_b, int company_c, int company_d, int company_e){
  122.         p->data_user.name=user;
  123.         p->data_user.company_a=company_a;
  124.         p->data_user.company_b=company_b;
  125.         p->data_user.company_c=company_c;
  126.         p->data_user.company_d=company_d;
  127.         p->data_user.company_e=company_e;
  128. }
  129.  
  130. void
  131. list_print(list *p){
  132.         while(p){
  133.                 printf("%d %d %d %d %d %d\n", p->data_user.name, p->data_user.company_a, p->data_user.company_b, p->data_user.company_c, p->data_user.company_d, p->data_user.company_e);
  134.  
  135.                 p=p->next;
  136.         }
  137. }



diciamo dovresti fare un qualcosa del genere...
questo codice pero carica solo i dati da file e nient altro! :asd:

PM
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Up
0
Down
V
Segnala al moderatore
Postato alle 15:08
Domenica, 19/09/2010
attenzione che il programma genera un enorme memory leak!
Bisogna sempre deallocare la memoria riservata dalla malloc usando la free

Codice sorgente - presumibilmente C/C++

  1. void release_list(list *start)
  2. {
  3.    list *tmp;
  4.  
  5.    while(start != NULL)
  6.    {
  7.          tmp = start;
  8.          start = start->next;
  9.          free(tmp);
  10.    }
  11. }



da richiamare prima di terminare il programma.

Ultima modifica effettuata da lorenzo il 19/09/2010 alle 15:09
PM
Avatar
matrix90 (Normal User)
Newbie


Messaggi: 3
Iscritto: 19/09/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 10:04
Lunedì, 20/09/2010
sisi lorenzo lo so... ma ho fatto tutto in maniera veloce per fare vedere un po come avrei fatto io... comunque sapresti spiegarmi perche se io dealloco nella maniera che mi hai fatto vedere tu mi rimangono sempre i puntatori? cioe se io dpo avere deallocato tutto provo a ristampare, mi stampa? ovviamente con qualke dato mancante.
invece se opero in questa maniera il tutto va abuon fine:

Codice sorgente - presumibilmente C/C++

  1. list *
  2. list_free(list *p){
  3.         list *temp;
  4.  
  5.         if(!p){
  6.                 return NULL;
  7.         }
  8.  
  9.         if(p->next){
  10.                 p->next=list_free(p->next);
  11.         }
  12.  
  13.         temp=p->next;
  14.         free(p);
  15.         return temp;
  16. }


PM