逻辑类型和运算
第一部分 -逻辑类型
#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(警告)。这两种情况都不要出现,都需要解决。