시작 : 2014년 9월 28일
종료 : 2014년 9월 29일
추가수정 : 2014년 9월 30일
동아리에 들어가기 위한 관문1인 성적처리기입니다.
개념이 정확하게 안 되 있어서인지 에러가 나네요.
함수 속에서 fprintf 랑 fscanf 쓰는 법도 모르겠네요.
만든 순서
우선 견본으로 주신 실행파일을 보고 함수를 나눴습니다.
그리고 각 구성의 틀을 만들었고요. (구조체, 변수)
함수들을 체워넣었습니다.
학번 내림차순 -> 오름차순 변경
총점 오름차순 -> 내림차순 변경
void calcu(); 계산함수 추가
이유 : 메뉴 4나 5실행시 합계등의 변화를 맞추기 위함.
메뉴4,5 에러 제거
에러 이유
1.scanf로 받는 변수에 주소(&)를 안붙임
FILE *data 위치 변경
이유 함수속에서 사용하기 위해 전역포인터? 전역변수?로 둠
read() 함수 완성
write() 함수 완성
main1() 함수에서 중복학번 입력 불가로 수정
main3() 함수에서 정렬이 바뀌어있던 점 수정
#include <stdio.h>
#include <stdlib.h>
void read(); // 파일을 불러옴
void write(); // 파일을 불러옴
void calcu(); // 계산 함수
void menu(); // 메인 6개고르기
void menu1(); // 정보 입력받기
void menu2(); // 정보 출력하기
void menu3(); // 정보 정렬하기
void menu4(); // 정보 수정하기
void menu5(); // 정보 삭제하기
typedef struct st
{
char name[10];
int num,kor,math,eng,tot;
double avg;
}ST;
FILE *data;
int i,j,x,max=0,sort=0;
ST student[100],temp;
ST total = {"",0,0,0,0,0,0};
int main()
{
read();
while (x!=6)
{
menu();
switch (x)
{
case 1 : menu1();
break;
case 2 : menu2();
break;
case 3 : menu3();
break;
case 4 : menu4();
break;
case 5 : menu5();
break;
case 6 :
break;
default: printf("1~6번중에서 골라주세요.\n");
}
}
write();
return 0;
}
void read()
{
data = fopen("data.txt","a+");
for(max=0;;max++)
{
if((fscanf(data,"%d %s %d %d %d\n",&student[max].num,&student[max].name,&student[max].kor,&student[max].eng,&student[max].math))==EOF)break;
student[max].tot = student[max].kor+student[max].eng+student[max].math;
student[max].avg = student[max].tot/3.0;
}
fclose(data);
}
void write()
{
data = fopen("data.txt","wt");
for(i=0;i<max;i++) fprintf(data,"%d %s %d %d %d \n",student[i].num,student[i].name,student[i].kor,student[i].eng,student[i].math);
fclose(data);
}
void calcu()
{
total.kor = 0;
total.eng = 0;
total.math = 0;
total.avg = 0;
total.tot = 0;
for(i=0;i<max;i++)
{
total.kor = student[i].kor + total.kor ;
total.eng = student[i].eng + total.eng ;
total.math = student[i].math + total.math;
total.avg = student[i].avg + total.avg ;
total.tot = student[i].tot + total.tot ;
}
}
void menu()
{
printf("\n-------------------------------------------------------------------------------\n");
printf("1.성적 입력\n");
printf("2.성적 출력\n");
printf("3.정렬\n");
printf("4.성적 수정\n");
printf("5.삭제\n");
printf("6.종료 ※ 정상종료 하지 않으실 경우, 데이터가 저장되지 않습니다.\n");
printf("-------------------------------------------------------------------------------\n");
scanf("%d",&x);
system("cls");
}
void menu1()
{
for(;;)
{
printf("학번입력 :");
scanf("%d",&student[max].num);
for(i=0;i<max&&student[i].num!=student[max].num;i++);
if(max==i)i=0;
if(student[i].num==student[max].num&&max!=0) printf("%d는 중복된 학번입니다.\n",student[i].num);
else break;
}
printf("이름입력 :");
scanf("%s",&student[max].name);
printf("국어성적 :");
scanf("%d",&student[max].kor);
printf("영어성적 :");
scanf("%d",&student[max].eng);
printf("수학성적 :");
scanf("%d",&student[max].math);
student[max].tot = student[max].kor+student[max].eng+student[max].math;
student[max].avg = student[max].tot/3.0;
sort=0; //값을 입력받으면 정렬이 풀리기 때문이다.
max++;
}
void menu2()
{
if(max==0) printf("입력된 값이 없습니다.\n");
else
{
calcu();
if(sort==1) printf("\n\t\t\t\t성적처리(학번순)\n\n");
else if(sort==2) printf("\n\t\t\t\t 성적처리(총점순)\n\n");
else printf("\n\t\t\t\t 성적처리(비정렬)\n\n");
printf("-------------------------------------------------------------------------------\n");
printf(" 학번 이름 국어 영어 수학 총점 평균\n");
for(i=0;i<max;i++) printf("%10d%9s%12d%12d%12d%12d%12.1f\n",student[i].num,student[i].name,student[i].kor,student[i].eng,student[i].math,student[i].tot,student[i].avg);
printf("-------------------------------------------------------------------------------\n");
printf(" 총점 %12d%12d%12d%12d%12.1f\n",total.kor,total.eng,total.math,total.tot,total.avg);
printf(" 평균 %12.1f%12.1f%12.1f%12.1f%12.1f\n",total.kor/(double)max,total.eng/(double)max,total.math/(double)max,total.tot/(double)max,total.avg/(double)max);
printf("-------------------------------------------------------------------------------\n");
}
}
void menu3()
{
if(max==0) printf("입력된 값이 없습니다.\n");
else
{
while(x!=1&&x!=2)
{
printf("1.학번순\n2.총점순\n");
scanf("%d",&x);
switch (x)
{
case 1: for(i=0;i<max-1;i++)
{
for(j=i+1;j<max;j++)
{
if(student[i].num>student[j].num)
{
temp=student[i];
student[i]=student[j];
student[j]=temp;
}
}
}
sort=1;
break;
case 2: for(i=0;i<max;i++)
{
for(j=i+1;j<max-1;j++)
{
if(student[i].tot<student[j].tot)
{
temp=student[i];
student[i]=student[j];
student[j]=temp;
}
}
}
sort=2;
break;
default:printf("1과 2중에 골라주세요.\n");
}
}
}
}
void menu4()
{
if(max==0) printf("입력된 값이 없습니다.\n");
else
{
printf("수정할 학번을 입력하세요.");
//학번 입력받아 해당 학번의 구조체 찾기
scanf("%d",&temp.num);
for(i=0;temp.num!=student[i].num&&i<max;i++);
if(i==max) printf("%d학번을 가진 학생이 존재하지 않습니다.\n",temp.num);
else
{
printf("국어성적 :");
scanf("%d",&student[i].kor);
printf("영어성적 :");
scanf("%d",&student[i].eng);
printf("수학성적 :");
scanf("%d",&student[i].math);
student[i].tot = student[i].kor+student[i].eng+student[i].math;
student[i].avg = student[i].tot/3.0;
sort=0;
}
}
}
void menu5()
{
if(max==0) printf("입력된 값이 없습니다.\n");
else
{
printf("삭제할 학번을 입력하세요.");
//학번 입력받아 해당 학번의 구조체 데이터가 한개씩 당겨짐
scanf("%d",&temp.num);
for(i=0;temp.num!=student[i].num&&i<max;i++);
if(i==max) printf("%d학번을 가진 학생이 존재하지 않습니다.\n",temp.num);
else
{
for(;i<max-1;i++)student[i]=student[i+1];
max--;
}
}
}
이름순 정렬 추가
strcmp 함수 사용
#include <stdio.h>
#include <stdlib.h>
void read(); // 파일을 불러옴
void write(); // 파일을 불러옴
void calcu(); // 계산 함수
void menu(); // 메인 6개고르기
void menu1(); // 정보 입력받기
void menu2(); // 정보 출력하기
void menu3(); // 정보 정렬하기
void menu4(); // 정보 수정하기
void menu5(); // 정보 삭제하기
typedef struct st
{
char name[10];
int num,kor,math,eng,tot;
double avg;
}ST;
FILE *data;
int i,j,x,max=0,sort=0;
ST student[100],temp;
ST total = {"",0,0,0,0,0,0};
int main()
{
read();
while (x!=6)
{
menu();
switch (x)
{
case 1 : menu1();
break;
case 2 : menu2();
break;
case 3 : menu3();
break;
case 4 : menu4();
break;
case 5 : menu5();
break;
case 6 :
break;
default: printf("1~6번중에서 골라주세요.\n");
}
}
write();
return 0;
}
void read()
{
data = fopen("data.txt","a+");
for(max=0;;max++)
{
if((fscanf(data,"%d %s %d %d %d\n",&student[max].num,&student[max].name,&student[max].kor,&student[max].eng,&student[max].math))==EOF)break;
student[max].tot = student[max].kor+student[max].eng+student[max].math;
student[max].avg = student[max].tot/3.0;
}
fclose(data);
}
void write()
{
data = fopen("data.txt","wt");
for(i=0;i<max;i++) fprintf(data,"%d %s %d %d %d \n",student[i].num,student[i].name,student[i].kor,student[i].eng,student[i].math);
fclose(data);
}
void calcu()
{
total.kor = 0;
total.eng = 0;
total.math = 0;
total.avg = 0;
total.tot = 0;
for(i=0;i<max;i++)
{
total.kor = student[i].kor + total.kor ;
total.eng = student[i].eng + total.eng ;
total.math = student[i].math + total.math;
total.avg = student[i].avg + total.avg ;
total.tot = student[i].tot + total.tot ;
}
}
void menu()
{
printf("\n-------------------------------------------------------------------------------\n");
printf("1.성적 입력\n");
printf("2.성적 출력\n");
printf("3.정렬\n");
printf("4.성적 수정\n");
printf("5.삭제\n");
printf("6.종료 ※ 정상종료 하지 않으실 경우, 데이터가 저장되지 않습니다.\n");
printf("-------------------------------------------------------------------------------\n");
scanf("%d",&x);
system("cls");
}
void menu1()
{
for(;;)
{
printf("학번입력 :");
scanf("%d",&student[max].num);
for(i=0;i<max&&student[i].num!=student[max].num;i++);
if(max==i)i=0;
if(student[i].num==student[max].num&&max!=0) printf("%d는 중복된 학번입니다.\n",student[i].num);
else break;
}
printf("이름입력 :");
scanf("%s",&student[max].name);
printf("국어성적 :");
scanf("%d",&student[max].kor);
printf("영어성적 :");
scanf("%d",&student[max].eng);
printf("수학성적 :");
scanf("%d",&student[max].math);
student[max].tot = student[max].kor+student[max].eng+student[max].math;
student[max].avg = student[max].tot/3.0;
sort=0; //값을 입력받으면 정렬이 풀리기 때문이다.
max++;
}
void menu2()
{
if(max==0) printf("입력된 값이 없습니다.\n");
else
{
calcu();
if(sort==1) printf("\n\t\t\t\t성적처리(학번순)\n\n");
else if(sort==2) printf("\n\t\t\t\t 성적처리(총점순)\n\n");
else printf("\n\t\t\t\t 성적처리(비정렬)\n\n");
printf("-------------------------------------------------------------------------------\n");
printf(" 학번 이름 국어 영어 수학 총점 평균\n");
for(i=0;i<max;i++) printf("%10d%9s%12d%12d%12d%12d%12.1f\n",student[i].num,student[i].name,student[i].kor,student[i].eng,student[i].math,student[i].tot,student[i].avg);
printf("-------------------------------------------------------------------------------\n");
printf(" 총점 %12d%12d%12d%12d%12.1f\n",total.kor,total.eng,total.math,total.tot,total.avg);
printf(" 평균 %12.1f%12.1f%12.1f%12.1f%12.1f\n",total.kor/(double)max,total.eng/(double)max,total.math/(double)max,total.tot/(double)max,total.avg/(double)max);
printf("-------------------------------------------------------------------------------\n");
}
}
void menu3()
{
if(max==0) printf("입력된 값이 없습니다.\n");
else
{
x=0;
while(x!=1&&x!=2&&x!=3)
{
printf("1.학번순\n2.총점순\n3.이름순\n");
scanf("%d",&x);
switch (x)
{
case 1: for(i=0;i<max-1;i++)
{
for(j=i+1;j<max;j++)
{
if(student[i].num>student[j].num)
{
temp=student[i];
student[i]=student[j];
student[j]=temp;
}
}
}
sort=1;
break;
case 2: for(i=0;i<max-1;i++)
{
for(j=i+1;j<max;j++)
{
if(student[i].tot<student[j].tot)
{
temp=student[i];
student[i]=student[j];
student[j]=temp;
}
}
}
sort=2;
break;
case 3:for(i=0;i<max-1;i++)
{
for(j=i+1;j<max;j++)
{
if(strcmp(student[i].name,student[j].name)>0)
{
temp=student[i];
student[i]=student[j];
student[j]=temp;
}
}
}
sort=3;
break;
default:printf("1~3중에 골라주세요.\n");
}
}
}
}
void menu4()
{
if(max==0) printf("입력된 값이 없습니다.\n");
else
{
printf("수정할 학번을 입력하세요.");
//학번 입력받아 해당 학번의 구조체 찾기
scanf("%d",&temp.num);
for(i=0;temp.num!=student[i].num&&i<max;i++);
if(i==max) printf("%d학번을 가진 학생이 존재하지 않습니다.\n",temp.num);
else
{
printf("국어성적 :");
scanf("%d",&student[i].kor);
printf("영어성적 :");
scanf("%d",&student[i].eng);
printf("수학성적 :");
scanf("%d",&student[i].math);
student[i].tot = student[i].kor+student[i].eng+student[i].math;
student[i].avg = student[i].tot/3.0;
sort=0;
}
}
}
void menu5()
{
if(max==0) printf("입력된 값이 없습니다.\n");
else
{
printf("삭제할 학번을 입력하세요.");
//학번 입력받아 해당 학번의 구조체 데이터가 한개씩 당겨짐
scanf("%d",&temp.num);
for(i=0;temp.num!=student[i].num&&i<max;i++);
if(i==max) printf("%d학번을 가진 학생이 존재하지 않습니다.\n",temp.num);
else
{
for(;i<max-1;i++)student[i]=student[i+1];
max--;
}
}
}
결국 완성됬네요.
파일 입출력의 기본사용법을 익히고.
정렬을 하는 알고리즘을 익혔네요.
포인터가 문제군요. 좀 더 공부하고 수정해야겠네요.
'1학년 2학기 > C언어' 카테고리의 다른 글
[C#] 과제 3 - 지뢰 찾기 이해하기 (0) | 2014.12.11 |
---|---|
WINDOWS API PPT (0) | 2014.12.08 |
[C#] 과제 2 - 마방진 이해하기 (0) | 2014.12.05 |
[C#] 과제 1 - 허수의 표현 (0) | 2014.12.05 |