第6章 循环结构程序设计
- 格式:doc
- 大小:245.00 KB
- 文档页数:16
第一章C语言概述一.选择题1.一个C程序的执行是从。
A.程序的main函数开始,到main函数结束B.程序文件的第一个函数开始,对本程序文件的最后一个函数结束C.本程序的main函数开始,到本程序文件的最后一个函数结束D.本程序文件的第一个函数开始,到本程序main函数结束2.以下叙述正确的是。
A.在C程序中,main函数必须位于程序的最前面B.C程序的每行中只能写一条语句C.C语言本身没有输入输出语句D.在对一个C程序进行编译的过程中,可发现注释中的拼写错误3.以下叙述不正确的是。
A.一个C源程序可由一个或多个函数组成B.一个C源程序必须包含一个main函数C.C程序的基本组成单位是函数D.在C程序中,注释说明只能位于一条语句的后面二.填空题1.C源程序的基本单位是函数。
2.一个C源程序中至少应包括一个主函数或main函数。
3.在一个C源程序中,注释部分两侧的分界符分别为/*和*/ 。
第二章数据的存储与运算一.选择题1.若x、i、j和k都是int型变量,则计算下面表达式后,x的值为。
x=(i=4,j=16,k=32)A.4 B.16 C.32 D.482.下面正确的字符常量是。
A.”c” B.’\\’’C.’W’ D.’’3.下面不正确的字符串常量是。
A.’abc’ B.”12’12” C.”0” D.” “4.以下正确的叙述是。
A.在C程序中,每行中只能写一条语句B.当从键盘输入数据时,对于整型变量只能输入整型数值,对于实型变量只能输入实型数值C.在C程序中,无论是整数还是实数,都能被准确无误地表示D.在C程序中,%是只能用于整数运算的运算符5.已知字母A的ASCII码为十进制数65,且c2为字符型,则执行语句c2=’A’+’6’-‘3’后c2中的值为。
A.D B.68 C.不确定的值 D.C6.若有定义:int a=7;float x=2.5,y=4.7;则表达式x+a%3*(int)(x+y)%2/4的值是。
《C语言程序设计能力教程(第二版)》课后作业及实训题参考答案第1章进入C语言程序世界二、1. I love China!printf("we are students.\n")2. 6项目实训题参考答案1.编写一个C程序,输出以下信息:* * * * * * * * * * * * * * * * * * * *I am a student!* * * * * * * * * * * * * * * * * * * *main(){ printf("********************\n");printf(" I am a student!\n ");printf("********************\n");}2.已知立方体的长、宽、高分别是10cm、20cm、15cm,编写程序,求立方体体积。
解:main(){int a,b,c,v;a=10;b=20;c=15;v=a*b*c;printf("v=%d",v);}本程序运行结果为:v=3000第2章编制C程序的基础知识一选择题C B A B A C C二操作题,2,-8,23.000000,2.500000,-8.0000002. ABC DEFGHwhy is 21+35 equal 523.3 14 32 31 24. aa bb cc abcA N项目实训题1.定义一个符号常量M为5和一个变量n值为2,把它们的乘积输出。
#define M 5main(){ int n,c;n=2; c=M*n;printf("%d\n",c); }2.编程求下面算术表达式的值。
(1)x+a%3*(int)(x+y)%2/4,设x=2.5,a=7,y=4.7;(2)(float)(a+b)/2+(int)x%(int)y,设a=2,b=3,x=3.5,y=2.5。
c语言程序设计谭浩强第四版C语言程序设计是计算机科学与技术领域中非常重要的基础课程之一。
谭浩强教授所著的《C语言程序设计》自问世以来,以其通俗易懂的语言和丰富的实例,深受广大学生和编程爱好者的喜爱。
第四版在继承前三版优点的基础上,对内容进行了更新和完善,更加符合现代编程教育的需求。
第一章:C语言概述本章主要介绍了C语言的发展历程、特点以及C语言在计算机编程领域中的应用。
C语言以其高效、灵活和可移植性,成为系统编程、嵌入式开发等领域的首选语言。
第二章:C语言的基本概念本章详细讲解了C语言的基本组成元素,包括数据类型、变量、常量、运算符和表达式等。
这些是编写C程序的基础,也是理解程序逻辑的关键。
第三章:顺序结构程序设计顺序结构是最简单的程序结构,本章通过实例讲解了如何使用顺序结构编写程序,以及如何通过输入输出函数实现数据的交互。
第四章:选择结构程序设计本章介绍了条件语句if、switch等选择结构的使用,通过这些结构可以实现程序的分支逻辑,使程序能够根据不同的条件执行不同的代码块。
第五章:循环结构程序设计循环结构是程序设计中不可或缺的部分,本章详细讲解了for、while、do-while等循环语句的用法,以及如何使用循环结构实现重复操作。
第六章:数组数组是存储多个同类型数据的集合,本章介绍了一维数组和二维数组的定义、初始化和使用,以及如何通过数组实现数据的批量处理。
第七章:函数函数是程序模块化的基础,本章讲解了函数的定义、声明、调用以及参数传递机制,包括值传递和地址传递的区别和应用。
第八章:指针指针是C语言中非常强大的特性之一,本章详细介绍了指针的基本概念、指针与数组的关系、指针的运算以及指针在函数中的应用。
第九章:结构体与联合体本章介绍了如何使用结构体和联合体来定义复杂的数据类型,以及如何通过这些复合数据类型实现数据的组织和管理。
第十章:预处理命令预处理命令是C语言编译过程中的特殊指令,本章讲解了宏定义、文件包含、条件编译等预处理命令的用法。
第六章习题(1)复习题1、简述自然语言与形式语言的概念以及区别、汇编语言与机器语言的概念及区别。
自然语言是某一社会发展中形成的一种民族语言,而形式语言是进行形式化工作的元语言,它是以数学和数理逻辑为基础的科学语言。
用机器指令形式编写的程序称为机器语言,用带符号或助记符的指令和地址代替二进制代码成为语言进化的目标。
这些使用助记符语言的语言后来就被称之为汇编语言。
(P135P136)2、什么是高级程序设计语言?它有什么特点?高级语言是汇编语言的一种抽象。
高级语言的设计目标就是使程序员摆脱汇编语言细节的繁琐。
高级语言同汇编语言都有一个共性,那就是:它们必须被转化为机器语言,这个转化的过程称为解释或编译。
(1)高级语言接近算法语言,易学、易掌握;(2)高级语言设计出来的程序可读性好,可维护性强,可靠性高;(3)高级语言与具体的计算机硬件关系不大,其程序可移植性好,重用率高;(4)高级语言自动化程度高,开发周期短,利于提高程序的质量。
(P138)3、列举程序设计语言的几种范型。
程序语言大致分为命令式程序设计语言、面向对象的程序设计语言、函数式程序设计语言和逻辑型程序设计语言等范型。
(P138-140)4、简述语言虚拟机。
提示:语言虚拟机是某种语言的解释器。
语言虚拟机是建立在硬件和操作系统之上,针对不同的硬件和操作系统有不同的虚拟机,通过语言虚拟机屏蔽掉硬件的差异。
这样使得硬件系统能够支持这种语言编写的程序的有效执行。
目前最流行的语言虚拟机是Java虚拟机。
(P147)5、计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么?提示:主要有编译、解释等方式,也有两种方式的混合使用的形式。
编译是使用编译器将高级语言编写的源程序转换成计算机可以执行的机器语言可执行程序,也可以理解为用编译器产生可执行程序的动作。
编译方式是一次编译,然后执行程序可以反复多次执行。
解释是另一种将高级语言转换为可执行程序的方式。
1 【C语言】《C语言程序设计教程(第二版)》习题答案说明1. 本文所指的《C语言程序设计教程(第二版)》是李凤霞主编、北京理工大学出版社出版的,绿皮。
2 第1章程序设计基础知识一、单项选择题(第23页)1-4.CBBC 5-8.DACA二、填空题(第24页)1.判断条件2.面向过程编程3.结构化4.程序5.面向对象的程序设计语言7.有穷性8.直到型循环9.算法10.可读性11.模块化12.对问题的分析和模块的划分三、应用题(第24页)2.源程序:main(){int i,j,k; /* i:公鸡数,j:母鸡数,k:小鸡数的1/3 */printf("cock hen chick\n");for(i=1;i<=20;i++)for(j=1;j<=33;j++)for(k=1;k<=33;k++)if (i+j+k*3==100&&i*5+j*3+k==100)printf(" %d %d %d\n",i,j,k*3);}执行结果:cock hen chick4 18 788 11 8112 4 843.现计算斐波那契数列的前20项。
递推法源程序:main(){long a,b;int i;a=b=1;for(i=1;i<=10;i++) /*要计算前30项,把10改为15。
*/ {printf("%8ld%8ld",a,b);a=a+b;b=b+a;}}递归法源程序:main(){int i;for(i=0;i<=19;i++)printf("%8d",fib(i));}fib(int i){return(i<=1?1:fib(i-1)+fib(i-2));}执行结果:1 123 5 8 13 21 34 5589 144 233 377 610 987 1597 2584 4181 6765 4.源程序:#include "math.h";main(){double x,x0,deltax;x=1.5;do {x0=pow(x+1,1./3);deltax=fabs(x0-x);x=x0;}while(deltax>1e-12);printf("%.10f\n",x);}执行结果:1.32471795725.源程序略。
第6章循环结构程序设计1.以下叙述正确的是()A、do-while语句构成的循环不能用其它语句构成的循环代替。
B、d o-while语句构成的循环只能用break语句退出。
C、用do-while语句构成的循环,在while后的表达式为非零时结束循环。
D、用do-while语句构成的循环,在while后的表达式为零时结束循环。
答案:D2.以下程序的输出结果是( )A、10,1 9,2B、9,8 7,6C、10,9 9,0D、10,10 9,1main( ){int x=10,y=10,i;for(i=0;x>8;y=++i)printf("%d,%d",x--,y);}答案:D注解:循环执行2次,由x控制循环的执行次数;输出值为两次循环过程中x每次的自减值和y在for语句的第三个表达式中得到的i自增变化后的值。
3.以下程序的输出结果是( )A、2 0B、3 1C、3 2 1D、2 1 0main( ){ int n=4;while(n--) printf("%d ",--n);}答案:A4.以下程序的输出结果是( )A、#*#*#B、#####C、*****D、*#*#*main( ){ int i;for(i=1;i<6;i++){ if(i%2) {printf("#");continue;}printf("*");}printf("\n");}答案:A注解:循环控制变量i的值从1变化到5,i为1、3、5时,i%2为1,if语句的条件为真,则执行if后的子句,输出#,然后执行continue语句,终止本次循环的执行,进入下一轮循环,i为2、4时,i%2为0,if语句的条件为假,则if后的子句并不执行,直接输出*,所以最后的输出为#*#*#。
5.以下程序的输出结果是( )A、编译不通过,无输出B、acegC、acegiD、abcdefghimain( ){ int i;for(i='A';i<'I';i++,i++) printf("%c",i+32);printf(" \n");}答案:B注解:循环控制变量i的取值为A、C、E、G,将它们转化为小写字母的格式输出。
6-1.比较while语句、do–while语句和for语句的异同。
答:(1)while语句、do-while语句用于条件循环,for语句用于计数循环。
(2)while语句、for语句是先判断循环条件,后执行循环体,如果循环条件一开始就不成立,则循环体一次也不被执行;而do-while语句是是先执行循环体,后判断循环条件,所以循环体至少被执行一次。
(3)知道循环的次数可选用for语句实现循环,不知道循环的次数可选用while语句或do-while语句实现循环.(4)一般而言,三种循环语句可等价实现.6-2 仔细阅读下面的程序,指出程序的运行结果.#include<stdio.h>void main(){ int i;for(i=0;++i;i<5){ if(i==3){printf("%d\n",++i);break;}printf("%d\n",++i);}}答:24思考:语句“for(“i=0;++i;i<5”)在编译时为何会给出语法警告错误?当将其改为“for(i=0;i<5;++i)”时,运行结果又将如何?6-3 仔细阅读下面的语的程序,指出程序的运行结果。
#include"stdio.h"void main(){ int i, a=0;for(i=1;i<=5;i++){do{i++;a++;} while(i<3);}i++;printf("a=%d,i=%d",a,i);}答:a=3,i=7思考:在for循环中嵌套着do-while循环,那么do-while循环中对i的修改会对for循环产生影响吗?6-4编写程序,用1000个单词”computer”填充屏幕,每行60个 .解:#include<stdio.h>void main(){ int i;for(i=1;i<=1000;i++){ printf("computer.");if(i%60==0)printf("\n");}}思考:在for循环中,”if(i%60==0)printf(“\n”);”语句的作用是什么?没有此语句将会是什么状况?6-5输入一行字符(以$结束),统计其中的数字字符、空格字符出现的次数。
第6章循环控制本章要求:1、初步熟悉用计算机解决问题的思路。
2、掌握while、do-while、for语句的特点和使用方法。
3、掌握break、continue语句的用法。
4、熟悉一些常见问题的算法及其C语言实现。
§6.1 概述循环:反复执行称为“循环体”的程序段。
循环控制常用于数学迭代、对象遍历等问题的求解,几乎所有实用程序都包含循环。
特别是在现代多媒体处理程序(图像、声音、通讯)中,循环更是必不可少。
Intel公司为了加快循环程序的执行,在CPU硬件中加入多媒体扩展指令MMX(Multi-Media-eXtension );AMD在CPU中加入3D Now!指令。
循环结构是结构化程序三种基本结构之一。
(顺序结构、分支结构)。
根据开始循环的初始条件和结束循环的条件不同,C语言中用如下语句实现循环1、用goto语句和if语句构成循环。
2、用while语句。
3、用do-while语句。
4、用for语句。
§6.2 goto语句一般形式:goto 语句标号作用:无条件转向“语句标号”处执行。
“语句标号”是一个标识符,它表示程序指令的地址。
goto语句不符合结构化程序设计准则,因为无条件转向使程序结构无规律、可读性差。
一般应避免使用goto语句,但如果能大大提高程序的执行效率,也可以使用。
[例6.1] 用if语句和goto语句构成循环,求。
main(){int i,sum=0;i = 1;loop:if (i <= 100){ sum = sum + i;i++;goto loop;}printf("%d",sum);}§6.3 while语句一般形式:while(表达式) 语句作用:实现“当型”循环。
当“表达式”非0(真)时,执行“语句”。
“语句”是被循环执行的程序,称为“循环体”。
特点:先判“表达式(条件)”。
[例6.2]main(){int i,sum=0;i = 1;whie (i <= 100){sum = sum + i;i++;}printf("%d",sum);}注意:1、注意给出循环的初始条件,如本例中“sum=0、i=1”。
第6章循环结构程序设计【计划课时】授课6课时+上机4课时6.1 概述循环是在循环条件为真时计算机反复执行的一组指令(循环体)。
循环控制通常有两种方式:·计数控制——事先能够准确知道循环次数时用之用专门的循环变量来计算循环的次数,循环变量的值在每次执行完循环体各语句后递增,达到预定循环次数时则终止循环,继续执行循环结构后的语句。
·标记控制——事先不知道准确的循环次数时用之由专门的标记变量控制循环是否继续进行。
当标记变量的值达到指定的标记值时,循环终止,继续执行循环结构后的语句。
在C语言中可用以下语句构成循环:if … gotowhiledo … whilefor6.2if … goto语句循环结构P106goto是一种无条件转向语句。
一般形式:goto标号;if … goto 可构成当型/直到型循环结构(尽量少用,以提高程序可读性/结构性)。
【例一】{int n=0,sum=0;loop: sum+=n;++n;if (sum<=10000) goto loop;printf(“n = %d\n”,n);}6.3 while 语句循环结构 P107一般形式 while (条件表达式) 循环体;用于构成当型循环:先判断后执行/条件为真继续循环,直到条件为假时结束循环。
【注意】条件表达式或循环体内应有改变条件使循环结束的语句,否则可能陷入“死循环”。
【例一】main() { int n=0; while (n<=2) { n++;printf(“%d”,n); } }结果:123【讨论】若去while 语句中的{},结果:3;若将n++移到printf 语句中,结果:012【例二】int n=0;while (n++<=2); printf(“%d”,n); 结果:4【讨论】n=3时,while 条件为假,结束循环,但比较后n 自加了一,所以n=4。
【例三】main() {int i=0; while (1) {printf(“*”); i++;【例二】 main() {int n=0,sum=0;loop: if (sum>=10000) goto end;sum+=n; ++n;goto loop;end: printf(“n = %d \n”,n);}if (i<3) break; }printf(“\n”);}}结果:*【讨论】若将if (i<3)改为if (i>3),结果:****【例四】编程实例研究:求解全班平均成绩问题描述:某个班中有n个学生,已知他们参加某次考试的成绩(0至100之间的整数),编程求全班学生在这次考试中的平均成绩。
思路:使用用自顶向下、逐步求精的技术,先用伪码表示问题的顶层:Determine the class average for the quiz (求解全班平均成绩)顶层只有一句(描述程序的整个功能,但未给出足够的细节)。
第一步求精——initialize variables (初始化变量)input,sum,count the quiz grades (输入各人成绩,求其总和,计数键入次数) calculate and print the class average (计算并输出全班的平均成绩)这里只用到顺序结构,即所列出的步骤是按顺序一个接一个执行的。
说明:如果用total表示总成绩,用counter表示键入成绩的次数,则使用前这两个变量应先初始化(设置为0)。
第二步求精:①伪码语句 initialize variables可作如下求精:initialize total to zeroinitialize counter to zero讨论:为什么只对这两个变量进行初始化?②伪码语句 input,sum,count the quiz grades可作如下求精:input the first gradewhile the user has not as yet entered the sentineladd this grade into the running totaladd one to the grade counterinput the next grade(possibly the sentinel)因为本例不知道要输入多少个成绩,所以程序必须能够处理任意个数的成绩。
程序如何判断何时终止输入成绩呢?方法之一是使用一个专门的值来指示数据输入的结束。
这个值称为“标志值”(sentinet value)。
由于考试成绩是非负的整数值,本例中将取-1为标记值。
③伪码语句 calculate and print the class average可作如下求精:if the counter is not equal to zeroset the average to the total divided by the counterprint the averageelseprint “No grades were entered”说明:被0除是一种致命的错误,如果不能明确检测并在程序中作适当的处理,将会导致程序执行失败(“崩溃”)。
当伪码算法详细到能够把伪码转换为C程序时,即可着手编写程序了。
参考程序如下:/*用标记控制的循环求全班平均成绩的程序*/#include <stdio.h>main( ){float average; /*变量声明*/int counter,grade,total;/*初始化阶段*/total=0;counter=0;/*处理阶段*/printf(“请输入成绩(用-1结束输入):”);scanf(“%d”,&grade);while (grade!=-1) {total=total+grade;counter=counter+1;printf(“(“请输入成绩(用-1结束输入):”);scanf(“%d”,&grade);}/*终止阶段*/if (counter!=0){average=(float)total/counter;printf(“全班平均值是%.2f”,average);}elseprintf(“还没有输入成绩!\n”);return 0; /*表明程序成功地结束*/}6.4 do … while语句循环结构P108一般形式 do {循环语句(组)} while (条件表达式);用于构成直到型循环:先执行后判断/条件为真继续循环,直到条件为假时结束循环。
【例一】main(){int n=0;do n++;while(n<5);printf(“%d”,n);}结果:5【讨论】如果将最后两句合成:do printf(“%d”,n++);while(n<5); 结果:01234【例二】求∑i =1+2+3+4…+99+100 (i=0~100)main(){int i=1,sum=0;do{ sum=sum+i;i++;} while (i<=100);printf(“Sum=%d\n”,sum);}【例三】从键盘输入一个整数,分析以下程序运行结果。
思路:若X为整数,则X%10可得X的个位数 X/10可得X的个位数移去后形成的新数如:125%10=5 → 125/10=12 → 12%10=2 → 12/10=1 → 1%10=0 → 1/10=0(结束)main(){int num,c;printf(“请输入一个整数:“);scanf(“%d”,&num);do{c=num%10; /*取得num的个位数*/printf(“%d”,c); /*输出num的个位数*/} while((num/=10)>0); /*直到num/10为0*/printf(“\n”);}结果:输入12456,输出65421(将各位数字反序显示出来)【讨论】如果while(num/=10>0),结果如何?陷入无限循环(输出无数个6)。
原因:num/=10>0中赋值号优先级最低,而num/(10>0)的结果除num=0(输出0)外均真。
6.5 for语句循环结构 P110一般形式 for (表达式1;条件表达式;表达式3){循环语句(组);}用于构成当型循环:先判断后执行/条件为真继续循环,直到条件为假时结束循环。
表达式1: 整个循环中只执行1次,常用来对循环变量设置初值条件表达式(表达式2): 其值为真(非0)时继续执行循环语句(组),否则结束循环表达式3: 常用于循环变量值的更新(循环体的一部分每次循环语句组执行完后执行一次)以下程序中执行几次循环?main(){ int i;for (i=2;i==0; )printf(“%d”,i++); }结果:0次【讨论】若i==2,结果为2,循环执行一次。
i为其他值时,同i==0。
【例二】求∑i =1+2+3+4…+99+100 (i=0~100)main(){ int i , sum=0;for (i=1;i<=100;i++) sum=sum+i;printf(“Sum=%d\n”,sum);}【例三】for ( a=1,i=-1; -1<=i<1;i++){ a++;printf(“%d”,a);}printf(“%d”,i);结果:-1【讨论】-1<=i<1为假(从左到右,-1<=i的值为1)【例四】for (i=0;i<3;i++)printf(“*”);printf(“%d”,i);结果:***3【例五】main(){ int a,i;for (i=0;printf(“a=”),scanf(“%d”,&a);i++) printf(“H”);}结果:a=1Ha=2Ha=6Ha=…(不管a为何整型数值,包括0,循环均不停止,但a为实型数值或字符等时,循环终止)scanf() 函数的返回值见P386。
正确输入时,返回数据个数,错误输入时返回0。
如c=scanf(“%d,%d,%d”,&a,&b,&c);如果a、b、c输入正确,c=3,否则c=0。
【讨论】如果for (i=0;printf(“a=”),scanf(“%d”,&a),a=a;i++) printf(“H”);则当a为0或-0时,循环结束(表达式2为逗号表达式,其值为最后赋值表达式的值。
【例七】下列程序段的for循环语句int i,x;for (i=0,x=0;i<=9&&x!=876;i++) scanf(“%d”,x);A)最多执行10次B)最多执行9次C)是无限循环D)循环体一次也不执行【例八】以下程序的输出结果是:main(){int y=10;while (y--);printf("y=%d\n",y);}A)y=0 B)y=1 C)y=随机值D)y=-16.8 break语句和continue语句 P114break在switch中退出switch结构/在循环中结束循环【例一】Array main(){int a,y;a=10,y=0;do { a+=2;y+=a;if (y>50) break;}while (a=14); /*每次循环到此 a值都为14*/printf(“a=%d,y=%d\n”,a,y);}结果:a=16,y=60②continue 循环“短路”(跳过循环体后面的语句,开始下一循环)。