본문 바로가기

카테고리 없음

성적관리

#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);
}