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;
}