[C] Aiuto con char contenenti spazi

MikC1
Salve a tutti .. Ho questo problema su questo programma abbastanza complesso ( almeno per me :))..
In ogni caso leggendo il forum ho visto di altri con la mia stessa domanda come fare a inserire stringhe contenenti spazi. Ora nel mio programma le stl non funzionano e mi complicano solamente la vita visto che dovrei fare con esse funzioni di ricerca e di ordinamento che ho già preparato considerando le stringhe come array di caratteri. Quindi considerando in tal modo le stringhe c'è un modo in cui io posso inserire degli array con gli spazi? Ho già provato con la fgets:

struct coefficenti
{char materiale[SIZE_MAX_STRING];
int K;
}P;
fgets(P.materiale,SIZE_MAX_STRING, stdin);

ma in esecuzione il programma salta l'inserimento o comunque non riesce a prendere ciò che io scrivo. Grazie in anticipo per l'aiuto e i suggerimenti spero di essere stato chiaro nel problema :D

Risposte
apatriarca
Non è per niente chiaro in realtà. fgets legge una riga di testo dallo stream che gli viene passato (o un certo numero di caratteri se il buffer è più corto), per cui dovrebbe funzionare. Il motivo per cui non funziona è con ogni probabilità in qualche altra parte del programma. Probabilmente stai mischiando la lettura con fgets con quella usando scanf (o altro) ed è rimasto un carattere di a capo non letto nell'input. Quando fgets viene chiamata legge fino al primo carattere di a capo e quindi non arriva a leggere la nuova riga. E' in ogni caso impossibile dirti che cosa sbagli senza vedere il tuo codice.

MikC1
Si ok provo a postarti il codice dove prendo in imput la stringa .

void Carica()
{system("CLS"); fflush(stdin);
f=fopen("F:/MICHELE LUNATI 4a As/coefficenti.dat","a");
int N, i=0;
cout<<"Quanti contatti vuoi inserire?="; cin>>N;
do{cout<<"Inserisci materiale:";
fgets(P.materiale,SIZE_MAX_STRING, stdin);
cout<<"Coefficente di "<>P.K;
fwrite(&P,sizeof(P),1,f);
i++;
}
while(i fclose(f);
Ordina();
fflush(stdin);
}

Quando lo eseguo va come in loop cioè non mi permette di inserire nessun carattere.. vado poi a visualizzare il record del file ed esce ad esempio Coefficente di e poi nulla..

apatriarca
Non puoi sperare di usare funzioni prese da librerie diverse, con livelli di astrazione e metodi di lettura diversi, senza comprenderne il funzionamento e non incontrare problemi. Il problema non è in quella riga che hai evidenziato, ma nelle precedenti e successive. cin >> N; ignora tutti gli spazi (e caratteri di a capo) che precedono un numero intero e lasciano nel buffer di ingresso tutto il resto. Quando richiami fgets, questa funzione legge il resto della riga fino al primo carattere di a capo. A questo punto cerca di leggere il materiale e con ogni probabilità la lettura fallisce e la variabile P rimane invariata. Questo supponendo ovviamente che mischiare le funzioni di iostream e cstdio non causi problemi (non sono sicuro che lo standard fornisca qualche garanzia a riguardo anche se immagino che in questo caso non ci siano troppi problemi). Ma se usi una libreria, tanto vale usarla fino in fondo.. Puoi usare cin per la lettura senza problemi. Se mi dici esattamente cosa vuoi fare posso suggerirti i cambiamenti da fare. Vuoi leggere N e poi la successiva riga? Se fosse così devi prima ignorare tutto il resto della riga e per poi leggerla.
cin.ignore(std::numeric_limits<int>::max(),'\n');
cin.getline(P.materiale, SIZE_MAX_STRING);

Dopo una lettura, in un programma reale, è importante e utile usare cin.fail() per sapere se la lettura ha avuto successo. Per poter leggere altri caratteri normalmente si usa cin.clear() per eliminare lo stato di errore e poi usare la funzione ignore come sopra per eliminare il resto della riga.

Volendo fare altri commenti. fflush funziona solo per gli stream aperti in OUTPUT e NON VA USATA SU STDIN. Non c'è alcuna ragione per farlo, soprattutto se lo usi insieme alle classi/funzioni di iostream. system("CLS") non lo condivido, ma non esistono soluzioni portabili per fare la stessa cosa. Immagino che f sia una variabile globale. Considerando che apri il file e lo chiudi all'interno della stessa funzione, credo sia una pessima idea. Sarebbe MOLTO meglio se fosse una variabile locale.

MikC1
Il mio intento è di far inserire all'utente il numero di materiale e di conseguenza coefficienti da inserire quindi faccio un semplice ciclo do while che va da i=0 a N-1 .. Detto ciò non so come fare per prendere in imput la stringa materiali.. Suggeriscimi un metodo alternativo per inserire la stringa con i materiali come ad esempio i caratteri TRUCIOLI DI LEGNO.

apatriarca
cin.getline fa la stessa cosa di fgets ma usando cin. La riga con cin.ignore invece serve per eliminare il carattere di a capo non letto dopo la lettura di N.

MikC1
I parametri richiesti dalla get line quali sono? poi posso comunque prenderla anche se si tratta di char [X] e non di string?

apatriarca
Qui trovi una descrizione della funzione getline che ho usato nell'esempio e non fa uso di std::string. Posta tutto il codice usando il tag code e quando ho tempo provo a correggerlo.

MikC1
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <list>
using namespace std;
void Carica();
void CalcoloQ();
float Calcolo();
void Visualizza();
void Ordina();
void Ricerca();
int FileSize();
void Menu();
FILE *f;
bool fine;
list<int> l;
list<int> g;
list<int> r;

struct Coefficenti
{char materiale[30];
 float K;
}P;


void Carica()
{system("CLS"); fflush(stdin);
 f=fopen("F:/MICHELE LUNATI 4a As/coefficenti.dat","a");
 int N, i=0; 
 cout<<"Quanti contatti vuoi inserire?="; cin>>N;
 do{cout<<"Inserisci materiale:"; cin>>P.materiale;
    cout<<"Coefficente di "<<P.materiale<<"="; cin>>P.K;
    fwrite(&P,sizeof(P),1,f);
    i++;
    }
 while(i<N);
fclose(f);
Ordina();
system("CLS"); fflush(stdin);
}


void Menu()
{printf("\nMenu della rubrica...\n");
     printf("1) Carica altri coefficenti\n");
     printf("2) Ricerca coefficente\n");
     printf("3) Visualizza coefficenti di conduttanza\n");
     printf("4) Calcolo lamda equivalente\n");
     printf("5) Calcolo calore\n"); 
     printf("6) Esci\n"); 
}


void Visualizza()
{Ordina();
 system("CLS"); 
 f=fopen("F:/MICHELE LUNATI 4a As/coefficenti.dat","rb");
 while(fread(&P,sizeof(P),1,f))
{cout<<"\nCoefficente di "<<P.materiale<<"= "<<P.K; printf("\n");
}
fclose(f);
}


bool trovato;
char K[30]; int  C;
void Ricerca()
{system("CLS");
 f=fopen("F:/MICHELE LUNATI 4a As/coefficenti.dat","rb");
 printf("\nNome del materiale da ricercare..."); cin>>K;
 int Inf=0, Sup=FileSize()-1;
 trovato=false;
 while (Inf<=Sup && !trovato)
       {C=(Inf+Sup)/2;
        fseek(f,C*sizeof(P),SEEK_SET);
        fread(&P,sizeof(P),1,f);
        if(strcmp(K,P.materiale)>0) Inf=C+1;
        else {if(strcmp(K,P.materiale)<0) Sup=C-1;
              else trovato=true;
             }
       }
 if(trovato){ cout<<"\nCoefficente di "<<P.materiale<<"= "<<P.K; printf("\n"); getch();}
 else cout<<"Non presente"; getch();
fclose(f);
}





void Ordina()
{system("CLS");
 f=fopen("F:/MICHELE LUNATI 4a As/coefficenti.dat","r+");
 int Sup=FileSize();
 bool Scambio;
 Coefficenti S, T;
 do{Sup--;
    Scambio=false;
    for(int i=0; i<Sup; i++)
         {fseek(f,i*sizeof(T),SEEK_SET);
          fread(&T,sizeof(T),1,f);
          fseek(f,(i+1)*sizeof(S),SEEK_SET);
          fread(&S,sizeof(S),1,f);
          if(strcmp(T.materiale,S.materiale)>0)
             {fseek(f,i*sizeof(S),SEEK_SET);
              fwrite(&S,sizeof(S),1,f);
              fseek(f,(i+1)*sizeof(T),SEEK_SET);
              fwrite(&T,sizeof(T),1,f);
              Scambio=true;
              }
          }
    }
 while(Scambio);
 fclose(f);
 system("CLS");
}



int FileSize()
{fseek(f,0,SEEK_END); 
 int N=ftell(f);
 return N/sizeof(P);
}




int S;

float Calcolo()
{int i=0;
 cout<<"Inserire di quanti materiali è composto il muro:"; cin>>S; float coefficente[S], spessore[S],x;
 
 while(i<S)
 {Ricerca(); 
  if(trovato){f=fopen("F:/MICHELE LUNATI 4a As/coefficenti.dat","r");
              fseek(f,C*sizeof(P),SEEK_SET);
              fread(&P,sizeof(P),1,f);
              coefficente[i]=P.K;
              cout<<"Inserisci spessore del"<<P.materiale<<"="; cin>>x;
              spessore[i]=x;
               }
i++;
 }
fclose(f);
int J=0; float d=0;
while(J<S)
{float rapporto=spessore[J]/coefficente[J]; d+=rapporto;
 J++;
}
float lambda=1/d; cout<<"lambda equivalente="<<lambda;
return lambda;
}
              
void CalcoloQ()
{ float B, H;
     cout<<"Inserisci base parete"; cin>>B;
     cout<<"Inserisci base parete"; cin>>C;
     float A=B*H;
     float T, d;
     cout<<"Inserisci temperatura esterna="; cin>>T; getch();
     cout<<"Inserisci temperatura interna="; cin>>d;
     int DeT;
     cout<<"inserisci quanto tempo="; cin>>DeT;
     float Q=(A/S)* Calcolo() * (T-d) * DeT;
     cout<<"Calore="<<Q; 
     getch();
     }
     


int main()
{system("CLS");
 do {Menu();
     char c=getche();      
     switch(c)
          {case'1': Carica(); break;
           case'2': Ricerca(); break;
           case'3': Visualizza(); break;
           case'4': Calcolo(); break;
           case'5': CalcoloQ(); break;
           case'6': fine=true; break;
           default: printf("\nERROR\n");
          }
    }
 while(!fine);
}    


Buona fortuna e grazie mille per l'aiuto.
Gli errori sono per ora che non riesco a scrivere sul file una stringa con gli spazi e non riesco a visualizzare correttamente coefficenti del tipo 0.21 mentre 0.2, 0.02, 0.002, 0.0024 li prende ma con 0. due numeri dopo la virgola no. Grazie ancora a chi mi aiuterà a correggere il codice ( che formalmente da compilatore risulta corretto) ma logicamente no :)

vict85
Un commento veloce: secondo lo standard fflush andrebbe usato solo con gli stream in scrittura ed negli altri casi (puntatore NULL a parte) ha un comportamente indefinito. Quando uno standard parla di comportamente indefinito significa che NON devi assolutamente usarlo in quel caso. Quindi leva quel comando, piuttosto usalo con il puntatore a NULL che la il fflush a tutti gli stream.

Concordo poi con apatriarca sullo sconsigliare nella maniera più assoluta l'uso di stdio e iostream nello stesso programma.

Tra l'altro perché continui a cancellare lo schermo?

MikC1
Io pensavo che fflush servisse per cancellare i dati in memoria centrale e accellerare il programma .. per quanto riguarda il sistem cls è lo stesso lo faccio per velocizzare il programma.. comunque se utilizzassi io stream dovrei gestire tutte le operazioni con cout e cin e basta? Per piacere aggiustatemi il codice e sottolineatemi gli errori e le modifiche effettuate ve ne sono immensamente grato :D

claudio862
Purtroppo ci sono veramente molti errori, è difficile capire proprio da dove cominciare… Forse dovresti partire da una funzione alla volta, e assicurarti che funzioni a dovere prima di passare alle altre.

Innanzitutto qualche commento sullo stile (non te ne faccio una colpa, perché ho visto professori insegnare proprio così):
- MAI scrivere più di un'istruzione su una sola riga. Quando qualcuno legge una riga simile, pensa solo "è un cout":

cout << "qualcosa di molto lungo, così lungo che nessuno lo legge fino alla fine"; cin >> a;

- La barra spaziatrice è grande approssimativamente come 5 tasti normali. Quindi mediamente serve uno spazio ogni 5 caratteri :P. Aumenta la spaziatura! Ad esempio, separa gli operatori (+-*/=<…) con uno spazio.
- Indenta meglio.
- Dai dei nomi significativi alle variabili. l, k, m non significano niente, non si capisce al volo cosa rappresentano.
- Se proprio devi usare delle variabili globali (sarebbe meglio di no), dichiarale tutte in cima. Non sparpagliate per il file, tra una funzione e l'altra.

Poi, mai scrivere

cout << "\nBla bla bla";

piuttosto scrivi

cout << "Bla bla bla\n";

I caratteri di nuova linea '\n' scrivili alla fine dell'output, non all'inizio.


Poi, questo:

int S;
cin >> S;
float coefficente[S];

non si può fare in C++. S deve essere una costante nota durante la compilazione (in soldoni, un numero). Il compilatore non dovrebbe riuscire a compilare qualcosa del genere, se lo fa è perché usa estensioni che non fanno parte dello standard.

Io userei direttamente dei std::vector invece di array semplici.


Anche questo:

float B, H;
cout << "Inserisci base parete";
cin >> B;
cout << "Inserisci base parete";
cin >> C;

float A = B*H;

non si può fare. Usi H prima di avergli dato un valore. Probabilmente volevi fare cin >> H invece di cin >> C.



Visto che in ogni funzione in cui apri un file poi lo chiudi, perché "f" è una variabile globale? Dichiarala ogni volta che ti serve, dentro le funzioni.



Spezzo invece una lancia in favore di usare funzioni da stdio.h (che in C++ si chiama "cstdio") e iostream nello stesso sorgente, ma non sullo stesso stream. Cioè, usare cin e cout per dialogare con l'utente e fread e fwrite per scrivere su un file può avere senso (in questo caso forse è la soluzione più semplice). Usare cin, cout, getchar, printf e scanf tutte per dialogare con l'utente, no.



Per leggere una stringa intera, compresi gli spazi, puoi usare (preso dal link postato da apatriarca):

char name[256];
std::cout << "Please, enter your name: ";
std::cin.getline(name, 256);




fflush(s) serve a forzare la scrittura di tutti i caratteri mandati allo stream s. Quando scrivi dei caratteri su uno stream (con cout, printf, fprintf e credo anche fwrite), il sistema non li scrive subito, ma li mette in un buffer. Quando il buffer è pieno, lo scrive in blocco nello stream. Questo per questioni di efficienza, scrivere caratteri singoli è molto più costoso di scriverli in blocco.
fflush(s) quando s è uno stream di input non ha senso, e infatti non ha un comportamento definito dallo standard (= mai usarlo).
In generale quindi non acceleri proprio niente, al massimo rendi tutto più lento.
system("cls") invece esegue un nuovo programma, chiamando l'interprete di sistema, e chiamando il programma "cls" (che in realtà è un comando interno dell'interprete), che cancella lo schermo. Questa è un'operazione lentissima, quindi anche qui altro che accelerare (che oltretutto si scrive con una sola elle :evil: ).

MikC1
claudio86 grazie mille per le tue osservazioni . Cercherò di curare meglio la forma del programma anche se piuttosto che queste osservazioni sulla forma mi servirebbero aiuti sul problema del programma. Toglierò tutti i fflush e le system cls ma vorrei sapere perchè anche usando la cin.getline come da link non prende bene il carattere. E vorrei anche sapere perchè numeri come 0.21 non li visualizza correttamente. Grazie ancora per il tempo che mi hai dedicato :)

claudio862
"MikC":
claudio86 grazie mille per le tue osservazioni . Cercherò di curare meglio la forma del programma anche se piuttosto che queste osservazioni sulla forma mi servirebbero aiuti sul problema del programma. Toglierò tutti i fflush e le system cls ma vorrei sapere perchè anche usando la cin.getline come da link non prende bene il carattere. E vorrei anche sapere perchè numeri come 0.21 non li visualizza correttamente. Grazie ancora per il tempo che mi hai dedicato :)


Puoi mostrare un esempio concreto che non ti funziona?

apatriarca
"claudio86":

Spezzo invece una lancia in favore di usare funzioni da stdio.h (che in C++ si chiama "cstdio") e iostream nello stesso sorgente, ma non sullo stesso stream. Cioè, usare cin e cout per dialogare con l'utente e fread e fwrite per scrivere su un file può avere senso (in questo caso forse è la soluzione più semplice). Usare cin, cout, getchar, printf e scanf tutte per dialogare con l'utente, no.

Credo sia comunque in generale meglio essere coerenti e che la scelta tra una libreria e un'altra non debba essere fatta a caso. iostream/fstream e cstdio credo siano in generale abbastanza sovrapponibili in termini di funzionalità e che per la maggior parte dei programmi non ci siamo molte ragioni per preferirne una al posto dell'altra se non per preferenza personale e l'interazione con altre librerie. Discorso un po' diverso si avrebbe secondo me con le librerie di sistema in cui è possibile fare cose impossibili usando le librerie standard (per esempio memory mapped files).

@MikC: Hai eliminato il carattere di a capo rimasto nello stream dopo la lettura dei numeri prima di leggere la nuova riga? Tra qualcosa come cin >> N e cin.getline ci va (quasi) sempre qualcosa come cin.ignore(256, '\n') dove 256 è il numero di caratteri massimi da ignorare. In caso contrario cin.getline estrarrà il resto della linea dopo il numero (o altro) che hai inserito. Nota che è in molti casi reali preferibile leggere una riga per volta usando cin.getline e poi estrarre i valori con sstream (o altro).

In che senso non visualizza correttamente numeri come 0.21? Che cosa visualizza? Qualcosa come 0.209999993443489? Il problema in questo caso è che 0.21 non è rappresentabile perfettamente usando un float ma è approssimato dal numero che ti sta mostrando. E' più che altro un problema di visualizzazione comunque e ci sono librerie che fanno un lavoro molto migliore.

MikC1
Allora per quanto riguarda la stringa contenente spazi io se ho capito bene quello che dice apatriarca dopo la
cin.getline>>(p.materiale,30) dovrei metterci cin.ignore(30,\'n'); ?

Per quanto riguarda lo 0.21 mi da questo errore guardate:

apatriarca
Al posto dell'immagine sarebbe bastato copiare il testo che ti è stato stampato a video. Credo sarebbe meglio se postassi nuovamente il tuo codice. Sembrerebbe un problema dovuto ad una mancata inizializzazione di qualche variabile oppure ad una lettura non corretta del valore da file o console.

MikC1
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <list>
using namespace std;
void Carica();
void CalcoloQ();
float Calcolo();
void Visualizza();
void Ordina();
void Ricerca();
int FileSize();
void Menu();
FILE *f;
bool fine;
list<int> l;
list<int> g;
list<int> r;

struct Coefficenti
{char materiale[30];
 float K;
}P;


void Carica()
{system("CLS"); fflush(stdin);
 f=fopen("F:/MICHELE LUNATI 4a As/coefficenti.dat","a");
 int N, i=0; 
 cout<<"Quanti contatti vuoi inserire?="; cin>>N;
 do{cout<<"Inserisci materiale:"; cin>>P.materiale;
    cout<<"Coefficente di "<<P.materiale<<"="; cin>>P.K;
    fwrite(&P,sizeof(P),1,f);
    i++;
    }
 while(i<N);
fclose(f);
Ordina();
system("CLS"); fflush(stdin);
}


void Menu()
{printf("\nMenu della rubrica...\n");
     printf("1) Carica altri coefficenti\n");
     printf("2) Ricerca coefficente\n");
     printf("3) Visualizza coefficenti di conduttanza\n");
     printf("4) Calcolo lamda equivalente\n");
     printf("5) Calcolo calore\n"); 
     printf("6) Esci\n"); 
}


void Visualizza()
{Ordina();
 system("CLS"); 
 f=fopen("F:/MICHELE LUNATI 4a As/coefficenti.dat","rb");
 while(fread(&P,sizeof(P),1,f))
{cout<<"\nCoefficente di "<<P.materiale<<"= "<<P.K; printf("\n");
}
fclose(f);
}


bool trovato;
char K[30]; int  C;
void Ricerca()
{system("CLS");
 f=fopen("F:/MICHELE LUNATI 4a As/coefficenti.dat","rb");
 printf("\nNome del materiale da ricercare..."); cin>>K;
 int Inf=0, Sup=FileSize()-1;
 trovato=false;
 while (Inf<=Sup && !trovato)
       {C=(Inf+Sup)/2;
        fseek(f,C*sizeof(P),SEEK_SET);
        fread(&P,sizeof(P),1,f);
        if(strcmp(K,P.materiale)>0) Inf=C+1;
        else {if(strcmp(K,P.materiale)<0) Sup=C-1;
              else trovato=true;
             }
       }
 if(trovato){ cout<<"\nCoefficente di "<<P.materiale<<"= "<<P.K; printf("\n"); getch();}
 else cout<<"Non presente"; getch();
fclose(f);
}





void Ordina()
{system("CLS");
 f=fopen("F:/MICHELE LUNATI 4a As/coefficenti.dat","r+");
 int Sup=FileSize();
 bool Scambio;
 Coefficenti S, T;
 do{Sup--;
    Scambio=false;
    for(int i=0; i<Sup; i++)
         {fseek(f,i*sizeof(T),SEEK_SET);
          fread(&T,sizeof(T),1,f);
          fseek(f,(i+1)*sizeof(S),SEEK_SET);
          fread(&S,sizeof(S),1,f);
          if(strcmp(T.materiale,S.materiale)>0)
             {fseek(f,i*sizeof(S),SEEK_SET);
              fwrite(&S,sizeof(S),1,f);
              fseek(f,(i+1)*sizeof(T),SEEK_SET);
              fwrite(&T,sizeof(T),1,f);
              Scambio=true;
              }
          }
    }
 while(Scambio);
 fclose(f);
 system("CLS");
}



int FileSize()
{fseek(f,0,SEEK_END); 
 int N=ftell(f);
 return N/sizeof(P);
}




int S;

float Calcolo()
{int i=0;
 cout<<"Inserire di quanti materiali è composto il muro:"; cin>>S; float coefficente[S], spessore[S],x;
 
 while(i<S)
 {Ricerca(); 
  if(trovato){f=fopen("F:/MICHELE LUNATI 4a As/coefficenti.dat","r");
              fseek(f,C*sizeof(P),SEEK_SET);
              fread(&P,sizeof(P),1,f);
              coefficente[i]=P.K;
              cout<<"Inserisci spessore del"<<P.materiale<<"="; cin>>x;
              spessore[i]=x;
               }
i++;
 }
fclose(f);
int J=0; float d=0;
while(J<S)
{float rapporto=spessore[J]/coefficente[J]; d+=rapporto;
 J++;
}
float lambda=1/d; cout<<"lambda equivalente="<<lambda;
return lambda;
}
              
void CalcoloQ()
{ float B, H;
     cout<<"Inserisci base parete"; cin>>B;
     cout<<"Inserisci base parete"; cin>>C;
     float A=B*H;
     float T, d;
     cout<<"Inserisci temperatura esterna="; cin>>T; getch();
     cout<<"Inserisci temperatura interna="; cin>>d;
     int DeT;
     cout<<"inserisci quanto tempo="; cin>>DeT;
     float Q=(A/S)* Calcolo() * (T-d) * DeT;
     cout<<"Calore="<<Q; 
     getch();
     }
     


int main()
{system("CLS");
 do {Menu();
     char c=getche();      
     switch(c)
          {case'1': Carica(); break;
           case'2': Ricerca(); break;
           case'3': Visualizza(); break;
           case'4': Calcolo(); break;
           case'5': CalcoloQ(); break;
           case'6': fine=true; break;
           default: printf("\nERROR\n");
          }
    }
 while(!fine);
}


Secondo me visto che nonostante i vostri suggerimenti non riesco a correggerlo se gentilmente quando avete tempo e se volete soprattutto me lo aggiustaste direttamente voi il codice segnalandomi dove avete apportato delle modifiche . Se non vi va non fa niente grazie lo stesso di tutto. apatriarca non credo di aver tralasciato niente nella inizializzazione vedi un po tu :) grazie per l'aiuto l'invito di sopra è anche a te se hai tempo correggimi direttamente il codice cosi vediamo se parte.. grazie infinitamente di tutto :)

claudio862
"MikC":
Secondo me visto che nonostante i vostri suggerimenti non riesco a correggerlo se gentilmente quando avete tempo e se volete soprattutto me lo aggiustaste direttamente voi il codice segnalandomi dove avete apportato delle modifiche . Se non vi va non fa niente grazie lo stesso di tutto. apatriarca non credo di aver tralasciato niente nella inizializzazione vedi un po tu :) grazie per l'aiuto l'invito di sopra è anche a te se hai tempo correggimi direttamente il codice cosi vediamo se parte.. grazie infinitamente di tutto :)


Veramente ti ho mostrato prima quale variabile non hai inizializzato (linea 162):

"claudio86":
Anche questo:

float B, H;
cout << "Inserisci base parete";
cin >> B;
cout << "Inserisci base parete";
cin >> C;

float A = B*H;

non si può fare. Usi H prima di avergli dato un valore. Probabilmente volevi fare cin >> H invece di cin >> C.

apatriarca
In questo momento non ho molto tempo di guardarlo, ma non mi sembra tu abbia seguito fino ad ora le nostre indicazioni:
1. Il codice contiene infatti ancora le espressioni fflush(stdin) e system("CLS") nonostante la loro inutilità.
2. Il codice fa ancora largamente uso di variabili globali al posto di quelle locali.
3. Il codice utilizza ancora un mix di stdio.h e iostream per l'I/O su console.
4. I nomi delle variabili sono ancora senza senso.
5. Le variabili globali sono sparse per tutto il file invece di essere dichiarate tutte insieme.
6. Il codice è ancora indentato da schifo.
7. Non hai corretto l'errore di inizializzazione già segnalato da claudio86.

MikC1
Si scusate il codice che ho ora è questo

#include <string.h>
#include <conio.h>
#include <iostream>
#include <list>
#define Z 30
using namespace std;
void Carica();
void CalcoloQ();
float Calcolo();
void Visualizza();
//void Ordina();
void Ricerca();
int FileSize();
void Menu();
FILE *f;
bool fine;
list<int> l;
list<int> g;
list<int> r;
char K[30]; int  C;
bool trovato;
float G;
struct Coefficenti
{char materiale[30];
 float C;
}P;


void Carica()
{f=fopen("F:/MICHELE LUNATI 4a As/coefficenti.dat","a");
 int N, i=0; 
 cout<<"Quanti contatti vuoi inserire?="; cin>>N;
 do{cout<<"Inserisci materiale:"; 
   cin.getline(P.materiale,30) cin.ignore(30,'\n');
    cout<<"Coefficente di ="; 
    cin>>P.C; 
    fwrite(&P,sizeof(P),1,f);
    i++;
    }
 while(i<N);
fclose(f);
Ordina();
}


void Menu()
{cout<<"\nMenu della rubrica...\n";
     cout<<"1) Carica altri coefficenti\n";
     cout<<"2) Ricerca coefficente\n";
    cout<<"3) Visualizza coefficenti di conduttanza\n";
    cout<<"4) Calcolo lamda equivalente\n";
     cout<<"5) Calcolo calore\n"; 
     cout<<"6) Esci\n"; 
}


void Visualizza()
{Ordina();
 f=fopen("F:/MICHELE LUNATI 4a As/coefficenti.dat","rb");
 while(fread(&P,sizeof(P),1,f))
{cout<<"\nCoefficente di "<<P.materiale<<"= "<<P.C; printf("\n");
}
fclose(f);
}



void Ricerca()
{system("CLS");
 f=fopen("F:/MICHELE LUNATI 4a As/coefficenti.dat","rb");
 cout<<"\nNome del materiale da ricercare..."; cin>>K;
 int Inf=0, Sup=FileSize()-1;
 trovato=false;
 while (Inf<=Sup && !trovato)
       {C=(Inf+Sup)/2;
        fseek(f,C*sizeof(P),SEEK_SET);
        fread(&P,sizeof(P),1,f);
        if(strcmp(K,P.materiale)>0) Inf=C+1;
        else {if(strcmp(K,P.materiale)<0) Sup=C-1;
              else trovato=true;
             }
       }
 if(trovato){ cout<<"\nCoefficente di "<<P.materiale<<"= "<<P.C; printf("\n"); getch();}
 else cout<<"Non presente"; getch();
fclose(f);
}





void Ordina()
{system("CLS");
 f=fopen("F:/MICHELE LUNATI 4a As/coefficenti.dat","r+");
 int Sup=FileSize();
 bool Scambio;
 Coefficenti S, T;
 do{Sup--;
    Scambio=false;
    for(int i=0; i<Sup; i++)
         {fseek(f,i*sizeof(T),SEEK_SET);
          fread(&T,sizeof(T),1,f);
          fseek(f,(i+1)*sizeof(S),SEEK_SET);
          fread(&S,sizeof(S),1,f);
          if(strcmp(T.materiale,S.materiale)>0)
             {fseek(f,i*sizeof(S),SEEK_SET);
              fwrite(&S,sizeof(S),1,f);
              fseek(f,(i+1)*sizeof(T),SEEK_SET);
              fwrite(&T,sizeof(T),1,f);
              Scambio=true;
              }
          }
    }
 while(Scambio);
 fclose(f);
 system("CLS");
}



int FileSize()
{fseek(f,0,SEEK_END); 
 int N=ftell(f);
 return N/sizeof(P);
}


float Calcolo()
{int i=0, S;
f=fopen("F:/MICHELE LUNATI 4a As/coefficenti.dat","r");
 cout<<"Inserire di quanti materiali è composto il muro:"; 
 cin>>S;
  float coefficente[Z], spessore[Z],x;
 
 while(i<S)
 {Ricerca(); 
  if(trovato){fseek(f,C*sizeof(P),SEEK_SET);
              fread(&P,sizeof(P),1,f);
              coefficente[i]=P.C;
              cout<<"Inserisci spessore del"<<P.materiale<<"="; 
              cin>>x;
              spessore[i]=x;
              
              }
i++;
 }
fclose(f);
int J=0; float d=0, G=0;
while(J<S)
{float rapporto=spessore[J]/coefficente[J]; 
 d+=rapporto;
G+=spessore[J];
  J++;
}
float lambda=1/d; cout<<"lambda equivalente="<<lambda;
return lambda;
}
              


void CalcoloQ()
{ float B, H, T, d;
     cout<<"Inserisci base parete"; 
     cin>>B;
     cout<<"Inserisci base parete"; 
     cin>>H;
     
     float A=B*H;
    
     cout<<"Inserisci temperatura esterna="; 
     cin>>T;
     cout<<"Inserisci temperatura interna="; 
     cin>>d;
     float Q=(A/G)* Calcolo() * (T-d);
     cout<<"Calore="<<Q; 
     getch();
     }
     


int main()
{system("CLS");
 do {Menu();
     char c=getche();      
     switch(c)
          {case'1': Carica(); break;
           case'2': Ricerca(); break;
           case'3': Visualizza(); break;
           case'4': Calcolo(); break;
           case'5': CalcoloQ(); break;
           case'6': fine=true; break;
           default: printf("\nERROR\n");
          }
    }
 while(!fine);
}    
     
     
     
     

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.