C语言上机实验题.doc

上传人:PIYPING 文档编号:11381541 上传时间:2021-07-31 格式:DOC 页数:12 大小:148.50KB
返回 下载 相关 举报
C语言上机实验题.doc_第1页
第1页 / 共12页
C语言上机实验题.doc_第2页
第2页 / 共12页
C语言上机实验题.doc_第3页
第3页 / 共12页
C语言上机实验题.doc_第4页
第4页 / 共12页
C语言上机实验题.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《C语言上机实验题.doc》由会员分享,可在线阅读,更多相关《C语言上机实验题.doc(12页珍藏版)》请在三一文库上搜索。

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、6.7都是典型的计数器控制的固定次

3、数次数循环。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); for(i=x=1;i-) /* 使用i进行穷举 */if(x%i=0&y%i=0) break; /* 条件满足,就结束循环 */printf(greatest common divisor=%dn,i); 两个数中的小者到2之间任何一个数都有可能是公约数,因此用变量i从大到小一一穷举,直到找到为止。若两数互质,当i=1时也能使条件满足。2)迭代按照特定规律和方法,不断用新值取代变量的旧值,或由旧

5、值递推出变量新值,直至问题解决为止,这种解决问题的方法为迭代。迭代的关键因素是:迭代初值、迭代公式和迭代次数(精度要求)。例:使用辗转相除法求两数的最大公约数。辗转相除法:如果x除以y的余数为0,则除数y就是最大公约数,或余数不为0,则被除数x被除数y取代,除数y被余数取代,再用新的x除以新的y,判断余数是否为0,如果不为0,则重复此迭代过程,直至余数为0,此时的除数y即为最大公约数。main()int x,y,temp; printf(Please input two numbers:); scanf(%d%d,&x,&y); temp=x%y; while(temp!=0)/* 辗转相除,

6、直到temp为0 */x=y;/*迭代*/ y=temp;/*迭代*/ temp=x%y; printf(greatest common divisor=%dn,y); 运行时输入:66 121输出:greatest common divisor=11 各值的变化如下:x y temp=x%y 66 121 66 121 66 1166 11 0实验一固定次数的循环设计【实验目的】学习设计固定次数的循环。【实验内容】编写程序,计算x的y次方。这里x为double型,y为int型。x、y通过键盘输入,要考虑y为负数的情况。例:当输入2.5 3时,输出15.625000;当输入2.5 -3时则输出

7、0.064000。程序以6_1.c命名并上交。输入输出屏幕示例【指导】本实验中,假设y为正数时,可定义结果变量sum,想办法使sum*=x语句执行y次。对固定次数的循环,通常方法是设计一个循环变量i,让其在初值与终值之间变化控制控制循环次数,循环条件通常是:i终值。如:for(i=初值;i终值;i+)循环体语句;实验二整数按位折分求和【实验目的】学习设计与控制循环,并熟练%(求余)运算。【实验内容】输入一个不大于2109(用long型数据)的正整数x,求这个数每位数字之和。例如,若输入33456781,输出37。程序以6_2.c命名并上交。【提示】设计循环,每次求出x的个位数(使用求余运算)并

8、累加到和值变量中,再迭代操作,改变x的值,使原来的十位变个位。【讨论与思考】 long型数据的最大值是2147483647,受变量类型限制,本程序只能接收不大于2109的正整数。如果进行扩充,要求能接收并计算一个30位整数的各位之和,那么数据类型应如何设置,程序应该如何编写?实验三输出九九乘法表【实验目的】学习多重循环的嵌套。【实验内容】下面程序输出九九乘法表如下图。请完善程序并以6_3.c命名。#includevoid main()int i,j; clrscr(); for(_)for(_ )printf(%d*%d=%-2d ,i,j,i*j); _; 实验四打印数字塔图形【实验目的】学

9、习使用循环语句构成的多重循环嵌套。【实验内容】编写程序,使用循环输出如下图所示的数字塔图形。程序以6_4.c命名。【提示】此图形上下对称,可将程序分为上下两部分实现。上半部输出9行,下半部输出8行。每一行包含三部分内容:开始的空格、中间的数字及最后的换行符。需要考虑的是字符个数与行号的关系。下面程序用于输出如下*字符塔,供本题参考。#includevoid 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+)/*

10、输出若干* 字符 */printf(%c,*); printf(n);/* 换行 */ 实验五寻找素数【实验目的】领会并牢固掌握素数算法,深入循环结构设计。【实验内容】从键盘输入一个大于3的正整数,输出距离该数最近的素数。根据输入的数不同,此问题可能有一个答案(或者比输入的数大或者比输入的数小),也可能需要输出两个值(一个比输入的数大,一个比输入的数小,两个距离输入的数一样近)。程序以6_5.c命名并上交。实验六不等式求解【实验目的】学习在循环中使用break控制语句。【实验内容】键盘输入一个数给m,计算并返回满足表达式:1+(1+2)+(1+2+3)+(1+2+3+4)+(1+2+3+n)=

11、m最大的n。例如,当m=10000时,程序输出:n=38。程序以6_6.c命名并上交。【提示】参考解法:for(i=1;1;i+) /* 循环条件为恒真 */计算(1+2+3+i)s; 将计算结果s累加到变量sum中; 判断sum的值是否大于m是,则终止循环否,则继续进入下一次循环输出与对应结果,其值会与i相关。实验七统计字数【实验目的】学习使用循环处理字符串相关问题。【实验内容】完善以下程序6_7.C 。程序任务:输入一串字符,以“#”作为输入结束标志,显示其中字母与数字字符的个数。#includevoid main()int ch_num,dig_num; char ch; ch_num=

12、dig_num=0; doch=getchar();/* 完善程序,统计52个英文字母与十个数字字符的个数 */ while(_); /* 给出循环条件 */ printf(The number of chars is:%dn,ch_num); printf(The number of digital is:%dn,dig_num); 实验八礼炮响声统计【实验目的】学习循环中条件的设计与数据统计。【实验内容】活动中有三门礼炮,各装有十枚炮弹。第一门礼炮每隔3秒发一枚炮弹,第二门每隔5秒、第三门每隔7秒发一枚炮。问观礼群众一共听到几声炮响。同一时间发出炮声算一响。程序以6_8.c命名并上交 。【

13、实验提示】程序中可分别设置计时器变量与计数器变量。计时器以秒为单位递增,测试此时有无炮发出。只要有一枚炮发出,则计数器增1。注意不要重复统计。实验九验证哥德巴赫猜想【实验目的】综合运用多重循环结构、标志法、穷举法解决问题。【问题描述】1742年6月,德国数学家哥德巴赫在给大数学家欧拉的信中提出一个问题:任何大于4的偶数均可以表示为两个素数之和吗?欧拉复信道:任何大于4的偶数均可以表示为两个素数之和,这一猜想我还不能证明,但我确信无疑地认为这是完全正确的定理。哥德巴赫猜想是世界著名的数学难题,至今未能在理论上得到证明,自从计算机出现后,人们就开始用计算机去尝试解各种各样的数学难题,包括费马大定理

14、、四色问题、哥德巴赫猜想等,虽然计算机无法从理论上严密地证明它们,只能在有限的范围内对其进行检验,但也不失其意义。【实验内容】程序要求:输入一个int型数据范围内的偶数x(x4),找到两个素数a、b,满足 x=a+b。最后输出此等式。如输入98,输出98=19+79。程序以6_9.c命名。【实验提示】读入偶数x,找出一对数a、b满足x=a+b,测试a、b是否都为素数,若不满足,则找下一对a、b继续测试,直到a、b均为素数为止。算法描述如下:读入x;a=3;while(ax/2)b=x-a; 测素数循环,测试a是否为素数; 测素数循环,测试b是否为素数; if(a、b同为素数)退出while循环

15、; a+=2; /* a在奇数上穷举 */ if(ax/2) 验证成功,输出x=a+b; else 验证失败,输出失败信息;为了判断a、b是否是素数,可以设置两个二元标志变量flag_a和flag_b,其值为1时表示对应变量是素数,其值为0时表示变量是非素数。令flag_a和flag_b的初始值为0,代表开始时假设a、b都不是素数,然后进入测试循环。若测素数循环检测a是素数,则改变flag_a=1;若b是素数,则令flag_b=1。则 if(a、b同为素数)可以表示为 if(flag_a*flag_b!=0)。实验十计算立方根【实验目的】练习迭代算法,学习几种解一元高次方程的方法。【实验内容】

16、键盘输入一个实数a,输出它的立方根。请自行设计算法编写程序,不允许调用pow函数。程序用6_10.c命名。【提示】假设a的立方根为x,则x3=a,问题转化求一元高次方程x3-a=0的解。【预备知识】 解高次方程的方法有很多,这里介绍两种方法:牛顿迭代法与二分法。例1:用牛顿迭代法求一元高次方程x3-7x2+7x+15=0在猜测解10附近的根。牛顿迭代法又称牛顿切线法,它的基本思想如下图所示。牛顿迭代法示意设是方程的精确解附近的一个猜测解,过点做的切线,切线与x轴的交点由下式计算:,此式子就是牛顿迭代法的迭代公式。如果猜测解与精确解处于同一个单调区间,则经过有限次迭代后,可以求得符合误差要求的近

17、似解。#includemain()float x,x0,f,f1; x0=10; /* 初始的猜测值 */ dox=x0;f=x*x*x-7*x*x+7*x+15;/* 变量f记录 */f1=3*x*x-14*x+7; /* 变量f1记录 */x0=x-f/f1; /* 按公式迭代 */while(fabs(f)=1e-5);/* 误差精度为0.00001 */ printf(the root=%fn,x); 运行结果:the root=5.000000。改变初始的猜测值为0,则程序运行结果为:the root=-1.000000。改变初始的猜测值为2.5,则程序运行结果为:the root=

18、3.000000。例2:用二分法求一元高次方程x3-7x2+7x+15=0解。二分迭代法:先取的两个粗略解,若与符号相异,则方程在区间间至少有一个根。二分法示意取,判断是否是误差范围内的近似解,若不是,则在和中舍去函数值与同号者,图中应去除,这样与组成了一个更小的含根区间。再取的中点,判断是否近似为零,若不是,同理舍去函数值与同号的,则得到更小的含根区间,如此重复,依次得到,当足够小时,即为近似解。此重复过程由误差控制,而不能用计数循环,因为事先无法估计所需的迭代次数。#includemain()float x,x1,x2,f,f1,f2; do printf(please input x1,

19、x2:); scanf(%f%f,&x1,&x2); /*反复通过键盘输入两个初始值*/ f1=x1*x1*x1-7*x1*x1+7*x1+15; f2=x2*x2*x2-7*x2*x2+7*x2+15; while(f1*f20); /* 直到保证,之间至少有一个根 */ do x=(x1+x2)/2; f=x*x*x-7*x*x+7*x+15; if(f*f10)/* 与同号,则与异号 */ x1=x;/* 迭代舍去原 */ f1=f; else x2=x;/* 迭代,舍去原 */ f2=f; while(fabs(f)1e-5);/* 达不到精度要求循环继续 */ printf(the

20、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=13下面程序段的运行结果是_.int n=0;while(n+=2); printf(%d,n);A) 2 B) 3C) 4 D) 有语法错4下面程序的运行结果是_. #include main() int num=0; while(num=2) num+; printf(

21、%dn,num); A)1 B)1 C) 1 D) 1 2 2 2 3 3 45以下程序段_. x=-1; do x=x*x; while(!x); A) 是死循环 B) 循环执行二次 C) 循环执行一次 D) 有语法错误6如下程序段 _.int x=3;doprintf(%dn,x-=2);while(!(-x); A) 输出的是1 B) 输出的是1和-2 C) 输出的是3和0 D) 是死循环7下面程序的运行结果是_.#includemain()int y=10; doy-;while(-y); printf(%dn,y-); A) -1 B) 1 C) 8 D) 08若i为整型变量,则以下

22、循环执行次数是_. for(i=2;i=0;)printf(%d,i-);A) 无限次 B) 0次 C) 1次 D) 2次9执行语句for(i=1;i+4; ); 后变量i的值是_.A) 3 B) 4 C) 5 D) 不定10以下正确的描述是_.A) continue语句的作用是结束整个循环的执行B) 只能在循环体内和switch语句体内使用break语句C) 在循环体内使用break语句或continue语句的作用相同D) 从多层循环嵌套中退出时,只能使用goto语句11. 运行下面程序时,从键盘输入20357,则下面程序的运行结果是_。#includemain( )int c; while

23、(c=getchar()!=n) switch(c-2)case 0: case 1: putchar(c+4); case 2: putchar(c+4); break; case 3: putchar(c+3); default: putchar(c+2); break; putchar(n); 12.下面程序段是从键盘输入的字符串中统计数字字符的个数,用换行符结束循环。请填空。 int n=0,c; c=getchar(); while(_) if(_)n+; c=getchar(); 13下面程序的功能是用辗转相除法求两个正整数的最大公约数。请填空。 #include main() i

24、nt 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+;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 =_; c = i%10; if(_) printf( %d , i);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1