'성적관리'에 해당되는 글 1건

  1. 2009.03.26 성적관리 프로그램 결정판(?)
C/C++2009. 3. 26. 22:04

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 10
#define FPATH "D:\\test.txt"


struct Student {     
 int ID;
 int Kor,Eng,Math;
 int Sum;
 float Avg;
 char name[12];
 char grand[3];
};

void Input_detail(struct Student ST[MAX], int i){
 printf("%d번째 학생의 ID : %d\n",i+1,ST[i].ID);
 printf("학생의 이름 : ");
 fflush(stdin);
 scanf("%s",&ST[i].name);
 printf("학생의 국어 성적 : ");
 scanf("%d",&ST[i].Kor);
 printf("학생의 영어 성적 : ");
 scanf("%d",&ST[i].Eng);
 printf("학생의 수학 성적 : ");
 scanf("%d",&ST[i].Math); 
 Avg(ST,i);
}
void Input(struct Student *ST){
 int i;
 for(i=0;i<MAX;i++){
  if(ST[i].ID == -1)break;
 }  
 ST[i].ID = 1001+i;
 Input_detail(ST,i);   
}

Avg(struct Student ST[MAX],int i){
 ST[i].Sum = ST[i].Kor + ST[i].Eng + ST[i].Math;
 ST[i].Avg = (float)ST[i].Sum/3;
 if(ST[i].Avg >= 90){
  strcpy(ST[i].grand,"수");
 }else if(ST[i].Avg >= 80){
  strcpy(ST[i].grand,"우");
 }else if(ST[i].Avg >= 70){
  strcpy(ST[i].grand,"미");
 }else if(ST[i].Avg >= 60){
  strcpy(ST[i].grand,"양");
 }else{
  strcpy(ST[i].grand,"가");   
 }
}

Print(struct Student ST[MAX],int i){
 printf("   ID |   이름 |  국어 |  영어 |  수학 |  합계 |  평균 |  등급\n"); 
 for(i=0;i<MAX;i++){
  if(ST[i].ID != -1){
   printf("%5d | %5s | %5d | %5d | %5d | %5d | %.2f | %5s\n",
    ST[i].ID,ST[i].name,ST[i].Kor,ST[i].Eng,ST[i].Math,ST[i].Sum,
    (float)ST[i].Avg,ST[i].grand);
  }
 }
}

void Sujung(struct Student ST[MAX], int i){
 int Sel; 
 printf(" 1. 수정 \n");
 printf(" 2. 삭제 \n");
 printf(" > ");
 fflush(stdin);
 scanf("%d",&Sel);
 printf(" %번째 학생: ");   //ID 선택으로 삭제를 하고 싶은데 도저히 모르겠다 ㅜㅜ
 fflush(stdin);
 scanf("%d",&i);
 i--;
 if(Sel==1){
  Input_detail(ST,i);
 }else if(Sel==2){ 
  ST[i].ID = -1;    //삭제는 -1 즉 작성되지 않은상태로 돌린다는 의미
 }else{
  printf("잘못입력 하셨습니다 \n");

 }
}


void Save(struct Student ST[MAX]){
 int i;
 FILE * f = fopen(FPATH,"w"); 
 for(i=0;i<MAX;i++){
  if(ST[i].ID != -1){
   fprintf(f,"%d  %s  %d  %d  %d\n",
    ST[i].ID,ST[i].name,ST[i].Kor,ST[i].Eng,ST[i].Math);
   printf("%d  %s  %d  %d  %d\n",
    ST[i].ID,ST[i].name,ST[i].Kor,ST[i].Eng,ST[i].Math);

  }else{
   fprintf(f,"-1\n");
  }
 }
 printf("이런 데이터를 저장 했습니다\n");
 fclose(f);
}

void Load(struct Student ST[MAX]){
 int i;
 FILE * f = fopen(FPATH,"r");
 for(i=0;i<MAX;i++){
  fscanf(f,"%d",&ST[i]);
  if(ST[i].ID != -1){
   fscanf(f,"%s %d %d %d",ST[i].name,&ST[i].Kor,&ST[i].Eng,&ST[i].Math);
   printf("%d  %s  %d  %d  %d\n",
    ST[i].ID,ST[i].name,ST[i].Kor,ST[i].Eng,ST[i].Math);

   Avg(ST,i);
  }
 }
 printf("이런 데이터를 읽어 왔습니다\n");
 fclose(f);
}

 

int main(){

 struct Student ST[MAX];
 int Select;
 int Sel;
 int i;

 


 for(i=0;i<MAX;i++){
  ST[i].ID = -1; //과연 이것도 이렇게 초기값이 될런지

 }


 while(1){
  system("cls");
  printf("==성적관리 프로그램==\n");
  printf(" 1. 입 력 \n");
  printf(" 2. 출 력 \n");
  printf(" 3. 수정 및 삭제 \n");
  printf(" 4. 저 장 \n");
  printf(" 5. 읽 기 \n");
  printf(" 6. 프로그램 종료 \n");
  scanf("%d",&Select);
  switch(Select){
   case 1:
    Input(ST);
    break;
   case 2:   
    Print(ST,i);
    break;
   case 3:
    Print(ST,i);
    Sujung(ST,i);   
    break;
   case 4:   
    Save(ST,i);
    break;
   case 5:   
    Load(ST,i);
    break;
   case 6:
    printf("프로그램을 종료하겠습니다 \n");
    return 0;
  }
  system("pause");

 

 }

 return 0;
}



기존에 성적관리 프로그램에 구조체와 입출력 기능(?)까지 모두 포함한 결정판(?) 이다

점점 기능이 좋아질수록 어렵다 ㅜㅜ

뭐 굳이 결정판이 아닐수도 또다른 기능이 추가 될수도...

그때 가서 다시 갱시하면 되는거고... ㅋ

Posted by 샤키