C语言课程设计总结报告.docx
《C语言课程设计总结报告.docx》由会员分享,可在线阅读,更多相关《C语言课程设计总结报告.docx(25页珍藏版)》请在冰豆网上搜索。
C语言课程设计总结报告
丽水学院
C语言课程设计总结报告
题目计算器
指导教师卢敏
院系工学院
专业计算机科学与技术
班级计16
学号16103330127(24)
姓名徐明志
成绩
二〇一七年六月二十二日
丽水学院工学院C语言课程设计报告评分表
班级:
计16
学号16103330127(24)
姓名:
徐明志
机器编号:
5
作品设计
报告
1
设计报告格式规范,风格统一。
10
2
第一章系统功能说明。
15
3
第二章程序结构(程序结构、重要数据说明、函数清单)。
35
4
第三章使用说明(安装手册和使用手册完整)。
15
5
第四章系统设计难点及其解决方法。
15
6
第五章不足之处。
10
合计
表1进度安排表
短学期实践综合实验进度表
选题名称:
运动会分数统计系统
班级:
计16学号:
16103330127(24)姓名:
徐明志
任课教师:
卢敏
一、系统设计2017.6.26~2017.6.27
二、系统实现2017.6.27~2017.6.29
三、测试2017.6.9~2017.6.30
表2中期报告表
C语言课程设计中期报告(系统设计)
选题名称:
运动会分数统计系统
班级:
计16学号:
1610333127(24)姓名:
徐明志
任课教师:
卢敏起始时间及计划完成时间:
2017.6.26~2017.6.30
一、题目(问题)描述
该计算器主要实现的是四则运算,以及N次方的运算,阶乘运算和累加运算;其中对溢出需要进行控制,对错误的输入进行提示以及对运算结果进行清零或继续运算;另外需要一个列举功能的实现计算器功能的菜单,有需要时可设置二级或者三级菜单,使条理更加清楚。
二、问题分析
实现最基本计算器的功能需要进行进行加减乘除的运算,这时就有两种思路:
一是利用线性关系进行处理,将数字进行一次一次的运算,这样的运算效果低。
二是利用栈进行处理,可输入数字的表达式,通过栈的工作原理,结合人为规定的符号优先级关系进行直接给出答案,提高了运算的效率和功能,但是运行时的溢出或出错很难进行处理。
对一般的小数可进行四则运算之外还需可对大数进行运算,这个需要进行独自的算法设计。
除此之外就只有阶乘,累加和N次方了,其中N次方的溢出最难处理,需要对两个数进行判断。
处理溢出的办法,若是进行逐步运算,例如对a,b两个数进行运算,得到结果c,想要判断c是否是溢出,可以将c与b进行逆运算求值得到d,若是a等于d说明运算无误,没有溢出,反之则溢出。
三、系统设计
1.程序总体结构
2.界面设计
界面设计运用了简单的菜单布局,设计了二级菜单,可以进行随意来返两个菜单之间。
菜单第一行都是提示输入信息或进行该菜单的描述,后面若干行都是该菜单功能的描述。
一级主菜单
/*******************************计算器*******************************/
/***********************请按照提示进行输入数字***********************/
1.进行加减乘除运算
2.N次方运算
3.阶乘运算
4.累加运算
5.大数的加减乘除
6.退出
小数二级菜单
/***********************请按照提示进行输入数字***********************/
1.N次方运算
2.阶乘运算
3.累加运算
4.清零并返回
大数二级菜单
/***********************请按照提示进行输入数字***********************/
1.加法运算
2.减法运算
3.乘法运算
4.除法运算
5.返回菜单
目录
第一章系统功能说明1
第二章程序结构2
2.1程序结构说明2
2.2重要数据说明2
2.3函数清单3
第三章使用说明13
3.1安装手册13
3.2使用手册13
第四章系统设计难点及其解决方法15
4.1栈的四则运算15
4.2大数的加减乘除15
4.2.1大数的加法15
4.2.2大数的减法16
4.2.3大数的乘法16
4.2.3大数的除法16
第五章不足之处17
第一章系统功能说明
本程序可实现简单的计算机功能,对数字进行加减乘除的运算,N次方的运算,阶乘和累加,并能对错误的输入进行提示,对溢出进行判断以及继续运算和返回菜单的功能。
对小数的加减乘数是利用栈来实现的,因此与一般的须分步进行运算的计算器不同,该计算器可直接输入一串关于运算的表达式,并以#结束,可直接输出结果,无需人为的判断优先关系,进行分步运算,因此在运算操作上大大节省了用户的时间,减少了繁琐的步骤。
为了使得栈的运用更加灵活,对栈的四则运算也使用了继续运算的功能,并且可在任意位置插入该存储值进行需要的四则运算,这已经使得计算的功能更加完善。
唯一的不足是对栈的溢出和错误输出难以判定,所以在输入之前必须仔细检查输入的格式是否正确。
N次方的运算是是直接调用库函数实现的。
其中设置了一个判断的操作,若是第一次进行运算,需要输入两个数来实现a的b次方;若是原先已有运算结果存储在计算机内,可直接输入一个b,实现a的b次方的运算,通过该操作实现了继续运算的功能,同时对n次方的运算进行了溢出的判断,若是结果小于等于0,则说明一定溢出。
阶乘的运算运用的是累乘的原理,从1累乘到n实现阶乘的运算,在控制溢出方面巧妙的应用了上限来判断,由于阶乘的值会很大,对于32位的整形来说,累乘至12就是上限了,只需判断输入的值是否大于12即可。
与N次方一样,对阶乘的处理也可以进行继续运算,若是之前的计算结果已有存储值,可直接进行阶乘计算。
累加的求和应用了公式(1+n)*n/2进行计算,在控制溢出的方面和N次方相同,对结果值进行判定是否小于等于0,同样的也可以进行继续运算,若是原先已有计算结果的存储将会直接输出累加结果,若是没有存储,需要按照提示输入一个数来实现累加求和。
本计算机的结构模拟了一个循环,实则是调用调用函数的嵌套,进入该程序首先展示的是主菜单界面,前四个选项分别为小数的加减乘数运算,N次方运算,阶乘运算,累加运算,该四个运算只可运用与小数的处理。
第五个选项为大数的四则运算,可进入大数四则运算的二级菜单,在大数的二级菜单中可以选择大数加法,大数减法,大数乘法和大数除法最高可进行1000位的大数运算。
主菜单的第六个选项为退出,该选项有个小小的缺陷,由于该结构的构建运用的是函数的调用,若是反复运算来返于两个菜单之间容易造成循环嵌套,可能在最后退出界面的时候需要输入多次退出才能达到退出的效果,因此在最后的退出时设置了退出的提示,若是选择了该选项还未退出,就需要多次输入该选项。
在对小数的运算中需要继续运算,则可进入小数的二级运算菜单,小数的二级菜单里只有小数的四则运算,N次方运算,阶乘运算和累加运算。
同样的大数的四则运算也可继续运算,不同的是由于大数运算结构存储困难,并且继续运算意义不大,所以未设置大数的继续运算,但可回到主菜单。
第二章程序结构
2.1程序结构说明
该计算器程序大体结构如图2-1所示。
程序结构如图所示,通过主菜单可直接进入栈的四则运算,N次方运算,阶乘运算和累加运算;另外也可通过主菜单进入大数菜单的界面,进而选择大数加法运算,大数减法运算,大数乘法运算或大数除法运算。
2.2重要数据说明
//----------全局变量-----------------
intN=0;//作为全局变量使用,用于存储运算结果
//----------函数结果状态代码-----------------
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineOVERFLOW-2//用于分配地址空间错误时的返回
#defineMN1000//大数的存放位数上限
//----------定义函数类型,返回结果状态代码--------
typedefintStatus;
//-----------定义栈的元素类型------------
typedefintElemType;
//---------栈的顺序存储表示------------------
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
//-----------顺序栈的定义,并定义栈顶和栈底元素-----------
typedefstruct{
ElemType*base;
ElemType*top;
intstacksize;
}Stack;
2.3函数清单
//--------大数运算基本操作的函数原型说明-----------
1.intInversion(char*str);//该函数为倒置函数,可引入一个数组将数组中元素倒置存放。
倒置函数如图2-2所示。
2.intnumcomp(char*a,char*b);//该函数为字符串大小比较的函数,对个数组中元素进行逐一比较若相等返回0,不然返回第一次出现差异的两数之差。
该函数大体流程如图2-3所示。
3.intcarry(char*num);//进位函数,引入数组,利用算法使得原先以ASCII存储的非0~9的元素以0~9的字符存储。
该函数大体流程如图2-4所示。
4.intabdicate(char*num);//退位函数,引入数组,利用算法使得原先以ASCII存储的非0~9的元素以0~9的字符存储。
该函数大体流程如图2-5所示。
5.intnumclear(char*num);//清零函数,引入数组,从第一位开始寻找,直到找到第一个不为0的值为止,从该值开始向前推进,达到清零效果。
该函数大体流程如图2-6所示。
6.intnumadd(char*a,char*b,char*sum);//大数加法,引入两个数组需要进行加法的数组以及用来存放其和的空数组。
该函数大体流程如图2-7所示。
7.intnumsm(char*a,char*b,char*mul);//大数乘法的主要运算函数,引入两个需要进行相乘的数组和一个用于存放其乘积的数组,通过b中的第一位与a中的每一位进行相乘从而模拟乘法运算。
该函数大体流程如图2-8所示。
8.intnummul(char*a,char*b,char*mul);//大数乘法,引入两个需要进行相乘的数组和一个用于存放其乘积的数组,主要通过调用上述函数实现乘法运算。
该函数大体流程如图2-9所示。
9.intnumsub(char*a,char*b,char*sub);//大数减法,,引入两个需要进行相减的数组和一个用于存放其差值的数组,求大数除法操作与大数加法类似。
该函数大体流程如图2-10所示。
10.intnumdiv(char*a,char*b);//大数除法,引入两个需要进行相除的数组,进行逐步相减来模拟大数除法。
该函数大体流程如图2-11所示。
11.voidNum_div();//用于调用的大数除法
12.voidNum_mul();//用于调用的大数乘法
13.voidNum_sub();//用于调用的大数减法
13.voidNum_add();//用于调用的大数加法
以上四个均为大数算法调用的主要函数,其功能就是调用各自的算法进行运算,主要功能的函数以在上述说明。
14.voidAdd();//累加函数,该函数大体流程如图2-12所示。
15.voidFactorial();//阶乘函数,该函数大体流程如图2-13所示。
16.voidN_power();//N次方函数,该函数大体流程如图2-14所示。
//--------输出说明函数说明-----------
17.voidprint_menu();//主菜单
18.voidprint_judge();//是否继续运算的判定
19.voidprintf_state();//大数二级菜单的说明
//--------菜单函数函数说明-----------
20.intmain_f();//小数菜单
21.intmain_m();//大数菜单
22.intmain_menu();//主菜单
23.intmain();//主函数
菜单函数接程序结构说明中已经详细说明。
//--------栈的基本操作的函数原型说明-----------
24.StatusInitStack(Stack&S);//构造一个空栈。
该函数大体流程如图2-15所示。
25.StatusGetTop(StackS,ElemType&e);//取栈顶元素,若栈不空,则用e返回S的栈顶元素,并返回OK,否则,返回ERROR。
该函数大体流程如图2-16所示。
26.StatusPush(Stack&S,ElemTypee);//进栈,该函数大体流程如图2-17所示。
27.StatusPop(Stack&S,ElemType&e);//出栈,该函数大体流程如图2-18所示。
28.StatusShowStack(StackS);//栈的输出,引入一个栈进行对栈的输出。
该函数大体流程如图2-19所示。
29.voidArithmetic();//栈的核心算法,该函数大体流程如图2-20所示。
//-------------In函数-----------------
30.intIn(charch);//判定输入的符号字符是否为“#”若是#就返回1,否则返回0。
31.charPrecede(chara,charb);//判定运算符栈的栈顶运算符i与读入的运算符j之间优先关系的函数,认为定义了一个二维数字,将所有字符的两两之间的所有关系以1,0,-1,2存储起来。
32.intOperate(inta,charf,intb);//栈的四则运算函数,引入两个数和一个字符,通过switch将两个数进行所读入的符号的运算操作。
第三章使用说明
3.1安装手册
该计算机程序无需安装,已由exe运行程序的形式导出,只需双击打开并运行即可。
主界面有关于功能的提示,运行时也有相关的输入提示和错误的提示,对界面的跳转和返回也有相关选项说明,并且可以随时暂停二级运算,回到主界面进行其他功能的选择。
3.2使用手册
打开名为计算器.exe的程序进入主界面
/*******************************计算器*******************************/
/***********************请按照提示进行输入数字***********************/
1.进行加减乘除运算
2.N次方运算
3.阶乘运算
4.累加运算
5.大数的加减乘除
6.退出
主界面有6个选项,前四个为小数运算,第五个可进入大数运算的菜单,选项6为退出程序。
选择选项1,进行小数四则运算,若不是继续运算,则会提示“请输入四则运算表达式,并以'#'结束”;若为继续运算,则提示“请输入四则运算表达式,用于继续运算的值以'@'代替,并以'#'结束”。
按照提示输入一串四则运算的表达式并以‘#’结束,可直接输出答案。
选择选项2,进行N次方运算,若不是继续运算,则会提示“请输入两个数,第一个为底数,第二个为自变量”;若为继续运算,则提示“请输入自变量”,按照提示输入一个或两个数即可。
若所求值会造成数据溢出,则提示“所求N次方过大,溢出”。
选择选项3,进行阶乘运算,若不是继续运算,则会提示“请输入需要求阶乘的数”;若是继续运算,直接对该数进行程序运算。
按提示进行操作,若所求值会造成数据溢出,则会提示“所求阶乘数过大,溢出,请选择其他功能进行操作”。
选择选项4,进行累加运算,若不是继续运算,则会提示“请输入需要求累加的数”;若是继续运算,直接对该数进行程序运算。
按提示进行操作,若所求值会造成数据溢出,则会提示“所求累加数过大,溢出”。
选择选项5,进入大数操作的菜单。
选择选项6,退出该程序,若是无法退出。
则会提示“请再次输入6来结束程序”,按照提示操作即可退出程序。
对小数操作的过程中,运行一次之后会跳出提示“是否进行继续运算(y/n)”,按照提示进行输入。
、若选择‘y’,将会跳转到小数的二级菜单;若选择‘n’,退回到主菜单界面可选择其他操作。
/***********************请按照提示进行输入数字***********************/
1.进行加减乘除运算
2.N次方运算
3.阶乘运算
4.累加运算
5.清零并返回
该小数运算界面有六个选项,前四个选项均为继续运算的操作,功能与上述相同,这里不在介绍,选项6为返回功能,若不想继续运算,可选择选项6,对原有数据进行清零,并返回主菜单。
/***********************请按照提示进行输入数字***********************/
1.加法运算
2.减法运算
3.乘法运算
4.除法运算
5.返回菜单
该界面为大数运算界面,在上述中已提到,该界面有五个选项,前四个均为运算功能,实现大数的加减乘除,选项5可返回主菜单。
第四章系统设计难点及其解决方法
4.1栈的四则运算
为了使得关于小数的四则运算更加方便,因此选用了栈作为基本数据结构来完成计算器功能,即可通过直接输入一串表达式直接求出该运算的结果。
我运用了栈来处理小数,首先是构建两个栈,分别为OPTR和OPND用来存储加减乘除以及‘#’、(、)等符号和进行运算的各类数据,然后对输入的字符进行逐个判断分类,若读入的是‘0’~‘9’的数字,将其用数组存储起来,直至下一个读入的不再是数字,就利用atoi()将在数组中以字符形式存储的数字字符转化为整形,然后压入数字栈。
在字符栈中首先默认压入一个‘#’,之后每次若入栈的字符为运算符或‘#’,就需要与符号栈中的栈顶元素进行比较,通过优先级关系来判定下一步操作是进行四则运算还是继续对符号位进行入栈(优先关系是人为规定的,通过已知的四则运算法则,将各各字符两两之间的关系通过1,0,-1的形式存储在二维数组之中,便于调用),若是等待入栈的符号位比栈顶符号的优先级高则从数字栈中弹出两个数字进行与待入栈符号有关的四则运算;若是等待入栈的符号位与栈顶符号的优先级相等,则脱括号并进行接收下一字符;若是等待入栈的符号位比栈顶符号的优先级低,则将该待入栈的符号也入栈,成为新的栈顶元素。
如此反复直至读入的字符为‘#’,说明已经结束,就可以将数字栈中的最后结果输出即可。
4.2大数的加减乘除
4.2.1大数的加法
为了使得算法更加简洁易懂,简化运算步骤,方便运算,之前须先定义一个数组倒置的函数Inversion(),在加法运算中,讲存放两个大数的数组进行逆序存放,然后从第一位开始逐项相加减去‘0’存放在sum数组中,而不一开始就进行进位,把两数相加之和以ASCII码的形式存放起来,直到有一个数组已经全部进行累加,然后将另一个没有进行累加的数组中所有的元素通过strcat()加至sum数组之后,然后调用carry()对sum数组从第一位开始进行逐项进位,若是该位大于‘9’,说明已经将和以ASCII码存放起来,就对该位减‘0’的值与10相处后的值与该位的后一位进行累加,并对该位减‘0’的值对10求模再加上‘0’,以字符形式存储一起来,后面几位以此类推,最后若是最高位有进位,就将其字符化存储起来,并在后一位赋0,若是最高位无进位,对后一位直接赋0即可。
最后将sum数组倒置(每次倒置最末位始终会有0作为字符串的标记)输出即可。
4.2.2大数的减法
调用numcomp()对读入的两个字符串进行对比,若是相等说明作差为0,直接输出0即可,若是前者大,从两个字符串的末尾往前逐项作差再加上‘0’,与大数加法相同,将值以ASCII码的形式存储在sub数组中,然后以此类推,直至短的字符串比较完毕,然后将长的字符串中未比较的部分直接赋给sub数组,完成与大数相加类似的操作。
与大数相反的,大数相减在最后需要进行的是退位操作,调用abdicate()函数从末尾开始逐一判断,若是小于‘0’,对该位进行加10运算,然后对前一位减一,依次类推。
最后调用numclear()进行清零即可(在相减过程中可能会使得最高位甚至前面n位均为0,所以需要清零,找到从第几个位置开始不为0,将后面的数字逐一向前推进,实现该效果)。
4.2.3大数的乘法
大数乘法利用乘法法则,将短的字符串作为参考系,调用numsm()与长的字符串中的各个字符进行逐项相乘,这里同样以ASCII码进行存储,但是对于9的乘法需要注意的是可能会超出ASCII的数值上线,于是对9进行特殊处理,若读入的数是9,则降低为8并标记为1,在进行逐项相乘,最后再做一次加法即可,然后像大数加法一样进行进位。
由于按照乘法法则每位乘法后都会向前进位,因此为了运算方便,每多做一次乘法可以在该字符串的后面多补一个0(在调用numsm()时对引用的短字符串进行长度计算,通过长度来判断要在最后补几个0),最后进行累加即可,依次类推直至该短字符串全部进行乘法运算即可,最后对结果进行进位输出即可。
4.2.3大数的除法
与大数乘法相同,大数除法是通过减法进行模拟,先比较两个数组的长度,长度之差即是需要进行比较的的次数,而每次比较时作差的次数即是商的某一位的位数,每次从最高位进行比较,一一对字符进行作差,直至短的数组均被减完为止,最后调用退位函数进行退位即可(此时需要注意的是被除数在作差的过程中可能会出现最高位,在下一次进行比较时要被除数的第一位要以第一非零元素算起,保证每次比较都能从两个数字的非零元素开始作差),每次比较对除数数组的每一位进行后移移位,第一位补0,使得其与被除数的非零第一位元素对齐,因此每次比较都会使得除数的长度加1,最后结束循环的条件即是两个数组的长度相等,并且被除数要小于除数。
最后就是对商的输出了,只须找到记录商的数组中第一个非0元素,对后面的所有值进行输出即可。
第五章不足之处
该计算器程序基本上实现了简单的计算机功能,在溢出判别,输入错误提示等方面有很好的完善,应用简单的算法实现了大数的加减乘除,用栈实现了小数的四则运算,以及简单的N次方运算,阶乘和累加。
但是在栈的错误输入方面有很大的缺陷,由于栈的组成原理,很难做到在每一次入栈时都能准确进行判别是否出错,一旦出错,栈内还有元素,栈外元素又无法压入,容易造成程序卡壳,无法进行继续操作,或者造成死循环无法结束。
另外在阶乘的算法设计多有不当,阶乘的算法过于简单,由于没有设计大数的阶乘算法,最高的运算次数只有12次,无法实现较大位的阶乘运算。
在结构布置上,菜单的规划不太合理,由于算法不同,分为小数算法和大数算法,因此功能也不是