C语言程序的设计报告课程设计
分类号编号
华北水利水电大学North China Institute of Water Conservancy and Hydroelectric
Power
课程设计
课程名高级语言程序设计
题目机房机位预定系统
院系信息工程学院
专业计算机科学与技术
姓名
学号
指导教师
2015年1 月3 日
一、基础题
【题目3】
任意输入一个偶数,验证其总能表示为两个素数之和。
程序代码:
#include
int main()
{
int n;
while(scanf("%d",&n),n)
{
int i,j;
for(j=2;j<=n/2;j++)
{
for(i=2;i if(j%i==0)break; if(i>j-1) { for(i=2;i if((n-j)%i==0)break; if((i>n-j-1)&&n-j!=1)printf("%d=%d+%d\n",n,j,n-j); } } } return 0; } 运行结果: 【题目4】 某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。 程序代码: #include using namespace std; void main() { char num[4],i; cin>>num; for(i='0';i<'4';i++) num[i-48]=(num[i-48]-48+5)%10+48; i=num[0]; num[0]=num[3]; num[3]=i; i=num[1]; num[1]=num[2]; num[2]=i; cout< } 运行结果: 【题目6】 编写一个将某个范围在0~32767之间的整数转换为R进制(R=2,8,16)的通用程序。 程序代码: #include #include void trans(int n,int m) { if(n) { trans(n/m,m); if(n%m<10) printf("%c",n%m+'0'); else printf("%c",n%m-10+'A'); } } void main() { int n,m; printf("输入十进制数N和转化的进制数M:"); scanf("%d%d",&n,&m); printf("十进制数%d转化成%d进制后的结果为:",n,m); trans(n,m); printf("\n"); } 运行结果: 二、综合应用题 【题目6】机房机位预定系统 20台机器,编号1到20,从早八点到晚八点。两小时一个时间段,每次可预定一个时间段。功能要求: (1)系统以菜单方式工作 (2)查询,根据输入时间,输出机位信息。 (3)机位预定,根据输入的时间查询是否有空机位,若有则预约,若无则提供最近的时间段,另:若用户在非空时间上机,则将用户信息列入等待列表。(4)退出预定,根据输入的时间,机器号撤销该事件的预定! (5)查询是否有等待信息,若有则提供最优解决方案(等待时间尽量短),若无则显示提示信息。 1.题目分析:根据题目要求在程序中需实现查询,预定,排队等功能的操作,所以需要建立相应的模块来实现;另外还需提供键盘式选择菜单实现功能,在运行时达到所要目的。因此,整个系统总体分为3个模 块,分别是:查询模块、预定模块、取消模块。 首先,主函数设计的一般比较简洁,只能提供输入、处理和输出部分的函数调用。其中各功能模块用菜单方式选择。本模块通过do-while语句和switch语句实现主菜单的显示和对功能的选择。 查询模块:本模块的功能是通过调用函数指向队列的指针查询用户输入的时间段的机位状态,如果有空机位就在屏幕上显示出来当前时刻的空机位的总数和所以的空机位的序号,如果没有空机位则在屏幕上显示有零台空机位。 预定模块:在该模块的设计中,要让预定者按预定的顺序存在结构体中,当预定者的总数小于最大值时,就要用到通过指针的移动来把预定者的信息按顺序存储起来,用两个不同的指针分别指向链表的开始,链表的结尾处。 取消模块:要取消预定,有两种情况。第一是从有机位的人要取消预定,在该种情况下,排队的第一人的位置就插入到该取消者的位置。而指向等待队列首地址的指针就指向原来排队的第二人。第二种情况就是取消预定的人本来就在等待队列中,只需要直接删除该结点即可。 2.程序代码: #include #include #include #include #define N 20 #define T (time-8)/2 int sum[6]={0}; int computer[6][20]={{1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,0,0,1,1,1}, {1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,0}, {1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1}};/*该数组表示假设某天某人查询时机房各个时间段机位数情况*/ void Menu(); void Situation(); void Book(); void Cancel(); void SearchWaiting(); void detail(int time); void prione(int i); struct waitlist/*等待列表*/ { char number[3]; char telephonenumber[11]; } wait[N]; void printone(int i); void main() { Menu(); /*当前状态函数*/ } void Menu()/*主界面*/ { int n,w; do { puts("\t\t****************机房机位预定系统************************\n"); puts("\t\t*************************菜单***************************\n"); puts("\t\t\t 1.查询某时间段机位状态");/*查询某时间段机位状态*/ puts("\t\t\t 2.预定空机位");/*预定空机位*/ puts("\t\t\t 3.取消预订");/*取消预订*/ puts("\t\t\t 4.查询等待信息"); /*查询等待信息*/ puts("\t\t\t 5.退出"); /*退出*/ puts("\t\t**************************************************** ****\n"); printf("选择菜单号(1-5):"); scanf("%d",&n); if(n<1||n>5) {w=1;getchar(); } else w=0; } while(w==1); switch(n) { case 1:Situation();break; case 2:Book();break; case 3:Cancel();break; case 4:SearchWaiting();break; case 5:exit(0);break; } getch(); }/*时间查询*/ void Situation() { int time; printf("输在(8-20)范围内的时间:"); scanf("%d",&time); if(time<8||time>20) {printf("\t时间输入错误!\n"); printf("输入在(8-20)范围内的时间:"); scanf("%d",&time); } detail(time);/*函数调用*/ getchar(); Menu(); }/*预定函数*/ void Book() {int time,i=0,x,y; FILE *fp; char c; printf("在(8-20)时间范围内输入你想要预定的时间:"); scanf("%d",&time); if(time<8||time>20) { printf("\t时间输入错误!\n"); printf("\t在(8-20)时间范围内输入你想要预定的时间:"); scanf("%d",&time); } detail(time);/*函数调用*/ if(sum[T]>0) { if((fp=fopen("waitlist.txt","a"))==NULL) { printf("\n无法打开文件!\n"); exit(0); } printf("\n\t请输入你想要预定的机号,并且留下你的电话号码!:\n"); scanf("%s %s",wait[i].number,wait[i].telephonenumber); for(i=0;i<1;i++) fwrite(&wait[i],sizeof(struct waitlist),1,fp); fclose(fp);/*向文本文档添加一个结构体单元*/ printf("\t再次输入你想要预定的时间!\n"); scanf("%d",&x); /*sum[T]--; /预定后该时间段空机位数减1*/ /*computer[T][x]=1; / *预定后该机状态变为1*/ printf("\t预订成功!\n"); getchar(); Menu(); } else { printf("这是在这个时间段内未预定的电脑!\n"); for(i=T+1;i<6;i++) { time=9+2*i; detail(time);/*函数调用*/ if(sum[T]>0) printf("\t最近的空闲时间是%d,%d\n",2*i+8,2*i+10);break; } printf("\t你想要预定吗?:y/n?"); scanf("%s",&c); getchar(); if(c=='Y'||c=='y') { if((fp=fopen("waitlist.txt","r"))==NULL) { printf("\n无法打开文件!\n"); exit(0); } else { printf("waitlist number telephonenumber\n"); for(i=0;!feof(fp);i++) { fscanf(fp,"%s %s",&wait[i].number,&wait[i].telephonenumber); } fclose(fp); } for(i=0;i<10;i++) { prione(i); } printf("\n\t请输入您想预定的机号并留下您的联系方式!:\n"); if((fp=fopen("waitlist.txt","a"))==NULL) { printf("\n无法打开文件!\n"); exit(0); } scanf("%s %s",wait[i].number,wait[i].telephonenumber); for(i=0;i<1;i++) fwrite(&wait[i],sizeof(struct waitlist),1,fp); fclose(fp);/*若等待,就用文件的方式列出当时的等待列表并提示输入你的等待序号和联系方式*/ printf("再次输入电脑的序号!\n"); scanf("%d",&y); sum[T]--; computer[T][y]=1; printf("\t好了,请等待我们的电话!\n"); Menu(); } else Menu(); } } /*取消预订*/ void Cancel() { int time,number; printf("在(8-20)时间范围内输入你已经预定的时间:"); scanf("%d",&time); if(time<8||time>20) { printf("\t输入时间错误!\n"); printf("\t在(8-20)时间范围内输入你已经预定的时间:"); scanf("%d",&time); } else {printf("\t输入你预定的机号:"); scanf("%d",&number); } detail(time);/* sum[T]++; / 预定后该时间段空机位数加1*/ /*computer[T][number]=0;/ * 预定后该机状态变为0*/ printf("\t取消成功!\n"); getchar(); Menu(); }/*查看等待信息*/ void SearchWaiting() { int time,i; FILE *fp; printf("\t在(8-20)之间输入您要搜索的时间:"); scanf("%d",&time); if(time<8||time>20) { printf("\t时间输入错误!\n"); printf("\t在(8-20)之间输入您要搜索的时间:"); scanf("%d",&time); } else; if((fp=fopen("waitlist.txt","r"))==NULL) { printf("\nCannot open file!\n"); exit(0); } else { printf("waitlist number telephonenumber\n"); for(i=0;!feof(fp);i++) { fscanf(fp,"%s %s",&wait[i].number,&wait[i].telephonenumber); } fclose(fp); } for(i=0;i<10;i++) { prione(i);} Menu(); }/*公共函数*/ void detail(int time)/*此函数功能是实现查找每个时间段空机位总数和空机位号*/ { int i,j=0,k,s=0; int v[30]; for(i=0;i<20;i++) { if(computer[T][i]==0) { s++; v[j++]=i; } } sum[T]=s; printf("\t目前空置的电脑:%d\n",sum[T]); for(k=0;k printf("\t空置的电脑是:%d\n",v[k]); } void prione(int i)/*此函数功能是实现输出等待列表到屏幕*/ { printf("\t\t%s %s\n",wait[i].number,wait[i].telephonenumber); } 3.运行结果: 三、总结 通过这次C语言的课程设计,我明白了很多也知道了很多,更收获了很多。在课程设计的过程中出现过困难,两周的课程设计已经结束了。回想学习C语言的过程中,既有快乐又有烦恼。回顾这次课程设计,至今我仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在整整两个星期的日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论和知识是远远不够的,只有把所学的理论知识与实际相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考能力。在设计的过程中遇到的问题,这毕竟独立做的,难免会遇到各种各样的问题,同时在设计的过程中发现自己的不足之处,对以前所学的知识理解得不够深刻,掌握得不够牢固。通过这次课程设计之后,一定把以前所学过的知识从新温故。做完这个课程设计,我的自信一下子提高了,我也会慢慢写程序了。这次的课程设计,它使我更加地体会到多看专业书的重要性,只有掌握了一定量的专业知识才能得心应手地解决诸多问题。另外,在做任何事倒要有耐心,不要一遇到困 难就退缩。 四、参考文献 [1]谭浩强著.C程序设计(第三版).北京:清华大学出版社,2005 [2]谭浩强编著.C程序设计题解与上机指导(第三版).北京:清华大学出版社,2005 [3]黄明等编著《C语言程序设计》北京:电子工业出版社 [4]郭翠英编著《C语言课程设计案例精选》北京:中国水利水电出版社