华中科技大学c语言实验报告

上传人:文*** 文档编号:170979841 上传时间:2022-11-23 格式:DOCX 页数:203 大小:1.22MB
返回 下载 相关 举报
华中科技大学c语言实验报告_第1页
第1页 / 共203页
华中科技大学c语言实验报告_第2页
第2页 / 共203页
华中科技大学c语言实验报告_第3页
第3页 / 共203页
点击查看更多>>
资源描述
译中科技大孚课程实验报告课程名称:C语言程序设计专业班级:计算机科学与技术1234班学号:U123412345姓名:O O O指导教师:O。O报告日期:OOOO年。月O日计算机科学与技术学院目录实验1表达式和标准输入与输出实验11.1 实验目的11.2 实验内容及要求11.3 自设题121.4 实验小结14实验2流程控制实验152.1 实验目的152.2 实验内容及要求152.3 自设题292.4 实验小结34实验3函数与程序结构实验353.1 实验目的353.2 实验内容及要求353.3 自设题493.4 实验小结53实验4编译预处理实验544.1 实验目的544.2 实验内容及要求544.3 自设题674.4 实验小结69实验5数组实验705.1 实验目的705.2 实验内容及要求705.3 自设题965.4 实验小结97实验6指针实验986.1 实验目的986.2 实验内容及要求986.3 自设题1236.4 实验小结127实验7结构与联合实验1287.1 实验目的1287.2 实验内容及要求1287.3 自设题1717.4 实验小结177实验8文件实验1788.1 实验目的1788.2 实验内容及要求1788.3 自设题1888.4 实验小结190参考文献191实验1表达式和标准输入与输出实验1.1实验目的(1)熟练掌握各种运算符的运算功能,操作数的类型,运算结果的类型及运算过程中的类型转换,重点是C语言特有的运算符,例如位运算符,问号运算符,逗号运算符等;熟记运算符的优先级和结合性。(2)掌握 getchar, putchar, scanf 和 printf 函数的用法。(3)掌握简单C程序(顺序结构程序)的编写方法。(4)掌握书写实验报告的格式与基本要求。1.2实验内容及要求1.2.1 源程序改错下面给出了一个简单C语言程序例程,用来完成以下工作:(1)输入华氏温度f,将它转换成摄氏温度C后输出;(2)输入圆的半径值r,计算并输出圆的面积s;(3)输入短整数k、p,将k的高字节作为结果的低字节,p的高字节作为结果的高字节,拼成一个新的整数,然后输出;在这个例子程序中存在若干语法和逻辑错误。要求在计算机上对这个例子程序进行调试修改,使之能够正确完成指定任务。1 #include2 #define PI 3.14159;3 intmain( void)45 int f;6 short p, k ;7 double c , r, s ;8 /* for task 1*/9 printf(Input Fahrenheit:);10 scanfT%d,f);11 c =5/9*(f-32);12 print“n %d (F)=%.2f (C)nn ”, f, c );13/* for task2*/14 printfpinput the radius r:n);15 scanf(n%ff,&r);16 s = PI * r * r;17 printf(MnThe acreage is %.2fnnM,&s);18 /* for task 3*/19 printfpinput hex int k, p :);20 scanf(n%x %x”,&k,&p );21 newint =(p&0xff00)|(k&0xfTO0)8;22 printf(Mnew int =%xnn,newint);23 return 0;24解答:(1)错误修改:1)第2行的符号常量定义后不能有分号,正确形式为:#define PI 3.141592)第3行的intmain( void )返回值类型和函数名应分开,正确形式为:int main( void )3)第10行的scanf(d”, f);在输入内容时指向地址应使用&,正确形式为:scanf(d”,&f)4)第11行的c =5/9*(f-32);由于f是int型,在运算时右侧表达式会被截去小数部分,正确形式为:c =5.0/9*(&32);5)第12行的 printf(41n %d (F)=%.2f(C)nn ”, f, c );由于 c 被定义为双精度浮点数应使用占位符If,正确形式为:prints n %d (F)=%.21f(C)nn ”, f, c );6)第15行的scanf(%f,&r);由于r被定义为双精度浮点数应使用占位符If,正确形式为: scanfi%lf,&r);7)第17行的 printsnThe acreage is %.2fnn,&s);由于 s 被定义为双精度浮点数应使用占位符If,正确形式为:printflnThe acreage is %.21fnn,&s);8)第17行的 printf(nThe acreage is %.2fnn,&s);在 printf 中不涉及对 s 的修改,应不用&,正确形式为:printsnThe acreage is %.21fnn,s);9)第20行的scanf(%x %x,&k,&p );由于k,p被定义为短整数,占位符应使用hx,正确形式为:scanff%hx %hx,&k,&p );10)第21行的 newint =(p&0xfR)0)|(k&0xflro0)8中使用了一个未声明的变量newint,应在使用前声明,正确形式为:(6) short p, k,newint;(注意,改动针对第六行)11)第21行的 newint =(p&0xfTO0)|(k&0xffD0)8忽略了运算顺序,应恰当使用括号改变运算顺序,正确形式为:newint =(p&0xflTO0)|(k&0xflTO0)8);12)第21行的newint =(p&0xfTO0)|(k&0xflTO0)8位运算逻辑有误,应恰当改变运算方式,正确形式为:newint =(p&0x1TO0)|(k&0x1TO0)8);13)第22行的 printffnew int =%xnn,newint);由于 newint 被定义为短整数,占位符应使用hx,正确形式为:printf(new int =%hxnn,newint);(2)错误修改后运行结果:见图1-1(查阅资料知1华氏度确为-17.22摄氏度;半径为2的圆面积在保留2位小数且n取3.14159时面积确为12.57;将a2cd的高字节作为结果的低字节,a3a3的高字节作为结果的高字节,拼成一个新的整数,这样的确得到a3a2,其中采用16进制是为了表达与验证方便)I nput Pahrenhe it :11-17.22input the radius i*:2The acreaye is 12.57input hex int k. p :a2cd a3a3 new int - a3a2图1-1源程序改错的运行结果1.2.2源程序修改替换下面的程序利用常用的中间变量法实现两数交换,请改用不用第三个变量的交换法实现。#includeint main()int a, b, t;print/Input two integers:);scanfT%d %d,&a,&b);t=a, a=b, b=t;prinfCna=%d,b=%d”,a,b);return 0;解答:由于只能使用两个变量,我们需要利用一个变量来保存两个数的一些共同特征,而这些特征要能通过一定的运算返回初始的数,而若把两数之和存放于第一个数中,通过依次均减去第二个数,可在恢复原来的数的同时将它们交换顺序。替换后的程序如下所示:#includeint main()(int a, b;printffTnput two integers :);scanfs(n%d %dn,&a,&b);a = a 4- b;b = a - b;a = a - b;printf(na =%d, b =%d, a, b);return 0;运行结果见图1-2(1,2交换位置后确为2,1)Input tMo integers :12a -2,!-1图1-2源程序修改替换题的运行结果1.2.3程序设计(1)编写一个程序,输入字符C,如果C是大写字母,则将C转换成对应的小写,否则C的值不变,最后输出C。解答:首先,无论输入什么字符,这个字符均具有相应的ASCII码,所以我们无需检测输入是否合理,而在接受这个输入之后,我们需要根据它的ASCII 码来判断它是否为大写字母,如果它是大写字母,那么就把它变为小写字母(减去A与a的ASCH码值之差即可实现这个要求),而若该字符不满足该要求,直接原样输出即可,算法见流程图1-1,其余细节见程序注释,程序如下。流程图1-1程序设计题1的算法#include int main()int c;printf(输入字符,如果它是大写字母,则将它转换成对应的小写,否则原样输出:);c=getchar ();通过getchar()来获得字符对应的ASCII码if(c=A)判断是否为大写字母c=c-(A-a);大写字母变小写printf (处理结果是:%c,c);return 0;)测试:由于本题不涉及无效输入,所以我们只需分析程序的几种运行情况,其中可分为对大写字母进行转化为相对应的小写字符;而对于小写字母而言,程序不应该将其进行任何转化;此外,对于非字母输入我们也不应该转化,具体测试数据见表1-1,测试结果见图1-31-5。表1-1编程题1的测试数据测试用例程序输入理论结果运行结果用例1Eee用例2eee用例3111对应测试测试用例1的运行结果如图1-3所示输入字符,如果它是大写字母,则将它转换成对应的小写,否则原样输出:E 见或结果是:e图1-3编程题1的测试用例一的运行结果对应测试测试用例2的运行结果如图14所示。盘翥矗如既是大写字母则将垂挨成对应的小弓否则原样输出一图1-4编程题1的测试用例二的运行结果对应测试测试用例3的运行结果如图1-5所示。输入字符,如果它是大写字母,则将它转换成对应的小写,否则原样输出:1七里结果是:1图1-5编程题1的测试用例三的运行结果说明上述的运行结果与理论分析吻合,验证了程序的正确性。(2)编写一个程序,输入无符号短整数x, m, n (0m15,1 n16-m),取出x从第m位开始向左的n位(m从右至左编号为015),并使其向左端(第15位)靠齐。解答:由于题目中明确要求输入无符号短整数,且目前我们缺少检查输入是否为整数的手段,所以本题并不检查输入的x是否合理;不过以我们目前的知识,我们可以根据题目要求对输入的m,n是否合理进行检查(仅检查它们是否在合理范围内,默认其为整数)。而在确认输入合理之后,我们着手开始对问题进行处理,由于这是一个涉及到计算机内部数据的二进制运算的问题,相应地,我们在解决这个问题时也要利用C语言提供的位运算来完成相应的操作,首先,由于我们只需要x从第m位开始向左的n位,所以我们需要去掉x的其余部分(第 m位之前的内容),同时从第m位开始向左的n位之后的内容也不再被需要,所以我们也将其去除。至于这去除的实现,为防止数据的丢失,我们不应直接对x 进行操作,而应对我们之后会用到的逻辑尺进行操作,而有关逻辑尺的操作,我们可先使用十六进制数对其赋值,使其全为KOxffff,这样较将0取反更方便),再进行相应的左移与右移(注意在移动时要分开进行,否则会由于编译器对运算的简化使部分该被清0的位保留为1),而后,我们再用我们取得的逻辑尺与x 进行按位与运算,即可取出x中相应的二进制位,之后,再根据题目的要求,把 x移动到指定的位置,最后,由于题目中使用的数字均为十进制数,所以我们的输入与输出均采用十进制数进行。其余细节见程序注释,算法见流程图1-2,程序如下。#include int main()unsigned short int x, m, n, i;printf(输入 x (10进制)、m (0-15)和 n (116-m):”);scanf( n%hu%hu%huH,&x,&m,&n);if(m=0&m=1&n=l 6-m)判断输入是否合理i = Oxffff;准备位运算所需逻辑尺i= m;/确定变换起始位置i =16- n;确定变换作用长度i =16- m - n;进入变换位置/*注意在移动时要分开进行,否则会由于编译器对运算的简化使部分该被清。的位保留为1*/x &= i;x =16- m - n;左移printf(经过变换得到:%hu, x);else printf(输入错误,请检查您的输入)提示输入不合理return 0;流程图1-2程序设计题2的算法测试:由于本题中涉及了对错误输入的排除,所以我们需要对程序能否正确排除这些错误的输入进行测试,同时,我们也需要对程序的基本功能进行检查,不过由于本题涉及到位运算,这使得对结果的验证较为困难,我们需要合理的设计测试数据并将其转化二进制数以供验证,再将所得的二进制数转为十进制数并程序输出的十进制数进行比对,以验证程序的正确性(即使采用十六进制输入输出也不够结果也不是十分显然,故不采用),测试数据见表1-2,测试结果见图161-8。表1-2编程题2的测试数据或试厚孑物入3论逑累运行逑MSWXmNumi0000000000011001(25)3,H-MigMllOOOeOOOOOO 0000 K49152的1521101010110000011(54659)161勒入槽次:m(aeTs3?检资脸入用的31101010110000011 C 54659)135输入Cn(ft3)位交帔入对应测试测试用例1的运行结果如图1-6所示输入x (10进制)、m 15)和n (16-e):2532遂过变换得至49152图1-6编程题2的测试用例一的运行结果对应测试测试用例2的运行结果如图1-7所示。输入X(10进制)、m(015)和n (116-m):54659161输入错误,请密查您的输入图1-7编程题2的测试用例二的运行结果对应测试测试用例3的运行结果如图1-8所示。输入x (1。进制)、m(015)和n (116-m):54659135强入错误,请愈查您的输入图1-8编程题2的测试用例三的运行结果说明上述的运行结果与理论分析吻合,验证了程序的正确性。(3)IP地址通常是4个用句点分隔的小整数(即点分十进制),如32.55.1.102o 这些地址在机器中用无符号长整形表示。编写一个程序,以机器存储的形式读入一个互联网1P地址,对其译码,然后用常见的句点分隔的4部分的形式输出。例如,整形676879571二进制表示就是:00101000010110000101110011010011,按照8位一组可表示为:408892211,由于CPU处理数据的差异,它的顺序是颠倒的,所有最终格式为211.92.88.40。解答:首先,这依然是一个涉及到位运算的题目,所以我们依然会用到按位操作与逻辑尺,而逻辑尺的制备与使用均与我们在程序设计题2中所使用的方法大体相同,例如我们使用十六进制数制取逻辑尺,同时尽管从原理上说,我们只需要一个逻辑尺(在每次使用后对其进行移动即可),但这样写成的程序不够明 To而在取得了逻辑尺之后,我们再进行按位与运算,以达到取出各二进制位的效果。不过,本题与程序设计题2的不同之处在于,我们需把取出的数进行移动的位数是固定的,但需要注意的时,正如题目中所提到的由于CPU处理数据的差异,我们需要将我们取出的数据进行重新排序,而且,由于我们输出的是IP 地址,所以我们需要在输出中添加相应的句点。此外,尽管本题中可能出现非数字输入,但由于我们目前没有有效的手段进行检测,所以我们默认所有的输入都是合理的。其余细节见程序注释,算法见流程图1-3,程序如下。输入无符e长整形数中流程图1-3程序设计题3的算法#include int main()iounsigned long int ip,m 1,m2,m3,m4,p 1,p2,p3,p4;printf(输入长整数形式的ip地址:);scanf(%lu,&ip);ml = OxflTOOOOOO;各分段逻辑尺m2= OxOOffDOOO;/各分段逻辑尺m3= OxOOOOfTOO;/各分段逻辑尺m4= OxOOOOOOff;各分段逻辑尺pl =(ip&ml)24;/取出各部分二进制数p2=(ip&m2)16;取出各部分二进制数p3=(ip&m3)8;/取出各部分二进制数p4=(ip&m4);取出各部分二进制数printf(这个 ip 地址常规形式为:lu.%lu.%lu.%lu, p4,p3,p2,pl);/按要求格式输出return 0;)测试:由于本题默认所有的输入都是合理的,所以我们不对输入的数据是否位整数进行检查(尽管这是必要的,我们会在以后的实验提到如何实现)。同时,我们注意到本题的可能执行情况在正常情况下只有一种(但为了使验证结果具有说服力,我们依然需要数组测试数据),且本题的测试数据相当庞大(特别是将其转化为二进制后),所以我们需要借助计算机将其转化为二进制数并进行相应的人工转化并验证。此外,本题的验证还有一个关键之处,即IP地址的输出顺序是否符合要求,具体测试数据见表1-3,运行结果见图1-91-11。表1-3编程题3的测试数据测试用例程序输入理论结果运行结果长整形形式二进制(十进制)用例1456456130000001010111000(184)01111111(127)00101101(45)45.127.184.245.127.184.2用例212345678900000111(7)01011011(91)11001101(205)00010101(21)21.205.91.721.205.91.7用例378965432100101111(47)00010001(17)00101011(43)00110001(49)49.43.17.4749.43.17.47对应测试测试用例1的运行结果如图1-9所示输入长整数形式的iP地址:45645613这个ip姬址常规形式为:45.127.184.2图1-9编程题3的测试用例一的运行结果对应测试测试用例2的运行结果如图1-10所示。黔球错勰拶巴;梵宽7图1-10编程题3的测试用例二的运行结果对应测试测试用例3的运行结果如图1-11所示。麟球赛勰拜址鳖舐7图1-11编程题3的测试用例三的运行结果说明上述的运行结果与理论分析吻合,验证了程序的正确性。1.3自设题问题:仿照程序设计题3,设计一段程序,当我们输入一段IP地址(常规形式)时,输出其长整数形式的IP地址。解答:本题中由于需要输入IP地址,而IP地址是由句点分隔的,所以我们需要对格式化输入函数进行相应设置,使之能正常输入IP地址(否则会造成输入域混乱,导致不可预知的错误),而当我们按格式输入了 IP地址之后,我们只需要将程序设计题3的程序中的处理顺序逆转即可(由于我们可以先进行按位与运算,再进行移动,所以我们可以只使用一个逻辑尺;此外,关于CPU处理数据顺序的差异,可以在输入时即交换顺序,即用户按实际顺序输入数据,而程序按CPU处理顺序接受数据)。算法见流程图1-4,其余细节见程序注释,程序如下。#includeint main()unsigned long ip4, ip3, ip2, ipl, ip;会发生移动,故其最大值并非128,不采用char型ip =0;使用前需按需初始化为0printf(请输入常规形式的1P地址:);scanfs(%lu.%lu.%lu.%lu,&ip4,&ip3,&ip2,&ipl);再输入时即按 CPU顺序交换了存储顺序unsigned long m;m = OxOOOOOOfF;在移动之前,仅有前8位需取出由于已经发生移动,故此处无需交换顺序ip +=(ipl&m)24;ip +=(ip2&m)16;ip +=(ip3&m)8;ip +=(ip4&m);printf(该IP地址的长整数形式为:%lun, ip); return 0;流程图1-4自设题的算法测试:本题的测试只需将程序设计题中的测试数据输入输出逆转即可(理论分析由于与程序设计题3完全相同,故略去),测试数据见表1-4,程序运行结果见图1-12,程序运行结果与理论相符,验证了程序的正确性。表1-3编程题3的测试数据测试用例程序输入理论结果运行结果用例145.127.184.24564561345.127.184.2用例221.205.91.712345678921.205.91.7用例349.43.17.4778965432149.43.17.47理论分析由于与程序设计题3完全相同,故略去I测试用例1请输入常规形式的IP地址:45.127.184.2该IP地址的长整数形式为:45645613测试用例2请输入常规形式的IP地址:21.205.91.7该IP地址的长整数形式为:123456789测试用例3请输入常规形式的IP地址:49.43.17.47该IP地址的长整数形式为:789654321图1-12自设题程序的运行结果1.4实验小结这是我第一次撰写的实验报告,自然,会有很多的不完善之处,由于目前的知识有限,诸如流程控制,数组,编译预处理等编程技术都无法使用,而这些技术的使用无疑会给本次实验程序的编制带来极大的方便。诚然,不使用这些手段进行编程的能力也是十分重要的,而本次实验恰好锻炼了我们的此种能力,使我们使用简单而基本的运算与流程,去实现一些稍复杂的程序。而即使是这样较为基本的编程实践中,我也发现了很多自己平时并不注意的问题。比如在最开始我的部分返回值类型不为void的main函数却没有返回值,这使得我的程序在逻辑上并不完整(尽管运行结果看上去是对的)。而除了在编程上的体会之外,我对实验报告的书写也略有感触。这是我第一次书写实验报告,在书写实验报告的过程中,我遇到了很多困难,比如流程图的绘制和图与表格的命名,但在指导老师与助教热心帮助下,我逐一克服了这些困难,并在解决这些困难的同时使自己的能力也得到了相应的提高。实验2流程控制实验2.1实验目的(1)掌握if-else, do-while, switch-case等流程控制语句之用法。(2)能正确理解各流程控制语句所包含的逻辑关系。(3)能正确理解各流程控制语句之间不同,并用这些不同优化自己的程序。(4)能用流程控制语句编写简单的C语言程序。2.2实验内容及要求2.2.1源程序改错下面是计算s=n!的源程序,在这个源程序中存在若干语法和逻辑错误。要求在计算机上对这个例子程序进行调试修改,使之能够正确完成指定任务。例如,8!=403201 #include 2 int main(void)3 (4 int i,n,s=l;5 printfnPlease enter n:n);6 scanfifM%dn, n);7 fdr(i=l,i=n,i-H-)8 s=s*i;9 printff%d!=%dn,n,s);10 return 0;II解答:(1)错误修改:1), scanf在输入时应指向单元地址而非单元名称,正确形式为:scanf(%d,&n);2), fbr语句表达式1,2,3之间应用;分隔,正确形式为:(2)错误修改后运行结果:见图2-1(8的阶乘确为40320)Please enter n:8 Bt -40320图2-1修改后的运行结果2.2.2源程序修改替换(1)修改第1题,分别用while和do-while语句替换for语句。解答:在使用while语句时,其与for语句的主要差异在于没有一个专门的语句为i赋予初值,所以需要在进入循环之前,为i赋予初值1。而在其他的地方,则与经ibr语句的处理基本一致,替换后的程序如下所示:#include int main(void)(int i=l,n,s=l;/相较于for语句的关键printf(Please enter n:);scanfi(%d,&n);while(i=n)(s=s*i;iH;)printf(%d!=%d,n,s);return 0;运行结果见图2-2(8的阶乘确为40320)Please enter n:77!5040图2-2 while结构下的运行结果在使用do-while语句时,其与while语句的差异特别体现在无论n的值为何值,其都会进行一次循环,但值得注意的是,这一次额外的循环(发生于输入 n=0时)在i的初值为1时,并不会改变s的值,从而并不需要进行额外的处理,调换循环体与条件的位置即可,替换后的程序如下所示:#include int main(void)int i=l,n,s=l;printf(Please enter n:);scanfi(%d,&n);dos=s*i;i+;while(i=n);交换条件与循环体的位置 printf(%d!=%d,n,s);return 0;)运行结果见图2-3(6的阶乘确为720)Please enter n:66?=720图23 do-while结构的运行结果(2)修改第1题,要求输入改为“整数s”,输出改为“满足n!s的最小整数 nwo例如,输入整数为40310,输出结果为n=8。解答:这个问题,从本质上来说,是要找到一个数,使它的阶乘的值大于等于所输入的n的值,且要求这个数的值最小。阶乘的实现,可借助之前编写的程序,并将它作为一个子函数进行调用,使主函数更加简明,数的寻找可借助简明的while循环来实现,程序如下所示,#include int f (int p)int d=l;int i;fbr(i=l;is)比较n+;s=f(n);计算阶乘printf(n =%dn,n);return 0;运行结果见图2-4(40320=8!403127!=5040)Please enter s:40312 m =8图2-4第2题程序的运行结果2.2.3程序设计(1)假设工资税金按以下方法计算:x 1000元,不收取税金;1000 Wx 2000,收取5%的税金;20000x 3000,收取10%的税金;30000x 4000,收取15%的税金;4000 x 5000,收取25%的税金。编写一个程序,输入工资金额,输出应收取税金额度,要求分别用if语句和switch语句来实现解答:首先对输入的x进行判断,判断其是否是一个合理的工资数目,如果不合理(比如说是负数),就输出提示输入不合理的内容。而如果其输入合理,则通过对x值的判断,决定其对应的税收方式,而后进行计算。需要注意的是,在if-else结构下,对x的区间划分比较显然,但由于switch 语句只能选择整数,结合x的分段区间宽度均为1000,于是将x除以1000后再强制转换类型为int在进入各case进行运算,同样重要的是,注意到switch语句的特点,我们可以巧妙的利用其特性,简化程序语句。其余细节见程序注释,算法见流程图2-1与2-2,程序如下。#include int main(void)double x, tax;printf(请输入您的工资金额:, scanf_s(%lf,&x);if (x 0) printf(您输入了错误的工资,请检查您的输入H);检查输入是否合理else(if(x1000) tax =0;else if(x 2000) tax =(x -1000)*0.05;else if(x 3000) tax =(x -2000)*0.10+1000*0.05;else if(x 4000) tax =(x -3000)*0.15+1000*(0.10+0.05);else if(x 5000) tax =(x -4000)*0.20+1000*(0.05+0.10+0.15);else tax =(x -5000)*0.25+1000*(0.05+0.10+0.15+0.20);printf(IF ELSE 方式)您须交税:%.21f 元n, tax);tax =0;为利用switch语句的特点,会进行累加运算,此处需将tax清零switch (int)x)/1000)/对switch仅能选择整数的处理(default: tax +=(x -5000)*0.25; x =5000;注意到 switch 的特点case 4: tax +=(x -4000)*0.20; x =4000;case 3: tax +=(x -3000)*0.15; x =3000;case 2: tax +=(x -2000)*0.10; x =2000;case 1: tax +=(x -1000)*0.05; x =1000;此处的 x=1000并不是必要的case 0:;printf(SWITCH 方式)您须交税:%.21f 元5, tax);)return 0;流程图2-1见下一页。流程图2-1程序设计题1的算法(if-else结构)流程图2-2见下一页。流程图2-2程序设计题1的算法(switch结构)测试:测试数据:见表2-1,在选取测试数据时,我们注意到,首先应检测程序能否正确判断输入的正确性,故我们输入-1(负数)与.(非数字)。其次,我们在各数据段中选取具有代表性且易于人工验算的数据,因此,我们在此处在各工资段中选取了500,1500,2500,3500,4500,5500.同时,选取边界数据0,1000,2000,3000,4000,防止程序无法正常处理边界值,图2-5的运行结果说明结果与理论分析吻合,验证了程序的正确性。表2-1编程题1的测试数据测试用例1i疗输入您的1:保金额:1错识的I:俗.清依:令您的输入道输入您的I.货金额:+您检入rtrt设的 :资.谪检化您的蛤入 测试川例3晴瑜入您的I:洗金制I: O(IF ELSE方式)您须交税:0. 00元(SWITCH方式)您须交币兑:0. D。元测试川例4i卉蛤入您的工资金额:500(IF ELSE 方式)您须交: 0.00元(SWITCH 方式)您须交税:0.00元测I试用例5入您的工资金额:1000(IF ELSE方式)您须交税:0.00元(SWITCH方式)您须交税:0.00元测试用例6储检入您的I:资金额:1500(IF ELSE方式)您须交税:25. 00元(SWITCH方式)您须交税:25. 00元测试川例7i.i除入您的工资金额:2000(IF ELSE 方式)您须交税:50. 00元(SWITCH方式)您须交税:50. 00元测试用例8i行输入您的工资金额:2500(IF ELSE 方式)您须交税:100. 00元(SWITCH 方式)色;须爻税 :106 00元测试用例9疗输入您的1:资金额:3C00:IF ELSE方式)您须交税:150. 00元(SWITCH方式)您须交税:150. 00元测试用例10疗输入您的1:资金额:3500:IF ELSE方式)您须交税:225. 00元:SWITCH方式)您须交税:225. 00元测试用例11次输入您的工费金额:4C00:IF ELSE方式)您须交税:300. 00元:SWITCH方式)您须交税:300. 00元测试用例12青输入您的工资金额:4500:IF ELSE方式;)您须交税:400. 00元:SWITCH方式)您须交税:400. 00元测试用例13青输入您的工资金额:5C00:IF ELSE方式)您须交税:500. 00元:SWITCH方式)您须交税:500. 00元则试用例14音输入您的工资金额:5500:IF ELSE方式)您须交税:625. 00元 :SWITCH方式)你须学税:625.0071-测试用例.程序输入.理论若果运行结果用例1.提示幻误.提示错误.用例2.4-提示命误.提示错误.用例3.0.00元.0.00元.照例4.5co0.00元.0.00元.用例5.10000.00元.0.007C用例6.150025.0(元25.00元.H例7.20005().(M 比50.00元.用例8.2500100.0)元.100.00元.用例9.3000150.05元150.00元.用例103500.225.0)元.225.00元“him 114000300.0)元.300.00元.用例12.4500400.0)元.400.00元.用例1350)0.500.0)元.500.00元.用例1455*)0.625.0)元.625.00元.图2-5编程题1的测试用例一的运行结果(2)编写一个程序,将输入的一行字符复制到输出,复制过程中将一个以上的空格字符用一个空格代替。解答:这与C语言处理注释文字的方式相似,为此,我们定义两个字符单元,分别用于收集当前收集的字符与上一个收集的字符,当这两个单元都收集到空格字符时,停止输出收集到的字符,否则,正常输出收集到的字符,这样,便可以将一个以上的空格字符用一个空格代替。其余细节见程序注释,算法见流程图2-3,程序如下。#include int main()char c, d=0;/搜集当前字符的c单元与前一字符的d单元,注意由于最开始“前一字符”不存在,需给d赋初值while (c = getchar()!= EOF)if(c !=) printf(%c, c);/非空格字符正常输出if(c =) if(d !=) print%c, c);非连续空格字符正常输出 d = c;/记录前一字符return 0;流程图2-3程序设计题2的算法测试:为了测试本程序应对各个位置的空格的能力,作者在各处放置了数量不等的空格,特别是首尾两处,其次,为了测试程序是否会错误的少输出字符,作者将所有的非空格字符均设为2个及以上。测试数据:字符串(前有2个空格)1122233 llaabb 111.3311AAAA444+/666(后有2个空格)理论输出结果:(前有1个空格)1122233 llaabbxlll.3311AAAA444+/666(后有1个空格)对应测试测试用例的运行结果如图2-6所示。特别提示,为使程序效果显目,用字母x代表空格。下面的运行结果说明结果与理论分析吻合,验证了程序的正确性。xxll22233xllaabbxxlll.33xxxllAAAA444+/666xx xll22233xllaabbxlll.33x1lAAAA444+/666x图2-6编程题2的测试用例的运行结果(3)编写一个程序,打印如下的杨辉三角形。1/*第0行*/11/*第1行*/121/*第2行*/13311464115101051161520156117213535217118285670562881193684126126843691每个数据值可以由组合C/计算(表示第i行第j列位置的值),而C/的计算如下:C,=l(i=0,l,2,)C/=C/-*(i-j + l)/j G=0,l,2,3,.,i)说明:本程序中为了打印出金字塔效果,要注意空格的数目。一位数之间是3个空格,两位数之间有2个空格,3位数之间只有一个空格,程序编制过程中要注意区分。解答:首先,定义一个函数用于生成组合数,题目中提供了一种很好的组合数生成方式,它能避免在计算到17的阶乘时就会造成int溢出的结果使计算结果异常,从而提供了计算范围更大的组合数的可能,当然,在本题中组合结果最大只能是999(否则会出现4位数而无法构成金字塔)。而到了生成金字塔的环节,我们可以将每一个数的单元视作一个长度为4的砖块,这样,我们可以得到一个显然的结论:为了得到金字塔,从最下面一层开始,在其前方输出2个空格,并且每向上一层,就再增加两个空格。最后这个10层的金字塔,塔底有10个数,但值得注意注意的是这是(a+b)9的展开式各项系数而非(a+b严的,程序如下。#includeint zh(int a, int b)声明一个新的函数,使程序更简明(int j, i, r=l;if (a =0& b =0) return 1;处理 c(0,0)的特殊情况for (i =1; i = a; i+) r =(r *(b -i + l)/i;组合数算法 return r;)void main()int i,j, n, k, p;n =9;十阶金字塔对应的是(a+b)9的展开式fbr (i =0; i 0; k-) putchar();生成空格fbr (j =0; j = i; j+) printf(%4d, zh(j, i);/输出数据,注意4d 的使用满足了题目对空格数的要求putchar(n);)测试:本题无需输入,输出如下图。1111211331146411510105116152015611721353521711828567056288193684126126843691图2-7编程题3的运行结果(4)编写一个程序,将用户输入的任意正整数逆转,例如,输入1234,输出432lo解答:由于本题明确指出所逆转的对象是正整数,从而首先需要对获得的输入进行判定,以确定其是否是符合题目要求的输入。再确定输入合乎题目要求之后,利用同余除法的特性,求出输入数据除以十的余数并将其输出,而后将输入的数字除以十,由于输入是int型,从而除以十的结果等效于消除了最后一位数字,再求出新的数字除以10的余数,如此循环下去,便可输出被逆转的整数,考虑到循环的逻辑简明,故采用while语句。其余细节见程序注释,算法见流程图2-4,程序如下。流程图2-4程序设计题4的算法#include int main()int n, s;printf(请输入一个正整数,本程序会将其逆转:);scanfs(%d,&n);if(n=0) printf(本程序只接受正整数输入,请检查您的输入)检查输入是否合理else while (n)注意,此处只用于判断循环是否结束,不用于判断输入是否合s = n%10;printf(%d, s);输出最后一位数 n = n/10;消除最后一位数)putchar(n);printf(t此即为逆转结果);return 0;测试:首先,是对函数基本功能的测试,即测试其能否正确逆转正整数,在此,我们选取一个正常的正整数O,接下来测试程序对异常输入的反应一个异常输入0(非正整数),一个异常输入“。”(非数字),其预期结果与实际结果见表2-2,运行结果见图2-8。表2-2编程题1的测试数据测试用例程序输入理论结果运行结果用例1OOO用例2提示错误提示错误用例30提示错误提示错误测试用例:1请输入一个正整数,本程序会将其逆转:测试结果:测试用例:2请输入一个正整数,本程序会将其逆转:。本程序只接受正整数输入,i疗检畲您的输入测试用例:3请输入一个正整数,本程序会将其逆转:0本程不只接受正整数输入,请检代您的输入图2-8编程题4的运彳丁结果2.2.4选做题编写一个程序,用牛顿迭代法求方程f(x)=3/_4/_5x +13=。满足精度 e=10-6的一个近似根,并在屏幕上输出所求近似根。牛顿迭代法求方程近似根的迭代公式为:x0= alx*+i =xk-f(xk)/fxk)其中,/(x)是函数f(x)的导函数。牛顿迭代法首先任意设定的一个实数。来作为近似根的迭代初值xo,然后用迭代公式计算下一个近似根XI。如此继续迭代计算X2,X3,Xn,直到氏-%区精度e,此时值x。即为所求的近似根。解答:首先,为了计算Xk+I我们应先计算f(Xk)与F(Xk)而对这两个多项式的计算,我们可以采用秦九韶算法,这样可以减少对计算机而言较复杂的的乘法运算,虽然对单次计算而言,这样的简化效果并不明显,但在多次的迭代计算中(本题中进行了三十三次),这样的简化可大幅提高计算效率。而在解决了 f(Xk)与f(Xk)的值后,为了使程序更加简洁,我们将这两个式子定义为新的函数,与此同时,将迭代过程也定义为一个新的函数。最后在判断 Xk+1与Xk的接进程度时,考虑到最初Xk+1并未赋值,我们在此处采用至少循环一次的do-while结构。其余细节见程序注释,算法见流程图2-5,程序如下。#include#include double fifdouble x)(return (3* x -4)*x -5)*x +13);秦九韶算法) double df(double x)return (9* x -8)*x -5);秦九韶算法) double n(double x)return (x-f(x)/df(x);迭代 void main()double xk=l,xp=l;int k=0;doxk = xp;xp = n(xk);k+;统计计算次数while (fabs(xp - xk) le-6);printf(方程的根:%lfn计算次数:%dn, xk,k);流程图2-5选做题的算法测试:本题无需输入,输出见图2-9。本方程的根为(sqrt(21799)/(2*3A(7/2)-249 l/1458)A(l/3)+61/(81*(sqrt(21799)/(2*3A(7/2)-2491/1458)A(l/3)+4/9=-l.548909593下面的运行结果说明结果与理论分析吻合,验证了程序的正确性。方程的根:T.548910计算次数:33图2-9选做题的的运行结果2.3自设题问题:判断一个数是否是质数。解答:为判断一个数是否是质数,我们通常是把小于这个数的每一个数去除这个数直到除到它自身为止(称为1方法),但是这样的效率很低,且会进行大量的重复计算,于是有人提出只需要除到这个数的一半(称为2方法),但事实上这样也会造成重复计算,经过理论分析表明,只需要除到这个数的平方根即可(称为3方法),当然,存在其他更优越的方法,如Solovay-Strassen算法和 Miller-Rabin算法,但它们较复杂,也有针对特定环境的方法,例如把一定范围内的质数先生成,在使用进行大小比较即可,但这针对多次查询比较有效。在此,我们将比较1方法,2方法与3方法计算所需要的时间。特别地,对于3方法而言,开根号无论是对于人还是对于计算机都是一项复杂的工作,为提高计算效率,我们采用一个等价描述,即0加46=加2与。这样把需要多次迭代的开方运算变成了乘法运算,能显著提高计算效率。至于计时方面,C语言的time.h中提供了相应的函数,我们可直接调用用来计时,注意到它的精度是毫秒级的,所以它的精度是足够的,其余细节见程序注释。算法(仅包含质数判断)见流程图2-6,程序如下.流程图2-6自设题的算法#include#inc
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业管理 > 商业计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!