PDA

Visualizza la versione completa : [C] Passare da una funzione all'altra scrivendo una parola di riferimento


elius
15-01-2011, 18:16
Ciao a tutti!

sto programmando per svago un programmino che esegue alcune operazioni di calcolo numerico
es: sottrazione addizione, fra due numeri (a e b) e ne calcola il risultato (y).
per ora è tutto in fila e quindi si possono svolgere uno dietro l'altro e basta. alla fine del programma in oltre si spegne premendo un tasto
io vorrei fare le opzioni:
all inizio con un printf("") scrivo la domanda "scrivi quale operazione svolgere"
se uno scrive somma per esempio vorrei che andasse alla parte del programma che esegue la somma
ecc per le altre scritte
sottrazione ecc...

come cosa mi consigliate?





int a,b,y;

main ()

{
printf ( "\n\n\n\n" ) ;
printf ( " **********************\n" ) ;
printf ( " * CALCOLATRICE *\n" ) ;
printf ( " **********************\n" ) ;
printf ( "\n\n\n\n" ) ;

setrgb(0);
printf("Quale calcolo vuoi eseguire?\n\n");


printf("Somma di due numeri \n\n");
printf("Scrivi il primo numero:");
scanf("%d", &a);
printf("\nScrivi il secondo numero:");
scanf("%d", &b);
y=a+b;
printf("\nLa somma di %d + %d vale: %d\n", a,b,y);
system("Pause");

setrgb(3);
differenza:
printf("Differenza di due numeri \n\n");
printf("Scrivi il primo numero:");
scanf("%d", &a);
printf("\nScrivi il secondo numero:");
scanf("%d", &b);
y=a-b;
printf("\nLa differenza di %d - %d vale: %d\n", a,b,y);
system("Pause");
setrgb(4);
prodotto:
printf("Prodotto di due numeri \n\n");
printf("Scrivi il primo numero:");
scanf("%d", &a);
printf("\nScrivi il secondo numero:");
scanf("%d", &b);
y=a*b;
printf("\nIl prodotto di %d e %d vale: %d\n", a,b,y);
system("Pause");
setrgb(1);
divisione:
printf("Rapporto di due numeri \n\n");
printf("Scrivi il primo numero:");
scanf("%d", &a);
printf("\nScrivi il secondo numero:");
scanf("%d", &b);
y=a/b;
printf("\nIl rapporto fra %d e %d vale: %d\n", a,b,y);
system("Pause");
setrgb(4);

}



Grazie :)

PS sono alle prime armi e sto studiando C a scuola ma mi voglio mettere avanti per piacere personale

deleted_29
15-01-2011, 18:30
accidenti, finalmente ho capito cosa si intendeva quando veniva consigliato di fare una "calcolatrice"

a me sembrava difficile, moolto difficile, al limite dell'impossibile per in principiante, tra me pensavo "sticavoli, i giovani d'oggi son proprio in gamba!"
---
per "calcolatrice" si intende normalmente un interprete, con tanto di memorie e funzioni trigonometriche, dove uno mette 3*2+5*3^4*sin(.2) e per complicarsi la vita pure le parentesi
---
OK tornando a te hai vari modi, almeno 3 mi vengono in mente

1) fare un riconoscitore nei termini sopra indicati (lo escluderei)
2) fai scegliere all'utente e ci metti un bel case (grezzo)
3) "fai il fico" (per questa tipologia di problemi) e scansioni la stringa cercando l'operatore.
se trovi "+" farai una somma, "-" una differenza e così via.
Spezzando in due la stringa prima e dopo l'operatore.

purtroppo non sono pratico degli esercizi di questo tipo, nel senso che rischio di darti consigli "troppo difficili" e neppure richiesti :old:

linoma
15-01-2011, 18:50
prova se funziona questo



int oper;
char somma[]={"sommaaddizione"};

oper = 0;
if(strstr(somma,user_s) != NULL)
oper = 1;

deleted_29
15-01-2011, 19:13
ahem... io ti consiglio... (metto lo pseudocodice, sennò non impari nulla)

diciamo s stringa (adesso non ci interessa l'overflow)
diciamo termine1 numero floating point (o intero)
diciamo termine2 numero floating point (o intero)

diciamo primaparte stringa
diciamo secondaparte stringa

diciamo posizioneOperatore intero

leggi-da-tastiera-s

posizioneOperatore=cerca la prima occorrenza di "+" dentro s

svuota primaparte
svuota secondaparte

cicla i da 0 a posizioneOperatore-1
primaparte=primaparte+ s[i]

cicla i da posizioneOperatore+1 a lunghezza(s)
secondaparte=secondaparte+s[i]

termine1=stringa-a-float(primaparte)
termine2=stringa-a-float(secondaparte)

a seconda di stringa[posizioneOperatore]
='+' ->fai somma
='-' -> fai differenza
...


vabbè spero si capisca

PS è un esercizio in modalità "impara", non è il caso di mettere strategie "strane" :ciauz:

Laikius91
15-01-2011, 19:35
Mmm la cosa più intelligente secondo me sarebbe fare una procedura options in cui come prima cosa stampi un menù in cui ad ogni numero viene associata un'operazione e all'ultimo numero viene associato il classico "termina programma".
A questo punto chiedi all'utente di inserire il numero dell'opzione che gli interessa (assegnandolo ad esempio ad un intero opz), poi usi, in pseudocodice, qualcosa del tipo:

switch (opz)
{
case (1): fai la somma;
case (2): fai la sottrazione;
ecc eccc.
case (n): return; (nel main hai poi return 0);
default: l'utente ha inserito un numero sbagliato, chiedere di inserire un'altro numero
e ripetere options;
}

se non è già uscito con il return del case (n), puoi ripetere options in modo che l'utente possa fare tutte le operazioni che voglia prima di scegliere di terminare il programma!

Spero di essere stato abbastanza chiaro :)

ramy89
15-01-2011, 20:38
Nono,si usano i puntatori a funzione a seconda dell' operazione che devi fare.
Una volta create le funzioni per fare le 4 operazioni di base si utilizza il puntatore a funzione:


int (*pointer) ();

Questo è un puntatore a funzione,la funzione deve ritornare un intero.
Poi lo fai puntare alla funzione che ti interessa,ad esempio la funzione sum:


pointer=sum;

Dove arg1 e arg2 li hai presi in input.
Poi si tratta di fare una sostituzione per ottenere il risultato:


risultato=pointer(arg1,arg2);

In questo modo puoi fare un numero illimitato di sostituzioni,puoi prendere in input n argomenti e semmai riportare gli errori di sintassi che fa l' utente come fa ad esempio l' interprete python.
Il simbolo "=" termina la sequenza e produce l' effetto di uscire dal ciclo e stampare il risultato.
Usando i puntatori puoi ottenere n risultati temporanei e poi sommarli tra loro,puoi anche implementare le parentesi tonde,quadre e graffe facilmente.
Una volta che uno sa questo è pronto per passare a un linguaggio ad oggetti,in fondo l' interprete python fa queste cose automaticamente,uno così ha dimostrato a se stesso di saper usare tutto nel C.
Io la calcolatrice l' avevo già fatta ma senza puntatori a funzione,una volta che uno sa usare il puntatore del puntatore del puntatore sa usare tutto http://forum.ubuntu-it.org/Smileys/ubuntu-it/grin.gif
Ed è pronto a passare a un linguaggio superiore.
YuYevon mi ha fatto capire che usare il C per programmare un 'interfaccia è una scelta obsoleta,alla fine il C è solo il punto d' avvio.
Vorrei passare a linguaggi come C# ma purtroppo devo seguire il programma standard dell' università,la prossima cosa che studio sarà l' assembly,comunque avrò tempo per studiare queste cose.
Consiglio a chi ha fatto la calcolatrice e sa usare bene i puntatori di passare al c++.

ramy89
15-01-2011, 20:52
Guardate,si possono pure fare cavolate del genere:


int (*pointer) ();
int risultato;
pointer=main;
risultato=pointer(argc,argv);

Ovviamente da segmentation fault http://forum.ubuntu-it.org/Smileys/ubuntu-it/grin.gif

Loading