资源描述
成绩评估
教师签名
嘉应学院 计算机学院
《数据构造》实验报告
课程名称:
数据构造
开课学期:
-第1学期
班 级:
1401
指引教师:
钟治初
实验题目:
学生成绩管理系统
学 号:
姓 名:
苏永达
提交时间:
10月27日
一、 实验规定:
(1) 设计一种学生成绩管理系统,模仿高考成绩管理。功能至少涉及数据输入,输出,查找,插入,删除,修改,排序,记录各成绩段人数,考生成绩排位,报考志愿检索等。
(2) 所有输入输出数据均使用文本文献进行读写。
(3) 所有过渡性数据使用二进制文献进行读写和保存。
(4) 设计使用平行志愿进行出档。
(5) 设计使用非平行志愿行进出档。
(6) 设计志愿时,可以设计12个志愿,如果平行志愿,则先后各6个分别为第一组和第二组平行志愿解决。
(7) 设计考生记录字段时,可以预留补录志愿字段。或者将未录取考生数据进行备份,然后将志愿清空后再增长补录志愿。
二、功能:
(1) 按学号顺序输入学生信息,涉及学号、姓名、性别、课程单科成绩(单科成绩涉及C语言、高数、大学语文、汇编、中近史),并存入文献中。
(2) 从文献读取数据
(3) 删除学生信息
(4) 查询学生信息(查询可分为精准查询和模糊查询)
(5) 修改学生信息(规定修改后,数据依然是按学号顺序排列)
(6) 插入学生信息(规定插入后,数据依然是按学号顺序排列)
(7) 附加功能,学生可自由发挥,如:排名、求各门课程平均分等。
三、实验目
1、掌握和巩固C语言编写有关知识和技巧,特别是函数、指针、构造体。
2、可以采用模块化思想调试程序。
3、通过该课程设计操作与实践,可以依照数据对象特性,学会数据组织办法,把现实世界中实际问题在计算机内部表达出来,并培养基本、良好程序设计技能,全面提高学生程序设计、开发能力。
四、系统分析
4.1 有关基本知识
选取、循环、函数、指针、构造体、链表
4.2 总体方案
架构图:
方案描述:
菜单:运用switch case选取功能,在每个case中有相相应调用语句,调用相相应函数。
删除功能:调用删除函数,判断与否保存,如果保存写入文献。
插入功能:运用链表插入。
修改功能:调用删除函数跟插入函数,先删除再插入,从而实现修改功能。
查询功能:调用菜单中查询函数,用循环实现查询功能。
排名功能:调用菜单中排名函数,通过冒泡排序法实现功能。
保存功能:运用写入文献。
五、系统设计
定义一种student类型构造体,里面包括学生信息,涉及学号、姓名、性别、课程单科成绩(单科成绩涉及C语言、高数、大学语文、汇编、中近史)、总分、平均成绩。
5.1 新建功能
从键盘输入N个学生基本信息,涉及学号、姓名、性别、课程单科成绩(单科成绩涉及C语言、高数、大学语文、汇编、中近史),编程依照输入信息计算各学生总分和平均分。
创立动态链表,将学生信息存入链表中。在DOS屏幕上打印链表内所有学生信息。
新建一种文献,将动态链表中数据(即输入学生信息)存入文献中。
5.2 打开功能
打开一种文献,从文献中读取学生信息,并新建链表,将数据存入动态链表。
在DOS屏幕上打印链表内所有学生信息。
5.3 修改功能
在DOS屏幕上打印出当前所有学生信息。
输入待修改学生学号,若不存在,输出“查无此人”;若存在,则输入修改信息,并存回学生信息链表中,存回后学生信息链表依然是按学号顺序排列。
最后在DOS屏幕上打印出新所有学生信息。
5.4 插入功能
在DOS屏幕上打印出当前所有学生信息。
输入插入信息条数,从第一条开始到最后一条,依次输入每条学生信息,涉及学号、姓名、性别、课程单科成绩(单科成绩涉及C语言、高数、大学语文、汇编、中近史),依照输入信息计算各学生总分和平均分。
若输入学生学号已经存在,则输出“该学号已存在,无法操作!”,否则将学生信息插入到链表中,插入后链表中数据依然按照学号排列。
最后在DOS屏幕上打印出新所有学生信息。
5.5 查询功能
查询分为:精准查询、模糊查询
精准查询:
(1) 按姓名查询
输入待查询姓名;
依照顺序查询办法,对学生姓名依次查询,直到查询到与输入信息相匹配信息,并在DOS屏幕上显示出来。若需要查询信息不存在,系统则会提示找不到此人。可重复查询。
(2) 按学号查询
输入待查询学号;
依照顺序查询办法,对学生学号依次查询,直到查询到与输入信息相匹配信息,并在DOS屏幕显示出来。若需要查询信息不存在,系统则会提示找不到此人。可重复查询。
模糊查询:
(1) 按姓氏查询
输入待查询姓氏;
依照顺序查询办法,对学生姓依次查询,当查询到与输入信息相匹配信息,则在DOS屏幕显示出来,直到链表结束。若需要查询信息不存在,系统则会提示找不到有关信息。可重复查询。
(2) 按性别查询
输入待查询性别;
依照顺序查询办法,对学生性别依次查询,当查询到与输入信息相匹配信息,则在DOS屏幕显示出来,直到链表结束。可重复查询。
5.6 删除功能
在DOS屏幕上打印出当前所有学生信息。
(1)按姓名删除
输入需要删除学生姓名;
依照顺序查询办法,对学生姓名依次查询,当查询到与输入信息相匹配信息,则删除该生信息,并在DOS屏幕显示出新所有学生信息。若需要删除信息不存在,系统则会提示删除失败。
(2)按学号删除
输入需要删除学生学号;
依照顺序查询办法,对学生学号依次查询,当查询到与输入信息相匹配信息,则删除该生信息,并在DOS屏幕显示出新所有学生信息。若需要删除信息不存在,系统则会提示删除失败。
5.7排名功能
可依照学生总分进行排名,并在DOS屏幕上输出排名成果。
5.8 关于咱们
在DOS屏幕上输出系统有关信息。
5.9 软件阐明
5.10 退出保存
选取‘0’退出系统,保存功能在每段函数结束后实现。
5.10运营成果
5.10.0 主界面
5.10.1 新建文献(输入一组数据,存入文献中)
5.10.2 打开文献(打开文献,读取文献数据存入链表)
5.10.3 修改功能
5.10.4 插入功能
5.10.5 查询功能
精准查询-按姓名查询
精准查询-按学号查询
模糊查询-按姓氏查询
模糊查询-按性别查询
5.10.6 删除功能
按姓名删除
按学号删除
5.10.7 总分排名功能
5.10.9 软件阐明
5.10.10 退出保存
保存功能在每段函数结束后实现。
六、心得体会
通过这次实验咱们更好掌握和巩固C语言编写有关知识和技巧,特别是函数、指针、构造体、链表等功能。通过该课程设计操作与实践,可以依照数据对象特性,学会数据组织办法,把现实世界中实际问题在计算机内部表达出来,并培养基本、良好程序设计技能,虽然在设计过程中遇到了不少问题麻烦,在教材数据协助下,完毕了这次程序设计。
七、源代码
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/*---------------------------------------------------------*/
#define LEN sizeof(struct student)//构造体长度
/*---------------------------------------------------------*/
#define NEW (struct student *)malloc(LEN)
/*---------------------------------------------------------*/
FILE *fp;/*文献指针*/
/*---------------------------------------------------------*/
struct student
{
int num;
char name[20];
int score1,score2,score3,score4,score5;
char sex;
double aver;
float sum;
struct student *next;
};
char filename[100];
struct student *creat( )
{ struct student *h;
struct student *p,*q;
printf("需要输入几条信息:");
int i,n;
scanf("%d",&n);
printf("\n----------请按学号顺序依次输入学生信息----------\n");
char c=getchar();
h=NULL;
for(i=1;i<=n;i++)
{ p=NEW;
if (p==NULL)
{ printf("Allocation failure\n");
exit(0);
}
printf("\n");
printf("输入姓名<如:zhangsan>:");
gets(p->name);
printf("输入学号<如:1>:");
scanf("%d",&p->num);
c=getchar();
printf("输入性别<M/F>:");
scanf("%c",&p->sex);
printf("输入c语言成绩:");
scanf("%d",&p->score1);
printf("输入高数成绩:");
scanf("%d",&p->score2);
printf("输入大学语文成绩:");
scanf("%d",&p->score3);
printf("输入汇编语言成绩:");
scanf("%d",&p->score4);
printf("输入中近史成绩:");
scanf("%d",&p->score5);
c=getchar();
p->sum=p->score1+p->score2+p->score3+p->score4+p->score5;
p->aver=(p->score1+p->score2+p->score3+p->score4+p->score5)/5.0;
p->next=NULL;
if (h==NULL) /* h为空,表达新结点为第一种结点 */
h=p; /* 头指针指向第一种结点 */
else /* h不为空 */
q->next=p; /* 新结点与尾结点相连接 */
q=p;/* 使q指向新尾结点 */
}
return h;
}
struct student *paixu (struct student *head) /* 总分排名 */
{ system("cls");
printf("总分排名如下:\n");
struct student *op;
struct student *p;
struct student *p1,*p2;
p1 = (struct student *) malloc (LEN);
p1->next = head;
head = p1;
for (op = NULL;op != head;op = p)
{
for (p = p1 = head;p1->next->next!=op;p1 = p1->next)
{
if (p1->next->sum < p1->next->next->sum)
{
p2 = p1->next->next;
p1->next->next = p2->next;
p2->next = p1->next;
p1->next = p2;
p = p1->next->next;
}
}
}
p1 = head;
head = head->next;
free (p1);
p1 = NULL;
return head;
}
void prlist(struct student *head)/*输出函数*/
{ struct student *p;
p=head;
printf("\n学号 姓名 性别 c语言 高数 大学语文 汇编语言 中近史 总分 平均分\n");
while (p!=NULL)
{ printf("%d %s %c %d %d %d %d %d %.1f %.2f\n",p->num,p->name,p->sex,p->score1,p->score2,p->score3,p->score4,p->score5,p->sum,p->aver);
p=p->next;
}
system("pause");
}
/*-------------------------------------write将数据存入文献-------------------------------------------*/
void write(struct student *head)
{
struct student *p;
p=head;
if(head!=NULL)
{
while(p!=NULL)
{
fwrite(p,LEN,1,fp);
p=p->next;
}
}
printf("文献更新成功!\n");
fclose(fp);
system("pause");
system("cls");
}
/*-------------------------------------read将文献数据读入一种新链表中-------------------------------------------*/
struct student *read(void)
{
struct student *head;
struct student *p1,*p2;
head=NULL;
p1=NEW;
rewind(fp);//指向文献头
fread(p1,LEN,1,fp);
while(!feof(fp))
{
if(head==NULL)
head=p1;
else
p2->next=p1;
p2=p1;
p1=NEW;
fread(p1,LEN,1,fp);
}
p2->next=NULL;
fclose(fp);
return(head);
}
void find(struct student *head)/* 查询功能 */
{ int t,s,i,j;
struct student *p,*q;
char x[10],y[2]={"0"},c[2];
char k,f;
p=head;
printf("精准查找:\n *1 按姓名查找\n *2 按学号查找\n 模糊查找\n *3 按姓氏查找:\n *4 按性别查找\n");
scanf("%d",&s);
k=getchar();
if(s==1)
{printf("请输入姓名:");
gets(x);
while (p!=NULL)
{
if (strcmp(x,p->name)==0)
{ printf("\n学号 姓名 性别 c语言 高数 大学语文 汇编语言 中近史 总分 平均分\n");
printf("%d %s %c %d %d %d %d %d %.1f %.2f\n",p->num,p->name,p->sex,p->score1,p->score2,p->score3,p->score4,p->score5,p->sum,p->aver);
j=1;}
else i=1;
q=p;p=p->next;
}
}
else if(s==2)
{printf("按学号查找:\n");
scanf("%d",&t);
while (p!=NULL)
{
if (t==p->num)
{ printf("\n学号 姓名 性别 c语言 高数 大学语文 汇编语言 中近史 总分 平均分\n");
printf("%d %s %c %d %d %d %d %d %.1f %.2f\n",p->num,p->name,p->sex,p->score1,p->score2,p->score3,p->score4,p->score5,p->sum,p->aver);
j=1;}
else i=1;
q=p;p=p->next;
}
}
else if(s==3)
{ printf("按姓氏查询:\n");
gets(c);
while ( p!=NULL)
{
if (strncmp(c,p->name,1)==0)
{ printf("\n学号 姓名 性别 c语言 高数 大学语文 汇编语言 中近史 总分 平均分\n");
printf("%d %s %c %d %d %d %d %d %.1f %.2f\n",p->num,p->name,p->sex,p->score1,p->score2,p->score3,p->score4,p->score5,p->sum,p->aver);
j=1;}
else i=1;
q=p;p=p->next;
}
}
else if(s==4)
{ printf("按性别查询:\n");
f=getchar();
while(p!=NULL)
{ if(f==p->sex)
{ printf("\n学号 姓名 性别 c语言 高数 大学语文 汇编语言 中近史 总分 平均分\n");
printf("%d %s %c %d %d %d %d %d %.1f %.2f\n",p->num,p->name,p->sex,p->score1,p->score2,p->score3,p->score4,p->score5,p->sum,p->aver);
j=1;}
else i=1;
q=p;p=p->next;
}
}
if(i=1&&j!=1)
printf("Not found.输入错误\n");
system("pause");
system("cls");
}
struct student *delstudent(struct student *head)/* 删除功能 */
{ int s,n,m=1;
char c;
struct student *p,*q;
char x[10];
while(m)
{printf(" *1 按学号删除\n *2 按姓名删除\n");
scanf("%d",&s);
c=getchar();
printf("已有信息如下:\n");
prlist(head);
if (head==NULL)
{ printf("This is a empty list.");
return head;
}
p=head;
switch(s)
{ case 2:
{ printf("请输入姓名:");
gets(x);
while (strcmp(x,p->name)!=0 && p->next!=NULL)
{ q=p;p=p->next;}
if (strcmp(x,p->name)==0)
{ if (p==head)
head=p->next;
else
q->next=p->next;
free(p);
}
else
{printf("Not found.\n");continue;}
};m=0;break;
case 1:
{ printf("请输入学号:");
scanf("%d",&n);
c=getchar();
while (n!=p->num && p->next!=NULL)
{ q=p;p=p->next;}
if (n==p->num)
{ if (p==head)
head=p->next;
else
q->next=p->next;
free(p);
}
else
{printf("Not found.\n");continue;}
};m=0;break;
default:printf("输入错误\n");break;
}
}
return head;
}
void about()/* 关于咱们 */
{ system("cls");
printf(" ∩_∞ ,∩_ ∩\n\n");
printf(" (●. ●) (●﹏●)\n\n");
printf(" /▓\ /█\ Hi\n\n");
printf(" 成员简介\n\n");
printf(" 1.组长:\n\n");
printf(" 2.成员:\n\n");
printf(" 3.成员:\n\n");
printf(" 4.成员:\n\n");
printf(" 产品信息\n\n");
printf(" 一.产品用途:重要用于学生成绩管理与查询.\n\n");
printf(" 二.班级成绩管理系统重要涉及:数据录入 \n\n");
printf(" 读取 显示 删除 插入 查找 修改 排名.\n\n");
system("pause");
system("cls");
}
void end() /*退出系统*/
{
char s;
printf("与否退出系统Y/N?\n");
scanf("%c",&s);
if(s=='Y' || s=='y')
exit(0);
else if(s=='N' || s=='n')
return;
else
{
printf("输入错误,请重新输入\n\n");system("pause");return;
}
}
struct student *insert(struct student *head,struct student *op)/* 插入功能 */
{ struct student *p,*q;
if (head==NULL)
{ head=op; /* 空表时,插入结点 */
op->next=NULL;
}
else
{ p=head;
while (op->num > p->num && p->next!=NULL)
{ q=p;p=q->next;}
if (op->num==p->num)
{ printf("\n该学号已存在,无法插入!\n");
return head;
}
else if(op->num<p->num)
{ if (p==head)
head=op; /* 在表头插入结点 */
else
q->next=op; /* 在表中间插入结点 */
op->next=p;
}
else
{ p->next=op; /* 在表尾插入结点 */
op->next=NULL;
}
}
return head;
}
struct student *xiugai(struct student *head)/*修改功能*/
{
struct student *op=NEW;
int c;
head=delstudent(head);
printf("请输入新名字:");
gets(op->name);
printf("请输入新学号:");
scanf("%d",&op->num);
c=getchar();
printf("请输入新性别:");
scanf("%c",&op->sex);
printf("请输入新C语言成绩:");
scanf("%d",&op->score1);
printf("请输入新高数成绩:");
scanf("%d",&op->score2);
printf("请输入新大学语文成绩:");
scanf("%d",&op->score3);
printf("请输入新汇编成绩:");
scanf("%d",&op->score4);
printf("请输入新中近史成绩:");
scanf("%d",&op->score5);
c=getchar();
op->sum=op->score1+op->score2+op->score3+op->score4+op->score5;
op->aver=(op->score1+op->score2+op->score3+op->score4+op->score5)/5.0;
op->next=NULL;
head=insert(head,op);
return head;
}
struct student *ca(struct student *head)/*插入功能*/
{
struct student *op=NEW;
char c;
printf("请输入名字:");
gets(op->name);
printf("请输入学号:");
scanf("%d",&op->num);
c=getchar();
printf("请输入性别:");
scanf("%c",&op->sex);
printf("请输入C语言成绩:");
scanf("%d",&op->score1);
printf("请输入高数成绩:");
scanf("%d",&op->score2);
printf("请输入大学语文成绩:");
scanf("%d",&op->score3);
printf("请输入汇编成绩:");
scanf("%d",&op->score4);
printf("请输入中近史成绩:");
scanf("%d",&op->score5);
c=getchar();
op->next=NULL;
head=insert(head,op);
op->sum=op->score1+op->score2+op->score3+op->score4+op->score5;
op->aver=(op->score1+op->score2+op->score3+op->score4+op->score5)/5.0;
return head;
}
void help()/* 软件阐明 */
{ system("cls");
printf("\n 阐明 \n\n\n");
printf(" 运营本软件需先使用新建文献或打开文献功能,否则运营出错。\n");
printf(" 每次使用修改 插入 删除等功能后需重新打开文献读取数据,\n");
printf(" 否则得到数据是未保存。每运营完一种功能会自动返回到 \n");
printf(" 主界面。 \n\n\n");
printf("\n\n 纯属原创 禁止抄袭 \n\n");
system("pause");
system("cls");
}
/*-------------------主函数 菜单--------------------------------------*/
int main()
{ system("color 9f");
char c,r;
struct student *head;
int z;
while(1)
{
printf("\n");
printf("· · · · · · · · ╔------------------------╗· · · · · · · · \n\n");
printf("· · · · · · · · 欢迎使用学生成绩管理系统 · · · · · · · · \n\n");
printf("· · · · · · · · ╚------------------------╝· · · · · · · · \n\n");
printf("***********************************菜单***********************************\n\n");
printf("==========================================================================\n\n");
printf("******* 1.新建文献 ***** 2.打开文献 *******");
printf("\n\n");
printf("******* 3.修改功能 ***** 4.插入功能 *******");
printf("\n\n");
printf("******* 5.查询功能 ***** 6.删除功能 *******");
printf("\n\n");
printf("******* 7.排名功能
展开阅读全文