PDA

View Full Version : [C++] Switch


legolas93
07-02-2012, 11:39
/*
* TestGradeBook.cpp
*
* Created on: 07/feb/2012
* Author: andrea
*/

#include <iostream>
#include "GradeBook.h"

using namespace std;

int main()
{
GradeBook gradeBook1("Il corso uno è troppo lunga da scrivere e quindi verra automaticamente tagliato");

gradeBook1.displayCourse();
cout << "\n";


gradeBook1.inputGrades();
gradeBook1.displayGradeReport();


return 0;
}


/*
* GradeBook.h
*
* Created on: 07/feb/2012
* Author: andrea
*/

#include <string>
using namespace std;

class GradeBook{
private:
string courseName;
string instructorName;

int aCount;
int bCount;
int cCount;
int dCount;
int eCount;
int fCount;


public:
void setCourseName(string);
string getCourseName();


GradeBook(string);

void displayCourse();
void determineClassAverage();

void inputGrades();
void displayGradeReport();

};


/*
* GradeBook.cpp
*
* Created on: 07/feb/2012
* Author: andrea
*/

#include <iostream>
#include <cstdio>
#include "GradeBook.h"
using namespace std;


void GradeBook::setCourseName(string name)
{
if(name.length() <= 25) courseName = name;
else
{
courseName = name.substr(0,25);
cout << "Nome troppo lungo" << endl;
}
}

string GradeBook::getCourseName()
{
return courseName;
}
/*
void GradeBook::setInstructorName(string name)
{
instructorName = name;
}

string GradeBook::getInstructorName(){
return instructorName;
}
*/
GradeBook::GradeBook(string name)
{
setCourseName(name);
aCount = 0;
bCount = 0;
cCount = 0;
dCount = 0;
fCount = 0;
}

void GradeBook::displayCourse()
{
cout << getCourseName() << endl;
}

void GradeBook::determineClassAverage()
{
int gradeCounter = 1;
int total, grade;

total = 0;

while(gradeCounter<=10)
{
cout << "Enter grade: " << endl;
cin >> grade;
total = total + grade;
gradeCounter = gradeCounter +1;
}

cout << "The average is " << (total/10);
}
void GradeBook::inputGrades()
{
int grade;

cout << "Enter the Letter Grade: " << endl << "Enter the EOF character to end input " << endl;

while ((grade = cin.get()) != EOF){
switch (grade)
{
case 'a':
case 'A':
aCount++;
break;
case 'b':
case 'B':
bCount++;
break;
case 'c':
case 'C':
cCount++;
break;
case 'd':
case 'D':
dCount++;
break;
case 'e':
case 'E':
eCount++;
break;
case 'f':
case 'F':
fCount++;
break;
default:
cout << "Incorrect Letter Grade entered" << "\n Enter a new grade: " << endl;
break;
}
}


}

void GradeBook::displayGradeReport(){
cout << "\n\nNumber of students who received each Letter Grade:"
<< "\nA: " << aCount
<< "\nB: " << bCount
<< "\nC: " << cCount
<< "\nD: " << dCount
<< "\nE: " << eCount
<< "\nF: " << fCount
<< endl;
}





Questo è l'output

Nome troppo lungo
Il corso uno è troppo lu

Enter the Letter Grade:
Enter the EOF character to end input
a
Incorrect Letter Grade entered
Enter a new grade:
d
Incorrect Letter Grade entered
Enter a new grade:
a
Incorrect Letter Grade entered
Enter a new grade:
A
Incorrect Letter Grade entered
Enter a new grade:



:muro:

Perchè mi dice che anche caratteri come A e a sono sbagliati :confused:

Avete qualche idea ragazzi?

vendettaaaaa
07-02-2012, 13:36
Non ho il pc sotto mano ma grade è un int.
cin dovrebbe convertire il carattere immesso ad un int corrispondente tratto dalla tabella ASCII, ma poi case riconverte grade in char per il confronto?
Cmq se metti char grade è tutto molto più intuitivo e naturale, a prescindere che funzioni o no.

legolas93
07-02-2012, 14:20
Anche cambiando con Char il programma non funziona. Le istruzioni del blocco default vengono eseguite in ogni caso e non capisco perché. :(

vendettaaaaa
07-02-2012, 15:01
Anche cambiando con Char il programma non funziona. Le istruzioni del blocco default vengono eseguite in ogni caso e non capisco perché. :(
Ho fatto qualche prova.
Innanzitutto ho notato che col tuo programma se in input dai aaa, in una sola botta aCount va su di 3, verificato così:
default:
cout << "Incorrect Letter Grade entered " << aCount << " " << bCount << "\n Enter a new grade: " << endl;
// break;

Poi ho usato:
char grade
while (cin >> grade, grade != EOF)
ed ora funziona. Solo con char grade però, int grade manda tutto in loop. Ma non so quale carattere corrisponda a EOF quindi non so uscire :D

Cmq anch'io ho sbattuto la testa varie volte con cin, e ancora non ho imparato bene come usare >> e altre funzioni come get() o read().

vendettaaaaa
07-02-2012, 15:12
Inoltre qui la media la calcoli come divisione tra interi:
void GradeBook::determineClassAverage()
{
int gradeCounter = 1;
int total, grade;

total = 0;

while(gradeCounter<=10)
{
cout << "Enter grade: " << endl;
cin >> grade;
total = total + grade;
gradeCounter = gradeCounter +1;
}

cout << "The average is " << (total/10);
}

legolas93
07-02-2012, 15:23
Inoltre qui la media la calcoli come divisione tra interi:
void GradeBook::determineClassAverage()
{
int gradeCounter = 1;
int total, grade;

total = 0;

while(gradeCounter<=10)
{
cout << "Enter grade: " << endl;
cin >> grade;
total = total + grade;
gradeCounter = gradeCounter +1;
}

cout << "The average is " << (total/10);
}


Sisi lo so. Sto seguendo il Deitel e sto rifacendo a manina gli esempi. Sisi lo so che la vera media non si fa così! :) . Ora guardo il tuo esempio sopra ;)

vendettaaaaa
07-02-2012, 15:25
Ci sono:
tu inputti "a[invio]", e cin contiene proprio quei due caratteri.
La prima volta grade = 'a', la seconda volta non ti fa immettere il carattere e grade = '\n' perchè cin ha dentro un "rimasuglio". Per questo motivo quando prima scrivevo aaa[invio] aCount andava su di 3.
A quanto pare devi usare >> perchè quest'operatore scarta da solo il carattere '\n'

legolas93
07-02-2012, 15:26
Ho fatto qualche prova.
Innanzitutto ho notato che col tuo programma se in input dai aaa, in una sola botta aCount va su di 3, verificato così:
default:
cout << "Incorrect Letter Grade entered " << aCount << " " << bCount << "\n Enter a new grade: " << endl;
// break;

Poi ho usato:
char grade
while (cin >> grade, grade != EOF)
ed ora funziona. Solo con char grade però, int grade manda tutto in loop. Ma non so quale carattere corrisponda a EOF quindi non so uscire :D

Cmq anch'io ho sbattuto la testa varie volte con cin, e ancora non ho imparato bene come usare >> e altre funzioni come get() o read().

Yaaa :D..Avevo pensato anche io di farlo così. Solo che volevo capire perchè copiando l'esempio dal libro non funzionava. :muro:

Sono sicuro di non aver fatto errori di battitura quindi ad occhio direi che è il libro un po... :mbe:

Ora cerco da qualche parte come funziona il get()

Grazie!

PS: se avete qualche idea di cosa intenda il libro postate pure!

legolas93
07-02-2012, 15:31
Ci sono:
tu inputti "a[invio]", e cin contiene proprio quei due caratteri.
La prima volta grade = 'a', la seconda volta non ti fa immettere il carattere e grade = '\n' perchè cin ha dentro un "rimasuglio". Per questo motivo quando prima scrivevo aaa[invio] aCount andava su di 3.
A quanto pare devi usare >> perchè quest'operatore scarta da solo il carattere '\n'

Hai ragione perchè come detto qua:

http://www.cplusplus.com/reference/iostream/istream/get/

get() estrae un carattere per volta e penso che prenda anche i whitespace.

Ora guardo se sull'8 versione del Deitel hanno corretto sto errore.. :muro:

Grazie! ;)

legolas93
07-02-2012, 15:54
Hai ragione perchè come detto qua:

http://www.cplusplus.com/reference/iostream/istream/get/

get() estrae un carattere per volta e penso che prenda anche i whitespace.

Ora guardo se sull'8 versione del Deitel hanno corretto sto errore.. :muro:

Grazie! ;)

Dopo aver guardato anche la versione 8 e vedendo che il codice era uguale. Ho provato a fare qualche ricerca su internet e ho trovato questo su un forum inglese:

http://www.sysopt.com/forum/archive/index.php/t-157787.html

e io come lui non avevamo notato che tra i case c'era anche:

case '\n': // ignore newlines,
case '\t': // tabs,
case ' ': // and spaces in input
break; // exit switch

di modo che ignorasse i white space. :muro:

Che errore sciocco :read:

vendettaaaaa
07-02-2012, 16:02
Dopo aver guardato anche la versione 8 e vedendo che il codice era uguale. Ho provato a fare qualche ricerca su internet e ho trovato questo su un forum inglese:

http://www.sysopt.com/forum/archive/index.php/t-157787.html

e io come lui non avevamo notato che tra i case c'era anche:

case '\n': // ignore newlines,
case '\t': // tabs,
case ' ': // and spaces in input
break; // exit switch

di modo che ignorasse i white space. :muro:

Che errore sciocco :read:
:fagiano:
Cmq anche con cin >> grade se scrivi aaa[invio] aCount va su di 3. Per questi esercizi va bene ma in un programma serio ci vuole un controllo serio dell'input mi sa.

legolas93
07-02-2012, 17:55
:fagiano:
Cmq anche con cin >> grade se scrivi aaa[invio] aCount va su di 3. Per questi esercizi va bene ma in un programma serio ci vuole un controllo serio dell'input mi sa.

Sisi.. I know :)


Questo era solo un esercizio per far vedere come funzionava lo Switch.

Dai che prima o poi arriverò a fare qualcosa di seriooo :Prrr:

Mi manca ancora qualcosa come 800 pagine più tutta l'esperienza sul campo :read:

vendettaaaaa
07-02-2012, 19:53
Ah, a me 200 pagine di un libro, 1200 di un altro solo per il C++
Poi ci sono i libri sulle Qt...e l'esperienza sul campo :read: