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;
}