#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;
}
기존에 성적관리 프로그램에 구조체와 입출력 기능(?)까지 모두 포함한 결정판(?) 이다
점점 기능이 좋아질수록 어렵다 ㅜㅜ
뭐 굳이 결정판이 아닐수도 또다른 기능이 추가 될수도...
그때 가서 다시 갱시하면 되는거고... ㅋ