重庆高考数学试题及答案理科.docx
《重庆高考数学试题及答案理科.docx》由会员分享,可在线阅读,更多相关《重庆高考数学试题及答案理科.docx(44页珍藏版)》请在冰豆网上搜索。
重庆高考数学试题及答案理科
课程设计报告
课程名称《C语言程序设计》
课题名称班级成绩管理系统
专业
班级
学号
姓名
指导教师
2012年1月09日
湖南工程学院
课程设计任务书
课程名称《C语言程序设计》
课题班级管理系统
专业班级
学生姓名
学号
指导老师王颖
审批
任务书下达日期2011年12月28日
任务完成日期2012年1月09日
一、设计内容与设计要求
1.课程设计目的:
全面熟悉、掌握C语言基本知识,增强对不同的问题运用和灵活选择合适的数据结构以及算法描述的本领,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用计算机解决实际问题的能力,养成提供文档资料的习惯和规范编程的思想,为后继课程(数据结构、数据库和汇编语言等课程)的实验以及课程设计打下较扎实的基础。
2.课题题目
⑴班级成绩管理系统
⑵班级档案管理系统
⑶飞机订票系统
⑷猜数字游戏
⑸电子英汉词典设计
⑹心算抢答系统
⑺运动会分数统计系统
⑻小学生心算CAI系统
3.设计要求:
掌握结构化程序设计的主体思想,以自顶向下逐步求精的方法编制程序解决一些实际的中型问题,为将来开发软件积累一些典型的案例处理经验。
具体要求如下:
⑴设计课题题目:
每位同学根据自己学号除以8所得的余数加一选择相应题号的课题。
换题者不记成绩。
⑵根据自己对应的课题完成以下主要工作:
①完成系统需求分析:
包括系统设计目的与意义;系统功能需求;输入输出的要求。
②完成系统概要设计:
程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模块的功能;课题涉及的数据结构和数据库结构;即要存储什么数据,这些数据是什么样的结构,它们之间有什么关系等。
③完成系统详细设计:
包括采用C语言定义相关的数据类型;写出各模块的类C码算法;画出函数的调用关系图。
④调试分析以及设计体会:
测试数据:
准备典型的测试数据和测试方案,包括正确的输入及输出结果和含有错误的输入及输出结果;程序调试中遇到的问题以及解决问题的方法;课程设计过程经验教训、心得体会。
⑤关键源程序(带注释)
⑶按规定格式完成课程设计报告,将其打印稿(A4纸)上交给老师存档。
⑷不得抄袭他人程序、课程设计报告,每个人应体现自己的个性设计。
设计课题一:
班级成绩管理系统
一、问题描述:
对一个有N个学生的班级,每个学生有M门课程。
该系统实现对班级成绩的录入、显示、修改、排序、保存等操作的管理。
二、功能要求:
1、本系统采用一个结构体数组,每个数据的结构应当包括:
学号、姓名、M门课程名称。
2、本系统显示这样的菜单:
请选择系统功能项:
a、成绩录入
b、成绩显示
c、成绩保存
d、成绩排序
e、成绩修改(要求先输入密码)
f、成绩统计
(1)显示每门课程成绩最高的学生的基本信息
(2)显示每门课程的平均成绩
(3)显示超过某门课程平均成绩的学生人数
g、退出系统
3、执行一个具体的功能之后,程序将重新显示菜单。
4、将学生成绩保存到文件中。
三、算法提示:
1、数据结构:
结构体类型数组。
2、数据库结构:
下表构成该系统的基本数据库。
姓名
学号
课程名称1
课程名称2
●●●●●●
char
Char
float
float
四、测试数据:
学生人数N=10
课程门数M=4
课程名:
数学、语文、英语、政治
五、其它
对该系统有兴趣的同学可以在实现上述基本功能后,完善系统的其它功能。
目录
一:
需求分析:
7
二:
概要设计:
8
三.详细设计10
四:
程序调试16
五.心得体会17
一:
需求分析:
1.程序的功能
学生成绩管理系统有13种功能。
可以把每个功能写成各个子函数,共有13个子函数。
在主函数当中设计一个菜单对这13个子函数进行管理,以便实现对整个系统的操作。
2.输入输出的要求。
根据课题的要求。
每一个学生的包括姓名(char)、学号(char)、M门课程的成绩(float),.再加上系统功能上的要求每一学生的信息还要总分和名次等。
所以想到要用结构体来定义每一个学生的信息结构。
然后用链表把它们组成一个有序的整体,用对链表的操作来实现对所有学生信息的统一管理(成绩显示、成绩排序、成绩修改等)。
最后为了以后按照处理后的顺序保存到文件中。
二:
概要设计:
1.程序的模块组成及各函数的主要功能
主 函 数:
intmain()
新建函数:
STUDENT*init()
输入函数:
STUDENT*create()
显示函数:
voidprint(STUDENT*head)
删除函数:
:
STUDENT*delete(STUDENT*head)
按名字寻找函数:
:
voidlookup(STUDENT*head)
保存函数:
voidsave(STUDENT*head)
按总分排序函数:
STUDENT*sort(STUDENT*head)
计算总分和均分函数:
voidcomputer(STUDENT*h)
修改函数:
STUDENT*Modify(STUDENT*head,STUDENT*new)
按学号排序函数:
STUDENT*index(STUDENT*h)
菜单函数:
intmenu_select()
各函数的主要功能:
输入函数:
随时输入数据。
菜单函数:
显示系统主菜单。
显示函数:
显示所有学生的信息。
寻找函数:
方便学生查找自己的成绩。
删除函数:
删除某学生的信息。
排序函数:
按总成绩排序。
按学号排序函数:
按学号排序。
插入函数:
可以插入新的信息。
保存函数:
保存好学生成绩,以免丢失。
统计函数:
1显示每门课程成绩最高的学生的基本信息。
2显示每门课程的平均成绩。
3显示超过某门课程平均成绩的学生人数。
2.课题的功能模块的划分:
开始
菜单界面
功能选择
初始化函数
输入学生信息
删除学生信息
显示学生信息
查找学生信息
按成绩排序
保存到文件
从文件读数据
插入学生成绩
分类合计
退出系统
结束
三.详细设计
1.定义相关的数据类型
整个系统除了主函数外,另外还有14个函数,实现八大功能:
输入功能、显示功能、查找功能、排序功能、插入功能、保存功能、读取功能。
各个函数的详细设计说明分别如下:
主函数main()
利用无限次循环for(;;)和swithch()实现各函数的调用,系统根据输入的数字选项来调用相应的函数。
菜单选择函数intmenu_select()
这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的九大功能,根据每个功能前面的序号进行选择。
等执行完每一个函数功能后,返回菜单。
2.各函数的C类算法
显示记录函voidprint(STUDENT*head)
算法:
先将p结点的指针指向第一个结点,将p结点(即第一个结点)的数据输出。
然后再将p结点的指针指向p指针的的指针(即下一结点),将p结点(即第一结点)的数据输出。
重复执行此步聚直到p指针指向NULL为止。
查找记录函数voidlookup(STUDENT*head)
算法:
采用线性查找法往下一个结点查找。
输入所要查找的学生的学号s,设一个指针变量p,先指向第一个结点,当strcmp(p->name,s)&&p!
=NULL时,使p后移一个结点,如果p!
=NULL,输出p所指的结点。
删除记录函数STUDENT*delete(STUDENT*h)
算法:
主函数链表的头指针,用一个输出语句printf("Inputyourpassword:
");
提示用户输入密码。
在输入过程中如果需要用到退格。
putchar(8);putchar('');putchar(8);来达到视觉和功能上的要求。
如果密码错误,则两秒后自动返回主菜单。
正确后输入要删除的学生学号,进行删除。
修改函数STUDENT*Modify(STUDENT*head)
算法:
首先向系统申请一块空间,用于存放输入的信息。
程序会跟据用户输入的学号。
采用线性查找法往下一个结点查找。
设一个指针变量p,先指向第一个结点,当strcmp(p->name,s)&&p!
=NULL时,使p后移一个结点,如果p!
=NULL,输出p所指的结点。
如果有该学生就修改。
并出现提示信息"***Modifysuccess!
***"。
如果没有该学生则出现“***FindoutNo.%sstudent***”提示。
并2秒后返回主菜单。
3代码设计和流程图
初始化函数STUDENT *init()
这是一个无参函数,里面只有两个语句,它的作用是使链表初始化,使head的值为NULL和一个清屏语句。
比如:
没有这个函数的话,在你没有输入任何数据的情况下,去执行显示功能的时候会显示一些乱码!
输入记录函数STUDENT*create()
这是一个无参函数,用来执行学生成绩记录的输入,当学生为@时停止输入,函数结束后,带回一个链表头的指针指向一下个学生的信息插在表头。
N-S流程图如下:
head=NULL
无条件循环
指针p指向新开辟的单元
指针p是否为空
是
否
输入学号p->num
输出p->num是否为@
内存 溢出
是
否
输入姓名p->name
停止for(i=0;i<3;i++)
输入成绩p->sum=s;
p->average=(float)s/3;
p->order=0;
p->next=head;head=p;
返回菜单
显示记录函voidprint(STUDENT*head)
N-S流程图如下:
保存数据到文件函数voidsave(STUDENT*head)
这是一个不返回值的有参函数,形参为“链表头的指针”,可以把学生记录保存在电脑上由自己任意命名的二进制文件。
N-S流程图如下:
输入要保存记录的文件地址outfile
文件不能打开
否
是
p=head;
当p不为空时
fwrite(p,LEN,1,fp);(写入一条记录)
p=p—>next; (指针后移)
fclose(fp);(关闭文件)
输出一个出错信
息,并返回菜单
查找记录函数voidlookup(STUDENT*head)
这是一个不返回值的有参函数,形参为“链表头的指针”,实现按学号对某个学生进行查找,并显示所查找到的记录。
N-S流程图如下:
输入要查找的学生的学号s
p=head,使p指向第一结点
当记录的学号不是要找的,或指指针不为空
p=p->next
p!
=NULL如果指针不为空
是
否
输出p所指向的结点
显示没有该
学生
删除记录函数STUDENT*delete(STUDENT*h)
这是一个有返回值的有参函数。
形参为“链表头的指针”,在核对密码后。
实现对所要删除学生按学号进行查找。
找到后显示该学生的信息。
按任意键进行删除。
N-S流程图如下:
传递头指针;输入密码;
密码正确
否
是
printf( "Password ismistake Tow secondstoreturn!
");
输入要删除学生的学号
有该学生的信息
否
printf( "Passwordis mistakeTowseconds
to return!
");
是
显示该学生信息
printf("\nhavedeletedNo%sstudent\n",s)
printf("Don'tforgetsave\n");
sleep
(2);clrscr();
按任意键确认删除
修改函数STUDENT*Modify(STUDENT*head)
这是一个有参函数,一个是“链表头的指针”修改之后,并返回链表的头指针。
q=head原来的链表是空的
是
否
两秒后返回菜单
当记录的学号不是要找的,
或指针不为空时
info指向q位置 q向后移一个结点
!
strcmp(p->no,info->no)
是
否
info->next=p->next;
q->next=info;
printf("Don'tforget
save\n")
从文件读数据函数STUDENT*load()
这是一个不返回值的有参函数,形参为“链表头的指针”,根据输入的文件地址进行读取。
N-S流程图如下:
定义两个指针变量p1,p2
输入要打开的记录文件地址infile
文件不能打开
否
是
开辟一个新单元
返回菜单
指针p1是否为空
否
读入记录
是
fclose(fp);(关闭文件)
按部分排序函数 STUDENT*sort(STUDENT*head)
这是一个有参函数,形参为“链表头的指针”,按学生成绩的平均分高低进行排序,还可以显示名次。
N-S流程图:
temp=head->next,head->next=NULL
当temp!
=NULL时
当t->averageaverage&&p1!
=NULL时
t=temp;temp=temp->next;
p1=head;p2=head;
p2=p1;p1=p1->next;
p1=p2
是 否
t->next=p1; t->next=p1;
head=t; p2->next=t;
p1=head;
当p1!
=NULL时
i++;p1—>order=i;p1=p1—>next;
输出“排序成功”
四:
程序调试
1.程序调试中遇到的问题以及解决问题的方法。
开始设计出来的菜单不是预想的那样,而是总个窗中出现混乱。
解决的这个问题的办法是调整。
最后还是在学姐的帮助下找到了问题的所在——for循环的次超过了链表中结点的数量。
再就是自定义函数时由于课本的概念不清楚,多写了空格键,以至函数调用不出来。
又如:
在设计修改学生信息时的密密码时。
当用户发现输入密码错误按了退格键后,因为“*”并没有消去。
导致用户再次按退格键,又出现前面的情况。
最终导致输入密码错误。
所以用了两次退格键:
putchar(8); /*退格键*/
putchar(''); /*以空格代替*/
putchar(8); /*再次退格*/。
在对链表操作时,要特别链表指针的移动(p=p->next)和链表尾的判断 (p==NULL)。
没有指针的移动,就很容易出现死循环。
而在运行过程中不能控制。
所以你就会认为是死机。
如果没有链表尾的判断。
就会在运行过程出现想不到的错误。
如:
在显示链表信息时,后面就会出现乱码。
一个系统的菜单和提示信息非常重要。
如果没有这些用户根本不知道怎么用你设计的这个系统。
在设计的调试过程中也无法顺利的完成调试工作。
有了一个清晰简单的菜单和一些提示信息这后,调试过程完成的非常顺利。
五.心得体会
通过半学期的C语言程序设计的学习,使自己对计算机方面的认识,如果用文学词汇说,那就使从感性认识上升到了理性认识。
以前,我只知道计算机用途很广,但不知道它为什么能这样作,通过学习才知道这是程序在指挥着计算机的运作。
刚接触到这门课程,我由于底子差,感觉到了它的难度,但通过渐渐的学习,我认识到了它的重要性,更认识到这是一种能力的培养,我下定决心要把它学好。
经过几次的上机操作,看到自己设计的程序能运行出正确的结果,我对C语言产生了兴趣。
刚拿到课程设计时,心里十分的没底,不知道该如何下手,怕自己完成不了任务。
原因便是自己没把知识真正学到手,不敢找出自己的问题并解决它,不知道到底学了些什么,更别说问出什么问题。
但学习就是要不断的发现问题,才能不断的解决问题,不然不会有什么成效,更谈不上进步啦。
实际上,问题是最好的老师,是学生学习的引导没有问题便没有深入。
在C程序设计过程中,我们就是在问题解决中学习,即提出问题,老师也留了大量的时间给我们思考、讨论、解决问题,从而更深入地展开学习。
这样就充分的调动了我们学习的积极性和主动性。
这次实验课题,老师给了我们大量的时间让我们准备,让我们自己发现问题,并通过自己最大的努力解决问题。
在准备的过程中,我们查阅书籍,请教同学,其实就是一个对知识进行运用的过程,也是自己发现问题并解决问题的最好体现。
C语言课程设计不仅能提高教学质量、增强教学效果、而且能培养和提高我们分析问题、解决问题能力和创新能力。
老师在给我们定制的任务书中中,围绕我们的所学的书本的基本知识点引导引导我们思考和探索,是我们的思想活跃起来。
经过自己的努力,问题一个接一个的被我解决了,课程知识也逐渐在自己脑海里形成了一体系,使自己读课程知识有了一次全面的认识。
老师教给学生正确的学习方法,给我们这么好的机会,让我们掌握程C语言的的思想精髓在这次的实践过程中我独立的思考着这些问题,自己试着设计着这些比较有趣的课题,把课堂上学的for,Switch和while语句还有结构体的使用和指针的用法与作用都有了进一步的认识。
这次课题中,遇到的最大问题便是文件的使用。
在自己的程序中由于没有建立文件,使得删除功能和查找功能不能实现。
但在老师的引导下,我发现了问题,在老师的帮助下我建立了文件,成功的运行了删除功能和查找功能。
还有就是密码的设置,自己设置的密码不能运行,但在自己查阅书籍后,引用了一个比较函数,便能实行了。
通过这次课程设计,使我认识到,课本上的知识只是给自己对知识的理论认识,要真正掌握知识,必须得通过实践操作。
自己对知识的不熟悉,使得自己不敢去发现自己的问题,由于怕困难,使得自己不敢去解决问题,最终使得自己不能完成任务,这不是自己没能力完成,而是自己能完成却没去完成。
通过这次课题,我对课程的认识加深了,使自己对课程有了一个整体的把握,也提高了自己发现问题,分析问题,解决问题的能力,更对程序设计产生了更大的兴趣。
这次课题的设计不仅是知识能力的体现,而且也反映了一个人的做事态度。
要勇于发现问题,不逃避问题;面对困难要勇于克服,而不是遇难而退;遇到麻烦要冷静思考,不要心烦气躁,那只能失败。
附1源代码
源程序清单
:
#include"stdio.h" /*I/O函数*/
#include"stdlib.h" /*其它说明*/
#include"string.h" /*字符串函数*/
#include"conio.h" /*屏幕操作函数*/
#include"mem.h" /*内存操作函数*/
#include"ctype.h" /*字符操作函数*/
#include"alloc.h" /*动态地址分配函数*/
#include"dos.h"
#defineN4 /*定义常数*/
typedefstructz1 /*定义数据结构*/
{
charno[12];
charname[20];
intscore[N];
floatsum;
floataverage;
intorder;
structz1*next;
}STUDENT;
/*以下是函数原型*/
STUDENT *init(); /*初始化函数*/
STUDENT*create(); /*创建链表*/
STUDENT*delete(STUDENT*h); /*删除记录*/
voidprint(STUDENT*h); /*显示所有记录*/
voidlookup(STUDENT*h); /*查找*/
voidsave(STUDENT*h); /*保存*/
STUDENT*load(); /*读入记录*/
voidcomputer(STUDENT*h); /*计算总分和均分*/
STUDENT*Modify(STUDENT*h); /*修改记录*/
voidappend(); /*追加记录*/
STUDENT*sort(STUDENT*h); /*按总分排序*/
STUDENT*index(STUDENT*h); /*按学号排序*/
intmenu_select(); /*菜单函数*/
/******主函数开始*******/
main()
{
inti;
STUDENT*head; /*链表定义头指针*/
printf("\n\n\n\n\n\n\n\n\n");
printf(" * * ******** ***** ***** * * *******\n");
printf(" * * * * * * * ** ** * \n");
pri