C6节:函数

函数由一组语句构成。
所有C语言程序都是由一个或者多个函数构成的
每个C语言程序都必须有叫做main的主函数,程序从这个函数的第一条语句开始执行。
两个函数交流过程中主动发起方叫做调用函数,另一方叫做被调用函数。
返回值变量用来从被调用函数传递数据到调用函数
返回值变量类型声明在函数名前面。如果没有返回值变量则类型声明成void.
return关键字可以把一个数字赋值给返回值变量
参数是一组特殊变量,用来从调用函数函数传递数据到被调用函数。
参数的个数没有限制
参数的传递效果类似于复印机,传递结束后会有两份数据存在
传递之前就存在的数据叫做实际参数
传递之后新出现的数据叫做形式参数
数组做参数的传递效果类似快递,任何时候数组只有一个。
数组做参数可以实现数据的双向传递,这种参数叫做输入输出参数。
数组做参数时需要一个专门的参数记录数组中的变量个数

 

/*
    函数练习
*/
#include <stdio.h>
int add(int num, int num1) {
    return num + num1;
}
void neg(int num[], int size) {
    int pos = 0;
    for (pos = 0;pos <= size - 1;pos++) {
        num[pos] = 0 - num[pos];
    }
}
int main() {
    int num = 0;
    int values[] = {2, -6};
    num = add(2, 3);
    num = add(num, 4);
    printf("num是%d\n", num);
    neg(values, 2);
    printf("values[0]是%d\n", values[0]);
    printf("values[1]是%d\n", values[1]);
    return 0;
}


练习:
    1.编写函数交换两个变量的内容

/*
    编写函数交换两个变量内部的数字
*/
#include <stdio.h>
void swap(int num[], int size) {
    int value = 0;
    value = num[0];
    num[0] = num[1];
    num[1] = value;
}
int main() {
    int num[] = {3, 7};
    swap(num, 2);
    printf("num[0]是%d\n", num[0]);
    printf("num[1]是%d\n", num[1]);
    return 0;
}














返回值类型不要忽略
如果明确指定有返回值则应该使用return关键字对它赋值。
返回值变量的类型必须和返回的数值一致

return关键字构成的语句结束后函数立刻结束
exit函数可以随时终止程序的运行,需要包含文件unistd.h。

/*
    return关键字的使用练习
*/
#include <stdio.h>
#include <unistd.h>
void func() {
    printf("1\n");
    //return ;
    _exit(0);
    printf("2\n");
}
int main() {
    func();
    printf("3\n");
    return 0;
}

函数分为函数声明和函数体
一个文件中的所有函数都应该在文件开头列出声明
不要依赖函数的隐式声明
    

/*
    函数练习
*/
#include <stdio.h>
int add(int , int );
//int add();    //函数的隐式声明
int main() {
    int value = 0;
    value = add(2, 3);
    printf("value是%d\n", value);
    return 0;
}
int add(int num, int num1) {
    return num + num1;
}



练习:
    1.用函数改写圈叉棋程序
    

/*
    用函数修改圈叉棋的练习
*/
#include <stdio.h>
void show(int map[][3], int);
void play(int map[][3], int , int ); 
int win(int , int , int );
int main();
/*
     显示整个棋盘
*/
void show(int map[][3], int size) {
    int row = 0, col = 0;
    for (row = 0;row <= size - 1;row++) {
        for (col = 0;col <= 2;col++) {
            if (!map[row][col]) {
                printf(".");
            }
            else if (map[row][col] == 1) {
                printf("O");
            }
            else {
                printf("X");
            }
        }
        printf("\n");
    }
}
/*
    向棋盘上放置一个棋子
*/
void play(int map[][3], int size, int player) {
    int row = 0, col = 0;
    do {
        printf("请输入行号和列号:");
        scanf("%d %d", &row, &col);
        if (row < 1 || row > size) {
            continue;
        }
        if (col < 1 || col > 3) {
            continue;
        }
        if (map[row - 1][col - 1]) {
            continue;
        }
        map[row - 1][col - 1] = player;
        break;
    } while (1);
}
/*
    判断某条直线上是否分出了输赢
*/
int win(int first, int second, int third) {
    if (first && first == second  && first == third) {
        if (first == 1) {
            printf("O赢了\n");
        }
        else {
            printf("X赢了\n");
        }
        return 1;
}
    else {
        return 0;
    }
}
int main() {
    int map[3][3] = {}, player = 1, loop = 0;
    show(map, 3);
    for (loop = 0;loop < 9;loop++) {
        play(map, 3, player);
        show(map, 3);
        if (win(map[0][0], map[0][1], map[0][2])) {
            break;
        }
        if (win(map[1][0], map[1][1], map[1][2])) {
            break;
        }
        if (win(map[2][0], map[2][1], map[2][2])) {
            break;
        }
        if (win(map[0][0], map[1][0], map[2][0])) {
            break;
        }
        if (win(map[0][1], map[1][1], map[2][1])) {
            break;
        }
        if (win(map[0][2], map[1][2], map[2][2])) {
            break;
        }
        if (win(map[0][0], map[1][1], map[2][2])) {
            break;
        }
        if (win(map[0][2], map[1][1], map[2][0])) {
            break;
        }
        player = 3 - player;
    }
    return 0;
}






作业:
    1.10X10的棋盘,编写两个函数,第一个函数负责显示棋盘,第二个函数负责布置一个雷。
    
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值