《2022年C语言上机实验题 .pdf》由会员分享,可在线阅读,更多相关《2022年C语言上机实验题 .pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第六章循环控制通过本章实验作业应达目标1熟悉 while 、for 、do_while 、break 、 continue语句的作用与使用规范。2学习并掌握利用while 语句、 for语句、 do_while语句实现循环结构。3掌握循环结构和选择结构之间嵌套、多重循环间嵌套的设计方法。4进行算法设计训练,能综合所学控制结构语句解决一般问题。本章必须上交作业程序 6_1.c 、6_2.c 、6_5.c 、6_6.c 、6_8.c 上传至 211.64.135.121/casp。本章开始, 上机实验项目量加大,希望同学们多多自行上机。本章实验项目有余力都可以做一下并上交。循环程序设计计算机解决问
2、题都是按指定的顺序执行一系列的动作。按照特定的顺序执行相应的动作来求解问题的过程称为算法。程序中的语句是算法的体现,而算法要解决的是“做什么”和“怎么做”的问题。计算机程序中指定语句的执行顺序称为“程序控制”。结构化的程序控制包含三种基本结构:顺序结构,选择结构和循环结构。1. 循环设计循环是在循环条件为真时反复执行的一组计算机指令,是计算机解题的一个重要结构。循环控制有两种基本方法:计数法和标志法。1)计数器控制的循环事先准确地知道循环次数,因此设计一个循环控制变量,由变量值来控制循环次数。每循环一次,循环变量的值会递增(增值通常为1 或-1) ,当其值达到终值时结束循环。教材例 6.2、6
3、.3、6.7 都是典型的计数器控制的固定次数次数循环。2)标志控制的循环事先不知道准确的循环次数,由某一目标值标记循环的结束。如,教材例6.6 中以 |t|的值达到标记下限值1e-6 作为循环的结束。循环设计时要注意合理设计循环条件,使得循环不会成为死循环。2. 算法程序设计的首要工作是算法设计,离开了算法也就没有了程序。算法, 是指完成某一项工作而采取的方法和步骤,具体到程序设计,是对解题过程的准确而完整的描述,并用一种程序设计语言的来实现。循环主要用来解决程序设计中两类基本的算法:穷举和迭代。1)穷举穷举的基本思想是对问题的所有可能状态一一测试,直到找到解或将全部可能状态都测试过为止。穷举
4、是一种重复型算法,其核心是设计循环,在循环体中依次测试。例:输入两个正整数x 和 y,求其最大公约数。main() int x,y,i,flag; printf(Please input two numbers:); scanf(%d%d,&x,&y); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - for(i=x=1;i-) /* 使用 i 进行穷举*/ if(x%i=0&y%i=0) break; /* 条件满足,就结束
5、循环*/ printf(greatest common divisor=%dn,i); 两个数中的小者到2 之间任何一个数都有可能是公约数,因此用变量i 从大到小一一穷举,直到找到为止。若两数互质,当i=1 时也能使条件满足。2)迭代按照特定规律和方法,不断用新值取代变量的旧值,或由旧值递推出变量新值,直至问题解决为止,这种解决问题的方法为迭代。迭代的关键因素是:迭代初值、迭代公式和迭代次数(精度要求) 。例:使用辗转相除法求两数的最大公约数。辗转相除法:如果x 除以 y 的余数为0,则除数y 就是最大公约数,或余数不为0,则被除数 x 被除数 y 取代,除数y 被余数取代,再用新的x 除以新
6、的y,判断余数是否为0,如果不为0,则重复此迭代过程,直至余数为0,此时的除数y 即为最大公约数。main() int x,y,temp; printf(Please input tw o numbers:);scanf(%d%d,&x,&y); temp=x%y; while(temp!=0) /* 辗转相除,直到temp 为 0 */ x=y; /* 迭代 */ y=temp; /* 迭代 */ temp=x%y; printf(greatest common divisor=%dn,y); 运行时输入:66 121 输出: greatest common divisor=11 各值的变化
7、如下:x y temp=x%y 66 121 66 121 66 11 66 11 0 实验一 固定次数的循环设计【实验目的】学习设计固定次数的循环。【实验内容】编写程序,计算x 的 y 次方。这里x 为 double 型, y 为 int型。 x、y 通过键盘输入,要考虑 y 为负数的情况。例:当输入2.5 3时,输出15.625000 ;当输入2.5 -3时则输出0.064000 。程序以6_1.c 命名并上交。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 12 页
8、 - - - - - - - - - 输入输出屏幕示例【指导】本实验中,假设y 为正数时,可定义结果变量sum,想办法使sum*=x语句执行y 次。对固定次数的循环,通常方法是设计一个循环变量i ,让其在初值与终值之间变化控制控制循环次数,循环条件通常是:i 终值。如:for(i=初 值 ;i 终 值 ;i+) 循环体语句 ; 实验二整数按位折分求和【实验目的】学习设计与控制循环,并熟练%(求余)运算。【实验内容】输入一个不大于2 109(用 long 型数据)的正整数x,求这个数每位数字之和。例如,若输入 33456781,输出 37。程序以 6_2.c 命名并上交。【提示】设计循环,每次求
9、出x 的个位数(使用求余运算)并累加到和值变量中,再迭代操作,改变 x 的值,使原来的十位变个位。【讨论与思考】long 型数据的最大值是2147483647,受变量类型限制,本程序只能接收不大于2109的正整数。如果进行扩充,要求能接收并计算一个30 位整数的各位之和,那么数据类型应如何设置,程序应该如何编写?实验三输出九九乘法表【实验目的】学习多重循环的嵌套。【实验内容】下面程序输出九九乘法表如下图。请完善程序并以6_3.c 命名 。#include void main() int i,j; clrscr(); for(_) for(_ ) printf(%d*%d=%-2d ,i,j,i
10、*j); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - _; 实验四打印数字塔图形【实验目的】学习使用循环语句构成的多重循环嵌套。【实验内容】编写程序,使用循环输出如下图所示的数字塔图形。程序以6_4.c 命名 。【提示】此图形上下对称,可将程序分为上下两部分实现。上半部输出9 行,下半部输出8 行。每一行包含三部分内容:开始的空格、 中间的数字及最后的换行符。需要考虑的是字符个数与行号的关系。下面程序用于输出如下*字符塔,
11、供本题参考。#include void main() int i,j; clrscr(); /* 清屏 */ for(i=1;i=9;i+) /* 行循环 */ for(j=1;j=9-i;j+) /* 输出行左空格*/ printf( ); for(j=1;j=2*i-1;j+) /* 输出若干 * 字符 */ printf(%c,*); printf(n); /* 换行 */ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - - - -
12、 实验五寻找素数【实验目的】领会并牢固掌握素数算法,深入循环结构设计。【实验内容】从键盘输入一个大于3 的正整数, 输出距离该数最近的素数。根据输入的数不同,此问题可能有一个答案(或者比输入的数大或者比输入的数小),也可能需要输出两个值(一个比输入的数大, 一个比输入的数小,两个距离输入的数一样近)。程序以 6_5.c 命名并上交。实验六不等式求解【实验目的】学习在循环中使用break 控制语句。【实验内容】键盘输入一个数给m,计算并返回满足表达式:1+ (1+2)+ (1+2+3)+(1+2+3+4) +,+(1+2+3+ ,+n)=m 最大的 n。例如,当m=10000 时,程序输出:n=
13、38。程序以 6_6.c命名并上交。【提示】参考解法:for(i=1;1;i+) /* 循环条件为恒真 */ 计算( 1+2+3+,+i )s; 将计算结果s 累加到变量sum中 ; 判断 sum的值是否大于m 是,则终止循环否,则继续进入下一次循环 输出与对应结果,其值会与i 相关。实验七统计字数【实验目的】学习使用循环处理字符串相关问题。【实验内容】完善以下程序6_7.C 。程序任务:输入一串字符,以“#”作为输入结束标志,显示其中字母与数字字符的个数。#include void main() int ch_num,dig_num;char ch; ch_num=dig_num=0; do
14、ch=getchar(); /* 完善程序,统计52 个英文字母与十个数字字符的个数 */ while(_); /* 给出循环条件*/ printf(The number of chars is:%dn,ch_num); printf(The number of digital is:%dn,dig_num); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 12 页 - - - - - - - - - 实验八 礼炮响声统计【实验目的】学习循环中条件的设计与数据统计。【实
15、验内容】活动中有三门礼炮,各装有十枚炮弹。第一门礼炮每隔3 秒发一枚炮弹,第二门每隔5秒、第三门每隔7 秒发一枚炮。问观礼群众一共听到几声炮响。同一时间发出炮声算一响。程序以 6_8.c 命名并上交。【实验提示】程序中可分别设置计时器变量与计数器变量。计时器以秒为单位递增,测试此时有无炮发出。只要有一枚炮发出,则计数器增1。注意不要重复统计。实验九验证哥德巴赫猜想【实验目的】综合运用多重循环结构、标志法、穷举法解决问题。【问题描述】1742 年 6 月,德国数学家哥德巴赫在给大数学家欧拉的信中提出一个问题:任何大于4的偶数均可以表示为两个素数之和吗?欧拉复信道:任何大于4 的偶数均可以表示为两
16、个素数之和,这一猜想我还不能证明,但我确信无疑地认为这是完全正确的定理。哥德巴赫猜想是世界著名的数学难题,至今未能在理论上得到证明,自从计算机出现后,人们就开始用计算机去尝试解各种各样的数学难题,包括费马大定理、 四色问题、 哥德巴赫猜想等, 虽然计算机无法从理论上严密地证明它们,只能在有限的范围内对其进行检验,但也不失其意义。【实验内容】程序要求:输入一个 int 型数据范围内的偶数x(x4) , 找到两个素数a、 b, 满足x=a+b 。最后输出此等式。如输入98,输出 98=19+79。程序以 6_9.c 命名。【实验提示】读入偶数 x,找出一对数a、b 满足 x=a+b,测试 a、b
17、是否都为素数,若不满足,则找下一对 a、b 继续测试,直到a、 b 均为素数为止。算法描述如下:读入 x; a=3; while(ax/2) b=x-a; 测素数循环,测试a 是否为素数 ; 测素数循环,测试b 是否为素数 ; if(a、b 同为素数 ) 退出 while 循环 ; a+=2; /* a在奇数上穷举 */ if(ax/2) 验证成功,输出x=a+b; else 验证失败,输出失败信息; 为了判断 a、b 是否是素数,可以设置两个二元标志变量flag_a和 flag_b ,其值为 1时表示对应变量是素数,其值为 0 时表示变量是非素数。令 flag_a和 flag_b的初始值为0
18、,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 12 页 - - - - - - - - - 代表开始时假设a、b 都不是素数,然后进入测试循环。若测素数循环检测a 是素数,则改变 flag_a=1 ;若 b 是素数,则令flag_b=1 。 则 if(a、b 同为素数 ) 可以表示为if(flag_a*flag_b!=0)。实验十计算立方根【实验目的】练习迭代算法,学习几种解一元高次方程的方法。【实验内容】键盘输入一个实数a,输出它的立方根。请自行设计算法编写程序,不
19、允许调用pow 函数。程序用6_10.c 命名。【提示】假设 a 的立方根为x,则x3=a,问题转化求一元高次方程x3-a=0的解。【预备知识】解高次方程的方法有很多,这里介绍两种方法:牛顿迭代法与二分法。例 1:用牛顿迭代法求一元高次方程x3-7x2+7x+15=0在猜测解10 附近的根。牛顿迭代法又称牛顿切线法,它的基本思想如下图所示。牛顿迭代法示意设kx是方程0)(xf的精确解x附近的一个猜测解,过点)(,(kkxfx做)(xf的切线, 切线与 x 轴的交点1kx由下式计算:)(/)(1kkkkxfxfxx,此式子就是牛顿迭代法的迭代公式。如果猜测解kx与精确解x处于同一个单调区间,则经
20、过有限次迭代后,可以求得符合误差要求的近似解。#include main() float x,x0,f,f1; x0=10; /* 初始的猜测值*/do x=x0; f=x*x*x-7*x*x+7*x+15;/* 变量 f 记录)(xf*/名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 12 页 - - - - - - - - - f1=3*x*x-14*x+7; /* 变量 f1 记录)(xf*/x0=x-f/f1; /* 按公式迭代*/ while(fabs(f)=1
21、e-5); /* 误差精度为0.00001 */printf(the root=%fn,x); 运行结果: the root=5.000000。改变初始的猜测值为0,则程序运行结果为:the root=-1.000000。改变初始的猜测值为2.5,则程序运行结果为:the root=3.000000。例 2:用二分法求一元高次方程x3-7x2+7x+15=0解。二分迭代法:先取0)(xf的两个粗略解1x,2x,若)(1xf与)(2xf符号相异,则方程0)(xf在区间),(21xx间至少有一个根。二分法示意取2/)(213xxx,判断3x是否是误差范围内的近似解,若不是,则在1x和2x中舍去函数
22、值与)(3xf同号者,图中应去除2x,这样1x与3x组成了一个更小的含根区间。再取),(31xx的中点4x,判断|)(|4xf是否近似为零,若不是,同理舍去函数值与)(4xf同号的1x,则得到更小的含根区间),(34xx,如此重复,依次得到nxxxx543,,当|)(|nxf足够小时,nx即为近似解。此重复过程由误差控制,而不能用计数循环,因为事先无法估计所需的迭代次数。#include main() float x,x1,x2,f,f1,f2;do printf(please input x1,x2:);scanf(%f%f,&x1,&x2); /*反复通过键盘输入两个初始值*/ f1=x1
23、*x1*x1-7*x1*x1+7*x1+15; f2=x2*x2*x2-7*x2*x2+7*x2+15; while(f1*f20); /* 直到保证1x,2x之间至少有一个根*/ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 12 页 - - - - - - - - - do x=(x1+x2)/2; f=x*x*x-7*x*x+7*x+15; if(f*f10) /* )(xf与)(1xf同号,则与)(2xf异号*/ x1=x; /* 迭代舍去原1x*/ f1=f;
24、 else x2=x; /* 迭代,舍去原2x*/f2=f; while(fabs(f)1e-5); /* 达不到精度要求循环继续*/printf(the root=%fn,x); 习题1对下面程序段描述正确的是_。 int k=10; while(k=0) k=k-1; A) while循环执行10 次 B) 循环是无限循环C) 循环体语句一次也不执行D) 循环体语句执行一次2语句 while(!E);中的表达式 !E 等价于 _. A) E=0 B) E!=1 C) E!=0 D) E=1 3下面程序段的运行结果是_. int n=0; while(n+=2); printf(%d,n);
25、 A) 2 B) 3 C) 4 D) 有语法错4下面程序的运行结果是_. #includemain() int num=0; while(num=2) num+; printf(%dn,num); A)1 B)1 C) 1 D) 1 2 2 2 3 3 4 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 12 页 - - - - - - - - - 5以下程序段 _. x=-1; do x=x*x; while(!x); A) 是死循环 B) 循环执行二次 C) 循环执行
26、一次 D) 有语法错误6如下程序段 _. int x=3; doprintf(%dn,x-=2); while(!(-x); A) 输出的是 1 B) 输出的是1 和-2 C) 输出的是3 和 0 D) 是死循环7下面程序的运行结果是_. #include main() int y=10; doy-;while(-y); printf(%dn,y-); A) -1 B) 1 C) 8 D) 0 8若 i 为整型变量,则以下循环执行次数是_. for(i=2;i=0;)printf(%d,i-); A) 无限次 B) 0次 C) 1次 D) 2次9执行语句for(i=1;i+4; );后变量 i
27、 的值是 _. A) 3 B) 4 C) 5 D) 不定10 以下正确的描述是_. A) continue语句的作用是结束整个循环的执行B) 只能在循环体内和switch语句体内使用break 语句C) 在循环体内使用break 语句或 continue语句的作用相同D) 从多层循环嵌套中退出时,只能使用goto 语句11.运行下面程序时,从键盘输入20357,则下面程序的运行结果是_。#include main( ) int c; while(c=getchar()!=n) switch(c-2) case 0: case 1: putchar(c+4); case 2: putchar(c
28、+4); break;case 3: putchar(c+3);default: putchar(c+2); break; putchar(n); 12. 下面程序段是从键盘输入的字符串中统计数字字符的个数,用换行符结束循环。请填空。int n=0,c; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 12 页 - - - - - - - - - c=getchar(); while(_) if(_)n+; c=getchar(); 13 下面程序的功能是用 辗转相除法
29、 求两个正整数的最大公约数。请填空。 #include main() int r,m,n; scanf(%d%d,&m,&n);if(mn)_; /* 保证 m总是是大于n */ r=m%n; while(r) m=n;n=r;r=_; printf(%dn,n); 14 下面程序的运行结果是_. #include main() int a,s,n,count;a=2;s=0;n=1;count=1;while(count=7)n=n*a;s=s+n;+count;printf(s=%d,s); 15 下面程序段的运行结果是_. i=1;a=0;s=1; doa=a+s*i;s=-s;i+;
30、while(i=10); printf(a=%d,a); 16 下面程序段的运行结果是_. i=1;s=3; dos+=i+; if(s%7=0)continue; else +i; while(s15); printf(%d,i); 17 下面程序用于打印出所有的“水仙花数”。所谓“水仙花数”是指一个3 位数,其各位数字立方和等于该数本身。完成程序。main( ) int i,a,b,c; for(i=100;i1000;i+ )a = i/100; b =_; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 12 页 - - - - - - - - - c = i%10; if(_) printf( %d , i); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 12 页 - - - - - - - - -