《数据结构与算法》附加作业报告
机房号 无
姓名:
日期: 2018/10/31
程序名: 年级学生成绩管理系统
实验内容: 设计一个年级学生成绩管理系统
一、目的和要求(需求分析):
1、提供用户界面
2、登记各班学生基本情况(学号,姓名,性别,年龄,电话,等)
3、插入某班某个学生的基本情况
4、修改各班学生基本情况
5、删除某班某个学生或某班所有学生的基本情况
6、登记各班所有学生各门功课的成绩
7、修改某个学生某门功课的成绩
8、浏览各个班级信息
9、查看、浏览每个学生的基本信息
10、查看、浏览每个学生的全部成绩信息
二、程序设计的基本思想,原理和算法描述:
将学生成绩通过链表录入程序中。
通过对链表的删除,插入等操作,实现了修改,登记等功能。
把2,6功能整合了一步实现。
把9,10功能整合了一步实现。
把4,7功能整合了一步实现。
程序利用
void inputscore(void);//学生成绩新建
void modifyscore(void);//学生成绩修改
void lookscore(void);//学生成绩查看
void searchscore(void);//学生成绩查询
void add(void); //学生成绩添加
void classsearch(void); //班级成绩查询
void modify(void); //学生成绩修改
void delscore(void); //学生成绩删除
void menu(void); //学生成绩菜单
void delscorecss(void);
等函数实现对链表的操作
三、调试和运行程序过程中产生的问题及采取的措施:
在删除班级全体的成绩时卡壳了很久,虽然和删除单个学生的成绩差不多但是需要注意,如何将需要删除的那个节点标记出来并删除。我利用了b[ ]数组将其标记出来,达成目的。
四、源程序及注释:
#include<stdio.h>
#include<string.h> //定义处理字符串函数
#include<process.h> //宏指令的声明
#include<conio.h> //定义通过控制台进行数据输入以及输出
#include <stdlib.h>
#define N 2000
#define M 3
typedef struct student
{ char number[10];
char name[20];
char sex[10];
char year[10];
char tel[20];
char css[20];
float score[M];
float aver;
}STU;
STU stu[N];
int n;
void inputscore(void);//学生成绩新建
void modifyscore(void);//学生成绩修改
void lookscore(void);//学生成绩查看
void searchscore(void);//学生成绩查询
void add(void); //学生成绩添加
void classsearch(void); //班级成绩查询
void modify(void); //学生成绩修改
void delscore(void); //学生成绩删除
void menu(void); //学生成绩菜单
void delscorecss(void); //班级成绩删除
int main()
{
void system(const char *string);
short int flag=0;
menu();
do
{ flag=1;
switch(getch())
{ case '1' : inputscore();break;
case '2' : lookscore();break;
case '3' : searchscore();break;
case '4' : classsearch();break;
case '5' : modify();break;
case '6' : add();break;
case '7' : delscore();break;
case '8' : delscorecss();break;
default : printf("输入有误\n");
}
printf("按任意键继续\n");
getch();
menu();
}while (flag==1);
}
void menu(void)
{
system("cls");
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(" │ 删除班级成绩---------------------------------8│\n");
printf(" │ 请输入(1~8) │\n");
printf(" -----------------------------------------------\n");
}
/***************输入学生信息******************************/
void inputscore(void) //输入成绩
{ int i,j;
system("cls");
printf(" ----输入成绩----\n");
printf("输入学生总数:\n");
scanf("%d",&n);
printf("请输入学号\n");
for(i=0;i<n;i++)
{ printf("\n");
printf("请输入第%d位学生的学号:\n",i+1);
scanf("%s",stu[i].number); //输入学生学号
printf("姓名:\n"); //输入学生名字
scanf("%s",stu[i].name);
printf("电话:\n"); //输入学生电话
scanf("%s",stu[i].tel);
printf("年龄:\n");
scanf("%s",stu[i].year); //输入学生年龄
printf("请输入该学生性别\n");
scanf("%s",stu[i].sex); //输入性别
printf("班级:\n"); //输入学生班级
scanf("%s",stu[i].css);
printf("请输入学生成绩:\n");
printf("语文\t数学\t英语\n");
for(j=0;j<M;j++)
scanf("%f",&stu[i].score[j]); //输入语文、数学、英语的成绩
}
printf(" 成功输入\n");
}
/************查看学生成绩*********************/
void lookscore(void)
{ int i,j,k;
STU t;
system("cls");
printf(" ----查看成绩----\n");
for(i=0;i<n-1;i++)
{ for(k=i,j=i+1;j<n;j++)
if(stu[j].aver>stu[k].aver)
k=j;
if(k!=j)
{ t=stu[k];
stu[k]=stu[i];
stu[i]=t;
}
}
printf("学号\t姓名\t电话\t年龄\t性别\t班级\t语文\t数学\t英语\n");
for(i=0;i<n;i++)
{ printf("%s\t%s\t%s\t%s\t%s\t%s\t",stu[i].number,stu[i].name,stu[i].tel,stu[i].year,stu[i].sex,stu[i].css);
for(j=0;j<M;j++)
printf("%4.2f\t",stu[i].score[j]);
printf("\n");
}
}
/*****************通过输入学号查找学生成绩***************************/
void searchscore(void)
{ char a[10]; //定义数组a的类型可输入数字,字母或字符
int i,j;
system("cls");
printf(" ----查询学生成绩----\n");
printf("请输入需查询的学生学号\n");
scanf("%s",a);
for(i=0;i<n;i++)
{ if(strcmp(a,stu[i].number)==0)
{ printf("学号\t姓名\t电话\t年龄\t性别\t班级\t语文\t数学\t英语\n");
printf("%s\t%s\t%s\t%s\t%s\t%s\t",stu[i].number,stu[i].name,stu[i].tel,stu[i].year,stu[i].sex,stu[i].css);
for(j=0;j<M;j++)
printf("%4.2f\t",stu[i].score[j]);
printf("\n");
break;
}
else
printf("未找到该学生信息\n");
}
}
/***班级成绩查询***/
void classsearch(void)
{ int i,j,k;
char a[10];
STU t;
system("cls");
printf(" ----查看班级成绩----\n");
printf("请输入需查询的班级\n");
scanf("%s",a);
for(i=0;i<n-1;i++)
{ for(k=i,j=i+1;j<n;j++)
if(stu[j].aver>stu[k].aver)
k=j;
if(k!=j)
{ t=stu[k];
stu[k]=stu[i];
stu[i]=t;
}
}
printf("学号\t姓名\t电话\t年龄\t性别\t班级\t语文\t数学\t英语\n");
for(i=0;i<n;i++)
{
if(strcmp(a,stu[i].css)==0)
{
printf("%s\t%s\t%s\t%s\t%s\t%s\t",stu[i].number,stu[i].name,stu[i].tel,stu[i].year,stu[i].sex,stu[i].css);
for(j=0;j<M;j++)
printf("%4.2f\t",stu[i].score[j]);
printf("\n");
}
}
}
/***************修改学生成绩*****************/
void modify(void)
{
char a[10];
int i,j;
system("cls");
printf(" ----修改成绩----\n");
printf("请输入需要修改成绩的学生学号\n");
scanf("%s",a);
for(i=0;i<n;i++)
{ if(strcmp(a,stu[i].number)==0)
{ printf("学号\t姓名\t电话\t年龄\t性别\t班级\t语文\t数学\t英语\n");
printf("%s\t%s\t%s\t%s\t%s\t%s\t",stu[i].number,stu[i].name,stu[i].tel,stu[i].year,stu[i].sex,stu[i].css);
for(j=0;j<M;j++)
printf("%4.2f\t",stu[i].score[j]);
printf("\n");
printf("请重新输入该学生的姓名:\n");
scanf("%%s",stu[i].number);
printf("\n");
scanf("%s",stu[i].name);
printf("请重新输入该学生的电话:\n");
scanf("%%s",stu[i].tel);
printf("\n");
scanf("%s",stu[i].tel);
printf("请重新输入年龄:\n");
scanf("%%s",stu[i].year);
printf("\n");
scanf("%s",stu[i].year);
printf("请输入该学生性别\n");
scanf("%%s",stu[i].sex);
printf("\n");
scanf("%s",stu[i].sex);
printf("请输入该学生班级\n");
scanf("%%s",stu[i].css);
printf("\n");
scanf("%s",stu[i].css);
printf("请重新输入该学生成绩:\n");
printf("语文\t数学\t英语\n");
for(j=0;j<M;j++)
scanf("%f",&stu[i].score[j]);
printf("修改成功\n");
break; //找到该学生成绩后进行修改,跳出for循环
}
else
printf("查无此人\n");
}
}
/*****************插入学生成绩********************/
void add(void)
{
int a,i,j; //i定义为学生,j为学生分数,a代表加入学生的数量
system("cls");
printf(" ----插入成绩----\n");
printf("请输入新增加的学生人数:\n");
scanf("%d",&a);
n=n+a;
for(i=n-a;i<n;i++)
{ printf("\n");
printf("请输入第%d位学生的学号:\n",i+1);
scanf("%s",stu[i].number);
printf("姓名:\n");
scanf("%s",stu[i].name);
printf("电话:\n");
scanf("%s",stu[i].tel);
printf("年龄:\n");
scanf("%s",stu[i].year);
printf("输入该学生性别\n");
scanf("%s",stu[i].sex);
printf("输入该学生班级\n");
scanf("%s",stu[i].css);
printf("请输入学生成绩:\n");
printf("语文\t数学\t英语\n");
for(j=0;j<M;j++)
scanf("%f",&stu[i].score[j]);
printf("添加成功\n");
}
}
/*******************删除班级成绩*************************/
void delscorecss(void)
{
int i,j,t=0,l,k=0;
char m,a[10];
int b[20];
system("cls");
printf(" ----删除班级成绩----\n");
printf("请输入班级号\n");
scanf("%s",a);
for(i=0;i<n;i++)
{
if(strcmp(a,stu[i].css)==0)
{
printf("学号\t姓名\t电话\t年龄\t性别\t班级\t语文\t数学\t英语\n");
printf("%s\t%s\t%s\t%s\t%s\t%s\t",stu[i].number,stu[i].name,stu[i].tel,stu[i].year,stu[i].sex,stu[i].css);
for(j=0;j<M;j++)
printf("%4.2f\t",stu[i].score[j]);
printf("\n");
b[t]=i;
t++;
}
}
printf("是否删除该班级成绩(y/n)\n");
scanf("%s",&m);
if(m=='y')
{
for(i=0;i<t;i++)
{
l=b[i];
stu[l]=stu[l+1]; //结构体整体赋值将后一位学生成绩信息拷贝进入前一位学生信息的存储位置
}
printf("删除成功\n");
n=n-t;
}
else
printf("删除失败\n");
}
/*******************删除学生成绩*************************/
void delscore(void)
{
int i,j,c;
char m,a[10]; //m用来存放后面输入删除的字母y或n
system("cls");
printf(" ----删除成绩菜单----\n");
printf("请输入学生学号\n");
scanf("%s",a);
for(i=0;i<n;i++)
{
if(strcmp(a,stu[i].number)==0)
{ printf("学号\t姓名\t电话\t年龄\t性别\t班级\t语文\t数学\t英语\n");
printf("%s\t%s\t%s\t%s\t%s\t%s\t",stu[i].number,stu[i].name,stu[i].tel,stu[i].year,stu[i].sex,stu[i].css);
for(j=0;j<M;j++)
printf("%4.2f\t",stu[i].score[j]);
printf("\n");
c=i;
break;
}
else
printf("未找到该学生信息\n");
}
printf("是否删除该学生成绩(y/n)\n");
scanf("%s",&m);
if(m=='y')
{
for(i=c;i<n-1;i++)
stu[i]=stu[i+1]; //结构体整体赋值将后一位学生成绩信息拷贝进入前一位学生信息的存储位置
n=n-1; //删除该学生信息后学生总数减一
printf("删除成功\n");
}
else
printf("删除失败\n");
}
五、运行输出结果:
1、提供用户界面
2、登记各班学生基本情况(学号,姓名,性别,年龄,电话,等)
6、登记各班所有学生各门功课的成绩
3、插入某班某个学生的基本情况
4、修改各班学生基本情况
7、修改某个学生某门功课的成绩
5、删除某班某个学生或某班所有学生的基本情况
某班某个同学
删除某班所有同学
删除之后
8、浏览各个班级信息
9、查看、浏览每个学生的基本信息
10、查看、浏览每个学生的全部成绩信息