Esercizio su una sequenza di interi
Buonasera!
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:
(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!!!!
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
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.
Ovviamente no.
Nessuna idea? Eppure non mi sembra qualcosa di molto complicato.
- 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.
"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.
Per il resto adesso provo a riscrivere il codice in maniera piu ordinata e lo riposto.
Ecco qualche alternativa:
o equivalentemente
while(totale > 0)
{
...
--totale;
}int i = 0;
while(totale > i)
{
...
++i;
}o equivalentemente
for(int i = 0; i < totale; ++i)
{
...
}
"Super Squirrel":
Ecco qualche alternativa:
int i = 0; while(totale > i) { ... ++i; }
Ti ringrazio, in effetti doveva essere una cosa semplice
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;
}
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?
Ti ringrazio!!
Ti ringrazio!!
"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?![]()
![]()
Ti ringrazio!!
tutto ok questo sono riuscito a risolverlo in entrambi i modi utilizzando il vettore dinamico.