NikyRipy
NikyRipy - Genius - 2746 Punti
Rispondi Cita Salva
Ciao ragazzi premetto che è dalla terza media che non rifaccio geometria.

Comunque oggi mi è stato chiesto di fare un programmino in C++, però per realizzarlo devo conoscere il teorema di pitagora.

Cmq vi leggo il problema

Sono dati due triangoli rettangoli A e B. Del triangolo A si conosce l'ipotenusa e un cateto. Del triangolo B si conoscono i due cateti. Dire quale dei due triangoli A o B presenta l'area maggiore o se e due aree sono uguali..

Tralasciando l'ultima parte mi serve solo sapere quali sono le due formule per il resto non ci sono problemi :D

Io da quanto mi ricordo per trovare l'ipotenusa bisogna fare il primo cateto alla seconda, + il secondo cateto alla seconda tutto fratto radice quadrata giusto??


Grazie in anticipo
MaTeMaTiCa FaN
MaTeMaTiCa FaN - Genius - 15299 Punti
Rispondi Cita Salva
Se vuoi sapere il teorema di Pitagora...
Ipotenusa=
[math]\sqrt{(cat_1)^2+(cat_2)^2}[/math]

capito?
Progettista HW
Progettista HW - Genius - 2540 Punti
Rispondi Cita Salva
Il programma è di una banalità assurda:


#include<iostream> //Biblioteca Standard Input/Output
#include<cmath> //Biblioteca Standard Matematica
using namespace std;

int main()
{
float cat1a=, cat2a=0, ipoa=0; //Dichiaro cateti triangolo A
float cat1b=0, cat2b=0, ipob=0; //Dichiaro cateti triangolo B

float areaa=0, areab=0; //Dichiaro le aree dei due triangoli

cout << "Inserire valore ipotenusa del triangolo A: ";
cin >> ipoa;

cout << "Inserire valore cateto 1 del triangolo A: ";
cin >> cat1a;

cat2a = sqrt(ipoa*ipoa-cat1a*cat1a);

cout << "Inserire valore cateto 1 del triangolo B: ";
cin >> cat1b;

cout << "Inserire valore cateto 2 del triangolo B: ";
cin >> cat2b;

ipob = sqrt(cat1b*cat1b+cat2b*cat2b);

areaa = (cat1a*cat2a)/2;
areab = (cat1b*cat2b)/2;

if(areaa > areab)
cout << "Il triangolo A ha un'area piu' grande" << endl;
else if(areaa < areab)
cout << "Il triangolo B ha un'area più grande" << endl;
else if(areaa == areab)
cout << "Le aree dei due triangoli sono identiche" << endl;

return 0;
}


Prima inserisco le biblioteche (erroneamente chiamate librerie, per un errore di traduzione
dall'inglese) "iostream" (per l'utilizzo di funzioni di IO, come la visualizzazione dei caratteri
o la stampa) e la "cmath" (biblioteca derivata dal C che contiene semplici funzioni di matematica
come la radice quadrata "sqrt()" ). Poi definisco i cateti e le aree come valori in virgola mobile.

Infine, scrivo l'algoritmo per risolvere il tuo problema: il Teorema di Pitagora.

<<La somma delle aree dei quadrati costruiti sui cateti di un triangolo qualsiasi è uguale all'area del quadrato costruito sull'ipotenusa.>>

Ciò vuol dire che, avendo due cateti, posso ricavare l'ipotenusa del triangolo calcolando l'area dei due quadrati che hanno per lati le lunghezze dei due cateti:

[math]area quadrato 1 = cat1*cat1 = cat1^2[/math]

e

[math]area quadrato 2 = cat2*cat2 = cat2^2[/math]

Sommando le aree dei due quadrati ottengo l'area del quadrato che ha per lato la lunghezza dell'ipotenusa:

[math]area quadrato1 + area quadrato2 = area quadrato ipotenusa[/math]

Quindi per ottenere l'ipotenusa devo svolgere la radice quadrata dell'area del quadrato ottenuto.

Se invece avessi l'ipotenusa e un cateto, devo calcolare la differenza delle aree dei due quadrati sotto radice per ottenere la lunghezza del secondo cateto.
IPPLALA
IPPLALA - Mito - 101142 Punti
Rispondi Cita Salva
Progettista, giusto per chiedere, ma dove hai dichiarato le variabili? Cioè le hai dichiarate dopo main(), cioè dopo aver aperto il programma? Perchè usi variabili float?
Progettista HW
Progettista HW - Genius - 2540 Punti
Rispondi Cita Salva
IPPLALA: Progettista, giusto per chiedere, ma dove hai dichiarato le variabili? Cioè le hai dichiarate dopo main(), cioè dopo aver aperto il programma? Perchè usi variabili float?

Le variabili in C++ e in C, le puoi dichiarare dove vuoi (tranne qualche limite imposto dal linguaggio C), ma la posizione in cui le dichiari conferisce a tali variabili degli attributi. Se le variabili sono dichiarate prima del main(), le variabili prendono il nome di variabili globali, se sono definite all'interno del main() allora prendono il nome di variabili locali.
Una variabile, in informatica, è una locazione di memoria riservata. Se una variabile è locale allora genera una locazione di memoria "temporanea", che viene cancellata dopo che l'esecuzione della funzione che la richiama termina. Una variabile globale invece viene mantenuta finchè l'intero programma è in esecuzione. L'utilizzo spropositato di variabili globali può causare un maggior utilizzo della memoria, quindi per programmi molto complessi, che utilizzano migliaia di variabili, è bene riflettere sull'utilizzo o meno delle variabili globali. Poi ci sono anche le variabili registro (register tipo nome_variabile) che vengono riservate, come si può capire, in uno dei registri del processore (memoria più veloce della RAM), come il registro EAX (nei processori con tecnologia x86), ma ovviamente tale spazio è molto limitato ed è buona norma riservarlo per processi veramente importanti. Se invece si volesse usare una variabile prima della sua effettiva dichiarazione, allora bisogna dichiarare la variabile come variabile esterna (extern tipo nome_variabile). La distinzione tra tali variabili risulterà importante quando si scriveranno proprie funzioni, definendo i prototipi e il loro algoritmo.

Perché ho usato il tipo "float"? Semplice! Perché molto probabilmente la lunghezza dei cateti o dell'ipotenusa è un numero decimale, non intero. Per maggior precisione potevo utilizzare il tipo "double".

Compreso? Se c'è qualche cosa che devo chiarire o qualche curiosità, io sono disponibile.

P.S: Ah, chiamatemi pure per nome, cioè Angelo, tanto non mollerò questo forum finché non mi bannerete :satisfied
IPPLALA
IPPLALA - Mito - 101142 Punti
Rispondi Cita Salva
Angelo piacere :hi

Sai perchè te l'ho chiesto? Perchè di solito, quando programmo, io uso sempre variabili globali, cioè le dichiaro sempre prima del main() e non sapevo si potessero dichiarare anche dopo. Non si finisce mai di imparare. E io per esempio l'avrei dichiarate come intere erroneamente, non pensando alla possibilità che non lo siano affatto... Scusi, progettista :thx
Cherubino
Cherubino - Mito - 11351 Punti
Rispondi Cita Salva
IPPLALA: Angelo piacere :hi

Sai perchè te l'ho chiesto? Perchè di solito, quando programmo, io uso sempre variabili globali, cioè le dichiaro sempre prima del main() e non sapevo si potessero dichiarare anche dopo. Non si finisce mai di imparare. E io per esempio l'avrei dichiarate come intere erroneamente, non pensando alla possibilità che non lo siano affatto... Scusi, progettista :thx

MAI dichiarare variabili globali!
E se hai imparato così da un docente, vengo a Teramo a schiaffeggiarlo pubblicamente!
Progettista HW
Progettista HW - Genius - 2540 Punti
Rispondi Cita Salva
Tranquilla, tanto non commetti errori utilizzando variabili globali o definendo una variabile come intera, solo non avresti ottimizzato al massimo il tuo programma. Le variabili globali si dovrebbero usare solo quando vengono utilizzate spesso nell'intero programma e se sono di uso comune a più funzioni, altrimenti le inserisci dentro la definizione di funzione, come variabili locali, così quando la funzione (ad esempio quella per calcolare le potenze) termina di essere eseguita, anche la locazione di memoria viene cancellata e lo spazio recuperato potrà essere utilizzato da altre variabili.

Ad esempio, in linguaggio C, possiamo definire una nostra funzione per il calcolo delle potenze in questo modo:

double potenzapipplala(double valore, int potenza);

int main()
{
double potenzaippla(double valore, int potenza)
{
double valore_ritorno = 1.0;
int i;

for(i=0; i<potenza; i++)
{
valore_ritorno *= valore;
}

return(valore_ritorno);
}
}


Questo codice può essere utilizzato come "libreria" personale. Infatti se richiami tale libreria (o meglio biblioteca, perché l'inglese "library" significa appunto "biblioteca" ) con un #include <...> e poi utilizzi la funzione "potenzaipplala(,);" questa ti calcolerà la potenza di un numero.

Nota che le variabili "valore_ritorno" e "i" sono variabili locali che vengono create "SOLO" quando si esegue la determinata funzione e vengono eliminate quando questa termina.
Cherubino
Cherubino - Mito - 11351 Punti
Rispondi Cita Salva
Progettista, mi permetto di darti un consiglio per i cicli;
ovviamente non me lo sono inventato io, ma lo consiglia Bjarna Stroustroup, quindi è un consiglio ragionevole.

dichiara l'iteratore dentro al ciclo, ad es:

for (int i=0; i<10; i++)

questo rende l'iteratore accessibile (e visibile) solo dentro al ciclo, come è giusto che sia nella maggior parte dei casi.
inoltre un compilatore/maker intelligente capisce qual è il ruolo dell'iteratore, e quindi usa i registri per rendere il codice più veloce.
Progettista HW
Progettista HW - Genius - 2540 Punti
Rispondi Cita Salva
Cherubino: Progettista, mi permetto di darti un consiglio per i cicli;
ovviamente non me lo sono inventato io, ma lo consiglia Bjarna Stroustroup, quindi è un consiglio ragionevole.

dichiara l'iteratore dentro al ciclo, ad es:

for (int i=0; i<10; i++)

questo rende l'iteratore accessibile (e visibile) solo dentro al ciclo, come è giusto che sia nella maggior parte dei casi.
inoltre un compilatore/maker intelligente capisce qual è il ruolo dell'iteratore, e quindi usa i registri per rendere il codice più veloce.

Sì, è corretto, ma questo era un esempio veloce per far capire ad Ipplala la differenza tra variabili globali e locali.
IPPLALA
IPPLALA - Mito - 101142 Punti
Rispondi Cita Salva
Ok, capito grazie!
NikyRipy
NikyRipy - Genius - 2746 Punti
Rispondi Cita Salva
Progettista giusto per la cronaca ho provato a compilare il programma, ma non funziona dice che cè un problema qui

cout << "Inserire valore ipotenusa del triangolo A: ";
Progettista HW
Progettista HW - Genius - 2540 Punti
Rispondi Cita Salva
NikyRipy: Progettista giusto per la cronaca ho provato a compilare il programma, ma non funziona dice che cè un problema qui

cout << "Inserire valore ipotenusa del triangolo A: ";

Beh, potevi trovare subito l'errore se avessi studiato...

Ho dimenticato la definizione del "namespace"... ho corretto il codice... "using namespace std;". :pp
Come guadagno Punti nel Forum? Leggi la guida completa
In evidenza
Classifica Mensile
Vincitori di novembre
Vincitori di novembre

Come partecipare? | Classifica Community

Community Live

Partecipa alla Community e scala la classifica

Vai al Forum | Invia appunti | Vai alla classifica

Registrati via email