程序设计入门——C语言(翁凯版)第三周

本文详细介绍了C语言中的if语句、判断条件、找零计算器示例、else与if-else语句的应用,以及while、do-while和for循环的基本概念和使用场景,强调了循环中的边界测试和调试技巧。
摘要由CSDN通过智能技术生成

3.1 判断

3.1.1 做判断:if语句

对于上次提出的计算时间差的问题,如果采用分别减的方法,然后判断是否出现借位,则以这样的思路可以的出这样的代码

	int hour1, minute1;
	int hour2, minute2;
	
	scanf("%d %d", &hour1, &minute1);
	scanf("%d %d", &hour2, &minute2);
	
	int ih=hour2-hour1;
	int im=minute2-minute1;
	if(im<0){
		im+=60;
		ih--;
	}
	
	printf("时间差是%d小时%d分。\n", ih, im);

输出

10 30
11 20
时间差是0小时50分。

结果显然是正确的。当im>0时,即没有出现借位,im等于分钟数直接相减,当im<0即出现借位时,运行if后面{}内的内容,将相减后的im加上60,ih减一。
这是if语句的格式

if(条件成立){
	...
}

3.1.2 判断的条件

在这里插入图片描述
注意"==“是关系运算,”="是赋值

  • 关系运算的结果只有1或0;
  • 关系运算优先级比算术运算低,比赋值运算高;
  • 其中==和!=的优先级比其他的低,连续的关系运算是从左至右的;

3.1.3 找零计算器

找零计算器需要用户做两个操作,即给出金额和票面,计算器会据此打印找零或告知余额不足。从计算机程序角度看,需要两个输入,然后进行计算和判断输出结果。
代码如下

	//初始化
	int price=0;
	int bill=0;
	//读入金额和票面
	printf("请输入金额:");
	scanf("%d", &price);
	printf("请输入票面:");
	scanf("%d", &bill);
	//计算找零
	if(bill>price){
		printf("应该找您:%d", bill-price);
	}

其中,//是注释,是对人类读者提供解释信息,只能用于单行。/**/是多行注释,也可用于单行。有了注释之后代码看起来更清晰。

//单行注释
/*多行注释用于单行*/
/*多行注释用于
多行*/

这段代码可以用流程图来表示
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d545f95431db46768cb9955666a746bc.png
黄圈表示if语句的部分。
老师又举了个年龄的例子,与找零计算器类似。
在这里插入图片描述
如果输入的年龄小于35,就会先输出一句话“年轻是美好的,”。

3.1.4 否则的话

上面的找零计算器如果钱不够程序会直接结束,但是如果想让程序在if判断结果为否时运行其它内容,就需要用到else。
代码改动如下

	//初始化
	int price=0;
	int bill=0;
	//读入金额和票面
	printf("请输入金额:");
	scanf("%d", &price);
	printf("请输入票面:");
	scanf("%d", &bill);
	//计算找零
	if(bill>price){
		printf("应该找您:%d", bill-price);
	} else{
		printf("你的钱不够\n");
	}

输出

请输入金额:100
请输入票面:80
你的钱不够

另一个例子,比较两数的大小
方案一

int max=0;
if(a>b){
	max=a;
}
if(b>a){
	max=b;
}

两个问题,一是当a=b时程序会出错,二是判断两数大小只需比较一次。
方案二

int max=0;
if(a>b){
	max=a;
}else{
	max=b;
}

方案三

int max=b;
if(a>b){
	max=a;
}

方案二更为清晰易懂,方案三更为聪明,孰优孰劣个人有个人的判断。

3.1.5 if语句再谈

  • if(total>amount)
    total+=amount+10;

if语句()后面没有“;”表示语句没有结束,要在下一行的赋值语句后加“;”以表示语句结束。
使用if和else语句时要注意{}内的内容。

3.2 循环

3.2.1 有些事就得用循环来解决

给一个整数,如何输出整数的位数呢?
如果题目明确四位数及以下正整数

if(x>999){
	n=4;
}else if(x>99){
	n=3;
}else if(x>9){
	n=2;
}

但是如果问题是任意范围的正整数,这种方法就不太可行了。
这里就要引出循环。
给出下面的代码

n++;
x/=10;
while(x>0){
	n++;
	x/=10;
}

这样就可以解决更大范围正整数的位数问题。

3.2.2 while循环

while和if语法结构相类似

if(x>0){
	x/=10;
	n++
}

while(x>0){
	x/=10;
	n++;
}

其中,while后面{}里面的内容叫做循环体,while语句的流程图如下
在这里插入图片描述

注意,循环体内要有改变条件的机会
在验证程序时,常使用边界数据,如有效范围两端的数据、特殊的倍数等,以及个位数、10、0、负数等。
在调试程序时,在程序适当位置插入printf,这样也许会省去debug。

3.2.3 do-while循环

do-while循环与while循环相比,区别在于do-while循环要先执行一边循环体,除此之外二者完全相同,尤其是()内的条件相同。
do-while的语法结构和流程图如下
在这里插入图片描述

3.3.4 for循环

for循环像计数循环,设定一个计数器并初始化,在计数器到达某值钱重复执行循环体,同时计数器值以一定步进行调整,比如加1或减1。如

  • for(count=10;count>0;count–)
  • 读成:“对于一开始的count=10,当count>0时,重复执行循环体,每一轮循环在做完循环体内语句后使count–。”

3.3.5 循环的选择

对于for(i=0;i<n;i++),循环次数为n,循环结束之后i=n,而对于for(i=1;i<=n;i++),循环次数 为n,循环结束之后i=n+1。
for循环和while循环有时是等价的。

for(int i=1;i++){
	fact*=i;
}

int i=1;
while(i<=n){
	fact*=i;
	i++
}

for循环的语法结构为
for(初始动作;条件;每轮的动作){
}
for循环中每一个表达式都可省略(分号必须有)。
for(;条件;)==while(条件)

tips for loops

  • 如果有固定次数用for;
  • 如果必须执行一次用do-while;
  • 其他情况用while。
  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值