Vai al contenuto
Inviato

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 da Shell32

Featured Replies

Inviato

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}

Inviato
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.
Inviato
  • Autore
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...
Inviato
  • Autore

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

Inviato

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++

Inviato
  • Autore
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...
Inviato
Metti l'immissione del caraterre in un ciclo while e lo fai uscire non appena la variabine non é piú nulla
Inviato
  • Autore

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 da Shell32

Inviato
Quale altro problema?
Inviato
  • Autore
Il fatto che i risultati ritornati dalle funzioni coseno, seno e tangente sono sballati
Inviato
Dichiari le variabili come double ma le stampi come float?
Inviato
  • Autore
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
  • 4 mesi dopo...
Inviato

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 è 041820ece06fe90767df3bf8e27fbbfd.gif.a5a6fe6fab540d5dc33ecb713ff98791.gif e quindi dovresti usare questa relazione:

9f7aef3853d4d6b5adc6bec0e37dcdb9.gif.89c8108ca07c64f3b2905974d3edf959.gif

 

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;
}

Crea un account o accedi per lasciare un commento