[C][Python]Calcolatrici

Pubblicità

ciaox

Utente Attivo
Messaggi
10
Reazioni
0
Punteggio
25
Salve a tutti ho costruito una utility in batch e voglio dargli nuove features.
Dato che sto imparando il C e il Python,Ho deciso di fare una calcolatrice in entrambi i linguaggi per vedere quale funzionava.Nessuna delle 2 sembra funzionare :ok:
Bloodshed devcpp non riesce a compilare il file c,e da moltissimi errori;Invece la calc python va bene,solo che quando eseguo l'ultimo comando(la divisione) l'app termina immediatamente.

P.S Nel SC vedrete NT-DOS,E la mia app batch.

http://download26.mediafire.com/l7ak0ng5bnlg/rfj6p63p630233r/NT-DOS+0.4b+Setup.exe
Il source code della calc c e' :
Codice:
#include <stdio.h>
 
int main()          
{
         int number1;
         int number2;
         int sum;
         int numsub1;
         int numsub2;
         int sumsub;
         int nummult1;
         int nummult2;
         int summult;
         int numsplit1;
         int numsplit2;
         int sumsplit;
         int operatorchoose;
         int operatorhelper;
         operatorhelper = 1,2,3,4;
         
         printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
         printf(">             NT-DOS Calc             >\n");
         printf(">      Please select an operator:     >\n");
         printf(">1.Addition                           >\n");
         printf(">2.Subtraction                        >\n");
         printf(">3.Multiplication                     >\n");
         printf(">4.Division                           >\n");
         printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
         scanf("%d",&operatorchoose);
         
         
         if (operatorchoose != operatorhelper)
         system("EXIT");
         
         
         if (operatorchoose == 1)
  
 
         printf("Please insert a number(Int): ");
         scanf("%d", &number1);
 
         printf("Please insert another number(Int): ");
         scanf("%d", &number2);
 
         sum = number1 + number2;
 
         printf("The sum of the two inserted number is: %d\n", sum);
         system("PAUSE")
         
         
         if(operatorchoose == 2)
        
         printf("Please insert a number(Int): ");
         scanf("%d", &numsub1);
 
         printf("Please insert another number(Int): ");
         scanf("%d", &numsub2);
 
         sumsub = numsub1 - numsub2;
 
         printf("The difference of the two inserted number is: %d\n", sumsub);
         system("PAUSE");
         
         
         if (operatorchoose == 3)
         
         printf("Please insert a number(Int): ");
         scanf("%d", &nummult1);
 
         printf("Please insert another number(Int): ");
         scanf("%d", &nummult2);
 
         sumsub = nummult1 * nummult2;
 
         printf("The factor of the two inserted number is: %d\n", sumsub);
         system("PAUSE");
         
         
         if (operatorchoose == 4)
         
         printf("Please insert a number(Int): ");
         scanf("%d", &numsplit1);
 
         printf("Please insert another number(Int): ");
         scanf("%d", &numsplit2);
 
         sumsplit = numsplit1 / numsplit2;
 
         printf("The quotient of the two inserted number is: %d\n", sumsplit);
         system("PAUSE");
         return 0;
         }
Il source code della pycalc e':
Codice:
# this program is open source.
print "     NT-DOS Calc    "
print "     Version 0.1    "

print "                                 (C) ciaox 2010."


num1=input("First Number(Addition)?")
num2=input("Second Number(Addition)?")
num3=input("Third Number(Addition)?")
print"Total sum of inserted numbers is:",num1+num2+num3


num1=input("First Number(Subtraction)?")
num2=input("Second Number(Subtraction)?")
print"Total difference of inserted numbers is:",num1-num2


num1=input("First Number(Multiplication)?")
num2=input("Second Number(Multiplication)?")
print"Total product of inserted numbers is:",num1*num2



num1=input("First Number(Division)?")
num2=input("Second Number(Division)?")
print"Total quotient of inserted numbers is:",num1/num2
Gli errori di devcpp sono:
Codice:
C:\Documents and Settings\ciaox\My Documents\ntdoscalc.c: In function `main':
C:\Documents and Settings\ciaox\My Documents\ntdoscalc.c:9: error: syntax error before "int"

C:\Documents and Settings\ciaox\My Documents\ntdoscalc.c:29: error: `operatorchoose' undeclared (first use in this function)
C:\Documents and Settings\ciaox\My Documents\ntdoscalc.c:29: error: (Each undeclared identifier is reported only once
C:\Documents and Settings\ciaox\My Documents\ntdoscalc.c:29: error: for each function it appears in.)
C:\Documents and Settings\ciaox\My Documents\ntdoscalc.c:32: error: `operatorhelper' undeclared (first use in this function)

C:\Documents and Settings\ciaox\My Documents\ntdoscalc.c:51: error: syntax error before "if"
C:\Documents and Settings\ciaox\My Documents\ntdoscalc.c:54: error: `numsub1' undeclared (first use in this function)
C:\Documents and Settings\ciaox\My Documents\ntdoscalc.c:57: error: `numsub2' undeclared (first use in this function)
C:\Documents and Settings\ciaox\My Documents\ntdoscalc.c:59: error: `sumsub' undeclared (first use in this function)
C:\Documents and Settings\ciaox\My Documents\ntdoscalc.c:68: error: `nummult1' undeclared (first use in this function)
C:\Documents and Settings\ciaox\My Documents\ntdoscalc.c:71: error: `nummult2' undeclared (first use in this function)
C:\Documents and Settings\ciaox\My Documents\ntdoscalc.c:82: error: `numsplit1' undeclared (first use in this function)
C:\Documents and Settings\ciaox\My Documents\ntdoscalc.c:85: error: `numsplit2' undeclared (first use in this function)
C:\Documents and Settings\ciaox\My Documents\ntdoscalc.c:87: error: `sumsplit' undeclared (first use in this function)
Questi errori mi sembrano "inesistenti",tutte le variabili sono dichiarate!

Grazie in anticipo :P
 
Ultima modifica:
Il tuo problema sembra sia dato dalla dichiarazione come int dei risultati. Prova a cambiarli in float in quanto ad esempio il risultato di "3 diviso 2" non è un numero intero. Come non è intero se fai "2.5 più 3.2"...

Gli "operatorchoose" ed "operatorhelper" magari devi cambiarli in "string" od "array" (se array devi cambiare anche il modo di fare il "if")

EDIT: per la divisione devi prevedere un controllo contro la "div by zero" ovvero se per sbaglio fai "2 diviso 0". Metti un if (num2> 0) { print "risultato è: " num1/num2; } else { print "Errore: il secondo argomento dev'essere diverso da 0"; }
 
Ok ora non da piu' errori sulle variabili ma ne da altri:
Codice:
dude.c: In function ‘main’:
dude.c:29: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘float *’
dude.c:40: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘float *’
dude.c:43: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘float *’
dude.c:47: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘double’
dude.c:51: error: expected ‘;’ before ‘if’
dude.c:54: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘float *’
dude.c:57: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘float *’
dude.c:61: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘double’
dude.c:68: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘float *’
dude.c:71: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘float *’
dude.c:75: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘double’
dude.c:82: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘float *’
dude.c:85: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘float *’
dude.c:89: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘double’
Il SC E migliorato,ma continuo a non capire gli errori:Ho trasformato il %d in %f(float) ma niente
Nuovo SC:

Codice:
#include <stdio.h>
 
int main()          
{
         float number1;
         float number2;
         float sum;
         float numsub1;
         float numsub2;
         float sumsub;
         float nummult1;
         float nummult2;
         float summult;
         float numsplit1;
         float numsplit2;
         float sumsplit;
         float operatorchoose;
       
         
         printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
         printf(">             NT-DOS Calc             >\n");
         printf(">      Please select an operator:     >\n");
         printf(">1.Addition                           >\n");
         printf(">2.Subtraction                        >\n");
         printf(">3.Multiplication                     >\n");
         printf(">4.Division                           >\n");
         printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
         scanf("%f",&operatorchoose);
         
         
       
         
         if (operatorchoose == 1)
  
 
         printf("Please insert a number: ");
         scanf("%f", &number1);
 
         printf("Please insert another number: ");
         scanf("%f", &number2);
 
         sum = number1 + number2;
 
         printf("The sum of the two inserted number is: %f\n", sum);
         system("PAUSE")
         
         
         if (operatorchoose == 2)
        
         printf("Please insert a number: ");
         scanf("%f", &numsub1);
 
         printf("Please insert another number: ");
         scanf("%f", &numsub2);
 
         sumsub = numsub1 - numsub2;
 
         printf("The difference of the two inserted number is: %f\n", sumsub);
         system("PAUSE");
         
         
         if (operatorchoose == 3)
         
         printf("Please insert a number: ");
         scanf("%f", &nummult1);
 
         printf("Please insert another number: ");
         scanf("%f", &nummult2);
 
         sumsub = nummult1 * nummult2;
 
         printf("The factor of the two inserted number is: %f\n", sumsub);
         system("PAUSE");
         
         
         if (operatorchoose == 4)
         
         printf("Please insert a number: ");
         scanf("%f", &numsplit1);
 
         printf("Please insert another number: ");
         scanf("%f", &numsplit2);
 
         sumsplit = numsplit1 / numsplit2;
 
         printf("The quotient of the two inserted number is: %f\n", sumsplit);
         system("PAUSE");
         

         if (numsplit2 <= 0)
         

         printf("Please Insert a valid divider! \n");

         system("PAUSE");


         else
     

         printf("Please insert a valid command!")
         system("PAUSE")
         return 0;
         }
Non sono un grande esperto di c :D

SC + Errori Editati
 
Ultima modifica:
Ti aiuto per quanto riguarda C: nel codice postato ci sono alcuni errori dovuti all'inesperienza, ma possiamo rimediare; oltre agli elementi puramente sintattici come dimenticanze di ";" o simili, ci sono un po' di cambiamenti da apportare :)

Innanzitutto, bisogna sistemare i blocchi delle istruzioni condizionali: ti ricordo che la sintassi prevede che, se vuoi eseguire un blocco di istruzioni nel caso la condizione sia rispettata o meno, occorre utilizzare le parentesi graffe per racchiudere tali blocchi! In caso contrario C prevede che solo la prima istruzione faccia parte del blocco di istruzioni da eseguire! Un esempio per renderti la cosa più chiara:

Codice:
         if (operatorchoose == 1)
  
 
         printf("Please insert a number: ");
         scanf("%f", &number1);
 
         printf("Please insert another number: ");
         scanf("%f", &number2);
 
         sum = number1 + number2;
 
         printf("The sum of the two inserted number is: %f\n", sum);
         system("PAUSE");

La tua idea era di eseguire tutte queste istruzioni nel caso operatorchoose fosse uguale a 1, giusto? Allora devi racchiudere tali istruzioni tra parentesi graffe, in questo modo:

Codice:
         if (operatorchoose == 1) {
  
 
         printf("Please insert a number: ");
         scanf("%f", &number1);
 
         printf("Please insert another number: ");
         scanf("%f", &number2);
 
         sum = number1 + number2;
 
         printf("The sum of the two inserted number is: %f\n", sum);
         system("PAUSE");
         }

Nel codice che hai postato te, se operatorchoose è pari a 1 viene eseguita la prima istruzione, mentre l'esecuzione delle altre avviene in ogni caso, non essendo presenti le parentesi!

Secondo consiglio: vedo che usi molte più variabili di quanto necessario! Infatti, perché non usare due sole variabili per i numeri letti da tastiera e una per il risultato? ;)

Sempre riguardo la lettura da tastiera dei due numeri in input, è un'operazione da eseguire in ogni caso, giusto? Allora non occorre inserirle nei corpi degli if!

Inoltre ti consiglio di usare gli if - else in cascata, invece che controllare se operatorchoose è uguale a 1, poi se è 2, etc; in questo modo, se è uguale a 1, eviti i controlli successivi! L'ideale, comunque, sarebbe usare il costrutto switch, ma probabilmente lo vedrai più avanti!

Inoltre, a cosa serve la funzione system? :)

Ora ti posto un esempio di codice "sistemato": prova a vedere le correzioni, e nel caso non le capissi, chiedi pure ;)

Codice:
#include <stdio.h>
 
int main() {
	
         float number1;
         float number2;
		 float result;
         int operatorchoose;
       
         printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
         printf(">             NT-DOS Calc             >\n");
         printf(">      Please select an operator:     >\n");
         printf(">1.Addition                           >\n");
         printf(">2.Subtraction                        >\n");
         printf(">3.Multiplication                     >\n");
         printf(">4.Division                           >\n");
         printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
         scanf("%d",&operatorchoose);
         
         if(operatorchoose > 4 || operatorchoose < 1)
              printf("Please insert a valid command!");
         else {
              printf("Please insert a number: ");
              scanf("%f", &number1); 
              printf("Please insert another number: ");
              scanf("%f", &number2);
       
              if (operatorchoose == 1) {
                   result = number1 + number2;
                   printf("The sum of the two inserted number is: %f\n", result);        
              } else if (operatorchoose == 2) {
                   result = number1 - number2;
                   printf("The difference of the two inserted number is: %f\n", result);
              } else if (operatorchoose == 3) {
                   result = number1 * number2; 
                   printf("The factor of the two inserted number is: %f\n", result);
              } else
      	 	   if (number2 <= 0)
                        printf("Please Insert a valid divider! \n");
                   else {
                        result = number1 / number2;
                        printf("The quotient of the two inserted number is: %f\n", result);
                   }
         }
         
         return 0;
}
 
Ma sei un grande! Tutto funziona!
solo che al posto di float metterei long int(Che se non sbaglio include la virgola) perche' 3-2 esce 1.000000

Comunque sono alla lezione 5 di una guida c,che non ho ben capito;Se hai MSN mandami un mp con il tuo indirizzo,grazie!

P.S:Quando pubblico la calc ti cito come betatester-produttore esecutivo,se vuoi : D
 
Non uso MSN, ma se hai dubbi posta qua, passo abbastanza spesso (e ci sono anche molti altri utenti esperti ;) )

Il tipo long int è usato per rappresentare interi, dunque in quanto tale non considera la parte frazionaria dei numeri: considerato che la calcolatrice implementa anche la divisione, penso sia meglio usare i numeri con virgola (al massimo usare i double, che sono "float più grandi").
Comunque è giusto che 3-2 restituisca come risultato 1.000000 (la virgola, in notazione anglosassone, è rappresentata dal punto); nel caso volessi meno cifre decimali (ad es. 2), al posto di "%f" nella printf metti "%.2f" :)
 
Esatto, gli argomenti trattati dalla lezione sono sostanzialmente come definire funzioni proprie, come richiamarle nel codice, etc etc. Cosa non ti è chiaro?
 
Tutto :)
Sapresti dirmi una sintesi dell'argomento che riguardi roba semplice(addizioni sottrazioni ecc...)
Un' altra cosa:dopo una if devo mettere una parentesi graffa,e quanti else if e if ci possono essere in un programma?
 
Ok, proviamo a fare una sintesi.

Puoi vedere una funzione in questo modo: una scatola nella quale introduci degli input, che saranno elaborati dalle istruzioni che costituiscono il codice della funzione, e che produce al più un output.
È importante evidenziare che, come in matematica, la funzione restituisce un solo valore (certe funzioni non restituiscono nulla e vengono solitamente chiamate procedure), mentre il numero di parametri in input non ha, teoricamente, limitazioni.

Proviamo ora a definire una funzione "potenza" definita sugli interi; per fare ciò dobbiamo decidere un po' di cose:
  • Che parametri dare in input alla nostra funzione? Ossia, quali dati ci servono per poter calcolare quello che deve produrre la funzione / procedura? Nel nostro caso abbiamo bisogno di due valori di tipo int / long: la base della potenza e il suo esponente.
  • Qual è il tipo del valore restituito dalla funzione? La nostra funzione deve restituire un numero intero potenzialmente grande, dunque specificheremo come tipo di ritorno long.
  • Ora possiamo scrivere il codice che produrrà l'effetto desiderato!

Ecco il sorgente contenente il codice:
Codice:
#include <stdlib.h>
#include <stdio.h>

/* Prototipo della funzione: occorre indicare il nome della funzione, il tipo del valore di ritorno e il tipo dei parametri */

long potenza(long, long);

/* Funzione main, dove sarà richiamata la nostra "potenza" */

int main() {
  long b, exp, risultato;
  printf("Inserisci la base: ");
  scanf("%d", &b);
  printf("Inserisci l'esponente: ");
  scanf("%d", &exp);
  risultato = potenza(b, exp);  // +++
  printf("La potenza vale %d", risultato);
  return 0;
}

/* Implementazione della funzione: dobbiamo scrivere il codice! */

long potenza(long base, long esponente) {
  /* i e power sono variabili locali della funzione potenza: "nascono" quando
      questa viene richiamata e "muoiono" quando usciamo dalla funzione;
      inoltre sono accedibili solo all'interno della funzione in cui sono dichiarate!
      Se provassi a scrivere i = 3; nel main otterresti un errore da parte del
      compilatore!
  */
  long i, power;
  /* Per semplicità escludiamo i numeri negativi... magari dopo puoi
      modificarla per fare in modo che funzioni anche con questi input :) 
  */
  if(base <= 0 || esponente < 0)
    return 0;
  /* Codice per il calcolo della potenza */
  power = 1;
  for(i = 0; i < esponente; i++)
    power *= base;
  /* L'istruzione return, incontrata alcune righe fa, serve per restituire il
      controllo alla funzione chiamante (nel nostro caso main) e come
      parametro occorre inserire il valore che vogliamo far restituire alla
      funzione (nel nostro caso la potenza appena calcolata, dunque il valore
      di power!
  */
  return power;

Nella riga contraddistinta dal commento +++ c'è un esempio di chiamata di funzione: il valore di "b", al momento della chiamata, viene ricopiato nella variabile "base" definita come primo parametro della funzione "potenza", mentre in "esponente" viene copiato il valore della variabile "exp": il ritorno della funzione sarà assegnato alla variabile "risultato"!
È importante ricordare che in C le chiamate di funzione sono fatte per valore: se tu, all'interno del corpo della funzione potenza, modificassi uno dei parametri, questa modifica non si ripercuote sulla variabile con cui hai chiamato la funzione! Ossia, se nel corpo della funzione "potenza" eseguissi un'istruzione del tipo "base = 3", al termine dell'esecuzione della funzione, b continua a mantenere il suo valore originario, non gli viene assegnato 3!

Qual è il vantaggio dell'utilizzo delle funzioni? Il riuso del codice e la maggiore manutenibilità! Cosa significa? Guarda il main: ci sono tre chiamate alla funzione printf. Se non esistessero le funzioni, dovresti copiare il codice che compone la funzione predefinita printf in tutti i punti in cui è necessaria una stampa (e la printf non è per niente una funzione facile da realizzare)! Riguardo la manutenibilità, se dovessi aver commesso un errore nello scrivere il codice della funzione, basta modificare la funzione e sei a posto; se copiassi il codice che implementa la funzione in ogni punto in cui ti serve svolgere ciò che la tua funzione fa, dovresti andare in tutti quei punti a modificare l'errore!

Spero di esserti stato un po' d'aiuto... nel caso avessi altre domande, chiedi pure! Ce ne sarebbe da parlare delle funzioni! :)
 
imho chi ve lo fa' fare ad utilizzare il C se esiste il C++ ? :look:
il C++ semplifica le operazioni di I/O e non ha bisogno delle formattazioni..
printf("Hello Kitty = %d",yyy); diventa cout<<"Hello Kitty"<<yyy;
scanf(.....) diventa cin>>abc;
con DevC++ il file bisogna chiamarlo nome.cpp, se lo si chiama solo nome.c
potrebbe dare errori. :sisi:
 
Mah, usare il C++ solo per un paio di semplificazioni mi sembra un po' riduttivo, sinceramente... lasciamo intanto che faccia pratica con il C, poi quando vorrà passare a un paradigma di programmazione object oriented, allora passerà giustamente a C++ sfruttando le potenzialità per cui è stato creato ;)
 
imho con il c++ gia' non dover impazzire con le formattazioni %d %.2f ecc. ecc.
e' un grande vantaggio. e poi la comodita' di evitare il malloc con gli operatori di cast e sizeof, e' gia molto. :look:
 
Pubblicità
Pubblicità
Indietro
Top