#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int shudsave=0; /* */
학생 구조체
{
char num[10] /* 학생 번호*/
char 이름[20];
char sex[4];
int cgrade;
int egrade;
int totle;
int ave;
char Neartime[10] /* 마지막 업데이트 시간*/
}; /p>
typedef 구조체 노드
{
구조 학생 데이터
구조 노드 *next; *링크;
void menu()
{
printf("******************** ************************************************** * ************");
printf("\t1학생정보 등록\t\t\t\t\t2학생정보 삭제\n");
p>printf("\t3학생 정보 조회\t\t\t\t\t4학생 정보 수정\n")
printf("\t5학생 정보 저장\t\t \t \t\t0시스템 종료\n");
printf("******************************** * ************************************************* ** ***\n");
}
void printstart()
{
printf("--- -- ------------------------------------------------ -- ----------------\n");
}
void Wrong()
{
p>
printf("\n======gt; 팁: 입력 오류!\n")
}
void Nofind()
{
printf("\n=====gt; 팁: 학생을 찾을 수 없습니다!\n"); >}
void printc() /* 중국어를 출력하는 함수입니다*/
{
printf("학생번호\t 이름, 성별, 영어점수, 수학점수, C언어점수, 총점, 평균점\n");
}
void printe(Node *p)/* 출력하는 함수입니다. 영어*/
{
printf("-12ss\ts\td\td\td\t d\t d\n", p-gt; data.num, p-gt ; 데이터.이름, p-gt;
-gt;data.egrade,p-gt;data.mgrade,p-gt;data.cgrade,p-gt;data.totle,p-gt;data.ave)
} p> p>
Node* Locate(Link l, char findmess[], char nameornum[]) /* 이 함수는 연결 목록에서 필요한 접점을 찾고 포인터를 반환하는 데 사용됩니다*/
{
노드 *r;
if(strcmp(nameornum, "num")==0) /* 학생 번호로 쿼리*/
{
r=l-gt; 다음;
while(r!=NULL)
{
if(strcmp( r-gt ;data.num, findmess)==0)
return r
r=r-gt; >
}
else if(strcmp(nameornum, "name")==0) /* 이름으로 쿼리*/
{
r =l- gt;
while(r!=NULL)
{
if(strcmp(r-gt;data.name,findmess) ==0 )
return r;
r=r-gt; p>return 0;
}
void Add(Link l) /* 학생 추가*/
{
노드 *p , *r , *s;
문자 번호[10]
s=l-gt;
while(r-gt; next!=NULL)
r=r-gt; /* 포인터를 끝에 놓습니다*/
while(1)
{
printf("학생 번호를 입력하세요. ('0'으로 이전 메뉴로 돌아갑니다:)")
scanf("s" , num) ;
if(strcmp(num, "0")==0)
break; p>{
if(strcmp(s-gt;data.num,num)==0)
{
printf("==== =gt; 팁: 학생 번호가 's'인 학생이 이미 존재합니다. 수정하려면 '4 수정'을 선택하세요!\n", num);
printstart(); p>
printc( );
printe(s);
printstart()
printf("\n"); >
반환;
}
s=s-gt;
}
p=(노드 *) malloc(sizeof(Node)) ;
strcpy(p-gt; data.num, num)
printf("이름을 입력하세요: ");
scanf("s ",p-gt;data.name) <
/p>
getchar();
printf("성별을 입력하세요:")
scanf("s", p-gt; data.sex);
getchar();
printf("C 언어 점수를 입력하세요:")
scanf("d",amp;p-gt; data.cgrade);
getchar();
printf("수학 점수를 입력하세요: ");
scanf("d", amp; p-gt; data.mgrade);
getchar();
printf("영어 점수를 입력하세요: "); ", amp; p-gt; data.egrade);
getchar();
p-gt; data.totle=p-gt; data.egrade p-gt; data.cgrade p-gt; data.mgrade; data.ave=p-gt;
/* 정보 입력이 완료되었습니다. * /
p-gt; 다음=NULL;
r-gt; shudsave =1;
}
}
void Qur(Link l) /* 학생 쿼리*/
{
int sel;
char findmess[20];
노드 *p>if(!l-gt;next)
{
printf("\n=====gt; 팁: 쿼리할 정보가 없습니다!\n")
return; >
}
printf("\n======gt; 1 학생 번호로 검색\n======gt; 2 이름으로 검색\n"); /p>
scanf("d", amp; sel)
if(sel==1)/* 학생 번호*/
{
printf(" 찾으려는 학생 번호를 입력하세요: ")
scanf("s", findmess)
p=Locate(l, findmess, " num");
p>
if(p)
{
printf("\t\t\t\t검색 결과\n" );
printstart();
printe(p); >
}
else
Nofind()
}
else if(sel==2) /* 이름 */
{
printf("찾고 있는 이름을 입력하세요:")
scanf("s", findmess)
p>p=Locate(l, findmess, "이름")
if(p)
{
printf("\t\ t\t\t결과 찾기\n") ;
printstart();
printc();
printe(p);
printstart();
}
else
Nofind();
}
else
Wrong()
}
void Del(Link l) /* */ 삭제
{
int sel;
노드 *p, *r
char findmess[20]
p>p>
if(!l-gt; next)
{
printf("\n=====gt; 팁: 데이터 없음 삭제할 수 있습니다!\n ");
return;
}
printf("\n======gt; 1 학생이 삭제 number\n==== =gt;2이름으로 삭제\n");
scanf("d", amp; sel);
if(sel==1)
{
printf("삭제할 학생 번호를 입력하세요:")
scanf("s", findmess)
p=찾기(l, findmess, "num");
if(p)
{
r=l;
while(r -gt; next!=p)
r=r-gt; 다음; p>
무료 (p);
printf("\n======gt; 팁: 학생이 성공적으로 삭제되었습니다!\n"); >shoudsave=1;
}
else
Nofind()
}
else if( sel==2)
{
printf("삭제할 이름을 입력하세요: ")
scanf("s", findmess);
p =Locate(l, findmess, "이름")
if(p)
{
r=l;
while(r-gt; next!=p)
r=r-gt; next=p-gt; next;
free(p);
printf("\n=====gt; 팁: 학생이 성공적으로 삭제되었습니다!\n"); >
shoudsave=1;
}
else
Nofind()
}
else
잘못됨 ();
}
void 수정(링크 l)
{
노드 * p;
char findmess[20];
if(!l-gt;next)
{
printf("\ n======gt; 프롬프트 : 데이터를 수정할 수 없습니다!\n");
return;
}
printf("제발 수정할 학생 ID 번호를 입력하세요:") ;
scanf("s", findmess);
<p>p=Locate(l, findmess, "num");
if(p)
{
printf("새 학생 번호를 입력하세요. (원래 s): ", p-gt; data.num);
scanf("s", p-gt; data.num);
printf("부탁드립니다. 새 이름 입력(원래 s): ", p-gt; data.name);
scanf ("s", p-gt; data.name);
getchar ();
printf("새 성별을 입력하세요(원래 s): ", p-gt; data.sex)
scanf("s", p -gt ; data.sex);
printf("새 C 언어 점수를 입력하세요(원래 d 점수): ", p-gt; data.cgrade)
scanf(" d",&p-gt;data.cgrade);
getchar();
printf("새 수학 점수(원래는 d점)를 입력하세요: ", p-gt ; data.mgrade);
scanf("d", amp; p-gt; data.mgrade)
getchar(); "새 영어 점수를 입력하세요(원래 d 점수): ", p-gt; data.egrade)
scanf("d", p -gt; data.egrade); p>
p-gt; data.egrade p-gt; data.mgrade; p-gt; data.totle/3;
printf("\n======gt; 팁: 데이터가 성공적으로 수정되었습니다!\n"); 1;
}
else
Nofind()
}
void Disp(링크 l)
{
int count=0;
노드 *p
p=l -gt;
if(!p)
{
printf("\n======gt; 팁: 데이터를 표시할 수 없습니다 !\n"); /p>
return;
}
printf("\t\t\t\t결과 표시\n")
p>
printstart();
printc();
printf("\n")
동안(p)
{
printe(p);
p=p-gt;
}
printstart(); >
printf("\n");
}
void Tongji(링크 l)
{
노드 * pm, *pe, *pc, *pt, *pa /* 가장 높은 점수를 받은 연락처를 가리키는 데 사용됩니다.*/
노드 *r=l-gt; p>if(!r)
{
printf("
\n======gt; 팁: 계산할 데이터가 없습니다!\n");
return;
}
pm= pe=pc =pt=pa=r;
while(r!=NULL)
{
if(r-gt;data.cgradegt;= pc-gt ;data.cgrade)
pc=r;
if(r-gt;data.mgradegt;=pm-gt;data.mgrade)
pm =r;
if(r-gt;data.egradegt;=pe-gt;data.egrade)
pe=r; if(r -gt;data.totlegt;=pt-gt;data.totle)
pt=r
if(r-gt;data.avegt;= pa-gt;data .ave)
pa=r;
r=r-gt; 다음; ("--- -------------통계 결과---- --------- -----------\n");
printf("총점이 가장 높은 사람: \ts d점\n" , pt-gt; data.name, pt-gt ;data.totle);
printf("평균 점수가 가장 높은 것: \ts d 점수\n", pa-gt; data. name, pa-gt; data.ave);
printf("영어에서 가장 높은 점수를 받은 것: \ts d points\n", pe-gt; data.name, pe-gt; data.egrade);
printf("수학에서 가장 높은 점수를 받은 것:\n" ts d points\n", pm-gt; data.name, pm-gt; data.mgrade) ;
printf("c 언어에서 가장 높은 값:\ts d 포인트\n", pc-gt ;data.name, pc-gt; data.cgrade)
printstart ();
}
void Sort(링크 l)
{
링크 ll
노드 *p, *rr, *s;
ll=(Link)malloc(sizeof(Node)) /* 새로운 조인 테이블을 생성하는 데 사용됨*/
ll-gt ; next=NULL;
if(l-gt; next==NULL)
{
printf("\n=====gt; 팁: 정렬할 수 있는 데이터가 없습니다!\n");
return;
}
p=l-gt; next;
while(p)
{
s=(Node*)malloc( sizeof(Node)) /* 정보를 저장하기 위해 새 연락처 만들기*/
s-gt; 데이터=p-gt; next=NULL; rr-gt;next!=NULL amp;amp; rr-gt;next-gt;data.totlegt;=p-gt;data .totle)
r
r=rr-gt;
if(rr-gt; next==NULL)
rr-gt;
else
{
s-gt; 다음=rr-gt; /p>
p=p-gt; 다음;
}
무료(l)
l-gt; ;next;
printf("\n=====gt; 팁: 정렬이 완료되었습니다!\n")
}
void 저장( 링크 l)
{
FILE* fp>노드 *p
int flag=1, count=0; /p>
fp=fopen("c:\\student", "wb")
if(fp==NULL)
{
printf("\n======gt; 팁: 파일을 다시 여는 동안 오류가 발생했습니다!\n")
exit(1);
p=l-gt; 다음;
while(p)
{
if(fwrite(p, sizeof(Node) ) , 1, fp)==1)
{
p=p-gt; 다음;
else
{
flag=0
break; > }
if(flag)
{
printf("\n=====gt; 팁: 파일이 성공적으로 저장되었습니다. d 개의 레코드가 이미 저장되어 있습니다.)\n", count);
shoudsave=0;
}
fclose(fp);
}
void main()
{
링크 l;/* 연결 목록*/
FILE *fp; * 파일 포인터 */
int sel;
char jian; >
노드 *p, *r;
printf("\t\t\t\t학생 점수 관리 시스템\n\t\t\t\t-------푸젠 농업전문대학 회계학 0501 황환(32번)\n");
l=(Node*)malloc(sizeof(Node));
l-gt; next =NULL ;
r=l;
fp=fopen("C:\\student","rb")
if(fp== NULL)
{
printf("\n======gt; 팁: 파일이 아직 존재하지 않습니다. 파일을 생성하시겠습니까? (y/n)\n");
scanf("c",amp;jian);
if(jian=='y'||jian=='Y ')
fp=fopen("C:\\student", "wb")
else
ex
it(0);
}
printf("\n=====gt; 팁: 파일이 열렸으며 레코드를 가져오는 중입니다...\n" );
while(!feof(fp))
{
p=(Node*)malloc(sizeof(Node))
if(fread(p, sizeof(Node), 1, fp)) /* 파일 내용을 접점에 넣습니다*/
{
p- gt; next=NULL;
r-gt; next=p;
r=p; /* 이 연락처를 연결에 넣습니다. ;
}
}
fclose(fp) /* 파일 닫기*/
printf("\n== == =gt; 팁: 레코드 가져오기가 완료되었으며 ***d개의 레코드를 가져왔습니다.\n", count);
while(1)
{
menu();
printf("작업을 선택하세요:")
scanf("d", amp; sel); >if(sel ==0)
{
if(shoudsave==1)
{ getchar()
printf ("\n =====gt; 팁: 데이터가 변경되었습니다. 변경 사항을 파일에 저장하시겠습니까(y/n)?\n")
scanf(" c", amp; ch);
if(ch=='y'||ch=='Y')
저장(l);
}
printf("\n======gt; 팁: 시스템을 종료했습니다. 안녕!\n")
break;
}
switch(sel)
{
case 1: Add(l) /* 학생 추가*/
케이스 2: Del(l); /* 학생 삭제 */
케이스 3: Qur(l) /* 학생 쿼리*/
4: 수정(l); break; /* 학생 수정*/
case 5: Save(l) /* 학생 저장*/
printf( "\t\t\t==== ======도움말 정보==========\n"); break; (); 중단;
}
}
}
/* */
/*
학생 성적 관리 절차
학생 시험 성적 관리 프로그램을 준비합니다.
학생의 성적이 각 학생에 대한 하나의 기록 형식으로 파일에 저장되었다고 가정합니다.
각 학생의 기록에 포함된 정보에는 이름, 학생 번호 및 정보가 포함됩니다. 과목별 성적.
프로그램에는 다음과 같은 기능이 있습니다: 이름별로 각 과목의 총점과 평균 점수 찾기,
학생 번호별로 기록 찾기 및 표시, 모든 학생 점수 검색 및 학생 표시 총점을 기준으로 높은 순으로 정보를 제공합니다.
*/
#include lt;
#define SWN 3 /* 강좌 수*/
# Define NAMELEN 20 /* 이름의 최대 문자 수*/
#define CODELEN 10 /* 학생 ID 번호의 최대 문자 수*/
#define FNAMELEN 80 /* 최대 파일 이름의 문자 수*/
#define BUFLEN 80 /* 버퍼의 최대 문자 수*/
/* 강좌 이름 테이블*/
char schoolwork[SWN][NAMELEN 1] = {"중국어", "수학", "영어"}
구조 기록
{
char name[NAMELEN 1]; /* 이름* /
char code[CODELEN 1] /* 학생 번호*/
int mark[SWN] /* 각 과목의 성적 */
int total ; /* 총 점수*/
}stu
구조체 노드
{
char name[NAMELEN 1]; /* 이름*/
char code[CODELEN 1] /* 학생 번호*/
int marks[SWN]; 각 코스*/
int total; /* 총 점수*/
struct node *next; head; /* 연결된 목록 헤드 포인터*/
int total[SWN] /* 각 코스의 총 점수*/
FILE *stfpt; /p>
char stuf[FNAMELEN]; /* 파일 이름*/
/* 지정된 파일에서 레코드 읽기*/
int readrecord(FILE *fpt, 구조체 레코드 *rpt)
{
char buf[BUFLEN]
int i
if(fscanf(fpt, " s", buf)!=1)
return 0; /* 파일 끝*/
strncpy(rpt-gt; name, buf, NAMELEN);
fscanf(fpt, "s", buf);
strncpy(rpt-gt; 코드, buf, CODELEN)
for(i=0; ilt; SWN ; i)
fscanf(fpt, " d",&rpt-gt;marks[i])
for(rpt-gt;total=0,i=0 ;ilt;SWN;i)
rpt -gt; total =rpt-gt;
return 1; >
/* 지정된 파일에 레코드 쓰기*/
writerecord(FILE *fpt, struct Record *rpt)
>
{
int i;
fprintf(fpt, "s\n", rpt-gt; 이름)
fprintf(fpt, "s\n", rpt-gt; 코드)
for(i=0; ilt; SWN; i)
fprintf(fpt, "d\n", rpt -gt; mark[i]);
return;
}
/* 학생 기록 표시*/
displaystu(struct 레코드 *rpt)
{
int i;
printf("\n이름: s\n", rpt-gt; 이름); >
printf("코드: s\n", rpt-gt; 코드)
printf("표시:\n")
for(i=0 ; ilt; i )
printf(" -15s : 4d\n",schoolwork[i],rpt-gt;marks[i])
printf(" Total: 4d\n", rpt-gt; total);
}
/* 각 과목의 총점을 계산합니다*/
int totalmark( char *fname)
{
FILE *fp;
구조 레코드
int count, i ;
if((fp=fopen(fname,"r"))==NULL)
{
printf("파일 s를 열 수 없습니다.\n", fname );
return 0;
}
for(i=0; ilt; SWN; i)
합계[i ] =0;
count=0;
while(readrecord(fp,amp;s)!=0)
{
for(i=0;ilt;SWN;i)
total[i] =s.marks[i]
count; /p>
p>
fclose(fp);
return count; /* 레코드 수를 반환합니다*/
}
/* 학생 정보를 목록으로 표시*/
voidlisttu(char *fname)
{
FILE *fp> 구조체 레코드 s;
if((fp=fopen(fname,"r"))==NULL)
{
printf("할 수 없습니다. 파일 s를 엽니다.\n",fname) ;
return ;
}
while(readrecord(fp,amp;s)!=0)
{
displaystu(amp;s);
printf("\n 계속하려면 Enter 키를 누르세요...\n"); p>while(getchar()!=' \n'
);
}
fclose(fp);
return;
}
/* 연결된 목록 */
struct node *makelist(char *fname)
{
FILE *fp>struct Record s;
p>
구조체 노드 *p, *u, *v, *h
int i
if((fp=fopen( fname,"r")) ==NULL)
{
printf("s 파일을 열 수 없습니다.\n", fname)
NULL을 반환합니다.
}
h=NULL;
p=(struct node *)malloc(sizeof(struct node)); p>while(readrecord(fp , (구조 레코드 *)p)!=0)
{
v=h
while(vamp;amp ;p-gt;totallt; =v-gt; 총계)
{
u=v; p>
}
if(v==h)
h=p
else
u-gt; next=p; next=v;
p=(구조체 노드 *)malloc(sizeof(구조체 노드))
}
free(p);
fclose(fp);
}
/ * 연결된 목록의 요소를 순서대로 표시합니다 */
void displaylist(struct node *h)
{
while(h!=NULL)
{
displaystu((struct Record *)h)
printf("\n 계속하려면 Enter를 누르세요...\n")
p>
while(getchar() !='\n');
h=h-gt;
}
return;
} p>
/* 학생 이름으로 학생 기록 검색*/
intretrievebyn(char *fname, char *key)
{
FILE * fp;
int c;
구조 레코드
if((fp=fopen(fname, " r"))==NULL) p>
{
printf("파일을 열 수 없습니다.\n",fname);
return 0;
}
p>
c=0;
while(readrecord(fp,amp;s)!=0)
{
if(strcmp(s .name, key)==0)
>
{
디스플레이스투(amp;s)
c
}
}
fclose(fp);
if(c==0)
printf("학생 s는 파일 s에 없습니다.\n", key, fname); /p>
return 1;
}
/* 학생 번호로 학생 기록 검색*/
intretrievebyc(char *fname, char * 키)
{
FILE *fp>
int c
구조 레코드
if ((fp=fopen(fname,"r"))==NULL)
{
printf("파일을 열 수 없습니다.\n",fname); /p>
0을 반환
}
c=0
while(readrecord(fp,amp;s)!=0)
{
if(strcmp(s.code,key)==0)
{
displaystu(amp;s) ;
c ;
휴식;
}
}
fclose(fp);
if(c==0)
printf("학생 s는 파일 s에 없습니다.\n", key, fname)
return 1; /p>
}
main()
{
int i, j, n
char <; /p>
char buf[BUFLEN];
FILE *fp;
구조 레코드
clrscr(); p>printf("학생 성적 기록 파일 이름을 입력하세요: ")
scanf("s",stuf)
if((fp=fopen(stuf, ") r"))==NULL)
{
printf("파일 s가 종료되지 않습니다. 파일을 생성하시겠습니까? (Y/N) ",stuf ) ;
getchar();
c=getchar()
if(c=='Y'||c=='y') /p>
{
fp=fopen(stuf, "w");
printf("파일에 쓰려는 레코드 번호를 입력하세요: " ) ;
scanf("d", amp; n);
for(i=0; ilt; n; i)
{
printf("학생 이름을 입력하세요: ")
scan
f("s",amp;s.name);
printf("학생의 코드를 입력하세요: ")
scanf("s",amp;s.code) ;
for(j=0;jlt;SWN;j)
{
printf("s 표시를 입력하세요: ",schoolwork[j]) ;
scanf("d",amp;s.marks[j])
}
writerecord(fp,amp;s); p>
p>
}
fclose(fp)
}
}
fclose(fp) ;
getchar();
/*clrscr();*/
puts("이제 레코드를 관리하는 명령을 입력할 수 있습니다.") ;
puts("m : 점수의 평균.");
puts("t : 점수의 총합.")
puts( "n : 학생 이름으로 기록을 검색합니다.");
puts("c: 학생 코드로 기록을 검색합니다.")
puts("l: 모든 기록을 나열합니다. ");
puts("c: 학생 코드로 기록을 검색합니다.");
puts("l: 모든 기록을 나열합니다."); p>
puts ("s: 합계를 기준으로 레코드를 정렬하고 나열합니다.")
puts("q: quit!")
while(1)
{
puts("명령어를 입력하세요: ");
scanf(" c",amp; c) /* 선택 명령 입력*/
if(c=='q'||c=='Q')
{
puts("\n 이용해 주셔서 감사합니다. ")
break; /* q, 프로그램 실행 종료*/
}
switch(c)
{ p>
case 'm': /* 평균 점수 계산*/
case 'M':
if((n=totalmark(stuf))==0)
{
puts("오류!");
break;
}
printf(" \n")
for(i=0; ilt; SWN; i )
printf("-15세의 평균은: .2f.\n",schoolwork[i] , (float)total[ i]/n);
break;
case 't': /* 총점 계산*/
case 'T':
if((n=totalmark(stuf))==0)
{
puts("오류!")
break; /p>
}
printf("\n");
for(i=0; ilt; SWN; i )
printf("-15s의 총 성적은 d.\n",schoolwork [i], total[i]);
break;
case 'n': /* 학생 이름으로 기록 찾기*/
case ' N ':
printf("검색하려는 학생의 이름을 입력하세요: ")
scanf("s",buf)
retrievebyn ( stuf, buf);
break;
case 'c': /* 학생 번호로 기록 검색*/
case 'C': p>
printf("검색하려는 학생의 코드를 입력하세요: ");
scanf("s",buf)
retrievebyc(stuf, buf) ;
break;
case 'l': /* 모든 학생 기록 나열*/
case 'L':
liststu (stuf);
break;
case 's': /* 총점에 따라 높은 순으로 표시*/
case ' S' :
if((head=makelist(stuf))!=NULL)
displaylist(head)
break; 기본값: 중단;
}
}
}