C++ Problem inputting with cin
In the following code i'm having trouble with cin. The first cin performs fine, but the second doesn't receive input at all. I've tried cin.clear() to clear the input stream, but it doesn't help. Which from what I understand is the norm with cin issues.
#include <iostream>
#include <string>
#include "StudentGradeInfo.h"
using namespace std;
const int MAX_NUM_GRADES=10;
const int MAX_NUM_STUDENTS=50;
const int STUD_ID_LENGTH=12;
int main(){
char choice=' '; //First user choice
char choice_2=' '; //second user choice
string newStudentMajor; //User inputted student major
string studLastName; //User inputted last name
int newStudentID; //User inputted student ID
int studGrade; //User inputted student grade
int studentCounter=0; //variable to count number of students
//Allocating dynamic memory for MAX_NUM_STUDENTS student objects
StudentGradeInfo *students=new StudentGradeInfo[MAX_NUM_STUDENTS];
cout<<"Welcome to GradeBook, this program stores students"
<<" grades by last name. To ADD a student press the 'A'"
<<" key. To LIST all students, press the 'L' key. To "
<<" QUIT, press the 'Q' key."<<endl<<endl;
cin>>choice;
choice=toupper(choice);
while(choice!='Q') //While user does not decide to quit
{
if(choice=='A'&& studentCounter<MAX_NUM_STUDENTS){ //If user chooses to ADD
cout<<"\nTo add a student, please enter their last name"
<<" followed by a space and a non-negative grade"
<<" Ex. Arthur 96"<<endl<<endl;
cin>>studLastName>>studGrade; //this cin works fine and using the
//debugger I find that they contain
//the correct values
cout<<cin.peek(); //Looking for chars left in input stream
const char *charLastName=studLastName.c_str();
int lastNameLength=studLastName.length();
//Assign name to student object
students[studentCounter].SetStudentName(charLastName, lastNameLength);
//Set Test Grade for student object
students[studentCounter].SetStudentTestGrade(studGrade);
cout<<"\nPlease enter the "<<STUD_ID_LENGTH<<"-digit Student ID followed by "
<<"a space, then enter the student's major (Ex. 123456789012 Math)"<<endl;
cin.clear();
cin>>newStudentID>>newStudentMajor; //User input
cout<<newStudentID<<" "<<newStudentMajor;
cout<<cin.peek(); //Checking for chars left in input stream
//Adding ID and Major to students object.
students[studentCounter].SetStudentID(newStudentID);
students[studentCounter].SetStudentMajor(newStudentMajor);
cout<<students[studentCounter].GetStudentID();
cout<<"\nWould you like to enter more grades for this "
<<"student? If yes, ple开发者_高级运维ase enter 'Y', if no, "
<<"enter 'N'"<<endl;
cin>>choice_2;
choice_2=toupper(choice_2); //Upper-case conversion
while(choice_2!='N'){
if(choice_2=='Y'){
cout<<"\nPlease enter a grade followed by pressing "
<<"enter.\n";
for(int i=0;i<MAX_NUM_GRADES;i++){ //Inputting grades for individual
cin>>studGrade; //student
if(studGrade==-1) //Condition for premature loop exit
break;
students[studentCounter].SetStudentTestGrade(studGrade); //Add Grade
cout<<"\nWould you like to add another grade? "
<<"If so, enter the next grade. Otherwise"
<<" enter -1 to return to the menu"<<endl;
}
cout<<"This student currently has the maximum number of grades. \n";
break;
}//If answer yes is chosen
else if(choice_2!='N'&& choice_2!='Y'){ //If wrong character is input
cout<<"\nPlease enter either 'Y' or 'N'"<<endl;
cin>>choice_2;
choice_2=toupper(choice_2); //Upper-case conversion
}
}//While choice_2!='N'
students[studentCounter].SortStudentID(students);
studentCounter++; //Incrementing studentCounter after all possible changes have
//been made to that student
}
else if(choice=='L'){ //If user decides to list
cout<<"GRADEBOOK \n------------------------------\n";
for(int i=0; i<studentCounter; i++){ //Such a better solution than last gradebook
cout<<"\nentering list loop \n";
cout<<students[i]; //Overloaded insertion operator, outputs all student information
}
}
else if(choice!='Q') //If user inputs invalid character
cout<<"Your letter is invalid, please enter another letter"<<endl<<endl;
cout<<"\nTo ADD a student press the 'A' key. To LIST all students, press the 'L' key. "
<<" To QUIT, press the 'Q' key."<<endl<<endl;
cin>>choice;
choice=toupper(choice); //Upper-case conversion
}
}
StudentInfo.cpp
#include <iostream>
#include <string>
#include "StudentInfo.h"
using namespace std;
const int STUDENT_ID_LENGTH=12;
//default constructor
StudentInfo::StudentInfo()
{
}
//Parameterized constructor
StudentInfo::StudentInfo(string newStudentName, int newStudentID, string newStudentMajor)
{
int nameLength=newStudentName.length();
char *nameArray=new char[nameLength];
SetStudentName(nameArray, nameLength);
SetStudentID(newStudentID);
SetStudentMajor(newStudentMajor);
}
StudentInfo::~StudentInfo() //Destructor
{
delete[] studentName; //deallocating dynamic memory
}
//Member functions for initializing and displaying private data
//pre: array of characters and a positive int for nameLength
//post: studentName contains name of new student
void StudentInfo::SetStudentName(const char newStudentName[], int lastNameLength)
{
char *studentName=new char[lastNameLength];
for(int i=0; i<lastNameLength; i++){
studentName[i]=newStudentName[i];
}
}
//post: Returns name of student
string StudentInfo::GetStudentName() const
{
return studentName;
}
//pre: positive integer input
//post: studentID contains newStudentID or msg is displayed that ID is invalid
void StudentInfo::SetStudentID(int newStudentID)
{
double new_ID;
int divisionsCount=0;
new_ID=newStudentID;
while(new_ID>1){
new_ID=new_ID/10;
divisionsCount++;
}
if(divisionsCount!=STUDENT_ID_LENGTH){
cout<<"ID is not "<<STUDENT_ID_LENGTH<<" characters long\n";
return;
}
studentID=newStudentID;
}
//pre: valid integer for studentID
//post: returns integer to caller
int StudentInfo::GetStudentID() const
{
return studentID;
}
//pre: String type of student Major and newStudentMajor
//post: studentMajor contains newStudentMajor string
void StudentInfo::SetStudentMajor(string newStudentMajor)
{
studentMajor=newStudentMajor;
}
//post: returns string studentMajor
string StudentInfo::GetStudentMajor() const
{
return studentMajor;
StudentGradeInfo.cpp
#include <string> //including string data type
#include <iostream>
#include "StudentGradeInfo.h"
using namespace std;
StudentGradeInfo::StudentGradeInfo():StudentInfo()
{
//StudentInfo::StudentInfo();
gradeCounter=0;
}
//Parameterized Constructor
StudentGradeInfo::StudentGradeInfo(string &newStudentName, int &newStudentID,
string &newStudentMajor, int newTestGrade, double newtestAverage, int newGradeCounter):
StudentInfo(newStudentName, newStudentID, newStudentMajor)
{
gradeCounter=0;
SetStudentTestGrade(newTestGrade);
}
//pre: positive integer input
//post: testGrade contains newTestGrade or msg is displayed that the score is invalid or contains max # of grades
void StudentGradeInfo::SetStudentTestGrade(int newTestGrade)
{
/* if(gradeCounter>MAX_NUM_GRADES){ //If the maximum number of grades has been reached
cout<<"\nThis student currently has the maximum number of grades."; //Inform user
return; //Leave function and not assign input grade
}*/
testGrade[gradeCounter]=(newTestGrade > 0 && newTestGrade<=100) ? newTestGrade : -1; //Grade assignment
if(testGrade[gradeCounter]!=-1) //and validity testing
gradeCounter++; //Increment number of grades this student has
else
cout<<endl<<testGrade[gradeCounter]<<" is not a valid score.\n"; //Inform user which score was invalid
}
//pre: positive integer
//post: returns testGrade found in that array
int StudentGradeInfo::GetStudentTestGrade(int gradeNum) const
{
if(gradeNum>=0 && gradeNum<=MAX_NUM_GRADES) //If gradeNum is a valid grade and not stepping off of array
return testGrade[gradeNum];
else
return 0;
}
//post: testAverage is calculated
void StudentGradeInfo::SetTestAverage()
{
int num_Sum;
for(int i=0;i<gradeCounter;i++)
num_Sum+=testGrade[i]; //summing total grades
testAverage=(num_Sum/(gradeCounter+1)); //Calculating average
}
//post: returns calculated testAverage double
double StudentGradeInfo::GetTestAverage()
{
SetTestAverage();
return testAverage;
}
//pre: initialized StudentGradeInfo object array
//post: Students are sorted by studentID
void StudentGradeInfo::SortStudentID(StudentGradeInfo newStudent[])
{
int tempValue;
while(IDSorted(newStudent)!=true){ //If students are not sorted
for(int i=0; i<(gradeCounter-1); i++){
//Determining if these two students need switched
if(newStudent[i].GetStudentID()<=newStudent[i+1].GetStudentID())
continue; //If they don't need switched, continue
else{ //Otherwise switch the two students
tempValue=newStudent[i+1].GetStudentID();
newStudent[i+1].SetStudentID(newStudent[i].GetStudentID());
newStudent[i].SetStudentID(tempValue);
}
}
}
}
//pre: initialized StudentGradeInfo object array
//post: returns true if newStudent array has been sorted by studentID, false otherwise
bool StudentGradeInfo::IDSorted(StudentGradeInfo newStudent[])
{
for(int i=0; i<(gradeCounter-1);i++){ //Determining if array is sorted from smallest to largest
if(newStudent[i].GetStudentID()<=newStudent[i+1].GetStudentID())
continue;
else
return false;
}
return true;
}
//Overloaded insertion operator to output entire students information
ostream &operator<<(ostream &output, StudentGradeInfo &newStudent)
{
output<<"This is the student major: "<<newStudent.GetStudentMajor();
output<<"__________________________________\n"
<<"Name: "<<newStudent.GetStudentName()<<"\nID: "<<newStudent.GetStudentID() //outputs studentID and name
<<"\nMajor: "<<newStudent.GetStudentMajor()<<"\nGrades: "; //outputs studentMajor
for(int i=0;i<newStudent.gradeCounter;i++)
output<<newStudent.testGrade[i]<<" "; //outputs studentGrade's
output<<"Grade Average: "<<newStudent.GetTestAverage();
return output;
}
bool operator==(StudentGradeInfo &newStudent_One, StudentGradeInfo &newStudent_Two)
{
if(newStudent_One==newStudent_Two) //testing for equality
return true;
else
return false;
}
}
Thanks in advance
Your student ID is 12 digits long. No 12-digit decimal value fits in a 32-bit integer. Try storing it in a string instead.
精彩评论