📄 student.cpp
字号:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
const SUB_AMOUNT = 4;/*保存考试科目总数*/
const NAME_LEN = 8; /*姓名长度*/
struct Student
{
char name[NAME_LEN]; /*保存姓名*/
char sex; /*保存性别,0为男,1为女*/
long StudyNum; /*保存学号*/
float score[SUB_AMOUNT]; /*保存各科分数*/
float total; /*保存总分数*/
struct Student *next; /*定义指向下一个结构体的指针*/
};
#define STU struct Student
STU *HEAD = NULL;/*链表的头指针*/
void main()
{
int FunNumber;
STU *create();
void AddStudent();
void output();
void ChangeStudent();
void DelStudent();
void paixu();
void SearchStudent();
printf("学生成绩记录为空,输入1创建,0退出:");
scanf("%d",&FunNumber);
if (1 == FunNumber) HEAD = create();
else
{
printf("退出系统!");
exit(0);
}
if(NULL == HEAD) /*创建学生纪录不成功*/
{
printf("退出系统!");
exit(0);
}
do{
printf("************************\n");
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("************************\n");
printf("请输入选择号(1--7):");
scanf("%d",&FunNumber);
switch(FunNumber)
{
case 1:
AddStudent();
break;
case 2:
output();
break;
case 3:
ChangeStudent();
break;
case 4:
DelStudent();
break;
case 5:
paixu();
break;
case 6:
SearchStudent();
break;
case 7:
break;
default:
printf("输入错误!");
break;
}
}while(FunNumber!=7);
printf("退出系统!");
}
STU *create()/*建立学生成绩的纪录,按学号从小到大插入学生信息*/
{
int num=0;/*学生个数*/
long number = -1;
STU *p,*q,*find;
char name[NAME_LEN];
int i,sex;
float cent,totalscore = 0;
int CheckStudyNum(const long);
printf("开始创建学生成绩记录!");
printf("第%d个学生:",num+1);
printf("请输入学号(为0时结束):");
scanf("%ld",&number);
while(number < 0)
{
printf("输入错误,请输入学号(为0时结束):");
scanf("%ld",&number);
}
if (0 == number) return NULL;
while( 0 != number )
{
num++;
p = new STU;
p->StudyNum = number;
printf("请输入姓名:");
scanf("%s",name);
for(i=0;i<NAME_LEN;i++)
p->name[i] = name[i];
printf("请输入性别:");
scanf("%d",&sex);
p->sex = sex;
printf("请依次输入各科分数,共%d科:",SUB_AMOUNT);
totalscore = 0;
for(i=0;i<SUB_AMOUNT;i++)
{
scanf("%f",¢);
p->score[i] = cent;
totalscore += cent;
}
p->total = totalscore;
if (1 == num)
{
q = HEAD = p;
q->next = NULL;
}
else
{
find = HEAD;
if(find->StudyNum > number) /*插入头结点之前*/
{
HEAD = p;
p->next = find;
}
else
{
while((NULL != find->next) && (find->StudyNum < number))
find = find->next;
if(NULL == find->next)/*插入链表尾部*/
{
q->next = p;
q = q->next;
q->next = NULL;
}
else/*插入p与p->next之间*/
{
p->next = find->next;
find->next = p;
}
}
}
printf("第%d个学生:",num+1);
lp: printf("请输入学号(为0时结束):");
scanf("%ld",&number);
while (number < 0)
{
printf("输入错误,请输入学号(为0时结束):");
scanf("%ld",&number);
}
if(0 == CheckStudyNum(number))
{
printf("输入错误!");
goto lp;
}
}
return HEAD;
}
void AddStudent()
{
int CheckStudyNum(const long);
long number;
STU *p,*find;
char name[NAME_LEN];
int i,sex;
float cent,totalscore = 0;;
lp: printf("请输入学号:");
scanf("%ld",&number);
while (number <= 0)
{
printf("输入错误,请输入学号:");
scanf("%ld",&number);
}
if (0 == CheckStudyNum(number))
{
printf("输入错误!");
goto lp;
}
p = new STU;
p->StudyNum = number;
printf("请输入姓名:");
scanf("%s",name);
for(i=0;i<NAME_LEN;i++)
p->name[i] = name[i];
printf("请输入性别:");
scanf("%d",&sex);
p->sex = sex;
printf("请依次输入各科分数,共%d科:",SUB_AMOUNT);
for(i=0;i<SUB_AMOUNT;i++)
{
scanf("%f",¢);
p->score[i] = cent;
totalscore += cent;
}
p->total = totalscore;
find = HEAD;
if(find->StudyNum > number) /*插入头结点之前*/
{
HEAD = p;
p->next = find;
}
else
{
while((NULL != find->next) && (find->StudyNum < number))
find = find->next;
if(NULL == find->next)/*插入链表尾部*/
{
find->next = p;
find = find->next;
find->next = NULL;
}
else/*插入p与p->next之间*/
{
p->next = find->next;
find->next = p;
}
}
printf("操作成功!\n");
}
void output()
{
STU *p = HEAD;
FILE *fp;
char PutStyle,ch;
int i,j,len;
char filename[20];
char str1[2];
char StrNum[10];
char StrScore[10];
float s;
if (NULL == HEAD )
{
printf("学生纪录为空,请先建立学生纪录!\n");
return;
}
printf("输入f将输出存储在文件,输入s将输出在屏幕:");
scanf("%c",&PutStyle);
scanf("%c",&PutStyle);
while(('f' != PutStyle) && ('s' != PutStyle))
{
printf("输入错误!");
printf("输入f将输出存储在文件,输入s将输出在屏幕:");
scanf("%c",&PutStyle);
}
if ('s' == PutStyle)
{
printf("%10s%15s%5s","name","studynumber","sex");
for(i=0;i<SUB_AMOUNT;i++)
printf("%8s%d","subject",i+1);
printf("%8s\n","total");
while(p!=NULL)
{
printf("%10s",p->name);
printf("%15ld",p->StudyNum);
printf("%5d",p->sex);
for(i=0;i<SUB_AMOUNT;i++)
printf("%7.1f ",p->score[i]);
printf("%6.1f\n",p->total);
p = p->next;
}
}
else
{
printf("请输入要存储信息的文件名:");
scanf("%s",filename);
if (!(fp = fopen(filename,"w")))
printf("打开文件出错");
else
{
fputs(" name ",fp);
fputs(" studynumber ",fp);
fputs(" sex ",fp);
for(i=0;i<SUB_AMOUNT;i++)
{
fputs("subject ",fp);
j = i+1;
itoa(j,str1,10);
fputs(str1,fp);
fputs(" ",fp);
}
fputs("total \n",fp);
while(p!=NULL)
{
len = strlen(p->name);
for(i=1;i<=9-len;i++) fputs(" ",fp);
fputs(p->name,fp);
fputs(" ",fp);
itoa(p->StudyNum,StrNum,10);
len = strlen(StrNum);
for(i=1;i<=14-len;i++) fputs(" ",fp);
fputs(StrNum,fp);
fputs(" ",fp);
fputs(" ",fp);
ch=p->sex+48;
fwrite(&ch,1,1,fp);
fputs(" ",fp);
for(i=0;i<SUB_AMOUNT;i++)
{
len = 0;
itoa(int(p->score[i]),StrScore,10);
fputs(StrScore,fp);
len += strlen(StrScore);
s = p->score[i]-int(p->score[i]);
if(0 != s)
{
fputs(".",fp);
len++;
while((s-int(s)) > 0.000001) s = s * 10;
itoa((int)s,StrScore,10);
fputs(StrScore,fp);
len += strlen(StrScore);
}
for(j=1;j<=10-len;j++) fputs(" ",fp);
}
itoa(int(p->total),StrScore,10);
fputs(StrScore,fp);
len = strlen(StrScore);
s = p->total - (int)p->total;
if ( 0 != s )
{
fputs(".",fp);
len++;
while((s-int(s)) > 0.000001) s = s * 10;
itoa((int)s,StrScore,10);
fputs(StrScore,fp);
len += strlen(StrScore);
}
for(j=1;j<=9-len;j++) fputs(" ",fp);
p = p->next;
fputs("\n",fp);
}
fclose(fp);
}
}
}
void ChangeStudent()
{
long number;
STU *SearchByNum(const long);
STU *p;
int FunNumber,ChangeSex,subject;
float ChangeScore;
printf("请输入你要更改的学生的学号:");
scanf("%ld",&number);
p = SearchByNum(number);
if(NULL == p)
{
printf("该学生不存在");
return;
}
lp: printf("***************************\n");
printf("| 更改学生信息 |\n");
printf("| 1.更改姓名 |\n");
printf("| 2.更改性别 |\n");
printf("| 3.更改成绩 |\n");
printf("| 0.取消操作 |\n");
printf("***************************\n");
printf("请输入你需要的操作:");
scanf("%d",&FunNumber);
switch(FunNumber)
{
case 1:
printf("请输入姓名:");
scanf("%s",p->name);
break;
case 2:
printf("请输入性别:");
scanf("%d",&ChangeSex);
p->sex = ChangeSex;
break;
case 3:
error: printf("请输入你想更改的科目(1~%d):",SUB_AMOUNT);
scanf("%d",&subject);
if((0 < subject) && (SUB_AMOUNT > subject))
{
printf("请输入该科目成绩:");
scanf("%f",&ChangeScore);
p->total -= p->score[subject-1];
p->score[subject-1] = ChangeScore;
p->total += p->score[subject-1];
}
else goto error;
break;
case 0:
return;
break;
default:
printf("输入错误!\n");
goto lp;
break;
}
printf("操作已成功!\n");
}
void DelStudent()
{
long number;
int i;
char sure;
STU *SearchByNum(const long);
STU *p,*find = HEAD;
printf("请输入你要删除学生的学号:");
scanf("%ld",&number);
p = SearchByNum(number);
if(NULL == p)
{
printf("该学生不存在");
return;
}
printf("该学生的信息如下:\n");
printf("%10s%15s%5s","name","studynumber","sex");
for(i=0;i<SUB_AMOUNT;i++)
printf("%8s%d","subject",i+1);
printf("%8s\n","total");
printf("%10s",p->name);
printf("%15ld",p->StudyNum);
printf("%5d",p->sex);
for(i=0;i<SUB_AMOUNT;i++)
printf("%7.1f ",p->score[i]);
printf("%6.1f\n",p->total);
printf("确实要删掉吗?(y,n):");
scanf("%c",&sure);
scanf("%c",&sure);
if (('y' == sure) || ('Y' == sure))
{
if (HEAD == p) HEAD = p->next;
else
{
while(p != find->next) find = find->next;
find->next = p->next;
}
delete p;
printf("操作已成功!\n");
}
}
void paixu()
{
STU *p = HEAD;
STU *q = HEAD->next;
float cent;
while (NULL != p)
{
for(q = p->next;NULL != q;q = q->next)
{
if(p->total < q->total)
{
cent = p->total;
p->total = q->total;
q->total = cent;
}
}
p = p->next;
}
printf("操作已成功!\n");
}
void SearchStudent()
{
long number;
int i;
STU *p;
STU *SearchByNum(const long);
printf("请输入你要查找的学生的学号:");
scanf("%ld",&number);
p = SearchByNum(number);
if(NULL == p)
{
printf("该学生不存在");
return;
}
printf("请输入你要查找的学生的信息如下:\n");
printf("%10s%15s%5s","name","studynumber","sex");
for(i=0;i<SUB_AMOUNT;i++)
printf("%8s%d","subject",i+1);
printf("%8s\n","total");
printf("%10s",p->name);
printf("%15ld",p->StudyNum);
printf("%5d",p->sex);
for(i=0;i<SUB_AMOUNT;i++)
printf("%7.1f ",p->score[i]);
printf("%6.1f\n",p->total);
}
int CheckStudyNum(const long number)/*检测所输入学号是否合理*/
{
STU *find = HEAD;
while(NULL != find)
{
if(number == find->StudyNum) break;
else find = find->next;
}
if (NULL != find) return 0;
else return 1;
}
STU *SearchByNum(const long number)
{
STU *find = HEAD;
while(NULL != find)
{
if(number == find->StudyNum) break;
find = find->next;
}
return find;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -