Comportamento anomalo di un programma semplice

di il
10 risposte

Comportamento anomalo di un programma semplice

Buona domenica ragazzi,

Ho scritto un programma su dev-C++ che mi calcoli il massimo tra una serie di numeri, in particolare i numeri di cui si vuole calcolare il massimo non possono essere più di dieci.

Questo è il codice:

#include<iostream>
#include<stdlib.h>
using namespace std;
main()
{
int i,n;
float v[9],max;
cout<<"\nquanti sono i numeri di cui vuoi calcolare il massimo: ";cin>>n;
while (n>10)
{
cout<<"\nattenzione, questro programma puo' calcolare il massimo di non piu' di 10 numeri, inserire nuovo valore: ";cin>>n;
}
max=v[0];
for (i=1;i<=n;i++)
{
cout<<"\ninserisci la componete ";cout<<i;cout<<": ";cin>>v[i-1];
if (v[i-1]>max)
max=v[i-1];
}
cout<<"\nla componente massima dei numeri inseriti e': ";cout<<max;
return 0;

}


Fin quando inserisco al più 9 numeri il programma funziona perfettamente ma nel momento in cui inserisco 10 numeri quando lo segue il programma continua a chiedermi di inserire componenti all'infinito come se il ciclo for si resettasse (almeno questa è la mia ipotesi).

A cosa è dovuto?

10 Risposte

  • Re: Comportamento anomalo di un programma semplice

    Ma come ... prevedi 9 valori

    float v[9]

    e ne vuoi usare 10 ?

    E comunque l'indice non termina a n ma a n-1, quindi non <= ma <

    for (i=1; i<n; i++)
  • Re: Comportamento anomalo di un programma semplice

    Allora:
    - la libreria stdlib non serve;
    - lo standard C++ prevede che il main ritorni un intero... detto in parole povere devi scrivere int main() e non main();
    - il return 0 è superfluo;
    - al fine di rendere il codice più chiaro e leggibile ti consiglio di scrivere codice indentato, di rispettare la spaziatura e di riportare una sola istruzione per riga;
    - lo sai che al posto di
    cout << "..."; cout << "...";
    puoi scrivere
    cout << "..." << "...";
    - se vuoi un consiglio lascia stare dev e scaricati un IDE decente tipo codeblocks.

    Bene ora occupiamoci della parte logica del codice:
    - come detto da oregon, se l'array può contenere al massimo 10 elementi perchè scrivi float v[9]?!
    - perchè nel ciclo for fai variare l'indice i tra 1 e n per poi utilizzare i-1? Non sarebbe meglio far variare i tra 0 e n-1 ed utilizzare direttamente i?
    - quando scrivi max=v[0] che valore stai assegnando alla variabile max?
  • Re: Comportamento anomalo di un programma semplice

    Nippolo ha scritto:


    - se vuoi un consiglio lascia stare dev e scaricati un IDE decente tipo codeblocks.
    L'avevo consigliato anch'io in un suo precedente post, ma a quanto vedo ascolta poco i consigli...
  • Re: Comportamento anomalo di un programma semplice

    Nippolo ha scritto:


    Bene ora occupiamoci della parte logica del codice:
    - come detto da oregon, se l'array può contenere al massimo 10 elementi perchè scrivi float v[9]?!
    - perchè nel ciclo for fai variare l'indice i tra 1 e n per poi utilizzare i-1? Non sarebbe meglio far variare i tra 0 e n-1 ed utilizzare direttamente i?
    - quando scrivi max=v[0] che valore stai assegnando alla variabile max?
    Vi ringrazio tutti per la risposta, rispondo ai tuoi quesiti nell'ordine:

    -dall'esercizio che sto facendo ho letto che l'array in realtà contiene anche lo 0-esimo e quindi ho pensato, forse erroneamente, che un array del tipo V[9] contenga in realtà 10 elementi (9 + l'elemento 0)
    - faccio variare i tra 1 ed n in maniera tale che quando eseguo il programma nel momento dell'inserimento dei numeri dei quali calcolare il massimo compaia il messaggio "inserisci la componente 1" anziché "inserisci la componente 0" quindi è solo un fatto estetico diciamo...mentre lascio v[i-1] in maniera tale da non lasciare l'elemento v[0] vuoto
    -hai perfettamente ragione, essendo che l'assegnazione di v[0] avviene nel ciclo for e quindi successivamente quando scrivo max=v[0] sto sbagliano, dal punto di vista logico potrei impostare max=0 e poi far partire i ciclo...piccola domanda, prima che assegni i valori dell'array i suoi elemnti valgono tutti 0 giusto?

    ramcrack ha scritto:


    L'avevo consigliato anch'io in un suo precedente post, ma a quanto vedo ascolta poco i consigli...
    Non è che l'ho ignorato e che il prof della tesi ha detto che il dev va più che bene per il lavoro che devo fare e siccome fino ad adesso non mi ha dato particolari bug e mi sono già abituato ad esso ho preferito continuare così, poi in futuro quando inizierò a studiare programmazione per altri scopi seguirò sicuramente il tuo consiglio
  • Re: Comportamento anomalo di un programma semplice

    Nella dichiarazione scrivi 10 e gli indici vanno da 0 a 9
  • Re: Comportamento anomalo di un programma semplice

    -dall'esercizio che sto facendo ho letto che l'array in realtà contiene anche lo 0-esimo e quindi ho pensato, forse erroneamente, che un array del tipo V[9] contenga in realtà 10 elementi (9 + l'elemento 0)
    Facciamo un po' di chiarezza...
    Nel momento in cui dichiari un array, il valore tra parentesi quadre indica la dimensione dell'array, ossia il numero di elementi da cui è costituito quell'array. Per esempio se scrivo int v[N], sto dichiarando un array di N (e non N+1) interi.
    Ogni elemento di un array è contraddistinto da un indice che parte da 0 (indice del primo elemento) e arriva a N-1 (indice dell'ultimo elemento).
    - faccio variare i tra 1 ed n in maniera tale che quando eseguo il programma nel momento dell'inserimento dei numeri dei quali calcolare il massimo compaia il messaggio "inserisci la componente 1" anziché "inserisci la componente 0" quindi è solo un fatto estetico diciamo...mentre lascio v[i-1] in maniera tale da non lasciare l'elemento v[0] vuoto
    Visto che utilizzi i una sola volta, mentre i-1 più volte, non sarebbe più logico far variare i tra 0 e N-1 in modo da sostituire tutti quei i-1 con i e quell'unico i con i+1?!
    dal punto di vista logico potrei impostare max=0 e poi far partire i ciclo...
    E cosa succederebbe se inserissi da tastiera tutti valori negativi?
    piccola domanda, prima che assegni i valori dell'array i suoi elemnti valgono tutti 0 giusto?
    La risposta è no, ma adesso ti chiedo io una cosa... che senso ha porre una domanda del genere quando basterebbe scrivere un paio di righe di codice e compilarle per avere una risposta?!
    In ogni caso se vuoi inizializzare gli elementi di un array a 0 puoi usare un ciclo for oppure scrivere semplicemente int v[10]={}.
  • Re: Comportamento anomalo di un programma semplice

    Nippolo ha scritto:


    E cosa succederebbe se inserissi da tastiera tutti valori negativi?
    be' a quel punto max rimarrà pari a 0 il che è corretto

    Nippolo ha scritto:


    ma adesso ti chiedo io una cosa... che senso ha porre una domanda del genere quando basterebbe scrivere un paio di righe di codice e compilarle per avere una risposta?!
    Hai ragione, a volte pecco di pigrizia e mantengo spento il cervello

    Ulteriore domanda, nella prima risposta hai detto di inserire int main () perché lo standard C++ prevede che il main restituisca un intero, e se volessi invece fare la stessa tipologia di programma ma per tutti i numeri reali? Se lasciassi main al posto di int main cosa cambia visto che sembra che funzioni lo stesso?

    Comunque questo è il programma revisionato e funziona perfettamente

    #include<iostream>
    using namespace std;
    int main()
    {
    int i,n;
    float v[10],max;
    cout<<"\nquanti sono i numeri di cui vuoi calcolare il massimo: ";cin>>n;
    while (n>10)
    {
    cout<<"\nattenzione, questro programma puo' calcolare il massimo di non piu' di 10 numeri, inserire nuovo valore: ";
    cin>>n;
    }
    max=0;
    for (i=0;i<=n-1;i++)
    {
    cout<<"\ninserisci componete: ";
    cin>>v;
    if (v>max)
    max=v;
    }
    cout<<"\nla componente massima dei numeri inseriti e': "<<max;
    }

    Ti ringrazio per tutte le dritte, perdonatemi se a volte faccio domande elementari ma sono pochissimi giorni che ho iniziato a scrivere codici di programmazione
  • Re: Comportamento anomalo di un programma semplice

    be' a quel punto max rimarrà pari a 0 il che è corretto
    Come corretto!?
    Supponiamo di inserire i seguenti valori:
    -4 -3 -9 -1 -5
    Mi aspetterei che il massimo fosse -1 e non 0 (valore che peraltro nessuno ha inserito).
    Ulteriore domanda, nella prima risposta hai detto di inserire int main () perché lo standard C++ prevede che il main restituisca un intero, e se volessi invece fare la stessa tipologia di programma ma per tutti i numeri reali?
    Non ho ben capito cosa intendi con fare la stessa tipologia di programma ma per tutti i numeri reali, ma cosa c'entrano i numeri reali con il main?!
    Se lasciassi main al posto di int main cosa cambia visto che sembra che funzioni lo stesso?
    Magari qualcuno più esperto di me saprà dirti come mai il compilatore non segnali nessun errore omettendo l'int... in ogni caso l'intero ritornato dalla funzione main() rappresenta un codice di errore, se invece il main ritorna 0 allora significa che non c'è stato nessun errore durante l'esecuzione del programma.

    Per quanto riguarda il codice:
    - per postare codice sul forum utilizza gli appositi tag code;
    - al posto di <=n-1 conviene scrivere <n;
    - come già detto sopra inizializzare la variabile max a 0 è sbagliato;
    - giusto per la cronaca, l'esercizio può essere risolto utilizzando una semplice variabile al posto dell'array.
  • Re: Comportamento anomalo di un programma semplice

    Nippolo ha scritto:


    giusto per la cronaca, l'esercizio può essere risolto utilizzando una semplice variabile al posto dell'array.
    Si lo so, semplicemente mi stavo esercitando con gli array.
    #include<iostream>
    using namespace std;
    int main()
    {
    	int i,n;
    	float v[10],max;
    	cout<<"\nquanti sono i numeri di cui vuoi calcolare il massimo:  ";cin>>n;
    	while (n>10)
    	{
    	cout<<"\nattenzione, questro programma puo' calcolare il massimo di non piu' di 10 numeri, inserire nuovo valore:  ";
    	cin>>n;
        }
    
    for (i=0;i<n;i++)
    {
    	cout<<"\ninserisci componete: ";
    	cin>>v[i];
    }
    max=v[0];
    for (i=1;i<n;i++)
    {
    	if (v[i]>max)
    	max=v[i];
    }
    cout<<"\nla componente massima dei numeri inseriti e':  "<<max;
    Questo è il codice, è ok? Mi stavo chiedendo se vi fosse un modo più efficiente per calcolare il massimo senza eseguire due cicli for (uno per l'acquisizione degli elementi e uno per la verifica del massimo.)
  • Re: Comportamento anomalo di un programma semplice

    Mi stavo chiedendo se vi fosse un modo più efficiente per calcolare il massimo senza eseguire due cicli for (uno per l'acquisizione degli elementi e uno per la verifica del massimo.)
    cout << "\ninserisci componete: ";
        cin >> v[0];
        max = v[0];
        for(unsigned int i = 1; i < n; ++i)
        {
            cout<<"\ninserisci componete: ";
            cin >> v[i];
            if(v[i] > max)
            {
                max = v[i];
            }
        }
    oppure
    for(unsigned int i = 0; i < n; ++i)
        {
            cout<<"\ninserisci componete: ";
            cin >> v[i];
            if(i == 0 || v[i] > max)
            {
                max = v[i];
            }
        }
Devi accedere o registrarti per scrivere nel forum
10 risposte