Shell32 Inviato 1 Ottobre 2014 Condividi Inviato 1 Ottobre 2014 (modificato) Da poco mi sono messo ad approfondire un po' di più il C++, e mi sono inventato questo programmino per vedere come si dichiarano le funzioni, solo che mi sono imbattuto in dei problemi inaspettati. Praticamente il programma dovrebbe calcolare le funzioni trigonometriche (cos, sin, tan) di un certo angolo in gradi, in base alla immissione di un carattere per selezionare la funzione scelta: #include <cstdlib> #include <cstdio> #include <iostream> #include <cmath> #define M_PI 3.14159265358979323846 // definizione prototipi double cos_deg(double alfa); double sin_deg(double alfa); double tan_deg(double alfa); int main() { double ang, res; char c; printf("Scegli funzione:\nC. coseno S. seno T. tangente\n"); scanf_s("%c", &c); if (c == 'c' || 'C') { printf("Inserisci il valore dell'angolo in gradi:\n"); scanf_s("%f", &ang); res = cos_deg(ang); printf("Il coseno e' %f\n", res); } else if (c == 's' || 'S') { printf("Inserisci il valore dell'angolo in gradi:\n"); scanf_s("%f", &ang); res = sin_deg(ang); printf("Il seno e' %f\n", res); } else if (c == 't' || 'T') { printf("Inserisci il valore dell'angolo in gradi:\n"); scanf_s("%f", &ang); res = tan_deg(ang); printf("La tangente e' %f\n", res); } else { printf("Non valido\n"); } system("PAUSE"); return EXIT_SUCCESS; } //dichiarazione delle funzioni double cos_deg(double alfa) { double beta, gamma; beta = (M_PI / 180)*alfa; gamma = cos(beta); return gamma; } double sin_deg(double alfa) { double beta, gamma; beta = (M_PI / 180)*alfa; gamma = sin(beta); return gamma; } double tan_deg(double alfa) { double beta, gamma; beta = (M_PI / 180)*alfa; gamma = tan(beta); return gamma; } Il primo problema è che qualunque carattere io immetta (anche sbagliato), il programma chiama sempre la funzione del coseno, mentre se uso dei numeri con una variabile int il blocco if-else si comporta come dovrebbe, quindi sto sbagliando qualcosa nell' input? Il secondo problema riguarda invece i risultati ritornati dalle funzioni. Le funzioni cos, sin e tan incluse nella libreria math.h vogliono l'angolo in radianti, quindi io qui le converto prima in radianti e poi calcolo il risultato, ma mi escono valori impossibili (tipo cos 60 = -0.23 e qualcosa invece di 0.5). Cosa ho sbagliato anche qui? Modificato 1 Ottobre 2014 da Shell32 Link al commento Condividi su altri siti Altre opzioni di condivisione...
paccarapa Inviato 1 Ottobre 2014 Condividi Inviato 1 Ottobre 2014 Sono 20 anni che non metto mai ad un sorgente C++.Comunque: 1)visto che ad ogni condizione richiedi il valore dell'angolo immetti le istruzioni all'inizio prima della domanda relativa a seno coseno e tangente.In questo modo allegerisco il processo e la dimensione dell'eseguibile 2)le condizioni relative non metterle dopo else.Secondo la tua logica sarebbe: if(condizione) {istruzioni }else { if(condizione){ istruzioni}. Imposta invece come semplici if consecutivi senza la condizione else.Cioè: if(condizione){istruzioni} if(condizione2){istruzioni} if(condizione3){istruzioni} Link al commento Condividi su altri siti Altre opzioni di condivisione...
paccarapa Inviato 1 Ottobre 2014 Condividi Inviato 1 Ottobre 2014 Relativo invece al secondo punto il problema sia il tipo di dato usato.Informati meglio che credo che le variabili,in questo caso,siano di tipo "long".Non metto la mano sul fuoco visto il tanto tempo trascorso. Link al commento Condividi su altri siti Altre opzioni di condivisione...
Shell32 Inviato 2 Ottobre 2014 Autore Condividi Inviato 2 Ottobre 2014 Ho provato come mi hai detto ma ottengo praticamente lo stesso risultato anche se leggermente diverso, cioé mi verivica tutte e 3 le condizioni e me li calcola tutti e 3 (ovviamente sbagliati) e dice anche carattere non valido... Riguardo al tipo delle funzioni, sono definite come: double _cdecl cos(double _X) poi ci sono tre overload, uno float, uno strano tipo std::enable_if<std::is_integral qualcosa, e uno long double. Io ho messo tutte le variabili double quindi in teoria dovrebbe andare... Link al commento Condividi su altri siti Altre opzioni di condivisione...
Shell32 Inviato 2 Ottobre 2014 Autore Condividi Inviato 2 Ottobre 2014 Ora è così: #include <cstdlib> #include <cstdio> #include <iostream> #include <cmath> #define M_PI 3.14159265358979323846 // definizione prototipi double cos_deg(double alfa); double sin_deg(double alfa); double tan_deg(double alfa); int main() { //dichiarazione varaibili double ang, res; char c; printf("Inserisci il valore dell'angolo in gradi:\n"); scanf_s("%f", &ang); printf("Scegli funzione:\nC. coseno S. seno T. tangente\n"); scanf_s("%c", &c); if (c == 67 || 99) { res = cos_deg(ang); printf("Il coseno e' %f\n", res); } if (c == 83 || 117) { res = sin_deg(ang); printf("Il seno e' %f\n", res); } if (c == 84 || 118) { res = tan_deg(ang); printf("La tangente e' %f\n", res); } else printf("Carattere non valido\n"); system("PAUSE"); return EXIT_SUCCESS; } //dichiarazione delle funzioni double cos_deg(double alfa) { double beta, gamma; beta = (M_PI / 180)*alfa; gamma = cos(beta); return gamma; } double sin_deg(double alfa) { double beta, gamma; beta = (M_PI / 180)*alfa; gamma = sin(beta); return gamma; } double tan_deg(double alfa) { double beta, gamma; beta = (M_PI / 180)*alfa; gamma = tan(beta); return gamma; } Ho sostituito i caratteri con il loro corrispondente ascii per vedere se andava, ma non è cambiato niente Link al commento Condividi su altri siti Altre opzioni di condivisione...
RyujiAndy Inviato 2 Ottobre 2014 Condividi Inviato 2 Ottobre 2014 Nel confronto if dopo l'or dichiari una stringa senza un confronto quindi una condizione sempre vera e viene eseguita l'istruzione. Preferisco la prima stesura manche SE il tutto assomiglia piú al C che C++ Link al commento Condividi su altri siti Altre opzioni di condivisione...
Shell32 Inviato 3 Ottobre 2014 Autore Condividi Inviato 3 Ottobre 2014 Grazie della dritta, ho provato riscrivendo le condizioni come if ((c == 'carattere') || (c == 'carattere')), ma adesso ottengo l'effetto contrario e le 3 condizioni non sono mai verificate. In realtà credo il problema sia il fatto che non dà il tempo di immettere il carattere, come premo invio dopo aver inserito l'angolo scrive scegli funzione e poi subito carattere non valido... Link al commento Condividi su altri siti Altre opzioni di condivisione...
RyujiAndy Inviato 3 Ottobre 2014 Condividi Inviato 3 Ottobre 2014 Metti l'immissione del caraterre in un ciclo while e lo fai uscire non appena la variabine non é piú nulla Link al commento Condividi su altri siti Altre opzioni di condivisione...
Shell32 Inviato 3 Ottobre 2014 Autore Condividi Inviato 3 Ottobre 2014 (modificato) Ho provato ma per qualche oscuro motivo se uso getchar() mi esce dal ciclo e dice carattere non valido, se invece uso scanf mi resta nel ciclo ma poi non esce quando premo invio dopo aver inserito il carattere... ho provato anche a inserire una condizione if (c != 0) break; ma non esce neanche così... EDIT: Dopo un po' di tentativi ce l'ho fatta usando cin! ora riguardo all'altro problema... pensi dipenda dal tipo della variabile? Modificato 3 Ottobre 2014 da Shell32 Link al commento Condividi su altri siti Altre opzioni di condivisione...
RyujiAndy Inviato 3 Ottobre 2014 Condividi Inviato 3 Ottobre 2014 Quale altro problema? Link al commento Condividi su altri siti Altre opzioni di condivisione...
Shell32 Inviato 3 Ottobre 2014 Autore Condividi Inviato 3 Ottobre 2014 Il fatto che i risultati ritornati dalle funzioni coseno, seno e tangente sono sballati Link al commento Condividi su altri siti Altre opzioni di condivisione...
RyujiAndy Inviato 4 Ottobre 2014 Condividi Inviato 4 Ottobre 2014 Dichiari le variabili come double ma le stampi come float? Link al commento Condividi su altri siti Altre opzioni di condivisione...
Shell32 Inviato 5 Ottobre 2014 Autore Condividi Inviato 5 Ottobre 2014 Ma io sapevo che lo specifcatore %f andava bene per tutti i valori in virgola mobile... Ho provato anche con cout ma il risulatato è lo stesso Link al commento Condividi su altri siti Altre opzioni di condivisione...
strowrook Inviato 27 Febbraio 2015 Condividi Inviato 27 Febbraio 2015 No, il problema non dovrebbero essere i double (anche se io consiglierei di scrivere %fl invece di %f quando usi la funzione printf(), è un long double ed è più preciso). Il problema sta nella funzione che utilizzi per convertire i radianti in gradi. La proporzione che vi è tra gradi e radianti è e quindi dovresti usare questa relazione: Perciò il tuo codice sarà: #include <cstdlib> #include <cstdio> #include <iostream> #include <cmath> #define M_PI 3.14159265358979323846 // definizione prototipi double cos_deg(double alfa); double sin_deg(double alfa); double tan_deg(double alfa); int main() { //dichiarazione varaibili double ang, res; char c; printf("Inserisci il valore dell'angolo in gradi:\n"); scanf_s("%f", &ang); printf("Scegli funzione:\nC. coseno S. seno T. tangente\n"); scanf_s("%c", &c); if (c == 67 || 99) { res = cos_deg(ang); printf("Il coseno e' %f\n", res); } if (c == 83 || 117) { res = sin_deg(ang); printf("Il seno e' %f\n", res); } if (c == 84 || 118) { res = tan_deg(ang); printf("La tangente e' %f\n", res); } else printf("Carattere non valido\n"); system("PAUSE"); return EXIT_SUCCESS; } //dichiarazione delle funzioni double cos_deg(double alfa) { double beta, gamma; beta = (180 / M_PI)*alfa; gamma = cos(beta); return gamma; } double sin_deg(double alfa) { double beta, gamma; beta = (180 / M_PI)*alfa; gamma = sin(beta); return gamma; } double tan_deg(double alfa) { double beta, gamma; beta = (180 / M_PI)*alfa; gamma = tan(beta); return gamma; } Link al commento Condividi su altri siti Altre opzioni di condivisione...
Messaggi raccomandati
Crea un account o accedi per lasciare un commento
Devi essere un membro per lasciare un commento
Crea un account
Iscriviti per un nuovo account nella nostra community. È facile!
Registra un nuovo accountAccedi
Sei già registrato? Accedi qui.
Accedi Ora