C语言学习|函数(10.14)

C语言学习|函数(10.14)

基本概念

1.参数值单向传递,只能将实参值单向传递给形参
2.用const将形参声明为常量,有效防止形参值在函数内被修改。
3.auto动态局部变量:只能在一个语句块中存在,函数一次调用完毕即刻被释放,与程序块共存亡。
4.static静态局部变量:只能在定义它的与函数内被访问,在退出函数后仍能保持其值到下一次进入函数,与程序共存亡。

特殊函数

1.srand(time(NULL));//为函数rand()设置随机数种子,头文件<time.h>。
2.rand()%100+1;//计算机生成随机数。头文件<stdlib.h>。
3.while(getchar() != ‘\n’);//清除输入缓冲区中的非法字符。
4.assert(条件语句);//断言,宏,测试算法正确性,用于调试程序;头文件<assert.h>。

代码

“用户猜数字”算法

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_TIME 10

int MakeNumber (void);
void GuessNumber (const int number);
int IsValidNum (const int number);
int IsRight (const int number,int guess);

int main()
{
    int m; //记录随机生成数
    char reply; //记录用户是否愿意继续
    srand(time(NULL)); //初始化随机种子
    do
    {
        m = MakeNumber ();
        GuessNumber (m);
        printf("Do you want to continue?\n");
        scanf(" %c",&reply);
    }while (reply == 'Y'||reply == 'y');

    return 0;
}
/*功能:随机生成一数
参数:空
返回值:计算机随机生成数*/
int MakeNumber (void)
{
    int makenum;
    makenum = rand()%100+1; //生成随机数
    return makenum;
}
/*功能:用户猜数字游戏
参数:计算机生成的数字
返回值:无*/
void GuessNumber(const int makenum)
{
    int count = 0; //初始化次数为0
    int guessnum; //用户猜测数
    int ret; //记录scanf()返回值,即读取的数据项数
    int right; //记录用户猜测数是否正确
    printf("Let's start it!\nPlease input a number.\n");
    do
    {
        printf("Try:%d\n",count + 1); //第一次读入用户猜测数
        ret = scanf("%d",&guessnum);
        while (ret != 1||!IsValidNum(guessnum)) //当用户输入的数字不是一个or为非法字符时,执行次循环
        {
            printf("error!\n");
            while(getchar()!='\n'); //清楚缓冲区中错误数据
            printf("Try:%d\n",count + 1); //再次读入用户猜测数
            ret = scanf("%d",&guessnum);
        }
        count++; //若输入数据没有错误,则次数从第一次正式开始
        right = IsRight(makenum,guessnum);
    }while(!right&&count < MAX_TIME); //第二次循环后条件为猜测错误or超时

    if (right)
        printf("Congratulations!\n");
    else
        printf("You have tried %d times,failed.\n",MAX_TIME);

    return;
}
/*功能:判断用户输入是否合法
参数:用户输入值
返回值:合法为1,不合法为0*/
int IsValidNum (const int number)
{
    if (number>=1&&number<=100)
        return 1;
    else
        return 0;
}
/*功能:判断猜数是否正确
参数:计算机随机值,用户输入值
返回值:正确为1,错误为0*/
int IsRight (const int number,int guess)
{
    if (guess > number)
    {
        printf("Too big!\n");
        return 0;
    }
    else if (guess < number)
    {
        printf("Too small!\n");
        return 0;
    }
    else
        return 1;
}

轮流报数游戏

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int computer (int tol); //实现计算机报数,输出此局最后报数
int input (int tol); //玩家报数,输出此局最后报数

int main()
{
    int tol = 0; //从1开始报数
    srand(time(NULL));
    if (rand()%2 == 0) //计算机先报数条件
    {
        tol = computer (tol);
    }
    while (tol < 30) //循环报数
    {
        tol = input (tol); //若计算机先报数,则跟在其后,否则用户先报数
        if (tol >= 30)
            printf("Computer Lose!\n");
        else //若没到30,则继续报数
        {
            tol = computer(tol); //计算机紧跟玩家的后面,报数
            if (tol >= 30)
                printf("Player Lose!\n");
        }
    }

    return 0;
}
int computer (int tol)
{
    int t;
    if ((30-tol)%3 == 1)
    {
        printf("Computer count:%d\n",tol+1);
        return tol++;
    }
    else if ((30-tol)%3 == 2)
    {
        printf("Computer count:%d\n",tol+1);
        return tol += 2;
    }
    else
    {
        srand(time(NULL));
        t = rand()%2;
        if(t == 0)
        {
            printf("Computer count:%d\n\n",tol+1);
            return tol+1;
        }
        else if (t == 1)
        {
            printf("Computer count:%d\t%d\n\n",tol+1,tol+2);
            return tol+2;
        }
    }
}
int input (int tol)
{
    int count;
    do
    {
        printf("Please count:");
        scanf("%d",&count);
        if (count > 2||count < 1)
            printf("error!\n");
        else //若合法,则进入此程序块
        {
            if (count == 1)
            {
                printf("You count:%d\n\n",tol+1);
                return tol+1;
            }
            else
            {
                printf("You count:%d\t%d\n\n",tol+1,tol+2);
                return tol+2;
            }
        }
    }while (count > 2||count < 1); //如若输入非法,则一直循环,直到输入合法
}

汉诺塔问题

#include <stdio.h>
#include <stdlib.h>

void Move (int n, char a, char b);
void Hanoi (int n, char a, char b, char c);

int main()
{
    int n;
    printf("Please input number:");
    scanf("%d",&n);
    Hanoi(n,'A','B','C'); //将n个圆盘借助C由A移动到B

    return 0;
}
/*递归调用,由最后一步入手,实现移动前n-1个圆盘和第n个圆盘的步骤*/
void Hanoi (int n,char a,char b,char c)
{
    if (n == 1)
        Move (n,a,b);
    else
    {
        Hanoi (n-1,a,c,b); //将前n-1个圆盘由a移动到c
        Move (n,a,b); //将第n个圆盘由a移动到b
        Hanoi (n-1,c,b,a); ////将前n-1个圆盘由c移动到b
    }
    return;
}
/*移动函数,代表将第n个圆盘由a移动到b*/
void Move (int n,char a,char b)
{
    printf("Move %d:From %c to %c.\n",n,a,b);
    return;
}

猜你喜欢

转载自blog.csdn.net/qq_42272723/article/details/83045404