一、函数的简单描述
函数是一段代码块,由 返回类型 函数名(函数参数)构成。
定义函数有两种方式。一种是声明与函数体放在一起,另一种是在main函数之前进行声明,把函数块放在代码最后。我们通常使用后者(如下所示)。
#include<stdio.h>
int function(int a,int b);
int main(){
..............
function(3,4);
return 0;
}
int function(int a,int b){
int sum=a+b;
return sum;
}
函数,或者说功能。字面上似乎很好理解,就是你传给它你想要实现某种功能所需要的变量,函数返回结果(或者实现像判断,交换之类的功能)。
但事实上,一到函数互相调用,或者你想用函数实现一个功能时,使用函数就会变得异常困难。
例如:产生四个不同的随机数(前面的内容已经列过代码了,在此不再赘述)。
二、用函数实现产生四个随机数
1.出发点
立足于之前对函数的理解,我们会发现,实现一个大功能,需要很多小功能的累计。比如,产生四个不同的随机数,我们可以把这个“大”步骤分为四个“小”步骤实现
1.产生随机数
2.判断是否与数组中的其他值重复
3.不重复则传入数组,重复则重新生成,直到它不重复才存进数组
4.遍历打印数组
你可以把每个步骤当成一个函数功能来实现,或者你可以继续拆分(或合并)功能。但当你开始在main前定义数组时,问题很快就出现了:你的函数返回类型是什么?你的函数名该怎样起?最重要的是:你的参数究竟是什么?
嗯,这些是很大的问题。解决起来需要一定的时间,还有符合逻辑的思路。
2.相互调用
假如你解决了1,那么恭喜你,问题2离你不远了。
如同很多人一样,你也许可能想,我做了四个函数,那么在main中我应该四个都用到。然后我只要找到他们之间…但事实却不是这样,如果你足够敏锐的话,也许可以发现,其实1,2,3应该是紧密关联的,你不得不在3中就提前调用你的1,2,因为只有这样,你才能顺利实现3的功能。
3.逻辑与关联
千辛万苦,你以为你写好了代码,在你终于记住你的各个变量名,修改过无数警告之后,你觉得你的任务完成了…
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<stdbool.h>
int generateNum(int max,int min);//产生固定范围的随机数
void putintoArray(int num,int a[]);//把它们放进数组里(但是要先判断相不相同)
bool key(int a[],int temp,int num);//判断新产生的随机数是否相同
void display(int a[],int num);//打印四个不同的随机数
int main(){
int array[4]={};
putintoArray(4,array);
display(array,4);
return 0;
}
int generateNum(int max,int min){
srand(time(NULL));
return rand()%(max-min+1)+min;
}
bool key(int a[],int temp,int num){
for(int i=0;i<num;i++){
if(a[i]=temp){
return true;
}else
return false;
}
}
void putintoArray(int num,int a[]){
for(int i=0;i<num;i++){
int temp=generateNum(1,9);
bool k=key(a,temp,4);
if(k==true){
i--;
}else{
a[i]=temp;
}
}
}
void display(int a[],int num){
for(int i=0;i<num;i++){
printf("%d ",a[i]);
}
}
但运行起来,却发现前面的工作都是浮云,因为程序编译成功了,却无法正确运行。
对比一下正确的:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
int generateNumber(int min, int max);//产生4个在指定范围的随机数
void initArray(int array[], int count);//将4个不同的随机数保存到数组中
bool isNumberExist(int array[], int temp,int num);//判断数组中是否包含一个数字
void show(int array[],int num);//输出数组
int main() {
int org[4] = {};
initArray(org, 4);
show(org,4);
return 0;
}
分 / 割 // 线 //
int generateNumber(int min, int max){
srand(time(NULL));
return rand()%(max-min+1) + min;
}
void initArray(int array[], int count){
for (int i = 0; i < count; i++) { //获取随机数
int temp = generateNumber(1, 9);
bool result = isNumberExist(array, temp,4);//判断当前数组里面是否存在
if (result == true) {
i--; //重复就再来一次
}else{
array[i] = temp; //不重复就存起来
}
}
}
bool isNumberExist(int array[], int temp,int num){
for (int i = 0; i < num; i++) {
if (array[i] == temp) {
return true;
}
}
return false;
}
void show(int array[],int num){
for (int i = 0; i < num; i++) {
printf("%d ", array[i]);
}
printf("\n");
}
你会发现上面函数的问题在于你的return false放错了位置。有答案的情况下,一步步对比,比较容易看出。
但如果在没有答案的情况下,这种错误可能要消耗很多时间。
所以设计函数时,一定要提前打个草稿,要不然还不知道一个错误要修改多久…真的很久…很久…