if语句
if语句后面不加分号,默认情况下if和else语句后面只能跟一条语句,如果要使用多条语句,可以用{}将想要多条表达的式子放进去
#include<stdio.h> int main() { int num = 0; //输入 scanf("%d", &num);//一定别忘了取地址 //判断和输出 if (num % 2 == 1)//如果num 除以二余一,那么num 就是奇数 printf("%d 是奇数\n", num); else printf("%d是偶数\n", num); return 0; } #include <stdio.h> int main() { int num = 0; if (num == 0);//因为if语句里面的括号中的值是0,是假的,所以在此停止运行 printf("%d\n", num); return 0; } int main() { int age = 0; scanf("%d", &age); if (age > 18) { printf("成年\n"); printf("可以\n"); } else { printf("未成年\n"); printf("禁止\n"); } return 0; 默认情况下if和else语句后面只能跟一条语句,如果要使用多条语句,可以用{}将想要多条表达的式子放进去
在if else语句中,else可以与另一个if语句连用,构成多重判断 比如:要求输入一个整数,判断输入的整数是0,还是正数或者负数 int main() { int num = 0; scanf("%d", &num); if (num == 0) printf("输入的值是0"); else { if (num > 0) printf("输入的值是正数\n"); else printf("输入的数是负数\n"); } return 0; //适用于三种情况 或者使用else if int main() { int num = 0; scanf("%d", &num); if (num == 0) printf("输入的值是0"); else if (num > 0) printf("输入的值是正数\n"); else printf("输入的数是负数\n"); return 0; } int main() { int num = 0; scanf_s("%d", &num); if (num >= 0) { if (num == 0) printf("输入的值是0\n"); else printf("输入的值是正数\n"); } else { printf("输入的值是负数\n"); //里可以不加括号 } return 0; 题目:if 和else 嵌套 int main() { printf("请输入年龄"); int num = 0; scanf_s("%d", &num); if (num < 18) printf("少年"); else //num>=18(后面的num 都是大于18的) { if (18 < num && num < 44) //括号内可以输入num < 44 //18<num || num<44 printf("青年"); else//num>44 { if (45 < num && num < 59) printf("中老年"); else { if (60 < num && num < 89) printf("老年"); else { if (num > 90) printf("老寿星"); } } } } return 0; }
else总是和离他最近的if配对
if语句中,0表示假,非0表示真
操作符
相等运算符==
当一个变量和一个常量相比较的时候,建议将常量放在==左边,这样可以很好发现问题所在
三目操作符
int a = 3; int b = 4; int c = 7; if(a<c<b) //不能多个变量同时使用,对于a<c<b,,因为a<c成立,结果为1,但是1<4,结果就不成立了 多个关系运算符不宜连用 争取写法: if(a<b && b<c) //&&的意思就是并且的意思,两边表达式都满足 if(18<=age<=36),这种写法等同于if(1<=36),因为输入一个40,那么18就<=40,结果是真的,输出为1,然后就变成了1和36的比较了,结果为0,所以后面的打印就不工作了 int main() { int a = 0; int b = 0; scanf("%d", &a); /*if (a > 5) b = 3; else b = -3*/ b = (a > 5 ? 3 : -3);//替换上面的注释,如果a>5的情况下,b就等于3 不是的话就等于-3 上面的代码运用三目操作符 return 0; } 三目操作符的格式为:b = (exp1 ? exp2 : exp3);//如果exp1的话,那么b就等于exp2,不然b就等于exp3 计算逻辑:如果exp1为真,exp2计算,计算的结果是整个表达式的结果,如果exp1为假,exp3计算,计算的结果是整个表达式的结果 ///使用条件表达式实现找两个数字的最大值 三目操作符 #include <stdio.h> int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); int m = (a > b ? a : b); printf("m =%d\n",m); return 0; }
逻辑操作符
! : 逻辑取反运算符(改变单个表达式的真假)
&& :逻辑与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)
|| : 逻辑或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)
若a = 0,那么!a = 1
#include <stdio.h> int main() { int month = 0; scanf("%d", &month); if (month >= 3 && month <= 5) { printf("春天\n"); } return 0; }
#include <stdio.h> int main() { int month = 0; scanf("%d", &month); if (month == 12 || month == 1 || month == 2) { printf("冬天\n"); } return 0; }
能被4整除并且不能被100整除的是闰年 能够被400整除的是闰年 #include <stdio.h> int main() { int year = 0; scanf("%d", &year); if (((year%4==0) && (year%100!=0)) || (year%400==0))//将一二行的条件带入 { printf("%d 是闰年\n", year); } return 0; }
#include <stdio.h> int main() { int i = 0, a = 0, b = 2, c = 3, d = 4; i = (a++ && ++b && d++); printf("i = %d\n a = %d\n b = %d\n c = %d\n d = %d\n ", i, a, b, c, d); return 0; } //对于第四行的a++,因为是后置++,所以先带入a的值0进去,因为a=0,为假,后面的&&就无法继续进行判断了,所以只有a的值改变了,b和c的值没有改变,后置++,先带值进去,为0,假的,就短路了,然后再进行a的++,0+1=1,所以a的值就是1,i=0 int i = 0, a = 1, b = 2, c = 3, d = 4; 将a改为1,则输出结果就是 i = 1 a = 2 b = 3 c = 3 d = 5 因为i后面括号内的值都是真的,所以i=1 a=1的情况下 对于或者运算符,因为a++=1,为真,那么后面的就没有必要进行计算了,原先是多少就是多少 i = (a++ || ++b || d++); a=0的情况下 情况就不一样了,因为a++先带a进去,为0,假的,因为这里的符号是||,多以会继续往后面接着运行,因为b=2,++b=3,为真,就停止编译了
switch语句
字符类型也归类到整型家族,所以switch后面括号内可以是字符,因为字符的本质是ASCII值,因为ASCII的值是整数
就 //输入任意一个整数值,计算初3之后的余数 #include <stdio.h> int main() { int n = 0; scanf("%d", &n); if (n % 3 == 0) printf("余数是0\n"); else if (n%3 == 1) printf("余数是1\n"); else printf("余数是2\n"); return 0; } 另一种写法: #include <stdio.h> int main() { int n = 0; scanf("%d", &n); switch (n % 3) { case 0: printf("余数是0\n"); case 1: printf("余数是1\n"); case 2: printf("余数是2\n"); } return 0; } 输入6进去, 结果为: 余数是0 余数是1 余数是2 很明显,结果是不对的,因为在运行完每一个case后会继续往后计算的,所以应该在每个case中加上一个break,当结果计算出来就迅速停止,不往下面接着运行 调整后: #include <stdio.h> int main() { int n = 0; scanf("%d", &n); switch (n % 3) { case 0: printf("余数是0\n"); break; case 1: printf("余数是1\n"); break; case 2://这里的case和2一定要用空格分开,不然结果会有问题的 printf("余数是2\n"); break; } return 0; } 记住,break 后面一定要加分号 case决定我们从哪里进去,break决定我们从哪里出去 switch() //switch内的表达式一定要是整型表达式 case n: //case后面的n一定要是整型常量表达式 //输入1~7的数字,打印出对应的星期 #include <stdio.h> int main() { int day = 0; scanf("%d", &day); switch(day) { case 1: printf("星期一\n"); break; case 2: printf("星期二\n"); break; case 3: printf("星期三\n"); break; case 4: printf("星期四\n"); break; case 5: printf("星期五\n"); break; case 6: printf("星期六\n"); break; case 7: printf("星期日\n"); break; } return 0; } 为了更加简便 #include <stdio.h> int main() { int day = 0; scanf("%d", &day); switch (day) { case 1: case 2: case 3: case 4: case 5: printf("工作日\n"); break; case 6: case 7: printf("休息日\n"); break; } return 0; } 但是如果我们输入一些与case不相关的数字呢,怎么办? 我们就需要用default来提示用户信息输入错误 #include <stdio.h> int main() { int day = 0; scanf("%d", &day); switch (day) { case 1: case 2: case 3: case 4: case 5: printf("工作日\n"); break; case 6: case 7: printf("休息日\n"); break; default: //运用default来提醒用户 printf("输入错误,输入的值应该在1~7的范围"); } return 0; } default没有顺序要求,只要满足逻辑要求就行,也可以放在最前面,case1上面
while循环
一个整数%10的结果都是其各位数
#include <stdio.h> int main() { int i = 1; // 初始化 while (i <= 10) //判断 { printf("%d ", i); i++;//等价于i=i+1 //调整 } return 0; } 最先的数值是1,进去循环之后,就打印出来了,然后i++进行计算,输出2,2再进入循环,以此类推,不断循环。直到最后的数字不满足i <= 10这个循环就结束了
#include <stdio.h> int main() { int n = 0; scanf("%d", &n); while (n) //while(n!=0) { printf("%d ", n % 10); n = n / 10; } return 0; } 1234 % 10 =4,打印出4,然后下一行的1234 / 10 = 123,然后就相当于再次输入123进入,依次循环,最后得到我们输入的整数的逆序
while后面默认跟一条语句
//用while输入一个正整数,计算这个数是几位 int main() { int count = 0; int i = 0; scanf("%d", &i); while (i != 0) { i = i / 10; count++; } printf("%d", count); return 0; }
for循环
for语法形式如下:
for(表达式1;表达式2;表达式3)
表达式1:初始化表达式
表达式2:判断表达式
表达式3:调整
一次#include <stdio.h> int main() { int i = 0; for (i=1;i<=10;i++) // ->(表达式1;表达式2;表达式3) { printf("%d ", i); } return 0; } 对比while循环 #include <stdio.h> int main() { int i = 1; //表达式1 while (i <= 10)// ->表达式2 { printf("%d ", i); i++;//等价于i=i+1 //表达式3 } return 0; } 可以得出for循环的顺序 首先是表达式1进行初始化,然后表达式2进行判断,如果表达式2为真,那么就打印出来,再将打印出来的结果进行表达式3进行调整,再经由表达式2进行判断,再依次循环 for循环的初始化只执行
#include <stdio.h> int main() { int i = 0; int sum = 0; for (i = 1; i <= 100; i++)// 把1~100的数全部找出来 { /*printf("%d ", i);*/ //判断i是否是3的倍数 if (i % 3 == 0) sum += i; //等价于sum = sum + i //一开始的sum被定义为0,然后3的倍数依次加进去 } printf("%d\n", sum); return 0; } 另一种写法: #include <stdio.h> int main() { int i = 0; int sum = 0; for (i = 3; i <= 100; i+=3)// i+=3等价于i=i+3 { sum += i; //sum = sum +i } printf("%d\n", sum); return 0; }
do while循环
在循环语句中,do while用的很少
没有判断,直接执行语句
do while的循环体至少执行一次
#include <stdio.h> int main() { int i = 1; do { printf("%d ", i); //一上来直接打印 i++; //->i的调整 } while (i <= 10);//i的条件 return 0; }
int main() { int n = 0; int count = 0; scanf("%d", &n); do { count++; //因为count最开始的量被定义为0,随着n/10的次数,count每次就+1,也就代表这个数的位数 n = n / 10;// 假如第一次输入123,123/10=12,然后12再次进入循环,12/10=1,然后1再次进入循环,1/10=0,总共进行三次,也就说明count进行了3次count++,最后一次的结果是0,为假,最后不满足条件,就停止运行了,最后得到的count就是你输入值的位数 } while (n); printf("%d\n", count); return 0; }
break和continue语句
break:作用是用于永久的终止循环,只要break被执行,就会跳出循环,继续往后执行
continue:作用是跳过本次循环中continue后面的代码,在for循环和while循环中有所差异
int main() { int i = 1; while (i < 10) { if (i == 5) break; //添加break,使代码在i=5时停止继续 printf("%d ", i); i++; } return 0; } i=5后面的都无法打印
int main() { int i = 1; while (i < 10) { if (i == 5) continue; printf("%d ", i); i++; } return 0; } 直接跳过i=5,只会打印1234,5自身和后面的统统不打印 #include <stdio.h> int main() { int i = 0; while (i < 10) { i++; if (i == 5) continue; printf("%d ", i); } return 0; } 打印结果为1 2 3 4 6 7 8 9 10 i=5的时候直接跳过打印,仅仅是跳过5 #include <stdio.h> int main() { int i = 0; while (i <= 10) { if (i == 5) continue; //此处break用处相同 i++; // 跳过后面的i++和打印,到5就停止,停止+打印了,若是将i++放在if上面,结果就截然不同了,仅仅只有5没有打印 printf("%d ", i); } return 0; } 结果为12345 #include <stdio.h> int main() { int i = 1; do { if(i==5) break; printf("%d ", i); //一上来直接打印 i++; //->i的调整 } while (i <= 10);//i的条件 return 0; } 输出结果为1 2 3 4,不会打印5以后得数字,因为i=5的时候直接强制停止循环了
循环嵌套
1.产生100~200之间的数字 ---循环 2.去判断每一组数组是否是素数,是素数就打印 //我们需要判断这个数字是否是素数,是素数就打印 //判断i是否是素数,素数只能被1和自身整除的 //如果2~i-1之间有任何一个数字能整除i,i就不是素数 //如果2~i-1之间所有数字能不能整除i,i就是素数 int main() { int i = 0; for (i = 100; i <= 200; i++) { //printf("%d ", i);//每一次循环都会产生一个数字 int flag = 1; int j = 0; for (j = 2; j <= i - 1; j++) { if (i % j == 0) 如果2~i-1之间有任何一个数字能整除i,i就不是素数 //如果2~i-1之间所有数字能不能整除i,i就是素数 { flag = 0; //如果i % j == 0,那么flag就会被赋值为0,这个数字就不会往后计算下去了,break跳出去,换另一个数字 break; } } if (flag == 1) // ,最开始给flag赋的值就是1,如果flag仍然==1,那么这个数就是素数,如果flag没有被赋值为0,那么flag的值还是1,就说明这个数满足i % j != 0,后面就讲这个满足条件的数字打印出来 { printf("%d ", i); } } return 0; } 判断i是不是素数时,只要那2到根号i这个范围就好了 根号i如何写呢? sqrt(i) sqrt是一个库函数-----计算平方根 需要引入头文件//math.h 在代码开头添加#include <math.h> for (j = 2; j <= sqrt(i); j++)
goto语句
goto语句可以实现在同一个函数内跳转到设置好的标号处
在多层循环的代码中,如果想快速跳出,使用goto就非常方便了,用break跳出循环比较麻烦
int main() { printf("hehe\n"); if (1) goto end; printf("haha\n"); end: printf("end\n"); return 0; } 打印结果: hehe end 直接跳过haha again: printf("hehe\n"); goto again; 死循环打印hehe
shut down
-s关机
-t设置时间关机 秒
shutdown -s -t 60
//倒计时60秒关机
shutdown -a取消关机
system---库函数,可以执行系统命令,需要头文件stdlib.h
两个字符串比较相等时不能实用==
应该实用库函数strcmp,需要使用头文件:string.h
input是用来存你输入的字符串的
system会把你输入的这个字符串,看做命令执行
char 是说这个数组是一个char类型的数组,数组里面存的元素是一个一个字符char
#include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> int main() { char input[20] = { 0 }; system("shutdown -s -t 60"); again: printf("孩子,你的电脑将在1分钟之内关机,如果输入:’我是’,你就给你取消关机\n"); scanf("%s" , input); //判断input中存放的是不是’我是‘ if (strcmp("我是", input)==0)//stecmp负责比较输入的字符串和该判断的字符串是否相等,如果strcmp函数如果返回的是0,就表示这两个字符串相等,就表示input里面放的就是“我是傻逼” { system("shutdown -a"); } else { goto again; } return 0; } 另一种写法: int main() { char input[20] = { 0 }; system("shutdown -s -t 60"); while (1) { printf("孩子,你的电脑将在1分钟之内关机,如果输入:’我是’,你爹就给你取消关机\n"); scanf("%s", input); //判断input中存放的是不是’我是 if (strcmp("我是", input) == 0)//stecmp负责比较输入的字符串和该判断的字符串是否相等,如果strcmp函数如果返回的是0,就表示这两个字符串相等,就表示input里面放的就是“我是傻逼” { system("shutdown -a"); break; } } return 0; }