성적처리프로그램 질문

조회수 973회

제가 복수전공을 하는데 아무것도 모르는데 2학년 전공을 신청해서 수업을 듣고 있거든요..

과제로 학생 성적 처리 프로그램이 나왔는데 인터넷 보면서 하다가 안되는 게 있어서요

핵생 수랑 과목수를 동적으로 입력받고 출력하는 건데 학생수는 넘어가지는데 자꾸 교과목 칠때 터미널에

서 나가지네요.. 해결 하는 방법 없을까요??

#include<iomanip>
#include<iostream>
#include<cstring>
using namespace std;


struct Subject
{
    char SubName[30];
    int Hakjum;
    char Grade[10];
    float GPA;
};
struct Student
{
    char StdName[30];
    int Hakbun;
    Subject *Sub;
    int SubNum;
    float AveGPA;
};


int menu = 0;
int StudentNum;

inline void PrintMenu();
void CalcGPA(Subject& Sub);
float CalcAveGPA(Subject* Sub);
void PrintAllData(const Student* pSt, int StudentNum);
void PrintOneData(const Student& rSt);
Student* StdSearch(Student* pSt, int StudentNum);


inline void InputValue(char* str);
inline void InputValue(int& i);
void PrintAllStdList(const Student* pSt, int StudentNum);
void ModifyStdInfo(Student* pSt);
void InputData(Student *pSt, int StudentNum);


inline void InputValue(char* str)
{
    cin >> str;
}
inline void InputValue(int& i)
{
    cin >> i;
}


int main()
{
    cout<<"학생 수를 입력하세요 : ";
    cin>>StudentNum;

    do
    {
        PrintMenu();
        Student *St=new Student[StudentNum];
        if (menu == 1)
        {
         for(int i=0;i<StudentNum;i++)
            {
                InputData(St,StudentNum);
                St[i].AveGPA = CalcAveGPA(St[i].Sub);
            }

            cout << endl;

        }
        else if (menu == 2)
        {
            PrintAllData(St, StudentNum);
            cout << endl;
        }
        else if (menu == 3)
        {
            Student* SearchStd;
            SearchStd = StdSearch(St, StudentNum);

            if (SearchStd != NULL) 
               { 
                   PrintOneData(*SearchStd);
               }
        }
        else if (menu == 4)
        {
            PrintAllStdList(St,StudentNum);
            cout << endl;
        }
        else if (menu == 5)
        {
            ModifyStdInfo(StdSearch(St,StudentNum));
                cout << endl;
        }
        else if (menu == 6)
        {
            cout << "프로그램을 종료합니다." << endl;
            delete St;
            return 0;
        }
        else
        {
            cout << "올바른 메뉴입력이 아닙니다." << endl;
            cout << "프로그램을 종료합니다." << endl;
            delete St;
            return 0;
        }
    } while (1);
}


void PrintMenu()
{
    cout << endl << "===== 메뉴 =====" << endl;
    cout << "1. 학생 성적 입력" << endl;
    cout << "2. 전체 학생 성적 보기" << endl;
    cout << "3. 학생 이름 검색" << endl;
    cout << "4. 전체 학생 목록 보기" <<  endl;
    cout << "5. 학생 정보 수정" << endl;
    cout << "6. 프로그램 종료" << endl;
    cout << endl;
    cout << "원하는 기능을 입력하세요 : ";
    cin >> menu;
}


void InputData(Student *pSt, int StudentNum)
{
    for(int i=1;i<StudentNum;i++)
    {
        cout << "*"<< i<<"번째 학생 이름과 학번을 입력하세요." << endl;
        cout << "이름 : ";
        cin >> pSt->StdName;
        cout << endl << "학번 : ";
        cin >> pSt->Hakbun;
        cout<<"과목수 : ";
        cin>>pSt->SubNum;
        cout << endl << "* 수강한 과목"<< pSt->SubNum << "개와 각 교과목명, 과목학점, 과목 등급을 입력하세요." << endl;

        Subject* stsub = new Subject[pSt->SubNum];

        for(int j=0;j<pSt->SubNum;j++)
        {
            cout << endl << "교과목명 : ";
            cin >> pSt->Sub[i].SubName;
            cout << endl << "과목학점수 : ";
            cin >> pSt->Sub[i].Hakjum;
            cout << endl << "과목등급(A+~F) : ";
            cin >> pSt->Sub[i].Grade;

            CalcGPA(pSt->Sub[i]);
        }
    }
}


void CalcGPA(Subject& Sub)
{
    if (strcmp(Sub.Grade, "A+") == 0)
    {
        Sub.GPA = (float)Sub.Hakjum * 4.50;
    }
    else if (strcmp(Sub.Grade, "A0") == 0 || strcmp(Sub.Grade, "A") == 0)
    {
        Sub.GPA = (float)Sub.Hakjum * 4.00;
    }
    else if (strcmp(Sub.Grade, "B+") == 0)
    {
        Sub.GPA = (float)Sub.Hakjum * 3.50;
    }
    else if (strcmp(Sub.Grade, "B0") == 0 || strcmp(Sub.Grade, "B") == 0)
    {
        Sub.GPA = (float)Sub.Hakjum * 3.00;
    }
    else if (strcmp(Sub.Grade, "C+") == 0)
    {
        Sub.GPA = (float)Sub.Hakjum * 2.50;
    }
    else if (strcmp(Sub.Grade, "C0") == 0 || strcmp(Sub.Grade, "C") == 0)
    {
        Sub.GPA = (float)Sub.Hakjum * 2.00;
    }
    else if (strcmp(Sub.Grade, "D+") == 0)
    {
        Sub.GPA = (float)Sub.Hakjum * 1.50;
    }
    else if (strcmp(Sub.Grade, "D0") == 0 || strcmp(Sub.Grade, "D") == 0)
    {
        Sub.GPA = (float)Sub.Hakjum * 1.00;
    }
    else if (strcmp(Sub.Grade, "F") == 0)
    {
        Sub.GPA = (float)Sub.Hakjum * 0.00;
    }

}


float CalcAveGPA(Subject* Sub)
{
    float sum = 0;
    for (int i = 0; i < 3; i++)
    {
        sum += Sub[i].GPA;
    }

    return  sum / 3;
}


void PrintAllData(const Student* pSt, int StudentNum)
{
    cout << setw(37) << "전체 학생 성적 보기" << endl;
    cout << setw(56) << setfill('=') << ' ' << setfill(' ') << endl;
    for (int i = 0; i < StudentNum; i++)
    {
        PrintOneData(pSt[i]);
    }
}


void PrintOneData(const Student& rSt)
{
    cout << "이름 : " << rSt.StdName << setw(10) << "학번 : " << rSt.Hakbun << endl;
    cout << "============================================= " << endl;
    cout.width(15);
    cout << "과목명" << setw(10) << "과목학점" << setw(10) << "과목등급" << setw(10) << "과목평점" << endl;
    cout << "============================================= " << endl;
    for (int i = 0; i < 3; i++)
    {
        cout.width(10);
        cout << fixed;
        cout.precision(2);


        cout << rSt.Sub[i].SubName << setw(10) << rSt.Sub[i].Hakjum << setw(10) << rSt.Sub[i].Grade << setw(10) << rSt.Sub[i].GPA << endl;
    }
    cout << "============================================= " << endl;
    cout.width(10);
    cout << fixed;
    cout.precision(2);

    cout << "평균 평점" << rSt.AveGPA << endl;
}


Student* StdSearch(Student* pSt, int StudentNum)
{
    char name[40];

    cout << endl << "검색할 학생 이름 : ";
    cin >> name;

    for (int i = 0; i < StudentNum; i++)
    {
        for (int j = 0; j < strlen(name) && pSt[i].StdName[j] == name[j] && strlen(name) == strlen(pSt[i].StdName); j++)
        {
            if (j == strlen(name) - 1)
                return &pSt[i];
        }
    }
    return NULL;
}


void PrintAllStdList(const Student* pSt, int StudentNum )
{
    cout << "==================================" << endl;
    cout << setw(10) << "학번" << setw(10) << "이름" << endl;
    cout << "==================================" << endl;

    for (int i = 0; i < StudentNum; i++)
    {
        cout << setw(10) << pSt[i].StdName << setw(7) << pSt[i].Hakbun << endl;
    }
    cout << "==================================" << endl;
}


void ModifyStdInfo(Student* pSt)
{
    cout << "* <" << pSt->StdName << "," << pSt->Hakbun << ">의 정보를 수정하세요." << endl;
    cout << "이름 :";
    InputValue(pSt->StdName);
    cout << "학번 :";
    InputValue(pSt->Hakbun);
}
  • 맙소사...본인은 답변이 절실할 수도 있겠지만...질문하시는 분께서는 사람들이 이걸 읽을 수는 있다고 올리신 걸까요...? 질문글 올리는 가이드 꼭 참조해주셔서 질문해주시고, 부디 깊이 생각하시고 질문을 올려주세요. 어떤 과목을 공부 중인데 갑자기 이해가 안 되는 부분이 있다처럼 콕 짚어주셔야 답변이 자세해져요 :) 임지훈 2021.4.27 20:06
  • 맙소사2 nowp 2021.4.29 09:06

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)