티스토리 뷰

C/Console

학생관리 기록부

고기상추밥 2018. 11. 11. 09:03
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
//c 라이브러리 입니다.
//입출력에관한 유용한 함수들이 있습니다.
#include <stdio.h>
 
//C에는 bool 타입이 없습니다
//C99 부터 추가된 bool 변수가있는 라이브러리입니다
//bool 변수를 선언해주기위해서 stdboo.h 라이브러리를 추가합니다.
#include <stdbool.h>
 
//학생들의 점수를 관리하는 프로그램을 짜보겠습니다.
//이름 수학 영어 국어 점수를 입력받아서 저장한후
//평균을 구해서 내림차순으로 정렬이 되게하겠습니다.
//등급을 A B C 로 나누고 D부터 탈락으로 하겠습니다.
//총 학생의 수는 5명으로 하겠습니다
 
//학생을 저장할 배열의 크기 입니다
#define SIZE 5
//이름의 크기를 저장할 배열의 크기 입니다
#define NAME_SIZE 20
 
//학생들의 정보를 저장하고있을 구조체 입니다.
//typedef로 이름을 변경해주겠습니다
//C의 구조체는 C++와 다르게
//구조체 내부에서 변수를 초기화하거나 함수를 선언/정의 할수없습니다.
typedef struct _tagStudent
{
    //이름을 저장할 배열
    char strName[NAME_SIZE];
    //수학점수
    int iMath;
    //영어 점수
    int iEnglish;
    //국어점수
    int iKorean;
    //평균
    float fAvg;
    //등급
    char cGrade;
    //통과판정 변수
    bool bPass;
    //통과출력 변수
    const char* strPass;
 
}STUDENT, *PSTUDENT;
 
//학생 5명을 전역 변수로 선언하겠습니다.
STUDENT g_tStudentArr[SIZE] = { 0 };
//배열의 현재 인덱스를 저장하는 변수 입니다.
int g_iIndex = 0;
 
//학생들의 정보를 추가하는 함수 입니다.
void Insert();
//실행하면 학생들의 점수를 토대로 등급을 매겨줍니다
void Grade();
//실행하면 학생들의 등급을 보고 패스여부를 결정지어 줍니다
void Pass();
//내림자순으로 정렬할 정렬 함수 입니다.
void Sort();
//학생들의 찾아내서 보여줍니다올 나타냅니다
void Search(int index);
//학생들을 출력해줍니다
void List();
//메인함수 입니다.
int main()
{
    //Insert 함수를 실행합니다
    for (int i = 0; i < SIZE; ++i)
    {
        printf("%d. ", i+1);
        Insert();
    }
    //학생들을 출력합니다
    List();
 
    return 0;
// 메인함수의 종료
 
//구현부 입니다
void Insert()
{
    //입력을 추가하기전 학생의 목록이 만땅이면 함수를 탈출합니다
    if (g_iIndex >= SIZE)
    {
        printf("학생을 더이상 추가할수 없습니다.\n");
        return;
    }
 
    //지역번수를 선언해줍니다
    PSTUDENT pStudent = g_tStudentArr;
    int* const pIndex = &g_iIndex;
    const int iIndex = *pIndex;
 
    //이름을 입력 받습니다.
    printf("학생의 이름을 입력하세요. \n");
    scanf("%s"&pStudent[iIndex].strName);
 
    //수학점수를 입력받습니다.
    printf("수학점수를 입력하세요. \n");
    scanf("%d"&pStudent[iIndex].iMath);
 
    //영어점수를 입력받습니다.
    printf("영어점수를 입력하세요. \n");
    scanf("%d"&pStudent[iIndex].iEnglish);
 
    //국어점수를 입력받습니다.
    printf("국어점수를 입력하세요. \n");
    scanf("%d"&pStudent[iIndex].iKorean);
 
    //평균을 계산합니다
    pStudent[iIndex].fAvg = (pStudent[iIndex].iMath +
        pStudent[iIndex].iEnglish +
        pStudent[iIndex].iKorean) / 3.f;
 
    //등급함수를 실행해서 학생들의 등급을 매깁니다
    Grade();
    //패스 여부를 판단해주는 함수입니다
    Pass();
 
    //모든 입력이 완료되면 인덱스를 1개 추가해줍니다
    ++*pIndex;
 
    //정렬을 해주는 함수입니다.
    Sort();    
 
}
 
void Grade()
{
    //지역번수를 선언해줍니다
    PSTUDENT pStudent = g_tStudentArr;
    const int iIndex = g_iIndex;
    const float fAvg = pStudent[iIndex].fAvg;
 
    if (fAvg >= 90.f)
        pStudent[iIndex].cGrade = 'A';
    else if (fAvg >= 80.f)
        pStudent[iIndex].cGrade = 'B';
    else if (fAvg >= 70.f)
        pStudent[iIndex].cGrade = 'C';
    else if (fAvg >= 60.f)
        pStudent[iIndex].cGrade = 'D';
    else
        pStudent[iIndex].cGrade = 'F';
}
 
void Pass()
{
    //지역번수를 선언해줍니다
    PSTUDENT pStudent = g_tStudentArr;
    const int iIndex = g_iIndex;
    const char cGrade = pStudent[iIndex].cGrade;
 
    if (cGrade == 'D' || cGrade == 'F')
        pStudent[iIndex].bPass = false;
    else
        pStudent[iIndex].bPass = true;
 
    const bool bPass = pStudent[iIndex].bPass;
 
    switch(bPass)
    {
        case true:
            pStudent[iIndex].strPass = "합격";
            break;
        case false:
            pStudent[iIndex].strPass = "불합격";
            break;
    }
}
 
void Sort()
{
    //학생배열의 주소를 저장해 둡니다.
    PSTUDENT pStudent = g_tStudentArr;
    const int iSize = g_iIndex;
 
    //임시저장 변수
    STUDENT tTemp = { 0 };
 
    //정렬검사를 시작합니다
    //제일 처음과 마지막에서 - 1 까지 검사합니다
    for (int i = 0; i < iSize - 1++i)
    {
        for (int j = i + 1; j < iSize; ++j)
        {
            //앞에 학생의 평균이 뒤에 학생의 평균보다 작으면 서로 바꿉니다
            //내림차순 정렬
            if (pStudent[i].fAvg < pStudent[j].fAvg)
            {
                tTemp = pStudent[i];
                pStudent[i] = pStudent[j];
                pStudent[j] = tTemp;
            }
        }
    }
}
void Search(int index)
{
    //학생배열의 주소를 저장해 둡니다.
    const PSTUDENT pStudent = g_tStudentArr;
    const int iIndex = index;
 
    printf("이름 : %s\t수학 : %d\t영어 : %d\t국어 : %d\t평균 : %.2f\t등급 : %c\t결과 : %s\n"
        pStudent[iIndex].strName,
        pStudent[iIndex].iMath,
        pStudent[iIndex].iEnglish,
        pStudent[iIndex].iKorean,
        pStudent[iIndex].fAvg,
        pStudent[iIndex].cGrade,
        pStudent[iIndex].strPass);
}
 
void List()
{
    const int iSize = g_iIndex;
    printf("================ 학 생 기 록 부 ================\n");
    for(int i = 0; i < iSize;++i)
    {
        Search(i);
    }    
    printf("================================================\n");
}
cs


프로그램 작성후 느낀점

문자열을 입력력받을때

사용자가 엉뚱한 값을 입력할때 예외처리에 대비하는

코드를 강화하는게 좋을것 같습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함