C语言——使用函数时遇到的问题

一、函数的简单描述

函数是一段代码块,由 返回类型 函数名(函数参数)构成。
定义函数有两种方式。一种是声明与函数体放在一起,另一种是在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放错了位置。有答案的情况下,一步步对比,比较容易看出。
但如果在没有答案的情况下,这种错误可能要消耗很多时间。
所以设计函数时,一定要提前打个草稿,要不然还不知道一个错误要修改多久…真的很久…很久…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值