엠클로즈

" 성적관리프로그램 "에 해당되는 글 1건

  1. 7. 구조체를 이용한 성적 관리프로그램

7. 구조체를 이용한 성적 관리프로그램


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;

}

2008/08/21 11:55 2008/08/21 11:55
top

Leave a comment..