[C++] Convertire un programma da Fortran in C++
Ciao a tutti! Il mio problema è il seguente: ho un esame di programmazione da sostenere con linguaggio C++, ma il professore per un altro corso mette una traccia da fare con fortran che io però devo svolgere in C++ comunque.
La traccia chiede di scrivere un programma Fortran che contiene una funzione con due argomenti interi che ritorna il valore maggiore fra la loro somma e il loro prodotto. La funzione non deve leggere niente nè da tastiera nè da file, nè stampare su schermo o file.
Il mio problema non è nella funzione in sé, ma nel fatto che i valori non li prendo in input da tastiera. Come lo posso impostare?
Se può aiutare ho la soluzione in Fortran che data la mia ignoranza non so convertire..
PROGRAM fortran
WRITE(*,*) sommaprodotto(2, -1)
WRITE(*,*) sommaprodotto(3, 2)
WRITE(*,*) sommaprodotto(0, -2)
WRITE(*,*) sommaprodotto(1, 0)
STOP
CONTAINS
FUNCTION sommaprodotto(a, b)
INTEGER, INTENT(in) :: a, b
INTEGER :: sommaprodotto
IF (a+b>a*b)
THEN
sommaprodotto=a+b
ELSE
sommaprodotto=a*b
END
IF
RETURN
END FUNCTION
sommaprodotto
END PROGRAM fortran
Grazie!!
La traccia chiede di scrivere un programma Fortran che contiene una funzione con due argomenti interi che ritorna il valore maggiore fra la loro somma e il loro prodotto. La funzione non deve leggere niente nè da tastiera nè da file, nè stampare su schermo o file.
Il mio problema non è nella funzione in sé, ma nel fatto che i valori non li prendo in input da tastiera. Come lo posso impostare?
Se può aiutare ho la soluzione in Fortran che data la mia ignoranza non so convertire..

PROGRAM fortran
WRITE(*,*) sommaprodotto(2, -1)
WRITE(*,*) sommaprodotto(3, 2)
WRITE(*,*) sommaprodotto(0, -2)
WRITE(*,*) sommaprodotto(1, 0)
STOP
CONTAINS
FUNCTION sommaprodotto(a, b)
INTEGER, INTENT(in) :: a, b
INTEGER :: sommaprodotto
IF (a+b>a*b)
THEN
sommaprodotto=a+b
ELSE
sommaprodotto=a*b
END
IF
RETURN
END FUNCTION
sommaprodotto
END PROGRAM fortran
Grazie!!
Risposte
Butta la soluzione in fortran e risolvi il problema sostituendo la parola fortran con C++.
Ripassati cosa si intende per argomento di una funzione e ignora cosa succede nel main.
Ripassati cosa si intende per argomento di una funzione e ignora cosa succede nel main.
Ok, butto la soluzione in Fortran 
Allora, io so che l'argomento è in pratica ciò su cui "opera" la funzione, quindi devo creare una funzione nuova per C++, che restituisce void per non stampare su schermo. Ma il main non lo scrivo proprio?
Intanto lavoro sulla funzione..
Spero che il pranzo domenicale porti consiglio

Allora, io so che l'argomento è in pratica ciò su cui "opera" la funzione, quindi devo creare una funzione nuova per C++, che restituisce void per non stampare su schermo. Ma il main non lo scrivo proprio?
Intanto lavoro sulla funzione..


Il problema dato ti chiede di fare una funzione di prototipo
In cui valore di ritorno sia \(\max(a+b, ab)\).
Si può scrivere in 1 riga di codice, ma penso lo scriversi in 3.
int func(int a, int b);
In cui valore di ritorno sia \(\max(a+b, ab)\).
Si può scrivere in 1 riga di codice, ma penso lo scriversi in 3.
Bene, avevo appunto pensato che, citando la traccia, la funzione deve comunque fornire il risultato come valore di ritorno, quindi non può essere void
Comunque io ho scritto questa funzione
int valoreMaggiore(int x, int y) {
int somma;
int prodotto;
somma = x+y;
prodotto = x*y;
if(somma>prodotto)
return somma;
else
return prodotto;
}
Tra l'altro l'ho scritta in più di 3 righe..
E ho provato a inserirla in un banale programmino, che aimè compila bene ma esegue male.
Dopo aver inserito i due valori se non inserisco un ulteriore valore da tastiera (anche carattere) non finisce ad eseguire il programma, dandomi però il valore giusto.
#include
#include
int valoreMaggiore(int , int );
int main() {
int b, c, somma, prodotto;
scanf("%d\n", &b);
scanf("%d\n", &c);
printf("Il valore maggiore tra somma e prodotto e':\n%d\n", valoreMaggiore(b, c));
system(" pause ");
return 0;
}
int valoreMaggiore(int x, int y) {
int somma;
int prodotto;
somma = x+y;
prodotto = x*y;
if(somma>prodotto)
return somma;
else
return prodotto;
}
A questo punto due domande:
la funzione va bene?
cosa ho sbagliato nel programma?
facciamo tre domande, ai fini dell'esame scrivo un file sorgente con le librerie, la funzione e basta senza il main?
Grazie per la pazienza!
Comunque io ho scritto questa funzione
int valoreMaggiore(int x, int y) {
int somma;
int prodotto;
somma = x+y;
prodotto = x*y;
if(somma>prodotto)
return somma;
else
return prodotto;
}
Tra l'altro l'ho scritta in più di 3 righe..

E ho provato a inserirla in un banale programmino, che aimè compila bene ma esegue male.
Dopo aver inserito i due valori se non inserisco un ulteriore valore da tastiera (anche carattere) non finisce ad eseguire il programma, dandomi però il valore giusto.
#include
#include
int valoreMaggiore(int , int );
int main() {
int b, c, somma, prodotto;
scanf("%d\n", &b);
scanf("%d\n", &c);
printf("Il valore maggiore tra somma e prodotto e':\n%d\n", valoreMaggiore(b, c));
system(" pause ");
return 0;
}
int valoreMaggiore(int x, int y) {
int somma;
int prodotto;
somma = x+y;
prodotto = x*y;
if(somma>prodotto)
return somma;
else
return prodotto;
}
A questo punto due domande:
la funzione va bene?
cosa ho sbagliato nel programma?
facciamo tre domande, ai fini dell'esame scrivo un file sorgente con le librerie, la funzione e basta senza il main?
Grazie per la pazienza!
Faccio un piccolo edit: il problema
lo fa anche con altri programmi che sto eseguendo
quindi non riguarda questo in particolare. A rischio di andare offtopic se qualcuno sa dirmi perché e soprattutto come risovere si faccia avanti
grazie!
se non inserisco un ulteriore valore da tastiera (anche carattere) non finisce ad eseguire il programma, dandomi però il valore giusto.
lo fa anche con altri programmi che sto eseguendo


Il problema è il \n alla fine dello scanf. Toglilo. Facendo in questo modo, scanf ritorna al main solo quando incontra un carattere diverso da uno spazio, a capo o tabulazione.
@apatriarca Graziee
Non riuscivo a uscirne! grazie grazie grazie 
Ora tornando alla funzione.. Un file sorgente che deve contenere solo una funzione devo impostarla con le librerie ma senza main? Tipo così
#include
int valoreMaggiore(int x, int y) {
int somma;
int prodotto;
somma = x+y;
prodotto = x*y;
if(somma>prodotto)
return somma;
else
return prodotto;
}
La libreria stdlib.h non credo di doverla includere visto che non uso sue funzioni, giusto?
Ma in un rigo come avrei potuto scriverla? Ci sto pensando da oggi ma non riuscendoci mostro tutta la mia ingnoranza in merito..


Ora tornando alla funzione.. Un file sorgente che deve contenere solo una funzione devo impostarla con le librerie ma senza main? Tipo così
#include
int valoreMaggiore(int x, int y) {
int somma;
int prodotto;
somma = x+y;
prodotto = x*y;
if(somma>prodotto)
return somma;
else
return prodotto;
}
La libreria stdlib.h non credo di doverla includere visto che non uso sue funzioni, giusto?
Ma in un rigo come avrei potuto scriverla? Ci sto pensando da oggi ma non riuscendoci mostro tutta la mia ingnoranza in merito..
A parte il fatto che il C++ non ti costringe a mettere più istruzioni in righe diverse, per cui puoi scrivere la tua intera funzione in una riga eliminando semplicemente tutti i caratteri di a capo, puoi scriverlo come segue:
L'operatore ternario non viene insegnato molto (anche se sinceramente non mi è chiaro il motivo per cui venga considerato difficile), In generale l'istruzione:
è equivalente a
int valoreMaggiore(int x, int y) { return (x*x > x + y) ? (x*x) : (x + y); }
L'operatore ternario non viene insegnato molto (anche se sinceramente non mi è chiaro il motivo per cui venga considerato difficile), In generale l'istruzione:
variabile = condizione ? valore1 : valore2;
è equivalente a
if (condizione) { variabile = valore1; } else { variabile = valore2; }
Non la conoscevo infatti. Carino il programma in quel modo. Approfondirò volentiri! 
Scusatemi invece se sono ridondante
ma se scrivo un file sorgente così
è corretto? La forma va bene? Niente main o altre librerie?
Tra l'altro l'ho "accorciato" un po' e sono riuscita a metterlo in codice

Scusatemi invece se sono ridondante

#include <stdio.h> int valoreMaggiore(int x, int y) { return (x*x > x + y) ? (x*x) : (x + y); }
è corretto? La forma va bene? Niente main o altre librerie?
Tra l'altro l'ho "accorciato" un po' e sono riuscita a metterlo in codice
