[c++]cosa non va in questo codice

franbisc
L'esercizio dice di far scrivere all'utente una linea di testo,e poi contare il numero di minuscole e maiuscole.
#include <iostream>
using namespace std;

int main ()  {
string line;
int y=line.size();
int i=0;
int maius=0;
int minus=0;

cout<<"Insert a line\n";
getline(cin,line);

do {
    if (line[i]<='z' && line[i]>='a')  {
        minus += 1;
        i++;
    }  else  {
        maius += 1;
        i++;
    }
    }  while(i<=y-1);

cout<<"Il numero di minuscole è "  <<minus <<endl;
cout<<"Il numero di maiuscole è "  <<maius <<endl;

return 0;
}

ma ogni volta esce sempre che il numero di maiuscole è 0 e quello di minuscole è 1

Risposte
hee136
Io proverei a spostare la "int y=line.size();" dopo la getline.

franbisc
"hee136":
Io proverei a spostare la "int y=line.size();" dopo la getline.

E' vero,così funziona,ma cos'è cambiato teoricamente?

hee136
Lunghezza di LINE prima di GETLINE: 0
Insert a line
qWEr
Lunghezza di LINE dopo di GETLINE: 4
Il numero di minuscole è 2
Il numero di maiuscole è 2


Sopra ho copiato l'output di una esecuzione.
L'unica differenza sostanziale è la ri-esecuzione della "y=line.size();" dopo la getline.
Poi ci sono piccole differenze che non intaccano la sostanza del codice (ovvero la stampa di y dopo ogni aggiornamento).

La funzione "line.size()" ti ritorna la lunghezza della stringa contenuta nella variabile "line".
Quando non contiene alcun valore (ovvero prima della chiamata "getline") ti ritorna 0.
Dopo l'inserimento di un valore, ti ritorna la lunghezza di quel valore.

scarly2
ma in questo codice gli spazi li conta come lettere maiuscole :)

vict85
"Mifert4":
[quote="hee136"]Io proverei a spostare la "int y=line.size();" dopo la getline.

E' vero,così funziona,ma cos'è cambiato teoricamente?[/quote]

Allora vediamo di descrivere cosa fa il codice. Perché ho l'impressione che tu lo scriva senza davvero capire il linguaggio.

#include <iostream>
#include <string>
using namespace std;


In queste linee tu stai dicendo al compilatore/computer che userai le funzioni in iostream e string (te l'ho aggiunta io). Inoltre gli dici che userai i nomi presenti in namespace senza segnarli tutte le volte.

int main ()  {
    [...]
    return 0;
}


Questa parte segnala solamente dove parte e finisce la parte principale del programma.

string line;
int y=line.size();
int i=0;
int maius=0;
int minus=0;


Queste righe definiscono delle variabili, creano degli spazi in memoria per loro e le danno un valore. Gli dici che c'è una variabile di tipo string e la inizializzi (tramite il costruttore di string) alla stringa vuota. Dopo di che hai 4 variabili tutte inizializzate a 0. La prima è 0 perché lo è la lunghezza della stringa vuota cioè il valore attuale di line.

cout<<"Insert a line\n";
getline(cin,line);


Questo stampa "Insert a line" nella console e va a capo. Dopo di che memorizza tutto quello che digiti sulla console fino a quanto non vai a capo nella stringa line. Le altre variabili NON vengono in alcun modo modificate e rimangono a 0.

Il "suggerimento" di hee136 è semplicemente quello di dirti che y non si "aggiorna da solo" ma devi farlo tu tutte le volte. Perché y non è la variabile privata della classe string che memorizza la lunghezza (sempre che in quella versione di string ci sia una variabile di questo tipo) ma è una variabile in cui tu hai memorizzato un certo valore "indipendentemente" da come cambieranno le altre variabili dopo quella assegnazione.

do {
    if (line[i]<='z' && line[i]>='a')  {
        minus += 1;
        i++;
    }  else  {
        maius += 1;
        i++;
    }
}  while(i<=y-1);


Questo, a parte la poca portabilità del codice già espressa in almeno altre due discussioni esegue un ciclo fino a che i, che inizialmente è 0, non diventa più grande o uguale a y che ha valore 0. Siccome i lo è già uscirà dal ciclo dopo la prima ripetizione.
All'interno del ciclo comprende se la i-esima componente della stringa è un vocale (sempre che la rappresentazione non sia molto diversa dall'ASCII) e aumenta minus e i di 1. Altrimenti aumenta maius e i. Evidenzierei che un punto di domanda o qualsiasi altra lettera aumenta maius quindi il programma è sbagliato anche in tal senso. Usa #include come già precedentemente consigliato.
http://it.wikipedia.org/wiki/Ctype.h

cout<<"Il numero di minuscole è "  <<minus <<endl;
cout<<"Il numero di maiuscole è "  <<maius <<endl;


Questa parte del codice semplicemente stampa sulla console "il numero..." e il valore di minuscole e di non minuscole. Ma questo non penso sia problematico.

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