第4章:选择结构
C语言语句有五类
-
表达式语句:x = x + 1;z + x; [j = j + 3是表达式,不是语句]
-
函数调用语句:printf("hello");
-
控制语句:if语句,while语句,return语句等
-
复合语句:用{}括起来组成的一个语句 if(a>b){c=a;a=b;b=c;}
-
空语句:仅由一个“;”构成的语句
C语言是结构化程序设计语言
三种基本结构:①顺序结构②分支结构③循环结构 顺序结构:按语句书写的顺序执行
DIPO编程的一般过程
define(定义) input(输入) process(处理,计算) output(输出)
1.分支结构
- if语言————条件判断
if的两种形式
形式①:
if(表达式)
语句A;
功能:当表达式非0时,执行语句A,否则不执行语句A
形式②:
if(表达式)
语句A;
else
语句B;
功能:表达式为非0,执行语句A。表达式为0,执行语句B。
- if语句的嵌套
在if语句中又包含一个或多个if语句称为if语句的嵌套
if(表达式1)
if(表达式2)
语句1;
if(a>0)
if(b>0)
printf("%d\n"a,b);
说明:
①else与if必须成对出现,且else总是与最近的一个未配对的if配对
②如果if 与else的数目不同,为实现指定的操作,可以加花括号来确定配对关系
③内层的选择结构必须完整地嵌套在外层的选择结构内,两者不允许交叉。
- 嵌套的if语句结构
if(表达式1)
if(表达式2) 语句1;
else 语句2;
else 语句3;
if(表达式1)
{if(表达式2) 语句1;}
else 语句2;
if(表达式1)
语句1;
else if(表达式2) 语句2;
else 语句3;
- switch语句
switch()
{
case 常量表达式1:语句组1;break;
case 常量表达式2:语句组2;break;
...
case 常量表达式n:语句组n;break;
default:语句组n+1;
}
注意:
①switch后的表达式类型只能是整型、字符型或枚举型(不可以是浮点型)
②case后常量表达式的值必须各不相同,且不可有变量
③各语句组(可为一条或多条语句)不需用{ }括起
④default子句可在任意位置,当与所以case不匹配,则从default执行起
⑤default子句可省(此时若无常量值可匹配,不执行任何操作)
⑥switch语句可嵌套
⑦语法的角度,break语句并不是其中的必须成分
⑧允许多个case共用一组语句
多个case共用一组语句:
switch(x)
{
case 1:
case 2:
case 3:a++;b++;break;
case 4:c++;break;
}
2.循环结构
-
循环结构也称重复结构,是指在程序执行过程中需要反复执行的程序段
-
循环语句有三种:①while语句②do-while语句③for语句
- while语句
while语句用来实现"当型"循环结构
格式:while(表达式)
语句;(循环体)
特点:先判断,再执行,有可能一次也不执行
说明:①表达式必须用一对圆括号括起来,如果循环体包含一条以上的语句应用花括号括起来(或逗号表达式)
②在循环体内必须修改循环变量的值,否则死循环
③在循环体中,循环变量的值可以被引用、修改,但不能另赋新值(否则,可能造成死循环)
④循环体通常是一个复合语句,但也可以是一个空语句或单个语句
空语句:while(x++ < 100); //分号不能省
单语句:x = 10;
while(x- - >0)printf("%d",x);
输出:9 8 7 6 5 4 3 2 1 0
- for语句
格式:for(表达式1;表达式2;表达式3) [表达式3无分号]
例题:求1~100的和
#include <stdio.h>
int main()
{
int i=0; // 用于1到100循环的计数器。
int sum=0; // 用于存放累计的和。
// 循环从1到100,把全部的值累加起来保存到sum。
for (i=1;i<=100;i++)
{
sum=sum+i;
}
printf("sum=%d\n",sum);
}
特点:先判断,再执行,(当型循环)有可能一次也不执行。
- goto语句
格式: goto语句标号;
.....
标号:语句;
功能:无条件地将控制转移到标号所标识的语句处执行
说明:goto语句中必须有标号,语句标号命名规则同变量名(标识符)
- 循环的嵌套
在一个循环体内又包含有一个或多个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环即为多重循环
形式:
for( ; ;)
{
for( ; ;)
{ }
}
两种循环对比:
#include<stdio.h>
main()
{
int a=0,b=0,i,j;
for(i=1,i<=2,i++)
{
a++;
for(j=1;j<=3;j++)
b++;
}
printf("a=%d,b=%d\n",a,b);
}
#include<stdio.h>
main()
{
int a=0,b=0,i,j;
i=1;
while(i<=2)
{
a++;
j=1;
while(j<=3)
b++,j++;
i++;
}
printf("a=%d,b=%d\n",a,b);
}
打印九九乘法表!!!
#include <stdio.h>
int main() {
int i,j; // i, j控制行或列
for(i=1;i<=9;i++) {
for(j=1;j<=9;j++)
// %2d 控制宽度为两个字符,且右对齐;如果改为 %-2d 则为左对齐
// \t为tab缩进
printf("%d*%d=%2d\t", i, j, i*j);
printf("\n");
}
return 0;
}
说明:①嵌套要完整,不能交叉
②并列的循环变量可以同名
③嵌套的循环变量同名会英影响外循环
④三种循环语句可以相互嵌套,但不允许交叉
⑤循环与分支可以相互嵌套但不允许交叉
- break语句
格式:break;
作用:提前退出某个循环或跳出switch结构
退出当前switch语句
退出当前循环(在循环体中break语句一般与if语句搭配使用)
用法:只能在switch语句和循环体中使用
- continue语句
格式:continue;
作用:结束本次循环,使程序回到循环条件,接着进行下一次是否执行循环的判定
说明:只能用于循环结构中,常与if语句联合起来使用,以便在满足条件时提前结束本次循环
注意:①在while和do-while结构中,在continue语句被执行之后立即进行循环条件的测试
②在for结构中,则先执行表达式3,然后进行循环条件的测试(表达式2)
例:break和continue的区别
- 几种循环的比较:
①三种循环可以互相代替,不提倡使用goto语句
如循环次数已知,明确始末点,一般用for语句;
如果循环次数是由循环体的执行情况确定的,则一般使用while或do-while语句
循环体至少执行一次时,用do-while语句,反之,如果循环体可能一次也不执行,选用while语句或for语句
②for、while属于当型循环(先判断后执行)
③do-while循环属于直到型循环(先执行后判断)
3.常用算法
- 枚举法(穷举法或试凑法)
①确定范围(最小)
②试(利用循环列举出范围内每种可能,一一尝试)
例题一:显示出正整数m的所有因子及因子的个数
①m的因子范围为1-m之间的整数
②设置变量i取1-m之间的每个整数,对i的每个取值进行判断
例题二:显示出正整数m和n的最大公约数(m≥n)
①m和n最大公约数的范围为n~1之间的整数
②设置变量i从n开始向1变化,当找到第一个能够同时整除m和n的数,即是m、n最大公约数
例题三:打印出所有的水仙花数
①范围为100~999
②设置变量n从100开始向999变化,每次循环中求n的各位数字的立方和是否等于n
例题四:百元买百鸡(100元买100只鸡)公鸡每只5元,母鸡每只3元,小鸡1元3只,可买公鸡、母鸡、小鸡各几只,有多少种买法?
分析:设公鸡、母鸡、小鸡的数量分别为x,y,z只
①买百只鸡:x+y+z=100(只)
②用百元钱:5x+3y+(1/3)z=100(元)
统分后:15x+9y+z=300
例题五:爱因斯坦阶梯
设有台阶若干,每跨2阶,最后余1阶,跨3阶余2阶,跨5阶余4阶,跨6阶余5阶,跨7阶正好到达阶梯顶部。问:这条阶梯最少共有多少阶?
例题六:判断整数m是否为素数
例题七:找出2~100间全部的素数
- 递推法(迭代法)
从初值出发,归纳出新值与旧值间的关系,利用循环来完成迭代,每次循环时都从旧值的基础上递推出新值,并由新值代替旧值
例题一:小猴有若干个桃子,每天吃掉现有数的一半多一个,到第七天要吃时只剩一个了,问小猴从第一天到第七天,每天桃子多少个?
例题二:已知数列成1,1,2,3,5,8,13,21,34,…。编一程序求该数列的第30项
例题三:累加,连乘
累加或连乘实际就是求若干个数之和或积,这些数之间有一定规律可寻
存放结果要由一个变量,用来存放累加结果的变量也成为累加器
累加器变量初始值应为0值
连乘积的变量应为1
例题一:计算1-100之间所有奇数之和
例题二:计算1-100能被3整除的数字个数
例题三:求s=1+12+123+…+123…n,n值通过键盘输入