📄 chengjiguanli2.c
字号:
/*问题:读取时第一个接点少了个0 */
/* 系统要求: */
/* 成绩管理功能(添加 删除 排序) */
/* 成绩统计功能(最高分 最低分 平均分 及格率) */
/* 实现按学号 姓名 课程名查询成绩功能 */
/* 学生成绩纪录包括(学号 姓名 院系 年级 班级 课程名 成绩) */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* 为减少数据冗余,用两个文件分别保存学生信息(学号 院 */
/* 系 年级 班级)和(学号 姓名 课程名 成绩) */
/* 设计两个结构体用于读写信息 */
typedef struct student1{
char no[10];
char college[10];
int grade;
int clas;
struct student1 * next;
} stu1;
typedef struct student2{
char no[10];
char name[10];
char course[20];
int result;
struct student2 * next;
} stu2;
/* 全局变量 */
FILE * fp1 = NULL, * fp2 = NULL;
stu1 * h1 = NULL;
stu2 * h2 = NULL;
void menu(); /* 显示菜单 */
void manage(); /* 成绩管理 */
void statistics();/* 统计成绩 */
void query(); /* 查询 */
void re_info1();
void re_info2();
void saveinfo1();
void saveinfo2();
void add();
void del();
void sort();
void q_no();
void q_na();
void q_c();
void clr1();
void clr2();
void JianCe();
/* 主函数 */
void main()
{
char flag = '1';
h1 = (stu1 *) malloc (sizeof(stu1));
h2 = (stu2 *) malloc (sizeof(stu2));
if(!h1 || !h2){
printf("\nmalloc error!\n");
exit(0);
}
h1->next = NULL;
h2->next = NULL;
do{
clrscr();
menu();
flag = getch();
switch(flag){
case '1': manage(); break;
case '2': statistics(); break;
case '3': query(); break;
default: ;
}
}while(flag != '0');
printf("\nThank you for using,Goodbye!\n");
getch();
}
void menu()
{
printf("\n\n\n\n\n***MENU:******************************\n");
printf("\n 0:exit\n");
printf("\n 1:manage\n");
printf("\n 2:statistics\n");
printf("\n 3:query\n");
printf("\nPlease enter the nummber witch you want\n");
printf("\n***************************************");
}
void JianCe()
{
stu1 * p = NULL;
stu2 * r = NULL;
for(p=h1->next;p!=NULL;p=p->next)
{
printf("\n%s %s %d %d\nJianCe\n",p->no,p->college,p->grade,p->clas);
}
for(r=h2->next;r!=NULL;r=r->next)
{
printf("\n%s %s %s %d\nJianCe\n",r->no,r->name,r->course,r->result);
}
return;
}
/* 清理单链表1上的信息 */
void clr1()
{
stu1 * w = NULL, * a = NULL;
w = h1->next;
a = w->next;
h1->next = NULL;
while(w!=NULL){
free(w);
w = a;
a = a->next;
}
}
/* 清理单链表2上的信息 */
void clr2()
{
stu2 * w = NULL, * a = NULL;
w = h2->next;
a = w->next;
h2->next = NULL;
while(w!=NULL){
free(w);
w = a;
a = a->next;
}
}
/* 把文件stu1.txt里的信息读到h1单链表中去 */
void re_info1()
{
stu1 * p = NULL;
char ch='0';
fp1 = fopen("stu1.txt","r");
if(!fp1){
printf("\nOpen file stu1.txt error!\n");
sleep(2); exit(0);
}
while(!feof(fp1)){
fseek(fp1,2L,1);
if((ch=fgetc(fp1))==EOF)
{
fseek(fp1,-2L,1);
break;
}
else
fseek(fp1,-2L,1);
p = (stu1 *) malloc (sizeof(stu1));
if(!p)
{
printf("re_infol malloc error!\n");
sleep(2); exit(1);
}
fscanf(fp1,"%s%s%d%d",&(p->no),&(p->college),&(p->grade),&(p->clas));
p->next = h1->next;
h1->next = p;
}
fclose(fp1);
ch = '0';
return;
}
/* 把文件stu2.txt里的信息读到h2单链表中去 */
void re_info2()
{
stu2 * p = NULL;
char ch='0';
fp2 = fopen("stu2.txt","r");
if(!fp2){
printf("\nOpen file stu2.txt error!\n");
exit(0);
}
while(!feof(fp2)){
fseek(fp2,2L,1);
if((ch=fgetc(fp2))==EOF)
{
fseek(fp2,-2L,1);
break;
}
else
fseek(fp2,-2L,1);
p = (stu2 *) malloc (sizeof(stu2));
if(!p)
{
printf("re_info2 malloc error!\n");
sleep(2);
exit(1);
}
fscanf(fp2,"%s%s%s%d",&(p->no),&(p->name),&(p->course),&(p->result));
p->next = h2->next;
h2->next = p;
}
fclose(fp2);
ch = '0';
return;
}
/* 保存单链表信息 */
/* 把h1单链表的信息保存到文件stu1.txt中 */
void saveinfo1()
{
stu1 * p = NULL;
fp1 = fopen("stu1.txt","w");
if(!fp1){
printf("\nSave file stu1.txt error!\n");
exit(0);
}
p = h1->next;
while(p!=NULL){
fprintf(fp1,"%s%c%s%c%d%c%d%c",p->no,'\n',p->college,'\n',p->grade,'\n',p->clas,'\n');
p = p->next;
}
fclose(fp1);
}
/* 保存单链表信息 */
/* 把h2单链表的信息保存到文件stu2.txt中 */
void saveinfo2()
{
stu2 * p = NULL;
fp2 = fopen("stu2.txt","w");
if(!fp2){
printf("\nSave file stu2.txt error!\n");
exit(0);
}
p = h2->next;
while(p!=NULL){
fprintf(fp2,"%s%c%s%c%s%c%d%c",p->no,'\n',p->name,'\n',p->course,'\n',p->result,'\n');
p = p->next;
}
fclose(fp2);
}
/* 添加信息 */
void add()
{
stu1 * p = NULL;
stu2 * r = NULL, * s = NULL;
re_info1(); /* 读信息到链表 */
re_info2();
/* JianCe(); sleep(8); clrscr(); */
r = h2->next;
p = (stu1 *) malloc (sizeof(stu1));
s = (stu2 *) malloc (sizeof(stu2));
printf("\nPlease enter the no_college_grade_clas\n");
scanf("%s%s%d%d",&(p->no),&(p->college),&(p->grade),&(p->clas));
p->next = NULL;
printf("\n%s %s %d %d",p->no,p->college,p->grade,p->clas);
printf("\nPlease enter the no_name_course_result\n");
scanf("%s%s%s%d",&(s->no),&(s->name),&(s->course),&(s->result));
s->next = NULL;
printf("\n%s %s %s %d",s->no,s->name,s->course,s->result);
while(r!=NULL)
{
if(strcmp(r->no,s->no)==0)
{ /* 如果有相同学号 */
if(strcmp(r->course,s->course)==0){ /* 如果有相同课程名 */
r->result = s->result;
break;
}
if(r->next == NULL){ /* 如果没有相同课程名 */
r->next = s;
break;
}
}
else
{ /* 如果没相同学号 */
if(r->next==NULL)
{
r->next = s;
p->next = h1->next;
h1->next = p;
break;
}
}
r = r->next;
}
/* JianCe(); getch(); clrscr(); */
saveinfo1();
saveinfo2();
clr1();
clr2();
printf("\nAdd Ok! Please enter to back.\n");
getch();
return;
}
/* 删除信息 */
void del()
{
char c = '0';
char no[10];
char course[20];
stu1 * p = NULL, * q = NULL;
stu2 * r = NULL, * s = NULL;
re_info1();
re_info2();
p = h1;
r = h2;
JianCe(); sleep(8); clrscr();
printf("\nIf you want to delete a student enter 1\n");
printf("\nIf you want to delete a course enter 2\n");
c = getch();
if(c=='1'){ /* 删除满足学号的学生 */
printf("\nPlease enter the no.\n");
gets(no);
/* 在h1上删除 */
while(p->next!=NULL){
q = p->next;
if(strcmp(q->no,no)==0){
p->next = q->next;
free(q);
break;
}
p = p->next;
}
/* 在h2上删除 */
while(r->next!=NULL){
s = r->next;
if(strcmp(s->no,no)==0){
r->next = s->next;
free(r);
continue;
}
r = r->next;
}
printf("\ndel student ok!\n");
}
else if(c=='2'){ /* 删除某学生的某课程(只在h2上删除) */
printf("\nPlease enter the no.\n");
gets(no);
printf("\nPlease enter the course\n");
gets(course);
while(r->next!=NULL){
s = r->next;
if(strcmp(s->no,no)==0 && strcmp(s->course,course)==0){
r->next = s->next;
free(s);
continue;
}
r = r->next;
}
printf("\nDel course ok!\n");
}
else{ /* 不删除 */
clr1();
clr2();
return;
}
saveinfo1();
saveinfo2();
clr1();
clr2();
return;
}
/* 排序(不保存,只做一下按学号排序,其他类似) */
void sort()
{
stu2 * p = NULL, * q = NULL, * s = NULL;
re_info2();
p = h2->next;
q = h2->next;
while(p){
s = h2->next;
while(s!=q->next && strcmp(p->no,s->no)<0)
s = s->next;
q->next = p->next;
p->next = s->next;
s->next = p;
p = q->next;
}
s = h2->next;
while(s!=NULL){
printf("\nNo.is %s\tName is %s\tcourse is %s\tresult is %d\n",s->no,s->name,s->course,s->result);
s = s->next;
}
clr2();
return;
}
/* 按学号查询 */
void q_no()
{
char no[10];
int flag = 0;
stu2 * p = h2->next;
printf("\nPlease enter the no.\n");
gets(no);
while(p!=NULL){
if(strcmp(p->no,no)==0){
printf("\nNo.is %s\tName is %s\tcourse is %s\tresult is %d\n",p->no,p->name,p->course,p->result);
flag++;
}
p = p->next;
}
if(!flag)
printf("No one!\n");
printf("Please enter to back!\n");
return;
}
/* 按姓名查询 */
void q_na()
{
char na[10];
int flag = 0;
stu2 * p = h2->next;
printf("\nPlease enter the name\n");
gets(na);
while(p!=NULL){
if(strcmp(p->name,na)==0){
printf("\nNo.is %s\tName is %s\tcourse is %s\tresult is %d\n",p->no,p->name,p->course,p->result);
flag++;
}
p = p->next;
}
if(!flag)
printf("No one!\n");
printf("Please enter to back!\n");
return;
}
/* 按课程名查询 */
void q_c()
{
char course[20];
int flag = 0;
stu2 * p = h2->next;
printf("\nPlease enter the course\n");
gets(course);
while(p!=NULL){
if(strcmp(p->course,course)==0){
printf("\nNo.is %s\tName is %s\tcourse is %s\tresult is %d\n",p->no,p->name,p->course,p->result);
flag++;
}
p = p->next;
}
if(!flag)
printf("No one!\n");
printf("Please enter to back!\n");
return;
}
/* manage */
void manage()
{
char ch1 = '1';
do{
clrscr();
printf("\n\n\n\n\n***manage:*****************************\n");
printf("\n 0:return\n");
printf("\n 1:add\n");
printf("\n 2:del\n");
printf("\n 3:sort\n");
printf("\nPlease enter the nummber witch you want\n");
printf("\n***************************************");
ch1 = getch();
switch(ch1){
case '1': clrscr();add(); break;
case '2': clrscr();del(); break;
case '3': clrscr();sort(); break;
default: ;
}
}while(ch1 != '0');
printf("\nmanage Ok!\n");
}
/* 统计 */
void statistics(){ /* 统计方面需扩展一下,分按姓名统计和按课程统计 */
int max = 0, min =100;
double ave = 0, pa = 0, count = 0;
stu2 * p = NULL;
clrscr();
re_info2();
p = h2->next;
while(p!=NULL){
printf("\nstatistics start!\n");
if(p->result > max)
max = p->result;
if(p->result < min)
min = p->result;
if(p->result > 60)
pa++;
count++;
ave += p->result;
p = p->next;
}
fp1 = fopen("tongji.txt","w");
if(!fp1){
printf("\nopen file tongji.txt error!\n");
exit(0);
}
printf("\nmax=%d\nmin=%d\nave=%g\npass=%g\n",max,min,ave/count,pa/count);
fprintf(fp1,"%s%d%c%s%d%c","max is:",max,'\n',"min is:",min,'\n');
fprintf(fp1,"%s%g%c%s%g%c","ave is:",ave/count,'\n',"pass is:",pa/count,'\n');
printf("\n statistics ok!");
sleep(5);
clr2();
fclose(fp1);
}
/* 查询 */
void query(){
char ch2 = '1';
re_info2();
do{
clrscr();
printf("\n\n\n\n\n***query:*****************************\n");
printf("\n 0:return\n");
printf("\n 1:query by no.\n");
printf("\n 2:query by name\n");
printf("\n 3:query by course\n");
printf("\nPlease enter the nummber witch you want\n");
printf("\n***************************************");
JianCe();
ch2 = getch();
switch(ch2){
case '1': clrscr();q_no(); getch(); break;
case '2': clrscr();q_na(); getch(); break;
case '3': clrscr();q_c(); getch(); break;
default: ;
}
}while(ch2 != '0');
clr2();
printf("\nquery over!\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -