우선 길이 너무 길다고 그냥 뒤로가기 누르지 마시고 도와주세요 ㅠㅠ;;
제가 학교에서 c언어를 배워서 c언어로 성적관리프로그램을 만들어야 하거든요...
현제 진행은 어느정도 되었거든요..?
동적할당을 도저히 모르겠어서 이렇게 글을 쓰게됫네요...
밑에 소스가 현제까지 제가 작성한겁니다..
밑에 구조체를 동적배열로 사용해서 수정, 삭제, 콘솔창 출력,저장, 파일불러오기 등을 해야 하는데 어떻게 해야 할까요..
그리고 로드부분에서 마지막 학생이 한번더 출력됩니다.. 어떻게 수정 해야 할까요...


#include <stdio.h>
#include <malloc.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
 int student_num;
 char name[10];
 int kor;
 int eng;
 int math;
 int total;
 int rank;
} STU;

STU stu[5];
int a;
void initialize(void);
int display_menu(void);
void Input(void);
void Delete_record(void);
void Search_record(void);
void Display_records(void);
void display_rank(void);
void Save(void);
void Load(void);
void print_usage(void);

int main(void)
{
 int menu;
 
 initialize(); //초기화????
 
 while(1)
 {
 menu = display_menu(); //메뉴띄우는거
 
  switch(menu)
  {
  case 1 :
   Input();
   break;
  case 2 :
   Delete_record();
   break;
  case 3 :
   Search_record();
   break;
  case 4 :
   Display_records();
   break;
  case 5 :
   Save();
   break;
  case 6 :
   Load();
   break;
  case 7 :
   printf(\"프로그램을 종료 합니다.\\n\");
   return 0;
  default :
   print_usage();
   break;
  }
 }
 
 return 0;
}
void initialize(void)
{
 printf(\"초기화 구문입니다.\\n\");
}

int display_menu(void)
{
 int i;
 printf(\"=======================\\n\");
 printf(\"  1.수정\\n\");
 printf(\"  2.삭제\\n\");
 printf(\"  3.검색\\n\");
 printf(\"  4.성적 출력\\n\");
 printf(\"  5.저장\\n\");
 printf(\"  6.불러오기\\n\");
 printf(\"  7.종료\\n\");
 printf(\"=======================\\n\");
 printf(\" Number Choice : \");
 scanf(\"%d\",&i);
 
 return i;
}
void Input(void)
{
 int i;
 FILE *fp;
    fp=fopen(\"input.txt\", \"a+\");
    printf(\"입력할 학생수 : \");
 scanf(\"%d\", &a);
  printf(\"성적 입력란 입니다.\\n\");
  printf(\"다음을 입력해주세요.\\n\");
  for(i=0; i<a; i++)
 {
  printf(\"학번 : \");
  scanf(\"%d\", &stu[i].student_num);
  printf(\"이름 : \");
  scanf(\"%s\", stu[i].name);
  printf(\"국어 점수 : \");
  scanf(\"%d\", &stu[i].kor);
  printf(\"영어 점수 : \");
  scanf(\"%d\", &stu[i].eng);
  printf(\"수학 점수 : \");
  scanf(\"%d\", &stu[i].math);      
  fprintf(fp, \"%d %s %d %d %d \\n\",stu[i].student_num,stu[i].name,stu[i].kor,stu[i].eng,stu[i].math);
  /*if(i>=1)
  for(i=0;i<x;i++)
  {
   if(stu[a].student_num==stu[i].student_num)
   printf(\"이미 존재하는 학번 입니다.\");
  }*/
 }
 fclose(fp);
}
void Delete_record(void)
{
 printf(\"삭제 루틴 입니다.\\n\");
}
void Search_record(void)
{
 printf(\"검색 루틴 입니다.\\n\");
}
void Display_records(void)
{
 printf(\"출력 루틴 입니다.\\n\");
 display_rank();
}
void display_rank(void)
{
/*텀프로젝트에서 display메뉴의 등수별로 출력할부분
 struct student{    //구조체 선언
  char name[10];
  int student_num;
  float sub[3];
  float total;
  int rank;
 } s[10];
*/ 
 int i, j;    
 FILE *fp1, *fp2;   //파일형 변수 선언
 
 while(1)   
 {
  fp1=fopen(\"input.txt\",\"r\");  //파일을 읽기전용으로 연다
  if(fp1==NULL)
  {    
   printf(\"해당 파일이 없습니다.\\n\");
   return 1;
  }
  else    
   break;      
 }
 
 for(i=0; i<a; i++)   //i는 0부터 10보다 작은동안 1씩 증가하며 반복
  fscanf(fp1,\"%d %s %f %f %f\", &stu[i].student_num, stu[i].name, &stu[i].kor, &stu[i].eng, &stu[i].math);
 fclose(fp1);    //파일을 각각의 변수에 저장 하고 파일을 닫는다
 
 for(i=0; i<a; i++)  
  stu[i].total = stu[i].kor + stu[i].eng + stu[i].math; //각 과목의 총합을 더하여 total에 저장
 
 for(i=0; i<a; i++)
 {
  stu[i].rank=1;   //rank에 초기값 1을 저장
  for(j=0; j<a; j++)
  {
   if(stu[i].total < stu[j].total)  //총점으로 등수비교하는거
    stu[i].rank++;    //s[i].rank +1을 한다
  }
 }
 fp2=fopen(\"rank.txt\",\"w\");  //파일을 쓰기전용으로 연다
 printf(\"┌───────────【 순위별성적표 】───────────┐\\n\");
 fprintf(fp2,\"┌───────────【 순위별성적표 】───────────┐\\n\");
 printf(\"│     이 름      국어      영어      수학     합계       등수 │\\n\");
 fprintf(fp2,\"│     이 름      국어      영어      수학     합계       등수 │\\n\");
 //성적표 항목 을 콘솔및 파일에 출력
 for(i=1; i<=a; i++)  //i는 1부터 10보다 작거나 같은동안 1씩 증가하며 반복
 {
  for(j=0; j<a; j++)  //j는 0부터 10보다 작은동안 1씩 증가하며 반복
  {
   if(stu[j].rank==i) //각각의 등수가 i과 같으면 (즉, 1등부터 차례로 출력)
   {
    printf(\"├───────────────────────────────┤\\n\");
    fprintf(fp2,\"├───────────────────────────────┤\\n\");
    printf(\"│%d%10s%10.1f%10.1f%10.1f%10.1f%10d  │\\n\", stu[j].student_num,stu[j].name, stu[j].kor, stu[j].eng, stu[j].math, stu[j].total, stu[j].rank);
    fprintf(fp2, \"│%d%10s%10.1f%10.1f%10.1f%10.1f%10d  │\\n\", stu[j].student_num,stu[j].name, stu[j].kor, stu[j].eng, stu[j].math, stu[j].total, stu[j].rank);
   } //해당 사람의 성적을 콘솔및 파일에 출력
  }
 }
 printf(\"└───────────────────────────────┘\\n\");
 fprintf(fp2,\"└───────────────────────────────┘\\n\");
 fclose(fp2); //하단 라인을 출력하고 줄내림

}
void Save(void)
{
 printf(\"저장 루틴 입니다.\\n\");
}
void Load(void)
{
 STU student;
 FILE *fp, *fp1;
 fp = fopen(\"input.txt\", \"r\");
 do{
  fscanf(fp, \"%d%s%d%d%d\",&student.student_num,student.name,&student.kor,&student.eng,&student.math);
  printf(\"%4d %4s%4d%4d%4d\\n\",student.student_num,student.name,student.kor,student.eng,student.math);
 }while(fgetc(fp) != EOF);
 fclose(fp);
 fp1 = fopen(\"output.txt\",\"w\");
 fprintf(fp1, \"%4d %4s%4d%4d%4d\",student.student_num,student.name,student.kor,student.eng,student.math);
 fclose(fp1);
}
void print_usage(void)
{
 printf(\"잘못된 숫자를 입력하셧습니다.\\n\");
}