第一篇:C语言课程设计停车场报告
C语言上机实习报告
指导老师:吴杰 学生姓名:刘超 班级序号:02305231 学生证号:20051004279
一.题目要求
设有一个可以停放N辆汽车的狭长停车场,它只有1个大门可以供车辆进出。车辆按到达停车时间的早晚依次从停车场罪戾面向大门口停放。如果停车场已放满N辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排放在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在他之后进来的车都必须先退出停车场为它让路,等待其开出停车场后,这些车辆再依原来次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离开,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆次序。
二.需求分析
停车场采用栈式结构,停车场外的便道采用队列结构(即便道就是等候队列)。
停车场的管理流程如下:①当车辆要进入停车场时,检查停车场是否已满,如果未满则车辆进栈(车辆进入停车场);如果停车场已满,则车辆进入等候队列(车辆进入便道等候)。②当车辆要求出栈时,该车到栈顶的那些车辆先弹出栈(在它之后进入的车辆必须先退出车场为它让路),再让该车出栈,其他车辆再按原次序进栈(进入车场)。当车辆出栈完毕后,检查等候队列(便道)中是否有车,有车则从队列头取出一辆车压入栈中。
三.总体设计
采用面向对象设计方法:先抽象出类,再分析每个类有哪些成员变量,每个类应该实现哪些功能(即应该有哪些成员函数)。最后,根据要求实现类的成员函数,完成该模拟的逻辑设计和实现。
四.详细设计
#include
#define MAX 2 /*车库容量*/ #define price 0.05 /*每车每分钟费用*/ typedef struct time{ int hour;int min;}Time;/*时间结点*/ typedef struct node{ char num[10];Time reach;Time leave;}CarNode;/*车辆信息结点*/ typedef struct NODE{ CarNode *stack[MAX+1];int top;}SeqStackCar;/*模拟车站*/ typedef struct car{ CarNode *data;struct car *next;}QueueNode;typedef struct Node{ QueueNode *head;QueueNode *rear;}LinkQueueCar;/*模拟通道*/
void InitStack(SeqStackCar *);/*初始化栈*/ int InitQueue(LinkQueueCar *);/*初始化便道*/ int Arrival(SeqStackCar *,LinkQueueCar *);/*车辆到达*/ void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *);/*车辆离开*/ void List(SeqStackCar,LinkQueueCar);/*显示存车信息*/
void main(){ SeqStackCar Enter,Temp;LinkQueueCar Wait;int ch;InitStack(&Enter);/*初始化车站*/ InitStack(&Temp);/*初始化让路的临时栈*/ InitQueue(&Wait);/*初始化通道*/ while(1){ printf(“n1.the car arrive”);printf(“ 2.the car leave”);printf(“ 3.the schedule ”);printf(“ 4.outn”);while(1){ scanf(“%d”,&ch);if(ch>=1&&ch<=4)break;else printf(“nplease choose: 1|2|3|4.”);} switch(ch){ case 1:Arrival(&Enter,&Wait);break;/*车辆到达*/ case 2:Leave(&Enter,&Temp,&Wait);break;/*车辆离开*/ case 3:List(Enter,Wait);break;/*列表打印信息*/ case 4:exit(0);/*退出主程序*/ default: break;} } }
void InitStack(SeqStackCar *s)/*初始化栈*/ { int i;s->top=0;for(i=0;i<=MAX;i++)s->stack[s->top]=NULL;} int InitQueue(LinkQueueCar *Q)/*初始化便道*/ { Q->head=(QueueNode *)malloc(sizeof(QueueNode));if(Q->head!=NULL){ Q->head->next=NULL;Q->rear=Q->head;return(1);} else return(-1);} void PRINT(CarNode *p)/*打印出站车的信息*/ { int A1,A2,B1,B2;printf(“nplease input thedepart time:/**:**/”);scanf(“%d:%d”,&(p->leave.hour),&(p->leave.min));printf(“nthe number of the car:”);puts(p->num);printf(“nthe time the car arrive: %d:%d”,p->reach.hour,p->reach.min);printf(“the depart time: %d:%d”,p->leave.hour,p->leave.min);A1=p->reach.hour;A2=p->reach.min;B1=p->leave.hour;B2=p->leave.min;printf(“nthe fee: %2.1f元”,((B1-A1)*60+(B2-A2))*price);free(p);} int Arrival(SeqStackCar *Enter,LinkQueueCar *W)/*车辆到达*/ { CarNode *p;QueueNode *t;p=(CarNode *)malloc(sizeof(CarNode));flushall();printf(“ninput the number of the car(例:陕A1234):”);gets(p->num);if(Enter->top
程序运行过程:
1。主系统程序
2.选择所需系统
存储完毕程序继续进行。
选择2为车辆离开启动程序:
选择4退出程序。
五.总结
通过该实例的设计分析,掌握了模块设计的方法,理解和运用了结构化程序设计的思想和方法。掌握和提高了利用C语言进行编程设计的能力。
第二篇:数据结构课程设计报告_15_停车场管理
停车场管理系统
——数据结构课程设计程序设计书
小组成员:
彭路
20131344031 崔琦
20131344028 徐佳
20131344027 范福龙 20121344024 班级 : 13软件工程1班 时间:2014.12.22
目录
一、程序设计目标
二、问题描述
三、需求分析
四、概要设计
五、详细设计
六、源程序清单
七、软件说明书
八、测试报告
九、课程设计总结
一、程序设计目标
本管理程序由c/c++语言完成,实现了对停车场收费问题的处理。本程序保证了程序的健壮性和操作性,在阅读过使用说明书之后可以轻松使用。本管理系统假设车辆在停车场时一直有人在驾驶,或者说停车场的每块停车位均可智能移动。并假设车辆进出场耗时不计,且时间均为整数类型。最后自动或者人工完成收费。
二、问题描述
设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。
三、需求分析
根据问题描述,可把本停车场抽象成一个栈存储类型s1,需要输入最大停车容量n。每当输入’A’时即为有车辆申请进入停车场操作,此时需要判断停车场是否有空位,如果有空位,那么这辆车可以进入停车场,即为执行一次压栈操作(push),并记录进入停车场的时间t1,并输出位置p1;如果停车场没有空位,那么这辆车在门外便道等候,并输出位置p2。根据问题描述,可以把此门外便道抽象成一个队列存储类型q,而每有一辆车进入门外便道,即相当于进行一次插入队列操作(push)。每当输入’D’时即为有车辆申请离开停车场操作,此时需要判断该车辆在停车场的位置。如果该车位于停车场最外侧即相当于栈顶,那么该车可以直接批准离开并根据输入的离开时间t2计算出停车时间t2-t1,根据该车本次停车时间完成收费后即可成功驶出停车场,即相当于成功弹出栈顶元素(pop);如果该车没有位于停车场最外侧,事实上,这也是大多数的情况,那么需要将该车外侧的车依次(即为挡路的车)移动进一个临时停车场,根据问题描述,可以将该临时停车场抽象成另一个栈存储类型s2,那么此次移动操作相当于将栈中某元素以上的元素依次压入另一个栈(push)。当申请离开的车驶出停车场后,在临时停车场的车辆依次进入停车场,此操作相当于将栈s2内元素依次弹出栈(pop)并压入栈s1(push)。此时判断门外便道上有无等待进入停车场的车辆,如果有的话,门外便道上第一辆车可以进入停车场,并记录进入时间t1,此次操作相当于取出队列q的队首元素并将其压入栈s1中。而输入’E’时,即退出系统。至此,所有分析结束。
四、概要设计
根据需求分析,解决此问题需要构建一个Cars类型的结构体,构建一个CarNode类型的节点结构体以构建SQueue类型的队列结构体,并需要构建一个SQstack类型的栈结构体。接下来,分别定义队列和栈的各项基本操作函数。最后,完成菜单函数以实现各项操作。
五、详细设计
本程序定义了三个头文件,manager_cars.h、manager_stack.h、manager_queue.h。分别实现了Cars类型的结构体、SQueue类型的队列结构体、SQstack类型的栈结构体以及队列的相关操作函数和栈的相关操作函数。具体如下:
1、manager_cars.h
sq->lastCar=car;sq->firstCar->nextCar=NULL;sq->length=0;} //进入队列操作
void enterSQueue(SQueue *sq,int num,int t){ CarNode *car=(CarNode *)malloc(sizeof(CarNode));car->headCar.condition='D';car->headCar.number=num;car->headCar.time=t;car->headCar.position=2;
car->nextCar=NULL;sq->lastCar->nextCar=car;sq->lastCar=car;sq->length++;} //出队列操作
void exceedSQueue(SQueue *sq){ if(sq->firstCar==sq->lastCar)
return;CarNode *car=(CarNode *)malloc(sizeof(CarNode));car=sq->firstCar->nextCar;sq->firstCar->nextCar=car->nextCar;sq->length--;if(sq->lastCar==car)
sq->lastCar=sq->firstCar;free(car);
}
//检测队列存在
int SQueueEmpty(SQueue sq){ if(sq.firstCar==sq.lastCar)
return 1;else
return 0;} //获取队首元素
void getSQueue(SQueue sq,Cars *e){ if(sq.firstCar==sq.lastCar)
return;*e=sq.firstCar->nextCar->headCar;S.base;}
extern int GetTop(SQstack S,Cars *e)//若栈不为空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR { if(S.top == S.base)return 0;
*e = *(S.top-1);
return 1;
}
extern int Push(SQstack*S,Cars e)//插入元素e为新的栈顶元素
{ if(S->top
cout<<“请正确输入Y或N:”< scanf(“%c”,&flag); getchar();} while(flag=='Y'){ flag='C'; Cars car; SQstack park;//定义栈并初始化 InitStack(&park); SQueue street;//定义队列并初始化 setSQueue(&street); cout<<“请输入本停车场最多可提供的车位数:”; scanf(“%d”,&maxNum); getchar(); cout<<“请输入每小时停车费:”; cin>>Pprice; cout< cout<<“请输入到达(A)/离开(D)信息,车牌号,时间(格式为A 1 5):”; cin>>car.condition>>car.number>>car.time; //scanf(“%c %d %d”,&car.condition,&car.number,&car.time); //getchar(); while(car.condition!='E'&&car.number!=0&&car.time!=0) { switch(car.condition) { case 'A': { enterPark(car,park,street); break; } case 'D': { int lasttime; lasttime=outOfPark(car,park,street,car.number,car.time); cout< cout<<“此车在停车场停留了”< } default :cout<<“请输入正确的格式!”< } cin>>car.condition>>car.number>>car.time; //scanf(“%c %d %d”,&car.condition,&car.number,&car.time); Cars headCar;struct CarNode *nextCar;}CarNode; typedef struct { CarNode *firstCar;CarNode *lastCar; int length;}SQueue;//建队列链表 void setSQueue(SQueue *sq){ CarNode *car=(CarNode *)malloc(sizeof(CarNode));sq->firstCar=car;sq->lastCar=car;sq->firstCar->nextCar=NULL;sq->length=0;} //进入队列操作 void enterSQueue(SQueue *sq,int num,int t){ CarNode *car=(CarNode *)malloc(sizeof(CarNode));car->headCar.condition='D';car->headCar.number=num;car->headCar.time=t;car->headCar.position=2; car->nextCar=NULL;sq->lastCar->nextCar=car;sq->lastCar=car;sq->length++;} //出队列操作 void exceedSQueue(SQueue *sq){ if(sq->firstCar==sq->lastCar) return;CarNode *car=(CarNode *)malloc(sizeof(CarNode));car=sq->firstCar->nextCar;sq->firstCar->nextCar=car->nextCar;sq->length--;if(sq->lastCar==car) sq->lastCar=sq->firstCar;free(car); } //检测队列存在 int SQueueEmpty(SQueue sq){ if(sq.firstCar==sq.lastCar) return 1;else return 0;} //队首元素 void getSQueue(SQueue sq,Cars *e){ if(sq.firstCar==sq.lastCar) return;*e=sq.firstCar->nextCar->headCar;} //队列长度 int SQueueLength(SQueue sq){ int len=0;if(sq.firstCar!=sq.lastCar)len=sq.length;return len;} #endif manager_stack.h #include #ifndef manager_stack_h #define manager_stack_h #define STACK_INIT_SIZE 100 //栈的存储空间初始分配量 #define STACKINCREMENT 10 //栈的存储空间分配增量 typedef struct SQstack //栈的结构体 { Cars * base;Cars * top;int stacksize;S.base;} extern int GetTop(SQstack S,Cars *e)//若栈不为空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR { if(S.top == S.base)return 0; *e = *(S.top-1); return 1; } extern int Push(SQstack*S,Cars e)//插入元素e为新的栈顶元素 { if(S->top-S->base >= S->stacksize) { S->base =(Cars *)realloc(S->base,(S->stacksize + STACKINCREMENT)*sizeof(Cars)); if(!S->base)return 0; S->top = S->base + S->stacksize; S->stacksize += STACKINCREMENT; } *S->top++ = e; return 1; } extern int Pop(SQstack *S,Cars *e)//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR { if(S->top == S->base)return 0; *e = *--S->top; return 1; } #endif 七、软件说明书 1、打开系统,输入Y进入管理系统。 2、接下来按提示输入停车场的可供使用的车位数。 3、按提示输入该停车场每小时收费标准。 4、按提示输入到达后者离开信息,例如A 1 5,D 1 10。 5、输入E 0 0并输入N,退出系统。 八、测试报告 1、如图,当打开系统时出现此界面,输入Y为进入系统,输入N为退出系统。 2、如图,如果输入错误会提示出错,并重新输入。 3、如图,输入Y后,按提示依次输入停车场可提供的最大车位数和每小时的停车费。 4、如图,输入A 1 5后,提示进入停车场的信息。 5、如图,输入A 2 10,A 3 15后,依次显示提示信息。 6、如图,输入D 1 20后,分别显示便道进入停车场的3号车和1号车的收费情况。 7、如图,输入E 0 0,再按提示输入N,即可退出系统。 九、课程设计总结 通过团队对该问题分析,互相补充了观点,增强了对该题目正确认识。队员们进行了缜密的需求分析,并分工完成各文件和函数的编写。队员们纷纷表示,这绝对是一个以前不能想象到的任务。通过对该系统的编写、实现,着实增强了队员们的团队意识以及对数据结构的进一步的理解。当程序成功运行后,队员们都非常兴奋,虽然本系统仍有瑕疵,但是可以说这是队员们的心血。 0 C语言课程设计报告 Experiment Designing reporter 课程名称 : C语言课程设计 英文名称 : C Program Experiment Designing 专 业 : 学 号 : 姓 名 : 指导教师 : 日 期: 2011年7月18日 至2011年7月22日 《C语言课程设计》报告 C Program Experiment Designing 课程编号:01200308005 学时: 40学时 适用专业:软件工程专业 授课单位:软件学院 一、C语言课程设计目的及要求 目的: 根据课堂讲授内容,学生做相应的自主练习,消化课堂所讲解的内容;通过调试典型例题或习题积累调试C程序的经验;通过完成辅导教材中的编程题,逐渐培养学生的编程能力、用计算机解决实际问题的能力。 要求: 1. 熟悉Turbo C 的编程环境、主要菜单功能。 2. 通过上机验证运算符、表达式、运算规则、函数使用。3. 熟练使用C语言的典型语句编写简单程序。4. 调试典型例题或习题。5. 提高上机编程能力 二、实验类型 设计类型 三、实验学时 40学时 四、实验设备 微型计算机、WINDOWS98以上版本的操作系统、Turbo C2.0 软件一套 五、C语言课程参考教材: 1.李瑞 C语言程序基础(第二版)清华大学出版社 2.梁旭 C语言课程设计.电子工业出版社 课程设计(报告)任务书 任务及要求: 1.设计(研究)内容和要求 研究内容:C语言课程设计题目相关内容 任务和要求: (1).学习C语言基础知识,掌握C语言编程和程序调试的基本技能。(2).对指导教师下达的题目进行系统分析。(3).根据分析结果完成系统设计。 (4).编程:在计算机上实现题目的代码实现。(5).完成对该系统的测试和调试。(6).提交课程设计报告。(7).指标: 要求完成课程设计报告3千字以上(约二、三十页).完成若干综合性程序设计题目,每个综合设计题目的语句行数的和在300行语句以上.2.原始依据 了解C语言的基础知识,有一定的语言编程基础,能够熟练运用C语言进行程序设计。通过用C语言完成的题目,提高用C语言解决实际问题的能力。3.参考文献 [1] 黄明等.C语言程序设计辅导教材.大连理工大学出版社,2006 [2] 马靖善等.C语言程序设计.清华大学出版社,2005 [3] 谭浩强.C语言程序设计(第二版).北京:高等教育出版社,2002 目录 C语言课程设计报告................................................................................错误!未定义书签。 1. 输出杨辉三角.............................................................................................................1 1.1 系统分析..............................................................................................................1 1.2 设计说明..............................................................................................................1 1.3 程序运行截图......................................................................................................2 1.4 源程序代码..........................................................................................................2 2 汉诺塔求解方法.............................................................................................................3 2.1 系统分析..............................................................................................................3 2.2 设计说明..............................................................................................................3 2.3 程序运行截图......................................................................................................4 2.4 源程序代码..........................................................................................................4 3 输出200以内的素数.....................................................................................................5 3.1功能说明...............................................................................................................5 3.2 设计说明..............................................................................................................5 3.3 程序运行截图......................................................................................................5 3.4 源程序代码..........................................................................................................6 4 进制转换计算器.............................................................................................................6 4.1功能说明...............................................................................................................6 4.2 设计说明..............................................................................................................6 4.3程序运行截图.......................................................................................................7 4.4 源程序代码..........................................................................................................7 5 一元稀疏多项式.............................................................................................................8 5.1 功能说明..............................................................................................................8 5.2 设计说明..............................................................................................................8 5.3 程序运行截图....................................................................................................10 5.4 源程序代码........................................................................................................11 1. 输出杨辉三角 1.1 系统分析 以等腰直角三角形输出杨辉三角 1.2 设计说明 1、包含头文件 #include #include 其中,头文件 2、子函数 函数名:int num(i,j) 函数功能:以递归的方式进行计算,用函数代替二维数组 函数参数:int i;int j; 含义:相当于二维数组的a[i][j] 函数流程 Step1:输出最外行,即三角形两直角边的结果都为 1 ; Step2:讨论其余情况,相当于数组中的 a[i][j] = a[i-1][j-1] + a[i-1][j]。 3、main()函数 1为保证结果完整输出,先进行清屏; ○2输入要打印的行数,由于一行只能显示80个字符,建议不要超过13行; ○3用循环调用函数int num(int i , int j)○ 其中循环为三重循环:i 循环控制行打印 j 循环控制列打印 k 循环控制空格打印 每执行一次i 循环输出一个换行符,直角三角形定点放在第36个字符的位置上。 每个数字占6个字符的格。 1.3 程序运行截图 1.4 源程序代码 #include int num(i,j){ int i,j; if(I == j ||j == 0)return(1); else return(num(i-1 , j-1)+num(i-1 , j));} int main(void){ int n,k,i,j; clrscr(); puts(“input row n:”); scanf(“%d”,&n); for(i = 0;i < n;i++) { { for(k = 0;k < 36-3*i;k++) putchar(' '); } { for(j = 0;j <= i;j++) printf(“%6d”,num(i , j)); } puts(“"); } getch(); return 0; } 汉诺塔求解方法 2.1 系统分析 汉诺塔求解方法 2.2 设计说明 1、包含头文件: #include 其中,#include 2、子函数 函数名:void move(int n , char a , char b) 函数功能:打印移动的主子编号 函数参数:int n , char a , char b; 含义:n为移动的序数,a为源柱号,b目的柱号 函数流程 Step1:输出盘子移动情况; Step2:打印换行。 函数名:void hanoi(int n,char a,char b,char c) 函数功能:以游戏规则求解移动盘子的方法 函数参数:int n,char a,char b,char c; 含义:n移动的序数,a为源柱号,b为目的柱号,c为中间柱号 函数流程 Step1:递归调用函数 hanoi(n-1,a,c,b); Step2:调用函数move(n-1,a,b); Step3:继续递归调用函数hanoi(n-1,c,b,a); 3、主函数main()1为了使程序可以重复运行,定义了变量ch,当ch == N 时,退出游戏; ○2使用while()循环使游戏重复运行; ○3输入盘子的数目以调整游戏的难度; ○3调用函数hanoi()○ 2.3 程序运行截图 2.4 源程序代码 #include ”stdio.h“ #include ”ctype.h“ //应用函数toupper void move(int n,char a,char b) //n为移动的序数,a为源柱号,b目的柱号*/ { printf(”Disc%d move from %c to %c;“,(n+1),a,b); printf(”n“);} void hanoi(int n,char a,char b,char c){ //n移动的序数,a为源柱号,b为目的柱号,c为中间柱号 if(n>0) { hanoi(n-1,a,c,b); //递归调用 move(n-1,a,b); hanoi(n-1,c,b,a); } } main(){ int n; char ch ='Y'; printf(”Now let us play the game of hanoitowern“); while(ch == 'Y') //通用性设计 { printf(”n Input the number of disc[2-15]:“); scanf(”%d“,&n);getchar(); printf(”n The orders of moving %d discs from A to B are:n“,n); hanoi(n,'A','B','C'); //调用函数 printf(”n Continue(Y/N):“); ch=getchar(); getchar(); ch=toupper(ch);} return 0;} 3 输出200以内的素数 3.1功能说明 输出200以内的素数 3.2 设计说明 1、宏定义 #define M 200 //范围,表示输出200以内的素数 #define N((M+1)/2) //奇数的个数 处理流程: Step1:第一步筛选掉所有的偶数,将剩余的奇数存放在a[N]中; Step2:第二部筛选掉多有可以被整除的数 Step3:将得到的素数10个一行打印。 3.3 程序运行截图 3.4 源程序代码 #include ”stdio.h“ #define M 200 //范围 #define N((M+1)/2) //奇数的个数 main(){ int i,j,a[N]; a[0]=2; for(i=1;i //初始数组实现第一步筛选 a[i]=2*i+1; for(i=1;i<(N-1);i++) //第二步筛选 if(a[i]!=0) for(j=i+1;j if((a[j]%a[i]==0)) //倍数时置零筛去 a[j]=0; printf(”n The primer are[2-%d]:n“,M); for(i=0,j=0;i //显示得到素数 { if(a[i]!=0) { printf(”%5d“,a[i]); if((++j)%10==0) //十个数换行 printf(”n“); } } return 0;} 进制转换计算器 4.1功能说明 进行进制转换。 4.2 设计说明 1、处理流程: Step1:输入原始数值xa,原始权a,已经希望转换的进制b;Step2:逐位取值,将原始数值转换成10进制 Step3:逐位取值,将原始数值转换成b 进制 4.3程序运行截图 4.4 源程序代码 void main()#include ”stdio.h“ main() { int a=0,/*原始进制*/ b=8,/*转换进制,默认为八*/ k=1; /*位权*/ long xa=0,/*原始数值*/ xb=0,/*转换数值*/ x1=0,x2=0; /*十进制数值*/ printf(”n Input the number and weight a->b:“); scanf(”%ld%d%d“,&xa,&a,&b); x1=xa; while(x1!=0) /*转换为十进制数*/ { x2+=(x1%10)*k; /*逐位取值*/ x1/=10;k*=a; } k=1; x1=x2; while(x1!=0) /*转换为b进制数*/ { xb+=(x1%b)*k;x1/=b;k*=10; } printf(”n %ld(%d)=%ld(%d)=%ld(%d)“,xa,a,x2,10,xb,b); return;} 一元稀疏多项式 5.1 功能说明 求一元稀疏多项式的运算: 1、求两多项式加法; 2、求两多项式减法; 3、求两多项式乘法; 4、求两多项式导数; 5、求两多项式在x=m处的值。 5.2 设计说明 1、链表结点的定义: typedef struct polyn { float coef; //多项式系数 int expn; //多项式指数 struct polyn * prior,* next;} polyn, *linkpolyn; 2、子函数,多项式的基本运算。函数名:linkpolyn CREATEPOLYN()函数功能:创建多项式链表,在输入的时候进行升序排列 返回值:return head,即建立的多项式头结点 参数:linkpolyn head,含义:链表头结点 处理流程: Step1:输入第一个结点,且第一个结点自然有序; Step2:循环输入其余结点,当输入0 0是表示输入结束; Step3:输入过程中进行升幂排序,用二分法,找到新结点插入点; Step4:插入新结点;继续循环,直到输入0 0,循环结束,链表建立成功。Step5:返回建立链表头结点,函数结束。 函数名:linkpolyn DERIVATIONPOLYN(linkpolyn L)函数功能:多项式求导 返回值:return(head),即求导多项式的链表头结点 参数:linkpolyn L,含义:把建立好的链表A和B传递给L 处理流程: Step1:分别用指针指向L的头结点和求导多项式的头结点head; Step2:用循环逐个对L链表中的结点求导,一次存放在求导多项式中的新结点中; Step3:循环中考虑,当L链表中的结点仅存放一个常数,则跳过该结点,继续遍历下一结点; Step4:当循环结束,即L中的各项以被求导,返回求导多项式头结点head。 函数名:linkpolyn INITPOLYN()函数功能:链表初始化 返回值:return(head),即求导多项式生成的链表头结点 参数:无参数 处理流程: Step1:生成一个新的空间作为新结点; Step2:将新节点的coef域赋0,expn域赋-1,以区分其他节点; Step3:将头结点的前去指针和后即指针置空,并返回头结点。 函数名:void PRINTLIST(linkpolyn head)函数功能:以类数学表达式的形式打印 返回值:无返回值 参数:linkpolyn head,含义:处理过的链表头结点 处理流程: Step1:讨论是否链表为空,若为空,则输出0; Step2:若链表不为空,则输出第一个值,第一个值不用输出符号; Step3:用循环依次输出其余各项,附加符号输出; 函数名:linkpolyn ADDPOLYN(linkpolyn A , linkpolyn B)函数功能:加法运算 返回值:return ptr,即和多项式的头结点 参数:linkpolyn A , linkpolyn B,含义:创建的链表A和B 处理流程: Step1:分别以两个指针pa和pb遍历链表A和B; Step2:当A和B两链表都为遍历完毕时,进行加法运算,分配新的空间存放和多项式,并用二分法进行升幂排序; Step3:当A遍历完毕而B未遍历完毕,将B其余各项拷贝到 和多项式链表中; Step4:当B遍历完毕而A未遍历完毕,将A其余各项拷贝到 和多项式链表中; 函数名:linkpolyn SUBTRACTPOLYN(linkpolyn A , linkpolyn B)函数功能:计算A-B的值 返回值:return ptr,即差多项式的头结点 参数:linkpolyn A , linkpolyn B,含义:创建的链表A和B 处理流程: Step1:分别以两个指针pa和pb遍历链表A和B; Step2:当A和B两链表都为遍历完毕时,进行减法运算,分配新的空间存放和多项式,并用二分法进行升幂排序; Step3:当A遍历完毕而B未遍历完毕,将B其余各项拷贝到 和多项式链表中; Step4:当B遍历完毕而A未遍历完毕,将A其余各项拷贝到 差多项式链表中; Step5:返回多项式头结点 函数名:float WORK(float x,int e)函数功能:求x的幂 返回值:return t,即计算幂结果 参数:float x,int e,含义:x为输入的x的值,e为x的指数 处理流程: Step1:分别讨论正指数与负指数的的情况; Step2:若e>0,则累乘e次x; Step3:若e<0,则累除e次x;; Step4:将所求结果返回; 3、主函数main()Step1:依次调用函数进行运算操作; Step2:调用函数创建链表; Step3:调用函数进行运算; 5.3 程序运行截图 5.4 源程序代码 #include ”stdio.h“ #include typedef struct polyn { float coef;//多项式系数 int expn;//多项式指数 struct polyn * prior,* next;} polyn, *linkpolyn; void DESTROYPOLYN(linkpolyn head){ //销毁链表 linkpolyn s,p;p=head; while(p->next!= NULL){ s = p; p = p->next; free(s);} } //DESTROYPOLYN linkpolyn INITPOLYN(){ //链表初始化 struct polyn * head;head=(linkpolyn)malloc(sizeof(polyn));head->coef=0.0;//假设头结点系数为0 head->expn=-1;//假设头结点指数为-1 head->next=NULL;head->prior=NULL;return head;} //INITPOLYN void INSERTPOLYN(linkpolyn p,linkpolyn s){ //将结点s插入到p之后 if(NULL!= p->next){ s->next = p->next; s->next->prior = s;} s->prior = p;p->next = s; } //INSERPOLYN linkpolyn CREATEPOLYN(){ //创建多项式链表,在输入的时候进行升序排列 linkpolyn head,s,p,m,r; int num = 1;//计数器 head = INITPOLYN();//初始化链表 head r = head;//设置为指针 s=(linkpolyn)malloc(sizeof(polyn)); /******************************************/ printf(”请输入第%d项系数和指数:“,num);/**输入第一个结点,并且第一个结点自然有序**/ scanf(”%f%d“,&s->coef,&s->expn);/******************************************/ r->next = s;s->prior = r;r = r->next;//r指向尾结点 r->next = NULL;p = r;//p为s的插入点前一个结点 m = r;//m为拍完结点中间的节点,二分法排序 while(++num)//while # 当将 s->coef 与 s->expn 都赋值为0的时候,认为输入结束 { s =(linkpolyn)malloc(sizeof(polyn));printf(”请输入第%d项系数和指数:“,num);scanf(”%f%d“,&s->coef,&s->expn); if((fabs(s->coef)<= FZ)&&(s->expn == 0))//if @ { free(s); break; } //else @ else //else @ { if(s->expn <= p->expn)//if # { while(p->prior!= NULL && p->expn > s->expn) p = p->prior;//p向前遍历链表,找到插入点 if(s->expn == p->expn) { p->coef += s->coef; free(s); r=r; } else { INSERTPOLYN(p,s);//在p后面插入结点s m = m->prior; p = m; } } // if # else //else # { while(p->next!= NULL && p->next->expn < s->expn) p = p->next;//p向后遍历链表,找到插入点 if(s->expn == p->expn) { p->coef += s->coef; free(s); } else { INSERTPOLYN(p,s); if(s->expn > r->expn) { r = r->next; r->next = NULL; } } } //else # } //else @ } //while # return head;} //CREATEPOLYN void PRINTPOLYN(linkpolyn head){ //以类数学表达式的形式打印 linkpolyn p; p = head->next;if(p == NULL)//链表为空 puts(”0“);else //else @ { //链表不为空,输出第一个结点的值 if(p->expn == 0)printf(”%f“,p->coef);//指数为0时不输出x else { if(p->coef==1)printf(”x^%d“,p->expn);/**************************/ else if(p->coef ==-1)printf(”-x^%d“,p->expn);/**第一项前不需要输出符号**/ else printf(”%gx^%d“,p->coef,p->expn);/**************************/ } p = p->next;while(p!= NULL) { //依次输出以后各节点 if(p->coef>0) { //当系数为正时,讨论输出符号问题 if(p->expn == 0)printf(”+%g“,p->coef);else if(p->coef == 1)printf(”+x^%d“,p->expn);else printf(”+%gx^%d“,p->coef,p->expn); } else { //当系数为负时,讨论输出符号问题 if(p->expn == 0)printf(”%g“,p->coef);else if(p->coef ==-1)printf(”-x^%d“,p->expn);else printf(”%gx^%d“,p->coef,p->expn); } p = p->next; } } //else @ } //PRINTPOLYN linkpolyn ADDPOLYN(linkpolyn A , linkpolyn B){ //加法 linkpolyn qa,qb,q,ptr;float x;qa = A->next;qb = B->next;q = INITPOLYN();//和多项式头结点初始化 ptr = q;//ptr指向和多项式头结点 while((qa!= NULL)&&(qb!= NULL)){ //升幂求和 if(qa->expn == qb->expn)//指数相同的项 { x = qa->coef + qb->coef;//系数相加 if(x!= 0)//求得系数非0 { q->next =(linkpolyn)malloc(sizeof(polyn));// q = q->next; q->coef = x; q->expn = qa->expn; } 生成和多项式的节结点 qa = qa->next; qb = qb->next; } else //指数不同 { q->next =(linkpolyn)malloc(sizeof(polyn)); q = q->next; if(qa->expn > qb->expn)//A多项式当前指数大于B { q->coef = qb->coef;//B多项式当前的值复制到和多项式中 q->expn = qb->expn; qb = qb->next; } else //B多项式当前指数大于A { q->coef = qa->coef;//A多项式当前的值复制到和多项式中 q->expn = qa->expn; qa = qa->next; } } } //A或B中有一个多项式已经处理完毕 while(qa!= NULL)//A未处理完毕,将其余各项复制到和多项式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef = qa->coef; q->expn = qa->expn; qa = qa->next;} while(qb!= NULL)//B未处理完毕,将其余各项复制到和多项式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef = qb->coef; q->expn = qb->expn; qb = qb->next;} q->next = NULL;//令和多项式最末的节点指向头结点 return ptr;//返回多项式头指针 } //LINKPOLYN linkpolyn SUBTRACTPOLYN(linkpolyn A , linkpolyn B){ //减法 linkpolyn qa,qb,q,ptr;float x;qa = A->next;qb = B->next;q = INITPOLYN();//和多项式头结点初始化 ptr = q;//ptr指向和多项式头结点 while((qa!= NULL)&&(qb!= NULL)){ //升幂求差 if(qa->expn == qb->expn)//指数相同的项 { x = qa->coef-qb->coef;//多项式A的系数减去B的系数 if(x!= 0)//求得系数非0 { q->next =(linkpolyn)malloc(sizeof(polyn));//生成和多项式的节结点 q = q->next; q->coef = x; q->expn = qa->expn; } qa = qa->next; qb = qb->next; } else //指数不同 { q->next =(linkpolyn)malloc(sizeof(polyn)); q=q->next; if(qa->expn > qb->expn)//A多项式当前指数大于B { q->coef =-(qb->coef);//B多项式当前的值复制到和多项式中 q->expn = qb->expn; qb = qb->next; } else //B多项式当前指数大于A { q->coef = qa->coef;//A多项式当前的值复制到和多项式中 q->expn = qa->expn; qa = qa->next; } } } //A或B中有一个多项式已经处理完毕 while(qa!= NULL)//A未处理完毕,将其余各项复制到和多项式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef = qa->coef; q->expn = qa->expn; qa = qa->next;} while(qb!= NULL)//B未处理完毕,将其余各项复制到和多项式中 { q->next =(linkpolyn)malloc(sizeof(polyn));q = q->next; q->coef =-(qb->coef); q->expn = qb->expn; qb = qb->next;} q->next = NULL;//令和多项式最末的节点指向头结点 return ptr;//返回多项式头指针 } //SUBTRACTPOLYN linkpolyn MULTIPLYPOLYN(linkpolyn A,linkpolyn B){ //乘法 linkpolyn pa,pb,s,head,m,r,p;pa = A->next;pb = B->next;head = INITPOLYN();r = head; s=(linkpolyn)malloc(sizeof(polyn));s->coef = pa->coef * pb->coef;//计算第一个结点,并且第一个结点自然有序 s->expn = pa->expn + pb->expn;r->next = s;s->prior = r;r =r->next;r->next = NULL;p=r;//p为插入点前一结点 m=r;//m指向排完结点中间节点 pb=pb->next;// 第一个乘积处理完毕 for(pa= A->next;pa!= NULL;pa=pa->next)//for pa 处理其余乘积 { //用A的第一个结点分别与B的其余结点相乘 if(pa == A->next) pb = B->next->next; else pb = B->next; for(;pb!= NULL;pb = pb->next)//for pb { s =(linkpolyn)malloc(sizeof(polyn));s->coef = pa->coef * pb->coef; s->expn = pa->expn + pb->expn;if(s->expn <= p->expn)//if # { while(p->prior!=NULL && p->expn > s->expn)p=p->prior;//p向前遍历链表,找到插入点 if(s->expn==p->expn) { p->coef+=s->coef; free(s); } else { INSERTPOLYN(p,s);//在p后面插入结点s m=m->prior; p=m; } } // if # else //else # { while(p->next!=NULL && p->next->expn < s->expn) p=p->next;//p向前遍历链表,找到插入点 if(s->expn==p->expn) { p->coef+=s->coef; free(s); } else { INSERTPOLYN(p,s); if(s->expn > r->expn) { r=r->next; r->next=NULL; } } } //else # } //for pb } //for pa return head;} //MULTIPLYPOLYN linkpolyn DERIVATIONPOLYN(linkpolyn L){ //多项式求导 linkpolyn head,p,s,r;head = INITPOLYN();//head为求导多项式头结点 r = head;p = L->next;while(p!= NULL){ if(p->expn == 0) { p = p->next;continue;} s =(linkpolyn)malloc(sizeof(polyn));s->coef = p->coef * p->expn;s->expn = p->expn-1;s->prior = r; r->next = s; r = r->next; r->next = NULL; p = p->next;} return(head);} //DERIVATIONPOLYN float WORK(float x,int e){ //求x的幂 float t = 1;if(e>0){ while(e) { t *= x;e--;} } if(e<0){ while(e) { t *= 1/x;e++;} } return(t);} //WORK float CALCULATEPOLYN(linkpolyn head,float x){ //计算多项式在x处的值 float t = 0;linkpolyn p;p = head->next;while(p){ t = t +((p->coef)*(WORK(x,p->expn)));p = p->next;} return(t);} //CALCULATEPOLYN int main(void){ linkpolyn A, B,addp,decp,mulp,derp1,derp2;int i;float x;start: system(”cls“);printf(”一元稀疏多项式计算nn“);printf(”1.建立多项式n“);printf(”2.多项式加法n“);printf(”3.多项式减法n“);printf(”4.多项式乘法n“);printf(”5.计算多项式在x处的值n“);printf(”6.对多项式求导n“);printf(”7.清空数据n“);printf(”8.关闭计算器n“);printf(”请输入选项(1~7):“);scanf(”%d“,&i);switch(i){ case(1): system(”cls“);printf(”建立多项式nn“);printf(”建立多项式A,当输入0 0 时表示出入完毕n“);A = CREATEPOLYN();printf(”建立多项式成功n“);printf(”建立多项式B,当输入0 0 时表示出入完毕n“);B = CREATEPOLYN();printf(”建立多项式成功n“);printf(”多项式A:“);PRINTPOLYN(A);printf(”n“);printf(”多项式B:“);PRINTPOLYN(B); printf(”nn输入回车返回上一级“);getchar();getchar();goto start;case(2): system(”cls“);printf(”多项式加法nn“);printf(”多项式A:“);PRINTPOLYN(A);printf(”n“);printf(”多项式B:“);PRINTPOLYN(B);printf(”n“);addp = ADDPOLYN(A,B);printf(”多项式A+B:“);PRINTPOLYN(addp);printf(”n“);printf(”nn输入回车返回上一级“);getchar();getchar();goto start;case(3): system(”cls“);printf(”多项式减法nn“);printf(”多项式B:“);PRINTPOLYN(A);printf(”n“);printf(”多项式B:“);PRINTPOLYN(B);printf(”n“);decp = SUBTRACTPOLYN(A,B);printf(”多项式A-B:“);PRINTPOLYN(decp);printf(”n“);printf(”nn输入回车返回上一级“);getchar();getchar();goto start;case(4): system(”cls“);printf(”多项式乘法nn“);printf(”多项式A:“);PRINTPOLYN(A);printf(”n“);printf(”多项式B:“);PRINTPOLYN(B);printf(”n“);mulp = MULTIPLYPOLYN(A,B);printf(”多项式AB:“);PRINTPOLYN(mulp);printf(”n“);printf(”nn输入回车返回上一级“); getchar();getchar();goto start;case(5): system(”cls“);printf(”计算多项式在x处的值n“);printf(”请输入x的值:“);scanf(”%f“,&x);printf(”n多项式A:“);PRINTPOLYN(A);printf(”n值为:%f“,CALCULATEPOLYN(A,x));printf(”n“);printf(”多项式B:“);PRINTPOLYN(B);printf(”n值为:%f“,CALCULATEPOLYN(B,x));printf(”nn输入回车返回上一级“);getchar();getchar();goto start;case(6): system(”cls“);printf(”多项式求导n“);printf(”多项式A:“);PRINTPOLYN(A);printf(”n“);printf(”多项式B:“);PRINTPOLYN(B);printf(”n“);derp1 = DERIVATIONPOLYN(A);printf(”求导后A':“);PRINTPOLYN(derp1);printf(”n“);derp2 = DERIVATIONPOLYN(B);puts(”求导后B':“);PRINTPOLYN(derp2);printf(”nn输入回车返回上一级“);getchar();getchar();goto start;case(7): system(”cls“);DESTROYPOLYN(A);DESTROYPOLYN(B);DESTROYPOLYN(addp);DESTROYPOLYN(decp);DESTROYPOLYN(mulp);DESTROYPOLYN(derp1);DESTROYPOLYN(derp2);printf(”已清空所有数据n“);printf(”nn输入回车返回上一级“);getchar();getchar(); goto start;case(8): printf(”退出");} return(0);} 目录 1前言..............................................................1 2正文..............................................................1 2.1设计目的........................................................1 2.2设计意义........................................................1 2.3设计方案与内容..................................................2 2.3.1设计内容......................................................2 2.3.2程序调试......................................................4 3致谢..............................................................7 4参考文献..........................................................7 5附录..............................................................8 塔里木大学信息工程学院课程设计 前言 17世纪初,西方国家的计算工具有了较大的发展,英国数学家纳皮尔发明的“纳皮尔算筹”,英国牧师奥却德发明了圆柱型对数计算尺,这种计算尺不仅能做加减乘除、乘方、开方运算,甚至可以计算三角函数,指数函数和对数函数,这些计算工具不仅带动了计算器的发展,也为现代计算器发展奠定了良好的基础,成为现代社会应用广泛的计算工具. 1642年,年仅19岁的法国伟大科学家帕斯卡引用算盘的原理,发明了 塔里木大学信息工程学院课程设计 其自身的优势,仍然是一种重要的语言,而且它还是通往c++的必由之路。它是融合了控制特性的的现代语言,其设计使得用户可以自然的采用自顶向下的规划、结构化的编程,以及模块化的设计。这种做法使得编写出的程序更可靠、更易懂。它是一种高级语言,在设计上它充分利用了当前计算机在能力上的优点。C程序往往很紧凑且运行速度快,其还表现出通常只有汇编语言才具有的精细控制能力,可以用于电脑cpu的编程控制语言,如果愿意,可以细调程序以获得最大速度或最大内存使用率。其可移植性的特点,可以使其在不经过太大的修改,便可在其它系统上运行,同时,它也是很多大型系统的编程语言,(比如说UNIX的操作系统就是建立在c之上的)。 2.3设计方案与内容 我此次设计的是一个计算器,主要是利用我们所学的知识,做到进一步掌握c语言的奥秘,使这种功能强大的高级语言走近我们的生活。本计算系统主要是作加减乘除运算。 该计算系统程序包括:main()函数、加函数、减函数、乘函数、除函数和显示函数。2.3.1设计内容 1、加运算: int jia(int a,int b){int c;c=a+b;printf(“c=%d n”,c);} 2、减运算: int jian(int a,int b){int c;c=a-b;printf(“ c=%d n”,c);} 3、乘运算: int cheng(int a,int b){int c;c=a*b;printf(“ c=%d n”,c);} 4、除运算: int chu(int a,int b){int c;c=a/b;printf(“ c=%d n”,c);} 5、显示函数程序: 塔里木大学信息工程学院课程设计 void xian(){ printf(“n”);printf(“n”);printf(“please choose lower level operation sign n”);/*选择提示*/ printf(“***************************n”);/*分隔号*/ printf(“0:apply overn”);/*输入0选项则提示结束,输出0*/ printf(“1:apply is additionn”);/*选择加号*/ printf(“2:apply is subtractionn”);/*选择减号*/ printf(“3: apply is multiplicationn”);/*选择乘号*/ printf(“4:apply is divisionn”);/*选择除号*/ } 显示界面程序图如图2-1所示 图2-1显示界面 程序分析: 1)printf(“please choose lower level operation sign n”);/*选择提示*/这句可以根据需要写成时间,一句鼓励自己的话,或者别的什么,都将不影响改程序的正常运行,只要在规定的“n”里,用户可以根据自己的需要把它用一句英文表达出来。 2)printf(“***************************n”);/*分隔号*/此句无关紧要,可以去掉也可以保留,看个人心情,不过个人建议,还是保留的比较好,它能保持计算器界面的美观特点,还能作为分隔运算程序的作用,让使用者能最快的对运算区进行划区。3)printf(“0:apply overn”);/*输入0选项则提示结束,输出0*/此句在运算界面里出现,当用户使用时,不小心输入了一个字符,非1~4以内,则会提示错误,按‘enter’结束该片段,然后根据提示,选择自己所希望使用的运算符号进行运算。 4)printf(“1:apply is additionn”);/*选择加号*/此句是加法运算提示,当输入‘1’后按‘enter’会得到可以使用加法的提示,然后就可以使用加法运算了,使用空格将数字与要加的数字分开,按‘enter’将得到你要的答案。5)printf(“2:apply is subtractionn”);/*选择减号*/这是加法运算提示。它的使用方法和 塔里木大学信息工程学院课程设计 相同。 2.3.2程序调试 1、加法运算 加法运算运行结果如图2-2所示。 图2-2加法运算运行结果 2、减法运算 减法运算结果如图2-3所示。 图2-3减法运算 3、乘法运算 乘法运算如图2-4所示。 塔里木大学信息工程学院课程设计 图2-4乘法运算 4、除法运算 除法运算如图2-5所示 图2-5除法运算 6、主函数程序: int main(){ int a, b; 塔里木大学信息工程学院课程设计 for(;;){ xian();switch(getchar()){ case '0':printf(“ tui chu: ”);getchar();return 0;case '1': printf(“ apply is '+': n ”);scanf(“%d”,&a);getchar();scanf(“%d”,&b);getchar();jia(a,b);break;case '2':printf(“ apply is '-':n ”);scanf(“%d”,&a);getchar();scanf(“%d”,&b);getchar();jian(a,b);break;case '3':printf(“apply is '*':n ”);scanf(“%d”,&a);getchar();scanf(“%d”,&b);getchar();cheng(a,b);break;case '4':printf(“ apply is '/':n ”);scanf(“%d”,&a);getchar();scanf(“%d”,&b);getchar();chu(a,b);break;default:printf(“wrong!please push down'enter' go on with ”);/*提示错误*/ getchar();break; 塔里木大学信息工程学院课程设计 } } return 0;/*一轮运算结束后返回符号选择功能选项*/ } 该主函数程序中使用了xian()函数、switch(getchar())语句、getchar()、for、break、return。xian()函数的功能是在程序运行中,具有显示界面的功能。switch(getchar())语句具有多分支选择功能。getchar()是库函数。for循环语句。是break语句是实现跳出循环的功能的语句。Return语句是返回语句,是程序最后一个语句,在int main(void)中int表示main()函数的返回值应该是一个整数。该程序具备的选择功能: (1)选择提示:该计算器编辑界面有5个提示,它们分别是‘0’、‘1’,‘2’、‘3’、‘4’,当使用者在该界面上输入它们其中一个数字,会得到相对应的提示,其中1~4分别表示加、减、乘、除运算。‘0’表示结束工作框结束。 (2)使用方法:进入选择界面后,要选择加法运算,请输入‘1’,然后按下‘enter’键。会得到提示 致谢 在本次课程设计中,首先我要感谢张老师。是他至始至终的教导让我能够在编程方面迅速的入门。在我们对程序语言的学习过程中,是他不断的给我们讲解语句内容并且纠正我们存在的错误。不断的给我们提供帮助并且给我们分析遇到的问题。老师认真负责的工作态度,严谨治学的精神和深厚的理论水平都使我受益匪浅。他们无论在理论上还是实践中都给了我很大的帮助,使我整体水平得到了提高,对于我以后的学习和工作都有一定的帮助,感谢张兵老师的耐心辅导! 参考文献 [1]孙雄勇.Visual C++ 6.0 实用教程.北京:中国铁道出版社,2004.[2]新电脑课堂编委会.Visual C++ 编程篇.北京:电子工业出版社,2004.[3]陈清华.Visual C++课程设计案例精选与编程指导.北京:北京大学出版社,2005.[4]李东玉.Visual C++.NET实用编程100例.北京:中国铁道出版社,2003.[6]张志清.管理信息系统.南京:东南大学出版社,2003. 塔里木大学信息工程学院课程设计 附录 #include int chu(int a,int b){int c;c=a/b;printf(“ c=%d n”,c);} void xian(){ printf(“n”);printf(“n”);printf(“please choose lower level operation sign n”);/*选择提示*/ printf(“***************************n”);/*分隔号*/ printf(“0:apply overn”);/*输入0选项则提示结束,输出0*/ printf(“1:apply is additionn”);/*选择加号*/ printf(“2:apply is subtractionn”);/*选择减号*/ printf(“3: apply is multiplicationn”);/*选择乘号*/ printf(“4:apply is divisionn”);/*选择除号*/ } int main(){ 塔里木大学信息工程学院课程设计 int a, b; for(;;){ xian(); switch(getchar()) { case '0':printf(“ tui chu: ”); getchar(); return 0; case '1': printf(“ apply is '+': n ”); scanf(“%d”,&a); getchar(); scanf(“%d”,&b); getchar(); jia(a,b); break; case '2':printf(“ apply is '-':n ”); scanf(“%d”,&a); getchar(); scanf(“%d”,&b); getchar(); jian(a,b); break; case '3':printf(“apply is '*':n ”); scanf(“%d”,&a); getchar(); scanf(“%d”,&b); getchar(); cheng(a,b); break; case '4':printf(“ apply is '/':n ”); scanf(“%d”,&a); getchar(); scanf(“%d”,&b); getchar(); chu(a,b); break; 塔里木大学信息工程学院课程设计 default:printf(“wrong!please push down'enter' go on with ”);/*提示错误*/ getchar(); break; } } return 0;/*一轮运算结束后返回符号选择功能选项*/ } C语言课程设计报告 班 级: 10电子本1 学 号: 10303033122 姓 名: 指导老师: 方文森 完成日期: 温州大学城市学院课程设计 目 录 1、课程设计目的和要求.....................................................................................................2 2、课程设计任务内容.........................................................................................................2 3、详细设计说明.................................................................................................................3 3.1分析.........................................................................................................................3 3.2软件设计.................................................................................................................3 3.3软件调试(对编程中的错误进行记录,并给出你的解决办法).....................3 4、软件使用说明.................................................................................................................4 5、课程设计心得与体会.....................................................................................................4 附录1:参考文献................................................................................................................5 附录2:部分程序清单(带有较详细的注释)................................................................5 温州大学城市学院课程设计 C语言课程设计报告 1、课程设计目的和要求 目的:(1)巩固和加深学生对C语言课程的基本知识的理解和掌握(2)掌握C语言编程和程序调试的基本技能(3)利用C语言进行基本的软件设计(4)掌握书写程序设计说明文档的能力(5)提高运用C语言解决实际问题的能力 要求:(1)分析课程设计题目的要求(2)写出详细设计说明 (3)编写程序代码,调试程序使其能正确运行(4)设计完成的软件要便于操作和使用(5)设计完成后提交课程设计报告 2、课程设计任务内容 1)一个班级有4个学生,共学习5门课程(大学英语、高等数学、C语言程序设计、VB程序设计、大学语文)。要求编写程序完成相应功能。2) 输入并保存]5门课程名称; 3) 输入并保存]4个学生的学号及其[个人相关信息]; 4) 输入并保存]每个学生对应的每门课程成绩; 5)求出每门功课的平均分; 6)找出有两门以上功课不及格的学生,输出他们的学号和全部课程成绩及该学生5门课程的平均成绩; 7)找出平均成绩在90分以上或者全部课程成绩在85分以上的学生,输出他们的学号和全部课程成绩及该学生5门课程的平均成绩; 8)计算每位学生的总分,并按总分进行排名,按由高到低输出他们的学号及总成绩; 9)对前面问题进行优化,即在一维数驵的基础上,考虑采用二维数组、函数及其参数传递的方式来解决相关问题; 10)对前面问题进行优化,在学号的基础上,增加学生的其它个人信息,包括:学号、姓名、年龄、性别,并采用结构体形式加以表示; 11)利用文件实现对输入及分析输出数据的存取操作。 12)参照教材P27页,3-11题引入选择功能,输入功能编号可以实现以上功能(考虑清屏函数,自查)。 温州大学城市学院课程设计 3、详细设计说明 3.1分析 3.2软件设计 开始菜单(功能选择)Key=?Key=1Key=2Key=3Key=4Key=5Key=0Key=99Key=6Key=7Key=8Key=9Key=10写入课程名读取课程名输入学生信息读取学生信息建立了学生信息及课程名称?退出程序读取课程、学生、成绩读取课程成绩输出功课的平均分两门以上功课不及格的学生输出高分的学生总分由高到低排序No保存保存Yes输入课程成绩(提示)必须输入课程名称、学生信息才能建立成绩保存清屏 3.3软件调试(对编程中的错误进行记录,并给出你的解决办法) 取地址。 温州大学城市学院课程设计 4、软件使用说明 1.2.3.4.5.6.7.8.9.10.11.12.[99]读取课程、学生、成绩 [1]输入课程名称.[2]读取课程名称.[3]输入学生信息.[4]读取学生信息.[5]输入课程成绩.[6]读取课程成绩.[7]功课的平均分.[8]两门以上功课不及格的学生 [9]-高分的学生-.[10]学生总分排序.[0]退出应用程序.5、课程设计心得与体会 在大家的共同努力下,忙碌了两个星期,我们顺利完成了对此程序的编译及试运行。在设计程序的过程中,我们了解到要设计一个完整的程序,其中最难的可能就属设计整个程序的框架,其中可能会需要经过很多次的修改与调试,所以必须要有耐心,直至最后设计出自己想要的程序。 另外平时学习c语言的基础也很关键,因为如果平时学得就不怎么样,那么你面对这么一个比较有难度的程序,可能会望而却步,看懂他人的程序都是个难点,更别说让自己去设计。为了解决此类问题,最好就是多向同学,老师请教,查找资料。 设计一个程序的过程就是解决一个实际问题的过程,从解决实际问题的角度,我们可以这样来看:首先要了解这个问题的基本要求,即输入、输出、完成从输入到输出的要求是什么;在次我们必须捋清思路,逐一的解决问题的各个方面,即从输入开始入手,着重考虑如何从输入导出输出,在这个过程中,可确定所需的变量、数组、函数,然后确定处理过程--算法。 感谢这次的课程设计,它使我更加深刻地体会到c语言程序编写过程的严谨与细致,还有就是无论做任何事都要有耐心。当然团队合作也是非常重要的一个环节,这会使你在学习过程中倍感轻松 总的来说,这次程序设计让我获益匪浅,对C语言也有了进一步的认识:C语言功能高、表达能力强、使用灵活方便、目标程序效率高等等。C语言是在国内外广泛使用的一种计算机语言,相信除了以上优点,还有许多我们还未发现,希望能在以后的学习中有更深入的认 温州大学城市学院课程设计 识。 附录1:参考文献 《C语言程序设计与实践教程》 附录2:部分程序清单(带有较详细的注释) #include #define N 4 #define M 5 #define Debug 1 typedef struct { char SNo[5];char SName[10];}Student; void ScoreRead(float Score[][M],char FileName[],char FileType[]){ int i,j;FILE *fp;fp=fopen(FileName,FileType);if(fp==NULL){ printf(“Errorn”);exit(0);} else { for(i=0;i 温州大学城市学院课程设计 void ScoreWrite(float Score[][M],char FileName[],char FileType[]){ int i,j;FILE *fp;fp=fopen(FileName,FileType);if(fp==NULL){ printf(“Errorn”);exit(0);} else { for(i=0;i void CoureseRead(char Cname[][20],char FileName[],char FileType[]){ FILE *fp;int i,j;char ch;fp=fopen(FileName,FileType);if(fp==NULL){ printf(“Errorn”);exit(0);} i=0;j=0;while(1){ ch = fgetc(fp);if(ch==EOF)break;if(ch=='n'){ Cname[i][j]=' ';i++;j=0;6 温州大学城市学院课程设计 } else { Cname[i][j]=ch;j++;} } #if(Debug==1)for(i=0;i void CoureseWrite(char Cname[][20],char FileName[],char FileType[]){ FILE *fp;int i,j;fp=fopen(FileName,FileType);if(fp==NULL){ printf(“Errorn”);exit(0);} for(i=0;i第三篇:C语言课程设计报告
第四篇:C语言课程设计报告
第五篇:C语言课程设计报告