C语言学习第4周-深入判断与循环

逻辑类型和运算

第一部分 -逻辑类型

#include<stdbool.h>,声明这个之后就可以使用bool、ture、false。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdbool.h>

int main()
{
	bool b = 6 > 5;
	bool t = true;//实际上C语言中没有真正布尔量的类型,
	t = 2;//在这里让t=2,编译也是可以过的,说明这里的bool量实际上还是整数变量,
	printf("%d\n", b);//这里并不会打印出来true,而是打印的1。
	printf("%d\n", t);//这里打印出来的还是1。
	return 0;
}

第二部分 -逻辑运算

C语言中可以做四则运算:加减乘除。可以做关系运算:大于,小于,大于等于,小于等于,不等于 。可以作赋值运算:=。  还可以做逻辑运算:与或非。

逻辑运算只是对逻辑量进行运算,运算的结果只有0或1。 

逻辑量是关系运算或逻辑运算的结果。

如果要写出数学区间x∈(4,6),或  x∈[4,6]。这个是重点请不要写成4<x<6,这样的式子,应该写为,x>4&&x<6,这里的顺序是x在前,这样的式子才表示(4,6)。

逻辑运算的优先级:!>&&>||。这个   ! age<20,这个该怎么运算。

所有的运算优先级对比如图

 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int a = 0;
	int gameover = 0;
	if (a == 1){
		if (gameover == 1){
			printf("你是正确\n");
		}
	}
	return 0;
}

上面的程序以后就可以写成如下程序

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int a = 0;
	int gameover = 0;
	if (a == 1&&gameover==1){

	  printf("你是正确\n");
	}
	return 0;
}

短路:  逻辑运算是自左向右进行的,如果左边的结果已经能够决定右边的结果了,就不会做右边的运算了。如:a==6&&b==1,如果a==6为假,那么就不会进行右边的与运算了。

所以,对于&&,如果左边为fales,那右边就不用做了。对于||,如果右边为true,那右边就不用做了。所以不要把赋值,包括复合赋值组合进表达式里面。

第三部分 -条件运算和逗号运算 

 条件运算:m<n  ?  a  :   b,这个条件运算知道即可,它的意思是如果m<n,成立为a,否则为b。

逗号运算:i=3+4,5+6;这个里面     i是等于7,逗号隔开后会把3+4赋给i。

                 如果是i=(3+4,5+6);那么会把逗号后面的5+6赋给i。注意区分!!!

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int i;
	i = 3 + 4, 5 + 6;
	printf("%d\n", i);//这个的打印结果为7。

	int j;
	j = (3 + 4, 5 + 6);
	printf("%d\n", j);//这个的打印结果为11。
	return 0;
}

 级联和嵌套的判断

 第一部分 -嵌套的if--else 

 注意点是else是和最近的if匹配。嵌套就是包含的关系,级联就是一层一层的关系。如下是一个嵌套的示例,选出三个数中最大的那个数。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	printf("请输入三个数字\n");
	scanf("%d %d %d", &a, &b, &c);
	if (a > b){
		if (a > c){
			printf("最大的数字是%d\n", a);
		}
		else{
			printf("最大的数字是%d\n", c);
		}
	}
	else{
		if (b > c){
			printf("最大的数字是%d\n", b);
		}
		else {
			printf("最大的数字是%d\n", c);
		}
	}
	return 0;

}

 第二部分 -级联的if--else 

在数学中的分段函数中,会用到if--else 的级联。级联示例如下,要注意不要把赋值运算符写成等号。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int f;
	int x=0;
	printf("请输入一个x\n");
	scanf("%d", &x);
	if (x > 0){
		f = 3;
	}
	else if (x == 0){      //这一行要注意赋值运算符==,不要写成=了。
		f = 4;
	}
	else{
		f = 2*x;
	}
	printf("f的值为%d\n",f);
	return 0;
}

多路分支

第一部分-多路分支 

if--else多种情况的级联如下: 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int type = 0;
	printf("请输入一个type\n");
	scanf("%d", &type);
	if (type == 1){
		printf("早上好\n");
	}
	else if (type == 2){
		printf("中午好\n");
	}
	else if(type==3){
		printf("下午好\n");
	}
	else{
		printf("啊,这是什么\n");
	}
	return 0;
}

用switch-case语句实现以上的功能,程序如下

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int type = 0;
	printf("请输入一个type\n");
	scanf("%d", &type);
	printf("您输入的type的值为%d\n", type);
	switch (type){
	case 1:
		printf("你好\n");
		break;
	case 2:
		printf("中午好\n");
		break;
	case 3:
		printf("下午好\n");
		break;
	default:
		printf("啊,什么啊");
	}
	return 0;
}

switch   case语句的标准形式:

switch (控制表达式){        //控制表达式只能是一个整数类型的结果
	case 常量:             //常量可以一个常数如  case 2:
		                   //常量也可以是一个常数计算表达式  case 1+1:或者case type:   
		语句;
		......
	case 常量:
		语句;
		......
	case 常量:
		语句;
		......
	default:
		语句;
	}

switch case语句的特点

switch (type){   
	case 1:                               
	case 2:
		printf("上午好\n");
	case 3:
		printf("中午好\n");
		break;
	default:
		printf("啊,什么呀\n");
	}
	return 0;

上述情况的解释:switch语句可以看作是一种基于计算的跳转,计算控制表达式的值后,程序会跳转到相匹配的case分支标号处,分支标号只说明色switch内部位置的路标。在执行完分支中最后一条语句后,如果后面没有break,就会顺序执行到下面的case里去,知道遇到一个break,或者switch结束为止。如果case中没有break,那就一直运行到switch结束为止。

问题    成绩转换:如果成绩大于90为A,如果成绩为80-90之间为B,....这个程序改怎么写。

可以使用else..if..来写如下:

if (score > 90){
		printf("A\n");
	}
	else if(score>80){
		printf("B\n");
	}
	else if (score > 70){
		printf("C\n");
	}
	else{
		printf("啊,什么啊\n");
	}

用switch语句应该怎么写呢:要先观察问题的特点,然后处理后用switch语句。

int main()
{
	//成绩转换:如果成绩大于90为A,如果成绩为80-90之间为B,依次类推。
	int score = 0;
	char i;
	printf("请输入一个score\n");
	scanf("%d", &score);
	//我们可以先观察一下这个的特点,当分数的十位数字为9时,成绩为A。以此类推。
	score = score / 10;
	switch (score){
	case 9:printf("A\n");break;
	case 8:printf("B\n"); break;
	case 7:printf("C\n"); break;
	case 6:printf("D\n"); break;
	default:printf("不及格\n");
	}
	return 0;
}

循环举例 

第一部分-循环计算

 编程作为一门语言它不难,无非是加减乘除,输入输出,条件语句,循环语句。就这些东西很少很简单,规则也很简单。编程难在哪,难在想问题,难在怎样把问题变成程序,怎样处理再解决问题的过程中的一些细小的问题,这是编程难的地方。

先说一个小套路:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	//问题是计算logX这样的
	int x;
	int a = 0;
	printf("请输入一个需要计算的数\n");
	scanf("%d", &x);
	while (x > 1){
		x /= 2;
		a++;
	}
	printf("log以2为底%d的对数为%d\n", x, a);
	return 0;
}

 从打印结果上来看这个输出的计算结果是没有错的,但是输出的这就句话是有问题的,表达的意思不是我们想要的,所以程序就有问题的。因此要做一下修改才能达到我们的预期。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	//问题是计算logX
	int x;
	int a = 0;
	printf("请输入一个需要计算的数\n");
	scanf("%d", &x);
	int i = x;
	while (x > 1){
		x /= 2;
		a++;
	}
	printf("log以2为底%d的对数为%d\n", i, a);
	return 0;
}

 改完之后的程序就是我们预期想要的结果了,这里要提醒一下首先5/2并不是等于2.5  ,因为x是一个整数变量,所以运算结果是2。

第二部分-算平均数

我们写一个程序的流程是:变量——>算法——流程图——>程序

变量就是我们有什么数据要读进来,要做计算,要处理的。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	//算平均数的程序
	int number;
	int sum = 0;
	int count = 0;
	scanf("%d", &number);
	do{
		if (number != -1){
			sum += number;
			count++;
		}
	} while (number != -1);
	printf("%d\n", sum / count);//这个地方写成%d没有问题,因为sum和count都是整数。
	//如果需要浮点数的话,可以这样写
	//printf("%f\n",1.0*sum/count);这样会把sum变为浮点数,进而count也会变为浮点数。
	return 0;
}

第三部分-猜数

rand()和printf(),scanf()一样是C语言中<stdio.h>库中的一个函数。rand()函数是帮助我们产生一个随机数的。我们在调用rand()函数的时候,每次产生是数都是非常大的,我们在这里可以运用一个现小技巧就是使用取余。一个无论多大的数,假如这个数是X,对X取余。X%100,这个计算无论多大的数都可以得到一个100以内的数字。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
	srand(time(0));
	int a = rand();
	printf("%d\n", a);
	return 0;
}

这段程序会产生一个随机数,当我们想要一个100以内的数字就可用取余的方法。

第四部分-整数求逆序

对于任意位的一个整数,求它的逆序。

首先就是算法:该怎么操作,因为是任意位数,所以就要采用循环来解决。假设这个任意位数是数字为x,个位数=x%10,然后让x=x/10,可得出十位数为除完10后的x再取余,就可以得到十位数了。百位数,千位数....以此类推。程序如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int x;
	int res=0 ;
	int digit = 0;
	printf("请输入一个任意位数的数字\n");
	scanf("%d", &x);
	while (x > 0){
		digit =x % 10;
		res = res * 10 + digit;
		x /= 10;
	}
	printf("该数字逆序数为%d\n", res);
	return 0;
}

判断和循环常见的错误 

 if后面{ }有时可能会忘记,为了防止这个错误,我们可以在每个if 或else后面都加上{ }。

错误类型一:在if后面加;分号。

if (age > 50);
	{
		salary = age*1.25;
		printf("%f",salary);
	}

错误类型二:==写成=,关系运算符写成了赋值运算符。

C语言报错有两种,一种是error(错误),一种是warning(警告)。这两种情况都不要出现,都需要解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值