학생정보관리시스템
#include
#include
#include
#define MAX_LEN 10
#define STU_NUM 30
#define COURSE_NUM 6
typedef 구조체 학생
{
긴 숫자;
문자 이름[MAX_LEN];
부동 점수[COURSE_NUM];
부동 합계;
p> p>float aver;
}STU;
int Menu(void);
void ReadScore(STU stu[],int n ,int m);
void AverSumofEveryStudent(STU stu[],int n,int m);
void AverSumofEveryCourse(STU stu[],int n,int m);< /p >
void SortbyScore(STU stu[],int n,int m,int (*비교)(float a,float b));
int Ascending(float a,float b) ;
int Descending(float a,float b);
void SwapFloat(float *x,float *y);
void SwapLong(long *x ,long *y);
void SwapChar(char x[],char y[]);
void AsSortbyNum(STU stu[],int n,int m);< /p >
void SortbyName(STU stu[],int n,int m);
void SearchbyNum(STU stu[],int n,int m);
void SearchbyName(STU stu[],int n,int m);
void StatisticAnalytic(STU stu[],int n,int m);
void PrintScore(STU stu[ ], int n,int m);
void WritetoFile(STU 레코드[],int n,int m);
void ReadfromFile(STU 레코드[],int *n, int * m);
int main()
{
char ch;
int n=0,m=0;
p>STU stu[STU_NUM];
while(1)
{
ch=Menu();
스위치(ch)
{
case 1:printf("학생 번호를 입력하세요(n<=%d):",STU_NUM);
scanf( "%d",&n);
printf("강좌 번호(m<=%d)를 입력하세요:",COURSE_NUM);
sc
anf("%d",&m);
ReadScore(stu,n,m);
break;
case 2:AverSumofEveryCourse(stu,n ,m);
중단;
사례 3:AverSumofEveryStudent(stu,n,m);
중단;
사례 4 :SortbyScore(stu,n,m,Descending);
printf("\n점수 기준 내림차순 정렬:\n");
PrintScore(stu,n,m) ;
break;
case 5:SortbyScore(stu,n,m,Ascending);
printf("\n점수에 따라 오름차순으로 정렬:\ n");
PrintScore(stu,n,m);
break;
case 6:AsSortbyNum(stu,n,m);
p> p>printf("\n점수 기준 오름차순 정렬:\n");
PrintScore(stu,n,m);
break;
p>
case 7:SortbyName(stu,n,m);
printf("\n점수에 따라 사전 순서로 정렬:\n");
PrintScore(stu ,n ,m);
break;
case 8:SearchbyNum(stu,n,m);
break;
사례 9 :SearchbyName(stu,n,m);
중단;
사례 10:StatisticAnalytic(stu,n,m);
중단;< /p >
case 11:PrintScore(stu,n,m);
break;
case 12:WritetoFile(stu,n,m);
break;
case 13:ReadfromFile(stu,&n,&m);
break;
case 14:printf("프로그램 끝! \n ");
exit(0);
default :printf("입력 오류!\n");
}
}
return 0;
}
/*기능: 메뉴를 표시하고 사용자 키보드로 입력한 옵션을 가져옵니다*/
int Menu(void)
{
int itemSelected;
printf("학생 점수 관리\n");
printf("1.기록 입력\n");
printf("2.모든 과목의 총점과 평균점수 계산\n");
printf(" 3.모든 학생의 총점과 평균점수 계산 \n");
printf("4.d로 정렬
점수 기준 오름차순 \n");
printf("5.점수 기준 오름차순 정렬 \n");
printf("6.숫자 기준 오름차순 정렬 \n");
printf("7.이름별 사전순 정렬 \n");
printf("8.번호로 검색 \n");
p>
printf("9.이름으로 검색 \n");
printf("10.통계 분석 \n");
printf("11.List 레코드 \n");
printf("12.파일에 쓰기 \n");
printf("13.파일에서 읽기 \n");
p> p>
printf("0.Exit \n");
printf("선택 사항을 입력하십시오:") //사용자 입력 읽기
scanf( " %d",&itemSelected);
return itemSelected;
}
/*기능: n 학생의 m 코스 성적 입력*/ p>
void ReadScore(STU stu[],int n,int m)
{
int i,j;
printf("학생 입력' ID, 이름 및 점수:\n");
for(i=0;i { scanf(" %ld %s",&stu[i].num,stu[i].name); for(j=0;j { p> scanf("%f",&stu[i].score[j]); } } } /*함수 함수: 각 학생 강좌의 총점과 평균 점수를 계산합니다*/ void AverSumofEveryStudent(STU stu[],int n,int m) { int i,j; for(i=0;i { stu [i]. sum=0; for(j=0;j { stu[i].sum=stu [i]. sum+stu[i].score[j]; } stu[i].aver=m>0?stu[i].sum/m :-1; printf("학생 %d: 합계 = %.0f,aver = %.0f\n", i+1,stu[i].sum ,stu[i ].aver); } } /*기능: 각 과목의 총점과 평균점수를 계산합니다*/ void AverSumofEveryCourse(STU stu[],int n,int m) { int i,j; float sum[ COURSE_NUM],aver[ COURSE_NUM]; for(j=0;j { p> sum[j]=0; for(i=0;i { sum[j] =sum[j]+stu[i].score[j]; } aver[j] = n>0 ? sum[j]/n:-1; printf("강좌 %d:sum = %.0f,aver = %.0f\n",j+1,sum[j],aver[j]); } } /*함수 함수: 선택 방법에 따라 배열 합계의 요소 값을 정렬합니다*/ void SortbyScore(STU stu[], int n,int m,int (*비교)(float a,float b)) { int i,j,k,t; for(i=0;i { k=i; for(j=i+ 1;j< n;j++) { if((*비교)(stu[j].sum,stu[k].sum)) k=j; } if(k!=i) { for(t=0;t { SwapFloat(&stu[k].score[t],&stu[i].score[t]); } SwapFloat(&stu [k].sum,&stu[i].sum); SwapFloat(&stu[k].aver,&stu[i].aver); SwapLong (&stu[k ].num,&stu[i].num); SwapChar(stu[k].name,stu[i].name); } p> } } /*오름차순으로 데이터 정렬*/ int Ascending(float a, float b) { return a } /*데이터를 내림차순으로 정렬*/ int 내림차순(float a,float b) { return a>b; } /*두 개의 단정밀도 교환 부동 소수점 데이터*/ void SwapFloat(float *x,float *y) { float temp; temp =*x; p> *x=*y; *y=temp; } / *두 개의 긴 정수 데이터 교환*/ p> void SwapLong(long *x,long *y) { long temp; temp=*x; *x=*y; *y=temp; } /*2개 교환 문자열*/ void SwapChar(char x[],char y[]) { char temp[MAX_LEN]; strcpy(임시,x); strcpy(x,y); strcpy(y,임시); } /*기능: 배열 num의 요소 값을 낮은 값에서 높은 값으로 정렬하는 방법을 선택하려면 누릅니다.*/ void AsSortbyNum(STU stu[],int n,int m) { int i,j,k,t; for( i=0;i { k=i; for(j=i+1;j { if(stu[j].num < stu[k].num) k=j; } if(k!=i) { for(t=0;t { SwapFloat(&stu[k].score[t],&stu[i].score[t]); } SwapFloat(&stu[k].sum,&stu[ i].sum); SwapFloat(&stu[k].aver,&stu[i].aver); SwapLong(&stu[k].num,&stu[i] .num); SwapChar(stu[k].name,stu[i].name); } } } /*함수 함수: 사전 순서로 문자열 정렬을 구현하는 교환 방법*/ void SortbyName(STU stu[],int n,int m) { int i,j,t; for(i=0;i { for(j=i+1;j { if(strcmp(stu[j].name, stu[i].name )<0) { for(t=0;t { SwapFloat(&stu[ i].score[t],&stu[j].score[t]); } SwapFloat(&stu[i].sum,&stu[j].sum) ; SwapFloat(&stu[i].aver,&stu[j].aver); SwapLong(&stu[i].num,&stu[j].num); SwapChar(stu[i].name,stu[j].name); } } } } /*기능 기능: 학생 번호로 학생 성적을 검색하고 검색 결과를 표시합니다*/ void SearchbyNum(STU stu[],int n,int m ) { long number; int i,j; printf("검색하려는 숫자를 입력하세요.") ; scanf("%ld",&number); for(i=0;i { if(stu[i].num==번호) { printf("%ld \t%s \t",stu[i].num,stu [ i].name); for(j=0;j { printf("%.0f \t" , 스투[i].점수[j]) ; } printf("%.0f\t%.0f\n",stu[i].sum,stu[i].aver); return; } } printf("\n 찾을 수 없음! \n"); } /*기능: 이름 사전 순서로 결과 테이블 정렬*/ void SearchbyName(STU stu[],int n,int m) { char x[MAX_LEN]; int i,j; printf("검색하려는 숫자를 입력하세요."); scanf("%s",x); for(i=0;i { if(strcmp( stu[i].name,x)==0) { printf("%ld \t%s \t",stu[i].num,stu[ i].name); for(j=0;j { printf("%.0f \t", stu[i].score[j]); } printf("%.0f\t%.0f\n",stu[i].sum,stu[ i].aver); return; } } printf("\n 찾을 수 없음! \n") ; } /*기능: 각 점수 범위의 학생 수와 백분율 계산*/ void StatisticAnalytic(STU stu[], int n,int m) { int i,j,total,t[6]; for(j=0;j { printf("%d 과정의 경우:\n",j+1); memset(t,0,sizeof(t ) ); //배열 t의 모든 요소를 0으로 초기화합니다. for(i=0;i { if( stu[ i].score[j]>=0&&stu[i].score[j]<60) t[0]++; else if (stu[i].score[j]< 70) t[1]++; else if (stu[i].score[j]<80) t[2]++; else if (stu[ i] .score[j]<90) t[3]++; else if (stu[i].score[j]<100) t[4]++; else if (stu[i].score[j]=100) t[5]++; } for(total=0,i=0; i< =5;i++) { total=total+t[i]; } for(i= 0; i<=5;i++) { if(i==0) printf("<60\t%d\t%.2f%%\n" ,t [i],(float)t[i]/n*100); else if(i==5) printf("%d\t%d \t %.2f%%\n",(i+5)*10,t[i],(fl oat)t[i]/n*100); else printf("%d-%d\t%d\t%.2f%%\n", (i+5)*10,(i+5)*19,t[i],(float)t[i]/n*100); } } } /*기능: 학생 점수 인쇄*/ void PrintScore(STU stu[],int n,int m) p > { int i,j; for(i=0;i { printf("%ld\t%s\t",stu[i].num,stu[i].name); for(j=0;j { printf("%.0f\t",stu[i].score[j]); } printf ("%.0f\t%.0f\n",stu[i].sum,stu[i].aver); } } /*n명의 학생 m과목의 학생번호, 이름, 성적을 Student.txt 파일에 출력합니다*/ void WritetoFile(STU stu[],int n,int m) { 파일 *fp; int i,j; if((fp=fopen("student.txt", "w "))==NULL) { printf("score.txt를 열지 못했습니다!\n"); exit(0) ; } fprintf(fp,"%d\t%d\n",n,m) //학생 수와 강좌 수를 파일에 씁니다. for(i=0;i { fprintf(fp,"%10ld%10s",stu[i] .num, stu[i].name); for(j=0;j { fprintf(fp," %10.0f ",stu[i].score[j]); } fprintf(fp,"%10.0f%10.0f\n",stu[i] .sum, stu[i].aver); } fclose(fp); } /*다음에서 읽기 file 학생의 학생 번호, 이름, 성적 및 기타 정보는 구조 배열 stu*/ void ReadfromFile(STU stu[],int *n,int *m) { 파일 *fp; int i,j; if((fp=fopen("student.txt","r")) = =NULL) { printf("score.txt를 열지 못했습니다!\n"); exit(0); } fscanf(fp,"%d\t%d",n,m) //파일에서 학생 수와 강좌 수를 읽습니다. for( i=0;i< *n;i++) { fscanf(fp,"%10ld",&stu[i].num); fscanf(fp,"%10s",stu[i].name); for(j=0;j< *m;j++) { p,"%10f",&stu[i].score[j]); } fscanf(fp,"%10f%10f",&stu[i].sum ,&stu[i].aver); //%10.0f를 사용할 수 없습니다. } fclose(fp); }