1、二分查找法——在一个有序数组中查找指定的数字
//使用要求:在使用二分查找法查找时,数组必须是升序 #include <stdio.h> int main() { int arr[] = { 3,6,8,11,13,17,28,39,40 }; int num; // 查找的元素 printf("请输入要查找的数字num="); scanf("%d", &num); // 求数组的长度 int length = sizeof(arr) / sizeof(arr[0]); // 声明两个变量,表示要查找的区间,默认查找的区间为[0,length-1] int left = 0; int right = length - 1; while (left <= right) { int middle = left + (right - left) / 2; //避免越界 if (arr[middle] == num) { // 使用中间位置的值与查找的值进行比较 printf("找到了,索引为%d", middle); break; } else if (arr[middle] > num) { // 在mid的右边找[mid+1,j] right = middle - 1; } else { left = middle + 1; // 在mid的左边找[i,mid-1] } } if (left > right) { printf("在数组中不存在数字%d", num); } return 0; }
2、小灰算法中的猜数字游戏
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <time.h> //int main() { // // 随机生成10个数 // int count = 1; // while (count <=10) { // //随机数 // // 生成指定范围内的一个随机数 rand()%100+1 // int result = rand()%100 +1; // printf("%d\n", result); // count = count + 1; // } // return 0; //} //int main() { // // 重新播种 // // 强制类型的转换 (转换的类型) // /* // int a = (int)10.5; // */ // int count = 1; // srand((unsigned int)time(NULL)); // while (count <= 10) { // int result = rand(); // printf("%d\n", result); // count = count + 1; // } // return 0; //} int main2() { // 声明一个变量,保存用户的选择 int select; do { printf("----------小灰猜数字----------\n"); printf("-------1、play 0、退出-------\n"); printf("------------------------------\n"); scanf("%d", &select); // 使用switch进行分支判断 int number; int input;// 使用input保存小灰输入的数据 int count = 1; switch (select) { case 1: //开始玩游戏 //1、生成随机数[1,100] number = rand() % 100 + 1; do { //2、小灰输入数字 printf("请输入1~100之间的数字:"); scanf("%d", &input); //3、进行判断 if (input == number) { printf("恭喜您,猜对了!总共猜了%d次\n", count); break; } else if (input > number) { printf("猜大了!\n"); count = count + 1; } else { printf("猜小了!\n"); count = count + 1; } } while (1); //4、打印结果 break; case 0: printf("欢迎下次再来!"); break; default: printf("输入有误,请重新输入.\n"); break; } } while (select); return 0; }
3、交换两个数字
void swap(int* pa, int* pb) { printf("%p,%p", pa, pb); // 解地址操作符 * int temp = *pa; *pa = *pb; *pb = temp; printf("交换中x=%d,y=%d\n", *pa, *pb); } #include <stdio.h> int main4() { int num1, num2; printf("请输入两个数:"); scanf("%d %d", &num1, &num2); printf("交换前x=%d,y=%d\n", num1, num2); // swap(10,20); //值传递 // 传址 swap(&num1, &num2); printf("交换后x=%d,y=%d\n", num1, num2); // 找出2—1000之内的所有素数 for (int i = 2; i <= 1000; i++) { if (isPrime(i)) { printf("%d\t", i); } } }
4、函数
(1)函数的概念:
在维基百科中,对于函数的定义是子程序。
子程序是一个大型程序中的某部分代码,由一个或多个语句块 组成,他负责完成某项特定的任务,而且相较于其他的代码,具备相对的独立性。
【口语化解释】函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写 大量重复的代码。
函数可以提前保存起来,并给它起一个独一无二的名字,只要知道它的名字就能使用这段代码。
函数还可以 接收数据,并根据数据的不同做出不同的操作,最后再把处理结果反馈给我们。
(2)库函数:
常用的库函数有:
IO函数
字符串操作函数
字符操作函数
时间/日期函数
数学函数
内存操作函数
学习网站: C语言常用库函数大全 - C语言网
(3)自定义函数:
函数的组成:
***自定义函数*** ret_type fun_name(para1,*) { statement; // 函数体 } ret_type 返回类型 fun_name 函数名 para1 函数参数
(4)函数的参数:
实际参数(实参): 真实传给函数的参数,叫实参。
实参可以是:常量、变量、表达式、函数等。
无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
形式参数(形参): 形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元) 所以叫形式参数。
形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效
形参实例化之后其实相当于实参的一份临时拷贝 。
(5)函数调用
<1>传值调用
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参
< 2>传址调用
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> int main() { /*int length = strlen("abcdf"); printf("%d", length);*/ // 复制数组 char dest[100]; char source[] = "Hello"; int length = sizeof(source) / sizeof(source[0]); memcpy(dest,source,length); printf("dest=%s,source=%s",dest,source); return 0; } /* void 函数名(参数列表){ // 函数体(完成功能的代码) // 无返回值 } 返回值类型 函数名(参数列表){ // 函数体(完成功能的代码) // 有返回值 ,通过return返回 return 表达式; } 参数列表: 个数:0~n,即使没有参数,()不能省略 // 如何声明参数列表: 参数类型 参数名(float num) 多个参数如何声明,参数之间使用逗号(,)分隔。 // 函数是用来完成功能的,一般情况下,一个函数只完成一个功能 */ // 定义一个求两个数最大值的函数,不能嵌套定义 // 确定参数; 参数个数,参数类型 void compMax(int x,int y) { int max = x; if (y > x) { max = y; } printf("%d和%d的最大值为%d", x, y, max); } int compMax2(int x, int y) { int max = x; if (y > x) { max = y; } return max; } int main() { int num1, num2; // 求两个变量的最大值 printf("请输入两个数:"); scanf("%d %d",&num1,&num2); // 调用函数: 函数名(参数列表) int max = compMax2(num1,num2); printf("%d和%d的最大值为%d", num1, num2, max); printf("请输入两个数:"); scanf("%d %d", &num1, &num2); max = compMax2(num1, num2); printf("%d和%d的最大值为%d", num1, num2, max); } int main5() { int num1, num2, num3; printf("请输入三个数:"); scanf("%d %d %d",&num1,&num2,&num3); // 先第一个和第二个求,用结果再与第三个求最大值 //int max = compMax2(num1, num2); //max = compMax2(max, num3); // 函数嵌套调用 int max = compMax2(compMax2(num1,num2),num3); printf("%d",max); return; }