基础语法就不讲述了,只写一些自己觉得关键和易错的地方
选择语句:if、if……else、if……elseif……else、switch
循环语句:for、while、do……while
goto语句:跳转到指定的标签位置,从标签位置开始执行代码(一定要慎用),且只能在函数内部进行跳转
// 关机程序,程序运行起来后,1分钟内关机,如果输入我是猪,就取消关机 int main(void) { char arr[20] = {0}; system("shutdown -s -t 60"); printf("你的电脑还有一分钟关机,输入我是帅哥,将取消关机\n"); renew: // goto跳转标签 printf("请输入我是帅哥>"); scanf("%s", &arr); if (strcmp(arr, "我是帅哥") == 0) { system("shutdown -a"); } else { goto renew; // goto语句 } return 0; }
1. 不论在上面的哪个语句的条件判断中,0为假,非0为真
2. 条件判断中,判断一个变量是否等于一个常量,可以写为常量 == 变量;的形式,这样可以最大限度保证条件判断语义正确, 例:变量 = 常量,理论上只要常量不是0那么都会进入控制语句中
3. 使用switch语句时,每一个case都要注意写break;,防止出现穿刺现象;当然不同题目要具体分析,但是加上break;是不会出现穿刺问题的
4. switch的条件参数,只能接受整型或者字符型(字符型本质上也是整型ASCII码)以及其类型的变量,而case的值只能是整型常量或字符常量
5. default子句的作用:当case中没有一个能与条件参数匹配上的时候,就执行default子句中的代码,有一个能兜底的
6. break;退出,但是注意只能退出一层,不能退出多层控制语句。同时也有一个例外的控制语句if,在if中使用break会直接跳过if后退出一层
7. continue;继续,跳过当前循环continue语句后面的代码,直接执行下一次循环
8. 明确知道循环次数使用for循环,不知道循环次数使用while循环
9. for(;;) for循环中判断部分省略会导致判断恒成立,循环将进入死循环
10. 可以使用多个变量控制循环 例:for(int x = 0, int y = 0; x < 2 && y < 5; ++x, y++){}
补充
float类型的初始化 float i = 0.0f; 后面需要加f,因为0.0默认是double类型,只有加上f编译器才会认为是float类型
scanf()函数的输入域宽 scanf("%2d", a); %2d的意思是从输入中获取两个整型,其余的不要
printf()函数的输出域宽 printf("%02d", a); %02d的意思是打印两个整型,如果不够两个则从左边依次补0
float保留小数输出 printf("%.2f", i); %.2f的意思是输出一个float类型的数,且输出保留两位小数
%lf 表示的是double类型的格式化字符
时间戳:计算机内部的时间到至今有多少秒
也学习到了两个新的函数getchar()和putchar()
getchar():读取输入缓冲区中的一个字符并将其返回出去,如果是文件末尾或读取错误,则返回一个EOF, 接收返回值的类型标准规定是int
putchar(参数1):打印输出
getchar()的原理:执行到之后会去输入缓冲区获取字符,如果缓冲区有字符,直接读取;如果没有则需要用户从键盘输入回车后再从输入缓冲区读取;此时千万注意,输入缓冲区中有至少两个字符,一个你输入的,另外一个是回车\n。 你从键盘输入只是显示出来,并没有进入输入缓冲区,只有当你按下回车键,才会真正进入输入缓冲区,这个时候就会有两个

getchar()的作用:通过循环语句的配合,清空输入缓冲区里的数据
二分查找法(非常重要的一个查找思想)
使用二分查找法有一个非常重要的前提:必须是一个有序的数组
二分查找法的原理:直接从中间开始判断是否是我要找的数,如果不是,提示大还是小,缩小范围,而后继续在更新后的范围内查找中间值,比较大小,再次缩小范围,直到整个数组都被排除掉
下面是一个案例,根据自己的理解标注代码注释
// 在一个有序数组中查找一个数,使用二分查找 int main(void) { int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // 定义并初始化一个int数组,必须是有序的 int sz = sizeof(arr) / sizeof(arr[0]); // 获取数组的长度 int l = 0; // 定义左边界,数组的最小下标0 int r = sz - 1; // 定义右边界,数组的最大下标sz - 1 int n = 0; // 用来接收你想要查找的数 int mid = 0; // 用来接收中间的下标值 scanf("%d", &n); // 获取用户的输入 while (l <= r) // 当左边界大于右边界时,证明整个数组已经查找完毕可以退出循环 { /*mid = (r + l) / 2;*/ // 这是第一种获取中间值的办法,左边界+右边界 再除2,但是这样的方法有一个隐藏问题,如果r+l超过int类型的范围 mid = l + ((r - l) / 2); // 第二种办法,(大-小)除2后再+小,这样就能最大程度上保证不会超过int类型的范围 if (arr[mid] > n) // 如果中间值大于想要查找的值,证明我们猜大了,右边界可以缩小 { r = mid - 1; // 将右边界的下标范围缩小,为什么是mid-1,因为arr[mid]的值已经判断过了,所以-1可以避免重复 } else if (arr[mid] < n ) // 如果中间值小于想要查找的值,证明我们猜小了,左边界可以增大 { l = mid + 1; // 将左边界的下标范围增大,为什么mid+1,原因同上 } else { printf("%d的下标是%d", n, mid); // 如果既不大于也不小于,那么就只能是等于了,等于就证明我们找到了,打印输出并且退出循环 break; } } if (l > r) // 如果左边界大于右边界了,那么证明上面的while循环中没有找到我们想要的值 { printf("找不到"); // 打印输出信息 } return 0; }
浙公网安备 33010602011771号