[C++] Esprimere la monotonia di una funzione

Salve a tutti ragazzi, in questo programma devo generare una matrice di altezze negli anni, stampare il vettore U delle medie e nel caso in cui il trend delle altezze negli anni sia crescente stampare inoltre che il trend è crescente.
Sono riuscito a fare tutto il programma, ma quando per generare la stringa riguardante il trend, le cose non quadrano, si riferisce sempre all'unica riga in cui il trend è crescente e non a tutto il resto del programma. Qui vi allego il programma:

#include
#include
#include

using namespace std;

const int MAX_RAWS=100;
const int MAX_COLS=100;

void leggiInput(int M[MAX_RAWS][MAX_COLS], int& n_raws, int& n_cols){
cout << "Definisci la matrice delle altezze "<< endl;
cout << "Inserisci numero di righe : ";
do{cin >> n_raws;
if(n_raws <0 || n_raws>MAX_RAWS){
cout << "Errore, ripeta l'inserimento : ";
}
}while(n_raws <0 || n_raws>MAX_RAWS);

cout << "Inserisci numero di colonne : ";
do{
cin >> n_cols;
if(n_cols <0 || n_cols>MAX_COLS){
cout << "Errore, ripeta l'inserimento : ";
}
}while(n_cols <0 || n_cols>MAX_COLS);

for(int r=0; r for(int c=0;c cout << "Anno :" << r << " altezza : " << c << " : ";
do{
cin >> M[r][c];
if(M[r][c]<0){
cout << "Errore ripeta l'inserimento :";
}
}while(M[r][c]<0);
}
}
}

void calcolaSoluzione(const int M[MAX_RAWS][MAX_COLS], int n_raws, int n_cols,
double U[MAX_RAWS], int& u_size){
for(int r=0;r double somma=0;
for(int c=0; c somma=somma+M[r][c];
double media=somma/n_cols;

U[r]=media;
}
}
u_size=n_raws; }

void stampaOutput(double U[MAX_RAWS],int u_size){
cout << "Il vettore U delle medie :";
for (int k=0;k cout.width(4);
cout << U[k];
}
cout << endl;

for(int i=1; i double differenza;
differenza = U-U[i-1];
cout << "Variazione fra media " << i << " e media "<
if(U>U[i-1]){
cout << "Trend crescente!"< }
}
}

int main() {
int M[MAX_RAWS][MAX_COLS];
double U[MAX_RAWS];
int n_raws,n_cols,u_size;

leggiInput(M,n_raws,n_cols);
calcolaSoluzione(M,n_raws,n_cols, U, u_size);
stampaOutput(U, u_size);
return 0;
}

Risposte
vict85
Un piccolo commento: righe in inglese si scrive rows. Raw invece vuol dire grezzo o crudo (di fatto non lavorato). C'è un errore nella funzione che calcola le medie. Non sono inoltre sicuro che il tuo codice sulla monotonia faccia quanto richiesto dal testo.

Ho fatto alcune correzione al tuo codice:
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <cinttypes>

using namespace std;

constexpr size_t MAX_ROWS = 100;
constexpr size_t MAX_COLS = 100;

void leggiInput(uint32_t M[MAX_ROWS][MAX_COLS], size_t &n_rows, size_t &n_cols)
{
    cout << "Definisci la matrice delle altezze " << endl;
    cout << "Inserisci numero di righe : ";
    do
    {
        int temp = -1;
        cin >> temp;
        if (temp >= 0 && temp < MAX_ROWS)
        {
            n_rows = static_cast<size_t>(temp);
            break;
        }
        cout << "Errore, ripeta l'inserimento : ";
    } while (true);

    cout << "Inserisci numero di colonne : ";
    do
    {
        int temp = -1;
        cin >> temp;
        if (temp >= 0 && temp < MAX_COLS)
        {
            n_cols = static_cast<size_t>(temp);
            break;
        }
        cout << "Errore, ripeta l'inserimento : ";
    } while (true);

    for (size_t r = 0; r != n_rows; r++)
    {
        for (size_t c = 0; c != n_cols; c++)
        {
            cout << "Anno :" << r << " altezza : " << c << " : ";
            do
            {
                int temp = -1;
                cin >> temp;
                if (temp >= 0)
                {
                    M[r][c] = static_cast<uint32_t>(temp);
                    break;
                }
                cout << "Errore ripeta l'inserimento :";
            } while (true);
        }
    }
}

void calcolaMedie(const uint32_t M[MAX_ROWS][MAX_COLS], const size_t n_rows, const size_t n_cols,
                  double U[MAX_ROWS])
{
    const double ratio = 1. / (n_cols + 0.);
    for (size_t r = 0; r != n_rows; r++)
    {
        double somma = 0.;
        for (size_t c = 0; c != n_rows; c++)
        {
            const double temp = static_cast<double>(M[r][c]);
            somma += temp;
        }
        const double media = somma * ratio;
        U[r] = media;
    }
}

void stampaOutput(const double U[MAX_ROWS], size_t u_size)
{
    cout << "Il vettore U delle medie :";
    for (size_t k = 0; k < u_size; k++)
    {
        cout << U[k] << "  ";
    }
    cout << endl;

    size_t i = 0;
    for (; i < u_size - 1 && U[i] < U[i + 1]; ++i)
        ;
    cout << "Il trend "
         << (i == u_size - 1 ? "" : "non ")
         << "e' crescente!" << endl;
}

int main()
{
    uint32_t M[MAX_ROWS][MAX_COLS] = {};
    double U[MAX_ROWS] = {};
    size_t n_rows, n_cols;

    leggiInput(M, n_rows, n_cols);
    calcolaMedie(M, n_rows, n_cols, U);
    stampaOutput(U, n_rows);
    return 0;
}


[edit] Avevo fatto un errore nel codice. Ora dovrebbe essere corretto

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