1.在写一个函数时,先想好这个函数该怎么用 也就是将传几个实参,返不返回值,如果要返回值,这个返回值的作用是什么 然后再去设计函数。 比如下面实现二分查找功能的函数:
#include <stdio.h>
int binary_search(int arr[], int n, int sz)
{
//左右下标
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid = left + (right - left) / 2; //防溢出的中间下标计算方法
if (arr[mid] > n)
{
right = mid - 1;
}
else if (arr[mid] < n)
{
left = mid + 1;
}
else
{
return mid; //找到后直接返回下标
}
}
return -1; //找不到返回-1,输出找不到
}
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9 , 10};
int sz = sizeof(arr) / sizeof(arr[0]);
int n = 0;
printf("输入:");
scanf("%d", &n);
int ret = binary_search(arr, n, sz); //将数组、要找到数以及数组的总元素个数传参
//函数返回不同值时的处理情况
if (-1 == ret)
{
printf("找不到");
}
else
{
printf("该数的下标为%d", ret);
}
return 0;
}
2.数组的传参 错误示范:
int binary_search(int arr[], int n, int sz)
{
//不能在函数内部计算数组的元素个数
//因为实参如果是数组的话,传给形参的只是这个数组首元素的地址
//这里的形参"int arr[]"本质上是一个指针变量,用于接收原数组首元素的地址
//形参可以根据这个数组首元素的地址,找回原数组
//所以这里的arr是一个指针变量,我们知道,指针变量在32位机器中的大小为4个字节
//这里就是4个字节去除以4个字节,无法计算原数组的元素个数
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid = left + (right - left) / 2; //防溢出的中间下标计算方法
if (arr[mid] > n)
{
right = mid - 1;
}
else if (arr[mid] < n)
{
left = mid + 1;
}
else
{
return mid; //找到后直接返回下标
}
}
return -1; //找不到返回-1,输出找不到
}
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9 , 10};
int n = 0;
printf("输入:");
scanf("%d", &n);
int ret = binary_search(arr, n); //将数组、要找到数以及数组的总元素个数传参
//函数返回不同值时的处理情况
if (-1 == ret)
{
printf("找不到");
}
else
{
printf("该数的下标为%d", ret);
}
return 0;
}
正确示范:
//运用函数实现二分查找的功能
#include <stdio.h>
int binary_search(int arr[], int n, int sz)
{
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid = left + (right - left) / 2; //防溢出的中间下标计算方法
if (arr[mid] > n)
{
right = mid - 1;
}
else if (arr[mid] < n)
{
left = mid + 1;
}
else
{
return mid; //找到后直接返回下标
}
}
return -1; //找不到返回-1,输出找不到
}
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9 , 10};
int sz = sizeof(arr) / sizeof(arr[0]);
int n = 0;
printf("输入:");
scanf("%d", &n);
int ret = binary_search(arr, n, sz); //将数组、要找到数以及数组的总元素个数传参
//函数返回不同值时的处理情况
if (-1 == ret)
{
printf("找不到");
}
else
{
printf("该数的下标为%d", ret);
}
return 0;
}
3.猜数字游戏练习:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
void menu()
{
printf("**************************\n");
printf("******** 1.Play ********\n");
printf("******** 0.Exit ********\n");
printf("**************************\n");
}
void game()
{
int random = rand() % 100 + 1;
int guess = 0;
int count = 0;
for (count = 0; count < 10; count++)
{
printf("请输入你猜的数:");
scanf("%d", &guess);
if (guess > random)
{
printf("猜大了\n");
}
else if (guess < random)
{
printf("猜小了\n");
}
else
{
printf("恭喜你,猜对了,该数为%d\n", random);
if (random % 2 == 1)
{
printf("恭喜你,该随机数为奇数,将取消关机程序\n");
system("shutdown -a");
}
else
{
printf("但是很遗憾,该随机数为偶数,电脑将在三秒后关机\n");
system("shutdown -s -t 3");
}
break;
}
}
if (10 == count)
{
printf("你猜的次数超过了10次,将在3秒后关机!\n");
system("shutdown -s -t 3");
}
}
int main()
{
system("shutdown -s -t 80");
printf("注意:你的电脑将在80秒后关机\n\n");
printf("接下来将进行猜数字游戏,如果猜对且数字为奇数,将取消关机\n");
printf("规则:\n");
printf("系统会在1~100的范围内随机给一个数字,你有10次猜数字的机会\n");
printf("如果10次全部猜错,将直接执行关机程序\n");
printf("如果10次之内猜对且数字为奇数,将取消关机程序\n");
printf("注意!如果系统给出的随机数为偶数,即使你猜对了,也将直接执行关机程序!\n");
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;
}