零基础学浙大翁恺C语言(3):判断与循环

零基础学C语言(3):判断与循环

根据比较的结果,决定做、还是不做某些动作,就要用到if语句。

if语句简言之:如果"( )"内的条件成立True,执行“{}”之间的语句,否则就跳过。

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

计算时间差

第二章中计算时间差,如1点40分和2点10分,如果还是采用小时和分钟分别减的方法,分钟会出现借位,分钟(im)会出现负数,这时候做一个调整,小时数-1,分钟数+60。

# include <stdio.h>

int main()
{
	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 + im;
		ih --;
	}
	
	
	printf("时间差是%d小时%d分。",ih,im) ; 
	
	return 0;
 } 

关系运算

在这里插入图片描述
关系运算的结果:

当两个值的关系符合关系运算符的预期时,关系运算的结果为1(True),否则为0(False)。

# include <stdio.h>

int main()
{
	printf("%d\n",5==3);  # 结果是0
	printf("%d\n",5>3);   # 结果是1
	printf("%d\n",5<=3);  # 结果是0
	return 0;
 } 

关系运算的优先级:

所有的关系运算符的优先级比算术运算的低,但是比赋值运算的高.

  • 7 >= 3+4 结果是1
  • int r = a>0;

判断是否相等的==!=的优先级比其他的低,而连续的关系运算是从左到右进行的

5 > 3 == 6 > 4    #结果是1 == 11
6 > 5 >4          #结果是1  > 40
a == b == 6       #先看a和6是否相等,相等出1,不相等出0,是否与6相等,均为0
a == b > 0    

找零计算器

  • 找零计算器需要用户做两个操作:输入购买的金额,输入支付的票面,而找零计算器则根据用户的输入做出相应的动作:计算并打印找零,或告知用户余额不足以购买。
  • 从计算机程序的角度看,这就是意味着程序需要读用户的两个输入,然后进行一些计算和判断,最后输出结果。

以两个斜杠“//”开头的语句(注释)把程序分成了三个部分:

  1. 初始化
  2. 读入金额和票面
  3. 加入if语句判断票面够不够,计算并打印找零
#include <stdio.h>

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

	return 0;
}

延续数行的注释,要用多行注释的格式来写。多行注释由一对字符序列“/”开始,而以“/”结束。
也可以用于一行内的注释int ak=47 /*36*/,y=9;

#include <stdio.h>

int main()
{

	const int MINOR = 35;

	int age = 0;

	printf("请输入你的年龄: ");
	scanf("%d", &age);

	printf("你的年龄是%d岁。\n", age);

	if ( age < MINOR ) {
    	printf("年轻是美好的,");
	}

	printf("年龄决定了你的精神世界,好好珍惜吧。\n");

	return 0;
}

if语句里面条件不符合时做什么,要用else语句,即否则的话。

#include <stdio.h>

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

	return 0;
}

比较数的大小

两个数中的最大值

#include <stdio.h>

int main()
{
	int a,b;

	printf("请输入两个整数:");
	scanf("%d %d", &a, &b);
	
	int max = 0;
	if ( a > b ) {
		max = a;
	} else{ max = b;
	}

	printf("大的那个是%d\n", max);

	return 0;
}

在这里插入图片描述
左边的方案足够傻,所有人都能看懂;右边的代码一开始就使max=b,更巧妙,但更难读懂。
在这里插入图片描述

三个数中的最大值

用到了嵌套的if-else语句,而且if语句里面如果"{}"内只有一句话的时候,是可以省略大括号的。

#include <stdio.h>

int main()
{
	int a,b,c;
	printf("请输入三个整数:");
	scanf("%d %d %d", &a, &b, &c);

	int max = 0;

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

	printf("The max is %d\n", max);

	return 0;
}

在这里插入图片描述

计算薪水

#include <stdio.h>

int main()
{
	const double RATE = 8.25;  
	const int STANDARD = 40;   
	double pay = 0.0;
	int hours;

	printf("请输入工作的小时数: ");
	scanf("%d", &hours);
	printf("\n");
	if (hours > STANDARD)
   		pay = STANDARD * RATE + 
   			(hours-STANDARD) * (RATE * 1.5);
	else
   		pay = hours * RATE;
	printf("应付工资: %f\n", pay);

	return 0;
}

判断成绩

#include <stdio.h>

int main()
{
	const int PASS=60;
	int score;

	printf("请输入成绩: ");
	scanf("%d", &score);
	
	printf("你输入的成绩是%d.\n", score);
	if ( score < PASS )
		printf("很遗憾,这个成绩没有及格。");
	else {
		printf("祝贺你,这个成绩及格了。");
		printf("再见\n");
	}

	return 0;
}

循环

if语句可以判断条件是否满足,满足时才做相应的动作,而循环语句可以在满足条件时,不断地重复执行一些动作。

重复执行的语句(循环语句)可以多次执行其他语句,它检查一个逻辑条件是否满足,只在满足的时候执行它的循环体。

while语句是一个循环语句,它会首先判断一个条件是否满足,如果条件满足,则执行后面紧跟着的语句或语句括号,然后再次判断条件是否满足,如果条件满足则再次执行,直到条件不满足为止。后面紧跟的语句或语句括号,就是循环体。

do-while循环和while循环很像,唯一的区别是我们在循环体执行结束的时候才来判断条件。也就是说,无论如何,循环都会执行至少一遍,然后再来判断条件。与while循环相同的是,条件满足时执行循环,条件不满足时结束循环。

数数几位数

程序要读入一个4位以下(含4位))的正整数,然后输出这个整数的位数。如:输入:352,输出:3

计算机判断的方式:判断数的范围来决定它的位数:352∈[100,999]—>3位

计算机描述的是步骤,不是关系,要一步一步地做,一步不成立再下一步,所以最好不要用多个if。

#include <stdio.h>

int main()
{
	int x;
	int n=1;
	scanf("%d",&x);
	if ( x > 999){
		n=4;
	}else if ( x >99 ){
		n=3;
	}else if ( x > 9 ){
		n=2;
	}else {
		n=1;
	}
	printf("这个数是%d位数",n);
	
	return 0;
}


12
这个数是2位数

任意范围的正整数怎么办?

先看一道三位数逆序的题.

三位数逆序的题

从左往右 352%100 --> 52,相当于把左边那位划掉。
从右往左 352/10 -->35 ,相当于把右边那位划掉。
那如果一直去掉最左边的数,不停地划,直到没数可划时…在这个过程中就可以计数了

#include <stdio.h>

int main()
{
	int x;
	int n=0;
	scanf("%d",&x);
	n++;
	x /=10;
	while (x>0){
		n++;
		x /=10;
	}
	printf("这个数是%d位数",n);
	return 0;
}


198627987
这个数是9位数
#if语句,执行一次
if (x>0){ 
	n++;
	x /=10;
}
#while语句,当条件满足时,不断地重复循环体内的语句
while (x>0){
	n++;
	x /=10;
}

从语法角度来看,if和while非常相似,但while后面还有花头。while"{}“里头的内容叫循环体。”()"内的条件判断满足时,就一直做循环体。而且循环体内要有改变条件的机会(这里是x /=10),否则就会一直循环。

验证:测试程序常使用边界数据,如有效范围两端的数据、特殊的倍数等
如:个位数 ; 10 ; 0 ; 负数。

#include <stdio.h>

int main()
{
	int x;
	int n=0;
	scanf("%d",&x);
	#验证去掉中间两行代码是否还正确?
	while (x>0){
		n++;
		x /=10;
	}
	printf("这个数是%d位数",n);
	return 0;
}

这种情况下x=0,n=0,没法处理,按理x=0是1位数,所以最开始的写法是对的。如果是负数,取正判断即可。

数位数的算法:
1.用户输入x;
2.初始化n为0;
3.x= x/ l0,去掉个位;
4. n ++;
5.如果x>0,回到3;
6.否则n就是结果。

do-while 循环语句

在进入循环的时候不做检查,而是在执行完一轮循环体的代码之后,再来检查循环的条件是否满足,如果满足则继续下一轮循环,不满足则结束循环。

	do
	{
		<循环体语句> 
	} while(<循环条件>) ;
	 

do-while循环和while循环很像,区别是在循环体执行结束的时候才来判断条件。也就是说,无论如何,循环都会执行至少二遍,然后再来判断条件。与while循环相同的是,条件满足时执行循环,条件不满足时结束循环。

下图中左:do while; 右: while
 (左:do while)(右: while)

#include <stdio.h>

int main()
{
	int x;
	scanf("%d",&x);
	int n=0;
	do
	{
		n++;
		x /=10;	
	 } 
	while (x>0);
	printf("这个数是%d位数",n);
	return 0;
}
	

这种情况0也成功判断成为1位数。

For循环

阶乘

写一个程序,让用户输入n,然后计算输出n!n! =1×2×3×4×...×n

先思考变量:显然读用户的输入需要一个int的n,然后计算的结果需要用一个变量保存,可以是int的factor,在计算中需要有一个变量不断地从1递增到n,那可以是int的i。

尝试使用while循环

#include <stdio.h>

int main()
{
	int n;
	scanf("%d",&n);
	int fact=1;
	
	int i = 1;
	while ( i <= n){
		fact *= i;
		i++;
	}
	
	printf("%d!=%d\n",n,fact);
	return 0;
}
5
5!=120

for语句

for语句的“()”中的内容,比while语句更复杂:
for(初始条件,循环继续的条件,循环每一轮要做的事情)

#include <stdio.h>

int main()
{
	int n;
	scanf("%d",&n);
	int fact=1;
	
	int i = 1;
	for( i =1; i<=n; i++){
		fact *= i;
	}
	
	printf("%d!=%d\n",n,fact);
	return 0;
}
	

for循环像一个计数循环:设定一个计数器,初始化它,然后在计数器到达某值之前,重复执行循环体,而每执行一轮循环,计数器值以一定步进进行调整,比如加1或者减1

for ( i=0; i<5; i=i+1) {
prinif("%d", i);
}

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

小套路:
做求和的程序时,记录结果的变量应该初始化为0,而做求积的变量时,记录结果的变量应该初始化为1。

循环控制变量i只在循环里被使用了,在循环外面它没有任何用处。因此,我们可以把变量i的定义写到for语句里面去。

看似美妙,但发现报错:for循环初始化的声明只能在C99里用,要给编译器一个特殊的选项。
在这里插入图片描述
try:
1×1还是1,所以程序的循环不需要从1开始,那么改成从多少开始合适呢?这样修改之后,程序对所有的n都正确吗?这样的改动有价值吗?——从2开始,第一次不进入循环,可以省去一轮循环。

#include <stdio.h>

int main()
{
	int n;
	scanf("%d",&n);
	int fact=1;
	
	int i = 1;
	for( i =2; i<=n; i++){  #仅改动了i=2
		fact *= i;
	}
	
	printf("%d!=%d\n",n,fact);
	return 0;
}

除了可以从1乘到n来计算n!,还可以从n乘到2来计算吧?试试把循环换个方向来计算n。这时候,还需要循环控制变量i吗?
——这时候不再需要i这个变量了,让n自己减小到2就行,但仍需要i暂时存一下初始n输出结果中i!。

#include <stdio.h>

int main()
{
	int n;
	scanf("%d",&n);
	int fact=1;
	
	int i =n ;
	for (;n>1;n--){           #省略了n=n;
		fact *=n;
	}
	 
	printf("%d!=%d\n",i,fact);
	return 0;
}
5
5!=120

for循环的循环次数

for ( i=0; i<n; i++ )循环的次数是n,而循环结束以后,i的值是n。循环的控制变量i,是选择从0开始还是从1开始,是判断i<n还是判断i<=n,对循环的次数,循环结束后变量的值都有影响。

#include <stdio.h>

int main()
{
	int i;
	
	for (i=1; i<=5; i++){
		printf("i=%d ",i);
	}
	printf("\n最后i=%d\n",i);
	
	return 0;
}
i=1 i=2 i=3 i=4 i=5
最后i=6

任何一个for循环都可以改写成一个while循环。
在这里插入图片描述

for (初始动作;条件;每轮的动作){
}

for中的每一个表达式都是可以省略的for(;条件;) == while (条件)

三种循环的选择

  • 如果有固定次数,用for
  • 如果必须执行一次,用do_while
  • 其他情况用while
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值