在这里博主先告诉大家,博主在学校学的C语言课本是《谭浩强的C语言》那这本红色的书。
博主到期末阶段是学到了结构体那一章,下面是博主的复习代码,是一些比较有编程思想的一些源代码,博主就是用这个完成复习的,希望对大家有用!
- 有关此篇
- 说在前面
- 干货源代码汇总
- 尾声
那么这里博主先安利一下一些干货满满的专栏啦!
干货源代码汇总数据结构专栏:数据结构 这里包含了博主很多的数据结构学习上的总结,每一篇都是超级用心编写的,有兴趣的伙伴们都支持一下吧!
算法专栏:算法 这里可以说是博主的刷题历程,里面总结了一些经典的力扣上的题目,和算法实现的总结,对考试和竞赛都是很有帮助的!
力扣刷题专栏:Leetcode 想要冲击ACM、蓝桥杯或者大学生程序设计竞赛的伙伴,这里面都是博主的刷题记录,希望对你们有帮助!
C的深度解剖专栏:C语言的深度解剖 想要深度学习C语言里面所蕴含的各种智慧,各种功能的底层实现的初学者们,相信这个专栏对你们会有帮助的!
这是博主的复习代码,请大家食用!
- 注意:大家在用的时候,每一个代码在用的时候要把前面的#if 0中的0改成1,其它的#if 后面全部改成0,一个程序只留一个main()函数。 当然,有关预定义部分的知识,博主给大家提供传送门供大家食用!
- 【预定义】C语言预定义代码(宏、条件编译等)内容介绍【最全的保姆级别教程】
话不多说,直接上代码!
#define _CRT_SECURE_NO_WARNINGS 1 #include尾声#include //比较好的题 // 《谭浩强的C语言》 // 第七章第八题 // 第七章第十题 // 第八章第四题 // 第八章第五题 // 第八章第十六题 // 第八章第十七题 // 第九章第三题 // 有关字符串函数的实现 // //冒泡排序法 #if 0 void bubbleSort(int* arr, int sz) { int i = 0; int j = 0; for (i = 0; i < sz - 1; i++) { for (j = 0; j < sz - 1 - i; j++) { if (*(arr + j) > *(arr + j + 1)) { //交换 int tmp = *(arr + j); *(arr + j) = *(arr + j + 1); *(arr + j + 1) = tmp; } } } } int main() { int arr[] = { 0,9,8,7,6,5,4,3,2,1 }; int sz = sizeof(arr) / sizeof(arr[0]);//计算数组的大小 bubbleSort(arr, sz);//思考:为什么不能在bubbleSort里面计算数组大小? //一定要在main里面算完传过去? //输出 for (int i = 0; i < sz; i++) { printf("%d ", arr[i]); } system("pause"); return 0; } #endif //选择排序 #if 0 void selectingSort(int* arr, int sz) { int i = 0; int j = 0; for (i = 0; i < sz - 1; i++) { int min = i; for (j = i + 1; j < sz; j++) { //从下标为arr[i+1]开始找 //是 min = j;//打擂台 } } //出了这层循环之后,交换min和i的值,把i后面最小的放到i的位置 int tmp = arr[i]; arr[i] = arr[min]; arr[min] = arr[i]; } } int main() { int arr[] = { 0,9,8,7,6,5,4,3,2,1 }; int sz = sizeof(arr) / sizeof(arr[0]); selectingSort(arr, sz); for (int i = 0; i < sz; i++) { printf("%d ", arr[i]); } system("pause"); return 0; } #endif //实现整型数组的逆序 #if 0 void reverse_intArr(int* arr, int sz) { //方法一:利用双指针 左右循环 #if 0//要看哪个就把哪个改成1即可 int* left = arr; int* right = arr + sz - 1;//为什么是减一? //开始交换 while (left <= right) { int tmp = *left; *left = *right; *right = tmp; left++; right--; } #endif #if 0 //方法二 递归法 int tmp = *arr; *arr = *(arr + sz - 1); *(arr + sz - 1) = tmp; if (sz >= 2) {//思考为什么是sz>2才递归,而不是sz>=2,如果写成sz>=2会怎么样? reverse_intArr(arr + 1, sz - 2);//思考为什么是arr+1,sz-2 } #endif } int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int sz = sizeof(arr) / sizeof(arr[0]); //逆序 reverse_intArr(arr,sz); //输出 for (int i = 0; i < sz; i++) { printf("%d ", arr[i]); } system("pause"); return 0; } #endif //实现字符串的逆序 #if 0 void reverse_charStr(char* str) { //这里只展示递归法,循环法和int数组是一样的,只是多一步strlen int len = strlen(str); char tmp = *str; *str = *(str + len - 1); *(str + len - 1) = ' ';//思考为什么 if (strlen(str + 1) >= 2) { reverse_charStr(str + 1); } *(str + len - 1) = tmp; } int main() { char str[] = "abcdefg"; //实现逆序 reverse_charStr(str);//对比传参,为什么不用传大小 //输出 //对比:和整型数组的输出有什么不同 printf("%sn", str); system("pause"); return 0; } #endif //二分法查找一个整型数组里面一个数字的下标 #if 1 int*binarySearch(int* arr, int sz, int input) {//函数返回值是int*代表什么? //定义三个指针指向中间和两边 int* left = arr; int* right = arr + sz - 1; while (right - left > 2) { int* mid = left + (right - left) / 2; if (*mid == input) { return mid; } else if (input > *mid) { left = mid;//如果在中间位置的右边,那么新的left改成mid continue; } else if (input < *mid) {//如果在中间位置的左边,那么新的right改成mid right = mid; continue; } } //走到这里都还没返回,说明找不到了,返回空指针 return NULL; } int main() { int input = 0;//要查找的数字 int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int sz = sizeof(arr) / sizeof(arr[0]);//数组大小 printf("请输入你要查找的数字:"); scanf("%d", &input); int*ret = binarySearch(arr, sz,input); if (ret != NULL) {//EOF就是-1 printf("找到了!该数字的下标是%dn", ret-arr); } else { printf("找不到该数字!n"); } system("pause"); return 0; } #endif //err //strlen的模拟实现 #if 0 int my_strlen(char* str) {//为什么是char*? int count = 0;//计算字符串长度 //操控地址的函数 尽量都用while循环,更清晰,除非for特别方便 while (*str != ' ') {//!=' '是可以不写的 count++; str++;//指针向后移 } return count; } int main() { char arr[] = "abcdefg"; int len = my_strlen(arr); printf("该字符串的长度为:%dn", len); system("pause"); return 0; } #endif //strcat模拟实现 //strcat:连接两个字符串 #if 0 void my_strcat(char* dest, char* src) { //a b c //d e f //1.先找到abc也就是dest末尾的位置,从末尾的位置开始放src的内容 char* start = dest;//定义一个start指针,准备让它指向dest的末尾 while (*start) { start++; } //现在start已经指向abc后面的 了,开始拷贝内容 while (*src) {//循环结束的条件:src拷贝完了,也就是src碰到 了 *start = *src; src++; start++; } } int main() { char str1[10] = "abc"; char str2[] = "def"; //现在想把str2的内容接在str1后面 //复制前要确保,str1位置够放 my_strcat(str1, str2); printf("连接后的字符串为:%sn", str1); system("pause"); return 0; } #endif //strcmp的模拟实现 //比较两个字符串 #if 0 int my_strcmp(char* str1, char* str2) { char* pstr1 = str1; char* pstr2 = str2; while (*pstr1 == *pstr2 && *pstr1 && *pstr2) {//找不同 //与此同时,两个指针都不能指向 ,如果有一个指向 即代表比较结束 pstr1++; pstr2++; } return *pstr1 - *pstr2; } int main() { char str1[100] = { 0 }; char str2[100] = { 0 }; printf("请输入第一个字符串:"); gets(str1); printf("请输入第二个字符串:"); gets(str2); int ret = my_strcmp(str1, str2); //如果返回0,代表相等;返回正值代表str1大于str2 if (!ret) { printf("两个字符串相等n"); } else if (ret > 0) { printf("第一个字符串大于第二个n"); } else { printf("第二个字符串大于第一个n"); } system("pause"); return 0; } #endif //strcpy的模拟实现 #if 0 void my_strcpy(char* destination, char* source) { while (*destination++ = *source++) { ; }//拷贝 //后置++可以使' '完成拷贝 } int main() { char str1[20] = { 0 }; char str2[20] = { 0 }; //输入字符串 printf("请输入destination:>n"); gets(str1); printf("请输入source:>n"); gets(str2); //strcpy模拟实现 my_strcpy(str1, str2);//拷贝' '的strcpy printf("拷贝结果为:>n"); printf("%sn", str1); system("pause"); return 0; } #endif
看到这里,如果伙伴们觉得有帮助的话,不要忘记一键三连哦!



