版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计第3章程序控制结构第3章程序控制结构本章主要内容:C语言语句关系运算和逻辑运算顺序结构程序设计选择结构程序设计循环结构程序设计
一定要掌握C语言的基本语句,如赋值语句,函数调用语句,分支语句和循环语句,并能灵活使用这些语句设计各种结构的程序。
第3章程序控制结构实际问题的求解算法往往是复杂的,包括顺序的计算步骤,以及许多不同计算路径和一些重复的计算过程。这些计算路径的选择和计算过程的重复,需要某些条件的判断,因此,算法的流程是重要的。算法即问题的求解过程,最终要用计算机程序语言(如C语言)的程序来描述,也可以说需要用程序语言的语句实现。编写程序的过程中,算法的流程控制映射为程序的控制结构。在C语言中,程序的控制结构分为顺序结构、选择结构和循环结构,任何复杂的程序都是由这三种基本结构组成的。通过本章的学习,理解并掌握C语言中的语句类型和实现三种结构程序的语句的使用方法。3.1C语言语句
C语言语句可以看作计算机系统的操作指令,用来完成一定的操作任务。C语言语句可以分为以下5种类型。
1.表达式语句表达式语句由表达式加上分号“;”组成。其一般形式为:
表达式;例如:
x=y+z; /*赋值表达式加分号,赋值语句*/a=520; /*赋值表达式加分号,赋值语句*/
y+z; /*合法语句,但无实际意义*/
i++;++i; /*增1语句,i值增1*/
分号是C语言中语句的标志,一个语句必须以分号结束,没有分号,则不是语句。3.1C语言语句
2.函数调用语句由函数调用加上分号“;”组成。其一般形式为:
函数名(参数列表);
例如:
printf("\n");
调用库函数printf(),输出换行字符。
3.控制语句
C语言有9个控制语句,用于完成选择、重复和跳转操作等控制功能,以实现程序的各种控制结构。可分为三类:⑴分支语句:if、switch语句。⑵循环语句:for、while、do-while语句。⑶跳转语句:break、continue、goto、return语句。3.1C语言语句
4.复合语句复合语句是用花括号将若干语句组合在一起,又称为分程序,逻辑上是一条语句。复合语句的一般形式:
{语句1;语句2;…;语句n}
例如:
{ i++;
printf("%d\n",i);}5.空语句只有一个分号的语句称为空语句。它的一般形式是:
;空语句是什么也不做的语句。
if、while、for和do-while控制的语句只能是一条且必须有一条,所以这些语句的内嵌语句一般是复合语句或空语句。
3.2顺序结构程序设计顺序结构程序相对比较简单。这种程序中主要使用赋值语句及数据的输入和输出语句(函数)。程序运行时,依书写顺序,每条语句执行一次。本节主要介绍赋值语句数据输出函数数据输入函数
3.2.1赋值语句赋值语句是一个应用十分普遍且简单的语句。赋值语句的一般形式为:。
赋值表达式;赋值语句是一种表达式语句,在赋值表达式的后面加上一个分号,就构成了赋值语句。例如: c=a+b*8 i++ j+=5是赋值表达式,而
c=a+b*8; i++; j+=5;是赋值语句。3.2.2数据输出
一个完整的程序,通常要求具备输入和输出功能。数据离开主机称为“输出”,数据进入主机称为“输入”。如下图所示:C语言本身没有输入输出语句,输入输出操作是通过调用库函数来实现的。在C标准函数库中提供了这些函数,如scanf和printf函数等。使用输入/输出函数时,应在程序的开头写上命令:#include<stdio.h>1.字符输出函数(putchar函数)字符输出函数的一般形式为:
putchar(字符型或整型数据)主机CPU内存外设:如显示器、打印机、键盘、扫描仪、磁盘输出输入3.2.2数据输出
putchar()函数的功能是向终端(显示器)输出一个字符。其中,函数的参数(圆括号中的数据)可以是字符常量、变量或表达式,也可以是转义字符,还可以是整数。请看下面的程序:【例3-1】在屏幕上输出“BOY”。(演示)
#include<stdio.h>voidmain(){ chara,b,c;
a='B';b='O';c='Y';
putchar(a);putchar(b);putchar(c);}程序运行结果:BOY3.2.2数据输出【例3-2】输出换行字符。
(演示)
#include<stdio.h>voidmain(){ chara,b,c; a='B’;b='O’;c='Y’;;
putchar(a);putchar('\n');
putchar(b);putchar('\n');
putchar(c);putchar('\n');}程序运行结果:BOY3.2.2数据输出2.格式输出函数(printf函数)printf函数可以输出多个任意类型的数据。它的功能是在终端设备上按指定的格式输出数据。printf函数的一般形式为:
printf(格式控制串,输出项表)例如:printf(“x=%d,y=%d\n"
,x,y)①格式控制串通常由格式说明和普通字符两种内容。格式说明由“%”和格式字符组成,如%d、%f等,它指定所在位置输出数据的格式,实际输出的数据在输出项中给出。普通字符是希望原样输出的字符,其作用是说明、标注,使输出数据的意义更明确。如x=、y=、换行字符\n等。②输出项表是用逗号分隔开的若干个表达式(当然,也可以是常量或变量),表达式的值将在对应的格式说明处输出,表达式的类型应与格式说明要求的数据类型对应一致。请看下面的程序格式控制串输出项表3.2.2数据输出#include<stdio.h>voidmain(){
inta=123,b=456,c;/*定义整型变量a,b,c并初始化a,b*/
c=a;a=b;b=c;
/*将变量a和b的值交换*/
printf("a=%d,b=%d\n",a,b);}程序的输出结果是:a=456,b=123分析:printf()函数中的格式控制串是:"a=%d,b=%d\n",其含义是先输出“a=”,然后在第一个格式说明“%d”处按十进制整数格式输出第一个表达式的值,再输出“,b=”后,在第二个格式说明“%d”处按十进制整数格式输出第二个表达式的值,最后输出换行字符“\n”。格式说明与表达式的对应关系如下图所示:
printf("a=%d,b=%d\n",a,b);3.2.2数据输出③格式说明及其作用如下表所示:3.2.2数据输出④格式说明中还可以使用格式修饰符,其一般形式为:
“%m.n格式字符”如:printf("x=%5d,y=%7.2f",x,y);格式修饰符及其作用如下表所示:例3-3分析下面程序的输出3.2.2数据输出#include<stdio.h>voidmain(){inti=-1;longl=-1;unsignedu=65535;floatf=123.456;charc='a';
printf("i=%d,i=%o,i=%x,i=%u\n",i,i,i,i);
printf("l=%ld,l=%lo,l=%lx,l=%lu\n",l,l,l,l);
printf("u=%d,u=%o,u=%x,u=%u\n",u,u,u,u);
printf("f=%f,f=%7.2f,f=%-7.2f\nf=%e,f=%g\n",f,f,f,f,f);
printf("c=%c,c=%3c,c=%-3c\n",c,c,c);
printf("s=%s,s=%7.3s,s=,%-.3s\n","12345","12345","12345");
printf("x=%d,y=%c\n",'a',65);}3.2.3数据输入数据输入指的是程序运行时,通过输入设备(键盘)为程序提供数据。相应的,在程序中就要使用数据输入函数。与输出函数对应,常用的输入函数有:字符输入函数(getchar)和格式输入函数(scanf)。1.字符输入函数(getchar函数)getchar函数与putchar函数的作用正好相反,它的功能是从输入终端设备(一般指键盘)上读取(输入)一个字符。getchar函数的一般形式为:
getchar();功能是从终端设备输入(读取)一个字符,函数的值为输入的字符。可以将这个值赋给一个字符(或整型)变量,从而将这个字符保存起来。在程序中的使用形式一般为:charc;…c=getchar();3.2.3数据输入例3-4键盘输入一个小写字母,输出对应的大写字母。#include<stdio.h>voidmain(){ charc;
c=getchar(); c=c+32;
putchar(c);}程序运行情况:a(键盘输入)A(程序输入)3.2.3数据输入2.格式输入函数(scanf函数)scanf函数可以通过键盘输入多个任意类型的数据。它的功能是按指定的格式从键盘上输入数据。scanf函数的一般形式为:
scanf(格式控制串,地址表列);例如:格式控制串的含义与printf函数中的基本相同,例中“%d%d”表示要从键盘输入两个整数;&x和&y是分配给变量x和y存储空间的起始地址。该函数调用的作用是从键盘上输入2个整数(%d指定整数),将其存储在地址&x和&y所指定的存储区域中,可以理解为从键盘上输入2个整数,存储在变量x和y中。请看下面的示例内存………&x&yxyscanf("%d%d”
,&x,&y);格式字符串地址表列项3.2.3数据输入例3-5输入矩形的两个边长,求矩形的面积。#include<stdio.h>voidmain(){
intw,h,a; /*变量定义*/
printf(“输入矩形的长和宽:”); /*输出提示信息*/
scanf("%d%d",&w,&h);/*从键盘输入2个整数*/
printf("Areais%d\n",w*h); /*输出结果*/}程序运行如下:68(键盘输入68后,按回车,数据之间用空格分隔)Areais48程序运行时,当执行到scanf函数调用时,程序暂停运行,等待用户从键盘上输入数据,当用户按格式要求输入数据并按回车键后,数据将被保存在地址指定的存储区域中,或者说数据被赋值给“&”后的变量中。有关scanf函数的格式说明详见教材,下面是几点说明:3.2.3数据输入①地址表列是用逗号分隔的若干个地址。②程序运行时,若输入数据个数少于格式说明要求的数据个数时,程序将等待继续输入,直到满足要求;反之,多余数据将作为下一个输入函数的输入数据。③在格式控制串中,如果没有格式说明以外的字符,则输入的数据之间用空格、TAB(制表键)或回车分隔。例如:scanf("%d%d%d",&a,&b,&c);输入的数据可以有多种形式:第1种:102030↙第2种:10↙2030↙第3中:1020(按Tab键)30↙3.2.3数据输入④如果在格式说明中含有普通字符,输入数据时,这些普通字符不会显示到屏幕上,而是要求将这些普通字符也原样输入。例如:scanf("%d,%d",&x,&y);格式串中有一个逗号,输入的两个数据之间也要一个逗号,如:6,8又如:scanf("x=%d,y=%d",&x,&y);输入数据的形式应是:x=6,y=8再如:scanf("%d:%d:%d",&tt,&mm,&ss);输入数据的形式应是:15:25:50如果需要在屏幕上显示一些输入数据的提示信息,可以使用printf函数,例如:printf(“Pleaseinputa,b,c:");scanf("%d,%d,%d“,&a,&b,&c);⑤可以指定输入数据的宽度,系统自动截取所需的数据长度,但不能指定实型数据的宽度。例如:scanf("%2d%3d",&a,&b);当输入12345时,系统自动将12赋给a,将345赋给b。而:scanf("%6.3f",&a);是错误的。3.2.3数据输入⑥使用“%c”格式输入字符时,输入的空格、回车或转义字符都是有效的字符。例如:scanf("%c%c%c",&x,&y,&z);当输入abc时,系统将字符a赋给x,将第一个空格字符赋给y,将字符b赋给z。⑦scanf函数从键盘输入数据时,若遇与格式要求不一致的字符,则认为与该格式说明对应的数据结束。例如:scanf("%d%c%f",&a,&b,&c);执行该函数调用时,若输入1234a1234.5↙格式控制串中的%d要求输入连续的数字,在读取1234后遇字母a,整数读取结束,将1234保存在变量a中;%c要求读取一个字符,将字符a保存在变量b中;其后的1234.5按%f格式读取,保存在变量c中。若在1234和字母a之间有一个空格,则读取并存储在变量a,b,c的数据依次是:1234、空格和0。3.2.4程序举例例3-6输入三角形的三边长,求三角形的面积。分析:已知三角形的三边长度求三角形的面积,要使用海伦公式:C语言源程序如下:#include"math.h"voidmain(){ floata,b,c,s,area;
printf("输入三角形的三边长度:");
scanf("%f,%f,%f",&a,&b,&c); s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c));
printf("a=%7.2f,b=%7.2f,c=%7.2f\n",a,b,c);
printf("arae=%7.2f\n",area);}3.3选择结构选择结构又称分支结构,是程序结构中重要的一种结构类型。在程序设计时,当需要进行选择、判断处理时,就要用到分支结构。C语言中有两种实现选择控制的语句:条件分支语句(if语句)开关分支语句(switch语句)这两种语句各有其特点,前者用于两个分支的选择,后者则适合于多分支选择。无论是if语句,还是3.4节介绍的循环语句,都要使用控制条件,在此先介绍用于描述条件的关系表达式和逻辑表达式。3.3.1关系运算符与关系表达式
1.关系运算符在程序中经常需要比较两个量的大小关系,以决定程序下一步的工作。比较两个量的运算符称为关系运算符。C语言中有6种关系运算符:
>(大于)、>=(大于或等于)、<(小于)、<=(小于或等于)==(相等)、!=(不等)
关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。。
2.关系表达式用关系运算符将两个表达式连接起来,就构成了关系表达式,即:
表达式1关系运算符表达式2
关系表达式的值只有两个,“真”和“假”。关系成立时,表达式的值为真(用整数1表示),否则为假(用整数0表示)。关系运算符两边的表达式可以是任意表达式。例如:
3>5关系不成立,表达式的值为0(假)5>=3关系成立,表达式的值为1(真)(3>5)<=(5>=3)关系成立,表达式的值为1(真)10%2==0关系成立,表达式的值为1(真),说明10能被2整除
year%4==0关系成立时,说明变量能被4整除3.3.2逻辑运算符与逻辑表达式1.C语言有三个逻辑运算符!(逻辑非)⑵、&&(逻辑与)⑾、||(逻辑或)⑿逻辑非、逻辑与、逻辑或的含义可解释为汉语中的否定、并且、或者。2.逻辑表达式由逻辑运算符及其操作数构成的表达式称为逻辑表达式。由这三个逻辑运算符和操作数构成逻辑表达式的一般形式为:!操作数操作数1&&操作数2操作数1||操作数2操作数可以是常量、变量、函数和表达式。无论操作数的值如何,均理解为“真”(非0)和“假”(0)两个值。逻辑运算的运算规则如下表所示。3.3.2逻辑运算符与逻辑表达式在程序中,逻辑表达式主要用来构成复杂条件。例如:⑴“x是非负偶数”的条件可表示为:x>=0&&x%2==0⑵“某年y是闰年”的条件可表示为:
y%4==0&&y%100<>0||y%400==0逻辑表达式求值时,若前面的操作数(左操作数)能够确定表达式的值,则后面的操作数将不再求值。设x=1,y=2,z=3,则逻辑表达式(x>=y)&&(z++)的值为0(假),且z的值不变。这是因为关系表达式x>=y的值为0,根据逻辑与的运算特点将不再对表达式z++求值。若将表达式中的逻辑与(&&)改为逻辑或(||),请分析逻辑表达式的值和变量z的值。练习:⑴设m,n,a,b,c,d均为零,求解(m=a==b)||(n=c==d)后,m,n的值是__①0,0②0,1③1,0④1,1⑵设m,n,a,b,c,d均为1,求解(m=a>b)&&(n=a>b)后,m,n的值是__①0,0②0,1③1,0④1,13.3.3if语句if语句有下面3中使用形式:1.if(表达式)语句控制过程如右图所示,如果表达式的值非0,则执行圆括号后的语句,否则继续执行if语句的下一条语句。例3-7输入一个整数,输出其绝对值。voidmain(){ intx;
scanf("%d",&x);
if(x<0)x=-x;
printf("%d\n",x);}if语句中的表达式可以是任意表达式。语句可以是单一语句,也可以是复合语句。如果if语句控制的不是单一语句,一定别忘记使用花括号将要控制的语句括起来构成复合语句。3.3.3if语句2.if(表达式)语句1else语句2控制过程如右图所示,如果表达式的值非0,则执行圆括号后的语句1,否则执行else后的语句2。例3-8输入2个整数,输出其中的较大值。voidmain(){
intx,y;
scanf("%d,%d",&x,&y);
if(x>y)printf("%d\n",x); elseprintf("%d\n",y);}程序中的两条printf()函数调用语句,在程序的一次运行中,只执行其中的一条。所以,if…else…语句的功能是在两条被控制的语句中选择其中的一条执行。3.3.3if语句3.if语句的嵌套形式if语句控制的语句本身又是if语句,这种情况称为if语句的嵌套。嵌套形式又可分为两种:规则嵌套和任意嵌套。规则嵌套的一般形式if(表达式1)语句1elseif(表达式2)语句2……elseif(表达式n)语句nelse语句n+1被嵌套的if语句固定在else下,这种嵌套结构又称为elseif结构,控制过程如右图所示:请看下面的应用示例:3.3.3if语句例3-9输入一个四则运算符,即+、-、*、/中的任意一个,输出对应的英文单词:plus、minus、multiply、divide,若输入了其他字符,则输出三个问号。#include<stdio.h>voidmain(){ charc;
printf("Enteracharacter:"); c=getchar(); if(c=='+')printf("\nPlus!\n"); elseif(c=='-')printf("\nMinus!\n"); elseif(c=='*')printf("\nMultiply!\n"); elseif(c=='/')printf("\nDivide!\n"); elseprintf("\n???\n");}3.3.3if语句任意嵌套的一般形式内嵌的if语句可以是前面介绍的3中形式之一,如果内嵌的if语句没有else部分,则要特别注意if与else的配对关系:else总是与它前面最近的还没有配对的if语句配对。请分析下面if语句的嵌套关系。if(…)
if(…)语句1
else语句2else
if(…)语句3else语句4内嵌的if内嵌的if注意:书写格式不决定控制关系。如果程序员希望第一个if与第一个else配对,则应写成:if(…)
if(…)语句1else
if(…)语句3else语句4嵌套关系是if(…)
if(…)语句1
else
if(…)语句3else语句43.3.3if语句if(…){if(…)语句1}else
if(…)语句3else语句4
使用花括号将内嵌的if语句括起来,限定内嵌if语句的范围。请看下面的应用示例:3.3.3if语句例3-10输入一个字符,判断其是否是A(Abort)、R(Retry)或F(Fail),并输出相应的信息。#include"stdio.h"voidmain(){ charc;
printf("Abort,Retry,Fail?"); c=getchar();
if(c>='A'&&c<='Z'||c>='a'&&c<='z')
if(c=='a'||c=='A')printf("Abort!\n");elseif(c=='r'||c=='R')printf("Retry!\n");elseif(c=='f'||c=='F')printf("Fail!\n");elseprintf("Otherletter!\n"); elseprintf("%cisnotalette!\n",c);}3.3.4switch语句用if语句的嵌套可以实现多分支的选择,但有些情况下使用switch语句来解决多分支选择问题更加方便有效。switch语句又称开关语句,它的一般形式如下,控制过程如右图所示:switch(表达式){case常量表达式1:
语句组1break;case常量表达式2:
语句组2break;…case常量表达式n:
语句组nbreak;default:
语句组n+1}表达式语句组1break;语句组2break;…语句组nbreak;语句组n+1常量1常量2…常量n首先计算表达式的值,然后依次与每一个case后的常量值进行比较,一旦相等,就执行该case后面的语句组,直到遇到break语句为止。如果表达式的值与所有case后的常量值都不相等,则执行default后面的语句组。3.3.4switch语句例3-11输入一个字符,判断其是否是A(Abort)、R(Retry)或F(Fail),并输出相应的信息。#include"stdio.h"voidmain(){charc;
printf("Abort,Retry,Fail?");c=getchar();
switch(c){ case'a': case'A':printf("Abort!\n");break; case'r':case'R':printf("Retry!\n");break; case'f': case'F':printf("Fail!\n");break; default:printf("Othercharacter!\n");}}分析:去掉程序中的break语句,程序运行结果如何?3.3.5程序举例例3-12写程序,判断某年是否是闰年。分析:用变量y存储年号,leap存储闰年信息。若是闰年,使leap=1,否则leap=0,最后判断leap的值,输出是否是闰年的信息。#include"stdio.h"voidmain(){
inty,leap;
printf("输入年号:");
scanf("%d",&y); leap=(y%4==0)&&(y/100!=0)||(y/400==0);
if(leap)printf("%d年是闰年\n",y); elseprintf("%d年不是闰年\n",y);}分析程序中赋值语句的作用?3.3.5程序举例例3-13写程序,求键盘输入的形式为:xopy
的算术表达式的值。其中:x、y是整数,op是一个算术运算符,例如,输入:100+200,则输出:100+200=300。#include"stdio.h"voidmain(){
intx,y;charop;
printf("输入一个算术式:");
scanf("%d%c%d",&x,&op,&y);/*注意格式串*/
switch(op){case'+':printf("%d+%d=%d\n",x,y,x+y);case'-':printf("%d-%d=%d\n",x,y,x-y);case'*':printf("%d*%d=%d\n",x,y,x*y);case"/':if(y!=0)printf("%d/%d=%d\n",x,y,x/y);elseprintf("除数为0\n");default:printf("输入的个算术式错误\n");}}/*请分析程序有什么问题?如何修改?*/3.4循环结构所谓循环就是有规律的重复某些操作。循环语句能够控制计算机重复执行指定的程序段。C语言提供了三种循环语句,它们是:while语句do~while语句for语句这三种语句在大多数场合可以置换使用,但在功能和用法上各有特点,在使用过程中要仔细体会。熟练掌握前一节的条件语句和本节的循环语句的使用,将有助于编制较复杂的程序。3.4.1while循环语句while语句的一般形式为:
while(表达式)语句控制过程如右图所示,如果表达式的值非0,则重复执行圆括号后的语句,直到表达式的值为0。例3-14求一系列非负整数的累加和。#include"stdio.h"voidmain(){
intx,s=0;
scanf("%d",&x);
while(x>=0)
{
s=s+x;
scanf("%d",&x);
}
printf("sum=%d\n",s);}/*注意循环结束的条件*/3.4.1while循环语句例3-15求:1+2+3+…+100。分析:用变量s保存和值,使其初值为0。使变量n依次取值1、2、3、…直到100,n的值每变化一次,就将其值累加到变量s中。voidmain(){
intn,s=0; n=1; /*为n赋初值*/
while(n<=100) /*n的值没有超过100,循环*/
{
s=s+n; /*累加*/
n=n+1; /*n取下一个值数*/
}
printf("s=%d\n",s);}分析:①使n的值增1,有那些表达方法?s=s+n的另一种表达形式?②若变量n的初值为0,程序该如何修改?③若求:1+3+5+…+99,程序该如何修改?3.4.1while循环语句例3-16从键盘输入一系列字符,直到回车换行,统计其中字母、数字和其它字符的个数。分析:使用getchar函数从键盘读取字符,因getchar函数每次只能读取一个字符,使用循环重复读取,读取一个,判断一个;再设置3个计数器变量,初值为0,分别记录字母、数字和其它字符的个数。#include"stdio.h"voidmain(){
intletter,digit,other;charc;letter=digit=other=0;while((c=getchar())!='\n')
if(c>='A'&&c<='Z'||c>='a'&&c<='z')letter++;elseif(c>='0'&&c<='9')digit++;elseother++;printf("letter=%d\ndigit=%d\nother=%d\n",letter,digit,other);}/*注意循环条件和划线部分*/3.4.2do~while循环语句do~while语句的一般形式为:
do{
语句
}while(表达式);控制过程如右图所示。例3-17求一系列非负整数的累加和。#include<stdio.h>voidmain(){
intx,s=0; do{
scanf("%d",&x); /*输入一个数*/
s=s+x; /*累加*/
}while(x>=0); /*不要丢失分号*/
printf("sum=%d\n",s);}请与例3-14程序比较,有什么区别?用哪一种循环更合适?表达式语句假(0)真(非0)3.4.2do~while循环语句例3-18求:1+2+3+…+100。分析:用变量s保存和值,初值为0。使变量n依次取值1、2、3、…直到100,n的值每变化一次,就将其值累加到变量s中(与例3-15相同)。#include<stdio.h>voidmain(){
intn,s=0; n=1; /*为n赋初值*/
do{s=s+n; /*累加*/
n=n+1; /*n取下一个值数*/
}while(n<=100);/*n的值没有超过100,循环*/
printf("s=%d\n",s);}请与例3-15程序比较,有什么区别?用哪一种循环更合适?3.4.2do~while循环语句do~while语句与while语句的区别是:do~while语句先执行循环体,后判断循环条件,循环体至少执行一次;而while语句是先判断循环条件,后执行循环体,循环体可能一次也不执行(当第一次判断表达式的值就为零时)。若已知循环体至少执行一次,则两条语句可替换使用。例3-19输入两个正整数a,b(a≤b),求a至b的连续整数的累加和。
使用while语句:voidmain(){inta,b,sum=0;
printf("Inputa,b(0≤a≤b):");
scanf("%d,%d",&a,&b);
while(a<=b)sum+=a++;
printf("sum=%d\n",sum);}使用do~while语句void
main(){inta,b,sum=0;
printf("Inputa,b(0≤a≤b):");
scanf("%d,%d",&a,&b);do{sum+=a++;}while(a<=b);printf("sum=%d\n",sum);}从题目可知累加操作至少进行一次,所以使用do~while语句与while语句进行循环控制都很方便。
3.4.3for循环语句for语句的一般形式为:
for(表达式1;表达式2;表达式3)
语句控制过程如右图所示。例3-20求:1+2+3+…+100。#include<stdio.h>voidmain(){
intn,sum=0;
for(n=1;n<=100;n++)sum+=n;
printf("sum=%d\n",sum);}与例3-15和例3-18程序比较可知,循环前对变量n的赋初值操作和循环体中对变量n的修改操作在此例中作为for语句的表达式1和表达式3,使程序更加简洁、紧凑。3.4.3for循环语句for语句中的三个表达式必须用分号隔开,表达式可以缺省,但分号不能缺少。表达式1和表达式3通常是赋值表达式,用于为循环控制变量赋初值或修改这些变量的值。表达式2是循环的控制条件,值非0时,将重复执行其后所控制的语句。例3-21写一程序,输出0o~360o的弧度转换表。#definePI3.1415926voidmain(){
intdegree; doubleradians;
for(degree=0;degree<=360;degree++){ radians=(double)degree*PI/180.0;
printf("%d\t%f\n",degree,radians);}}修改程序,使度数的间隔为5o。下面以求:1+2+3+…+100为例说明for语句中表达式缺省的几种变化。3.4.3for循环语句①表达式1缺省voidmain(){intn,sum=0;n=1;for(;n<=100;n++)sum+=n;
printf("sum=%d\n",s);}②表达式3缺省voidmain(){intn,sum=0;for(n=1;n<=100;){sum+=n;n++;}
printf("sum=%d\n",s);}③表达式1和表达式3缺省voidmain(){intn,sum=0;n=1;for(;n<=100;)sum+=n++;
printf("sum=%d\n",s);}④3个表达式都缺省voidmain(){intn=1,sum=0;for(;;){sum+=n++;if(n>100)break;}
printf("sum=%d\n",s);}3.4.3for循环语句for语句在循环控制上等价于下面的程序段:表达式1;
while(表达式2){
语句表达式3;
}例3-15、例3-18、例3-20分别用while、do-while和for语句求1~100之间整数的累加和,请同学们自行比较。while、do-while和for语句各有其特点,多数场合可以替换使用。在重复次数未知的情况下,建议使用while或do-while控制循环;在重复次数已知或数据变化有规律时,使用for控制循环更方便。在实践中,for语句的使用更频繁一些。循环结构程序设计在程序设计过程中,一般都会用到循环结构。设计循环结构程序时应注意以下几点:①确定循环体。分析问题,找寻规律,确定要重复的操作,即确定循环体。例如,对求和问题,循环体一般是形如:是s=s+n的累加运算。②循环前的准备。通常要为循环体中用到的变量赋初值,以便程序的执行能进入循环或为循环处理作好准备。例如前面例子中为变量赋初值。③能正常结束循环。在循环体中,一定要有一些赋值操作,这些赋值操作使得循环条件在适当的时候由“真”变为“假”,这样才能使循环正常结束,除非使用break语句。④循环处理的结果。有些循环处理是求的一些结果,供后续程序使用或输出,如求和结束后输出和值;有些循环处理是边处理边输出,如将角度转换为弧度程序中的循环。3.4.4循环嵌套所谓循环嵌套指的是在一个循环的循环体中包含了另一个循环结构。例3-22分析程序的输出(根据程序运行结果分析程序的执行过程)。C程序中的三种循环语句(while循环、do~while循环和for循环)可以相互嵌套。要注意不能交叉,即一个循环结构要完整的包含在另一循环的循环体中。请看循环嵌套示例:voidmain(){
inta,b,c;for(a=0;a<=9;a++){
for(b=0;b<=9;b++){c=10*a+b;printf("%4d",c);}
printf("\n");}}内层循环的循环体外层循环的循环体,由一条for语句和一条输出换行的语句所构成的复合语句3.4.4循环嵌套例3-23写一程序,输入一个正整数n,输出是否为素数的信息。分析:判断正整数n是否为素数,最简单的方法是用[2,n-1]之间的所有整数去除n,若所有的整数都不能整除n,则n是素数,否则n不是素数。voidmain(){
intn,m;
printf("输入一个正整数(>1)");
scanf("%d",&n); m=2;
while(m<n&&n%m!=0)m++;
if(m<n)printf("%d不是素数\n",n); elseprintf("%d是素数\n",n);}上述程序中没有循环嵌套。现在,对上述程序修改,使程序能输出100以内的所有素数。3.4.4循环嵌套例3-24输出100以内的所有素数。分析:要输出100以内的所有素数,可采用枚举法,对2~100之间的整数依次进行判断,若是素数,则输出,否则继续判断下一个数。voidmain(){
intn,m;
for(n=2;n<100;n++){m=2;
while(m<n&&n%m!=0) m++;
if(m==n)printf("%4d",n);}}请设计程序验证歌德巴赫猜想:任意一个大于6的偶数都能写成两个素数之和。3.4.5goto、break和continue语句break和continue语句是用于switch、while、do~while和for语句中的辅助语句,单独使用没有意义。goto语句是语言的保留语句,结构化程序设计不提倡使用,只在一些特殊情况下使用。1.break语句break语句只能使用在switch语句和循环语句中,其功能是中断switch或循环的执行,从其所在的switch或循环中跳出。break语句的一般形式为:
break;break语句用在循环体中时,通常受条件语句的控制。例3-25分析程序输出,理解break语句的作用。voidmain(){intn,sum;for(n=1,sum=0;n<=100;n++){if(n==50)break;sum+=n;}
printf("sum=%d\n",sum);}3.4.5goto、break和continue语句2.continue语句continue语句只能用在循环语句中,其功能是结束本次循环体的执行,立即进行下一次重复。continue语句的一般形式为:
continue;continue通常也受条件语句的控制。例3-26分析程序输出,理解continue语句的作用。voidmain(){intn,sum;for(n=1,sum=0;n<=100;n++){if(n==50)continue;sum+=n;}
printf("sum=%d\n",sum);}3.4.5goto、break和continue语句3.goto语句goto语句是一条无条件转移语句,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 校园AI失物招领智能平台的跨部门协作与信息共享机制研究课题报告教学研究课题报告
- 2025年有机肥标准化生产报告
- 2026秋招:江苏盐业集团笔试题及答案
- 2026秋招:江苏联合征信公司笔试题及答案
- 2026秋招:江苏规划设计集团试题及答案
- 做账实操-游戏厅公司会计账务处理分录
- 2026秋招:吉林水投水业发展公司面试题及答案
- 复杂环境工程勘察技术体系概述
- 2026年防爆电气设备的使用及注意事项
- 2026年桥梁建设质量对耐久性影响的机制
- 2026国家电投招聘试题及答案
- 江西省赣州地区2023-2024学年七年级上学期期末英语试(含答案)
- 2024年人教版七7年级下册数学期末质量检测题(附答案)
- 2025 AHA 心肺复苏与心血管急救指南 - 第6部分:儿童基本生命支持解读
- 2026年大庆医学高等专科学校单招职业技能测试模拟测试卷附答案
- 中央财经大学金融学院行政岗招聘1人(非事业编制)参考笔试题库及答案解析
- 【8物(HY)期末】六安市舒城县2024-2025学年八年级上学期期末考试物理试卷
- 浇铸工安全生产责任制
- 钱大妈加盟合同协议
- 患者身份识别管理标准
- 2025陕西三秦环保科技股份有限公司经理层成员市场化选聘工作5人笔试历年参考题库附带答案详解
评论
0/150
提交评论