7. 구조체를 이용한 성적 관리프로그램
7. 구조체를 이용한 성적 관리프로그램
---> 6번을 구조체로 변형하였다. ctrl+C과 ctrl+V의 합작품
초점 : 구조체에 대한 이해를 하고 있는지 테스트.
#include <stdio.h>
#define MAX 10
/*학생들의 점수정보를 저장하기위한 구조체 정의*/
struct stn_info{
char stnName[MAX][MAX];
int eng[MAX], math[MAX], kor[MAX];
int totalMark[MAX], grade[MAX];
float average[MAX];
double total[5];
};
/*초기화 함수*/
void init(stn_info* ptrstnInfo)
{
for(int cnt=0; cnt<MAX; cnt++)
{
ptrstnInfo->eng[cnt]=-1;
ptrstnInfo->math[cnt]=-1;
ptrstnInfo->kor[cnt]=-1;
}
}
/*입력 함수*/
void input(stn_info* ptrstnInfo)
{
printf("============= 성적 처리 프로그램===============nn");
//총 열개의 배열까지 저장할 수 있는 루프
for(int cnt=0; cnt<MAX; cnt++)
{
char *ptr = ptrstnInfo->stnName[cnt];
flushall(); //버퍼를 비움
printf("$%d.-------------------------$n이름을 입력하시오.t", cnt+1);
gets(ptrstnInfo->stnName[cnt]);
/*'x' 나 'exit'를 입력할 시 루프를 빠져 나감*/
if((ptrstnInfo->stnName[cnt][0]=='x') || (*ptr=='e' && *(ptr+1) == 'x' && *(ptr+2) == 'i' && *(ptr+3) == 't')) break;
printf("영어성적을 입력하시오.t");
scanf("%d", &ptrstnInfo->eng[cnt]);
printf("수학성적을 입력하시오.t");
scanf("%d", &ptrstnInfo->math[cnt]);
printf("국어성적을 입력하시오.t");
scanf("%d", &ptrstnInfo->kor[cnt]);
printf("n");
}
printf("n");
}
/*출력 함수*/
void output(stn_info* ptrstnInfo)
{
int cnt;
printf("이름t영어t수학t국어t총점t평균t석차");
printf("n=====================================================n");
for(cnt=0; ptrstnInfo->eng[cnt] != -1; cnt++)
{
/*평균점수가 60점 미만일 경우 석차란에 "과락"이라고 표시한다.*/
if(ptrstnInfo->average[cnt]<60){
printf("%st%dt%dt%dt%dt%.2ft과락n", ptrstnInfo->stnName[cnt], ptrstnInfo->eng[cnt],
ptrstnInfo->math[cnt], ptrstnInfo->kor[cnt], ptrstnInfo->totalMark[cnt], ptrstnInfo->average[cnt],
ptrstnInfo->grade[cnt]);
}
else{
printf("%st%dt%dt%dt%dt%.2ft%dn", ptrstnInfo->stnName[cnt], ptrstnInfo->eng[cnt],
ptrstnInfo->math[cnt], ptrstnInfo->kor[cnt], ptrstnInfo->totalMark[cnt], ptrstnInfo->average[cnt],
ptrstnInfo->grade[cnt]);
}
}
printf("인원t총평균t총평균t총평균t합t총평균n");
printf("%dt%.2ft%.2ft%.2ft%dt%.2fn", cnt, ptrstnInfo->total[0], ptrstnInfo->total[1], ptrstnInfo->total[2], (int)ptrstnInfo->total[3], ptrstnInfo->total[4]);
}
/*총점 함수*/
int total_Mark(stn_info* ptrstnInfo)
{
for(int i=0; i<MAX; i++)
ptrstnInfo->totalMark[i] = -1;
for(int cnt=0; ptrstnInfo->eng[cnt] != -1; cnt++){
ptrstnInfo->totalMark[cnt] = ptrstnInfo->eng[cnt] + ptrstnInfo->math[cnt] + ptrstnInfo->kor[cnt] ;
}
return cnt-1;
}
/*평균 함수*/
void single_average(stn_info *ptrstnInfo)
{
for(int cnt=0; ptrstnInfo->eng[cnt] != -1; cnt++)
ptrstnInfo->average[cnt] = (float)ptrstnInfo->totalMark[cnt]/3;
}
/*교환 함수*/
void exchange_sort(stn_info *ptrstnInfo, int i, int j)
{
int temp,k;
float tempFloat;
char tempChar[MAX];
temp = ptrstnInfo->totalMark[i]; //총점
ptrstnInfo->totalMark[i] = ptrstnInfo->totalMark[j];
ptrstnInfo->totalMark[j] = temp;
temp = ptrstnInfo->eng[i]; //영어
ptrstnInfo->eng[i] = ptrstnInfo->eng[j];
ptrstnInfo->eng[j] = temp;
temp = ptrstnInfo->math[i]; //수학
ptrstnInfo->math[i] = ptrstnInfo->math[j];
ptrstnInfo->math[j] = temp;
temp = ptrstnInfo->kor[i]; //국어
ptrstnInfo->kor[i] = ptrstnInfo->kor[j];
ptrstnInfo->kor[j] = temp;
tempFloat = ptrstnInfo->average[i]; //평균
ptrstnInfo->average[i] = ptrstnInfo->average[j];
ptrstnInfo->average[j] = tempFloat;
for(k=0; k<MAX; k++){ //이름
tempChar[k] = ptrstnInfo->stnName[i][k];
ptrstnInfo->stnName[i][k]=ptrstnInfo->stnName[j][k];
ptrstnInfo->stnName[j][k] = tempChar[k];
}
}
/*석차, 정렬 함수*/
void grade_Mark(stn_info *ptrstnInfo)
{
int check, i, j, k;
/*배열에 저장되어진 인덱스 값을 알기위함*/
for(check=0; check<MAX; check++)
if(ptrstnInfo->totalMark[check]==-1) break;
/*총점을 기준으로 정렬 / 동점일 경우 이름으로 오름차순 정렬----->교환정렬*/
for(i=0; i<check-1; i++){
for(j=i+1; j<check; j++){
if(ptrstnInfo->totalMark[i]<=ptrstnInfo->totalMark[j]) //총점이 작거나 동일할 경우
{
if(ptrstnInfo->totalMark[i]<ptrstnInfo->totalMark[j]) //1. 총점을 기준으로 내림차순 정렬
exchange_sort(ptrstnInfo, i, j);
else{ //2. 총점이 동점일 경우 이름순 오름차순 정렬
if(ptrstnInfo->stnName[i][0] > ptrstnInfo->stnName[j][0])
exchange_sort(ptrstnInfo, i, j);
}
}
}
}
/*동점일 경우 석차를 같게 함*/
for(k=0; k<check; k++)
{
if(ptrstnInfo->totalMark[k] != ptrstnInfo->totalMark[k+1])
ptrstnInfo->grade[k] = k +1;
else if(ptrstnInfo->totalMark[k] == ptrstnInfo->totalMark[k+1]) {
ptrstnInfo->grade[k] = k +1;
ptrstnInfo->grade[k+1] = k +1;
k++;
}
}
}
/*마지막 리스트 열*/
void total_list(stn_info* ptrstnInfo)
{
int i; //i-1이 총인원수가 된다.
for(int x=0; x<5; x++)
ptrstnInfo->total[x] = 0.0;
for(i=0; ptrstnInfo->eng[i]!=-1; i++)
{
ptrstnInfo->total[0] += ptrstnInfo->eng[i]; //영어 총합
ptrstnInfo->total[1] += ptrstnInfo->math[i]; //수학 총합
ptrstnInfo->total[2] += ptrstnInfo->kor[i]; //국어 총합
ptrstnInfo->total[3] += ptrstnInfo->totalMark[i]; //총점의 합
ptrstnInfo->total[4] += ptrstnInfo->average[i];
}
/*영어 총평균, 수학 총평균, 국어 총평균을 각각 구함*/
ptrstnInfo->total[0] /= i;
ptrstnInfo->total[1] /= i;
ptrstnInfo->total[2] /= i;
ptrstnInfo->total[4] /= i;
}
/*메인 함수*/
int main()
{
struct stn_info stnInfo; //stn_info구조체 생성
struct stn_info *ptrstnInfo; //stn_info구조체 포인터 정의
int arrayNull;
ptrstnInfo = &stnInfo; //구조체 포인터 초기화
init(ptrstnInfo);
input(ptrstnInfo);
arrayNull = total_Mark(ptrstnInfo);
single_average(ptrstnInfo);
grade_Mark(ptrstnInfo);
total_list(ptrstnInfo);
output(ptrstnInfo);
return 0;
}
