|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2009
Città: Firenze
Messaggi: 341
|
[C] problemino semplice
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 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 riporto sotto il sorgente; Codice:
/*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 - [email protected] *\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);
}
__________________
concluso positivamente trattative con: OIBAF, Iceone70, grollagrolla123, roger82, aazzon, antani87, Mo3bius, frantheman, mozz, Dominum, pcusato, aristippo, sirix37, FatinaBella80, liberato87, Vill89, 77claudio77, xio, Alekos Panagulis Ultima modifica di kos_90 : 12-11-2009 alle 13:50. Motivo: ops |
|
|
|
|
|
#2 |
|
Junior Member
Iscritto dal: Jun 2005
Messaggi: 26
|
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???
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Oct 2009
Città: Firenze
Messaggi: 341
|
Quote:
per fare questo vorrei evitare di passare argomenti al main o di usare variabili globali..sono un po piccoso ma lo faccio per esercizio
__________________
concluso positivamente trattative con: OIBAF, Iceone70, grollagrolla123, roger82, aazzon, antani87, Mo3bius, frantheman, mozz, Dominum, pcusato, aristippo, sirix37, FatinaBella80, liberato87, Vill89, 77claudio77, xio, Alekos Panagulis |
|
|
|
|
|
|
#4 |
|
Junior Member
Iscritto dal: Jun 2005
Messaggi: 26
|
#include <map>
Poi il resto lo dovresti capire... Memorizzi su una mappa e in caso di salvataggio reinderizzi su file |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2788
|
Quote:
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 Per la gestione delle stringhe (array di caratteri) vedi le varie funzioni disponibili qui: LINK Per scrivere su una stringa: LINK |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:33.



















