开发者

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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜