Programma in C-diversi problemi

di il
8 risposte

Programma in C-diversi problemi

Salve a tutti, sto cercando di scrivere un programma in C che memorizzi (temporaneamente, visto che non so usare ancora i riferimenti a file), un elenco di elementi (turbine nel mio caso) e releative specifiche. Il programma inoltre deve dare la possibilità di cercare per modello o per produttore, visualizzare l'elenco completo dei modelli e l'elenco completo compreso di specifiche (in base alla scelta dell'utente), deve dare la possibilità di cercare il modello di turbina più potente, quello più grande, etc.. In fine deve dare la possibilità di cancellare tutto o solo un certo modello o solo le turbine di un certo produttore.
Il primo problema è che non riesco a trovare un modo per tener conto delle turbine già inserite; cioè, se per esempio impongo un limite di 3 turbine memorizzabili, ne inserisco due, torno al menu principale, decido di immettere un'altra turbina (l'ultima dovrebbe essere), il programma sovrascrive quelle già immesse. Come devo fare? Il codice è questo:
#include <stdio.h>
#include <string.h>


#define MODELLI 3
#define CARATTERI 10

struct turbina {
                 char produttore[CARATTERI];
                 char nomemodello[CARATTERI];
                 int  stadi;
                 float diametroMedMAX;
                 float MAX_potenzakW;
                 float pressmaxbar;
                 float temppressmaxK;
                 float maxportatamassicakgs;
                 } ;
                 
INSTURB (struct turbina *);
MENUVISERIC (struct turbina *);
MENUCANC (struct turbina *);


VISTURBMOD (struct turbina *, char[CARATTERI]);
VISTURBPROD (struct turbina *, char[CARATTERI]);
VISELENCO (struct turbina *);
VISELENCOCOMP (struct turbina *);
VISMAXPOTE (struct turbina *);
VISMAXPRESS (struct turbina *);
VISMAXMASS (struct turbina *);
VISMAXDIAM (struct turbina *);

CANCMOD (struct turbina *, char [CARATTERI]);
CANCPROD(struct turbina *, char [CARATTERI]);
CANCTOT (struct turbina *);



VIS(struct turbina *,int);
CANC(struct turbina *,int);
    



main()

{
      struct turbina v[MODELLI];
      int w;
      
      
      
      do {
          printf("\n Opzione 1: inserisci le turbine \n");
          printf("\n Opzione 2: accedi al menu di visualizzazione e ricerca \n");
          printf("\n Opzione 3: accedi al menu di cancellazione \n");
          printf("\n Opzione 0: Esci dal programma \n");
          printf("\n Scegli un'opzione \n");
          scanf("%d",&w);
          
          switch(w) {
                      case 1: 
                              INSTURB(v);
                              break;
                      
                      case 2: 
                              MENUVISERIC(v);
                              break;
                      
                      case 3: 
                              MENUCANC (v);
                              break;
                              
                      case 0:
                              break;
                              
                              
                      }
          }
       
       while(w!=0);
       
       system("pause");

} 
     







       


INSTURB (struct turbina *pt) 
                                   {
                                            char *q;
                                            char *r;
                                            q = pt->produttore;
                                            r = pt->nomemodello;
                                            int i;
                                            int x;
                                            int exit;
                                            
                                            
                                            
                                            do {
                                                printf("\n Inserimento dati : digitare 0 per tornare al menu principale, digitare 1 per procedere con l'inserimento\n");
                                                scanf("%d",&x);
                                                }
                                            while(x!=0 && x!=1);
                                            
                                            if(x==1) {
                                                       
                                                      exit=1;
                                                      for(i=0;i<MODELLI;i++,pt++) {  
                                                                                      
                                                                                   if(exit==1) {
                                                                                                do{
                                                                                                   printf("\n Inserire nome del produttore\n");
                                                                                                   scanf("%s",&pt->produttore);
                                                                                                   if(strlen(q)> CARATTERI) { printf("ERRORE, il nome e' troppo lungo\n");}
                                                                                                  }
                                                                                                while (strlen(q)>CARATTERI);
                                                                                         
                                                                                                do{    
                                                                                                   printf("\n Inserire nome modello\n");
                                                                                                   scanf("%s",&pt->nomemodello);
                                                                                                   if(strlen(r) > CARATTERI) {printf("ERRORE, il nome e' troppo lungo\n");}
                                                                                                  }
                                                                                                while (strlen(r) > CARATTERI);
                                                                                     
                                                                                     
                                                                                                printf("\n Inserire il numero di stadi\n");
                                                                                                scanf("%d",&pt->stadi);
                                                                                     
                                                                                                printf("\n Inserire il diametro medio piu' grande in metri\n");
                                                                                                scanf("%f",&pt->diametroMedMAX);
                                                                                     
                                                                                                printf("\n Inserire la massima potenza erogabile in kW\n");
                                                                                                scanf("%f",&pt->MAX_potenzakW);
                                                                                     
                                                                                                printf("\n Inserire la massima pressione in bar\n");
                                                                                                scanf("%f",&pt->pressmaxbar);
                                                                                     
                                                                                                printf("\n Inserire la temperatura relativa alla pressione massima in Kelvin\n");
                                                                                                scanf("%f",&pt->temppressmaxK);
                                                                                     
                                                                                                printf("\n Inserire la massima portata massica elaborabile in kg/s\n");
                                                                                                scanf("%f",&pt->maxportatamassicakgs);
                                                                                                
                                                                                   
  
                                                                                              
                                                                                              
                                                                                              
                                                                                                if (i<MODELLI-1)  {
                                                                                                                  printf("Inserire un altro modello? Digitare 1 per inserirlo, 0 per tornare al menu principale\n");
                                                                                                                  scanf("%d",&exit);
                                                                                                                  }
                                                                                                       
                                                                                                else             {
                                                                                                                  printf("\n Memoria piena: e' necessario cancellare almeno un modello\n");
                                                                                                                  system("pause"); 
                                                                                                                 }
                                                                                               } 
                                                      
                                                                                      } 
                                                                                               
                                                                                                if (exit == 0) x=0;
                                                                                                                  
                                                                                                       
                                               }       
                                                                                                       
                                            else x=0;
                                            
                                   }
                                            
                                            
                                            
                                            
MENUVISERIC (struct turbina *pt) 
                                     { 
                                            int w,x;
                                            char ricerca [CARATTERI];
                                            char ricerca1[CARATTERI];
                                            char *q;
                                            char *r;
                                            q=ricerca;
                                            r=ricerca1;
                                            
                                            
                                            
                                            
                                            do {
                                                printf(" Si desidera accedere al menu di visualizzazione e ricerca? Digitare 1 per procedere, 0 per tornare al menu principale\n");
                                                scanf("%d",&x);
                                                }
                                            while(x!=0 && x!=1);
                                            
                                            
                                            if(x==1) {
                                                        do{
                                                           printf("\n Opzione 1: cercare un modello di turbina\n");
                                                           printf("\n Opzione 2: cercare turbine in base al produttore\n");
                                                           printf("\n Opzione 3: visualizza l'elenco dei modelli di tutte le turbine\n");
                                                           printf("\n Opzione 4: visualizza l'elenco di tutte le turbine completo delle loro specifiche\n");
                                                           printf("\n Opzione 5: visualizza la turbina che eroga la massima potenza tra quelle inserite\n");
                                                           printf("\n Opzione 6: visualizza la turbina nella quale si ha la pressione maggiore\n");
                                                           printf("\n Opzione 7: visualizza la turbina che elabora la maggiore portata massica\n");
                                                           printf("\n Opzione 8: visualizza la turbina con il diametro maggiore\n");
                                                           printf("\n Opzione 0: Torna al menu principale\n");
                                                           printf("\n Scegliere un'opzione\n");
                                                           scanf("%d",&w);
                                                        
                                                           switch (w) {
                                                                       case 1: 
                                                                               do{
                                                                                   printf("Inserisci il nome del modello\n");
                                                                                   scanf("%s",ricerca);
                                                                                   if (strlen(q) > CARATTERI) printf("\nERRORE: nome del modello troppo lungo\n");
                                                                                   }
                                                                               while(strlen(q) > CARATTERI);
                                                                               VISTURBMOD (pt,ricerca);
                                                                               break;
                                                                       
                                                                       case 2: 
                                                                               do{
                                                                                   printf("Inserisci il nome del produttore\n");
                                                                                   scanf("%s",ricerca1);
                                                                                   if (strlen(r) > CARATTERI) printf("\nERRORE: nome del produttore troppo lungo\n");
                                                                                   }
                                                                               while(strlen(r) > CARATTERI);
                                                                               VISTURBPROD (pt,ricerca1);
                                                                               break;
                                                                       
                                                                       case 3: 
                                                                               VISELENCO(pt);
                                                                               break;
                                                                       
                                                                       case 4:
                                                                               VISELENCOCOMP(pt);
                                                                               break;
                                                                       
                                                                       case 5:
                                                                               VISMAXPOTE(pt);
                                                                               break;
                                                                               
                                                                       case 6: 
                                                                               VISMAXPRESS(pt);
                                                                               break;
                                                                       
                                                                       case 7:
                                                                               VISMAXMASS(pt);
                                                                               break;
                                                                       
                                                                       case 8:
                                                                               VISMAXDIAM(pt);
                                                                               break;
                                                                       
                                                                      }
                                                                      }
                                                          while(w!=0);
                                                          
                                                          }
                                                    
                                                     else x=0; 
                                                     
                                                     
                                                     }
                                                     
                                                     
                                                     
MENUCANC (struct turbina *pt)
                                   {
                                      int w,x,y;
                                      char ricerca [CARATTERI];
                                      char ricerca1[CARATTERI];
                                      char *q;
                                      char *r;
                                      q=ricerca;
                                      r=ricerca1;
                                            
                                            
                                            
                                            do {
                                                printf(" Si desidera accedere al menu di cancellazione? Digitare 1 per procedere, 0 per tornare al menu principale\n");
                                                scanf("%d",&x);
                                                }
                                            while(x!=0 && x!=1);
                                      
                                      if (x==1) {
                                                  do {
                                                       printf("\n Opzione 1: cancellare un modello di turbina\n");
                                                       printf("\n Opzione 2: cancellare tutte le turbine di un determinato produttore\n");
                                                       printf("\n Opzione 3: cancellare tutto\n");
                                                       printf("\n Opzione 0: torna al menu principale\n");
                                                       printf("\n Scegliere un'opzione\n");
                                                       scanf("%d",&w);
                                                       
                                                       switch(w) {
                                                                   case 1:
                                                                           do{
                                                                               printf("Inserisci il nome del modello\n");
                                                                               scanf("%s",ricerca);
                                                                               if(strlen(q) > CARATTERI) printf("ERRORE: nome del modello troppo lungo\n");
                                                                               }
                                                                           while(strlen(q) > CARATTERI);
                                                                           CANCMOD (pt,ricerca);
                                                                           break;
                                                                   
                                                                   case 2:
                                                                           do{
                                                                               printf("Inserisci il nome del produttore\n");
                                                                               scanf("%s",ricerca1);
                                                                               if(strlen(r) > CARATTERI) printf("ERRORE: nome del produttore troppo lungo\n");
                                                                               
                                                                               }
                                                                           while(strlen(r) > CARATTERI);
                                                                           CANCPROD(pt,ricerca1);
                                                                           break;
                                                                   
                                                                   case 3:
                                                                           do{
                                                                               printf("\n Si sta per cancellare tutto: siete sicuri di voler continuare? Digitare 1 per proseguire 0 per annullare\n");
                                                                               scanf("%d",&y);
                                                                               }
                                                                           while(y!=0 && y!=0);
                                                                           
                                                                           if (y==1) {
                                                                                       CANCTOT(pt);
                                                                                     }
                                                                           
                                                                           else y=x=0 ;
                                                                           break;
                                                                   }
                                                       }
                                                  while(w!=0);
                                                  }
                                      }
                                                   
                                      
VISTURBMOD ( struct turbina *PT, char RICERCA[CARATTERI])
                                                              {
                                                                   struct turbina *P = PT; 
                                                                   int i;
                                                                   
                                                                   
                                                                   for(i=0;i<MODELLI && strcmp(RICERCA,P->nomemodello)!=0;i++,P++);                                         
                                                                   if(strcmp(RICERCA,P->nomemodello)==0) {
                                                                                                         printf("\n Modello trovato, le sue caratteristiche sono: \n");
                                                                                                         VIS(PT,i);
                                                                                                         printf("\n\n");
                                                                                                         }
                                                                   else {
                                                                          printf("\n Modello %s non prsente\n",RICERCA);
                                                                          }
                                                                   
                                                                   system("pause");
                                                                   
                                                              }
                                                              

VISTURBPROD (struct turbina *PT, char RICERCA1[CARATTERI])
                                                                {   
                                                                    struct turbina *P = PT;
                                                                    
                                                                    int i;
                                                                    
                                                                    for(i=0;i<MODELLI && strcmp(RICERCA1,P->produttore)!=0;i++,P++);
                                                                    
                                                                    if(strcmp(RICERCA1,P->produttore)==0) {
                                                                                                          printf("\n Le turbine del produttore cercato sono: \n");
                                                                                                          VIS(PT,i);
                                                                                                          printf("\n\n");
                                                                                                          }
                                                                    else {
                                                                           printf("\n Non ci sono turbine del produttore cercato\n");
                                                                           }
                                                                    system("pause");
                                                                
                                                                }

VISELENCO (struct turbina *PT)   
                                     {
                                                                
                                        int n;
                                        
                                        
                                        for(n=0;n<MODELLI;n++,PT++) {
                                                                     
                                                                     printf("\n L'elenco delle turbine e': %s\n",PT->nomemodello);
                                                                     }                             
                                        
                                        printf("\n\n");
                                        
                                        system("pause");
                                     }
                                                                    


VISELENCOCOMP (struct turbina *PT)  
                                    {  
                                       int i;
                                       struct turbina *P = PT;
                                       
                                       for(i=0;i<MODELLI;i++,P++) {
                                                                    printf("\n L'elenco delle turbine completo delle loro caratteristiche e': \n");
                                                                    VIS(PT,i);
                                                                    printf("\n\n");
                                                                    }
                                                                    
                                       system("pause");
                                    
                                    }
                                                                    
                                                                    
VISMAXPOTE (struct turbina *PT)
                                       
                                    { 
                                      struct turbina *P=PT;
                                      int i,j;
                                      float MAXPOTE=0;
                                      
                                      for(i=0;i<MODELLI;i++,P++) {
                                                                   if(P->MAX_potenzakW > MAXPOTE) MAXPOTE=P->MAX_potenzakW ;
                                                                   i=j;
                                                                   }
                                      
                                      printf("\n La turbina con massima potenza e':\n"); 
                                      VIS(PT,j);
                                      printf("\n\n");
                                      system("pause");
                                      
                                      }
                                    
                                      
VISMAXPRESS (struct turbina *PT)

                                      {
                                        struct turbina *P=PT;
                                        int i,j ;
                                        float MAXPRESS = 0;
                                        
                                        for(i=0;i<MODELLI;i++,P++) {
                                                                    if(P->pressmaxbar > MAXPRESS) MAXPRESS=P->pressmaxbar;
                                                                    i=j;
                                                                    }
                                        printf("\n La turbina con massima pressione e': \n");
                                        VIS(PT,j);
                                        printf("\n\n");
                                        system("pause");
                                        }                            
                                        
                                        
VISMAXMASS (struct turbina *PT)
                                     
                                     {
                                       struct turbina *P=PT;
                                       int i,j;
                                       float MAXMASS = 0;
                                       
                                       for(i=0;i<MODELLI;i++,P++) {
                                                                   if(P->maxportatamassicakgs > MAXMASS) MAXMASS=P->maxportatamassicakgs;
                                                                   i=j;
                                                                   }
                                       
                                       printf("\n La turbina con massima portata massica elaborabile e':\n");
                                       VIS(PT,j);
                                       printf("\n\n");
                                       system("pause");
                                       
                                       }
VISMAXDIAM (struct turbina *PT)

                                     {
                                       struct turbina *P=PT;
                                       int i,j;
                                       float MAXDIAM = 0;
                                       
                                       for(i=0;i<MODELLI;i++,P++) {
                                                                   if(P->diametroMedMAX > MAXDIAM) MAXDIAM = P->diametroMedMAX;
                                                                   i=j;
                                                                   }
                                       printf("\n La turbina col diamentro massimo e':\n");
                                       VIS(PT,j);
                                       printf("\n\n");
                                       system("pause");
                                       
                                       }




CANCMOD (struct turbina *PT, char RICERCA[CARATTERI])
                                                            {
                                                                 struct turbina *P = PT;
                                                                 int i,x;
                                                                 
                                                                 for(i=0;i<MODELLI && strcmp(RICERCA,P->nomemodello)!=0;i++,P++);
                                                                 
                                                                 if (strcmp(RICERCA,P->nomemodello)==0) {
                                                                                                          do{
                                                                                                             printf("Si desidera procedere con la cancellazione del modello %s ? Digitare 0 per annullare 1 per confermare\n",RICERCA);
                                                                                                             scanf("%d",&x);
                                                                                                          
                                                                                                          if(x==1) {
                                                                                                                     CANC(PT,i);
                                                                                                                     printf("Modello cancellato\n");
                                                                                                                   }
                                                                                                             }
                                                                                                          while(x!=0 && x!=1);
                                                                                                          
                                                                                                         }
                                                                else printf("\n Modello %s non trovato\n",RICERCA);
                                                                system("pause");
                                                                                                          
                                                            
                                                            }
                                                            
                                                                 
CANCPROD(struct turbina *PT, char RICERCA1[CARATTERI])
                                                              
                                                            {
                                                                 struct turbina *P = PT;
                                                                 int i,x;
                                                                 
                                                                 for(i=0;i<MODELLI && strcmp(RICERCA1,P->produttore)!=0;i++,P++);
                                                                 
                                                                 if(strcmp(RICERCA1,P->produttore)==0) {
                                                                                                         do{
                                                                                                            printf("Si desidera procedere con la cancellazione di tutte le turbine del produttore %s ? Digitare 0 per annullare 1 per confermare\n",RICERCA1);
                                                                                                            scanf("%d",&x);
                                                                                                          
                                                                                                          if(x==1) {
                                                                                                                     CANC(PT,i);
                                                                                                                     printf("Turbine del produttore selezionato cancellate\n");
                                                                                                                     }
                                                                                                           }
                                                                                                          while(x!=0 && x!=1);
                                                                                                       } 
                                                                                                           
                                                                 else printf("\n Non ci sono turbine del produttore cercato\n");                              
                                                                 system("pause");
                                                                                                          
                                                            
                                                            }


CANCTOT (struct turbina *PT)
                                  { 
                                       int i;
                                       
                                       for(i=0;i<MODELLI;i++)
                                       CANC(PT,i);
                                  }









VIS (struct turbina *PP, int n) 
                            
                            {
                               PP=PP+n;
                               
                               
                               printf("\n Nome modello: %s", PP->nomemodello);
                               printf("\n Nome del produttore: %s", PP->produttore);
                               printf("\n Numero di stadi: %d", PP->stadi);
                               printf("\n Diametro medio massimo (m) : %f",PP->diametroMedMAX);
                               printf("\n Pressione massima (bar): %f",PP->pressmaxbar);
                               printf("\n Temperatura relativa alla pressione massima (K): %f",PP->temppressmaxK);
                               printf("\n Massima portata elaborabile (kg/s): %f",PP->maxportatamassicakgs);
                            
                            }

CANC (struct turbina *PP,int n) 
                            
                            { 
                              PP=PP+n;
                              
                              strcpy(PP->nomemodello,"");
                              PP->stadi=0;
                              PP->diametroMedMAX=0;
                              PP->pressmaxbar=0;
                              PP->temppressmaxK=0;
                              PP->maxportatamassicakgs=0;
                            
                            }

8 Risposte

  • Re: Programma in C-diversi problemi

    Ciao,
    per ovvie ragioni non ho letto il codice...
    Dopo aver confessato questo, posso provare a rispondere al tuo quesito: se il problema è quello di non sovrascrivere i dati che hai già memorizzato, allora una soluzione semplice è quella di tenere una variabile (globale?) nella quale vai a memorizzare quante celle del tuo array (suppongo che ci sia un array) hai già riempito. Alla successiva immissione di un nuovo dato sai già in quale cella devi andare a scrivere. E dovresti aver risolto...
  • Re: Programma in C-diversi problemi

    Ok, come collego questa variabile globale alle celle dell'array? Cioè, l'array è
    v[MODELLI] che non è un array globale. La variabile è tipo

    #define varglob = v;

    o altro?

    Inoltre, questa variabile deve essere passata anche alla funzione che si occupa dell'inserimento dei dati giusto?
  • Re: Programma in C-diversi problemi

    Se dichiari la variabile come globale, ti basta mettere
    int celle_riempite = 0;
    all'inizio del codice. Poi quando vuoi scrivere qualcosa nella prima cella libera fai semplicemente
    array[celle_riempite++] = quello_che_vuoi_memorizzare;
  • Re: Programma in C-diversi problemi

    Spero tu faccia questi programma per scopi didattici non per un uso effettivo ...
  • Re: Programma in C-diversi problemi

    oregon ha scritto:


    Spero tu faccia questi programma per scopi didattici non per un uso effettivo ...
    Non vuoi comprare una turbina?
  • Re: Programma in C-diversi problemi

    minomic ha scritto:


    Se dichiari la variabile come globale, ti basta mettere
    int celle_riempite = 0;
    all'inizio del codice. Poi quando vuoi scrivere qualcosa nella prima cella libera fai semplicemente
    array[celle_riempite++] = quello_che_vuoi_memorizzare;
    Quello che voglio memorizzare, è preso da una funzione, definita fuori dal main e che prende in ingresso un puntatore all'array. array[celle_riempite++] allora va messo come parametro in ingresso a quella funzione o da un'altra parte?

    oregon ha scritto:


    Spero tu faccia questi programma per scopi didattici non per un uso effettivo ...
    Si, esatto.
  • Re: Programma in C-diversi problemi

    Ci sarà per forza un punto del codice dove fai
    array[qualche_indice] = qualcosa_da_mettere_nell_array;
    Bene: lì ci metti il codice che dicevo prima e dovresti essere a posto.
  • Re: Programma in C-diversi problemi

    Grazie mille! Ora funziona!
Devi accedere o registrarti per scrivere nel forum
8 risposte