PDA

View Full Version : [C] problemino semplice


kos_90
12-11-2009, 12:16
ciao a tutti!

ho iniziato a studiarmi un po il c e ho iniziato a scrivere un programmino di geometria (piu che altro a scopo mio didattico perchè fa poco :D );
il programma è cosi strutturato: nella main() vengono chiamate le funzioni richieste dall'utente (Calcola_figura), ciascuna delle quali è in grado di produrre un output su file, come nel codice sotto;
il mio problema è che vorrei fare in modo che l'output di ogni funzione venisse scritto in un file "virtuale" (cioè non direttamente su un file di testo) che main() sia sempre in grado di leggere, e che al prompt da parte di main() prima di uscire chieda all''utente se desidera stampare tutto l'output delle singole funzioni in un unico file di testo.

come posso fare? spero di essere stato chiaro :D

riporto sotto il sorgente;


/*Author: Glauco Ciullini*/

//includo le librerie necessarie
#include <stdio.h>
#include <math.h>

//definisco il sistema operativo su cui il programma verrà compilato
#ifdef __WIN32__
char *os="Win32";
char *clrscr="cls";
#endif
#ifdef __LINUX__
char *os="Linux";
char *clrscr="clear";
#endif
#ifdef __APPLE__
char *os="Mac OS";
char *clrscr="clear";
#endif

//dichiaro i prototipi delle funzioni
void Calcola_triangolo(void);
void Calcola_rettangolo(void);
void Calcola_trapezio(void);
void Calcola_cerchio(void);

//iniziallizzo main()
int main (void) {

//pulisco lo schermo
system(clrscr);

//dichiaro le variabili
int figura=0;
int esci=0;
int c;

//dichiaro il ciclo che permette di ripetere l'operazione fino a quando l'utente non digita '0'
do {
//stampo a schermo uno splash-screen
printf("**************************************************\n");
printf("* GEOMETRIA v1.0 *\n");
printf("* *\n");
printf("* Autore:Glauco Ciullini - g.ciullini@yahoo.it *\n");
printf("**************************************************\n\n");
printf("Versione %s\n\n", os);


//stampo a schermo le opzioni
printf("Scegli le dimensioni da calcolare:\n\n");
printf("1- Area, perimetro e 2° lato di un triangolo isoscele o equilatero introducendone la base e l'altezza\n");
printf("2- Area, perimetro e diagonale di un rettangolo o di un quadrato introducendone le dimensioni dei lati\n");
printf("3- Area, perimetro, 2° e 3° lato di un trapezio isoscele introducendone base minore, base maggiore e altezza\n");
printf("4- Area e perimetro di un cerchio introducendone il raggio\n\n");
printf("0- Esci\n");

//attendo e controllo l'input dell'utente
do {
c = scanf("%d", &figura);
if ((c == 0) || ((figura!=0) && (figura!=1) && (figura!=2) && (figura!=3) && (figura!=4))) {
scanf("%*[^\n]"); printf("Digita un valore numerico compreso tra 0 e 5.\n");
}
} while ((c == 0) || ((figura!=0) && (figura!=1) && (figura!=2) && (figura!=3) && (figura!=4)));
c=0;

//chiamo la funzione appropriata o esco in base alla scelta
switch (figura) {
case 0:
esci=1;
break;
case 1:
Calcola_triangolo();
break;
case 2:
Calcola_rettangolo();
break;
case 3:
Calcola_trapezio();
break;
case 4:
Calcola_cerchio();
break;
}
} while (esci==0);
return (0);
}

//iniziallizzo la funzione Calcola_triangolo
void Calcola_triangolo(void) {

//pulisco lo schermo
system(clrscr);

//iniziallizzo le variabili
double base, altezza;
double perimetro, area, lato;
int continua=1;
int i=1;
int c;

printf("1- Area, perimetro e 2° lato di un triangolo isoscele o equilatero introducendone la base e l'altezza\n\n");

//dichiaro il ciclo che permette di ripetere l'operazione fino a quando l'utente non digita tutti numeri maggiori di 0
do {
//richiedo l'inserimento dei dati, verificando che siano numerici
printf("Inserisci la base:\n");
do {
c = scanf("%lg", &base);
if (c == 0) {
scanf("%*[^\n]"); printf("Digita un valore numerico.\n");
}
} while (c == 0);
printf("Inserisci l'altezza:\n");
do {
c = scanf("%lg", &altezza);
if (c == 0) {
scanf("%*[^\n]"); printf("Digita un valore numerico.\n");
}
} while (c == 0);

//se l'input dell'utente è un numero maggiore di 0 eseguo il calcolo, stampo a schermo e attendo nuovamente un input
if ((base>0) && (altezza>0)) {
lato=sqrt(pow((base/2),2) + pow(altezza,2));
perimetro=base+(lato*2);
area=(base*altezza)/2;
printf("Triangolo di base %g cm e altezza %g cm;\n\n", base, altezza);
printf("Area = %g cm2;\n", area);
printf("Perimetro = %g cm;\n\n", perimetro);
printf("Lato = %g cm;\n\n", lato);
FILE *stream = fopen("save.txt","a");
fprintf(stream, "Triangolo %d, di base %g cm e altezza %g cm;\n\nArea = %g cm2;\nPerimetro = %g cm;\nLato = %g;\n\n", i, base, altezza, area, perimetro, lato);
fflush(stream);
fclose(stream);
i++;
printf("Digita 1 per calcolare di nuovo, 0 per tornare all'inizio.\n");
do {
c = scanf("%d", &continua);
if ((c == 0) || ((continua!=1) && (continua!=0))) {
scanf("%*[^\n]"); printf("Digita un valore numerico compreso tra 0 e 1.\n");
}
} while ((c == 0) || ((continua!=1) && (continua!=0)));
}
//se l'input dell'utente non è maggiore di 0 invito a ridigitare
else {
printf("Inserisci numeri maggiore di 0.\n");
}
} while (continua==1);

//pulisco lo schermo
system(clrscr);
}

//iniziallizzo la funzione Calcola_rettangolo
void Calcola_rettangolo(void) {

//pulisco lo schermo
system(clrscr);

//iniziallizzo le variabili
double lato1, lato2;
double perimetro, area, diagonale;
int continua=1;
int i=1;
int c;

printf("2- Area, perimetro e diagonale di un rettangolo o di un quadrato introducendone le dimensioni dei lati\n\n");

//dichiaro il ciclo che permette di ripetere l'operazione fino a quando l'utente non digita tutti numeri maggiori di 0
do {

//richiedo l'inserimento dei dati, verificando che siano numerici
printf("Inserisci il primo lato:\n");
do {
c = scanf("%lg", &lato1);
if (c == 0) {
scanf("%*[^\n]"); printf("Digita un valore numerico.\n");
}
} while (c == 0);
printf("Inserisci il secondo lato:\n");
do {
c = scanf("%lg", &lato2);
if (c == 0) {
scanf("%*[^\n]"); printf("Digita un valore numerico.\n");
}
} while (c == 0);

//se l'input dell'utente è maggiore di 0 eseguo il calcolo, stampo a schermo e attendo nuovamente un input
if ((lato1>0) && (lato2>0)) {
perimetro=(lato1+lato2)*2;
area=lato1*lato2;
diagonale=sqrt(pow(lato1,2) + pow(lato2,2));
printf("Rettangolo o quadrato di lato %g cm e %g cm;\n\n", lato1, lato2);
printf("Area = %g cm2;\n", area);
printf("Perimetro = %g cm;\n", perimetro);
printf("Diagonale = %g cm;\n\n", diagonale);
FILE *stream = fopen("save.txt","a");
fprintf(stream, "Rettangolo o quadrato %d, di lato 1 %g cm e lato 2 %g cm;\n\nArea = %g cm2;\nPerimetro = %g cm;\nDiagonale = %g;\n\n", i, lato1, lato2, area, perimetro, diagonale);
fflush(stream);
fclose(stream);
i++;
printf("Digita 1 per calcolare di nuovo, 0 per tornare all'inizio.\n");
do {
c = scanf("%d", &continua);
if ((c == 0) || ((continua!=1) && (continua!=0))) {
scanf("%*[^\n]"); printf("Digita un valore numerico compreso tra 0 e 1.\n");
}
} while ((c == 0) || ((continua!=1) && (continua!=0)));
}
//se l'input dell'utente non è maggiore di 0 invito a ridigitare
else {
printf("Inserisci numeri maggiore di 0.\n");
}
} while (continua==1);

//pulisco lo schermo
system(clrscr);
}

//iniziallizzo la funzione Calcola_trapezio
void Calcola_trapezio(void) {

//pulisco lo schermo
system(clrscr);

//iniziallizzo le variabili
double baseMagg, baseMin, altezza, differenza;
double perimetro, area, lato;
int continua=1;
int i=1;
int c;

printf("3- Area, perimetro, 2° e 3° lato di un trapezio isoscele introducendone base minore, base maggiore e altezza\n\n");

//dichiaro il ciclo che permette di ripetere l'operazione fino a quando l'utente non digita tutti numeri maggiori di 0
do {

//richiedo l'inserimento dei dati, verificando che siano numerici
printf("Inserisci la base maggiore:\n");
do {
c = scanf("%lg", &baseMagg);
if (c == 0) {
scanf("%*[^\n]"); printf("Digita un valore numerico.\n");
}
} while (c == 0);
printf("Inserisci la base minore:\n");
do {
c = scanf("%lg", &baseMin);
if (c == 0) {
scanf("%*[^\n]"); printf("Digita un valore numerico.\n");
}
} while (c == 0);
printf("Inserisci l'altezza:\n");
do {
c = scanf("%lg", &altezza);
if (c == 0) {
scanf("%*[^\n]"); printf("Digita un valore numerico.\n");
}
} while (c == 0);

//se l'input dell'utente è maggiore di 0 eseguo il calcolo, stampo a schermo e attendo nuovamente un input
if ((baseMagg>0) && (baseMin>0) && (altezza>0)) {
differenza=baseMagg-baseMin;
lato=(sqrt(pow((differenza/2),2) + pow(altezza,2)));
perimetro=baseMagg+baseMin+(lato*2);
area=((baseMagg+baseMin)*altezza)/2;
printf("Trapezio isoscele di base maggiore %g cm, base minore %g cm e altezza %g cm;\n\n", baseMagg, baseMin, altezza);
printf("Area = %g cm2;\n", area);
printf("Perimetro = %g cm;\n", perimetro);
printf("2° e 3° lato = %g cm;\n\n", lato);
FILE *stream = fopen("save.txt","a");
fprintf(stream, "Trapezio isoscele %d, di base maggiore %g cm, base minore %g cm e altezza %g cm;\n\nArea = %g cm2;\nPerimetro = %g cm;\nLato 2 e 3 = %g;\n\n", i, baseMin, baseMagg, altezza, area, perimetro, lato);
fflush(stream);
fclose(stream);
i++;
printf("Digita 1 per calcolare di nuovo, 0 per tornare all'inizio.\n");
do {
c = scanf("%d", &continua);
if (((c == 0) || (continua!=1) && (continua!=0))) {
scanf("%*[^\n]"); printf("Digita un valore numerico compreso tra 0 e 1.\n");
}
} while ((c == 0) || ((continua!=1) && (continua!=0)));
}

//se l'input dell'utente non è maggiore di 0 invito a ridigitare
else {
printf("Inserisci numeri maggiore di 0.\n");
}
} while (continua==1);

//pulisco lo schermo
system(clrscr);
}

//iniziallizzo la funzione Calcola_cerchio
void Calcola_cerchio(void){

#define pigreco 3.14

//pulisco lo schermo
system(clrscr);

//iniziallizzo le variabili
double raggio;
double perimetro, area;
int continua=1;
int i=1;
int c;

printf("4- Area e perimetro di un cerchio introducendone il raggio\n\n");

//dichiaro il ciclo che permette di ripetere l'operazione fino a quando l'utente non digita tutti numeri maggiori di 0
do {

//richiedo l'inserimento dei dati, verificando che siano numerici
printf("Inserisci il raggio:\n");
do {
c = scanf("%lg", &raggio);
if (c == 0) {
scanf("%*[^\n]"); printf("Digita un valore numerico.\n");
}
} while (c == 0);

//se l'input dell'utente è maggiore di 0 eseguo il calcolo, stampo a schermo e attendo nuovamente un input
if (raggio>0) {
perimetro=raggio*2*pigreco;
area=pow(raggio,2)*pigreco;
printf("Cerchio di raggio %g cm;\n\n", raggio);
printf("Area = %g cm2;\n", area);
printf("Perimetro = %g cm;\n\n", perimetro);
FILE *stream = fopen("save.txt","a");
fprintf(stream, "Cerchio %d, di raggio %g cm;\n\nArea = %g cm2;\nPerimetro = %g cm;\n\n", i, raggio, area, perimetro);
fflush(stream);
fclose(stream);
i++;
printf("Digita 1 per calcolare di nuovo, 0 per tornare all'inizio.\n");
do {
c = scanf("%d", &continua);
if ((c == 0) || ((continua!=1) && (continua!=0))) {
scanf("%*[^\n]"); printf("Digita un valore numerico compreso tra 0 e 1.\n");
}
} while ((c == 0) || ((continua!=1) && (continua!=0)));
}

//se l'input dell'utente non è maggiore di 0 invito a ridigitare
else {
printf("Inserisci numeri maggiore di 0.\n");
}
} while (continua==1);

//pulisco lo schermo
system(clrscr);
}

lupixslacky
12-11-2009, 15:11
Ho visto il codice,ma nonostante salvi tutto su file non capisco cosa vuoi fare?
Cosa vuoi ottenere?Vuoi evitare di salvare su file o vuoi che il file nel main venga aperto???:mbe:

kos_90
12-11-2009, 15:35
Ho visto il codice,ma nonostante salvi tutto su file non capisco cosa vuoi fare?
Cosa vuoi ottenere?Vuoi evitare di salvare su file o vuoi che il file nel main venga aperto???:mbe:

allora, l'effetto che vorrei ottenere è di poter chiamare diverse volte le varie funzioni, e ogni volta che ogni funzione viene eseguita correttamente poter "salvare" il risultato delle operazioni della funzione, proprio come faccio adesso, ma anzichè salvarle brutalmente su un file di testo memorizzarle da qualche parte, qualche parte che io nella mia inesperienza chiamo file o stream "virtuale", in tal modo da recuperarlo eventualmente soltanto quando l'utente decide di uscire dal main.il quale main che, se l'utente decide di salvare, scriverà tutto in un file di testo.

per fare questo vorrei evitare di passare argomenti al main o di usare variabili globali..sono un po piccoso ma lo faccio per esercizio :D

lupixslacky
12-11-2009, 20:33
#include <map>
Poi il resto lo dovresti capire...
Memorizzi su una mappa e in caso di salvataggio reinderizzi su file

wingman87
12-11-2009, 20:44
#include <map>
Poi il resto lo dovresti capire...
Memorizzi su una mappa e in caso di salvataggio reinderizzi su file
Credo che map sia parte di C++.

Alla fine cos'è un file di testo? E' un array di caratteri. Quindi puoi salvare i tuoi dati in un array di caratteri e quando vuoi scriverlo sul file. Per fare le cose per bene però dovresti allocare lo spazio per l'array aumentandolo quando diventa insufficiente. Quindi:
Per la gestione della memoria vedi malloc, realloc e free qui: LINK (http://www.cplusplus.com/reference/clibrary/cstdlib/)
Per la gestione delle stringhe (array di caratteri) vedi le varie funzioni disponibili qui: LINK (http://www.cplusplus.com/reference/clibrary/cstring/)
Per scrivere su una stringa: LINK (http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/)