#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
typedef struct Student_information{
int number;
char name[15];
float korean;
float english;
float math;
float sum;
float average;
struct Student_information *next;
}Student;
int studentcount=0;//맨처음학생수
int outputcount=0; //입력먼저 했나 출력먼저 했나 판별하기위한 변수
Student *head=NULL;
Student *pre,*post,*tail;
FILE *fp;
void input(); //학생등록
void output();//등수보기
void change();//수정
void eliminate();//삭제
void bye();
void gotoxy(int x,int y);
int main()
{
fp=fopen("data.txt","r+");
while(1)
{
int key;
printf("\n\n\t======================성적 관리 프로그램=========================\n");
printf("\t1.학생 등록 2.등수보기 3.수정 4.삭제 5.종료\n");
printf("\t=================================================================\n");
key=getch();
fflush(stdin);
if(key=='1')
input();
else if(key=='2')
output();
else if(key=='3')
change();
else if(key=='4')
eliminate();
else if(key=='5')
bye();
}
return 0;
}
void input() //학생등록
{
int a,b;
Student *student =(Student*)malloc(sizeof(Student));
fp=fopen("data.txt","a");
student->next=NULL;
post=head;
pre=NULL;
studentcount=studentcount+1;//하나 더 늘어나는 인원수
do{
printf("\n학번==>");
scanf("%d",&student->number);
fflush(stdin);
if(student->number<0) //넘버가 0보다 작으면 오류
{
printf("번호는 음수/문자 불가능.다시입력하세요\n\n");
}
}while(student->number<0); //번호가 0보다 작으면 클때까지 계속 실행
printf("\n이름==>");
scanf("%s",&student->name);
fflush(stdin);
do{
printf("\n국어점수==>");
scanf("%f",&student->korean);
fflush(stdin);
if(student->korean<0) //점수가 0보다 작으면 오류
{
printf("번호는 음수/문자 불가능.다시입력하세요\n\n");
}
}while(student->korean<0); //점수가 0보다 작으면 클때까지 계속 실행
do{
printf("\n영어점수==>");
scanf("%f",&student->english);
fflush(stdin);
if(student->english<0) //점수가 0보다 작으면 오류
{
printf("번호는 음수/문자 불가능.다시입력하세요\n\n");
}
}while(student->english<0); //점수가 0보다 작으면 클때까지 계속 실행
do{
printf("\n수학점수==>");
scanf("%f",&student->math);
fflush(stdin);
if(student->math<0) //점수가 0보다 작으면 오류
{
printf("번호는 음수/문자 불가능.다시입력하세요\n\n");
}
}while(student->math<0); //점수가 0보다 작으면 클때까지 계속 실행
student->sum=student->korean + student->english + student->math;
printf("\n총점수==>%2.2f",student->sum);
student->average=student->sum/3;
printf("\n평균점수==>%2.2f (소수 둘째자리까지.)",student->average);
if(head==NULL)
{
head=student;
}
else
{
if(post->average < student->average)
{
head=student;
student->next=post;
}
else if(post->average > student->average)
{
if(post->next==NULL)//
{
post->next=student;
student->next=pre;
}
else
{
pre=post->next;
while(pre->average > student->average)
{
post=pre;
pre=pre->next;
if(pre == NULL)
break;
}
post->next=student;
student->next=pre;
}
}
}
fprintf(fp,"%d",student->number);
fprintf(fp,",");
fprintf(fp,"%s",student->name);
fprintf(fp,",");
fprintf(fp,"%.2f",student->korean);
fprintf(fp,",");
fprintf(fp,"%.2f",student->english);
fprintf(fp,",");
fprintf(fp,"%.2f",student->math);
fprintf(fp,",");
fprintf(fp,"%.2f",student->sum);
fprintf(fp,",");
fprintf(fp,"%.2f\n",student->average);
fclose(fp);
outputcount++;
}
void output()//등수보기
{
Student *temp=(Student*)malloc(sizeof(Student));
Student *s;
int k=1;
char a;
char outputt[50];
char *p;
if(fp=fopen("data.txt","r+")==NULL)
{
printf("\n등수 \t학번\t\t이름\t\t국어\t영어\t수학\t총점\t평균\n");
printf("----------------------------------------------------------------------------\n");
printf("\t아\t무\t정\t보\t없\t음\n");
}
else if(outputcount>0)
{
printf("\n등수 \t학번\t\t이름\t\t국어\t영어\t수학\t총점\t평균\n");
printf("----------------------------------------------------------------------------\n");
for (s=head; s != NULL; s=s->next)
{
printf( "%3d\t",k);
printf("%8d\t",s->number);
printf( "%8s\t",s->name);
printf( "%4.2f\t",s->korean);
printf( "%6.2f\t",s->english);
printf( "%6.2f\t",s->math);
printf( "%5.2f\t",s->sum);
printf( "%6.2f\t",s->average);
k++;
}
}
else if(outputcount==0) //입력없이 바로 출력할때
{
fp=fopen("data.txt","r+");
fscanf(fp,"%d",&temp->number);
fscanf(fp,"%s",&outputt);
printf("%s\n",outputt);
strtok(outputt,",");
printf("%s\n",outputt);
/*temp->name==outputt;
printf("%s\n",temp->name);*/
//fscanf(fp,"%s",&temp->name);
fscanf(fp,"%f",&temp->korean);
fscanf(fp,"%f",&temp->english);
fscanf(fp,"%f",&temp->math);
fscanf(fp,"%f",&temp->sum);
fscanf(fp,"%f",&temp->average);
fclose(fp);
/*
printf("\n등수 \t학번\t\t이름\t\t국어\t영어\t수학\t총점\t평균\n");
printf("----------------------------------------------------------------------------\n");
printf( "%3d\t",k);
printf("%8d\t",temp->number);
printf( "%8s\t",temp->name);
printf( "%4.2f\t",temp->korean);
printf( "%6.2f\t",temp->english);
printf( "%6.2f\t",temp->math);
printf( "%5.2f\t",temp->sum);
printf( "%6.2f\t",temp->average);*/
}
}
void change()//수정
{
int revisenumber;
Student *student =(Student*)malloc(sizeof(Student));
if(head==NULL)
{
printf("수정할 데이터가 없습니다.");
}
else
{
post=head;
pre=NULL;
printf("수정할 학번은 : ");
scanf("%d",&revisenumber);
while(revisenumber==post->number)
{
post=post->next;
}
do{
printf("\n학번==>");
scanf("%d",&student->number);
fflush(stdin);
if(student->number<0) //넘버가 0보다 작으면 오류
{
printf("번호는 음수/문자 불가능.다시입력하세요\n\n");
}
}while(student->number<0); //번호가 0보다 작으면 클때까지 계속 실행
printf("\n이름==>");
scanf("%s",&student->name);
fflush(stdin);
do{
printf("\n국어점수==>");
scanf("%f",&student->korean);
fflush(stdin);
if(student->korean<0) //점수가 0보다 작으면 오류
{
printf("번호는 음수/문자 불가능.다시입력하세요\n\n");
}
}while(student->korean<0); //점수가 0보다 작으면 클때까지 계속 실행
do{
printf("\n영어점수==>");
scanf("%f",&student->english);
fflush(stdin);
if(student->english<0) //점수가 0보다 작으면 오류
{
printf("번호는 음수/문자 불가능.다시입력하세요\n\n");
}
}while(student->english<0); //점수가 0보다 작으면 클때까지 계속 실행
do{
printf("\n수학점수==>");
scanf("%f",&student->math);
fflush(stdin);
if(student->math<0) //점수가 0보다 작으면 오류
{
printf("번호는 음수/문자 불가능.다시입력하세요\n\n");
}
}while(student->math<0); //점수가 0보다 작으면 클때까지 계속 실행
student->sum=student->korean + student->english + student->math;
printf("\n총점수==>%2.2f",student->sum);
student->average=student->sum/3;
printf("\n평균점수==>%2.2f (소수 둘째자리까지.)",student->average);
if(post->average < student->average)//입력값이 기존값보다 큰경우
{
head=student;
student->next=post->next;
while(post->number!=student->number)//수정 내용 지우기
{
pre=post;
post=post->next;
}
pre->next=student;
post=post->next;
student->next=post;
}
else if(post->average > student->average)
{
post=head;
pre=post;
post=post->next;
while(post->average > student->average)
{
pre=post;
post=post->next;
}
pre->next=student;
student->next=post;
while(post->number!=student->number)//수정된 내용 지우기
{
pre=post;
post=post->next;
}
pre->next=student;
post=post->next;
student->next=post;
}
}
}
void eliminate()//제거
{
Student *pre,*post; //pre랑 post가 있는데 동적할당을 안해줬으므로 임시 포인터 변수
int removenumber,linkcount=0,k;
post = head; //post는 head를 가리키고
pre=post; //pre는 post를 가르킨다
printf("삭제할 학번 입력해주세요 : ");
scanf("%d", &removenumber);
if(head==NULL)//삭제할 정보가 없을때
{
printf("삭제할 정보가 없습니다.");
}
else if(head->next==NULL)//입력된정보가 1개일때 //head의 다음노드가 없으면
{
head=NULL; //head는 NULL
printf("삭제 되었습니다.\n");
}
else //입력된정보가 2개 이상일때
{
while(post->number!=removenumber)
{
pre=post; //post가 가르키는걸 pre가 가르키고
post=post->next; //post는 다음노들르 가르켜
}
post=post->next; //post의 다음노드를 post가 가르키고
pre->next=post; //post를 pre의 넥스트에 넣어
//그리고 여기부분에 free(q); 이거 알지?ㅇ.ㅇ
printf("삭제되었습니다.\n");
}
}
void bye()
{
system("cls");
printf("\n\n\n\n\n =========== Good Bye ===========\n");
gotoxy(10,23);
printf("Copyright ⓒ 2011 by. 대현\n");
gotoxy(10,24);
printf("All pictures cannot be copied without permissions\n");
}
void gotoxy(int x,int y)
{
COORD Pos={x-1,y-1};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),Pos);
}