程序设计入门——C语言学习笔记Lecture 2

Lecture 2 判断与循环

1. 关系运算

在这里插入图片描述

  • 注意相等是 = = == ,要与赋值 = = 区分(初学者最易错);关系运算的结果只有1和0两种
  • 所有关系运算符的优先级都比算术运算低,但是比赋值运算高
  • 判断是否相等的==和!=的优先级比其他的低,连续的关系运算是从左到右进行的

2. 循环

  • 循环体内要有改变条件的机会(避免死循环)。
  • 可以通过在循环中加入printf(" in loop\n");调试程序,判断是否进入循环
  • 分类:while循环;do-while循环;for循环
    for (i=1; i<10; i++)
    for (初始条件; 循环继续的条件; 循环每轮要做的动作)

a. for循环 == while循环

以下两种循环等价
/***for循环***/
for (int i=1; i<=n; i++) //for括号内定义变量仅适用于C99
{
	fact *= i;
}
/***while循环***/
int i = 1;
while (i<=n)
{
	fact *= i;
	i++;
}

b. Tips for loops

  • 如果有固定次数(起点终点明确),用for
  • 如果必须执行一次,用do-while
  • 其他情况用while.

c. 小套路

  • 做求和的程序时,记录结果的变量应该初始化为0;而做求积的变量时,记录结果的变量应该初始化为1。
  • 计算之前先保存原始的值,后面可能有用,例如:
int x;
int ret = 0;

scanf("%d", &x);
int t = x; //用t记下x的原始值,在输出中会用到
while (x>1)
{
	x /= 2;
	ret++;
}
pirntf("log2 of %d is %d.\n", t, ret);

3. 逻辑运算

  • bool变量
    #include <stdbool.h> 之后就可以使用bool和true、false
  • 逻辑运算是对逻辑量进行的运算,结果只有0或1;
  • 逻辑量是关系运算或逻辑运算的结果;
a.用C语言表示x∈(4, 6)
常见错误:4<x<6  
上式表示:首先判断4<x,其结果是一个逻辑值(01),再与6作比较,因此4<x<6的结果恒为1
正确写法:x>4 && x<6

b.判断一个字符c是否是大写字母?
c >= ‘A’ && c <= ‘Z’
  • 常用运算符的优先级
    在这里插入图片描述

4. 短路

  • 逻辑运算是自左向右进行的,如果左边的结果已经能决定结果,就不会做右边的计算。对于&&,左边是false就不会做右边了;对于||,左边是true就不做右边了。
  • 不要把赋值,包括复合赋值组合进表达式,如a == 6 && b += 1

5. 特殊运算符

a. 条件运算符

count = (count > 20) ? count - 10 : count + 10; 等价于:

if (count > 20)
{
	count = count - 10;
}
else 
{
	count = count + 10;
}

自右向左结合
尽量不要使用嵌套的条件表达式

b. 逗号运算符

  • 逗号用来连接两个表达式,并以其右边的表达式的值作为它的结果,逗号的优先级是所有的运算符中最低的,所以它两边的表达式会先计算;逗号的组合关系是自左向右,所以左边的表达式会先计算,而右边的表达式的值就留下来作为逗号运算的结果。
  • 用处:在for中使用, for (i=0, j=10; i<j; i++, j--)

6. if嵌套(if里面包含if)

  • if级联(if——else if——else if……) 写代码时将else缩进成一列
  • Tips:在if或else后面总是用{},即使只有一条语句

7. switch-case

在这里插入图片描述

a. break vs continue

在这里插入图片描述
break 和 continue只能对它所在的那层循环做;
continue:跳过循环这一轮剩下的语句进入下一轮;
break:跳出循环;
如果想跳出多层循环,可以使用接力break或goto

b. 接力break

//拼钱游戏,使用一角、两角、五角拼成一元两元等;
#include<stdio.h>

int main()
{
	int x;
	int one, two, five;
	int exit = 0;
	
	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++)
			{
				if( one + two*2 + five*5 == x*10)
				{
					printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n",
					one, two,five,x);
					exit = 1;
					break;//有一种方案成立就退出,就不用再输出其他的方案
				}
			}
			if(exit == 1) break;
		}
		if(exit == 1) break;
	}
	return 0;
}
//关于类似以上代码的缩进问题,依据个人习惯即可;
//有一种说法是以上缩进的代码,如果再加几个循环的话,屏幕会不够用。

c. goto

#include<stdio.h>

int main()
{
	int x;
	int one, two, five;
	
	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++)
			{
				if( one + two*2 + five*5 == x*10)
				{
					printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n",
					one, two,five,x);
					goto out;
				}
			}
		}
	}
out:
	return 0;
}

8. 正整数的分解

在这里插入图片描述
详细程序实例:整数的分解(逆序输出与正序输出)

9. 嵌套循环

  • 控制循环的变量不能相同
  • 求最大公约数:枚举法;辗转相除法
发布了46 篇原创文章 · 获赞 84 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43871127/article/details/104246678