一、函数
1.参数 函数在使用的时候,一个很明显特征就是使用带括号(),在我们使用的时候,里面可能还会有一些数据或者是变量,这就是参数。参数是函数中需要处理
的数据。
函数在定义的时候,给出的参数就是形式参数,也就是说的形参;函数调用的时候,传递的参数就是实参。在操作中,将实参的值传递过去给形参,就是相 当于一次赋值操作。这里需要注意的就是实参和形参的类型、数目必须要一致。
注意事项:
1) 形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。
2) 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的数据,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参,所 以应该提前用赋值、输入等办法使实参获得确定值。
3) 实参和形参在数量上、类型上、顺序上必须严格一致,否则会发生“类型不匹配”的错误。 2.返回值
函数的返回值指的是函数被调用之后,执行完程序代码段后所得到的数值,可以通过return进行返回。 一个函数中,可以出现多个return,但是每次调用的时候,只能有一个return进行执行,返回。
return 的一般形式:
3.函数的定义 3.1无参函数的定义
如果函数不接收用户传递的数据,那么定义时可以不带参数。如下所示:
说明:
返回值类型可以使C语言中的任意数据类型,比如是int,float,char等 函数名是标识符的一种,命名规则和标识符相同。函数名后面的括号不能少。 函数体是我们需要执行的代码。即使是一个语句,也要有{}包围 在函数体内部使用return语句返回数据。
举例:
注意:main 是函数定义,不是函数调用。当可执行文件加载到内存后,系统从 main 函数开始执行,也就是说,系统会调用我们定义的 main 函 数。
return 表达式; 可以是:
return average; return x +y; return (100 + 300);
返回值类型 函数名(){ 函数的片段
}
返回值类型 函数名(){ 函数体
}
int sum(){
int i, sum=0;
for(i=1; i<=100; i++){ sum+=i;
}
return sum; }
3.2无返回值的定义
void print_tedu() {
printf("hello tedu\n"); }
3.3有参函数的定义
返回值类型 函数名(参数列表){ 函数体
}
int max1(int x, int y) {
if (x > y) {
return x; }else
{
return y;
} }
函数的练习: 1.练习:控制台请用户输入头和脚的数量,输出兔子和鸡各有几只。
//鸡兔同笼问题
int rabbit(int heads, int legs) {
int num = 0;
for (num = 0; num < heads; num++) {
if (4 * num + 2 * (heads - num) == legs) {
return num; }
}
return -1; }
void check() {
int heads = 0, legs = 0;
int temp = 0; printf("请输入头和脚的数量:"); scanf_s("%d%d", &heads, &legs);
temp = rabbit(heads, legs); if (temp == -1)
{
printf("不好意思,没兔子。"); }else{
printf("兔子有%d只,鸡有%d只\n", temp, (heads - temp)); }
}
2.阶乘求和: sum = 1!+ 2!+ 3! + 4! +...+(n-1)! + n!
long factorial(int n);//求阶乘 long sum(long n);//求和
//阶乘求和:sum = 1!+ 2!+ 3! + 4! +...+(n-1)! + n!
long factorial(int n)
{
int i;
long result = 1; for (i = 1; i <= {
result *= i; }
return result; }
//求和
long sum(long n) {
int i;
long result = 0; for (i = 1; i <= {
n; i++)
n; i++)
result = result + factorial(i); }
return result; }
3.一只刚出生的奶牛,4年生1只奶牛,以后每一年生1只,现在给你一只刚出生的奶牛,问你30年后又多少奶牛。
#include <stdio.h>
int CalCowsNum(int iYear){ int iCnt =0;
long lCowsNum = 1; //奶牛总数 for(iCnt=1; iCnt<=iYear; iCnt++){
if(iCnt>=4){ //4年以后奶牛数量开始增多
if((iYear-iCnt)>3){ //第2个4年开始后产的奶牛开始生新奶牛
} }
return lCowsNum;
int main(){
int iYear =0;
//返回奶牛总数
}
lCowsNum += CalCowsNum(iYear - iCnt); }else{
lCowsNum++; }
printf("Please input require years:");
scanf ("%d", &iYear); //输入年数
printf("In %d years, There is %d cows.\n", iYear, CalCowsNum(iYear)); //输出结果
return 0; }
二、宏定义
一般写法:
#define 宏名 字符串
假如现在要开发一个C语言程序,并且要求跨平台,在 Windows 和 Linux 下都能运行,怎么办呢?
#include <stdio.h> //了解
void test() {
#if _WIN32
printf("666"); #elif __linux__
printf("hello"); #else
printf("sdfsd"); #endif
}
五子棋
开发工具:VS2012 头文件:
第一步:画出棋盘。 第二步:黑白双方落子 第三步:判断是不是已经五子连接 第四步:优化 第五步:由一个转变为多文件编程---extern
#include<stdio.h> #include<windows.h> #include<conio.h> #include<stdlib.h>
#include <stdlib.h> #include <stdio.h>
#include <conio.h> #include <Windows.h>
///全局变量/// char board[20][20];
int x, y;//代表是棋盘的行x和列y一个交点
///函数的声明/// void initBoard();//棋盘的初始化
void printBoard();//棋盘的打印
void Pos(int x, int y);//设置光标的位置
void printNum();//设置打印的棋盘数字 void startGame();//开始游戏
void checkWin();//检测游戏胜负
///函数的使用/// //设置光标的位置-----了解
void Pos(int x, int y)
{
COORD pos;
HANDLE hOutput;//句柄
pos.X = x;
pos.Y = y;
hOutput = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hOutput, pos);
}
//设置打印的棋盘数字 void printNum()
{
int i;
Pos(2, 0);
for (i = 0; i < 20; i++) {
printf("%2d", i); }
for (i = 0; i < 20; i++) {
Pos(0, 1 + i);
printf("%2d", i); }
}
//棋盘的初始化 void initBoard() {
int i, j;
for (i = 0; i < 20; i++) {
for(j=0;j <20;j++) {
} }
}
//棋盘的打印
void printBoard() {
int i, j; printNum();//打印 for (i = 0; i < 20; {
} }
void checkWin() {
board[i][j]
= '*';
i++)
//printf("\n");
Pos(2, 1+i);
for(j=0;j <20;j++) {
printf(" %c", board[i][j]); }
}
void startGame() {
initBoard(); printBoard();
while (1) {
} }
int main() {
startGame();
return 0; }
//int temp;//1 2 printf("\n请落白色棋子,输入行,列坐标:"); scanf_s("%d%d",&x, &y);
board[x][y] = 'W'; printBoard();
system("cls"); printBoard();
printf("\n请落黑色棋子,输入行,列坐标:"); scanf_s("%d%d",&x, &y);
board[x][y] = 'B'; printBoard();
system("cls"); printBoard();