우선 길이 너무 길다고 그냥 뒤로가기 누르지 마시고 도와주세요 ㅠㅠ;;
제가 학교에서 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\");
}
동적할당이 안되면 동적할당을 안 하면 된다. 메모리 640k 나눠쓰던 시절도 아니고 메모리 넘쳐나는데 그거 놀려서 뭐해. 배열 한 5000개 정도 때려박고 인덱스 카운터 변수 하나 두고 그냥 써
그렇게 저도 하고싶은데..............동적할당을 꼭 서야 해서 이렇게 글을 올렸어요...........
구조체를 STU stu[5]; 라는 식으로 선언하지 말고 STU *stu;로 선언해놓고 Initialize(); 메소드에서 동적할당 하면 된다. stu = (STU*)malloc(sizeof(STU) * 5); 하면 5개 나올거고 갯수야 네 맘대로 정하면 되고. 나머진 다 똑같아.
STU 구조체 안의 이름은 한 번 스스로 해봐.
음 그럼요 갯수가 변경될때는 어떻게 해줘야 하죠..?그냥 무식하게 갯수를 많이 해야 하나요..?그리고 동적배열을 사용했을때 stu[i].student_num, 이런건 그냥 그대로 나두면 되는건가요??
구조체 안의 이름을 스스로 해보라는게 무슨말이죠..?
동적할당 한다며
구조체만 동적할당 할거임? 이름은 걍 name[10]으로 놔둘거임? 이름 입력받을 때 동적할당 해서 때려넣어야할 거 아냐. 직접 하라고. 입력할 때마다 노드 하나씩 생성하려면 자료구조 공부해서 링크드 리스트를 써야지. 자료구조 책 하나 보삼
참조 방식은 변경할 필요 없고, 무식하게 하기 싫으면 유식하게 해야 할텐데 유식하게 하려면 공부하는 수밖에 없음. 수고하삼.
공부하기엔 너무 늦어서요.....오늘까지라..........