2023-10-18 09:52来源:m.sf1369.com作者:宇宇
明确规定: (1)输入的形式和输入值的范围; (2)输出的形式; (3)程序所能达到的功能; (4)测试数据:包括正确地输入及其输出结果和含有错误的输入及其输出结果。 2、概要设计 说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。 3、详细设计 实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:按照伪码算闹尘模法可以在计算机键盘直接输入高级程序设计语言程序);画出函数的调用关系图。 4、调试分析 内容包括: (1)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析; (2)算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进思想; (3)经验和体会等。 5、用户使用说明 说明如何使用你编写的程序,详细列出每一步操作步骤。 6、测试结果 列出你的测试结果,包括输入和输出。这里的测试数据应该完整和严格,最好多于需求分析中所列。 7、附录 题目 : [数据结构] 约瑟夫-实习报告 尺寸 : 约瑟夫-实习报告.doc 目录 : 一、需求分析 二、概要设计 三、程序具体设计及函数调用关系 四、调试分析 五、测试结果 原文 : 实习报告 题目:约瑟夫(Joseph)问题的一种描述是:编号为1,2,...,n的n个人按顺时针方向围兄凳坐一圈,每人持有一个密码(正整数)。一开始任选一个整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个开始重新从1报数,如此下去,直至年有人全部出列为止。试设计一个程序求出出列顺序。 班级: 姓名: 学号: 完成日期: 一、需求分析 1. 本演示程序中,利用单向循环链表存储结构存储约瑟夫环数据(即n个人的编号和密码)。 2. 演示程序以用户和计算机的对话方式执行,即在计算液缓机终端上显示提示信息之后,由用户在键盘上输入演示程序中需要输入的数据,运算结果显示在其后。 3. 程序执行的命令包括: 1)构造单向循环链表;2) 4. 测试数据 m 的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4,首先m值为6(正确的出列顺序为6,1,4,7,2,1,3,5)。
C语言课程设计报告--学生成绩管理系
C语言课程设计报告:
学生成绩管理系统
系统需求
一、 当前学生信息:通过结构体struct student 来保存学生的姓名,学号,性别,语文,数学,英语和计算机等等相关信息,并且通过cin函数来进行给当前学生输入初始信息.
二、学生成绩查询: 输入一个学号, 在文件中查找此学生, 若找到则输出此学生的全部信息和成绩; 若找不到则输出查找失败的信息. 同时也可以全部把各科的平均成绩,最高和最低分输出。
三、新生插入 :通过给该生的学号来和原班上的学生的学号比较大小,若大就在后陆晌,若小则靠前排,将此生的信息保存下来。
四、输出全部学生信息和全部学生成绩。
五、退出系统.
六、附加说明:系统将来完善的功能有:可以通过性别来模糊查询,也可以通过姓名的姓来先进行模糊查询,以便后面精确查找。
总体设计
一、 仔细阅读系统要求,首先将此系统化分为如下模块(即如下函数)
1、输入初始的学生信息:其旅悉扮中包括学生的姓名、学号和性别以及学生的语文、数学、英语和计算机等相关信息;可用函数cin(stu *p1)来实现此操作。
2、查询模块:可用stu *lookdata(stu *p1) 来实现。找到就输出此学生全部信息包括学生的语文、数学、英语和计算机等的成绩。
3、插入模块:可用insert( )函数来实现。其中通过学号的大小来比较的,并且以此来排序。
4、输出学生的信息以及成绩:通过学生的姓名来查看学生的语文、数学、英语和计算机等相关成绩,同时也可以分别通过caverage() 、 maverage() 、eaverage() 和comaverage() 来输出语文、数学、英语和计算机等成绩的平均分数、最高和最低分数。
5、退出系统:可用一个函数exit()来实现,首先将信息保存到文件中,释放动态创建的内存空间,再退出此程序。
二、系统主模拆灶块结构图:
详细设计
一、 界面设计
此系统界面采用图形和数字化菜单设计。
主界面设计如下:
学生成绩管理系统
请选择相应的数字执行相应的功能:
1:是否输入其他数据
2:查看数据
3:插入数据
4:查找数据
5:更新数据
6:保留数据
7:显示或打印数据
8:语文成绩状况
9:数学成绩状况
10:英语成绩状况
11:计算机成绩状况
12:?
13:退出系统
二、 数据结构设计:
程序设计中用到的结构体类型:
学生信息结构体类型:
typedef struct student{
char name[MAX];
int num[MAX];
char sex[MAX];
int chinese;
int mathematic;
int english;
int computer;
struct student *next;
}
程序代码:
//原始密码是123456
#includestdio.h
#includestddef.h
#includestddef.h
#includestring.h
#define MAX 10
typedef struct student{ /*定义结构体*/
char name[MAX]; /*姓名*/
int num[MAX]; /* 学号*/
char sex[MAX]; /*性别*/
int chinese; /*语文*/
int mathematic; /* 数学*/
int english; /*英语*/
int computer; /*计算机*/
struct student *next; /*结构体指针*/
}stu;
stu *head; /*头指针*/
void print() /*显示或打印函数*/
{
system(cls);
printf(\t\t\tScore Manage System\n); /*成绩管理系统*/
printf(<1>Enter Record\t); /*输入数据*/
printf(<2>Display\t); /*显示*/
printf(<3>Insert\t); /*插入数据*/
printf(<4>Quest\t); /*访问数据*/
printf(<5>Update\t); /*以前数据*/
printf(<6>Save\t); /*保留数据*/
printf(<7>Fresh\t); /*更新数据*/
printf(<8>Chinese Average\t); /*语文平均成绩*/
printf(<9>Math Average\t); /*数学平均成绩*/
printf(<10>English Average\t); /*英语平均成绩*/
printf(<11>Computer Average\t); /*计算机平均成绩*/
printf(<12>Quit\t\n); /*退出*/
}
void cin(stu *p1) /*输入相关数据的函数*/
{ printf(Enter name:\n);
scanf(%s,&p1->name);
printf(Enter num:\n);
scanf(%d,&p1->num);
printf(Enter sex:\n);
scanf(%s,&p1->sex);
printf(Enter score:\n);
printf(Enter chinese:\n);
scanf(%d,&p1->chinese);
printf(Enter math:\n);
scanf(%d,&p1->mathematic);
printf(Enter English:\n);
scanf(%d,&p1->english);
printf(Enter Computer:\n);
scanf(%d,&p1->computer);
}
stu *cindata() /*其他数据是否继续输入的函数*/
{ stu *p1,*p2;
int i=1;
char ch;
p1=(stu *)malloc(sizeof(stu));
head=p1;
while(i)
{
cin(p1);
printf(Do you Want to Continue?yes or no); /*是否继续输入数据*/
ch=getchar();
ch=getchar();
if(ch=='n'||ch=='N')
{ i=0;
p1->next=NULL;
}
else
{ p2=p1;
p1=(stu *)malloc(sizeof(stu));
p2->next=p1;
}
}
return(p1->next);
}
stu *lookdata(stu *p1) /*查看数据的函数*/
{
while(p1!=NULL)
{ printf(Num:%d\t,p1->num);
printf(Name:%s\t,p1->name);
printf(Sex:%s\t,p1->sex);
printf(\n);
printf(Chinese:%d\t,p1->chinese);
printf(Math:%d\t,p1->mathematic);
printf(English:%d\t,p1->english);
printf(Computer:%d\t,p1->computer);
printf(\n);
p1=p1->next;
}
return p1;
}
void insert() /*通过比较学号来插入数据的函数*/
{ stu *p1,*p3,*p2;
char ch;
p1=head;
p3=(stu *)malloc(sizeof(stu));
p3->next=NULL;
if(head==NULL){ head=p3; return;}
cin(p3);
while(p1!=NULL&&(p1->num<p3->num)) /*通过学号的比较来插入*/
{ p2=p1;p1=p1->next;}
if(p2==head) {p3->next=head; head=p3; return;}
p3->next=p1;
p2->next=p3;
}
find(stu *p2) /*通过姓名查找查看数据的函数*/
{ char name[20];
int b=0;
printf(Enter the name of the student you want to find:); /*通过姓名查看*/
scanf(%s,name);
while(p2!=NULL)
{if(strcmp(name,p2->name)==0)
{
printf(The data you want has be found\n);
printf( Name:%s\t,p2->name);
printf(Num:%d\t,p2->num);
printf(sex%s\t,p2->sex);
printf(\n);
printf(Chinese:%d\t,p2->chinese);
printf(Math:%d\t,p2->mathematic);
printf(English:%d\t,p2->english);
printf(Computer:%d\t,p2->computer);
printf(\n);
b=1;
}
else if(b==0)
printf(sorry not find data!);
p2=p2->next;
}
if(b==1)
{
print();
printf(Find one\n);}
else
{print();
printf(Not find\n);
}
}
void caverage() /*求各学生语文平均分、最高和最低分成绩的函数*/
{ stu *p1;
int i;
float max=0.0,min=200.0;
float sum=0.0,aver=0;
p1=head;
if(p1==NULL)
printf(not data!);
else
{for(i=0;p1!=NULL;i++,p1=p1->next)
sum+=p1->chinese;
aver=sum/i;
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
{if(max<p1->chinese)
max=p1->chinese;
}
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
if(min>p1->chinese)
min=p1->chinese;
}
printf(Chinese Average:%f,aver);
printf(Chinese Max:%f,max);
printf(Chinese Min:%f,min);
}
void maverage() /*求各学生数学平均分、最高和最低分成绩的函数*/
{ stu *p1;
int i;
float max=0.0,min=200.0;
float sum=0.0,aver=0;
p1=head;
if(p1==NULL)
printf(not data!);
else
{for(i=0;p1!=NULL;i++,p1=p1->next)
sum+=p1->mathematic;
aver=sum/i;
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
{if(max<p1->mathematic)
max=p1->mathematic;
}
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
if(min>p1->mathematic)
min=p1->mathematic;
}
printf(Mathe Average:%f,aver);
printf(Mathe Max:%f,max);
printf(Mathe Min:%f,min);
}
void eaverage() /*求各学生英语平均分、最高和最低分成绩的函数*/
{ stu *p1;
int i;
float max=0.0,min=200.0;
float sum=0.0,aver=0;
p1=head;
if(p1==NULL)
printf(not data!);
else
{for(i=0;p1!=NULL;i++,p1=p1->next)
sum+=p1->english;
aver=sum/i;
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
{if(max<p1->english)
max=p1->english;
}
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
if(min>p1->english)
min=p1->english;
}
printf(English Average:%f,aver);
printf(English Max:%f,max);
printf(English Min:%f,min);
}
void comaverage() /*求各学生计算机平均分、最高和最低分成绩的函数*/
{ stu *p1;
int i;
float max=0.0,min=200.0;
float sum=0.0,aver=0;
p1=head;
if(p1==NULL)
printf(not data!);
else
{for(i=0;p1!=NULL;i++,p1=p1->next)
sum+=p1->computer;
aver=sum/i;
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
{if(max<p1->computer)
max=p1->computer;
}
p1=head;
for(i=0;p1!=NULL;i++,p1=p1->next)
if(min>p1->computer)
min=p1->computer;
}
printf(Computer Average:%f,aver);
printf(Computer Max:%f,max);
printf(Computer Min:%f,min);
}
update(stu *p2) /*通过姓名查找来更新数据*/
{
char name[10]; /*p2为指向结构体struct student的指针*/
int b=0;
printf(Enter The Name); /*输入姓名*/
scanf(%s,name);
while(p2!=NULL)
{if(strcmp(name,p2->name)==0)
{
printf(Find you data\n);
scanf(Name:%s,p2->name);
scanf(Num:%s,p2->num);
scanf(Sex:%s,p2->sex);
scanf(Chinese:%d,p2->chinese);
scanf(Math:%d,p2->mathematic);
scanf(english:%d,p2->english);
scanf(Computer:%d,p2->computer);
printf(Success!);
b=1;}
else if(b==0)
printf(Sorry not Find data!);
p2=p2->next;}
if(b==0)
{print();
printf(Sorry not Find data!);
}
else
{
print();
printf(Finish!);
}
}
save(stu *p2) /*保留数据函数*/
{
FILE *fp;
char file[10];
printf(Enter file name); /*输入文件名*/
scanf(%s,file);
fp=fopen(file,w);
while(p2!=NULL)
{
fprintf(fp,%s,p2->name);
fprintf(fp,%s,p2->num);
fprintf(fp,%s,p2->sex);
fprintf(fp,%d,p2->chinese);
fprintf(fp,%d,p2->mathematic);
fprintf(fp,%d,p2->english);
fprintf(fp,%d,p2->computer);
p2=p2->next;
}
fclose(fp);
}
char password[7]=123456; /*定义初始密码*/
void main() /*主函数*/
{ int choice;
stu *p2;
char s[8];
int flag=0,i; /*标志项*/
int n=3;
do{ printf(Enter password:\n);
scanf(%s,s);
if(!strcmp(s,password)) /*进行密码匹配验证*/
{ printf(PASS\n\n\n);
flag=1;
break;
}
else{
printf(Error Enter again:\n);
n--;
}
}
while(n>0);
if(!flag)
{printf(you have Enter 3 times!); /*输入密码超过了3次!!*/
exit(0); /*自动退出*/
}
/*密码验证成功后进入的界面*/
printf(~~~~~~~~~~\t\t\t~~~~~~~~~~~~\n); /*操作界面*/
printf(\t\tWelcom to the Mis\n);
printf(Author:-----\tClass:------\tNum:------\n); /*作者,班级和号码*/
printf(Adress:HG\n); /*地址*/
printf(%%%%%%%%%%%%%%%%%%%%%%%%%%%\n);
printf(\t\tEnter OP:\n);
printf(\n\n\n\n);
printf(==============\t\t==============\n);
printf(==============\t\t==============\n);
printf(\t\tEnter the MIS yes or no\n); /*问进入系统与否*/
scanf(%d,&choice);
if(choice=='n'||choice=='N')
exit(1);
print();
while(1)
{
printf(Enter choice:);
scanf(%d,&i);
if(i<1||i>13)
{
printf(Enter num from 1 to 13:\n); /*再从1-13中进行选择*/
exit(1);
}
switch(i)
{ case 1:
p2=cindata(); /*其他数据是否继续输入的函数*/
break;
case 2:
p2=lookdata(head); /*查看数据的函数*/
break;
case 3:
insert(); /*通过比较学号来插入数据的函数*/
break;
case 4:
find(head); /*通过姓名查找查看数据的函数*/
break;
case 5:
update(head); /*通过姓名查找来更新数据*/
break;
case 6:
save(head); /*保留数据函数*/
break;
case 7:
print(); /*显示或打印函数*/
break;
case 8:
caverage(); /*求各学生语文平均分、最高和最低分成绩的函数*/
break;
case 9:
maverage(); /*求各学生数学平均分、最高和最低分成绩的函数*/
break;
case 10:
eaverage(); /*求各学生英语平均分、最高和最低分成绩的函数*/
break;
case 11:
comaverage(); /*求各学生计算机平均分、最高和最低分成绩的函数*/
break;
case 12:
; /*空操作*/
case 13:
exit(1); /*退出*/
break;
}
scanf(%d,&i);
}
}
程序中出现的问题及解决方法
问题一、学生初始信息模块:
其中包括学生的姓名、学号和性别以及学生的语文、数学、英语和计算机等相关信息;可用函数cin(stu *p1)来实现此操作。当正确输入存在的学生学号,系统进行判断时,提示不存在此学生。
解决办法及步骤:
1、一个个输出所有的学生的学号,检查文件中是否有此学生,发现有。
2、既然有此学生,那么检查循环判断是否有此学生的语句发现没有错
3、输出用于循环检查语句中的学生信息,发现乱码
4、仔细分析乱码的原因,最后发现是变量的类型错误,错将学生类型的结构体指针变量定义为了其他类型的指针变量。
问题二、查询模块:
可用stu *lookdata(stu *p1) 来实现。找到就输出此学生全部信息包括学生的语文、数学、英语和计算机等的成绩。当正确输入查找信息时,系统却不能够得到所要查找的学生信息以及学生的语文、数学、英语和计算机的成绩。
解决办法及步骤:
1、检查所编写的程序代码是否完全正确,若不是,则改之,然后再继续正确输入查找信息看能否得到所要查找的学生信息以及学生的语文、数学、英语和计算机的成绩。
2、检查当我们在输入查找信息时,看是否我们输入的信息有误,若是这样的话,我们应当仔细输入查找信息。
问题三、插入模块:
可用insert( )函数来实现。其中通过学号的大小来比较的,并且以此来排序。当我们输入插入信息时,系统却提示插入不进数据。
解决办法及步骤:
1、检查所编写的程序代码是否完全正确,若不是,则改之,然后再继续正确输入插入信息看能否插入进去得到所要插入的学生信息以及学生的语文、数学、英语和计算机的成绩。
2、检查当我们在输入插入信息时,看是否我们输入的插入信息有