Vai al contenuto

C++ aiuto con un programmino


Messaggi raccomandati

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
Link al commento
Condividi su altri siti

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

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

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

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

Inviato (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 da Shell32
Link al commento
Condividi su altri siti

  • 4 mesi dopo...

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

Link al commento
Condividi su altri siti

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 account

Accedi

Sei già registrato? Accedi qui.

Accedi Ora

Giochi in Uscita



×
×
  • Crea Nuovo...