我是靠谱客的博主 落寞战斗机,最近开发中收集的这篇文章主要介绍【C基础】04 判断和循环一、判断二、 循环三、循环控制,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、判断

1、if语句

//形式1:单条执行语句
if (判断表达式)               //")"后不得有分号
   执行语句

//形式2:多条执行语句(复合语句)
if(判断表达式) {
	执行语句1
	执行语句2
	...
}                            //"}"后也不得出现分号
  • 计算两个值之间的关系,称为关系运算符。下表为常见的关系运算符

2、关系运算符

运算符意义
==相等
!=不相等
>大于
>=大于等于
<小于
<=小于等于
  • 关系运算的结果只有两种:整数1(结果为真)和整数0(结果为假)。
  • 所有的关系运算符的优先级都比算术运算符低,但是比赋值运算符高。判断是否相等的==和!=的优先级比其他的低,连续的关系运算从左到右进行运算。

3、if - else 语句

//形式1:单条执行语句
if (判断表达式) 执行语句 else 执行语句

//形式2:多条执行语句(复合语句)
if (判断表达式) {
	执行语句1
	执行语句2
	...
	} 
else {
	 执行语句1
	 执行语句2
	 ...
	 }

4、if 语句的嵌套

if (判断表达式1) {
	执行语句
	} if (判断表达式2) {
	  	   执行语句
	  	   } 
	  else {
	   	  执行语句
	      }
  • else和其最近的那个if匹配;
  • 缩进格式不能按时else的匹配关系;

建议:

  1. ifelse后面始终都加上{},即便只有一条执行语句的时候。
  2. 相匹配的ifelse位置对齐。

5、if语句的级联

if (判断表达式1)
	执行语句
else if (判断表达式2)
	执行语句
...
else if (判断表达式)
	执行语句
else
	执行语句

6、if语句的常见错误

1、复合执行语句时,忘了加大括号{}

  • 对策:永远都在ifelse后面加上大括号。

2、if后面加分号。即:

if (判断表达式);    
	  语句
//上下两种代码等价
if (判断表达式)
	  ;
	  语句

3、错误使用===

  • if只要求()里的值是零(判断为假)或非零(判断为真)

4、代码风格

  • ifelse之后必须加上大括号{}形成语句块;
  • 在大括号{}内的语句缩进一个tab的位置。

7、多路分支switch-case

格式:

switch (控制表达式) {            //控制表达式只能是整型值
	case 常量表达式 : 语句       //此处的"常量表达式"可以是常数,也可以是常数计算表达式,例如"2"或"1+1"均可  
	...
	case 常量表达式 : 语句
	default : 语句
}

举例:

switch(type) {
	case 1: 
		printf("type = 1");
		break;             //跳出判断
	case 2:                //"type"满足对应的值,直接跳转到相应的case语句处,而非从一开始从上到下顺序判断。
		printf("type = 2");
		break;            //跳出判断
	case 3: 
		printf("type = 3");
		break;            //跳出判断
	default:              //其他情况
		printf("type=其他值");
}

特别注意: case只是表示判断后的程序继续执行的起始位置,只是“入口”,不是将程序划分成段。若没有break则不再继续判断,不管此后的case的值是几,程序仍然顺序执行。例如如下程序:

// 此程序,type=1和type=2的输出结果是一样的,因为case 1:结束之后没有break。若case 2后没有break,则会继续执行case 3之后的语句。直到遇到break或"}"结束。
switch(type) {
	case 1:
	case 2:
		语句
		break;
	case 3:
		语句
		break;
	default:
		语句
}

二、 循环

1、while循环

while语句格式:

while(循环判断表达式) {
	循环语句
}

while循环流程图:请添加图片描述

  • 循环体内要有改变循环判断的条件的机会,否则会成为死循环
  • while循环的意思是,不断地重复循环体内的语句。
  • while循环执行之前判断是否继续循环,所以有可能循环一次也没有被执行。(与do-while不同)
  • 条件成立是循环继续的条件。

2、do-while循环

do-while 循环格式:

do {
	循环语句
} while(返回循环条件);   //此处必须有分号 (可以认为大括号{}自带分号)

do-while循环流程图:
请添加图片描述

  • do-while循环至少会进入循环一次(与while不同)

Tips:

  1. 注意循环的起始值和结束值;
  2. 要模拟运行一个很大次数的循环,可以模拟较少的循环次数,然后做出推断;
  3. 计算之前记得保存原始的值,后面可能有用。
  • 整数的分解(如何得到整数的各个位上的数字):
  1. 整数%10,得到个位数;
  2. 整数/10,得到十位数;
  3. 对2的结果%10,得百位数
  4. 。。。以此类推。
  • **求逆序数
  • :**
int x, digit;         //digit为末位数字
scanf("%d",&x);            //读取原数字

do {
	digit = x%10;           //得到末位数字
	printf("%d",digit);     //输出末位数字
	//ret  = ret*10 + digit;
	x /= 10;                //原数字移去最后一位
	}while(x!=0);

3、for循环

格式:

for (表达式1; 表达式2; 表达式3) {
	语句
}
//表达式1——初始(化)条件
//表达式2——循环继续(重复循环体)的条件
//表达式3——每次循环结束前的最后一步操作

以上for语句等价于下面的语句:

表达式1;
while(表达式2){
	语句
	表达式3;
}
  • for循环的3个表达式可以省略其中一个。

Tips:3种循环

  • 如果有固定次数,用for循环;
  • 如果必须执行1次,用do-while循环;
  • 其他情况用while循环。

三、循环控制

1、循环控制

  • break:跳出循环
    (完全跳出此循环,包括本轮和往后的轮数)
  • continue:提前结束本轮循环
    (跳过剩下的语句,直接进入下一轮)。

程序举例:

//判断素数程序
int x,i;
scanf("%d", &x);
int isPrime = 1;
for(i=2;i<x;i++){   //其实此处循环只需要从2到x的平方根之间就行了
	if(x%i == 0){
		isPrime = 0;
		break;   //只要存在能被1和其本身之外的数整除,则结束循环
	}
}
if(isPrime == 1) printf("是素数");
else printf("不是素数");

2、多重循环

(1)循环嵌套

  • 在每一层循环中,控制循环的变量应当各不相同,否则会报错。

程序举例:

//判断素数程序
int x;
for(x=1;x<=100;x++){
	int i;
	int isPrime = 1;
	for(i=2;i<x;i++){
		if(x%i == 0){
			isPrime = 0;
			break;   //只要存在能被1和其本身之外的数整除,则结束循环
		}
	}
	if(isPrime == 1) printf("%d ",x);
}

(2)嵌套循环的跳出

  • breakcontinue都只能对其所在的那一层循环做操作,当存在循环嵌套时,非其所在的其他层循环仍要继续,不会被跳过。
  • 多重嵌套的跳出最合适的方法是goto语句。其余情况尽量不要用,否则会破坏程序的结构性,导致可读性很差。

方法一:接力break

程序举例:

//用1角、2角和5角化钱,找到一种解决方案即可
int x;
int one; two; five;
int exit = 0;  //判断break是否接力的变量
scanf("%d", &x);
for(one = 1;one<=x*10;one++){
	for(two = 1;two<=x*10/2;two++){
		for(five = 1;five<=x*10/5;five++){
			printf("%d元等于%d个1角+%d个2角+%d个5角",x,one,two,five);
			exit = 1;    //找到则改变接力变量
			break;
		}
		if(exit) break;  //判断是否接力
	}
	if(exit) break;  //判断是否接力
}

方法二:goto语句

基本结构:

【标号语句】 标识符 : 语句 //注意冒号
【goto语句】 goto 标识符;

程序举例:

for(one = 1;one<=x*10;one++){
	for(two = 1;two<=x*10/2;two++){
		for(five = 1;five<=x*10/5;five++){
			printf("%d元等于%d个1角+%d个2角+%d个5角",x,one,two,five);
			goto out;  //out为跳出的标号
		}
	}
}
out:  //跳出位置,注意冒号结尾

3、循环应用

(1)前n项求和

程序举例:

//求f(n) = 1-1/2+1/3-1/4+...+1/n
int i,n;
int sign = 1;    //更换正负号
double sum=0.;
scanf("%d",&n);
for(i=1;i<=n;i++){
	sum += sign*1./i;
	sign = -sign;   //交替改变极性
}
printf("f(%d) = %fn",n,sum);

(2)整数分解

//整数分解:例如输入10340,输出1 0 3 4 0
int x;
scanf("%d",&x);

int mask = 1;  //mask存储10的倍数
int t = x;
//对于不同位数的x,求与其位数相同的mask。例如输入100342,mask=100000
while(t>9){
	t /= 10;
	mask *= 10;
}
printf("x=%d, mask = %d", x, mask);
do{
	int d = x / mask;
	printf("%d",d);
	if(mask>9){      //mask为此语句的判断条件,而非x
		printf(" ");
	}
	x %= mask;
	mask /= 10;
}while(mask>0);  //mask为此循环的判断条件,而非x

(3)求最大公约数

  1. 枚举法:
int a,b,i;

for(i=1; i<a&&i<b; i++){
	if(a%i==0 && b%i==0) ret = i;
}
printf("%d和%d的最大公约数为%d", a,b,ret);

2.辗转相除法

思路:

  • 如果b等于0,计算结束,a既是最大公约数;
  • 否则,计算a与b的余数,让a等于b,而 b等于那个余数;
  • 回到第一步。

演示代码:

//辗转相除法求最大公约数
int a,b,ret;
scanf("%d %d",&a,&b);
while(b!=0){
	ret = a%b;
	a = b;
	b = ret;
}
printf("最大公约数为%d",a);

最后

以上就是落寞战斗机为你收集整理的【C基础】04 判断和循环一、判断二、 循环三、循环控制的全部内容,希望文章能够帮你解决【C基础】04 判断和循环一、判断二、 循环三、循环控制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部