数学与计算机学院1303班实验报告.docx
《数学与计算机学院1303班实验报告.docx》由会员分享,可在线阅读,更多相关《数学与计算机学院1303班实验报告.docx(23页珍藏版)》请在冰豆网上搜索。
数学与计算机学院1303班实验报告
武汉轻工大学
数计学院
C语言课程设计报告
班级:
计算机类1303班
学号:
1305110050
姓名:
刘文斌
指导教师:
丁月华
日期:
2014年6月
一、实验目的
1.在编辑应用程序过程中,逐步加深对C语言编程的理解;
2.加强实践的能力,动手能力,同时进一步对所学的知识进行巩固;
3.培养初步编程的能力,为以后的学习奠定基础。
二、实验内容
运用所学的C语言知识编辑应用程序:
班级成绩管理系统以及运动的时钟
三.系统软件环境:
本程序主要运行在:
VisualC++6.0
四.课程设计题目:
1.必做题:
班级成绩管理系统
对一个有N个学生的班级,每个学生有M门课程。
该系统实现对班级成绩的录入、显示、修改、排序、保存、查询等操作的管理。
功能要求:
(1)本系统采用一个结构体数组,每个数据的结构应当包括:
学号、姓名、M门课程名称。
(2)本系统显示这样的菜单:
请选择系统功能项:
a、成绩录入
b、成绩显示
c、成绩保存
d、成绩排序
e、成绩修改(要求先输入密码)
f、成绩统计
1)显示每门课程成绩最高的学生的基本信息。
2)显示每门课程的平均成绩,柱状图显示。
3)显示超过某门课程平均成绩的学生人数。
4)显示某门课程每个分数段区间的人数,用饼状图显示。
g、退出系统
(3)执行一个具体的功能之后,程序将重新显示菜单。
(4)将学生成绩保存到文件中。
2.选做题:
运动的时钟
目的与要求:
目的是让读者掌握调用系统函数及在程序中运用数学原理来制作运动物体的方法,同时学会使用声音函数,以制作出绘声绘色的动画效果。
基本要求:
运用模块化的设计思想完成各功能模块的设计;程序运行界面美观,运行时伴有声音;写出详细设计说明书。
创新要求:
在基本要求达到后,进行创新设计,如增加整点报时功能,定时功能等。
设计方法与基本原理:
1问题描述
利用TurboC提供的图形库,来制作运动的时钟效果,同时要伴有时钟的滴答声。
2基本原理
利用dos.h中的gettime和getdate得到系统的时间和日期,然后利用graphics.h中的绘图函数显示在屏幕上。
3程序总体结构设计
主函数由屏幕初始化函数(画出时钟外貌)和时钟运行函数(画出运行的时钟指针及发出滴答声)两部分构成。
其主要部分如下:
#include
#include
#include
…
voidmain()
{
…
屏幕初始化函数;
时钟运行函数;
…
}
五.数据结构设计描述:
(一)班级成绩管理系统
(二)运动的时钟
六、源程序代码
(一)班级成绩管理系统
#include
#defineMaxSize50
structstudent//声明结构体类型structstudent
{
intnum;//学号
charname[8];//姓名
floatchinese,math,english,politics;//语文、数学、英语、政治四门课
floatsum;//四门课总分
};
voidinput_student();//成绩输入函数申明
voidshow_student();//成绩显示函数申明
voidsort_student();//成绩修改函数申明
voidupdate_student();//成绩排序函数申明
voidstatistics_student();//成绩统计函数申明
intcount=0;//记录当前录入信息的学生人数
structstudentstu[MaxSize];//定义结构体数组
//显示主菜单
voidprint_menu()
{
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("*****您好,欢迎使用班级成绩管理系统******\n");
printf("##\n");
printf("#1.成绩录入#\n");
printf("#2.成绩显示#\n");
printf("#3.成绩排序#\n");
printf("#4.成绩修改#\n");
printf("#5.成绩统计#\n");
printf("#0.退出系统#\n");
printf("##\n");
printf("*****************************************\n");
}
intmain()
{
intmima;
intyonghu;
print_menu();
printf("请输入用户名:
");
scanf("%d",&yonghu);
if(yonghu==1305110050)
printf("请输入密码:
");
scanf("%d",&mima);
if(mima==123456);
intchoice;
do
{
print_menu();
scanf("%d",&choice);
switch(choice){
case1:
input_student();break;//调用input_student函数
case2:
show_student();break;//调用show_student函数
case3:
sort_student();break;//调用sort_student函数
case4:
update_student();break;//调用update_student函数
case5:
statistics_student();break;//调用statistics_student函数
case0:
break;
}
}while(choice!
=0);
printf("END!
\n");//非法输入则跳出菜单
return0;
}
//录入学生成绩
voidinput_student()
{
structstudents;//定义结构体变量
if(count==MaxSize)
{
printf("内存已满!
\n");
return;
}
printf("学号\t\t姓名\t语文\t数学\t英语\t政治四门课的成绩\n");
scanf("%d%s%f%f%f%f",&s.num,&s.name,&s.chinese,&s.math,&s.english,&s.politics);
s.sum=s.chinese+s.math+s.english+s.politics;//计算当前每个学生的总分
stu[count]=s;
count++;//当前录入信息的学生人数
}
//显示学生成绩
voidshow_student()
{
inti;
if(count==0)
{
printf("没有信息可供查询!
\n");
return;
}
printf("学号\t\t姓名\t语文\t数学\t英语\t政治\n");
for(i=0;i{
printf("%d\t%s\t%2.2f\t%2.2f\t%2.2f\t%2.2f",stu[i].num,stu[i].name,stu[i].chinese,stu[i].math,stu[i].english,stu[i].politics);
//输出相应的信息
printf("\n");
}
}
//将学生成绩排序
voidsort_student()
{
inti,j;
structstudents;
floatgrade[50];//定义新数组
if(count==0)
{
printf("没有存储信息,无法进行排序,请返回主菜单录入信息!
\n");
return;
}
for(i=0;igrade[i]=stu[i].sum;//提取结构体数组里的信息
for(i=0;i{
for(j=0;jif(grade[j+1]>grade[j])
{
s=stu[j+1];
stu[j+1]=stu[j];
stu[j]=s;
}
}
printf("学号\t姓名\t总分\n");
for(i=0;iprintf("%d\t%s\t%3.2f\n",stu[i].num,stu[i].name,stu[i].sum);
printf("\n");
return;
}
//修改学生成绩
voidupdate_student()
{
intcourse,i;
charnum;
floatscore;
printf("请输入学号进行修改:
");
scanf("%d",&num);
for(i=0;iif(stu[i].num==num)break;
if(i{
do
{
printf("请选择课程:
1.语文\t2.数学\t3.英语\t4.政治\t0.退出:
");
scanf("%d",&course);
if(course==0)break;
printf("请输入新成绩:
");
scanf("%f",&score);
switch(course)
{
case1:
stu[i].chinese=score;break;//把输入的分数赋值给结构体数组里的成员
case2:
stu[i].math=score;break;
case3:
stu[i].english=score;break;
case4:
stu[i].politics=score;break;
}
}while
(1);
printf("修改后的成绩为:
\n");
printf("num\tchinese\tmath\tenglish\tpolitics\n");//输出科目
printf("%d\t%6.2f\t%6.2f\t%6.2f\t%6.2f\n",stu[i].num,stu[i].chinese,stu[i].math,stu[i].english,stu[i].politics);
}//输出成绩
elseprintf("没有找到要修改的学号\n");
}
//统计学生成绩
voidstatistics_student()
{
inti;
floatsum1=0,sum2=0,sum3=0,sum4=0,aver1,aver2,aver3,aver4;
for(i=0;isum1=sum1+stu[i].chinese;
aver1=sum1/count;
for(i=0;isum2=sum2+stu[i].math;
aver2=sum2/count;
for(i=0;isum3=sum3+stu[i].english;
aver3=sum3/count;
for(i=0;isum4=sum4+stu[i].politics;
aver4=sum4/count;//计算当前每个学生的平均成绩
printf("课程\t平均分\n");
printf("chinese\t%6.2f\n",aver1);//输出当前每个学生的各科平均分(以下同是)
printf("math\t%6.2f\n",aver2);
printf("english\t%6.2f\n",aver3);
printf("politics%6.2f\n",aver4);
return;
}
(2)运动的时钟
说明:
在运行程序前,先将文件夹中名字为ud.jpg的文件存入D盘,因为在程序运行时会调用。
#include
#include
#include
#include
#definePI3.1415926//定义pi
/*出时钟的表盘*/
voidDrawbiaopan()//画表盘
{
setwritemode(TRANSPARENT);
inti;
intx1,y1,x2,y2,x3,y3,x4,y4,x5,y5;//表心坐标系坐标
charrome[][3]={"12","1","2","3","4","5","6","7","8","9","10","11"};//表盘数字
setcolor(GREEN);//画四个圆
circle(350,350,300);
circle(350,350,30);
circle(350,350,280);
circle(350,350,270);
for(i=0;i<59;i++)//画60条短线
{
setcolor(RED);
x1=(int)(350+(sin(i*PI/30)*250));
y1=(int)(350-(cos(i*PI/30)*250));
x2=(int)(350+(sin(i*PI/30)*260));
y2=(int)(350-(cos(i*PI/30)*260));
line(x1,y1,x2,y2);
setfillstyle(BLACK);//设置当前填充模式画12个三角形
if(i%5==0)
{
x3=(int)(x1+sin((i+5)*PI/30)*12);
y3=(int)(y1-cos((i+5)*PI/30)*12);
x4=(int)(x1+sin((i-5)*PI/30)*12);
y4=(int)(y1-cos((i-5)*PI/30)*12);
x5=(int)(340+(sin((i-0.2)*PI/30)*220));
y5=(int)(340-(cos((i-0.2)*PI/30)*220));
inttriangle[6]={x1,y1,x3,y3,x4,y4};
setcolor(BLACK);
fillpoly(3,triangle);//画填充的多边形
setbkmode(TRANSPARENT);//设置背景混合模式
setcolor(RED);//写表盘数字
setfont(24,0,"");
outtextxy(x5,y5,rome[i/5]);
}
}
}
/*画出时针、分针、秒针(以直线来表示)*/
voidDrawzhizheng(inthour,intminute,intsecond)//画指针
{
intxhour,yhour,xminute,yminute,xsecond,ysecond;//表心坐标系指针坐标
//对时针、分针、秒针的位置进行计算
xhour=(int)(130*sin(hour*PI/6+minute*PI/360+second*PI/1800));
yhour=(int)(130*cos(hour*PI/6+minute*PI/360+second*PI/1800));
xminute=(int)(145*sin(minute*PI/30+second*PI/1800));
yminute=(int)(145*cos(minute*PI/30+second*PI/1800));
xsecond=(int)(200*sin(second*PI/30));
ysecond=(int)(200*cos(second*PI/30));
setlinestyle(PS_SOLID,7,NULL,10);//画时针
setcolor(LIGHTGRAY);
line(350+xhour,350-yhour,350-xhour/6,350+yhour/6);
setlinestyle(PS_SOLID,5,NULL,7);//画分针
setcolor(RGB(222,158,107));
line(350+xminute,350-yminute,350-xminute/4,350+yminute/4);
setlinestyle(PS_SOLID,3,NULL,3);//画秒针
setcolor(RED);
line(350+xsecond,350-ysecond,350-xsecond/3,350+ysecond/5);
}
intmain(void)//函数原型声明
{
voidDrawbiaopan();
voidDrawzhuangshi();
voidDrawzhizheng(inthour,intminute,intsecond);
initgraph(1000,1000);//初始化600×600的绘图窗口
setbkcolor(RGB(245,247,222));//设置背景色
cleardevice();//清空屏幕
intgdriver=700,gmode=700;
initgraph(gdriver,gmode);
loadimage(NULL,"D:
\\123.jpg",700,700);
Drawbiaopan();//画表盘
setcolor(BLUE);//在表盘上加上字
setfont(32,0,"华文新魏");
outtextxy(300,220,"皮卡丘");
setwritemode(R2_XORPEN);//设置异或绘图方式
SYSTEMTIMEt;//定义变量保存当前时间
while(!
kbhit())
{
GetLocalTime(&t);//获取当前时间
Drawzhizheng(t.wHour,t.wMinute,t.wSecond);//画表针
Sleep(1000);
Drawzhizheng(t.wHour,t.wMinute,t.wSecond);//擦表针
}
closegraph();//关闭绘图窗口
return0;
}
七、运行结果
(一)
1、主界面
2、成绩录入
3、成绩输出
4、成绩排序
5、成绩统计
(二)、运动的时钟
八、出现的问题以及解决方法
1、问题:
在本实验室中用TurboC进行此题目实验,系统环境不配套。
解决方法:
(1)、使用其他系统环境。
(2)、下载EasyX库。
EasyX是针对C++的图形库,可以帮助C语言初学者快速上手图形和游戏编程。
EasyX20140321(beta)
(上为下载地址)
EasyX安装说明:
系统支持
操作系统版本:
Windows2000及以上操作系统。
编译环境版本:
VisualC++6.0/VisualC++2008~2013(x86&x64)。
安装
请先将下载的压缩包解压缩,然后执行Setup.hta,并跟随提示安装。
安装程序会检测您已经安装的VC版本,并根据您的选择将对应的.h和.lib文件安装至VC的include和lib文件夹内。
安装程序不会修改注册表或者您本机的任何文件。
如果您需要手动安装,请根据下面的文件列表说明将安装包里的相关文件分别拷贝到VC对应的include和lib文件夹内,或者将include和lib文件夹放到任意位置,然后修改VC中的Lib和Include的引用路径。
卸载
由于安装程序并不改写注册表,因此您在“添加删除程序”中不会看到EasyX的卸载项。
如需卸载,请执行相应版本的Setup.hta,并根据提示卸载。
也可以手动将相关的.h和.lib删除,系统中不会残留任何垃圾信息。
文件列表说明
下载的压缩包里文件列表及对应说明如下:
├include<文件夹>
│ ├easyx.h //头文件
│ └graphics.h //头文件(模拟BGI绘图库)
├lib<文件夹>
│ ├amd64<文件夹>
│ │ ├easyx.lib //VC2008~2013MBCS库文件(x64)
│ │ └easyxw.lib //VC2008~2013Unicode库文件(x64)
│ ├easyx6.lib //VC6MBCS库文件
│ ├easyxw6.lib //VC6Unicode库文件
│ ├easyx.lib