ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

c语言基础,数组,函数,二分查找,双指针,运算符区别

c语言基础,数组,函数,二分查找,双指针,运算符区别 C语言笔记适用C语言基础、数组、函数、二分查找、双指针动画、运算符区分一、运算符核心区分高频坑点 和 赋值运算符把右边的值存到左边变量有时候它定义时候的赋值是有意义的大多数情况定义赋值为0不影响因为后面会重新赋值覆盖它。但是如果定义赋值与后续的判断条件有关那么就要注意了。就像那个第一位是打印数字一样。int a 5; // 将5赋值给aint flag 1;// flag1代表真 关系运算符判断相等比较左右两边返回1真 / 0假cif(a 5) {} // 判断a是否等于5if(flag 0){} // 判断flag是否为假❗易错if里面千万别写成 if(a5) 这是赋值不是判断关系表达式布尔表达式形如 num % 2 0 用来做真假判断。C语言没有单独bool类型非0就是真0就是假。可以直接把判断结果赋值给变量用来保存状态。int is_even (num % 2 0);// 如果num是偶数is_even1奇数则is_even0if(is_even) // 等价 if(is_even ! 0)简化写法二、数组【重中之重最容易混淆】口诀定义时给总数访问时给位置正真起作用的是下标定义数组 int arr[5][5] 代表数组大小一共可以存放5个int元素下标范围 0,1,2,3,4访问数组 arr[3][3] 代表下标索引取数组里第4个元素。核心区分写在变量定义那一行的 [] 数组容量元素总个数定义完成后代码里 arr[下标] 访问对应位置元素技巧下标不从0开始人为空出arr[0]目的贴合现实编号避免频繁 下标 编号-1//问月份的时候 int arr[13]{0,31,29,31,30,31,30,31,31,30,31,31,31};// 星期示例char *week[] {“”, “星期一”, “星期二”, “星期三”, “星期四”, “星期五”, “星期六”, “星期日”};// week[1]直接是星期一// 扑克牌char *poker[] {“”, “A”,“2”,“3”,…,“J”,“Q”,“K”};// poker[1]Apoker[13]K//学生成绩学号1001开始float scores[1010] {0};scores[1001] 90; //学号1001的成绩数组名知识点回顾一维数组数组名 arr arr[0] 首元素地址 scanf 不用加 arr[i] 是单个元素是数值 scanf 输入时必须写 arr[i]二维数组也一样 arr[i][j]三、函数知识点函数参数传递值传递函数内部修改形参不会影响外面原始变量地址传递指针传变量地址函数内部可以修改外部变量cvoid swap(int *a, int *b) {// 交换两个数地址传递}函数声明 vs 函数定义函数声明告诉编译器函数存在写在main前面int add(int, int);函数定义函数的完整代码实现{}里面逻辑规则如果函数写在main函数后面main前面必须写函数声明函数返回类型① void 类型无返回值只执行动作不需要return返回数据void print_menu(){} //打印菜单void swap(int *a, int *b){} //交换变量② 非void类型int/float/char*必须return对应类型数据int is_leap(int year){} //返回1/0判断闰年float calculate_area(float r){} //返回面积char *get_greeting(){} //返回字符串指针自定义函数和void没有必要的联系一切一解决问题为导向。4. 返回值4种用途判断真假 is_leap 返回1是闰年0不是返回计算结果 add(a,b) 返回ab操作状态成功/失败返回0成功-1失败返回资源指针 fopen 返回文件指针FILE*递归函数自己调用自己必须有终止条件。适用阶乘、斐波那契、分治类问题int factorial(int n) {return n 1 ? 1 : n * factorial(n-1);}C语言不支持函数重载重载是C特性四、算法模板模板1二分查找猜数字有序序列查找核心不断取中间值缩小查找区间前提数据有序二分查找5步初始化边界low左边界high右边界循环条件 while(low high)计算中间值 mid (low high)/2比较缩小区间mid 目标 → high mid -1mid 目标 → low mid 1mid 目标 →找到break退出循环输出结果第4步就是保证每一次都做有用功完整代码模板#include stdio.hint main(){int price 300;int low 0;int high 1000;int guess;while(low high){guess (low high)/2;printf(“我猜价格是 %d 元!\n”, guess);if(guess price){printf(“高了!\n”);high guess - 1;}else if(guess price){printf(“低了!\n”);low guess 1;}else{printf(“猜对了价格就是 %d 元!\n”, guess);break;}}return 0;}模板2双指针动画【两端向中间汇聚字符串】左指针left从0往右右指针right从末尾往左双向填充字符c#include stdio.h#include string.h#include windows.hint main(){char arr1[] “welcome to bit!!!”;char arr2[] “####################”;int left 0;int right strlen(arr1)-1;while(left right){arr2[left] arr1[left];arr2[right] arr1[right];printf(“%s\n”, arr2);Sleep(500);system(“cls”);left;right–;}printf(“%s\n”, arr1);return 0;}注意Linux平台把 Sleep() 换成 usleep() system(“cls”) 换成 system(“clear”)五、典型例题代码奇偶判断标记变量写法c#include stdio.hint main(){int num;printf(“请输入一个整数”);scanf(“%d”, num);// 关系表达式赋值给标记变量int is_even (num % 2 0);if(is_even 1){printf(“%d 是偶数。\n”, num);}else{printf(“%d 是奇数。\n”, num);}//简化写法if(is_even){printf(“简化判断这是一个偶数。\n”);}return 0;}六、错题坑点汇总单独记数组定义 [] 是容量访问 arr[i] 中 i 是下标不要搞混 赋值 判断相等 if里面极易写错二分查找循环条件是 low high 不是 漏掉等于会漏掉边界值函数定义在main之后必须写函数声明VLA变长数组定义数组时方括号写变量才是VLA访问下标用变量不是VLA✅ int arr[10]; arr[i]; 普通访问C89支持❌ int n; int arr[n]; 变长数组C99才行
返回列表