[C++] Convertire un programma da Fortran in C++

Alfaiota
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!!

Risposte
vict85
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.

Alfaiota
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.. :idea: Spero che il pranzo domenicale porti consiglio :lol:

vict85
Il problema dato ti chiede di fare una funzione di prototipo

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.

Alfaiota
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!

Alfaiota
Faccio un piccolo edit: il problema
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 :x quindi non riguarda questo in particolare. A rischio di andare offtopic se qualcuno sa dirmi perché e soprattutto come risovere si faccia avanti ;) grazie!

apatriarca
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.

Alfaiota
@apatriarca Graziee :shock: 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..

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

Alfaiota
Non la conoscevo infatti. Carino il programma in quel modo. Approfondirò volentiri! ;)

Scusatemi invece se sono ridondante :? ma se scrivo un file sorgente così
#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 :D

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.