一、分支语句:if和switch
1.if判断基础
0代表假,非0代表为真 此为C语言逻辑判断的底层规则
if(1)、while(1)都是死循环
多条件判断语句用 if ... else if ... else
练习: 任取一整数除以3的余数
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { int num = 0; scanf("%d",&num); if(num%3==0) { printf("余数是0"); } else if(num%3==1) { printf("余数是1"); } else { printf("余数是2"); } return 0; }2.switch分支
注意:1.switch后必须跟break,否则会发生case穿透
2. case 后面必须放整型常量,不能放变量
3.default:所有case都不匹配时才执行,位置无要求,建议放末尾
练习:输入数字1~7输出星期,输入非法数字default提示报错
int main () { int day = 0; scanf("%d",&day); switch(day) { case(1): printf("星期一"); case(2): printf("星期二"); case(3): printf("星期三"); case(4): printf("星期四"); case(5): printf("星期五"); case(6): printf("星期六"); case(7): printf("星期天"); default: printf("输入错误,请重新输入") break; } return 0; }二、循环语句:while、for、do while
适用场景区分:
1.while:先判断,后执行
2.for:结构紧凑,优先用于已知循环次数场景
3.do while:先执行一次,再判断(程序至少执行一次)
三种循环中加入break,continue的区别:
注意:break是直接跳出整个循环而continue是跳过本次循环剩下的代码,直接进行下一轮判断
while语句:
int main() { int i = 0; while(i<=10) { printf("%d",i); //运行结果为 1,2,3,4,5,6,7,8,9,10 i++; } return 0; } int main() { int i = 0; while(i<=10) { if(i == 5) //运行结果为1,2,3,4,5 break; printf("%d",i); i++; } return 0; } int main() { int i = 0; while(i<=10) { if(i == 5) //运行结果为1,2,3,4,5 continue; printf("%d",i); i++; } return 0; } int main() { int i = 0; while(i<=10) { i++; if(i == 5) //运行结果为1,2,3,4,6,7,8,9,10 continue; printf("%d",i); } return 0; }do while循环:
int main() { int i = 1; do { printf("%d",i); i++; }while(i<=10) return 0; } //运行结果为1,2,3,4,5,6,7,8,9,10 int main() { int i = 1; do { if(i==5) break; //1,2,3,4,5 printf("%d",i); i++; }while(i<=10) return 0; } int main() { int i = 1; do { i++;//2,3,4,6,7,8,9,10,11 if(i==5) continue; printf("%d",i); // i++; //1,2,3,4,5 }while(i<=10) return 0; }for循环:
int main() { int i=0; for(i=0;i<=10;i++) { printf("%d",i); } return 0; } int main() { int i=0; for(i=0;i<=10;i++) { printf("%d",i); if(i==5) //1,2,3,4,5 break; } return 0; } int main() { int i=0; for(i=0;i<=10;i++) { printf("%d",i); if(i==5) continue; //1,2,3,4,6,7,8,9,10 } return 0; }四、goto语句&趣味整蛊程序
goto可以在函数内直接跳转在标记位置,不建议滥用,适合快速跳出多层循环。
#include <stdio.h> int main() { int i,j; for(i=1; i<=10; i++) { for(j=1; j<=10; j++) { if(i*j == 36) { printf("找到 i=%d,j=%d\n",i,j); goto end_loop; // 直接跳出两层循环 } } } end_loop: printf("循环结束\n"); return 0; }五、实战项目:猜数字游戏(综合运用循环+随机数+switch菜单)
核心知识点:
1.rand()生成随机数,srand((unsigned int)time(NULL))设置随机种子。
注意:#include<stdlib.h> 是rand,srand的头文件 #include<time.h> 是time(NULL)的头文件
2.do while 实现菜单循环,玩完后可继续选择玩或不玩
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <time.h> void menu() { printf("************************\n"); printf("***** 1.猜数字 ******\n"); printf("***** 0.退出游戏 ******\n"); printf("************************\n"); } void game() { int r = rand() % 100 + 1; int guess = 0; int count = 5; while (count > 0) { printf("你还有%d次机会,请猜数字:>", count); scanf("%d", &guess); if (guess < r) { printf("猜小了\n"); } else if (guess > r) { printf("猜大了\n"); } else { printf("恭喜你猜对啦!\n"); break; } count--; } if (count == 0) { printf("很遗憾,机会用完,正确数字是:%d\n", r); } } int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择>:"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("游戏退出\n"); break; default: printf("输入错误,请重新选择!\n"); break; } } while (input); return 0; }六、数组:一维数组+二维数组
数组:相同类型元素的集合,下标从0开始!!
1.一维数组
不完全初始化:int arr[5] ={1,2,3};,剩下的元素自动初始化为0
完全初始化:int arr[5] = {1,2,3,4,5}
!!! 变长数组:int arr[n];C99才支持,vs默认MSVC编译器不支持变长数组,clang可以
求数组元素个数的公式:int sz=sizeof(arr)/sizeof(arr[0]);
***坑:数组当做函数参数传递的时候,数组会退化成指针,sizeof无法算出正确的长度,需要手动把长度作为参数传入函数里
2.二维数组
初始化时行可省略列绝对不能省略
需要两层for循环嵌套,i控制行,j控制列
查找数组时可用二分查找法(折中查找法)
二分查找法:任意输入一个数,用二分法查找
#include<stdbool.h> int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int k = 0; scanf("%d", &k); int sz = sizeof(arr) / sizeof(arr[0]); int left = 0; int right = sz - 1; bool flag = false; while (left <= right) { int mid = (left + right) / 2; if (arr[mid] < k) { left = mid + 1; } else if (arr[mid] > k) { right = mid - 1; } else { printf("找到了,下标是:%d\n", mid); flag = true; break; } } if (flag == false) { printf("找不到此数字\n"); } return 0; }七、字符串操作
1.strlen:统计/0之前有效字符个数(需头文件#include<string.h>)
2.C语言字符串末尾自带隐藏结束符/0,没有/0的话会出现乱码
3.strcmp(str1,str2)==0,字符串之间的比较str1=str2,不能直接用==
4.返回值:str1>str2返回>0;str1<str2返回<0;str1=str2返回=0
演示:字符动画打印,一边打印一边清屏
#include<windows.h> #include<stdio.h> #include<string.h> int main() { char arr1[] = "hello!welcome to you!!!!!!!"; char arr2[] = "***************************"; int left = 0; int right = sizeof(arr1) / sizeof(arr1[0]) - 2; while (left<= right) { arr1[left] = arr2[left]; arr1[right] = arr2[right]; printf("%s\n", arr1); Sleep(500); system("cls"); left++; right--; } printf("hello!welcome to you!!!!!!!"); return 0; }strcmp函数的使用:
#include <stdio.h> #include <string.h> // strcmp必须的头文件 int main() { char str1[] = "hello"; char str2[] = "hello"; char str3[] = "world"; if( strcmp(str1, str2) == 0 ) // 比较字符串里面的文字内容 { printf("str1 和 str2 内容相等\n"); } else { printf("str1 和 str2 内容不等\n"); } if( strcmp(str1, str3) < 0 ) { printf("hello 在字典顺序上小于 world\n"); } return 0; }编程学习从无捷径,bug常在,难题常有。
道阻且长,行则将至;坚持敲码,终有所获。