fatshady (Normal User)
Newbie
Messaggi: 5
Iscritto: 02/06/2010
|
Ciao, volevo chiedervi una mano per interpretare questo codice, il nostro prof ce l'ha fornito e dobbiamo fare una relazione. A scuola non studiamo C, il prof ce l'ha spiegato ma ho capito molto poco... riuscireste a dirmi cosa fanno le varie funzioni? dovrei portarla per venerdi ma mi son ricordato solo ora che dovevo farla. Se riuscite a darmi una mano ve ne sarei grato se non fate in tempo per venerdi scriverò quello che ho capito da solo
Codice sorgente - presumibilmente C |
ecco il codice : #include<stdio.h> #include<stdlib.h> #define MAXOP 100 #define NUMBER '0' int getop(char []); void push(double); double pop(void); /* reverse polish calculator */ int main(void) { int type; double op2; char s[MAXOP]; while((type = getop(s)) != EOF) { switch(type) { case NUMBER: push(atof(s)); break; case '+': push(pop()+pop()); break; case '*': push(pop()*pop()); break; case '-': op2 = pop(); push(pop()-op2); break; case '/': op2 = pop(); if(op2 != 0.0) push(pop()/op2); else printf("error:zero divisor\n"); case '\n': break; default: printf("error: unknown command %s\n",s ); break; } } return 0; } #define MAXVAL 100 int sp = 0; double val[MAXVAL]; void push(double f) { if(sp < MAXVAL) val[sp++]=f; else printf("error:stack full, cant push %g\n",f ); } double pop(void) { if(sp>0) return val[--sp]; else { printf("error: stack empty\n"); return 0.0; } } #include<ctype.h> int getch(void); void ungetch(int); int getop(char s[]) { int i,c; while((s[0] = c = getch()) == ' ' || c =='\t') ; s[1] = '\0'; if(!isdigit(c) && c!='.') return c; i = 0; if(isdigit(c)) while(isdigit(s[++i] =c =getch())) ; if(c=='.') while(isdigit(s[++i] = c=getch())) ; s[i] = '\0'; if(c!=EOF) ungetch(c); return NUMBER; } #define BUFSIZE 100 char buf[BUFSIZE]; int bufp = 0; int getch(void) { return (bufp > 0) ? buf[--bufp] : getchar(); } void ungetch(int c) { if(bufp >= BUFSIZE) printf("ungetch: too many characters\n"); else buf[bufp++] = c; }
|
|
|
napco (Normal User)
Pro
Messaggi: 64
Iscritto: 16/04/2010
|
Ciao! Analizzare un programma è una cosa fondamentale da imparare. Da quello che mi sembra di vedere non sembra poi tutta questa difficoltà. Facciamo così: Se conosci l'inglese prova a leggerti la guida di Beej sul linguaggio C (la trovi su google), e prova da solo a capirlo. Se proprio vedi che non ce la fai entro venerdì fammi sapere e ti spiego tutto io.
|
|
fatshady (Normal User)
Newbie
Messaggi: 5
Iscritto: 02/06/2010
|
il fatto è a scuola noi programmiamo in c#, al prof di sistemi però, adesso alla fine dell anno gli è venuto in mente di farci vedere qualcosa in c anche se a scuola nn lo facciamo...come ho gia detto qualcosina ho capito di questo programma, e ho intenzioe di imparare qualcosa in C per vedere le cose piu a basso livello ma per conto mio quando ho tempo. In queste ultime 2 settimane di scuola sto tirando un po le somme e non ho proprio tempo per dedicarmici.Hai perfettamente ragione che dovrei capirlo da solo altrimenti risulta poco efficace farmelo spiegare cosi veloce ma non ho proprio tempo ora, comunque darò certamente un occchiata alla guida che mi hai consigliato, non consco benissimo l inglese ma ci provo.
Probabilmente riesco a collegarmi solo domani dopo mezzogiorno quindi se hai tempo e voglia di darmi una mano puoi scrivere anche domani mattina, pomeriggio o sera tanto vado sempre a letto tardi...
Grazie ancora !
|
|
Ultimo (Member)
Guru
Messaggi: 877
Iscritto: 22/05/2010
|
Il C equivale a sapere le basi del C# che è una sua evoluzione.
If ok Then GOTO Avanza else GOTO Inizia
|
|
fatshady (Normal User)
Newbie
Messaggi: 5
Iscritto: 02/06/2010
|
è un evoluzione ma come puoi vedere dal codice questo programma lavora molto a basso livello... per quanto ne so non penso sia realizzabile in c#...
|
|
fatshady (Normal User)
Newbie
Messaggi: 5
Iscritto: 02/06/2010
|
Ho finito adesso di scrivere la relazione... i concetti li ho messi come commenti nel codice qui sotto.. napco dimmi poi se ho capito bene
Codice sorgente - presumibilmente C |
#include<stdio.h> #include<stdlib.h> #define MAXOP 100 #define NUMBER '0' int getop(char []); void push(double); double pop(void); /* reverse polish calculator */ int main(void) { int type; double op2; char s[MAXOP]; while((type = getop(s)) != EOF) // finche type è diverso dal carattere di fine file { switch(type) { case NUMBER: //se è il carattere 0 ovvero se s contiene un numero push(atof(s)); //converto stringa in float e lo metto nello stack break; case '+': push(pop()+pop()); break; case '*': push(pop()*pop()); break; case '-': op2 = pop(); push(pop()-op2); break; case '/': op2 = pop(); if(op2 != 0.0) push(pop()/op2); else printf("error:zero divisor\n"); case '\n': // il caattere è invio stampa il risultato che è in cima alla pila. break; default: // se il carattere non è nessuno di questi stampa l erore printf("error: unknown command %s\n",s ); break; } } return 0; } #define MAXVAL 100 int sp = 0; double val[MAXVAL]; void push(double f) { if(sp < MAXVAL) val[sp++]=f; else printf("error:stack full, cant push %g\n",f ); } double pop(void) { if(sp>0) return val[--sp]; else { printf("error: stack empty\n"); return 0.0; } } #include<ctype.h> int getch(void); void ungetch(int); int getop(char s[]) { int i,c; while((s[0] = c = getch()) == ' ' || c =='\t') // prendo un carattere, finche è uno spazio o una tab non fare nulla ; s[1] = '\0'; // a questo punto s0 è un carattere e mettiamo \0 per dire che dinisce qui la stringa if(!isdigit(c) && c!='.') // isdifit ritorna 1 se il carattere è un numero. se NON è un nuemro è non è un punto ritorna C return c; i = 0; // if(isdigit(c)) // se c è u numero while(isdigit(s[++i] =c =getch())) // finche il carattere è u numero riempi l array s. ; if(c=='.') // se c è un punto continua a prendere numeri while(isdigit(s[++i] = c=getch())) ; s[i] = '\0'; // metto il carattere di fine stringa if(c!=EOF) // se c è diverso dal carattere di fine file ungetch(c); // metti c nel buffer return NUMBER; // ritorna il carattere 0. } #define BUFSIZE 100 char buf[BUFSIZE]; //il nostro buffer da 100 caratteri int bufp = 0; // numero elementi nel buffer int getch(void) { return (bufp > 0) ? buf[--bufp] : getchar(); //se nel buffer ce qualcosa lo prende altrimente prende nuovo carattere getchar è una fuznione contenuta nella libreria standard } void ungetch(int c) { if(bufp >= BUFSIZE) // SE NON CE SPAZIO NEL BUFFER scrivri stringa printf("ungetch: too many characters\n"); else{ // altrimenti aggiungi C al buffer buf[bufp++] = c; } }
|
|
|
napco (Normal User)
Pro
Messaggi: 64
Iscritto: 16/04/2010
|
Adesso come adesso non mi pare di vedere errori, comunque c'è da dire che ad una relazione strutturata in questo modo, se fossi un prof, non darei una valutazione troppo alta. Mi pare che tu ti sia limitato a parafrasare il codice, ma il senso del programma l'hai capito? Quello che hai scritto va bene, ma cerca di elaborare la tua parafrasi in un riassuntino discorsivo del programma. es:
Questo programma non è altro che una calcolatrice che accetta come input dei numeri e li immagazzina in uno stack. Nel momento in cui viene inserito un carattere corrispondente ad un operatore, il programma estrae gli ultimi 2 numeri dallo stack, ne valuta la somma/differenza/ecc... e ne reinserisce il risultato nello stack stesso, finchè non viene inserito il carattere '\n', che stampa a schermo il valore che si trova in cima alla pila (risultato).
|
|
fatshady (Normal User)
Newbie
Messaggi: 5
Iscritto: 02/06/2010
|
no questa non è la relazione ! praticamente questo l'ho scritto prima per avere uno schema di come funzionava il programma! poi ho fatto la relazione esattamente come dice te.. in modo discorsivo e ho aggiunto un diagramma di flusso(che spero dia ver fatto giusto) . lo postato per capire se avevo capito... per esempio dove spiego le varie funzioni ho scritto :
La funzione getop
Questa funzione prende come argomento un array di caratteri e restituisce un intero.
Attraverso il promo while vengono scartati tutti i caratteri di spazio e di tabulazione, successivamente quando verrà premuto un carattere che non sia fra questi viene inserito il carattere di fine stringa “\0”. Se il carattere inserito non sarò u numero la funzione ritornerà questo valore
Se il carattere inserito è u numero, Il secondo while verifica che l’utente voglia scrivere un numero con la virgola effettuando un controllo sul carattere scrittto, se risulta essere un “.” Il ciclo provvederà a contiuare a ricevere caratteri di tipo numero.
Quando il carattere non sarà piu un numero verrà messo il sibolo di fine stringa e prima di ritornare si verifica che questo valore non sia il carattere che identifica l EOF (End of file), se non è quel carattere il valore verrà caricato in un buffer che implementiamo attraverso al funzione ungetch, in modo da essere salvato.
La funzione main
Questa funzione è la principale, presente in ogni programma scritto in C.
Tramite il while iniziale e un costrutto switch-case confrontiamo i diversi casi che possiamo ottenere : se la fuznione getop richiamata nel while ritorna uno zero significa che il carattere inserito è un numero e verrà inserito nello stack; se il carattere è quello di invio verrà stampato il valore in cima alla pila; se il valore ritornato non è nessuono di quelli presenti nei case verrà stampato un messaggio d’ errore e se il carattere è un operatore tramite le pop verrà eseguito il calcolo riportando il risultato in cima allo stack attraverso la funzione push.
La funzione getch
Questa funzione non prende in ingresso nessun valore e restituisce un carattere letto da tastiera.
Questa funzione viene chiamata ogni volta che il programma necessita di un carattere, se il buffer contiene dei valori verranno estratti altrimenti verrà letto un carattere da tastiera.
La funzione ungetch
Questa funzione prende in ingresso un intero che verrà caricato nel buffer a meno che il buffer non sia pieno.
Le funzioni di push e pop
Tramite queste due funzioni implementiamo un stack nel nostro programma necessario per eseguire il calcoli.
Vi sembra giusta la spiegazione delle funzioni?
|
|