Esercizio su una sequenza di interi

Amedim
Buonasera! :D
Stavo provando a svolgere questo esercizio:
Si scriva un programma in linguaggio C per poter analizzare una sequenza di numeri.
Dati N numeri interi letti da tastiera si vogliono calcolare e stampare su schermo diversi
risultati:
• quanti sono i numeri positivi, nulli e negativi
• quanti sono i numeri pari e dispari


Ecco, trovo alcune difficolta' sulla parte di input dei numeri. Io ho scritto il codice in questo modo:


include <iostream>
using namespace std;
int main(void){
int totale;
int n;
int positivo,negativo,nullo;
int pari,dispari;
cout<<"Quanti numeri saranno inseriti? ";
cin>>totale;
positivo=0; negativo=0; nullo=0;
pari=0; dispari=0;
n=0;
while (n < totale){
cout<<"Inserisci un numero:";
cin>>n;
if (n==0){
nullo=nullo+1;
}else{
if (n>0){
positivo=positivo+1;
}else{
negativo=negativo+1;
}
}
if(n%2==0){
pari=pari+1;
}else{
dispari=dispari+1;
}
}


(ho tralasciato parte scrittura). Ecco, il codice funziona per quanto riguarda i vari contatori pero' c'è il problema che quando inserisco un numero piu grande del totale dichiarato inizialmente il ciclo si ferma... secondo voi, in base alla traccia è accettabile? O, in caso, come si potrebbe modificare il codice?

Grazie tante!!!! :)

Risposte
Super Squirrel
Alcune considerazioni:
- la traccia dice C, ma questo è C++;
- per una maggiore chiarezza e leggibilità ti consiglio di rispettare la spaziatura, l'indentazione e di scrivere una sola istruzione per riga;
- invece di separare dichiarazione e inizializzazione, puoi anche effettuare una dichiarazione con inizializzazione;
- per la cronaca, quando vuoi incrementare o decrementare una variabile intera di un'unità, puoi utilizzare gli operatori ++ e --;
- volendo si può fare a meno delle variabili "negativo" e "dispari", infatti sarà:
* negativo = totale - nullo - positivo;
* dispari = totale - pari.

... pero' c'è il problema che quando inserisco un numero piu grande del totale dichiarato inizialmente il ciclo si ferma... secondo voi, in base alla traccia è accettabile?

Ovviamente no.
... come si potrebbe modificare il codice?

Nessuna idea? Eppure non mi sembra qualcosa di molto complicato.

Amedim
"Super Squirrel":

Alcune considerazioni:
- la traccia dice C, ma questo è C++;


Sisi, volevo io provare ad implementarlo in c++;

... come si potrebbe modificare il codice?

Nessuna idea? Eppure non mi sembra qualcosa di molto complicato.


Eh infatti... c'ho pensato a lungo, ho provato e riprovato diversi comandi ma non mi è venuto fuori nulla di utile... vuoto proprio. :oops:
Per il resto adesso provo a riscrivere il codice in maniera piu ordinata e lo riposto. :smt023

Super Squirrel
Ecco qualche alternativa:
while(totale > 0)
{
    ...
    --totale;
}

int i = 0;
while(totale > i)
{
    ...
    ++i;
}

o equivalentemente
for(int i = 0; i < totale; ++i)
{
    ...
}

Amedim
"Super Squirrel":
Ecco qualche alternativa:

int i = 0;
while(totale > i)
{
    ...
    ++i;
}



Ti ringrazio, in effetti doveva essere una cosa semplice :cry: . Il fatto è che quando mi trovo a voler risolvere un codice con un while fatico sempre un po' a trovare le condizioni per "uscire dal ciclo". Quindi,per capire, in sostanza usando questo sistema viene introdotta una nuova variabile i che viene sempre incrementata "fin quando" il valore totale inserito inizialmente resta maggiore di i con i che diventerebbe in un certo senso il valore che inserisci di volta in volta, o sbaglio ?
Comunque ricapitolando ho riscritto il codice in questo modo:

#include <iostream>
using namespace std;

int main(void){
	
int totale;
int n;
int positivo;
int nullo;
int negativo;
int pari;
int dispari;
int i =0;

//inizializzo le variabili

positivo =0; 
nullo =0;
negativo =0;
pari =0;
dispari =0;

cout << "Quanti numeri saranno inseriti? ";
cin>> totale; 
	 
while (totale > i) {

++ i;

cout << "Inserisci un numero:";
cin >> n;
	  	
if (n==0) {
nullo ++;
} else {
if (n > 0) {
positivo++;
}else {
negativo++;
}
}
if(n % 2 == 0){
pari ++;
} else {
dispari ++;
}
}

cout<<"Hai inserito: "<<positivo<<" Positivi; "<<negativo<<" Negativi; "<<nullo<<" Nulli; "<<endl; //stampa dei valori
cout<<"Hai inserito: "<<pari<<" Pari; "<<dispari<<" Dispari. "<<endl;
}

Amedim
Poi un'altra cosa: quando ho in una traccia una cosa del tipo: Dato un vettore di N interi,inizializzati da tastiera,determinare il valore massimo e stampare a video sia il massimo che la posizione in cui esso compare per stabilire la dimensione N dell'array devo farlo io arbitrariamente (es assegno N10) oppure devo fare un sistema simile a quello visto in questo esercizio? :roll: :roll:
Ti ringrazio!!

Amedim
"Amedim":
Poi un'altra cosa: quando ho in una traccia una cosa del tipo: Dato un vettore di N interi,inizializzati da tastiera,determinare il valore massimo e stampare a video sia il massimo che la posizione in cui esso compare per stabilire la dimensione N dell'array devo farlo io arbitrariamente (es assegno N10) oppure devo fare un sistema simile a quello visto in questo esercizio? :roll: :roll:
Ti ringrazio!!

tutto ok questo sono riuscito a risolverlo in entrambi i modi utilizzando il vettore dinamico. :smt023

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