From 06e24173a67ca7f5fb830e8ea26616defe15775c Mon Sep 17 00:00:00 2001 From: LHY20 <3364451258@qq.com> Date: Sun, 20 Jul 2025 16:30:56 +0800 Subject: [PATCH] Initial commit: C language learning code --- .gitignore | 26 + 翁凯C语言/1/Hello.c | 21 + 翁凯C语言/1/average math.c | 31 + 翁凯C语言/1/guess.c | 31 + 翁凯C语言/1/倒序排列.c | 24 + 翁凯C语言/10/二进制文件.c | 61 ++ 翁凯C语言/10/文件输入输出.c | 52 ++ 翁凯C语言/10/格式化输入输出.c | 45 ++ 翁凯C语言/11/位段.c | 33 + 翁凯C语言/11/位运算的例子.c | 33 + 翁凯C语言/11/按位运算.c | 33 + 翁凯C语言/11/移位运算.c | 33 + 翁凯C语言/12/可变数组.c | 51 ++ 翁凯C语言/12/可变数组的数据访问.c | 81 +++ 翁凯C语言/12/可变数组的缺陷.c | 103 +++ 翁凯C语言/12/可变数组的自动增长.c | 103 +++ 翁凯C语言/13/链表.c | 61 ++ 翁凯C语言/13/链表的函数.c | 74 +++ 翁凯C语言/13/链表的搜索.c | 74 +++ 翁凯C语言/2/coin.c | 31 + 翁凯C语言/2/coin2.c | 30 + 翁凯C语言/2/n的阶乘.c | 21 + 翁凯C语言/2/n的阶乘2.c | 20 + 翁凯C语言/2/n的阶乘3.c | 20 + 翁凯C语言/2/sum.c | 22 + 翁凯C语言/2/sum2.c | 28 + 翁凯C语言/2/sum3.c | 24 + 翁凯C语言/2/最大公约数(辗转相除法).c | 40 ++ 翁凯C语言/2/最大公约数.c | 45 ++ 翁凯C语言/2/最大公约数2.c | 39 ++ 翁凯C语言/2/正序分解整数.c | 32 + 翁凯C语言/2/正序分解整数2.c | 51 ++ 翁凯C语言/2/正序分解整数3.c | 56 ++ 翁凯C语言/2/正序整数分解4.c | 62 ++ 翁凯C语言/2/素数判断.c | 32 + 翁凯C语言/2/素数判断2.c | 32 + 翁凯C语言/2/素数判断3.c | 49 ++ 翁凯C语言/3/a的连续和.c | 32 + 翁凯C语言/3/n项求和.c | 24 + 翁凯C语言/3/九九乘法表.c | 31 + 翁凯C语言/3/字符类型.c | 27 + 翁凯C语言/3/念数字.c | 96 +++ 翁凯C语言/3/整数的格式化.c | 0 翁凯C语言/3/整数类型表示数的范围.c | 17 + 翁凯C语言/3/整数类型表示数的范围2.c | 17 + 翁凯C语言/3/整数类型表示数的范围3.c | 25 + 翁凯C语言/3/整数类型表示数的范围4.c | 25 + 翁凯C语言/3/条件运算和逗号运算.c | 45 ++ 翁凯C语言/3/水仙花数.c | 57 ++ 翁凯C语言/3/浮点数的范围与精度.c | 29 + 翁凯C语言/3/浮点数的输入和输出.c | 20 + 翁凯C语言/3/猜数游戏.c | 40 ++ 翁凯C语言/3/类型转换.c | 26 + 翁凯C语言/3/约分最简分式.c | 32 + 翁凯C语言/3/给定条件的整数集.c | 57 ++ 翁凯C语言/3/统计素数并求和.c | 63 ++ 翁凯C语言/3/逃逸字符.c | 35 ++ 翁凯C语言/3/逻辑运算.c | 22 + 翁凯C语言/4/从函数的返回值.c | 47 ++ 翁凯C语言/4/函数原型.c | 28 + 翁凯C语言/4/函数嵌套递归.c | 26 + 翁凯C语言/4/函数求和.c | 25 + 翁凯C语言/4/函数的其它细节问题.c | 25 + 翁凯C语言/4/函数的定义和使用.c | 38 ++ 翁凯C语言/4/参数传递.c | 34 + 翁凯C语言/4/本地变量.c | 30 + 翁凯C语言/5/二维数组.c | 181 ++++++ 翁凯C语言/5/二维数组中的鞍点.c | 150 +++++ 翁凯C语言/5/二维数组:矩阵运算.c | 96 +++ 翁凯C语言/5/二维数组:矩阵运算2.c | 126 ++++ 翁凯C语言/5/初试数组.c | 67 ++ 翁凯C语言/5/定义数组.c | 30 + 翁凯C语言/5/对称矩阵.c | 165 +++++ 翁凯C语言/5/数组来统计个数.c | 44 ++ 翁凯C语言/5/数组的例子:冒泡排序.c | 57 ++ 翁凯C语言/5/数组的例子:素数.c | 62 ++ 翁凯C语言/5/数组的例子:素数2.c | 76 +++ 翁凯C语言/5/数组的运算.c | 105 ++++ 翁凯C语言/5/杨辉三角.c | 78 +++ 翁凯C语言/5/矩阵对应位置元素相加.c | 161 +++++ 翁凯C语言/5/矩阵对角线的和.c | 112 ++++ 翁凯C语言/5/矩阵的应用.c | 249 ++++++++ 翁凯C语言/5/矩阵的最大值.c | 100 +++ 翁凯C语言/5/转置矩阵.c | 91 +++ 翁凯C语言/6/函数指针.c | 57 ++ 翁凯C语言/6/动态内存分配.c | 80 +++ .../6/取地址计算:&运算符取得变量的地址.c | 40 ++ ...指针与const:指针本身和所指的变量都可能const.c | 43 ++ 翁凯C语言/6/指针与数组.c | 54 ++ 翁凯C语言/6/指针函数.c | 41 ++ 翁凯C语言/6/指针变量:记录地址的变量.c | 46 ++ 翁凯C语言/6/指针数组.c | 63 ++ 翁凯C语言/6/指针的使用.c | 81 +++ 翁凯C语言/6/指针运算.c | 85 +++ 翁凯C语言/7/单字符的输入输出.c | 36 ++ 翁凯C语言/7/字符串.c | 41 ++ 翁凯C语言/7/字符串中找字符.c | 51 ++ 翁凯C语言/7/字符串中找字符串2.c | 42 ++ 翁凯C语言/7/字符串函数strcmp.c | 48 ++ 翁凯C语言/7/字符串函数strcpy.c | 48 ++ 翁凯C语言/7/字符串函数strlen.c | 37 ++ 翁凯C语言/7/字符串变量.c | 48 ++ 翁凯C语言/7/字符串数组.c | 42 ++ 翁凯C语言/7/字符串数组2.c | 29 + 翁凯C语言/7/字符串的输入输出.c | 49 ++ 翁凯C语言/7/字符串输出回文字.c | 46 ++ 翁凯C语言/8/动态链表.c | 102 +++ 翁凯C语言/8/枚举.c | 53 ++ 翁凯C语言/8/类型定义.c | 45 ++ 翁凯C语言/8/结构与函数.c | 86 +++ 翁凯C语言/8/结构与函数2.c | 90 +++ 翁凯C语言/8/结构中的结构3.c | 102 +++ 翁凯C语言/8/结构类型.c | 73 +++ 翁凯C语言/8/联合.c | 34 + 翁凯C语言/9/全局变量.c | 54 ++ 翁凯C语言/9/声明.c | 61 ++ 翁凯C语言/9/大程序.c | 38 ++ 翁凯C语言/9/头文件.c | 50 ++ 翁凯C语言/9/宏定义.c | 54 ++ 翁凯C语言/9/带参数的宏.c | 47 ++ 翁凯C语言/9/返回指针的函数.c | 56 ++ 翁凯C语言/9/静态本地变量.c | 56 ++ 草稿/test.md | 9 + 草稿/test.tex | Bin 0 -> 512000 bytes 草稿/草稿1.c | 0 草稿/草稿2.c | 13 + 课上代码练习/1.1.1/初识C语言.c | 10 + 课上代码练习/1.1.2/num_max.c | 26 + 课上代码练习/1.1.3/num_sum.c | 21 + 课上代码练习/1.1.4/char函数.c | 20 + 课上代码练习/1.1.5/字母大小写转换.c | 14 + 课上代码练习/1.1.6/if_else.c | 10 + 课上代码练习/1.1.7/BMI.c | 26 + 课上代码练习/五子棋/AI_function.md | 149 +++++ 课上代码练习/五子棋/README.md | 384 +++++++++++ 课上代码练习/五子棋/五子棋 copy 2.c | 489 ++++++++++++++ 课上代码练习/五子棋/五子棋 copy 3.c | 595 ++++++++++++++++++ 课上代码练习/五子棋/五子棋 copy.c | 473 ++++++++++++++ 课上代码练习/五子棋/五子棋.c | 429 +++++++++++++ 139 files changed, 9303 insertions(+) create mode 100644 .gitignore create mode 100644 翁凯C语言/1/Hello.c create mode 100644 翁凯C语言/1/average math.c create mode 100644 翁凯C语言/1/guess.c create mode 100644 翁凯C语言/1/倒序排列.c create mode 100644 翁凯C语言/10/二进制文件.c create mode 100644 翁凯C语言/10/文件输入输出.c create mode 100644 翁凯C语言/10/格式化输入输出.c create mode 100644 翁凯C语言/11/位段.c create mode 100644 翁凯C语言/11/位运算的例子.c create mode 100644 翁凯C语言/11/按位运算.c create mode 100644 翁凯C语言/11/移位运算.c create mode 100644 翁凯C语言/12/可变数组.c create mode 100644 翁凯C语言/12/可变数组的数据访问.c create mode 100644 翁凯C语言/12/可变数组的缺陷.c create mode 100644 翁凯C语言/12/可变数组的自动增长.c create mode 100644 翁凯C语言/13/链表.c create mode 100644 翁凯C语言/13/链表的函数.c create mode 100644 翁凯C语言/13/链表的搜索.c create mode 100644 翁凯C语言/2/coin.c create mode 100644 翁凯C语言/2/coin2.c create mode 100644 翁凯C语言/2/n的阶乘.c create mode 100644 翁凯C语言/2/n的阶乘2.c create mode 100644 翁凯C语言/2/n的阶乘3.c create mode 100644 翁凯C语言/2/sum.c create mode 100644 翁凯C语言/2/sum2.c create mode 100644 翁凯C语言/2/sum3.c create mode 100644 翁凯C语言/2/最大公约数(辗转相除法).c create mode 100644 翁凯C语言/2/最大公约数.c create mode 100644 翁凯C语言/2/最大公约数2.c create mode 100644 翁凯C语言/2/正序分解整数.c create mode 100644 翁凯C语言/2/正序分解整数2.c create mode 100644 翁凯C语言/2/正序分解整数3.c create mode 100644 翁凯C语言/2/正序整数分解4.c create mode 100644 翁凯C语言/2/素数判断.c create mode 100644 翁凯C语言/2/素数判断2.c create mode 100644 翁凯C语言/2/素数判断3.c create mode 100644 翁凯C语言/3/a的连续和.c create mode 100644 翁凯C语言/3/n项求和.c create mode 100644 翁凯C语言/3/九九乘法表.c create mode 100644 翁凯C语言/3/字符类型.c create mode 100644 翁凯C语言/3/念数字.c create mode 100644 翁凯C语言/3/整数的格式化.c create mode 100644 翁凯C语言/3/整数类型表示数的范围.c create mode 100644 翁凯C语言/3/整数类型表示数的范围2.c create mode 100644 翁凯C语言/3/整数类型表示数的范围3.c create mode 100644 翁凯C语言/3/整数类型表示数的范围4.c create mode 100644 翁凯C语言/3/条件运算和逗号运算.c create mode 100644 翁凯C语言/3/水仙花数.c create mode 100644 翁凯C语言/3/浮点数的范围与精度.c create mode 100644 翁凯C语言/3/浮点数的输入和输出.c create mode 100644 翁凯C语言/3/猜数游戏.c create mode 100644 翁凯C语言/3/类型转换.c create mode 100644 翁凯C语言/3/约分最简分式.c create mode 100644 翁凯C语言/3/给定条件的整数集.c create mode 100644 翁凯C语言/3/统计素数并求和.c create mode 100644 翁凯C语言/3/逃逸字符.c create mode 100644 翁凯C语言/3/逻辑运算.c create mode 100644 翁凯C语言/4/从函数的返回值.c create mode 100644 翁凯C语言/4/函数原型.c create mode 100644 翁凯C语言/4/函数嵌套递归.c create mode 100644 翁凯C语言/4/函数求和.c create mode 100644 翁凯C语言/4/函数的其它细节问题.c create mode 100644 翁凯C语言/4/函数的定义和使用.c create mode 100644 翁凯C语言/4/参数传递.c create mode 100644 翁凯C语言/4/本地变量.c create mode 100644 翁凯C语言/5/二维数组.c create mode 100644 翁凯C语言/5/二维数组中的鞍点.c create mode 100644 翁凯C语言/5/二维数组:矩阵运算.c create mode 100644 翁凯C语言/5/二维数组:矩阵运算2.c create mode 100644 翁凯C语言/5/初试数组.c create mode 100644 翁凯C语言/5/定义数组.c create mode 100644 翁凯C语言/5/对称矩阵.c create mode 100644 翁凯C语言/5/数组来统计个数.c create mode 100644 翁凯C语言/5/数组的例子:冒泡排序.c create mode 100644 翁凯C语言/5/数组的例子:素数.c create mode 100644 翁凯C语言/5/数组的例子:素数2.c create mode 100644 翁凯C语言/5/数组的运算.c create mode 100644 翁凯C语言/5/杨辉三角.c create mode 100644 翁凯C语言/5/矩阵对应位置元素相加.c create mode 100644 翁凯C语言/5/矩阵对角线的和.c create mode 100644 翁凯C语言/5/矩阵的应用.c create mode 100644 翁凯C语言/5/矩阵的最大值.c create mode 100644 翁凯C语言/5/转置矩阵.c create mode 100644 翁凯C语言/6/函数指针.c create mode 100644 翁凯C语言/6/动态内存分配.c create mode 100644 翁凯C语言/6/取地址计算:&运算符取得变量的地址.c create mode 100644 翁凯C语言/6/指针与const:指针本身和所指的变量都可能const.c create mode 100644 翁凯C语言/6/指针与数组.c create mode 100644 翁凯C语言/6/指针函数.c create mode 100644 翁凯C语言/6/指针变量:记录地址的变量.c create mode 100644 翁凯C语言/6/指针数组.c create mode 100644 翁凯C语言/6/指针的使用.c create mode 100644 翁凯C语言/6/指针运算.c create mode 100644 翁凯C语言/7/单字符的输入输出.c create mode 100644 翁凯C语言/7/字符串.c create mode 100644 翁凯C语言/7/字符串中找字符.c create mode 100644 翁凯C语言/7/字符串中找字符串2.c create mode 100644 翁凯C语言/7/字符串函数strcmp.c create mode 100644 翁凯C语言/7/字符串函数strcpy.c create mode 100644 翁凯C语言/7/字符串函数strlen.c create mode 100644 翁凯C语言/7/字符串变量.c create mode 100644 翁凯C语言/7/字符串数组.c create mode 100644 翁凯C语言/7/字符串数组2.c create mode 100644 翁凯C语言/7/字符串的输入输出.c create mode 100644 翁凯C语言/7/字符串输出回文字.c create mode 100644 翁凯C语言/8/动态链表.c create mode 100644 翁凯C语言/8/枚举.c create mode 100644 翁凯C语言/8/类型定义.c create mode 100644 翁凯C语言/8/结构与函数.c create mode 100644 翁凯C语言/8/结构与函数2.c create mode 100644 翁凯C语言/8/结构中的结构3.c create mode 100644 翁凯C语言/8/结构类型.c create mode 100644 翁凯C语言/8/联合.c create mode 100644 翁凯C语言/9/全局变量.c create mode 100644 翁凯C语言/9/声明.c create mode 100644 翁凯C语言/9/大程序.c create mode 100644 翁凯C语言/9/头文件.c create mode 100644 翁凯C语言/9/宏定义.c create mode 100644 翁凯C语言/9/带参数的宏.c create mode 100644 翁凯C语言/9/返回指针的函数.c create mode 100644 翁凯C语言/9/静态本地变量.c create mode 100644 草稿/test.md create mode 100644 草稿/test.tex create mode 100644 草稿/草稿1.c create mode 100644 草稿/草稿2.c create mode 100644 课上代码练习/1.1.1/初识C语言.c create mode 100644 课上代码练习/1.1.2/num_max.c create mode 100644 课上代码练习/1.1.3/num_sum.c create mode 100644 课上代码练习/1.1.4/char函数.c create mode 100644 课上代码练习/1.1.5/字母大小写转换.c create mode 100644 课上代码练习/1.1.6/if_else.c create mode 100644 课上代码练习/1.1.7/BMI.c create mode 100644 课上代码练习/五子棋/AI_function.md create mode 100644 课上代码练习/五子棋/README.md create mode 100644 课上代码练习/五子棋/五子棋 copy 2.c create mode 100644 课上代码练习/五子棋/五子棋 copy 3.c create mode 100644 课上代码练习/五子棋/五子棋 copy.c create mode 100644 课上代码练习/五子棋/五子棋.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..31bcf8a --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +# 排除可执行文件 +*.exe +*.out +*.o + +# 排除IDE配置文件 +.idea/ +.vscode/ +.vs/ + +# 排除Trae AI配置文件 +.trae/ + +# 排除编译输出目录 +output/ + +# 排除临时文件 +*.tmp +*.temp + +# 排除系统文件 +.DS_Store +Thumbs.db + +# 排除竞赛平台配置文件 +.cph/ \ No newline at end of file diff --git a/翁凯C语言/1/Hello.c b/翁凯C语言/1/Hello.c new file mode 100644 index 0000000..bd498d2 --- /dev/null +++ b/翁凯C语言/1/Hello.c @@ -0,0 +1,21 @@ +#include + +int main() +{ + int x; + int n=0; + + scanf("%d", &x); + + n++; + x=x/10; + while(x>10) + { + n++; + x=x/10; + } + printf("%d\n",n); + return 0; +} + + \ No newline at end of file diff --git a/翁凯C语言/1/average math.c b/翁凯C语言/1/average math.c new file mode 100644 index 0000000..4d4822f --- /dev/null +++ b/翁凯C语言/1/average math.c @@ -0,0 +1,31 @@ +#include +#include +#include + +int main() +{ + int number; + int sum = 0; + int count = 0; + + printf("请输入数字\n"); + scanf("%d", &number); + while(number!=-1) + { + sum = sum+number; + count = count+1; + printf("请输入数字\n"); + scanf("%d", &number); + } + + if (count > 0) + { + printf("平均数是%.2f\n", (float)sum / count); + } + else + { + printf("未输入有效数字\n"); + } + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/1/guess.c b/翁凯C语言/1/guess.c new file mode 100644 index 0000000..5bdfd97 --- /dev/null +++ b/翁凯C语言/1/guess.c @@ -0,0 +1,31 @@ +#include +#include +#include + +int main() +{ + srand(time(0)); + int number = rand()%100+1; + int count = 0; + int a = 0; + printf("我已经想好了一个1到100之间的数。"); + + do + { + printf("请猜这个1到100之间的数:"); + scanf("%d", &a); + count = count+1; + + if(a>number) + { + printf("你猜的数大了。"); + } + else if(a +#include +#include + +int main() +{ + int x; + scanf("%d", &x); + + int number; + int renum=0; + + while(x>0) + { + number = x%10; + printf("%d", number); + renum = renum*10+number; + printf("x=%d, number=%d,renum=%d\n", x, number, renum); + x/=10; + } + printf("%d", renum); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/10/二进制文件.c b/翁凯C语言/10/二进制文件.c new file mode 100644 index 0000000..9e5f9d7 --- /dev/null +++ b/翁凯C语言/10/二进制文件.c @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#endif + +// !ļ +/* + 1.ļ + ʵеļնǶƵıļ޷򵥵ķʽԶдļ + moretail + cat + vi + ļҪרŵijдļıļǸʽ,ܾת + 2.ı vs + Unixϲıļݴ洢ͳ + ʽն˵ijʹϲıͼtalk" + UnixshelṩһЩдıС + Windowsϲöļ + DOSDzݸĻ̳кϤUnixĻ + PCտʼʱޣDOSޣƸӽײ + 3.ı vs + ıǷд,ҿƽ̨ + ıȱdzҪʽ + Ƶȱд,Ҳƽ̨ + intĴСһ£С˵. + Ƶŵdzд + 4.ΪʲôҪļ + UnixıWindowsע + ΢еݶݿ + ýֻǶƵ + ʵǣͨдļֱӶдļ + 5.Ϊʲônitem? + ΪļĶдһ㶼ͨһṹIJе + nitem˵ζдṹ + 6.ļжλ + long ftell(FILE *stream); + int fseek(FILE *stream, long offset, int whence); + SEEK_SET:ͷʼ + SEEK_CUR:ӵǰλÿʼ + SEEK_END:βʼ() +*/ + +int main() +{ + // ÿ̨ΪUTF-8 +#ifdef _WIN32 + system("chcp 65001 > nul"); // ÿ̨ΪUTF-8 + SetConsoleOutputCP(65001); // ÿ̨ + SetConsoleCP(65001); // ÿ̨ +#endif + + + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/10/文件输入输出.c b/翁凯C语言/10/文件输入输出.c new file mode 100644 index 0000000..6769fd4 --- /dev/null +++ b/翁凯C语言/10/文件输入输出.c @@ -0,0 +1,52 @@ +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#endif + +// !文件输入输出 +/* + 1.FILE + FILE* fopen(const char * restrict path, const char* restrict mode); + int fclose(FILE *stream); + fscanf(FILE*....) + fprintf(FILE*....) + 2.打开文件的标准代码 + FILE*fp = fopen("file","r"); + if(fp){ + fscanf(fp....); + fclose(fp); + }else{ + printf("打开文件失败"); + } +*/ + +int main() +{ + // 设置控制台编码为UTF-8 +#ifdef _WIN32 + system("chcp 65001 > nul"); // 设置控制台编码为UTF-8 + SetConsoleOutputCP(65001); // 设置控制台输出编码 + SetConsoleCP(65001); // 设置控制台输入编码 +#endif + + FILE *fp = fopen("test.txt", "r"); + if (fp) + { + int num; + fscanf(fp,"%d", &num); + printf("%d\n", num); + fclose(fp); + } + else + { + printf("打开文件失败\n"); + } + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/10/格式化输入输出.c b/翁凯C语言/10/格式化输入输出.c new file mode 100644 index 0000000..b888ef8 --- /dev/null +++ b/翁凯C语言/10/格式化输入输出.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#endif + +// !ʽ +/* + 1.ʽ + printf + %[flags][width][.prec][hlL]type + scanf + %[flag]type + 2.printfscanfķֵ + Ŀ + ַ + ҪϸijУӦжÿεscanfprintķֵӶ˽Ƿ +*/ + +int main() +{ + // ÿ̨ΪUTF-8 +#ifdef _WIN32 + system("chcp 65001 > nul"); // ÿ̨ΪUTF-8 + SetConsoleOutputCP(65001); // ÿ̨ + SetConsoleCP(65001); // ÿ̨ +#endif + + printf("%+9d\n", 123); + printf("%+9d\n", -123); + printf("%-9d\n", 123); + + printf("%+09d\n", 123); + printf("%+09d\n", -123); + + int n; + printf("%dty%n\n", 12345, &n); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/11/位段.c b/翁凯C语言/11/位段.c new file mode 100644 index 0000000..7b40c6b --- /dev/null +++ b/翁凯C语言/11/位段.c @@ -0,0 +1,33 @@ +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#endif + +// !位运算的例子 +/* + 1.C有这些按位运算的运算符: + .& 按位的与 + .1 按位的或 + .~ 按位取反 + .^ 按位的异或 + .<< 左移 + .>> 右移 +*/ + +int main() +{ + // 设置控制台编码为UTF-8 +#ifdef _WIN32 + system("chcp 65001 > nul"); // 设置控制台编码为UTF-8 + SetConsoleOutputCP(65001); // 设置控制台输出编码 + SetConsoleCP(65001); // 设置控制台输入编码 +#endif + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/11/位运算的例子.c b/翁凯C语言/11/位运算的例子.c new file mode 100644 index 0000000..7b40c6b --- /dev/null +++ b/翁凯C语言/11/位运算的例子.c @@ -0,0 +1,33 @@ +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#endif + +// !位运算的例子 +/* + 1.C有这些按位运算的运算符: + .& 按位的与 + .1 按位的或 + .~ 按位取反 + .^ 按位的异或 + .<< 左移 + .>> 右移 +*/ + +int main() +{ + // 设置控制台编码为UTF-8 +#ifdef _WIN32 + system("chcp 65001 > nul"); // 设置控制台编码为UTF-8 + SetConsoleOutputCP(65001); // 设置控制台输出编码 + SetConsoleCP(65001); // 设置控制台输入编码 +#endif + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/11/按位运算.c b/翁凯C语言/11/按位运算.c new file mode 100644 index 0000000..d34d599 --- /dev/null +++ b/翁凯C语言/11/按位运算.c @@ -0,0 +1,33 @@ +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#endif + +// !按位运算 +/* + 1.C有这些按位运算的运算符: + .& 按位的与 + .1 按位的或 + .~ 按位取反 + .^ 按位的异或 + .<< 左移 + .>> 右移 +*/ + +int main() +{ + // 设置控制台编码为UTF-8 +#ifdef _WIN32 + system("chcp 65001 > nul"); // 设置控制台编码为UTF-8 + SetConsoleOutputCP(65001); // 设置控制台输出编码 + SetConsoleCP(65001); // 设置控制台输入编码 +#endif + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/11/移位运算.c b/翁凯C语言/11/移位运算.c new file mode 100644 index 0000000..f271b57 --- /dev/null +++ b/翁凯C语言/11/移位运算.c @@ -0,0 +1,33 @@ +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#endif + +// !移位运算 +/* + 1.C有这些按位运算的运算符: + .& 按位的与 + .1 按位的或 + .~ 按位取反 + .^ 按位的异或 + .<< 左移 + .>> 右移 +*/ + +int main() +{ + // 设置控制台编码为UTF-8 +#ifdef _WIN32 + system("chcp 65001 > nul"); // 设置控制台编码为UTF-8 + SetConsoleOutputCP(65001); // 设置控制台输出编码 + SetConsoleCP(65001); // 设置控制台输入编码 +#endif + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/12/可变数组.c b/翁凯C语言/12/可变数组.c new file mode 100644 index 0000000..2b52f3f --- /dev/null +++ b/翁凯C语言/12/可变数组.c @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#endif + +// !可变数组 +/* + 1.可变数组 +*/ + +typedef struct{ + int *array; + int size; +} Array; + +Array array_create(int init_size) +{ + Array a; + a.size = init_size; + a.array = (int *)malloc(sizeof(int) * a.size); + return a; +} + +void array_free(Array *a) +{ + free(a->array); + a->array = NULL; + a->size = 0; +} + +int main() +{ + // 设置控制台编码为UTF-8 +#ifdef _WIN32 + system("chcp 65001 > nul"); // 设置控制台编码为UTF-8 + SetConsoleOutputCP(65001); // 设置控制台输出编码 + SetConsoleCP(65001); // 设置控制台输入编码 +#endif + + Array a = array_create(100); + array_free(&a); + + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/12/可变数组的数据访问.c b/翁凯C语言/12/可变数组的数据访问.c new file mode 100644 index 0000000..f4407aa --- /dev/null +++ b/翁凯C语言/12/可变数组的数据访问.c @@ -0,0 +1,81 @@ +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#endif + +// !可变数组的数据访问 +/* + 1.可变数组 +*/ + +typedef struct{ + int *array; + int size; +} Array; + +Array array_create(int init_size) +{ + Array a; + a.size = init_size; + a.array = (int *)malloc(sizeof(int) * a.size); + return a; +} + +void array_free(Array *a) +{ + free(a->array); + a->array = NULL; + a->size = 0; +} + +// 封装 +int array_size(const Array *a) +{ + return a->size; +} + +int* array_at(Array *a, int index) +{ + if (index >= a->size) + { + a->size = index + 1; + a->array = (int *)realloc(a->array, sizeof(int) * a->size); + } + return &a->array[index]; +} + +int array_get(const Array *a, int index) +{ + return a->array[index]; +} + +void array_set(Array *a, int index, int value) +{ + a->array[index] = value; +} + +int main() +{ + // 设置控制台编码为UTF-8 +#ifdef _WIN32 + system("chcp 65001 > nul"); // 设置控制台编码为UTF-8 + SetConsoleOutputCP(65001); // 设置控制台输出编码 + SetConsoleCP(65001); // 设置控制台输入编码 +#endif + + Array a = array_create(100); + printf("%d\n", array_size(&a)); + + *array_at(&a, 0) = 10; + printf("%d\n", *array_at(&a, 0)); + array_free(&a); + + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/12/可变数组的缺陷.c b/翁凯C语言/12/可变数组的缺陷.c new file mode 100644 index 0000000..3386213 --- /dev/null +++ b/翁凯C语言/12/可变数组的缺陷.c @@ -0,0 +1,103 @@ +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#endif + +// !可变数组的缺陷 +/* + 1.可变数组 +*/ + +const BLOCK_SIZE = 20; + +typedef struct{ + int *array; + int size; +} Array; + +Array array_create(int init_size) +{ + Array a; + a.size = init_size; + a.array = (int *)malloc(sizeof(int) * a.size); + return a; +} + +void array_free(Array *a) +{ + free(a->array); + a->array = NULL; + a->size = 0; +} + +// 封装 +int array_size(const Array *a) +{ + return a->size; +} + +int* array_at(Array *a, int index) +{ + if (index >= a->size) + { + array_inflate(a, (index/BLOCK_SIZE+1)*BLOCK_SIZE - a->size); + } + return &a->array[index]; +} + +int array_get(const Array *a, int index) +{ + return a->array[index]; +} + +void array_set(Array *a, int index, int value) +{ + a->array[index] = value; +} + +void array_inflate(Array *a, int more_size) +{ + int *p = (int*)malloc(sizeof(int)*(a->size + more_size)); + int i; + memccpy(p, a->array, sizeof(int)*a->size, a->size); + free(a->array); + a->array = p; + a->size =+ more_size; +} + +int main() +{ + // 设置控制台编码为UTF-8 +#ifdef _WIN32 + system("chcp 65001 > nul"); // 设置控制台编码为UTF-8 + SetConsoleOutputCP(65001); // 设置控制台输出编码 + SetConsoleCP(65001); // 设置控制台输入编码 +#endif + + Array a = array_create(100); + printf("%d\n", array_size(&a)); + + *array_at(&a, 0) = 10; + printf("%d\n", *array_at(&a, 0)); + int number; + int cnt = 0; + while(number!=-1) + { + scanf("%d", &number); + if (number!=-1) + { + *array_at(&a, cnt) = number; + cnt++; + } + } + array_free(&a); + + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/12/可变数组的自动增长.c b/翁凯C语言/12/可变数组的自动增长.c new file mode 100644 index 0000000..5d88103 --- /dev/null +++ b/翁凯C语言/12/可变数组的自动增长.c @@ -0,0 +1,103 @@ +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#endif + +// !可变数组的自动增长 +/* + 1.可变数组 +*/ + +const BLOCK_SIZE = 20; + +typedef struct{ + int *array; + int size; +} Array; + +Array array_create(int init_size) +{ + Array a; + a.size = init_size; + a.array = (int *)malloc(sizeof(int) * a.size); + return a; +} + +void array_free(Array *a) +{ + free(a->array); + a->array = NULL; + a->size = 0; +} + +// 封装 +int array_size(const Array *a) +{ + return a->size; +} + +int* array_at(Array *a, int index) +{ + if (index >= a->size) + { + array_inflate(a, (index/BLOCK_SIZE+1)*BLOCK_SIZE - a->size); + } + return &a->array[index]; +} + +int array_get(const Array *a, int index) +{ + return a->array[index]; +} + +void array_set(Array *a, int index, int value) +{ + a->array[index] = value; +} + +void array_inflate(Array *a, int more_size) +{ + int *p = (int*)malloc(sizeof(int)*(a->size + more_size)); + int i; + memccpy(p, a->array, sizeof(int)*a->size, a->size); + free(a->array); + a->array = p; + a->size =+ more_size; +} + +int main() +{ + // 设置控制台编码为UTF-8 +#ifdef _WIN32 + system("chcp 65001 > nul"); // 设置控制台编码为UTF-8 + SetConsoleOutputCP(65001); // 设置控制台输出编码 + SetConsoleCP(65001); // 设置控制台输入编码 +#endif + + Array a = array_create(100); + printf("%d\n", array_size(&a)); + + *array_at(&a, 0) = 10; + printf("%d\n", *array_at(&a, 0)); + int number; + int cnt = 0; + while(number!=-1) + { + scanf("%d", &number); + if (number!=-1) + { + *array_at(&a, cnt) = number; + cnt++; + } + } + array_free(&a); + + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/13/链表.c b/翁凯C语言/13/链表.c new file mode 100644 index 0000000..b703a1b --- /dev/null +++ b/翁凯C语言/13/链表.c @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#endif + +// !链表 +/* + 1. +*/ + +typedef struct _node{ + int value; + struct _node *next; +} Node; + +int main() +{ + // 设置控制台编码为UTF-8 +#ifdef _WIN32 + system("chcp 65001 > nul"); // 设置控制台编码为UTF-8 + SetConsoleOutputCP(65001); // 设置控制台输出编码 + SetConsoleCP(65001); // 设置控制台输入编码 +#endif + + Node *head = NULL; + int number; + do { + printf("请输入一个整数:"); + scanf("%d", &number); + if (number!=-1) + { + // 创建一个节点 + Node *p=(Node*)malloc(sizeof(Node)); + p->value = number; + p->next = NULL; + // 将节点插入链表 + Node *last = head; + if (last!=NULL) + { + while (last->next!=NULL) + { + last = last->next; + } + // attach + last->next = p; + } + else + { + head = p; + } + } + } while (number!=-1); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/13/链表的函数.c b/翁凯C语言/13/链表的函数.c new file mode 100644 index 0000000..9776cf0 --- /dev/null +++ b/翁凯C语言/13/链表的函数.c @@ -0,0 +1,74 @@ +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#endif + +// !链表 +/* + 1. +*/ + +typedef struct _node{ + int value; + struct _node *next; +} Node; + +typedef struct _list{ + Node *head; + Node *tail; +} List; + +void add(List* pList, int value) +{ + Node *p=(Node*)malloc(sizeof(Node)); + p->value = value; + p->next = NULL; + // 将节点插入链表 + Node *last = pList->head; + if (last!=NULL) + { + while (last->next!=NULL) + { + last = last->next; + } + // attach + last->next = p; + } + else + { + pList->head = p; + } +} + +int main() +{ + // 设置控制台编码为UTF-8 +#ifdef _WIN32 + system("chcp 65001 > nul"); // 设置控制台编码为UTF-8 + SetConsoleOutputCP(65001); // 设置控制台输出编码 + SetConsoleCP(65001); // 设置控制台输入编码 +#endif + + List list; + list.head = NULL; + list.tail = NULL; + int number; + do { + printf("请输入一个整数:"); + scanf("%d", &number); + if (number!=-1) + { + + add(&list, number); + + } + } while (number!=-1); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/13/链表的搜索.c b/翁凯C语言/13/链表的搜索.c new file mode 100644 index 0000000..9776cf0 --- /dev/null +++ b/翁凯C语言/13/链表的搜索.c @@ -0,0 +1,74 @@ +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#endif + +// !链表 +/* + 1. +*/ + +typedef struct _node{ + int value; + struct _node *next; +} Node; + +typedef struct _list{ + Node *head; + Node *tail; +} List; + +void add(List* pList, int value) +{ + Node *p=(Node*)malloc(sizeof(Node)); + p->value = value; + p->next = NULL; + // 将节点插入链表 + Node *last = pList->head; + if (last!=NULL) + { + while (last->next!=NULL) + { + last = last->next; + } + // attach + last->next = p; + } + else + { + pList->head = p; + } +} + +int main() +{ + // 设置控制台编码为UTF-8 +#ifdef _WIN32 + system("chcp 65001 > nul"); // 设置控制台编码为UTF-8 + SetConsoleOutputCP(65001); // 设置控制台输出编码 + SetConsoleCP(65001); // 设置控制台输入编码 +#endif + + List list; + list.head = NULL; + list.tail = NULL; + int number; + do { + printf("请输入一个整数:"); + scanf("%d", &number); + if (number!=-1) + { + + add(&list, number); + + } + } while (number!=-1); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/2/coin.c b/翁凯C语言/2/coin.c new file mode 100644 index 0000000..40eadc5 --- /dev/null +++ b/翁凯C语言/2/coin.c @@ -0,0 +1,31 @@ +#include +#include +#include + +int main() +{ + int x; + int n=0; + int one,two,five; + + printf("Ǯ"); + scanf("%d", &x); + + for(one=0;one<=x*10;one++) + { + for(two=0;two<=x*5;two++) + { + for(five=0;five<=x*2;five++) + { + if(one*1 + two*2 + five*5 == x*10) + { + n +=1; + printf("%dԪǮ%d1ǡ%d2Ǻ%d5ǻ\n", x, one, two, five); + } + } + } + } + printf("һ%dĿ", n); + + return 0; +} diff --git a/翁凯C语言/2/coin2.c b/翁凯C语言/2/coin2.c new file mode 100644 index 0000000..9c7392d --- /dev/null +++ b/翁凯C语言/2/coin2.c @@ -0,0 +1,30 @@ +#include +#include +#include + +int main() +{ + int x; + int one,two,five; + + printf("Ǯ"); + scanf("%d", &x); + + for(one=0;one<=x*10;one++) + { + for(two=0;two<=x*5;two++) + { + for(five=0;five<=x*2;five++) + { + if(one*1 + two*2 + five*5 == x*10) + { + printf("%dԪǮ%d1ǡ%d2Ǻ%d5ǻ\n", x, one, two, five); + goto out; //Ƕ׵ѭڲֱӽout: + } + } + } + } + out: + + return 0; +} diff --git a/翁凯C语言/2/n的阶乘.c b/翁凯C语言/2/n的阶乘.c new file mode 100644 index 0000000..f1e9492 --- /dev/null +++ b/翁凯C语言/2/n的阶乘.c @@ -0,0 +1,21 @@ +#include +#include +#include + +int main() +{ + int n; + scanf("%d", &n); + + int a=1; + int b=1; + + while(b<=n) + { + a=a*b; + b=b+1; + } + printf("n!=%d\n", a); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/2/n的阶乘2.c b/翁凯C语言/2/n的阶乘2.c new file mode 100644 index 0000000..5b339bb --- /dev/null +++ b/翁凯C语言/2/n的阶乘2.c @@ -0,0 +1,20 @@ +#include +#include +#include + +int main() +{ + int n; + scanf("%d", &n); + + int a=1; + int b=n; + + for(n=n;n>1;n-- ) + { + a=a*n; + } + printf("%d!=%d\n", b, a); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/2/n的阶乘3.c b/翁凯C语言/2/n的阶乘3.c new file mode 100644 index 0000000..5b339bb --- /dev/null +++ b/翁凯C语言/2/n的阶乘3.c @@ -0,0 +1,20 @@ +#include +#include +#include + +int main() +{ + int n; + scanf("%d", &n); + + int a=1; + int b=n; + + for(n=n;n>1;n-- ) + { + a=a*n; + } + printf("%d!=%d\n", b, a); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/2/sum.c b/翁凯C语言/2/sum.c new file mode 100644 index 0000000..1074445 --- /dev/null +++ b/翁凯C语言/2/sum.c @@ -0,0 +1,22 @@ +#include +#include +#include + +int main() +{ + int n; + int x; + double f=0.0; //fСdoubleʾ + + printf("֣"); + scanf("%d", &n); + + for (x=1 ; x<=n; x++) + { + f = f+(1.0/x); //1С1.0ʾС + } + + printf("f(%d)=%f\n", n, f); //fС%fʾ + + return 0; +} diff --git a/翁凯C语言/2/sum2.c b/翁凯C语言/2/sum2.c new file mode 100644 index 0000000..f7a5dc8 --- /dev/null +++ b/翁凯C语言/2/sum2.c @@ -0,0 +1,28 @@ +#include +#include +#include + +int main() +{ + int n; + int m; + int x; + double f=0.0; //fСdoubleʾ + + printf("֣"); + scanf("%d", &n); + + for (x=1 ; x<=n; x++) + { + m = 1; + if (x%2==0) + { + m = -1; + } + f = f+(1.0/x)*m; + } + + printf("f(%d)=%f\n", n, f); //fС%fʾ + + return 0; +} diff --git a/翁凯C语言/2/sum3.c b/翁凯C语言/2/sum3.c new file mode 100644 index 0000000..bce4822 --- /dev/null +++ b/翁凯C语言/2/sum3.c @@ -0,0 +1,24 @@ +#include +#include +#include + +int main() +{ + int n; + int m=1; + int x; + double f=0.0; //fСdoubleʾ + + printf("֣"); + scanf("%d", &n); + + for (x=1 ; x<=n; x++) + { + f = f+(1.0/x)*m; + m = -1; + } + + printf("f(%d)=%f\n", n, f); //fС%fʾ + + return 0; +} diff --git a/翁凯C语言/2/最大公约数(辗转相除法).c b/翁凯C语言/2/最大公约数(辗转相除法).c new file mode 100644 index 0000000..b15de50 --- /dev/null +++ b/翁凯C语言/2/最大公约数(辗转相除法).c @@ -0,0 +1,40 @@ +#include +#include +#include +#include + +int gcd(int a,int b) +{ + int c; + while(c>0) + { + c = a % b; + a = b; + b = c; + } + return a; +} + +int lcm(int a, int b) +{ + return (a / gcd(a, b)) * b; +} + +int main() +{ + int a; + int b; + printf(""); + scanf("%d %d", &a, &b); + + if (a<0 || b<0) + { + printf("룡\n"); + return -1; + } + else + { + printf("%d%dԼǣ%d\n", a, b, gcd(a, b)); + } + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/2/最大公约数.c b/翁凯C语言/2/最大公约数.c new file mode 100644 index 0000000..72e83c1 --- /dev/null +++ b/翁凯C语言/2/最大公约数.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include + +int num_small(int a,int b) +{ + int n = a; + if (a>b) + { + n = b; + } + return n; +} + +int main() +{ + int gcd=0; + int a; + int b; + int n; + printf(""); + scanf("%d %d", &a, &b); + + if (a<0 || b<0) + { + printf("룡\n"); + return -1; + } + else + { + n = num_small(a,b); + + for (gcd=n;gcd>=1;gcd--) + { + if (a%gcd==0 && b%gcd==0) + { + printf("Լǣ%d\n", gcd); + break; + } + + } + } + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/2/最大公约数2.c b/翁凯C语言/2/最大公约数2.c new file mode 100644 index 0000000..cc6fa40 --- /dev/null +++ b/翁凯C语言/2/最大公约数2.c @@ -0,0 +1,39 @@ +#include +#include +#include +#include + +int gcd(int a,int b) //Լ +{ + int gcd = a; + if (a>b) + { + gcd = b; + } + for (;gcd>=1;gcd--) + { + if (a%gcd==0 && b%gcd==0) + { + return gcd; + break; + } + } +} +int main() +{ + int a; + int b; + printf(""); + scanf("%d %d", &a, &b); + + if (a<0 || b<0) + { + printf("룡\n"); + return -1; + } + else + { + printf("%d%dԼǣ%d\n", a, b, gcd(a, b)); + } + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/2/正序分解整数.c b/翁凯C语言/2/正序分解整数.c new file mode 100644 index 0000000..4f66e46 --- /dev/null +++ b/翁凯C语言/2/正序分解整数.c @@ -0,0 +1,32 @@ +#include +#include +#include + +int main() +{ + int x; + int a=0; + int n=0; + int m=0; + printf("֣"); + scanf("%d", &x); + + do{ + a = x%10; + n = n*10+a; + x = x/10; + } while (x>0); + + do{ + m = n%10; + printf("%d", m); + if (n>=10) + { + printf(" "); + } + n = n/10; + } while (n>0); + printf("\n"); + + return 0; +} diff --git a/翁凯C语言/2/正序分解整数2.c b/翁凯C语言/2/正序分解整数2.c new file mode 100644 index 0000000..4135d0e --- /dev/null +++ b/翁凯C语言/2/正序分解整数2.c @@ -0,0 +1,51 @@ +#include +#include +#include + +int num_weishu(int num) //жλ +{ + int n = 0; + num = abs(num); + if (num==0) + { + return 1; + } + while (num>0) + { + num /= 10; + n++; + } + return n; +} + +int main() +{ + int x; + int m=0; + printf("һ"); + scanf("%d", &x); + int a = num_weishu(x); + + if(a>9) + { + printf("֧λ\n"); + return -1; + } + else + { + while (a>0) + { + m = x/a; + printf("%d", m); + x = x%a; + a = a/10; + if (a>1) + { + printf(" "); + } + } + printf("\n"); + } + + return 0; +} diff --git a/翁凯C语言/2/正序分解整数3.c b/翁凯C语言/2/正序分解整数3.c new file mode 100644 index 0000000..07f7aa1 --- /dev/null +++ b/翁凯C语言/2/正序分解整数3.c @@ -0,0 +1,56 @@ +#include +#include + +int num_weishu(int num) { + int n = 0; + num = abs(num); + if (num == 0) return 1; + while (num > 0) { + num /= 10; + n++; + } + return n; +} + +int main() +{ + int x, sign = 1; + printf("һ"); + scanf("%d", &x); + + if (x < 0) // + { + sign = -1; + x = -x; // תΪ + } + + int a = num_weishu(x); + if (a > 9) + { + printf("֧λ\n"); + return -1; + } + else + { + int b=1; + while (a>0) + { + int m = x/a; // һӦ÷ + if (b) + { + printf("%d", sign*m); + b = 0; + } + else + { + printf("%d", m); + } + x %= a; + a /= 10; + if (a > 0) printf(" "); //ֺӿո + } + printf("\n"); + } + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/2/正序整数分解4.c b/翁凯C语言/2/正序整数分解4.c new file mode 100644 index 0000000..69a0aee --- /dev/null +++ b/翁凯C语言/2/正序整数分解4.c @@ -0,0 +1,62 @@ +#include +#include +#include +#include + +int num_weishu(int num) //жλ +{ + int n = 0; + num = abs(num); + if (num == 0) + { + return 1; + } + while (num > 0) + { + num /= 10; + n++; + } + return n; +} + +int main() +{ + int x; + int a=0; + int b=0; + int m=0; + printf("һ"); + scanf("%d", &x); + + a = num_weishu(x); + b = (int)(pow(10,a-1)+0.1); //powǴηĺ,+0.1Ϊ˱⸡ + printf("ֵλ%d\n", a); + + if(a>9) + { + printf("֧λ\n"); + return -1; + } + else + { + + if (x<0) // + { + printf("-"); + } + while (b>0) + { + m = x/b; + printf("%d", m); + if (b>9) + { + printf(" "); + } + x = x%b; + b = b/10; + } + printf("\n"); + } + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/2/素数判断.c b/翁凯C语言/2/素数判断.c new file mode 100644 index 0000000..3463c37 --- /dev/null +++ b/翁凯C语言/2/素数判断.c @@ -0,0 +1,32 @@ +#include +#include +#include + +int main() +{ + int n; + printf("֣"); + scanf("%d", &n); + + int a; + int b=1; + + for(a=2;a +#include +#include + +int main() +{ + int n; + int x=0; + printf("֣"); + scanf("%d", &x); + + for(n=2;n<=x;n++) + { + int a; + int b=1; + + for(a=2;a +#include +#include +#include + +// !жϵļ򻯰汾 +int sushu(int x) +{ + int ret = 1; + + if (x <= 1) + { + ret = 0; + } + + int i; + if (x == 2 || (x % 2 == 0 && x != 2)) // ųż + { + ret = 0; + } + for (i = 3; i < (int)sqrt(x)+1; i += 2) + { + if (x % i == 0) + { + ret = 0; + break; + } + } + + return ret; +} + +int main() +{ + int x; + printf("֣"); + scanf("%d", &x); + + if (sushu(x)) + { + printf("%d\n", x); + } + else + { + printf("%d\n", x); + } + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/3/a的连续和.c b/翁凯C语言/3/a的连续和.c new file mode 100644 index 0000000..effb318 --- /dev/null +++ b/翁凯C语言/3/a的连续和.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include + +int main() +{ + // !岢ʼ + int a = 0; // ûĵһΪеĻ + int n = 0; // ûĵڶʾе + + // !ȡû + printf("an"); + scanf("%d %d", &a, &n); // ȡû + + int sum = 0; // ڴ洢еĺ + int b = a; // aijʼֵں + int count = 1; // ѭ1ʼn + + // !еĺ + while (count <= n) // ѭn + { + sum = sum + a; // ǰaӵܺsum + a = a * 10 + b; // һǰ10ټϳʼֵb + count++; // + } + + // ! + printf("֮Ϊ%d\n", sum); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/3/n项求和.c b/翁凯C语言/3/n项求和.c new file mode 100644 index 0000000..1a36955 --- /dev/null +++ b/翁凯C语言/3/n项求和.c @@ -0,0 +1,24 @@ +#include +#include +#include +#include + +int main() +{ + int N; + printf("N: "); + scanf("%d", &N); + double a = 2.0, b = 1.0, sum = 0.0; + + for (int i = 0; i < N; i++) + { + sum += a / b; + double next_a = a + b; // һķ + double next_b = a; // һķĸ + a = next_a; // · + b = next_b; // ·ĸ + } + printf("%.2f\n", sum); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/3/九九乘法表.c b/翁凯C语言/3/九九乘法表.c new file mode 100644 index 0000000..0a56cc1 --- /dev/null +++ b/翁凯C语言/3/九九乘法表.c @@ -0,0 +1,31 @@ +#include +#include +#include +#include + +int main() +{ + int n=9; + printf("һn"); + scanf("%d", &n); + + if (n < 1 || n > 9) + { + printf("룡\n"); + } + else + { + for (int i = 1; i <= n; i++) + { + for (int j = 1; j <= i; j++) + { + printf("%d*%d=%d ", i, j, i * j); + if (i == j) + { + printf("\n"); + } + } + } + } + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/3/字符类型.c b/翁凯C语言/3/字符类型.c new file mode 100644 index 0000000..7a6e8b0 --- /dev/null +++ b/翁凯C语言/3/字符类型.c @@ -0,0 +1,27 @@ +#include +#include +#include +#include + +int main() +{ + char c = '1'; // '1'ַ,,ע⣺" "Ҳַ + char d = 1; // 1,ַ + printf("%c\n", c); // %cַ + printf("%d\n", d); // %d + + char ch; + scanf("%c", &ch); // scanf("%c", &c)ַ + printf("ch=%d\n", ch); // %d + printf("ch='%c'\n", ch);// %cַ + + // !charһֱͣʾַASCII룬UnicodeȣҲ˵charͿԱʾһַҲԱʾһʾʲôȡı뷽ʽprintf%d%c + + // + char ch1 = 'a'; + ch1++; + printf("'%c'\n", ch1); //'b' + + return 0; +} + diff --git a/翁凯C语言/3/念数字.c b/翁凯C语言/3/念数字.c new file mode 100644 index 0000000..b6d0ed7 --- /dev/null +++ b/翁凯C语言/3/念数字.c @@ -0,0 +1,96 @@ +#include +#include +#include +#include + +int num_weishu(int num) // жλ +{ + int n = 0; + num = abs(num); + if (num == 0) + { + return 1; + } + while (num > 0) + { + num /= 10; + n++; + } + return n; +} + +int main() +{ + int x; + int a = 0; + int b = 0; + int m = 0; + printf("һ"); + scanf("%d", &x); + + a = num_weishu(x); + b = (int)(pow(10, a - 1) + 0.1); // powǴηĺ,+0.1Ϊ˱⸡ + printf("ֵλ%d\n", a); + + if (a > 9) + { + printf("֧λ\n"); + return -1; + } + else + { + + if (x < 0) // + { + printf("-"); + } + while (b > 0) + { + m = x / b; + switch (m) + { + case 0: + printf("ling "); + break; + case 1: + printf("yi "); + break; + case 2: + printf("er "); + break; + case 3: + printf("san "); + break; + case 4: + printf("si "); + break; + case 5: + printf("wu "); + break; + case 6: + printf("liu "); + break; + case 7: + printf("qi "); + break; + case 8: + printf("ba "); + break; + case 9: + printf("jiu "); + break; + default: + break; + } + if (b > 9) + { + printf(" "); + } + x = x % b; + b = b / 10; + } + printf("\n"); + } + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/3/整数的格式化.c b/翁凯C语言/3/整数的格式化.c new file mode 100644 index 0000000..e69de29 diff --git a/翁凯C语言/3/整数类型表示数的范围.c b/翁凯C语言/3/整数类型表示数的范围.c new file mode 100644 index 0000000..775e78e --- /dev/null +++ b/翁凯C语言/3/整数类型表示数的范围.c @@ -0,0 +1,17 @@ +#include +#include +#include +#include + +int main() +{ + unsigned char c = 127; + int i = 255; + + c = c + 1; + + printf("c=%d,i=%d", c ,i); + + return 0; + +} \ No newline at end of file diff --git a/翁凯C语言/3/整数类型表示数的范围2.c b/翁凯C语言/3/整数类型表示数的范围2.c new file mode 100644 index 0000000..5500302 --- /dev/null +++ b/翁凯C语言/3/整数类型表示数的范围2.c @@ -0,0 +1,17 @@ +#include +#include +#include +#include + +int main() +{ + char c = 127; + int i = 255; + + c = c + 1; + + printf("c=%d,i=%d", c ,i); + + return 0; + +} \ No newline at end of file diff --git a/翁凯C语言/3/整数类型表示数的范围3.c b/翁凯C语言/3/整数类型表示数的范围3.c new file mode 100644 index 0000000..6db84f4 --- /dev/null +++ b/翁凯C语言/3/整数类型表示数的范围3.c @@ -0,0 +1,25 @@ +#include +#include +#include +#include + +int main() +{ + int a = 0; + int b = 1; + + while (++a>0) + { + ; + } + printf("intֵǣ%d\n", a-1); + + while ((a=a/10)!=0) + { + b++; + } + printf("intλǣ%d\n", b); + + return 0; + +} \ No newline at end of file diff --git a/翁凯C语言/3/整数类型表示数的范围4.c b/翁凯C语言/3/整数类型表示数的范围4.c new file mode 100644 index 0000000..6db84f4 --- /dev/null +++ b/翁凯C语言/3/整数类型表示数的范围4.c @@ -0,0 +1,25 @@ +#include +#include +#include +#include + +int main() +{ + int a = 0; + int b = 1; + + while (++a>0) + { + ; + } + printf("intֵǣ%d\n", a-1); + + while ((a=a/10)!=0) + { + b++; + } + printf("intλǣ%d\n", b); + + return 0; + +} \ No newline at end of file diff --git a/翁凯C语言/3/条件运算和逗号运算.c b/翁凯C语言/3/条件运算和逗号运算.c new file mode 100644 index 0000000..17993d7 --- /dev/null +++ b/翁凯C语言/3/条件运算和逗号运算.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include +#include + +int main() +{ + /* + 条件运算符:?: + 条件运算符的优先级低于关系运算符,高于算术运算符 + 条件运算符的运算对象和求值结果都是int类型 + 条件运算符的运算对象可以是任意能转换成int类型的值 + */ + int count = 0; + scanf("%d",&count); + count=(count>20)?count-10:-count+10; + /* + 等价于 + if (count>20) + count=count-10; + else + count=-count+10; + */ + + /* + 逗号运算符:,: + 逗号用来连接两个表达式,并以其右边的表达式的值做为他的结果 + 逗号运算符的优先级在所有运算符中是最低的,所以他的两边的运算对象会先求值 + 逗号的组合关系是从左向右的,所以左边的运算对象会先求值,而右边的表达式的值就会留下来作为整个逗号表达式的值 + */ + int i; + int j; + i = 3 + 4, 5 + 6; + printf("%d\n", i); + // 结果是7,因为逗号运算符的优先级最低,所以i=3+4,5+6;这个表达式等价于i=(3+4),(5+6); + + // 例如 + for (i = 0, j = 10; i < j;i++,j--) + { + printf("%d %d\n", i, j); + } + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/3/水仙花数.c b/翁凯C语言/3/水仙花数.c new file mode 100644 index 0000000..b9cb9f2 --- /dev/null +++ b/翁凯C语言/3/水仙花数.c @@ -0,0 +1,57 @@ +#include +#include +#include +#include + +int power(int a, int x) //axη +{ + if (x < 0) + { + printf("룡\n"); + return -1; + } + else + { + int sum = 1; + for (int i = 0; i < x; i++) + { + sum *= a; + } + return sum; + } +} + +int main() +{ + int n; + printf("һn3 n 7"); + scanf("%d", &n); + + if (n < 3 || n > 7) + { + printf("룡\n"); + } + else + { + int lower = power(10, n - 1); //nλСֵ + int upper = power(10, n) - 1; //nλֵ + + for (int num = lower; num <= upper;num++) //СΧ + { + int sum=0; + int m = num; + while(m>0) + { + int a = m % 10; + sum += power(a,n); + m /= 10; + } + if (num==sum) + { + printf("%d\n", sum); + } + } + } + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/3/浮点数的范围与精度.c b/翁凯C语言/3/浮点数的范围与精度.c new file mode 100644 index 0000000..ec44812 --- /dev/null +++ b/翁凯C语言/3/浮点数的范围与精度.c @@ -0,0 +1,29 @@ +#include +#include +#include +#include + +int main() +{ + // !ķΧ + printf("%f\n", 12.0/0.0); //12/0ûжģֻиС + printf("%f\n", -12.0/0.0); + printf("%f\n", 0.0/0.0); + //infnanС + + // !ľ + float a, b, c; + a = 1.345f; //СĬdoubleͣҪfָfloat + b = 1.123f; + c = a + b; + if (c== 2.468) + { + printf("c = 2.468\n"); + } + else + { + printf("ȣ c=%.10f,%f\n", c, c); + } + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/3/浮点数的输入和输出.c b/翁凯C语言/3/浮点数的输入和输出.c new file mode 100644 index 0000000..2531e0a --- /dev/null +++ b/翁凯C语言/3/浮点数的输入和输出.c @@ -0,0 +1,20 @@ +#include +#include +#include +#include + +int main() +{ + double ff = 1234.56789; + printf("ѧff = %e\n", ff); //%eǿѧ + printf("ѧff = %E\n", ff); //%EǿѧǴдģ + printf("ͨʽff = %f\n", ff); //%fͨʽ + + double fff = 1E-10; + printf("ѧff = %e\n", fff); //%eǿѧ + printf("ѧff = %E\n", fff); //%EǿѧǴдģ + printf("ͨʽff = %f\n", fff); //%fͨʽ + printf("ͨʽff = %.16f\n", fff); //%.16fͨʽı16λС + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/3/猜数游戏.c b/翁凯C语言/3/猜数游戏.c new file mode 100644 index 0000000..c2836d9 --- /dev/null +++ b/翁凯C语言/3/猜数游戏.c @@ -0,0 +1,40 @@ +#include +#include +#include +#include + +int main() //Լ֣Լ +{ + int a, b, c, d; + printf("һƵ"); + scanf("%d %d", &a, &b); + while(c!=a) + { + c = 0; + d = 1; + d++; + printf("һ"); + scanf("%d", &c); + if(c>a) + { + printf("ˣ\n"); + } + else if(c +#include +#include +#include + +int main() +{ + // !ת + /* printfκСintֵԶתint + floatԶתdouble + scanfԶתͣҪshortͣ%hd + */ + + // !ǿת + /* ҪһǿתһͣҪʹǿתͨǽСͣ + Ҫ(type)expression,ıֵСıʱɵֵı + 磺(int)10.2 + (short)32 + ǿתȼ + */ + printf("%d\n", (short)32768); //Ϊ-32768 + + + return 0; +} + diff --git a/翁凯C语言/3/约分最简分式.c b/翁凯C语言/3/约分最简分式.c new file mode 100644 index 0000000..66a654c --- /dev/null +++ b/翁凯C语言/3/约分最简分式.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include + +int gcd(int x, int y) // Լ +{ + int c; + while (y > 0) + { + c = x % y; + x = y; + y = c; + } + return x; +} + +int main() +{ + int m; + int n; + printf("ʽm/n:"); + scanf("%d/%d", &m, &n); + + int a, b; + int num_gcd = gcd(m, n); + a = m / num_gcd; + b = n / num_gcd; + printf("%d/%dĻʽ%d/%d\n", m, n, a, b); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/3/给定条件的整数集.c b/翁凯C语言/3/给定条件的整数集.c new file mode 100644 index 0000000..15b3e84 --- /dev/null +++ b/翁凯C语言/3/给定条件的整数集.c @@ -0,0 +1,57 @@ +#include +#include +#include +#include + +int main() +{ + int n; + int l; + printf("һ"); + scanf("%d", &n); + printf("һм"); + scanf("%d", &l); + + if (n<=0) + { + printf("!\n"); + } + else + { + + int i, j, k; + int m = 0; + i = n; + while(i<=n+3) + { + j = n; + while(j<=n+3) + { + k = n; + while(k<=n+3) + { + if (i!=j && j!=k && i!=k) + { + m++; + printf("%d%d%d", i, j, k); + if (m==l) + { + printf("\n"); + m = 0; + } + else + { + printf(" "); + } + + } + k++; + } + j++; + } + i++; + } + + } + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/3/统计素数并求和.c b/翁凯C语言/3/统计素数并求和.c new file mode 100644 index 0000000..4a5df6e --- /dev/null +++ b/翁凯C语言/3/统计素数并求和.c @@ -0,0 +1,63 @@ +#include +#include +#include +#include + +int is_sushu(int x) //判断一个数是否是素数 +{ + if (x <= 1) + return 0; + for (int a = 2; a <= sqrt(x); a++) + { + if (x % a == 0) + { + return 0; + } + } + return 1; +} + +int num_sushuhe(int x, int y) //计算区间[x,y]内素数的和 +{ + int sum = 0; + for (int e = x; e <= y; e++) + { + if (is_sushu(e)) + { + sum += e; + } + } + return sum; +} + +int main() +{ + int m, n; + printf("请输入两个正整数m和n:"); + scanf("%d %d", &m, &n); + + if (n > m) // 确保m <= n + { + int temp = m; + m = n; + n = temp; + } + + if (n < 1 || m < 1) + { + printf("输入错误,请重新输入!\n"); + } + else + { + printf("素数列表: "); + for (int x = n; x <= m; x++) + { + if (is_sushu(x)) + { + printf("%d ", x); + } + } + printf("\n素数和: %d\n", num_sushuhe(n, m)); + } + return 0; +} diff --git a/翁凯C语言/3/逃逸字符.c b/翁凯C语言/3/逃逸字符.c new file mode 100644 index 0000000..93ca709 --- /dev/null +++ b/翁凯C语言/3/逃逸字符.c @@ -0,0 +1,35 @@ +#include +#include +#include +#include + +int main() +{ + // ַ:ʾ޷ֱַ绻СƱţ˫šбܱ + // ﷨ͻַǶ˫ + printf("\"5 7\"ʾ5Ӣ7Ӣ"); + + // \bһ + printf("123\b\n456\n"); + + // \tƱ,һλ(ttabд൱ڼϵtab) + printf("12\t456\n"); + + // \n + printf("123\n456\n"); + + // \rس + printf("123\r456\n"); + + // \"˫(") + printf("123\"456\n"); + + // \'(') + printf("123\'456\n"); + + // \\б(\) + printf("123\\456\n"); + + return 0; +} + diff --git a/翁凯C语言/3/逻辑运算.c b/翁凯C语言/3/逻辑运算.c new file mode 100644 index 0000000..20b3515 --- /dev/null +++ b/翁凯C语言/3/逻辑运算.c @@ -0,0 +1,22 @@ +#include +#include +#include +#include +#include + +int main() +{ + // !#include ֮bool;Ϳãtruefalse + // ߼&&룩||򣩡ǣ + // ߼ȼڹϵ + // ߼ֵbool + // ߼תbool͵ֵ + + bool b = 6 > 5; // bΪtrue + bool t = true; + t = 2; + printf("%d\n", t); // boolֻ%d,Ϊ1 + + return 0; +} + diff --git a/翁凯C语言/4/从函数的返回值.c b/翁凯C语言/4/从函数的返回值.c new file mode 100644 index 0000000..080d3ae --- /dev/null +++ b/翁凯C语言/4/从函数的返回值.c @@ -0,0 +1,47 @@ +#include +#include +#include +#include +#include + +/* + :һδķװظʹ + :֣߱IJֵ + ĵ:ʹúú +*/ + +Ǹúĵע: + +/** + * @brief beginend֮ĺ + * @param begin ʼ() + * @param end () + * @return ۼӺ + * @note beginСڵend + */ +int num_sum(int begin, int end) +/* + ͷvoid num_sum(int begin, int end) + intǷֵͣintҪһֵvoidҪֵ + num_sumǺ + intDz + beginendDz +*/ +{ + // 壬ҪִеĴ + int sum = 0; + for (int i = begin; i <= end; i++) + { + sum += i; + } + return sum; // ķֵreturn +} + +int main() +{ + printf("%d\n", num_sum(1, 10)); + printf("%d\n", num_sum(20, 30)); + printf("%d\n", num_sum(35, 45)); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/4/函数原型.c b/翁凯C语言/4/函数原型.c new file mode 100644 index 0000000..224f582 --- /dev/null +++ b/翁凯C语言/4/函数原型.c @@ -0,0 +1,28 @@ +#include +#include +#include +#include +#include + +// !ԭ +int num_sum(int begin, int end); + +int main() +{ + printf("%d\n", num_sum(1, 10)); + printf("%d\n", num_sum(20, 30)); + printf("%d\n", num_sum(35, 45)); + + return 0; +} + +// ! +int num_sum(int begin, int end) +{ + int sum = 0; + for (int i = begin; i <= end; i++) + { + sum += i; + } + return sum; +} \ No newline at end of file diff --git a/翁凯C语言/4/函数嵌套递归.c b/翁凯C语言/4/函数嵌套递归.c new file mode 100644 index 0000000..8b7512a --- /dev/null +++ b/翁凯C语言/4/函数嵌套递归.c @@ -0,0 +1,26 @@ +#include +#include +#include +#include +#include + +int jiecheng(int n); + +int main() +{ + int n; + printf("һ"); + scanf("%d", &n); + printf("%d\n", jiecheng(n)); + + return 0; +} + +int jiecheng(int n) +{ + int sum = 1; + if (n == 1) + return sum; + else + sum = n * jiecheng(n-1); +} \ No newline at end of file diff --git a/翁凯C语言/4/函数求和.c b/翁凯C语言/4/函数求和.c new file mode 100644 index 0000000..f2f1e93 --- /dev/null +++ b/翁凯C语言/4/函数求和.c @@ -0,0 +1,25 @@ +#include +#include +#include +#include +#include + +int num_sum(int a, int b) // +{ + int sum = 0; + for (int i = a; i <= b;i++) + { + sum += i; + } + return sum; +} + +int main() +{ + int a, b; + printf(""); + scanf("%d %d", &a, &b); + printf("%d%d֮ĺͣsum = %d\n", a, b, num_sum(a, b)); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/4/函数的其它细节问题.c b/翁凯C语言/4/函数的其它细节问题.c new file mode 100644 index 0000000..05a25ba --- /dev/null +++ b/翁凯C语言/4/函数的其它细节问题.c @@ -0,0 +1,25 @@ +#include +#include +#include +#include +#include + +/* + void main(void);ȷ޷ֵ()Ϊգûв + void main();ȷ޷ֵ()ڿв +*/ + +/* + CԲǶ׶ +*/ + +/* + int main(void)һԻreturn 0;Ϊķֵ +*/ + +int main() +{ + + + return 0; +} diff --git a/翁凯C语言/4/函数的定义和使用.c b/翁凯C语言/4/函数的定义和使用.c new file mode 100644 index 0000000..5dbdf82 --- /dev/null +++ b/翁凯C语言/4/函数的定义和使用.c @@ -0,0 +1,38 @@ +#include +#include +#include +#include +#include + +/* + :һδķװظʹ + :֣߱IJֵ + ĵ:ʹúú +*/ + +void num_sum(int begin, int end) +/* + ͷvoid num_sum(int begin, int end) + voidǷֵ + num_sumǺ + intDz + beginendDz +*/ +{ + // 壬ҪִеĴ + int sum = 0; + for (int i = begin; i <= end; i++) + { + sum += i; + } + printf("%d%dĺΪ%d\n", begin, end, sum); +} + +int main() +{ + num_sum(1, 10); + num_sum(20, 30); + num_sum(35, 45); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/4/参数传递.c b/翁凯C语言/4/参数传递.c new file mode 100644 index 0000000..6d3cbae --- /dev/null +++ b/翁凯C语言/4/参数传递.c @@ -0,0 +1,34 @@ +#include +#include +#include +#include +#include + +void swap(int a, int b); // !β + +int main() +{ + // ! + /* + * 1.ֵݣΪCеIJݶֵݣʵεֵһݴݸβ + * 2.ַݣ + * 3.ô + * 4.ÿԼռ䣬ҲλĿռУûйϵʱβκʵDzͬıβαջзڴ棬ʵαջзڴ棬βκʵDzͬı֮໥ģûйϵıβεֵӰʵεֵıʵεֵҲӰβεֵ + * 5.ȥںеIJʽúʱֵʵʲڣѡʽΪʵʲΪֵ + */ + + int a = 5; + int b = 6; + + swap(a, b); // !ʵ + printf("%d %d\n", a, b); + + return 0; +} + +void swap(int a, int b) // !β +{ + int temp = a; + a = b; + b = temp; +} \ No newline at end of file diff --git a/翁凯C语言/4/本地变量.c b/翁凯C语言/4/本地变量.c new file mode 100644 index 0000000..e62db01 --- /dev/null +++ b/翁凯C语言/4/本地变量.c @@ -0,0 +1,30 @@ +#include +#include +#include +#include +#include + +// !رҲоֲ +/* + 壺ںڶıDZر + ڣӶ忪ʼ + ʲôΧڿԷã + ڱرΧǺ{} + ص㣺 + 1.ͬеͬ + 2.ᱻڲͬʱأǣ + 3.δʼʱֵΪջڴԣ +*/ + +int main() +{ + // + int a = 10; + { + int a = 20; + printf("a = %d\n", a); // 20ڲaa + } + printf("a = %d\n", a); // 10ڲa + + return 0; +} diff --git a/翁凯C语言/5/二维数组.c b/翁凯C语言/5/二维数组.c new file mode 100644 index 0000000..3747d32 --- /dev/null +++ b/翁凯C语言/5/二维数组.c @@ -0,0 +1,181 @@ +#include +#include +#include +#include +#include + +// !ά +/* + int a[3][5]; + ͨΪaһ35еľ +*/ + +// !άı +/* + for ( i=0; i<3; i++) + { + for ( j=0; j<5; j++ ) + { + a[i][j] = i*j; + } + } + a[i][i]һint + ʾiеjϵĵԪ + a[i,j]ѧϱʾaһijеľCa[i][j] +*/ + +// !άijʼ +/* + nt a[] [5] = + { + {0,1,2,3,4}, + {2,3,4,5,6}, + }; + DZģɱÿһŷָ + ĶſԴڣйϵĴͳ + ʡԣʾ + Ҳöλ(*C99 ׼) +*/ + +// !tic-tac-toeϷ +int main() +{ + const int size = 3; + int board[size][size]; + int i, j; + int numfx, numfo; + int result = -1; + + // д̾ + for (i = 0; i < size; i++) + { + for (j = 0; j < size; j++) + { + printf("%dе%dеӣ1X0O:", i + 1, j + 1); + scanf("%d", &board[i][j]); + } + } + + // + for (i = 0; i < size && result == -1; i++) + { + numfx = numfo = 0; + for (j = 0; j < size;j++) + { + if (board[i][j]==1) + { + numfx++; + } + else + { + numfo++; + } + } + + if (numfo == size) + { + result = 0; + } + else if (numfx == size) + { + result = 1; + } + } + + // + if (result == -1) + { + for (j = 0; j < size && result == -1; j++) + { + numfx = numfo = 0; + for (i = 0; i < size; i++) + { + if (board[i][j] == 1) + { + numfx++; + } + else + { + numfo++; + } + } + + if (numfo == size) + { + result = 0; + } + else if (numfx == size) + { + result = 1; + } + } + } + + // Խ + if (result == -1) + { + numfx = numfo = 0; + for (i = 0; i < size;i++) + { + if (board[i][i]==1) + { + numfx++; + } + else + { + numfo++; + } + } + + if (numfo ==size) + { + result = 0; + } + else if (numfx == size) + { + result = 1; + } + } + + // ζԽ + if (result == -1) + { + numfx = numfo = 0; + for (i = 0; i < size; i++) + { + if (board[i][size - i - 1] == 1) + { + numfx++; + } + else + { + numfo++; + } + } + + if (numfo == size) + { + result = 0; + } + else if (numfx == size) + { + result = 1; + } + } + + // + if (result == 1) + { + printf("Xʤ\n"); + } + else if (result == 0) + { + printf("Oʤ\n"); + } + else + { + printf("ƽ֣\n"); + } + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/5/二维数组中的鞍点.c b/翁凯C语言/5/二维数组中的鞍点.c new file mode 100644 index 0000000..d41ec9d --- /dev/null +++ b/翁凯C语言/5/二维数组中的鞍点.c @@ -0,0 +1,150 @@ +#include +#include +#include +#include +#include + +// !ά +/* + int a[3][5]; + ͨΪaһ35еľ +*/ + +// !άı +/* + for ( i=0; i<3; i++) + { + for ( j=0; j<5; j++ ) + { + a[i][j] = i*j; + } + } + a[i][i]һint + ʾiеjϵĵԪ + a[i,j]ѧϱʾaһijеľCa[i][j] +*/ + +// !άijʼ +/* + nt a[][5] = + { + {0,1,2,3,4}, + {2,3,4,5,6 + }; + DZģɱÿһŷָ + ĶſԴڣйϵĴͳ + ʡԣʾ + Ҳöλ(*C99 ׼) +*/ + +// !lmеľ󣨣 +void matrix_produce(int l, int m, int a[l][m]); + +// !ҳάеİ㣬λϵԪڸڸС,Ҳûа +void matrix_find_saddle_point(int rows, int cols, int matrix[rows][cols]); + +// !ӡlnеľ󣨣 +void matrix_print(int l, int n, int c[l][n]); + +// !ͷŶάڴ +void matrix_free(int **matrix, int rows); + +int main() +{ + int l, m; + printf("ÿոָ: "); + scanf("%d %d", &l, &m); + + int matrix[l][m]; + printf("Ԫأÿ%dոָ:\n", m); + matrix_produce(l, m, matrix); + + printf("ľΪ\n"); + matrix_print(l, m, matrix); + + matrix_find_saddle_point(l, m, matrix); + + return 0; +} + +// ! lmеľ +void matrix_produce(int l, int m, int a[l][m]) +{ + for (int i = 0; i < l; i++) + { + for (int j = 0; j < m; j++) + { + scanf("%d", &a[i][j]); + } + } +} + +// !ҳάеİ㣨С +void matrix_find_saddle_point(int rows, int cols, int matrix[rows][cols]) +{ + // Ƿҵ + int has_saddle = 0; + + for (int i = 0; i < rows; i++) + { + // !1ҵǰеֵ + int row_max = matrix[i][0]; + int col_max = 0; + + for (int j = 0; j < cols;j++) + { + if (matrix[i][j]>row_max) + { + row_max = matrix[i][j]; + col_max = j; + } + } + + // !2ֵǷеСֵ + int col_min = matrix[0][col_max]; // ʼСֵΪǰеһ + for (int k = 1; k < rows; k++) + { + // ǰе + if (matrix[k][col_max] < col_min) + { + col_min = matrix[k][col_max]; // Сֵ + } + } + + // !3жǷΪ㣨С + if (row_max == col_min) + { + printf("Ϊ(%d, %d),ֵΪ:%d\n", i, col_max, row_max); + has_saddle = 1; + } + } + + // δҵʱʾ + if (has_saddle==0) + { + printf("þûа!\n"); + } +} + +// !ӡlnеľ int ** ͣ +void matrix_print(int l, int n, int c[l][n]) +{ + for (int i = 0; i < l; i++) + { + for (int j = 0; j < n; j++) + { + printf("%d ", c[i][j]); // ָͨʶ̬ľԪ + } + printf("\n"); + } +} + +// !ͷŶάڴ +void matrix_free(int **matrix, int rows) +{ + for (int i = 0; i < rows; i++) + { + free(matrix[i]); // ͷÿеڴ + } + free(matrix); // ͷָ +} \ No newline at end of file diff --git a/翁凯C语言/5/二维数组:矩阵运算.c b/翁凯C语言/5/二维数组:矩阵运算.c new file mode 100644 index 0000000..e543c68 --- /dev/null +++ b/翁凯C语言/5/二维数组:矩阵运算.c @@ -0,0 +1,96 @@ +#include +#include +#include +#include +#include + +// !ά +/* + int a[3][5]; + ͨΪaһ35еľ +*/ + +// !άı +/* + for ( i=0; i<3; i++) + { + for ( j=0; j<5; j++ ) + { + a[i][j] = i*j; + } + } + a[i][i]һint + ʾiеjϵĵԪ + a[i,j]ѧϱʾaһijеľCa[i][j] +*/ + +// !άijʼ +/* + nt a[] [5] = + { + {0,1,2,3,4}, + {2,3,4,5,6}, + }; + DZģɱÿһŷָ + ĶſԴڣйϵĴͳ + ʡԣʾ + Ҳöλ(*C99 ׼) +*/ + +// !ij˷ +int main() +{ + int l, m, n; + int i, j, k; + + printf("\n"); + scanf("%d %d %d", &l, &m, &n); + int a[l][m]; + int b[m][n]; + int c[l][n]; + + // ! + printf("aԪأ\n"); + for (i = 0; i < l; i++) + { + for (j = 0; j < m; j++) + { + scanf("%d", &a[i][j]); + } + } + + printf("bԪأ\n"); + for (i = 0; i < m; i++) + { + for (j = 0; j < n; j++) + { + scanf("%d", &b[i][j]); + } + } + + // !ij˷ + for (i = 0; i < l; i++) + { + for (j = 0; j < n; j++) + { + c[i][j] = 0; + for (k = 0; k < m; k++) + { + c[i][j] += a[i][k] * b[k][j]; + } + } + } + + // !Ĵӡ + printf("a;bij˷cΪ\n"); + for (i = 0; i < l; i++) + { + for (j = 0; j < n; j++) + { + printf("%d ", c[i][j]); + } + printf("\n"); + } + + return 0; +} diff --git a/翁凯C语言/5/二维数组:矩阵运算2.c b/翁凯C语言/5/二维数组:矩阵运算2.c new file mode 100644 index 0000000..caeb437 --- /dev/null +++ b/翁凯C语言/5/二维数组:矩阵运算2.c @@ -0,0 +1,126 @@ +#include +#include +#include +#include +#include + +// !ά +/* + int a[3][5]; + ͨΪaһ35еľ +*/ + +// !άı +/* + for ( i=0; i<3; i++) + { + for ( j=0; j<5; j++ ) + { + a[i][j] = i*j; + } + } + a[i][i]һint + ʾiеjϵĵԪ + a[i,j]ѧϱʾaһijеľCa[i][j] +*/ + +// !άijʼ +/* + nt a[] [5] = + { + {0,1,2,3,4}, + {2,3,4,5,6 + }; + DZģɱÿһŷָ + ĶſԴڣйϵĴͳ + ʡԣʾ + Ҳöλ(*C99 ׼) +*/ + +void matrix_produce(int l,int m, int a[l][m]); +void matrix_multiply( int l, int m, int n, int a[l][m], int b[m][n], int c[l][n]); +void matrix_print(int l, int n, int c[l][n]); + +// !ij˷ +int main() +{ + int l, m, q, n; + + // !Ķ + printf("a\n"); + scanf("%d %d", &l, &m); + printf("b\n"); + scanf("%d %d", &q, &n); + while (m!=q) + { + printf("abȣ޷о˷㣡\n"); + printf("a\n"); + scanf("%d %d", &l, &m); + printf("b\n"); + scanf("%d %d", &q, &n); + } + + int a[l][m]; + int b[m][n]; + int c[l][n]; + + // ! + printf("aԪأ\n"); + matrix_produce(l, m, a); + + printf("bԪأ\n"); + matrix_produce(m, n, b); + + // !ij˷ + matrix_multiply(l, m, n, a, b, c); + + // !Ĵӡ + printf("a;bij˷cΪ\n"); + matrix_print(l, n, c); + + return 0; +} + +void matrix_produce(int l,int m, int a[l][m]) +{ + // ! + int i, j; + for ( i = 0; i < l; i++) + { + for ( j = 0; j < m; j++) + { + scanf("%d", &a[i][j]); + } + } +} + +void matrix_multiply (int l, int m, int n, int a[l][m], int b[m][n], int c[l][n]) +{ + // !ij˷ + int i, j, k; + for ( i = 0; i < l; i++) + { + for ( j = 0; j < n; j++) + { + c[i][j] = 0; + for ( k = 0; k < m; k++) + { + c[i][j] += a[i][k] * b[k][j]; + } + } + } +} + +void matrix_print(int l, int n, int c[l][n]) +{ + // !Ĵӡ + int i, j; + for (i = 0; i < l; i++) + { + for (j = 0; j < n; j++) + { + printf("%d ", c[i][j]); + } + printf("\n"); + } +} \ No newline at end of file diff --git a/翁凯C语言/5/初试数组.c b/翁凯C语言/5/初试数组.c new file mode 100644 index 0000000..352fcdc --- /dev/null +++ b/翁凯C语言/5/初试数组.c @@ -0,0 +1,67 @@ +#include +#include +#include +#include +#include + +// ! +/* + [i]һ飬籾number + number[0]ĵһԪأnumber[1]ĵڶԪأԴ + Ǵ0ʼ + + һеԪضͬͣڴ洢 +*/ + +int main() +{ + int x; + double sum = 0.0; + int count = 0; + int number[100]; // һ飬ΪnumberСΪ100 + printf("һ"); + scanf("%d", &x); + + while (x != -1) + { + if (x < 0 || x != (int)x) // жǷΪ + { + printf("ֲ룡\n"); + continue; + } + number[count] = x; // еԪؽиֵ + count++; + sum += x; + printf("һ"); + scanf("%d", &x); + } + + // ֹԽ + if (count < 100) + { + if (count > 0) + { + int i; + double average = sum * 1.0 / count; + printf("ܺ%.0fƽ%.2fλСƽ\n", sum, average); + + for (i = 0; i < count; i++) + { + if (number[i] >= average) // sʹеԪأеԪƽбȽ + { + printf("%d ", number[i]); // дƽԪ + } + } + } + else + { + printf("Ϊ,룡\n"); + } + } + else + { + printf("Ĺ涨С100,Ѿˣ\n"); + } + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/5/定义数组.c b/翁凯C语言/5/定义数组.c new file mode 100644 index 0000000..1b9a5b6 --- /dev/null +++ b/翁凯C语言/5/定义数组.c @@ -0,0 +1,30 @@ +#include +#include +#include +#include +#include + +// ! +/* + <> [Ԫ]int number[100],double number[100] + Ԫ + 磺a[10] + ÿԪһÿһint͵ıԳڸֵ߻ұ + a[2] = a[1]+6 + +*/ + +void f(); + +int main() +{ + f(); + + return 0; +} + +void f() +{ + int a[10]; + a[10] = 0; // !Խ,ΪСΪ10a[0]a[9]a[10]Խ +} \ No newline at end of file diff --git a/翁凯C语言/5/对称矩阵.c b/翁凯C语言/5/对称矩阵.c new file mode 100644 index 0000000..34aaab9 --- /dev/null +++ b/翁凯C语言/5/对称矩阵.c @@ -0,0 +1,165 @@ +#include +#include +#include +#include +#include + +// !ά +/* + int a[3][5]; + ͨΪaһ35еľ +*/ + +// !άı +/* + for ( i=0; i<3; i++) + { + for ( j=0; j<5; j++ ) + { + a[i][j] = i*j; + } + } + a[i][i]һint + ʾiеjϵĵԪ + a[i,j]ѧϱʾaһijеľCa[i][j] +*/ + +// !άijʼ +/* + nt a[] [5] = + { + {0,1,2,3,4}, + {2,3,4,5,6 + }; + DZģɱÿһŷָ + ĶſԴڣйϵĴͳ + ʡԣʾ + Ҳöλ(*C99 ׼) +*/ + +int check_symmetry(int matrix[][200], int size); + +int main() +{ + int n; + scanf("%d", &n); + int matrix1[100][100], matrix2[100][100], matrix3[100][100], matrix4[100][100]; + + // ȡĸnnľ + for (int i = 0; i < n; i++) + { + for (int j = 0; j < n; j++) + { + scanf("%d", &matrix1[i][j]); + } + } + for (int i = 0; i < n; i++) + { + for (int j = 0; j < n; j++) + { + scanf("%d", &matrix2[i][j]); + } + } + for (int i = 0; i < n; i++) + { + for (int j = 0; j < n; j++) + { + scanf("%d", &matrix3[i][j]); + } + } + for (int i = 0; i < n; i++) + { + for (int j = 0; j < n; j++) + { + scanf("%d", &matrix4[i][j]); + } + } + + int big_matrix[200][200]; + // һϡϡ¡ƴ + for (int i = 0; i < n; i++) + { + for (int j = 0; j < n; j++) + { + big_matrix[i][j] = matrix1[i][j]; + big_matrix[i][j + n] = matrix2[i][j]; + big_matrix[i + n][j] = matrix3[i][j]; + big_matrix[i + n][j + n] = matrix4[i][j]; + } + } + if (check_symmetry(big_matrix, 2 * n)) + { + printf("YES\n"); + return 0; + } + + // Ϻ + for (int i = 0; i < n; i++) + { + for (int j = 0; j < n; j++) + { + big_matrix[i][j] = matrix1[i][j]; + big_matrix[i][j + n] = matrix3[i][j]; + big_matrix[i + n][j] = matrix2[i][j]; + big_matrix[i + n][j + n] = matrix4[i][j]; + } + } + if (check_symmetry(big_matrix, 2 * n)) + { + printf("YES\n"); + return 0; + } + + // Ϻ + for (int i = 0; i < n; i++) + { + for (int j = 0; j < n; j++) + { + big_matrix[i][j] = matrix4[i][j]; + big_matrix[i][j + n] = matrix2[i][j]; + big_matrix[i + n][j] = matrix3[i][j]; + big_matrix[i + n][j + n] = matrix1[i][j]; + } + } + if (check_symmetry(big_matrix, 2 * n)) + { + printf("YES\n"); + return 0; + } + + // ģϺϣº + for (int i = 0; i < n; i++) + { + for (int j = 0; j < n; j++) + { + big_matrix[i][j] = matrix2[i][j]; + big_matrix[i][j + n] = matrix1[i][j]; + big_matrix[i + n][j] = matrix4[i][j]; + big_matrix[i + n][j + n] = matrix3[i][j]; + } + } + if (check_symmetry(big_matrix, 2 * n)) + { + printf("YES\n"); + return 0; + } + + printf("NO\n"); + return 0; +} + +// !ǷΪԳƾ +int check_symmetry(int matrix[][200], int size) +{ + for (int i = 0; i < size; i++) + { + for (int j = 0; j < size; j++) + { + if (matrix[i][j] != matrix[j][i]) + { + return 0; + } + } + } + return 1; +} \ No newline at end of file diff --git a/翁凯C语言/5/数组来统计个数.c b/翁凯C语言/5/数组来统计个数.c new file mode 100644 index 0000000..6ce1d98 --- /dev/null +++ b/翁凯C语言/5/数组来统计个数.c @@ -0,0 +1,44 @@ +#include +#include +#include +#include +#include + +int main() +{ + int a[10]={0}; + int count=0; + while(1) + { + int b; + printf("һ֣"); + scanf("%d",&b); + + if(b==-1) + { + break; + } + + if (b<=-1 || b>=10) + { + printf(",\n"); + continue; + } + + if (count<10) + { + printf("\n"); + break; + } + + a[b]++; + count++; + } + + for (int i = 0; i < 10; i++) + { + printf("%d: %d\n", i, a[i]); + } + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/5/数组的例子:冒泡排序.c b/翁凯C语言/5/数组的例子:冒泡排序.c new file mode 100644 index 0000000..2eb150a --- /dev/null +++ b/翁凯C语言/5/数组的例子:冒泡排序.c @@ -0,0 +1,57 @@ +#include +#include +#include +#include +#include + +// !жܱ֪Ϊ +/* + nڵ + 1.x=2 + 2.2x3x4xֱax +#include +#include +#include +#include +#define num 100 + +// !жܱ֪Ϊ + +int sushu(int x, int primes[], int count); + +int main() +{ + //const int num=100; + int prime[num] = {2}; + int count = 1; + int i=3; + + while (count +#include +#include +#include +#include + +// !жܱ֪Ϊ +/* + nڵ + 1.x=2 + 2.2x3x4xֱax +#include +#include +#include +#include + +// !ļɳʼ +/* + 磺int a[10]={1,2,3,4,5,6,7,8,9,10}; + ֱôŸԪֵijʼֵ + ҪijȣСԶ +*/ + +// !ɳʼĶλ +/* + [n]ڳʼиλ + ûжλݽǰλú + λõֵ ҲԲСñ + رʺϳʼϡ + 磺int a[10]={[1]=1,4, [5]=6};Ϊ{0,1,4,0,0,6,0,0,0,0} +*/ + +// !ĴС +/* + sizeof(a)aռݵݵĴСλֽ + sizeof(a)/sizeof(a[0])aĴС +*/ + +// !ĸֵ +/* + 鸳ֵַʽ + 1.øֱֵӸֵ + 2.ѭֵ + 磺 + int a[10]={1,2,3,4,5,6,7,8,9,10}; + int b[10]; + for(int i=0;i<10;i++) + { + b[i]=a[i]; + } + 鲻һֵ +*/ + +// ! +/* + ҳkeyaеλ + @param key ҪѰҵ + @param a ҪѰҵ + @param length aij + @return ҵaеλãҲ򷵻-1 +*/ + +int search(int x, int a[], int len); + +int main() +{ + int a[] = {2, 4, 6, 7, 1, 3, 5, 9, 11, 13, 23, 14, 32}; //{[1]=2,4, [5]=6}; + { + int i; + printf("%lu\n", sizeof(a)); + printf("%lu\n", sizeof(a[0])); // sizeof(a[0])ÿԪصĴС,Ϊ4 + + for (i = 0; i < sizeof(a) / sizeof(a[0]); i++) // õĵԪsizeof(a)/sizeof(a[0])ĴС + { + printf("%d\t", a[i]); + } + printf("\n"); + } + + int x; + int location; + printf("Ҫҵ֣"); + scanf("%d", &x); + location = search(x,a,sizeof(a)/sizeof(a[0])); + if (location!=-1) + { + printf("%d%dλ\n", x, location); + } + else + { + printf("%dв\n", x); + } + + return 0; +} + +int search(int x, int a[], int len) +{ + int ret = -1; + + if (len==0) + { + return -1; + } + + for (int i=0;i +#include +#include +#include +#include + +// !ά +/* + int a[3][5]; + ͨΪaһ35еľ +*/ + +// !άı +/* + for ( i=0; i<3; i++) + { + for ( j=0; j<5; j++ ) + { + a[i][j] = i*j; + } + } + a[i][i]һint + ʾiеjϵĵԪ + a[i,j]ѧϱʾaһijеľCa[i][j] +*/ + +// !άijʼ +/* + nt a[][5] = + { + {0,1,2,3,4}, + {2,3,4,5,6 + }; + DZģɱÿһŷָ + ĶſԴڣйϵĴͳ + ʡԣʾ + Ҳöλ(*C99 ׼) +*/ + +void yanghui(int rows); + +int main() +{ + int rows; + printf("ǵ"); + scanf("%d", &rows); + + yanghui(rows); + + return 0; +} + +void yanghui(int rows) +{ + int triangle[rows][rows]; + triangle[0][0] = 1; + + for (int i = 1; i < rows; i++) + { + // !һкһжΪ1 + triangle[i][0] = 1; + triangle[i][i] = 1; + for (int j = 1; j < i; j++) + { + // !мΪһ֮ + triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j]; + } + } + + for (int i = 0; i < rows; i++) + { + for (int j = 0; j <= i; j++) + { + printf("%d ", triangle[i][j]); + } + printf("\n"); + } +} \ No newline at end of file diff --git a/翁凯C语言/5/矩阵对应位置元素相加.c b/翁凯C语言/5/矩阵对应位置元素相加.c new file mode 100644 index 0000000..1612459 --- /dev/null +++ b/翁凯C语言/5/矩阵对应位置元素相加.c @@ -0,0 +1,161 @@ +#include +#include +#include +#include +#include + +// !ά +/* + int a[3][5]; + ͨΪaһ35еľ +*/ + +// !άı +/* + for ( i=0; i<3; i++) + { + for ( j=0; j<5; j++ ) + { + a[i][j] = i*j; + } + } + a[i][i]һint + ʾiеjϵĵԪ + a[i,j]ѧϱʾaһijеľCa[i][j] +*/ + +// !άijʼ +/* + nt a[] [5] = + { + {0,1,2,3,4}, + {2,3,4,5,6 + }; + DZģɱÿһŷָ + ĶſԴڣйϵĴͳ + ʡԣʾ + Ҳöλ(*C99 ׼) +*/ + +// ! ̬ά飨int ** ͣ +int **allocate_matrix(int rows, int cols); + +// ! lmеľ int ** ͣ +void matrix_produce(int l, int m, int **a); + +// ! ӡlnеľ int ** ͣ +void matrix_print(int l, int n, int **c); + +// ! ĺͣӣ +int **add_matrices(int **A, int n1, int m1, int **B, int n2, int m2, int *result_rows, int *result_cols); + +// ! ͷŶάڴ +void matrix_free(int **matrix, int rows); + +int main() +{ + // AB + int n1, m1, n2, m2; + + // + int result_rows, result_cols; + + // ! A̬ڴ + printf("Aÿոָ: "); + scanf("%d %d", &n1, &m1); + + // ̬Aint ** ͣ + int **A = allocate_matrix(n1, m1); + printf("AԪأÿ%dÿոָ:\n", m1); + matrix_produce(n1, m1, A); + + // ! B̬ڴ + printf("Bÿոָ: "); + scanf("%d %d", &n2, &m2); + + // ̬Bint ** ͣ + int **B = allocate_matrix(n2, m2); + printf("BԪأÿ%dÿոָ:\n", m2); + matrix_produce(n2, m2, B); + + // ! ӣӣ + int **result = add_matrices(A, n1, m1, B, n2, m2, &result_rows, &result_cols); + + // ! + printf("\n: %d%d:\n", result_rows, result_cols); + matrix_print(result_rows, result_cols, result); + + // ! ͷж̬ڴ + matrix_free(A, n1); + matrix_free(B, n2); + matrix_free(result, result_rows); + + return 0; +} + +// ! ̬ά飨int ** ͣ +int **allocate_matrix(int rows, int cols) +{ + int **matrix = (int **)malloc(rows * sizeof(int *)); // ָ + for (int i = 0; i < rows; i++) + { + matrix[i] = (int *)malloc(cols * sizeof(int)); // ÿепռ + } + return matrix; +} + +// ! lmеľ int ** ͣ +void matrix_produce(int l, int m, int **a) +{ + for (int i = 0; i < l; i++) + { + for (int j = 0; j < m; j++) + { + scanf("%d", &a[i][j]); // ָͨʶ̬ľԪ + } + } +} + +// ! ĺͣӣ +int **add_matrices(int **A, int n1, int m1, int **B, int n2, int m2, int *result_rows, int *result_cols) +{ + // ijߴ磨ֵ + *result_rows = (n1 > n2) ? n1 : n2; + *result_cols = (m1 > m2) ? m1 : m2; + int **result = allocate_matrix(*result_rows, *result_cols); // ̬ + + // λüӽ߼ + for (int i = 0; i < *result_rows; i++) + { + for (int j = 0; j < *result_cols; j++) + { + int a = (i < n1 && j < m1) ? A[i][j] : 0; // AΧΪ0 + int b = (i < n2 && j < m2) ? B[i][j] : 0; // BΧΪ0 + result[i][j] = a + b; + } + } + return result; +} + +// ! ӡlnеľ int ** ͣ +void matrix_print(int l, int n, int **c) +{ + for (int i = 0; i < l; i++) + { + for (int j = 0; j < n; j++) + { + printf("%d ", c[i][j]); // ָͨʶ̬ľԪ + } + printf("\n"); + } +} + +// ! ͷŶάڴ +void matrix_free(int **matrix, int rows) +{ + for (int i = 0; i < rows; i++) + { + free(matrix[i]); // ͷÿеڴ + } + free(matrix); // ͷָ +} \ No newline at end of file diff --git a/翁凯C语言/5/矩阵对角线的和.c b/翁凯C语言/5/矩阵对角线的和.c new file mode 100644 index 0000000..50d725b --- /dev/null +++ b/翁凯C语言/5/矩阵对角线的和.c @@ -0,0 +1,112 @@ +#include +#include +#include +#include +#include + +// !ά +/* + int a[3][5]; + ͨΪaһ35еľ +*/ + +// !άı +/* + for ( i=0; i<3; i++) + { + for ( j=0; j<5; j++ ) + { + a[i][j] = i*j; + } + } + a[i][i]һint + ʾiеjϵĵԪ + a[i,j]ѧϱʾaһijеľCa[i][j] +*/ + +// !άijʼ +/* + nt a[] [5] = + { + {0,1,2,3,4}, + {2,3,4,5,6 + }; + DZģɱÿһŷָ + ĶſԴڣйϵĴͳ + ʡԣʾ + Ҳöλ(*C99 ׼) +*/ + +// !lmеľ +void matrix_produce(int l, int m, int a[l][m]) +{ + int i, j; + for (i = 0; i < l; i++) + { + for (j = 0; j < m; j++) + { + scanf("%d", &a[i][j]); + } + } +} + +// !ӡlnеľ +void matrix_print(int l, int n, int c[l][n]) +{ + int i, j; + for (i = 0; i < l; i++) + { + for (j = 0; j < n; j++) + { + printf("%d ", c[i][j]); + } + printf("\n"); + } +} + +int main(void) +{ + int l, m; + printf("뷽lmȣ"); + scanf("%d %d", &l, &m); + + if (l != m) + { + printf("IJǷ\n"); + return 1; + } + int n = l; + + int a[n][n]; + matrix_produce(n, n, a); + + int sum_main = 0; + for (int i = 0; i < n; i++) + { + sum_main += a[i][i]; + } + + int sum_anti = 0; + for (int i = 0; i < n; i++) + { + int j = n - 1 - i; + sum_anti += a[i][j]; + } + + int total_sum; + if (n % 2 == 1) + { + int duplicate_i = (n - 1) / 2; + total_sum = sum_main + sum_anti - a[duplicate_i][duplicate_i]; + } + else + { + total_sum = sum_main + sum_anti; + } + + printf("ԽߺΪ%d\n", sum_main); + printf("ԽߺΪ%d\n", sum_anti); + printf("ԽܺͣظλýһΣ%d\n", total_sum); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/5/矩阵的应用.c b/翁凯C语言/5/矩阵的应用.c new file mode 100644 index 0000000..a945917 --- /dev/null +++ b/翁凯C语言/5/矩阵的应用.c @@ -0,0 +1,249 @@ +#include +#include +#include +#include +#include + +// !̬ά飨int ** ͣ +int **allocate_matrix(int rows, int cols); + +// !lmеľ +void matrix_produce(int l, int m, int a[l][m]); + +// !ӡlnеľ +void matrix_print(int l, int n, int c[l][n]); + +// !ij˷ +void matrix_multiply(int l, int m, int n, int a[l][m], int b[m][n], int c[l][n]); + +// !ǷԳ +int matrix_check_symmetry(int matrix[][200], int size); + +// !תþ󣺽src[l][m]תΪdest[m][l] +void matrix_transpose(int l, int m, int src[l][m], int dest[m][l]); + +// !Ҿеֵ +int matrix_max_value(int l, int m, int mat[l][m]); + +// !Խߺͣi == j +int calculate_main_diagonal(int n, int mat[n][n]); + +// !㸱Խߺͣi + j == n-1 +int calculate_anti_diagonal(int n, int mat[n][n]); + +// !ĺͣӣ +int **add_matrices(int **A, int n1, int m1, int **B, int n2, int m2, int *result_rows, int *result_cols); + +// !ҳάеİ㣨С +void matrix_find_saddle_point(int rows, int cols, int matrix[rows][cols]); + +// !ͷŶάڴ +void matrix_free(int **matrix, int rows); + +int main(void) +{ + + return 0; +} + +int **allocate_matrix(int rows, int cols) +{ + // !̬ά飨int ** ͣ + int **matrix = (int **)malloc(rows * sizeof(int *)); // ָ + for (int i = 0; i < rows; i++) + { + matrix[i] = (int *)malloc(cols * sizeof(int)); // ÿепռ + } + return matrix; +} + +void matrix_produce(int l, int m, int a[l][m]) +{ + // ! + int i, j; + for (i = 0; i < l; i++) + { + for (j = 0; j < m; j++) + { + scanf("%d", &a[i][j]); + } + } +} + +void matrix_multiply(int l, int m, int n, int a[l][m], int b[m][n], int c[l][n]) +{ + // !ij˷ + int i, j, k; + for (i = 0; i < l; i++) + { + for (j = 0; j < n; j++) + { + c[i][j] = 0; + for (k = 0; k < m; k++) + { + c[i][j] += a[i][k] * b[k][j]; + } + } + } +} + +void matrix_print(int l, int n, int c[l][n]) +{ + // !Ĵӡ + int i, j; + for (i = 0; i < l; i++) + { + for (j = 0; j < n; j++) + { + printf("%d ", c[i][j]); + } + printf("\n"); + } +} + +int matrix_check_symmetry(int matrix[][200], int size) +{ + // !ǷԳ + for (int i = 0; i < size; i++) + { + for (int j = 0; j < size; j++) + { + if (matrix[i][j] != matrix[j][i]) + { + return 0; + } + } + } + return 1; +} + +void matrix_transpose(int l, int m, int src[l][m], int dest[m][l]) +{ + // !תþ󣺽src[l][m]תΪdest[m][l] + for (int i = 0; i < l; i++) + { + for (int j = 0; j < m; j++) + { + dest[j][i] = src[i][j]; // ת߼ + } + } +} + +int matrix_max_value(int l, int m, int mat[l][m]) +{ + // !matеֵ + int max = mat[0][0]; // ʼֵΪһԪ + for (int i = 0; i < l; i++) + { + for (int j = 0; j < m; j++) + { + if (mat[i][j] > max) + { + max = mat[i][j]; // ֵ + } + } + } + return max; // ֵ +} + +int calculate_main_diagonal(int n, int mat[n][n]) +{ + // !Խߺͣi == j + int sum = 0; + for (int i = 0; i < n; i++) + { + sum += mat[i][i]; + } + return sum; +} + +int calculate_anti_diagonal(int n, int mat[n][n]) +{ + // !㸱Խߺͣi + j == n-1 + int sum = 0; + for (int i = 0; i < n; i++) + { + int j = n - 1 - i; + sum += mat[i][j]; + } + return sum; +} + +int **add_matrices(int **A, int n1, int m1, int **B, int n2, int m2, int *result_rows, int *result_cols) +{ + // !ĺͣӣ + // ijߴ磨ֵ + *result_rows = (n1 > n2) ? n1 : n2; + *result_cols = (m1 > m2) ? m1 : m2; + int **result = allocate_matrix(*result_rows, *result_cols); // ̬ + + // λüӽ߼ + for (int i = 0; i < *result_rows; i++) + { + for (int j = 0; j < *result_cols; j++) + { + int a = (i < n1 && j < m1) ? A[i][j] : 0; // AΧΪ0 + int b = (i < n2 && j < m2) ? B[i][j] : 0; // BΧΪ0 + result[i][j] = a + b; + } + } + return result; +} + + +void matrix_find_saddle_point(int rows, int cols, int matrix[rows][cols]) +{ + // !ҳάеİ㣨С + // Ƿҵ + int has_saddle = 0; + + for (int i = 0; i < rows; i++) + { + // !1ҵǰеֵ + int row_max = matrix[i][0]; + int col_max = 0; + + for (int j = 0; j < cols; j++) + { + if (matrix[i][j] > row_max) + { + row_max = matrix[i][j]; + col_max = j; + } + } + + // !2ֵǷеСֵ + int col_min = matrix[0][col_max]; // ʼСֵΪǰеһ + for (int k = 1; k < rows; k++) + { + // ǰе + if (matrix[k][col_max] < col_min) + { + col_min = matrix[k][col_max]; // Сֵ + } + } + + // !3жǷΪ㣨С + if (row_max == col_min) + { + printf("Ϊ(%d, %d),ֵΪ:%d\n", i, col_max, row_max); + has_saddle = 1; + } + } + + // δҵʱʾ + if (has_saddle == 0) + { + printf("þûа!\n"); + } +} + +void matrix_free(int **matrix, int rows) +{ + // !ͷŶάڴ + for (int i = 0; i < rows; i++) + { + free(matrix[i]); // ͷÿеڴ + } + free(matrix); // ͷָ +} \ No newline at end of file diff --git a/翁凯C语言/5/矩阵的最大值.c b/翁凯C语言/5/矩阵的最大值.c new file mode 100644 index 0000000..e1162bd --- /dev/null +++ b/翁凯C语言/5/矩阵的最大值.c @@ -0,0 +1,100 @@ +#include +#include +#include +#include +#include + +// !ά +/* + int a[3][5]; + ͨΪaһ35еľ +*/ + +// !άı +/* + for ( i=0; i<3; i++) + { + for ( j=0; j<5; j++ ) + { + a[i][j] = i*j; + } + } + a[i][i]һint + ʾiеjϵĵԪ + a[i,j]ѧϱʾaһijеľCa[i][j] +*/ + +// !άijʼ +/* + nt a[] [5] = + { + {0,1,2,3,4}, + {2,3,4,5,6 + }; + DZģɱÿһŷָ + ĶſԴڣйϵĴͳ + ʡԣʾ + Ҳöλ(*C99 ׼) +*/ + +// !lmеľ +void matrix_produce(int l, int m, int a[l][m]) +{ + int i, j; + for (i = 0; i < l; i++) + { + for (j = 0; j < m; j++) + { + scanf("%d", &a[i][j]); + } + } +} + +// !ӡlnеľ +void matrix_print(int l, int n, int c[l][n]) +{ + int i, j; + for (i = 0; i < l; i++) + { + for (j = 0; j < n; j++) + { + printf("%d ", c[i][j]); + } + printf("\n"); + } +} + +int main(void) +{ + int l, m, max; + printf("lm"); + scanf("%d %d", &l, &m); + + int a[l][m]; + + printf("%d%dеľݣ\n", l, m); + matrix_produce(l, m, a); + + max = a[0][0]; + int row = 0; + int col = 0; + + for (int i = 0; i < l; i++) + { + for (int j = 0; j < m; j++) + { + if (a[i][j] > max) + { + max = a[i][j]; + row = i; + col = j; + } + } + } + + printf("Ϊ\n"); + matrix_print(l, m, a); + printf("ֵΪ%d,λΪ(%d,%d)\n", max, row, col); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/5/转置矩阵.c b/翁凯C语言/5/转置矩阵.c new file mode 100644 index 0000000..8ed1eaf --- /dev/null +++ b/翁凯C语言/5/转置矩阵.c @@ -0,0 +1,91 @@ +#include +#include +#include +#include +#include + +// !ά +/* + int a[3][5]; + ͨΪaһ35еľ +*/ + +// !άı +/* + for ( i=0; i<3; i++) + { + for ( j=0; j<5; j++ ) + { + a[i][j] = i*j; + } + } + a[i][i]һint + ʾiеjϵĵԪ + a[i,j]ѧϱʾaһijеľCa[i][j] +*/ + +// !άijʼ +/* + nt a[] [5] = + { + {0,1,2,3,4}, + {2,3,4,5,6 + }; + DZģɱÿһŷָ + ĶſԴڣйϵĴͳ + ʡԣʾ + Ҳöλ(*C99 ׼) +*/ + +// !lmеľ +void matrix_produce(int l, int m, int a[l][m]) +{ + int i, j; + for (i = 0; i < l; i++) + { + for (j = 0; j < m; j++) + { + scanf("%d", &a[i][j]); + } + } +} + +// !ӡlnеľ +void matrix_print(int l, int n, int c[l][n]) +{ + int i, j; + for (i = 0; i < l; i++) + { + for (j = 0; j < n; j++) + { + printf("%d ", c[i][j]); + } + printf("\n"); + } +} + +int main(void) +{ + int l, m; + printf("lm"); + scanf("%d %d", &l, &m); + + int a[l][m]; + int b[m][l]; + + printf("%d%dеľݣ\n", l, m); + matrix_produce(l, m, a); + + for (int i = 0; i < l; i++) + { + for (int j = 0; j < m; j++) + { + b[j][i] = a[i][j]; + } + } + + printf("תúľΪ\n"); + matrix_print(m, l, b); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/6/函数指针.c b/翁凯C语言/6/函数指针.c new file mode 100644 index 0000000..409a7c2 --- /dev/null +++ b/翁凯C语言/6/函数指针.c @@ -0,0 +1,57 @@ +#include +#include +#include +#include +#include + +// !ָ뺯 +/* + * ָ + * Cĵַ洢ָУָΪָ롣ָָκηضǩĺ + * 磬int (*func_ptr)(int, int) ʾһָintintĺָ롣 + * ָʹ + * 1.ָ + * int (*func_ptr)(int, int); + * ʾfunc_ptrһָintintĺָ롣 + * ָһָͣһʹá + * ָܽ㣬ָͬġָӼһʹָƶָԪأָƶǺġ + + 1.̬ + ʱ̬󶨲ͬʵͬһӿڵòͬ߼ѡ㷨⾲̬͡ + 2.ص֧ + ʵֻص¼첽ʹṹϣǿģ佻 + 3.Ϊݴ洢 + ɽ顢ṹݽṹȣ״̬˵ϵͳ + 4.򻯸߼ + 㷨ָͨ봫ݱȽϹ򣬱Ϊͬظд룬ԡ + 5.ײ + ڲϵͳȳУֱӲַʵֶ̬ӡȸµȵײ㹦ܡ +*/ + +// ͨӷ +int add(int a, int b) +{ + return a + b; +} + +// ͨ˷ +int multiply(int a, int b) +{ + return a * b; +} + +int main() +{ + // ָ룬ָ򷵻intΪ(int, int)ĺ + int (*op)(int, int); + + // ֵ̬Ϊӷ + op = add; + printf("5 + 3 = %d\n", op(5, 3)); // 8 + + // ̬лΪ˷ + op = multiply; + printf("5 * 3 = %d\n", op(5, 3)); // 15 + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/6/动态内存分配.c b/翁凯C语言/6/动态内存分配.c new file mode 100644 index 0000000..910a0bf --- /dev/null +++ b/翁凯C语言/6/动态内存分配.c @@ -0,0 +1,80 @@ +#include +#include +#include +#include +#include + +// !̬ڴ +/* + 1. + ʱ,ȸȻ룬Ҫ¼ÿ + C99ñ鶨ĴСC99֮ǰ? + int *a = (int*)malloc(n*sizeof(int)); + 2.malloc + #include + void* malloc(size_t size); + mallocĿռĴСֽΪλ + صĽvoid*ҪתΪԼҪ + (int*)malloc(n*sizeof(int)) + float *pf; + pf=(float *)malloc(5*sizeof(float)); + 3.calloc + #include + void* calloc(size_t n, size_t size); + nԪأÿԪصĴСsizeֽ + callocĿռʼΪ0 + mallocʼ + int *pi; + pi=(int *)calloc(5,sizeof(int)); + 4.free() + Ŀռ仹ϵͳ + Ŀռ,նӦҪ + ģ綼Ҫ + ֻܻĿռ׵ַ + void free(void *p); +*/ + +int main(void) +{ + /* 1.malloc */ + int number; + int *a; + int i; + printf("ݸ"); + scanf("%d", &number); + + // int a[number]; + // ɱ + a = (int *)malloc(number * sizeof(int)); + for (i = 0; i < number; i++) + { + scanf("%d", &a[i]); + } + + for (i = number - 1; i >= 0; i--) + { + printf("%d ", a[i]); + } + + free(a); + + /* 2. */ + void *p; + int cnt = 0; + while (p = malloc(100 * 1024 * 1024)) + { + cnt++; + free(p); + } + printf("%d100MBĿռ\n", cnt); + + /* 3. */ + /*void *p; + int cnt = 0;*/ + cnt = 0; + p = malloc(100 * 1024 * 1024); + p++; + free(p); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/6/取地址计算:&运算符取得变量的地址.c b/翁凯C语言/6/取地址计算:&运算符取得变量的地址.c new file mode 100644 index 0000000..45680fb --- /dev/null +++ b/翁凯C语言/6/取地址计算:&运算符取得变量的地址.c @@ -0,0 +1,40 @@ +#include +#include +#include +#include +#include + +// !运算符 +/* + scanf("%d", &i);里的& + 获得变量的地址,它的操作数必须是变量 + int i; printf("%x",&i); + 地址的大小是否与int相同取决于编译器 + int i; printf("%p", &i); +*/ + +int main() +{ + // 变量的地址 + int a = 10; + int b = 20; + printf("&a = %p\n", &a); + printf("&b = %p\n", &b); + + // &操作符的sizeof + int x; + printf("sizeof(&x) = %zu\n", sizeof(&x)); // 32位系统输出4,64位系统输出8 + + // 数组的地址 + int arr[3] = {1, 2, 3}; + printf("arr地址 = %p\n", (void *)arr); // 0x7ffee3a45680 + printf("&arr[0] = %p\n", &arr[0]); // 0x7ffee3a45680 + printf("&arr = %p\n", &arr); // 0x7ffee3a45680(值相同但类型不同) + + // 数组单元的地址 + printf("&arr[0] = %p\n", &arr[0]); // 0x7ffee3a45680 + printf("&arr[1] = %p\n", &arr[1]); // 0x7ffee3a45684(相差4字节) + printf("&arr[2] = %p\n", &arr[2]); // 0x7ffee3a45688(继续相差4字节) + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/6/指针与const:指针本身和所指的变量都可能const.c b/翁凯C语言/6/指针与const:指针本身和所指的变量都可能const.c new file mode 100644 index 0000000..e0ed75c --- /dev/null +++ b/翁凯C语言/6/指针与const:指针本身和所指的变量都可能const.c @@ -0,0 +1,43 @@ +#include +#include +#include +#include +#include + +// !指针和const +/* + 指针本身和所指的变量都可能const + 1.指针是const: + 表示一旦得到了某个变量的地址,不能再指向其他变量 + int *const q= &i; // q是const + *q=26; // OK + q++; // ERROR + 2.所指是const + 表示不能通过这个指针去修改那个变量(并不 能使得那个变量成为const) + const int *p = &i; + *p = 26; // ERROR! (*p)是 const + i=26; //OK + p=&j; //OK + 3.判断:const在*前边,是表示不能通过这个指针去修改那个变量;const在*后边,是表示一旦得到了某个变量的地址,不能再指向其他变量 +*/ + +// !const数组 +/* + const int a[]= {1,2,3,4,5,6,}; + 数组变量已经是const的指针了,这里的const + 表明数组的每个单元都是const int + 所以必须通过初始化进行赋值 +*/ + +// !保护数组值 +/* + 因为把数组传入函数时传递的是地址,所以那个函数 内部可以修改数组的值 + 为了保护数组不被函数破坏,可以设置参数为const + int sum(const int a[], int length); +*/ + +int main(void) +{ + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/6/指针与数组.c b/翁凯C语言/6/指针与数组.c new file mode 100644 index 0000000..4d9617d --- /dev/null +++ b/翁凯C语言/6/指针与数组.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include +#include + +// !数组是一种特殊的指针,数组名就是数组的首地址 +/* + 数组变量本身表达地址,所以 + int a[10]; int*p=a;//无需用&取地址 + 但是数组的单元表达的是变量,需要用&取地址 + a == &a[O] + []运算符可以对数组做,也可以对指针做: + p[0] <==>a[0] + *运算符可以对指针做,也可以对数组做: + *a= 25: + 数组变量是const的指针,所以不能被赋值 + int a[] <==> int * const a=... +*/ + +void minmax(int a[], int len, int *max, int *min); + +int main(void) +{ + int c[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 16, 17, 21, 23, 55}; + int min, max; + printf("min sizeof(c) = %lu\n", sizeof(c)); + minmax(c, sizeof(c) / sizeof(c[0]), &max, &min); + printf("max = %d, min = %d\n", max, min); + + int *p = &min; + printf("*p = %d\n", *p); + printf("p[0]=%d\n", p[0]); + + return 0; +} + +void minmax(int a[], int len, int *max, int *min) +{ + int i; + printf("minmax sizeof(a) = %lu\n", sizeof(a)); + *max = *min = a[0]; + for (i = 1; i < len; i++) + { + if (a[i] < *min) + { + *min = a[i]; + } + if (a[i] > *max) + { + *max = a[i]; + } + } +} \ No newline at end of file diff --git a/翁凯C语言/6/指针函数.c b/翁凯C语言/6/指针函数.c new file mode 100644 index 0000000..f1ca29a --- /dev/null +++ b/翁凯C语言/6/指针函数.c @@ -0,0 +1,41 @@ +#include +#include +#include +#include +#include + +// !ָ뺯 +/* + һԷַ͡͵ֵҲCУԷָ͵ֵֵָĺͳΪָ뺯 + 1.ָ뺯ʽ: + ͱʶ *(βα) + { + + } + 2.ָ뺯ĵͨĵֻͬҪע䷵ֵһָ롣 + + * int (*p)()һʾpһָڵַָ(ָ)úķֵݣ(*p)ߵŲ + * int *p()Ǻʾpһָ뺯䷵ֵһָݵָ룬*pûšΪдʽ +*/ + +// !ָ뺯ָָ +int *max(int *a, int *b) +{ + if (*a > *b) + return a; + else + return b; +} + +int main() +{ + int x, y; + printf("Enter two integers: "); + scanf("%d %d", &x, &y); + + // ָ뺯 + int *result = max(&x, &y); + printf("The larger number is %d\n", *result); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/6/指针变量:记录地址的变量.c b/翁凯C语言/6/指针变量:记录地址的变量.c new file mode 100644 index 0000000..141c4db --- /dev/null +++ b/翁凯C语言/6/指针变量:记录地址的变量.c @@ -0,0 +1,46 @@ +#include +#include +#include +#include +#include + +// !指针变量 +/* + 变量的值是内存的地址 + 普通变量的值是实际的值 + 指针变量的值是具有实际值的变量的地址 +*/ + +// !访问那个地址上的变量* +/* + *p: p指向的变量的值*是一个单目运算符,用来访问指针的值所表示的地址上的变量 + 可以做右值也可以做左值 + int k= *p; + *p=k+1; +*/ + +void f(int *p); +void f2(int k); + +int main(void) +{ + int i = 6; + printf("i = %d\n", i); + printf("&i = %p\n", &i); // %p打印i地址 + f(&i); + f2(i); + + return 0; +} + +void f(int *p) +{ + printf("p = %p\n", p); // %p打印p地址 + printf("*p = %d\n", *p); // %d打印p指向的变量的值 + *p = 26; // 修改p指向的变量的值 +} + +void f2(int k) +{ + printf("k = %d\n", k); +} diff --git a/翁凯C语言/6/指针数组.c b/翁凯C语言/6/指针数组.c new file mode 100644 index 0000000..08d07f3 --- /dev/null +++ b/翁凯C语言/6/指针数组.c @@ -0,0 +1,63 @@ +#include +#include +#include +#include +#include + +// !ָ +/* + * ָһ飬ÿԪضָ洢ڴַı 洢ָ顱ָ룬Ҫвַijַϡ̬ڴȣ + 1.* [鳤]; // !* ʾԪǸ͵ָ + C Уַchar*ָ루ַָ׵ַˣָǴ洢ַĸЧʽ洢ַĵַǸַݣ + 2.飬Ԫָ롣 + 洢ָ루ַ + 3.ָͨд洢ָ룬ʵ˶ԶݵĸЧڴַϡ̬ڴҪָijУڴ ʺʹԡ + 4. + int a = 10, b = 20, c = 30; + int *ptr_arr[3]; // һ3intָ + + ptr_arr[0] = &a; // 洢aĵַ + ptr_arr[1] = &b; // 洢bĵַ + ptr_arr[2] = &c; // 洢cĵַ +*/ + +int main() +{ + // ָ + int num1 = 5, num2 = 10; + int *num_ptrs[2] = {&num1, &num2}; + printf("Numbers: "); + for (int i = 0; i < 2; i++) + { + printf("%d ", *num_ptrs[i]); // 5 10 + } + printf("\n"); + + // ַָ + char *fruits[] = {"Apple", "Banana", "Cherry"}; + printf("Fruits: "); + for (int i = 0; i < 3; i++) + { + printf("%s ", fruits[i]); // Apple Banana Cherry + } + printf("\n"); + + // άָ + int table[3][2] = {{1, 2}, {3, 4}, {5, 6}}; + int *row_ptrs[3] = {table[0], table[1], table[2]}; + printf("Table:\n"); + for (int i = 0; i < 3; i++) + { + for (int j = 0; j < 2; j++) + { + printf("%d ", row_ptrs[i][j]); // ÿԪ + } + printf("\n"); + } + // + // 1 2 + // 3 4 + // 5 6 + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/6/指针的使用.c b/翁凯C语言/6/指针的使用.c new file mode 100644 index 0000000..e9ba795 --- /dev/null +++ b/翁凯C语言/6/指针的使用.c @@ -0,0 +1,81 @@ +#include +#include +#include +#include +#include + +// !指针应用场景 +/* + 1.函数返回多个值,某些值不方便直接返回,只能通过指针返回,传入的参数实际上是需要保存带回的结果的变量 + 2.函数返回运算的状态,结果通过指针返回。常用的套路是让函数返回特殊的不属于有效范围内的 值来表示出错:-1或0(在文件操作会看到大量的例子)。当任何数值都是有效的可能结果时,就得分开返 + +*/ + +void swap(int *pa, int *pb); +void minmax(int c[], int len, int *max, int *min); +int divide(int a, int b, int *result); + +int main(void) +{ + /* 1.交换两个变量的值 */ + int a = 5; + int b = 6; + + swap(&a, &b); + printf("a = %d, b = %d\n", a, b); + + /* 2.返回多个值*/ + int c[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,55}; + int min, max; + minmax(c, sizeof(c) / sizeof(c[0]), &max, &min); + printf("max = %d, min = %d\n", max, min); + + /* 3.返回运算的状态 */ + int d=5; + int e=6; + int f; + if (divide(d,e, &f)) + { + printf("%d/%d = %d\n", d, e, f); + } + + return 0; +} + +void swap(int *pa, int *pb) +{ + int t = *pa; + *pa = *pb; + *pb = t; +} + +void minmax(int a[], int len, int *max, int *min) +{ + int i; + *max = *min = a[0]; + for (i = 1; i < len; i++) + { + if (a[i] < *min) + { + *min = a[i]; + } + if (a[i] > *max) + { + *max = a[i]; + } + } +} + +int divide(int a, int b, int *result) +{ + if (b==0) + { + return 0; + } + else + { + *result = a / b; + } + + return 1; +} \ No newline at end of file diff --git a/翁凯C语言/6/指针运算.c b/翁凯C语言/6/指针运算.c new file mode 100644 index 0000000..8221d28 --- /dev/null +++ b/翁凯C语言/6/指针运算.c @@ -0,0 +1,85 @@ +#include +#include +#include +#include +#include + +// !ָ +/* + 1.ָp+1 + ָpֵԶһ洢ԪĴС(sizeof())ָһԪصĴ洢Ԫ + һָ1ʾҪָָһ + int a[10]; + int *p = a; + *(p+1)>a[1] + ָ벻ָһƬĿռ䣬飬û + *(p+n)<>ac[n] + 2.*p++ + ȡpָǸ֮˳pƵһλȥ + *ȼȻߣû++ + ռ + ijЩCPUϣֱӱһָ + 3.ָȽ + <,<=, ==,>,>=,!=Զָ + Ƚڴеĵַ + еĵԪĵַ϶Ե + 4.0ַ + Ȼڴ0ַ0ַͨDzĵַָ벻Ӧþ0ֵ + ˿0ַʾ: صָЧ,ָûбʼȳʼΪ0) + NULLһԤķţʾ0ַ + еıԸ0ʾ0ַ + 5.ָ + ָʲôͣеָĴСһģΪǵַ + ָͬ͵ָDzֱӻ + ֵ Ϊ˱ôָ + 6.ָת + void*ʾָ֪ʲôָ + ʱchar*ͬ(ͨ) + ָҲת + int *p = &i;void*q = (void*)p; + Ⲣûиıpָıͣúòͬ۹ͨpָı + ҲٵintΪǸvoid! + 7.ָʲô + Ҫϴʱ + + زֹһ + Ҫú޸IJֹһ +*/ + +int main(void) +{ + /* 1.ָp+1 */ + char ac[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + char *p = ac; // ָԪصָ,൱char *p = &ac[0] + char *p1 = &ac[5]; + printf("p = %p\n", p); // %p16ַ + printf("p+1 = %p\n", p + 1); + printf("p1-p = %d\n", p1 - p); + + int ad[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + int *q = ad; + int *q1 = &ad[6]; + printf("q = %p\n", q); // %p16ַ + printf("q+1 = %p\n", q + 1); + printf("q1-q = %d\n", q1 - q); + + /* 2.*p++ */ + char ae[] = {0,1,2,3,4,5,6,7,8,9,-1}; + char *p2 = ae; + int i = 0; + for (i = 0; i < sizeof(ae) / sizeof(ae[0]); i++) + { + printf("%d\n", ae[i]); + } + for (p2 = ae;*p2!=-1;p2++) // *p2++ȡֵָһԪ + { + printf("%d\n", *p2); + } + + /* 4.0ַ */ + char ai[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + char *q3 = ai; + q3=p; // + + return 0; +} diff --git a/翁凯C语言/7/单字符的输入输出.c b/翁凯C语言/7/单字符的输入输出.c new file mode 100644 index 0000000..9106231 --- /dev/null +++ b/翁凯C语言/7/单字符的输入输出.c @@ -0,0 +1,36 @@ +#include +#include +#include +#include +#include +#include + +// !ַ +/* + 1.putchar + int putchar(int c); + ׼дһַ + д˼ַEOF-1ʾдʧ + 2.getchar + int getchar(void); + ӱ׼һַ + intΪ˷EOF (-1 + Windows->Ctrl-Z + Unix>Ctrl-D + 3. + +*/ + +int main(void) +{ + int ch; + + while ((ch=getchar())!=EOF) + { + putchar(ch); + } + + printf("EOF\n"); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/7/字符串.c b/翁凯C语言/7/字符串.c new file mode 100644 index 0000000..ecb5c9c --- /dev/null +++ b/翁凯C语言/7/字符串.c @@ -0,0 +1,41 @@ +#include +#include +#include +#include +#include +#include + +// ! +/* + 1.ַ + 0(0)βһַ + 0'\0'һ,Ǻ'0'ͬ + O־ַĽַһ + ַȵʱ򲻰0 + ַʽڣָʽ + ָʽ + string.h кܶദַĺ + 2.ַ + Hello + "He11oᱻһַijij6βбʾ0 + ڵַᱻԶ + 3.ַ + CԵַַ̬ڵ + ַ + ͨķʽԱַ + Ψһĵطַʼַ + Լ׼ṩһϵַ +*/ + +int main(void) +{ + /* 1.ַĶ */ + char word[] = {'H', 'e', 'l', 'l', 'l', 'o', '\0'}; + + /* 2.ַ */ + char *p = "Hello"; + char word2[] = "Hello"; + char line[10] = "Hello"; + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/7/字符串中找字符.c b/翁凯C语言/7/字符串中找字符.c new file mode 100644 index 0000000..40ad2e1 --- /dev/null +++ b/翁凯C语言/7/字符串中找字符.c @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include +#include + +// !ַstring.h +/* + 1.string.h + strlenstrcmpstrcpystrcatstrchrstrstr + 2.strlen + size_t strlen(const char *s); + sַȣβ0) + 3.strcmp + int strcmp(const char *s1, const char *s2); Ƚַ: + 0:s1==S2 + 1:s1>s2 + -1:s1 +#include +#include +#include +#include +#include + +// !ַstring.h +/* + 1.string.h + strlenstrcmpstrcpystrcatstrchrstrstr + 2.strlen + size_t strlen(const char *s); + sַȣβ0) + 3.strcmp + int strcmp(const char *s1, const char *s2); Ƚַ: + 0:s1==S2 + 1:s1>s2 + -1:s1 +#include +#include +#include +#include +#include + +// !ַstring.h +/* + 1.string.h + strlenstrcmpstrcpystrcatstrchrstrstr + 2.strlen + size_t strlen(const char *s); + sַȣβ0) + 3.strcmp + int strcmp(const char *s1, const char *s2); Ƚַ: + 0:s1==S2 + 1:s1>s2 + -1:s1 +#include +#include +#include +#include +#include + +// !ַstring.h +/* + 1.string.h + strlenstrcmpstrcpystrcatstrchrstrstr + 2.strlen + size_t strlen(const char *s); + sַȣβ0) + 3.strcmp + int strcmp(const char *s1, const char *s2); Ƚַ: + 0:s1==S2 + 1:s1>s2 + -1:s1 +#include +#include +#include +#include +#include + +// !ַstring.h +/* + 1.string.h + strlenstrcmpstrcpystrcatstrchrstrstr + 2.strlen + size_t strlen(const char *s); + sַȣβ0) + 3. +*/ + +int my_strlen(const char *s) +{ + int idx = 0; + while (s[idx]!='\0') + { + idx++; + } + return idx; +} + +int main(void) +{ + /* strlen */ + char line[] = "Hello"; + printf("strlen=%lu\n", strlen(line)); + printf("my_strlen=%d\n", my_strlen(line)); + printf("sizeof=%lu\n", sizeof(line)); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/7/字符串变量.c b/翁凯C语言/7/字符串变量.c new file mode 100644 index 0000000..3998f3f --- /dev/null +++ b/翁凯C语言/7/字符串变量.c @@ -0,0 +1,48 @@ +#include +#include +#include +#include +#include +#include + +// ! +/* + 1.ַ + char*s = "Hello, world!"; + sһָ룬ʼΪָһַ + ڵĵطʵsconst char*sʷԭ򣬱ܲconstд + ͼsַָдᵼصĺ + Ҫ޸ַӦ: + char s[] = "Hello, world!"; + 2.ָ뻹? + char *str ="Hello" + char word[]="Hello" + 飺ַ + ΪرռԶ + ָ룺ַ֪ + + ̬ռ + 3.char*ַ + ַԱΪchar*ʽ + char*һַ + ַָָ룬ַָ飨int*һ + ַָֻнβ0˵ַָ +*/ + +int main(void) +{ + /* 1.ַĶ */ + char *s="Hello World!"; + char *s2 = "Hello World!"; + char s3[] = "Hello World!"; + s[0] = 'B'; + + printf("s =%p\n", s ); + printf("s2=%p\n", s2); + printf("s3=%p\n", s3); + s3[0] = 'B'; + printf("Here!s3[0]=%c\n", s3[0]); + printf("Here!s[0]=%c\n", s[0]); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/7/字符串数组.c b/翁凯C语言/7/字符串数组.c new file mode 100644 index 0000000..aa22a82 --- /dev/null +++ b/翁凯C语言/7/字符串数组.c @@ -0,0 +1,42 @@ +#include +#include +#include +#include +#include +#include + +// !ַ +/* + 1.ַ + char* *a + aһָ룬ָһָ룬Ǹָָһַ( + char a[][] + 2. + int main(int argc, char const *argv[]) + argv[0] + ʹUnixķʱӳӵ +*/ + +int main(void) +{ + char a[][10] = {"Hello", + "World", + "C", + "Language"}; + for (int i = 0; i < 4; i++) + { + printf("%s ", a[i]); + } + printf("\n"); + + /* a[0] --> char* */ + char *b[] = {"Hello", + "World", + "C", + "Language"}; + for (int i = 0; i < 4; i++) + { + printf("%s ", b[i]); + } + printf("\n"); +} \ No newline at end of file diff --git a/翁凯C语言/7/字符串数组2.c b/翁凯C语言/7/字符串数组2.c new file mode 100644 index 0000000..55fdb1e --- /dev/null +++ b/翁凯C语言/7/字符串数组2.c @@ -0,0 +1,29 @@ +#include +#include +#include +#include +#include +#include + +// !ַ +/* + 1.ַ + char* *a + aһָ룬ָһָ룬Ǹָָһַ( + char a[][] + 2. + int main(int argc, char const *argv[]) + argv[0] + ʹUnixķʱӳӵ +*/ + +int main(int argc, char const *argv[]) +{ + int i; + for (i = 0; i < argc; i++) + { + printf("%d:%s\n", i, argv[i]); + } + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/7/字符串的输入输出.c b/翁凯C语言/7/字符串的输入输出.c new file mode 100644 index 0000000..988cdaa --- /dev/null +++ b/翁凯C语言/7/字符串的输入输出.c @@ -0,0 +1,49 @@ +#include +#include +#include +#include +#include +#include + +// !ַ +/* + 1.ֵַ + char *t =title + char *s; + s=t; + ûвµַָֻsָtַָ,sκβǶt + 2.ַ + char string[8]; + scanf("%s",string); + printf("%s",string); + scanfһ(ոtabسΪֹ) + scanfDzȫģΪ֪Ҫݵij + 3.ȫ + char string[8]; + scanf("%7s", string); + %sֱ֮ʾַӦñĴССһ + һscanf↑ʼ? + 4. + char *string; + scanf("%s", string); + Ϊchar*ַͣһַ͵ + stringͿֱʹ + ûжstringʼΪ0Բһÿж + 5.ַ + char buffer[100]=""; + һյַbuffer[0]=='\0' + char buffer[]=""; + ijֻ1 + +*/ + +int main(void) +{ + char word1[8]; + char word2[8]; + scanf("%7s", word1); // һ + scanf("%7s", word2); //%7sʾ7ַһַ\0,ֹԽ + printf("%s##%s##\n", word1, word2); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/7/字符串输出回文字.c b/翁凯C语言/7/字符串输出回文字.c new file mode 100644 index 0000000..336656f --- /dev/null +++ b/翁凯C语言/7/字符串输出回文字.c @@ -0,0 +1,46 @@ +#include +#include +#include +#include +#include +#include + +// !ַ +/* + 1.ַ + char* *a + aһָ룬ָһָ룬Ǹָָһַ( + char a[][] + 2. + int main(int argc, char const *argv[]) + argv[0] + ʹUnixķʱӳӵ +*/ + +int main() +{ + char str[100]; + printf("һַ"); + scanf("%s", str); + + int len=strlen(str); // !strlen()ַijȣ'\0'ַ + int is_huiwenzi = 1; + + for (int i = 0; i < len / 2;i++) + { + if (str[i]!=str[len-i-1]) + { + is_huiwenzi = 0; + } + } + if (is_huiwenzi) + { + printf("ǻ\n"); + } + else + { + printf("ǻ\n"); + } + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/8/动态链表.c b/翁凯C语言/8/动态链表.c new file mode 100644 index 0000000..ce85294 --- /dev/null +++ b/翁凯C语言/8/动态链表.c @@ -0,0 +1,102 @@ +#include +#include + +// !Ͷ +/* + 1.Զ(typedef) + CṩһtypedefĹһе͵֡: + typedef int Length; + ʹLength Ϊint͵ı + Length־ͿԴintڱͲĵطˣ + Length a, b, len; + Length numbers[10]; + 2.Typedef + µ͵ + µij͵ı + ˳Ŀɶ + typedef long int64_t; //! еֵĺпֲ + typedef struct ADate { + int month; + int day; + int year; + };Date; //! Data->struct ADate,˸ӵ + int64_t i = 100000000000; + Date d = [9, 1, 2005]; +*/ + +#define LEN sizeof(struct Student) + +// ڵṹ +struct Student +{ + long num; // ѧ + float score; // ɼ + struct Student *next; // ָһڵָ +}; + +int n; // ¼ڵﱣԭȫֱķʽҲŻΪֲָͨ봫 + +// ̬ĺ +struct Student *creat(void) +{ + struct Student *head = NULL; // ͷָ룬ʼΪ + struct Student *p1, *p2; // p1 ָ´Ľڵ㣬p2 ָǰβڵ + n = 0; // ʼڵ + + // ̬һڵڴ + p1 = p2 = (struct Student *)malloc(LEN); + if (p1 == NULL) + { // ڴǷɹ + printf("ڴʧܣ\n"); + return NULL; + } + scanf("%ld,%f", &p1->num, &p1->score); // һѧѧźͳɼ + + // ѭڵ㣬ֱѧΪ 0 + while (p1->num != 0) + { + n++; // ڵ 1 + if (n == 1) + { + head = p1; // һڵ㣬ͷָָ + } + else + { + p2->next = p1; // ǵһڵ㣬½ڵӵβ + } + p2 = p1; // βڵָ룬ʹָǰһڵ + + // ̬һڵڴ + p1 = (struct Student *)malloc(LEN); + if (p1 == NULL) + { // ڴǷɹ + printf("ڴʧܣ\n"); + // ڴʧܣѷĽڵ㣬ڴй©ʾпɼ򻯴 + return head; + } + scanf("%ld,%f", &p1->num, &p1->score); // һѧϢ + } + p2->next = NULL; // һڵ next Ϊ NULL + return head; // ͷָ룬ͨͷָɷ +} + +// ݵĺѡ֤ +void printList(struct Student *head) +{ + struct Student *p = head; + while (p != NULL) + { + printf("ѧţ%ldɼ%.1f\n", p->num, p->score); + p = p->next; + } +} + +int main() +{ + struct Student *head = creat(); // ô + printList(head); // + + // ע⣺ʵʹӦдͷڴĺͷŶ̬Ľڵ㣬ڴй© + // ʾʡԣӳڴͷ߼ + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/8/枚举.c b/翁凯C语言/8/枚举.c new file mode 100644 index 0000000..f626dba --- /dev/null +++ b/翁凯C语言/8/枚举.c @@ -0,0 +1,53 @@ +#include +#include +#include +#include +#include +#include + +// !ö +/* + 1.ö + öһûͣùؼenum ﷨: + enum ö{0....; + öͨʹãҪõڴ֣ΪǾǾdzţǵintֵδ0 n磺 + enum colors { red, yellow, green}; + ʹredֵ0yellow1green2 + ҪһЩijֵʱöٵǸЩֵ֡ + ҪеöҪһö±ʱͺܷ + 2.ö + öʱֵָ + enum COLOR ( RED=1, YELLOW, GREEN = 5); // !YELLOWֵ2GREENֵ5 + 3.öֻint + ʹö͵ıڵֵҲûκwarningerror + 4.ö + ȻöͿԵʹãʵϺ(bu)(hao) + űȵ֣öٱconst int + öٱȺ꣨macroãΪöint +*/ + +enum COLOR +{ + RED, + YELLOW, + GREEN +}; + +int main(void) +{ + int color = -1; + char *colorName = NULL; + + printf("ϲɫĴ룺"); + scanf("%d", &color); + switch (color) + { + case RED: colorName = "red"; break; + case YELLOW: colorName = "yellow"; break; + case GREEN: colorName = "green"; break; + default: colorName= "unknown"; break; + } + printf("ϲɫsn", colorName); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/8/类型定义.c b/翁凯C语言/8/类型定义.c new file mode 100644 index 0000000..19cf53f --- /dev/null +++ b/翁凯C语言/8/类型定义.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include +#include +#include + +// !类型定义 +/* + 1.自定义数据类型(typedef) + C语言提供了一个叫做typedef的功能来声明一个已有的数据类型的新名字。比如: + typedef int Length; + 使得Length 成为int类型的别名。 + 这样,Length这个名字就可以代替int出现在变量定义和参数声明的地方了: + Length a, b, len; + Length numbers[10]; + 2.Typedef + 声明新的类型的名字 + 新的名字是某种类型的别名 + 改善了程序的可读性 + typedef long int64_t; //! 重载已有的类型名字新名字的含义更清晰具有可移植性 + typedef struct ADate { + int month; + int day; + int year; + };Date; //! Data->struct ADate,简化了复杂的名字 + int64_t i = 100000000000; + Date d = [9, 1, 2005]; + 3.typedef int Length; // Length就等价于int类型 + typedef char* Strings[IO]; // Strings是10个字符串的数组的类型 + typedef struct node{ + int data; + struct node *next; + }aNode; + 或 + typedef struct node aNode;//这样用aNode就可以代替 + struct node +*/ + +int main(void) +{ + + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/8/结构与函数.c b/翁凯C语言/8/结构与函数.c new file mode 100644 index 0000000..f023436 --- /dev/null +++ b/翁凯C语言/8/结构与函数.c @@ -0,0 +1,86 @@ +#include +#include +#include +#include +#include +#include + +// !ṹ뺯 +/* + 1.ṹΪ + int numberofDays(struct date d) + ṹΪֵ뺯 + ʱں½һṹƵߵĽṹֵ + ҲԷһṹ + ȫͬ +*/ + +struct data +{ + int month; + int day; + int year; +}; + +bool isLeap(struct data d); +int numberOfDays(struct data d); + +int main(void) +{ + struct data today, tomorrow; + + printf("Enter today's date (mm dd yyyy): "); + scanf("%i %i %i", &today.month, &today.day, &today.year); + + if (today.day != numberOfDays(today)) + { + tomorrow.day = today.day + 1; + tomorrow.month = today.month; + tomorrow.year = today.year; + } + else if (today.month == 12) + { + tomorrow.day = 1; + tomorrow.month = 1; + tomorrow.year = today.year + 1; + } + else + { + tomorrow.day = 1; + tomorrow.month = today.month + 1; + tomorrow.year = today.year; + } + + printf("Tomorrow's date is %i-%i-%i.\n", tomorrow.month, tomorrow.day, tomorrow.year); + + return 0; +} + +bool isLeap(struct data d) +{ + bool leap = false; + + if ((d.year % 4 == 0 && d.year % 100 != 0) || d.year % 400 == 0) + { + leap = true; + } + + return leap; +} + +int numberOfDays(struct data d) +{ + int days; + const int daysPerMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + + if (d.month == 2 && isLeap(d)) + { + days = 29; + } + else + { + days = daysPerMonth[d.month - 1]; + } + + return days; +} \ No newline at end of file diff --git a/翁凯C语言/8/结构与函数2.c b/翁凯C语言/8/结构与函数2.c new file mode 100644 index 0000000..70942a0 --- /dev/null +++ b/翁凯C语言/8/结构与函数2.c @@ -0,0 +1,90 @@ +#include +#include +#include +#include +#include +#include + +// !结构与函数 +/* + 1.结构作为函数参数 + int numberofDays(struct date d) + 整个结构可以作为参数的值传入函数 + 这时候是在函数内新建一个结构变量,并复制调用者的结构的值 + 也可以返回一个结构 + 这与数组完全不同 + 2.输入结构没 + 高接的方式可以一次scanf 如果我们打算写一个函数来读入结构 + 那么些一个函数,专门用来读入结构 + 但是读入的结构如何送回来呢? + 记住C在函数调用时是传值的 + 所以函数中的p与main中的y是不同的 + 在函数读入了p的数值之后,没有任何东西回到main,所以y还是{0,0} + 前的方案,把一个结构传入了函数,然后在函数中操作,但是没有返回回去 + 问题在于传入函数的是外面那个结构的克隆体,而不是指针 + 传入结构和传入数组是不同的 + 在这个输入函数中,完全可以创建一个临时的结构变量,然后把这个结构返回给调用者 + void main() + { + struct point y = (0,0}; + y= inputPoint(); + output(y): + } + struct point inputPoint() + { + struct point temp; + scanf("%d", &temp.x); + scanf("%d",&temp.y); + return temp; + } + 3. + struct date + { + int month; + int day; + int year; + } myday; + struct date *p = &myday; + (*p).month = 12; + p->month = 12; + 4. +*/ + +struct point +{ + int x; + int y; +}; + +struct point *getStruct(struct point *); +void output(struct point); +void print(const struct point *p); + +int main(void) +{ + struct point y = {0, 0}; + getStruct(&y); + output(y); + output(*getStruct(&y)); + printf(getStruct(&y)); + + return 0; +} + +struct point *getStruct(struct point *p) +{ + scanf("%d", &p->x); + scanf("%d", &p->y); + printf("%d %d\n", p->x, p->y); + return p; +} + +void output(struct point p) +{ + printf("%d %d\n", p.x, p.y); +} + +void print(const struct point *p) +{ + printf("%d %d\n", p->x, p->y); +} \ No newline at end of file diff --git a/翁凯C语言/8/结构中的结构3.c b/翁凯C语言/8/结构中的结构3.c new file mode 100644 index 0000000..dd8c63f --- /dev/null +++ b/翁凯C语言/8/结构中的结构3.c @@ -0,0 +1,102 @@ +#include +#include +#include +#include +#include +#include + +// !结构中的结构 +/* + 1.结构数组 + struct date dates[!00]; + struct date dates[] = { + {4,5,2005}, + {2,4,2005} + } + * 最外面的大括号表示数组,里面的括号表示结构体 + * 结构体本质是一种数据类型,数组是这种数据类型的变量 + 2.结构中的结构 + struct dateAndTime { + struct date sdate; + struct time stime; + }; + 3.嵌套的结构 + struct point { + int x; + int y; + }; + struct rectangle { + struct point pt1; + struct point pt2; + }; + 如果有变量 + struct rectangle r; + 就可以有: + r.pt1.x、 rpt1.y, r.pt2.x 和 rpt2.y + 如果有变量定义: + struct rectang1e r, *rp; + rp = &r; + 那么下面的四种形式是等价的: + r.pt1.x + rp->pt1.x + (rpt1).x + (rp->pt1).x + 但是没有rp->pt1->x(因为pt1不是指针) +*/ + +struct time +{ + int hour; + int minute; + int second; +}; + +struct time timeUpdate(struct time now); + +int main(void) +{ + struct time testTime[5] = { + {11, 59, 59}, + {12, 0, 0}, + {1, 29, 59}, + {23, 59, 59}, + {19, 12, 27} + }; + + for (int i = 0; i < 5; i++) + { + printf("Time is %.2i:%.2i:%.2i\n", + testTime[i].hour, testTime[i].minute, testTime[i].second); + { + testTime[i] = timeUpdate(testTime[i]); + } + printf(" ... one second later it's %.2i:%.2i:%.2i\n", + testTime[i].hour, testTime[i].minute, testTime[i].second); + } + + return 0; +} + +struct time timeUpdate(struct time now) +{ + ++now.second; + + if (now.second == 60) + { + now.second = 0; + ++now.minute; + + if (now.minute == 60) + { + now.minute = 0; + ++now.hour; + + if (now.hour == 24) + { + now.hour = 0; + } + } + } + + return now; +} \ No newline at end of file diff --git a/翁凯C语言/8/结构类型.c b/翁凯C语言/8/结构类型.c new file mode 100644 index 0000000..38d5f3b --- /dev/null +++ b/翁凯C语言/8/结构类型.c @@ -0,0 +1,73 @@ +#include +#include +#include +#include +#include +#include + +// !ṹ +/* + 1.ں/ + ͱرһںڲĽṹֻںڲʹ + ͨںⲿṹͣͿԱʹ + 2.ṹʽ + struct point{ + int x; + int y; + }; + struct point pl,p2; + plp2pointxyֵ + + struct{ + int x; + int y; + }pl,p2; + p1p2һṹ,xy + + struct point{ + int x; + int y; + } pl,p2; + plp2pointxyֵt + *ڵһ͵ʽ˽ṹpointǵڶʽûpoint,ֻǶ + 3.ṹԱ + ṹе + ÿ±Ա + a[0]= 10; + ṹ.ַԱ + today.day + student.firstName + pl.x pl.y + 4.ṹ + Ҫṹֱýṹ + ṹֵȡַҲԴݸ + pl = (struct point)(5, 10}; + ൱pl.x=5;pl.y= I0; + pl=p2; + ൱pl.x= p2.x;pl.y= p2.y; + 5.ṹָ + 鲻ͬṹֲǽṹĵַʹ& + struct date *pDate = &today; +*/ + +struct data +{ + int month; + int day; + int year; +}; + +int main(void) +{ + struct data today; + today = (struct data){07,31,2014}; + + struct data day; + day = today; + day.year = 2015; + + printf("Today's date is %i-%i-%i.\n", today.year, today.month, today.day); + printf("This month is %i-%i-%i.\n", day.year, day.month, day.day); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/8/联合.c b/翁凯C语言/8/联合.c new file mode 100644 index 0000000..0e69356 --- /dev/null +++ b/翁凯C语言/8/联合.c @@ -0,0 +1,34 @@ +#include +#include +#include +#include +#include +#include + +// ! +/* + 1.洢 + еijԱһռ + ͬһʱֻһԱЧ + unionĴСijԱ + 2.ʼ + ԵһԱʼ +*/ +typedef union { + int i; + char ch[sizeof(int)]; +} CHI; + +int main() +{ + CHI chi; + int i; + chi.i = 1234; + for ( i=0; i +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#endif + +// !ȫֱ +/* + 1.ںıȫֱ + 2.ȫֱȫֵں + κκ޹ + κκڲʹ + 3.ȫֱʼ + ûʼȫֱõ0ֵ + ָõNULLֵ + ֻñʱֵ֪ʼȫֱ + ǵijʼmain֮ǰ + 4.صȫֱ + ڲȫֱͬıȫֱ +*/ + +int f(void); + +int gALL = 12; + +int main() +{ + // ÿ̨ΪUTF-8 +#ifdef _WIN32 + system("chcp 65001 > nul"); // ÿ̨ΪUTF-8 + SetConsoleOutputCP(65001); // ÿ̨ + SetConsoleCP(65001); // ÿ̨ +#endif + + printf("in %s gALL = %d\n", __func__, gALL); + f(); + printf("in %s gALL = %d\n", __func__, gALL); + + return 0; +} + +int f(void) +{ + printf("in %s gALL = %d\n", __func__, gALL); + gALL+=2; + printf("in %s gALL = %d\n", __func__, gALL); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/9/声明.c b/翁凯C语言/9/声明.c new file mode 100644 index 0000000..a696ab9 --- /dev/null +++ b/翁凯C语言/9/声明.c @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#endif + +// ! +/* + 1. + int i;DZĶ + extern int i;DZ + 2.Ͷ + DzĶ + ԭ + + ṹ + + ö + + inline + DzĶ + 3.ͷļ + ֻԱͷļ + ǹǷ + һĿж뵥Ԫʵ + *ijЩ뵥Ԫдͬĺweakηǿִ + 4.ظ + ͬһ뵥Ԫ,ͬĽṹܱظ + ͷļнṹͷļһ뵥Ԫﱻ#include + Ҫ׼ͷļṹ + 5.׼ͷļṹ + #ifndef __LIST_HEAD__ + #define __LIST_HEAD__ + + #include "node.h" + typedef struct _list { + Node* head; + Node* tail; + } List; + + #endif + ͺ֤꣬ͷļһ뵥Ԫֻᱻ#includeһ + #pragma onceҲͬãDzеı֧ +*/ + +int main() +{ + // ÿ̨ΪUTF-8 +#ifdef _WIN32 + system("chcp 65001 > nul"); // ÿ̨ΪUTF-8 + SetConsoleOutputCP(65001); // ÿ̨ + SetConsoleCP(65001); // ÿ̨ +#endif + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/9/大程序.c b/翁凯C语言/9/大程序.c new file mode 100644 index 0000000..d69a5ac --- /dev/null +++ b/翁凯C语言/9/大程序.c @@ -0,0 +1,38 @@ +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#endif + +// ! +/* + 1..cļ + main()Ĵ̫ʺϷֳɼ + һԴļ̫ʺϷֳɼļ + Դļܱγɿִеij + 2.Ŀ + Dev C++½һĿȻѼԴļȥ + Ŀ,Dev C++ıһĿеԴļ + еIDEзֿı͹ťǰǶԵԴļ룬ǶĿ + 3.뵥Ԫ + һ.cļһ뵥Ԫÿαֻһ뵥Ԫ +*/ + +int main() +{ + // ÿ̨ΪUTF-8 +#ifdef _WIN32 + system("chcp 65001 > nul"); // ÿ̨ΪUTF-8 + SetConsoleOutputCP(65001); // ÿ̨ + SetConsoleCP(65001); // ÿ̨ +#endif + + + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/9/头文件.c b/翁凯C语言/9/头文件.c new file mode 100644 index 0000000..ea05ccd --- /dev/null +++ b/翁凯C语言/9/头文件.c @@ -0,0 +1,50 @@ +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#endif + +// !ͷļ +/* + 1.ͷļ + Ѻԭͷŵһͷļ.hβУҪԴļ.cļ#includeͷļñڱʱ֪ԭ + 2.#include + #includeһԤָͺһڱ֮ǰʹ + Ǹļȫıԭⲻز뵽ڵĵط + ҲһҪ.cļǰ#include + 3.""<> + #includeʽָҪļ + ""ҪڵǰĿ¼.cļڵĿ¼) ѰļûУָĿ¼ȥ + <>ñָֻĿ¼ȥ + Լ֪Լı׼ͷļ + ͱвҲָѰͷļĿ¼ + 4.#include + #include + stdio.hֻprintԭͣprintĴĵطij.lib(Windows).a(Unix) + ڵCԱĬϻеı׼ + #include ֻΪñ֪printfԭ֤ͣʱIJֵȷ + 5.ͷļ + ʹúͶĵطӦ#includeͷļ + һκ.cжӦͬ.hж⹫ĺԭͺȫֱŽȥ + 6.⹫ĺ + ںǰstaticʹΪֻڵı뵥Ԫбʹõĺ + ȫֱǰstaticʹΪֻڵı뵥Ԫбʹõȫֱ +*/ + +int main() +{ + // ÿ̨ΪUTF-8 +#ifdef _WIN32 + system("chcp 65001 > nul"); // ÿ̨ΪUTF-8 + SetConsoleOutputCP(65001); // ÿ̨ + SetConsoleCP(65001); // ÿ̨ +#endif + + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/9/宏定义.c b/翁凯C语言/9/宏定义.c new file mode 100644 index 0000000..0af382f --- /dev/null +++ b/翁凯C语言/9/宏定义.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#endif + +// !궨 +/* + 1.Ԥָ + #ͷDZԤָ + DzCԵijɷ֣CԳ벻 + #defineһ + 2.#define + #define <> <ֵ> + עûнβķֺţΪC + ֱһʣֵǸֶ + CԵıʼ֮ǰԤ(cpp)ѳеֵֻ + ȫı滻 + gcc --save-temps + 3. + һֵĺ֣Ҳǻᱻ滻 + һֵһУһ֮ǰĩҪ\ + ֵֵעͲᱻֵһ + 4.ûֵĺ + #define_DEBUG + ģıԤָǷѾ + 5.Ԥĺ + __LINE__ //ǰк + __FILE__ //ǰļ + __DATE__ //ǰ + __TIME__ //ǰʱ + __STDC__ //ѭANSI CֵΪ1 +*/ + +#define PI 3.1415926 + +int main() +{ + // ÿ̨ΪUTF-8 +#ifdef _WIN32 + system("chcp 65001 > nul"); // ÿ̨ΪUTF-8 + SetConsoleOutputCP(65001); // ÿ̨ + SetConsoleCP(65001); // ÿ̨ +#endif + + printf("%f\n", 2*PI*3.0); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/9/带参数的宏.c b/翁凯C语言/9/带参数的宏.c new file mode 100644 index 0000000..483695c --- /dev/null +++ b/翁凯C语言/9/带参数的宏.c @@ -0,0 +1,47 @@ +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#endif + +// !ĺ +/* + 1.ĺ + #define cube(x) ((x)*(x)*(x)) + Դ + 2.ĺԭ + һжҪ + ֵҪ + ֵÿطҪ + #define RADTODEG(x) ((x) * 57.29578) + + Դ + #define MIN(a,b) ((a)>(b)?(b):(a)) + Ҳ(Ƕףʹ + 3.ڴͳĴʹ÷dzձ + Էdzӣ硰 + ###İ + Ļ + ֺᱻinline +*/ + +#define cube(x) ((x)*(x)*(x)) + +int main() +{ + // ÿ̨ΪUTF-8 +#ifdef _WIN32 + system("chcp 65001 > nul"); // ÿ̨ΪUTF-8 + SetConsoleOutputCP(65001); // ÿ̨ + SetConsoleCP(65001); // ÿ̨ +#endif + + printf("cube(5) = %d\n", cube(5)); + + return 0; +} \ No newline at end of file diff --git a/翁凯C语言/9/返回指针的函数.c b/翁凯C语言/9/返回指针的函数.c new file mode 100644 index 0000000..e6609ac --- /dev/null +++ b/翁凯C语言/9/返回指针的函数.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#endif + +// !ָĺ +/* + 1.*ָĺ + ررĵַΣյ + ȫֱ̬رĵַǰȫ + ںmallocڴǰȫģ + õǷشָ + 2.tips + Ҫʹȫֱں䴫ݲͽ + ʹȫֱ + İ + *ʹȫֱ;̬رĺ̲߳ȫ +*/ + +int *f(void); +void g(void); + +int main() +{ + // ÿ̨ΪUTF-8 +#ifdef _WIN32 + system("chcp 65001 > nul"); // ÿ̨ΪUTF-8 + SetConsoleOutputCP(65001); // ÿ̨ + SetConsoleCP(65001); // ÿ̨ +#endif + + int *p=f(); + printf("*p = %d\n", *p); + g(); + printf("*p = %d\n", *p); + + return 0; +} + +int *f(void) +{ + int i=12; + return &i; +} + +void g(void) +{ + int k = 14; + printf("k = %d\n", k); +} \ No newline at end of file diff --git a/翁凯C语言/9/静态本地变量.c b/翁凯C语言/9/静态本地变量.c new file mode 100644 index 0000000..39719ae --- /dev/null +++ b/翁凯C语言/9/静态本地变量.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#include +#endif + +// !̬ر +/* + 1.̬ر + ڱرʱstaticηͳΪ̬ر + 뿪ʱ򣬾̬رڲֵ + ̬رijʼֻڵһνʱԺ뺯ʱᱣϴ뿪ʱֵ + 2.̬رȫֱ + ̬رʵȫֱ + λͬڴ + ̬رȫֵڣڵľֲ + static˼Ǿֲ(ؿɷ) +*/ + +int f(void); + +int gALL = 12; + +int main() +{ + // ÿ̨ΪUTF-8 +#ifdef _WIN32 + system("chcp 65001 > nul"); // ÿ̨ΪUTF-8 + SetConsoleOutputCP(65001); // ÿ̨ + SetConsoleCP(65001); // ÿ̨ +#endif + + f(); + + return 0; +} + +int f(void) +{ + int k = 0; + static int gall = 1; + printf("&gALL=%p\n", &gALL); + printf("&gall=%p\n", &gall); + printf("&k =%p\n", &k); + + printf("in %s gall = %d\n", __func__, gall); + gall += 2; + printf("agn in %s gall = %d\n", __func__, gall); + + return 0; +} \ No newline at end of file diff --git a/草稿/test.md b/草稿/test.md new file mode 100644 index 0000000..76f61ba --- /dev/null +++ b/草稿/test.md @@ -0,0 +1,9 @@ +# Ľ +ٴγɹȻѾûб⣬ҽԴһЩĽ飬Ϳάԡ +1. ȫֱ ʹȫֱ board , step_count ȣʹά״̬ĸıܷκεط˵Ѷȡ齫Щװһ GameState ṹУͨṹָ롣 +2. ṹ Ŀǰ gobang.h Ϸ߼AI߼ game_mode.h ϷģʽԿǽAIصĺ evaluate_pos , dfs , ai_move 뵽һµͷļ ai.h Уʹְ +3. ħ ʹһЩħ֡ handle_player_turn ʹ -1 , -2 , -3 Ϊıʶʹ enum #define ΪЩֶƣ INPUT_UNDO , INPUT_SAVE , INPUT_EXIT +4. 봦 handle_player_turn е봦߼ȽϸӣԿǽΪСĺһרڽûĺ +5. gobang.c еһЩܹرAIصĺǷֽΪСġܵһĺ߿ɶԡ +6. ļ save_game , load_game Ӹ׳Ĵ fopen ķֵʧʱûṩȷĴϢ +7. ע ȻһЩעͣԶԸӵ㷨AI evaluate_pos dfs Ӹϸעͣ乤ԭƾߡ \ No newline at end of file diff --git a/草稿/test.tex b/草稿/test.tex new file mode 100644 index 0000000000000000000000000000000000000000..f8312abaefb51ab8610054294901f52c8abcf0b0 GIT binary patch literal 512000 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 X6{{xf!SIvu|9Kb@kfla?_y7MtfC1Lb literal 0 HcmV?d00001 diff --git a/草稿/草稿1.c b/草稿/草稿1.c new file mode 100644 index 0000000..e69de29 diff --git a/草稿/草稿2.c b/草稿/草稿2.c new file mode 100644 index 0000000..681d151 --- /dev/null +++ b/草稿/草稿2.c @@ -0,0 +1,13 @@ +#include + +int main() +{ + long int n; + scanf("%ld", &n); + long m; + scanf("%ld", &m); + long long int a[n]; + long long b; + + return 0; +} \ No newline at end of file diff --git a/课上代码练习/1.1.1/初识C语言.c b/课上代码练习/1.1.1/初识C语言.c new file mode 100644 index 0000000..1e3562f --- /dev/null +++ b/课上代码练习/1.1.1/初识C语言.c @@ -0,0 +1,10 @@ +#include + +int main() +{ + double a, b, c; + scanf("%lf %lf", &a, &b); + c = a / b; + printf("%.0f/%.0f=%.2f\n", a, b, c); + + return 0; diff --git a/课上代码练习/1.1.2/num_max.c b/课上代码练习/1.1.2/num_max.c new file mode 100644 index 0000000..f7a2614 --- /dev/null +++ b/课上代码练习/1.1.2/num_max.c @@ -0,0 +1,26 @@ +#include + +int max(int a, int b); + +int main() +{ + int a, b,c; + scanf("%d %d", &a, &b); + + c = max(a, b); + + printf("%d%d%d", a, b, c); + + return 0; +} + +int max(int a, int b) +{ + int c = a; + + if (a + +int main() +{ + int sign = 1; + int n; + printf("n: "); + scanf("%d", &n); + double deno = 2.0, sum = 1.0, term; + + while (deno <= n) + { + sign = -sign; + term = sign / deno; + sum = sum + term; + deno = deno + 1; + } + printf("%f\n", sum); + + return 0; +} \ No newline at end of file diff --git a/课上代码练习/1.1.4/char函数.c b/课上代码练习/1.1.4/char函数.c new file mode 100644 index 0000000..ba7b10b --- /dev/null +++ b/课上代码练习/1.1.4/char函数.c @@ -0,0 +1,20 @@ +#include + +int main() +{ + char c = 'Y'; + putchar(66); // B + putchar('O'); // O + putchar(c); // Y + putchar('\n'); + + char a, b; + a = getchar(); + b = getchar(); + putchar(a); + putchar(b); + + putchar(getchar()); + + return 0; +} \ No newline at end of file diff --git a/课上代码练习/1.1.5/字母大小写转换.c b/课上代码练习/1.1.5/字母大小写转换.c new file mode 100644 index 0000000..53d6288 --- /dev/null +++ b/课上代码练习/1.1.5/字母大小写转换.c @@ -0,0 +1,14 @@ +#include + +int main() +{ + char c1, c2; + printf("һдĸ"); + c1 = getchar(); + c2 = c1 + 32; + printf("תСдĸΪ"); + putchar(c2); + putchar('\n'); + + return 0; +} \ No newline at end of file diff --git a/课上代码练习/1.1.6/if_else.c b/课上代码练习/1.1.6/if_else.c new file mode 100644 index 0000000..a394330 --- /dev/null +++ b/课上代码练习/1.1.6/if_else.c @@ -0,0 +1,10 @@ +#include + +int main() +{ + int a, b, c; + a = b = c = 0; + a++ &&b++ | c++; + printf("%d,%d,%d\n",a,b,c); + return 0; +} \ No newline at end of file diff --git a/课上代码练习/1.1.7/BMI.c b/课上代码练习/1.1.7/BMI.c new file mode 100644 index 0000000..d0b3cc1 --- /dev/null +++ b/课上代码练习/1.1.7/BMI.c @@ -0,0 +1,26 @@ +#include + +int main() +{ + double a, b,c; + printf("(kg)(cm)\n"); + scanf("%lf %lf",&a,&b); + + b /= 100; + c=a/(b*b); + + if(c< 18) + { + printf("BMI%.2f,̫\n",c); + } + else if (c > 24) + { + printf("BMI%.2f,е\n",c); + } + else if (18 <= c && c <= 24) + { + printf("BMI%.2f,\n",c); + } + + return 0; +} \ No newline at end of file diff --git a/课上代码练习/五子棋/AI_function.md b/课上代码练习/五子棋/AI_function.md new file mode 100644 index 0000000..918361c --- /dev/null +++ b/课上代码练习/五子棋/AI_function.md @@ -0,0 +1,149 @@ +# AIʵ + +## 㷨 +AIæ-¼֦ŻļС㷨רҵϵͳͶεвơ㷨£ + +1. **в׶**ȼ鲢ֹҼγɵĻġĵв +2. **߽׶**ʹæ-¼֦ļС㷨λ +3. **Ż**λȨغͼֵۺ + +## ݽṹ + +### ̱ʾ +```c +int board[MAX_BOARD_SIZE][MAX_BOARD_SIZE]; // 25x25 +``` +- `0`ʾλ +- `1`ʾ(X) +- `2`ʾAI() + +### ¼ +```c +typedef struct { + int player; // 巽(12) + int x, y; // (0-based) +} Step; + +Step steps[MAX_STEPS]; // ¼ +``` + +### Ϣ +```c +typedef struct { + int continuous_chess; // ͬɫ + bool check_start; // ʼǷ񿪷 + bool check_end; // Ƿ񿪷 +} DirInfo; +``` + +## ĺ˵ + +### 1. ai_move(int depth) +**AI** +```c +void ai_move(int depth); +``` +- `depth` - ǰ +- ̣ + 1. ȷ鲢ֹҵв + 2. ʹæ-¼֦λ + 3. ִ + +### 2. dfs(int x, int y, int player, int depth, int alpha, int beta, bool is_maximizing) +**-¼֦** +```c +int dfs(int x, int y, int player, int depth, int alpha, int beta, bool is_maximizing); +``` +- + - `x,y` - ǰλ + - `player` - ǰ + - `depth` - ʣ + - `alpha/beta` - ֦ + - `is_maximizing` - Ƿ(AI) + +- ֵ + +### 3. evaluate_pos(int x, int y, int player) +**λ** +```c +int evaluate_pos(int x, int y, int player); +``` +׼ +- ĸ(ˮƽֱԽ)ֱ +- (塢)Ϳų̶ +- λȨ(ֵ) + +### 4. count_specific_direction(int x, int y, int dx, int dy, int player) +**** +```c +DirInfo count_specific_direction(int x, int y, int dx, int dy, int player); +``` +- ض +- ؽṹ + - + - ˿״̬ + +## ϵͳ + +### ֱ׼ +| | | | +|-------------|--------------------|-------| +| | ˿ŵ | 100000| +| | һ˿ŵ | 10000 | +| | ˿ŵ | 5000 | +| | һ˿ŵ | 1000 | +| | ˿ŵĶ | 500 | +| ߶ | һ˿ŵĶ | 100 | + +### λȨ +- `50 * (BOARD_SIZE - پ)` +- Ե򣺻 + +## + +### -¼֦Ż +1. **ڵ(AI)** + - ¦ֵ + - ʱ֦ + +2. **Сڵ()** + - ¦ֵ + - ʱ֦ + +### Ż +1. **ֲ**Χ2Χڵλ +2. **ԳƼ֦**ظԳλ +3. **ȿ**Ĭ3㣬ͨ + +## в + +### ȼ +1. ֹв + - () + - (赲) + - ˫(赲) + +2. ߼в + - + - + - + +## Ż + +1. ****ظλŻ +2. **ֹ**ֱʤ/ذ +3. ****߼ֵ + +## ͳ + +### ʤ +- ֱγ +- ȽǷ + +### ط +- ҵĻ/ +- ǿڹؼ + +### ƽ +- صȨƽ +- ݾƶ̬ \ No newline at end of file diff --git a/课上代码练习/五子棋/README.md b/课上代码练习/五子棋/README.md new file mode 100644 index 0000000..5463396 --- /dev/null +++ b/课上代码练习/五子棋/README.md @@ -0,0 +1,384 @@ +# 五子棋人机对战AI项目 + +## 项目简介 +这是一个基于C语言实现的高级五子棋人机对战系统,采用α-β剪枝的极小极大算法实现AI决策,支持自定义棋盘大小和完整的游戏复盘功能。 + +## 核心功能 +- 支持5x5到25x25的棋盘尺寸 +- 玩家(X)与AI(○)对战模式 +- AI采用α-β剪枝优化的极小极大算法 +- 详细的棋型评估系统(活四、冲四、活三等) +- 完整的游戏复盘功能 +- 清晰的棋盘界面显示 + +## 技术特点 +1. **AI算法**: + - 使用α-β剪枝优化的极小极大算法 + - 搜索深度可调(当前设置为3层) + - 优先处理威胁位置(如阻止玩家形成活四) + +2. **评估系统**: + - 考虑四个方向的棋型评估 + - 区分活棋、眠棋和死棋 + - 位置奖励(中心位置价值更高) + +3. **游戏流程**: + - 完整的胜负判定 + - 平局检测 + - 详细的复盘系统 + +## 编译运行 +1. 编译程序: + ```bash + gcc "C语言代码/课上代码练习/五子棋/五子棋 copy 3.c" -o gomoku -lm + ``` + +2. 运行游戏: + ```bash + ./gomoku + ``` + +## 使用说明 +1. 启动后输入棋盘尺寸(5-25,默认15) +2. 游戏进行: + - 玩家输入坐标格式:行 列(如"8 8") + - AI会自动计算最佳落子位置 +3. 游戏结束: + - 显示胜负结果 + - 可选择查看完整复盘 + +## 核心函数说明 + +### 1. ai_move() - AI决策函数 +**功能**:决定AI的最佳落子位置 +**算法**: +1. 优先检查是否需要阻止玩家形成活四/冲四 +2. 使用α-β剪枝优化的极小极大算法搜索最佳位置 +3. 考虑已有棋子附近2格范围内的位置 + +**参数**:无 +**返回值**:无(直接修改棋盘状态) + +### 2. evaluate_pos() - 棋型评估函数 +**功能**:评估特定位置对当前玩家的价值 +**评分标准**: +- 活四: 100000分 +- 冲四: 10000分 +- 活三: 5000分 +- 眠三: 1000分 +- 活二: 500分 +- 眠二: 100分 +- +**参数**: +- x,y: 待评估位置坐标 +- player: 当前玩家标识 +**返回值**:评估分数(越高越好) + +### 3. dfs() - 深度优先搜索 +**功能**:实现带α-β剪枝的极小极大算法 +**特点**: +- 搜索深度:3层 +- 使用α-β剪枝优化搜索效率 +- 评估函数差值作为叶节点值 +**参数**: +- x,y: 当前落子位置 +- player: 当前玩家 +- depth: 剩余搜索深度 +- alpha,beta: 剪枝参数 +- is_maximizing: 是否最大化玩家 + +### 4. count_specific_direction() - 方向分析 +**功能**:计算特定方向上的连续棋子情况 +**返回结构**: +- continuous_chess: 连续棋子数 +- check_start/check_end: 两端是否开放 +**应用**:用于判断棋型(活棋/眠棋) + +### 5. check_win() - 胜负判断 +**功能**:检查落子后是否形成五连珠 +**逻辑**:检查四个方向是否存在≥5的连续同色棋子 + +## 程序流程图 + +``` +开始 +│ +├─> 初始化棋盘 +│ │ +│ └─> 设置默认大小(15x15) +│ +├─> 游戏主循环 +│ │ +│ ├─> [玩家回合] +│ │ ├─> 显示棋盘 +│ │ ├─> 获取玩家输入坐标 +│ │ └─> 落子并检查胜负 +│ │ +│ ├─> [AI回合] +│ │ ├─> AI计算最佳落子(α-β剪枝) +│ │ └─> 落子并检查胜负 +│ │ +│ └─> 检查平局条件 +│ +├─> 游戏结束处理 +│ ├─> 显示胜负结果 +│ └─> 询问是否复盘 +│ ├─> 是: 显示完整复盘 +│ └─> 否: 退出游戏 +│ +└─> 程序结束 +``` + +## 关键代码实现 + +### 1. AI决策核心算法 +```c +// α-β剪枝极小极大算法实现 +int dfs(int x, int y, int player, int depth, int alpha, int beta, int is_maximizing) +{ + if (depth == 0 || check_win(x, y)) + { + return evaluate_pos(x, y, player) - evaluate_pos(x, y, 3 - player); + } + + if (is_maximizing) + { + int max_eval = INT_MIN; + for (每个可能位置) + { + int eval = dfs(x, y, player, depth-1, alpha, beta, 0); + max_eval = max(max_eval, eval); + alpha = max(alpha, eval); + // α剪枝 + if (beta <= alpha) + { + break; + } + } + return max_eval; + } + else + { + int min_eval = INT_MAX; + for (每个可能位置) + { + int eval = dfs(x, y, player, depth-1, alpha, beta, 1); + min_eval = min(min_eval, eval); + beta = min(beta, eval); + // β剪枝 + if (beta <= alpha) + { + break; + } + } + return min_eval; + } +} +``` + +### 2. 棋型评估函数 +```c +// 评估特定位置的棋型价值 +int evaluate_pos(int x, int y, int player) +{ + int score = 0; + for (四个方向) + { + ChessPattern pattern =count_specific_direction(x, y, dir); + + if (pattern.continuous_chess >= 5) + { + return 1000000; // 五连珠 + } + + // 活棋 + if (pattern.check_start && pattern.check_end) + { + if (pattern.continuous_chess == 4) + score += 100000; // 活四 + else if (pattern.continuous_chess == 3) + score += 5000; // 活三 + else if (pattern.continuous_chess == 2) + score += 500; // 活二 + } + // 眠棋 + else if (pattern.check_start || pattern.check_end) + { + if (pattern.continuous_chess == 4) + score += 10000; // 冲四 + else if (pattern.continuous_chess == 3) + score += 1000; // 眠三 + else if (pattern.continuous_chess == 2) + score += 100; // 眠二 + } + } + return score; +} +``` + +### 3. 胜负判断逻辑 +```c +// 检查是否形成五连珠 +int check_win(int x, int y) +{ + for (四个方向) + { + int count = 1; + // 正向检查 + for (int i = 1; i < 5; i++) + { + if (棋盘边界检查 || 棋子不连续) + { + break; + } + count++; + } + // 反向检查 + for (int i = 1; i < 5; i++) + { + if (棋盘边界检查 || 棋子不连续) + { + break; + } + count++; + } + // 五连珠 + if (count >= 5) + { + return 1; + } + } + return 0; +} +``` + +## 项目结构 +- `五子棋 copy 3.c` - 主程序文件(当前使用版本) +- 其他`五子棋 copy*.c`文件为开发过程中的不同版本 + +## 注意事项 +1. 编译时需要链接数学库(-lm) +2. 确保输入坐标在棋盘范围内 +3. AI思考时间随棋盘大小和搜索深度增加 + +## 详细技术实现说明 + +### 1. 主函数(main)执行流程 +1. **初始化阶段**: + - 提示用户输入棋盘尺寸(5-25),默认15x15 + - 初始化棋盘状态(全空) + - 打印初始空棋盘 + +2. **游戏主循环**: + - **玩家回合**: + * 提示玩家输入坐标(行列格式) + * 验证坐标有效性(是否在棋盘范围内且为空位) + * 在棋盘放置玩家棋子(X) + * 检查是否形成五连珠(玩家胜利) + - **AI回合**: + * 调用ai_move()计算最佳落子位置 + * 在棋盘放置AI棋子(○) + * 检查是否形成五连珠(AI胜利) + - **平局检查**: + * 当棋盘已满且无胜负时判定平局 + +3. **游戏结束处理**: + - 显示最终胜负结果 + - 提供复盘功能(逐步展示整个对局过程) + +### 2. AI决策系统(ai_move) +**防御策略**: +1. 优先检查玩家可能形成的威胁棋型: + - 活四(必须立即阻挡) + - 冲四(一端被堵的四连珠) + - 活三(两端开放的三连珠) + +**进攻策略**: +1. 使用α-β剪枝优化的极小极大算法: + - 搜索深度:3层 + - 评估函数:evaluate_pos()差值 + - 剪枝条件:alpha ≥ beta时终止搜索 + +2. 搜索优化: + - 仅考虑已有棋子周围2格范围内的空位 + - 中心位置奖励(棋盘中心区域价值更高) + - 对称位置剪枝(减少重复计算) + +### 3. 棋型评估系统(evaluate_pos) +**评分标准详细说明**: +1. **活棋(两端开放)**: + - 活四:100000分(必胜) + - 活三:5000分(高威胁) + - 活二:500分(潜在威胁) + +2. **眠棋(一端开放)**: + - 冲四:10000分(次高威胁) + - 眠三:1000分(中等威胁) + - 眠二:100分(低威胁) + +3. **死棋(两端封闭)**: + - 无威胁价值,仅基础分 + +4. **位置奖励**: + - 中心区域:额外加分(50*(BOARD_SIZE-距离)) + - 边角区域:基础分 + +**评估过程**: +1. 四个方向(水平、垂直、对角线)分别评估 +2. 综合最高分方向和所有方向加权分 +3. 考虑当前玩家和对手的分数差值 + +### 4. 胜负判断(check_win) +**实现细节**: +1. 四个方向检查: + - 水平(→) + - 垂直(↓) + - 主对角线(↘) + - 副对角线(↙) + +2. 检查逻辑: + - 从当前位置向两个方向延伸 + - 统计连续同色棋子数 + - 任一方向≥5即判定胜利 + +3. 优化措施: + - 边界检查避免数组越界 + - 提前终止(发现5连立即返回) + +### 5. 复盘系统(review_process) +**实现机制**: +1. 数据结构: + - 使用steps数组记录每一步落子 + - 包含玩家类型、坐标信息 + +2. 回放过程: + - 逐步重建棋盘状态 + - 显示每一步的落子位置 + - 支持暂停/继续控制 + +3. 可视化: + - 清晰的棋盘显示 + - 回合计数和玩家标识 + - 坐标转换(0-base转1-base) + +### 6. 方向分析(count_specific_direction) +**算法细节**: +1. 输入参数: + - 起始坐标(x,y) + - 方向向量(dx,dy) + - 玩家标识 + +2. 分析过程: + - 正向延伸(统计连续棋子) + - 反向延伸(统计连续棋子) + - 检查两端开放状态 + +3. 输出结构: + - 连续棋子数 + - 起点开放状态 + - 终点开放状态 + +**应用场景**: +1. 胜负判断 +2. 棋型评估 +3. 威胁检测 \ No newline at end of file diff --git a/课上代码练习/五子棋/五子棋 copy 2.c b/课上代码练习/五子棋/五子棋 copy 2.c new file mode 100644 index 0000000..97d72f0 --- /dev/null +++ b/课上代码练习/五子棋/五子棋 copy 2.c @@ -0,0 +1,489 @@ +#include +#include +#include +#include +#include + +// !궨 +#define MAX_BOARD_SIZE 25 //* ֧̳ߴ +int BOARD_SIZE = 15; //* ʵʹõ̳ߴ(Ĭ15) +#define PLAYER 1 //* ӱʶ +#define AI 2 //* AIӱʶ +#define EMPTY 0 //* λñʶ +#define MAX_STEPS (MAX_BOARD_SIZE * MAX_BOARD_SIZE) //* ܸ + +// !ȫֱ +int board[MAX_BOARD_SIZE][MAX_BOARD_SIZE] = {0}; //* ״̬洢(ĬȫΪ0) +const int direction[4][2] = {{1, 0}, {0, 1}, {1, 1}, {1, -1}}; //* ĸ¡ҡ¡ + +// !Ӳṹ +typedef struct // ӽṹ +{ + int player; // ӷʶ + int x, y; // λ +} Step; + +Step steps[MAX_STEPS]; // 洢Ӳ + +// !Ϣṹ +typedef struct +{ + int continuous_chess; // + bool check_start; // 㷽Ƿ񿪷ţλ + bool check_end; // յ㷽Ƿ񿪷ţλ +} DirInfo; + +int step_count = 0; // ǰ + +// !ʼ̣״̬Ͳ¼ +void empty_board(); + +// !ӡǰ״̬ +void print_board(); + +// !λǷЧ̷ΧΪλ +bool have_space(int x, int y); + +// !Ӳ +bool player_move(int x, int y); + +// !ضͬɫ +DirInfo count_specific_direction(int x, int y, int dx, int dy, int player); + +// !ضλӺǷʤ +bool check_win(int x, int y, int player); + +// !ضλöԵǰҵļֵ +int evaluate_pos(int x, int y, int player); + +// !AI㷨 +void ai_move(); + +// !Ϸ +void review_process(); + +// !Ϸ̿ +int main() +{ + // ʼ׶Σȡ̳ߴ + printf("===== ˻ս =====\n"); + printf("̴ͨСΪ(13X13)׼(15X15)(19X19)\n"); + printf("̴С(5~%d)(ĬΪ׼):", MAX_BOARD_SIZE); + scanf("%d", &BOARD_SIZE); + if (BOARD_SIZE < 5 || BOARD_SIZE > MAX_BOARD_SIZE) + { + BOARD_SIZE = 15; + printf("ЧʹĬϱ׼15X15\n"); + } + + empty_board(); + printf("===== ˻ս(%dX%d) =====", BOARD_SIZE, BOARD_SIZE); + print_board(); + + // Ϸѭ + while (1) + { + // һغ + int x, y; + printf("\n( У1~%d):", BOARD_SIZE); + scanf("%d %d", &x, &y); + // תΪ0-BOARD_SIZE(תΪ̵) + x--; + y--; + + // ִ֤ƶ + if (!player_move(x, y)) + { + printf("Ч롣\n"); + continue; + } + print_board(); + + // Ƿʤ + if (check_win(x, y, PLAYER)) + { + printf("\nһʤ\n"); + review_process(); + break; + } + + // AIغ + printf("\nAI˼...\n"); + ai_move(); + print_board(); + + // AIǷʤ + Step last_step = steps[step_count - 1]; + if (check_win(last_step.x, last_step.y, AI)) + { + printf("\nAIʤ\n"); + review_process(); + break; + } + + // ƽ֣ + if (step_count == BOARD_SIZE * BOARD_SIZE) + { + printf("\nƽ֣\n"); + review_process(); + break; + } + } + + return 0; +} + +// !ʼ̣״̬Ͳ¼ +void empty_board() +{ + // ʼ״̬ + for (int i = 0; i < BOARD_SIZE; i++) + { + for (int j = 0; j < BOARD_SIZE; j++) + { + board[i][j] = EMPTY; + } + } + step_count = 0; +} + +// !ӡǰ״̬ +void print_board() +{ + // ӡкţ1-BOARD_SIZEʾ + printf("\n "); + for (int i = 0; i < BOARD_SIZE; i++) + { + printf("%2d", i + 1); + if (i + 1 == 9) // λкŵĶ + printf(" "); + } + printf("\n"); + + // ӡÿ + for (int i = 0; i < BOARD_SIZE; i++) + { + printf("%2d ", i + 1); // ӡкţ1-BOARD_SIZE + for (int j = 0; j < BOARD_SIZE; j++) + { + if (board[i][j] == PLAYER) + printf("x "); // + else if (board[i][j] == AI) + printf(" "); // AI + else + printf(" "); // λ + } + printf("\n"); + } +} + +// !λǷЧ̷ΧΪλ +bool have_space(int x, int y) +{ + return (x >= 0 && x < BOARD_SIZE && y >= 0 && y < BOARD_SIZE && board[x][y] == EMPTY); +} + +// !Ӳ +bool player_move(int x, int y) +{ + if (!have_space(x, y)) + { + return false; // λЧʧ + } + + board[x][y] = PLAYER; // ״̬ + steps[step_count++] = (Step){PLAYER, x, y}; // ¼ + return true; +} + +// !ضͬɫ +DirInfo count_specific_direction(int x, int y, int dx, int dy, int player) +{ + DirInfo info; + info.continuous_chess = 1; // ǰλ + info.check_start = false; + info.check_end = false; + + // dx, dy + int nx = x + dx, ny = y + dy; + while (nx >= 0 && nx < BOARD_SIZE && ny >= 0 && ny < BOARD_SIZE && board[nx][ny] == player) + { + info.continuous_chess++; + nx += dx; + ny += dy; + } + // ж˵Ƿ񿪷 + if (nx >= 0 && nx < BOARD_SIZE && ny >= 0 && ny < BOARD_SIZE) + { + if (board[nx][ny] == EMPTY) + { + info.check_end = true; + } + } + + // 鷴-dx, -dy + nx = x - dx, ny = y - dy; + while (nx >= 0 && nx < BOARD_SIZE && ny >= 0 && ny < BOARD_SIZE && board[nx][ny] == player) + { + info.continuous_chess++; + nx -= dx; + ny -= dy; + } + // жϷ˵Ƿ񿪷 + if (nx >= 0 && nx < BOARD_SIZE && ny >= 0 && ny < BOARD_SIZE) + { + if (board[nx][ny] == EMPTY) + { + info.check_start = true; + } + } + + return info; +} + +// !ضλӺǷʤ +bool check_win(int x, int y, int player) +{ + for (int i = 0; i < 4; i++) + { + DirInfo info = count_specific_direction(x, y, direction[i][0], direction[i][1], player); + if (info.continuous_chess >= 5) + return true; + } + return false; +} + +// !ضλöԵǰҵļֵ(AIһλõļֵ) +int evaluate_pos(int x, int y, int player) +{ + // ʱģӣȷ׼ȷ + int original = board[x][y]; + board[x][y] = player; + + int total_score = 0; // ܷ + int line_scores[4] = {0}; // ¼ĸķ + + // ĸ + for (int i = 0; i < 4; i++) + { + int dx = direction[i][0], dy = direction[i][1]; + + // ȡǰҵϢ + DirInfo info = count_specific_direction(x, y, dx, dy, player); + + // Ƿֱγ + if (info.continuous_chess >= 5) + { + board[x][y] = original; // ָ + return 1000000; // ֱӷ߷ + } + + // ͬ͵ļֵ + switch (info.continuous_chess) + { + // + case 4: + // ģ˿ţ + if (info.check_start && info.check_end) + { + line_scores[i] = 100000; // ʤ + } + // ģһ˿ţ + else if (info.check_start || info.check_end) + { + line_scores[i] = 10000; // + } + // ģ˷գ + else + { + line_scores[i] = 500; // ͼֵ + } + break; + + // + case 3: + // ˿ţ + if (info.check_start && info.check_end) + { + line_scores[i] = 5000; // ߼ֵ + } + // һ˿ţ + else if (info.check_start || info.check_end) + { + line_scores[i] = 1000; // еȼֵ + } + // ˷գ + else + { + line_scores[i] = 50; // ͼֵ + } + break; + + // + case 2: + // ˿ţ + if (info.check_start && info.check_end) + { + line_scores[i] = 500; // չDZ + } + // ߶һ˿ţ + else if (info.check_start || info.check_end) + { + line_scores[i] = 100; // DZ + } + // ˷գ + else + { + line_scores[i] = 10; // ޼ֵ + } + break; + + // + case 1: + // ӵ˿ + if (info.check_start && info.check_end) + { + line_scores[i] = 50; // δDZ + } + // ӵһ˿ + else if (info.check_start || info.check_end) + { + line_scores[i] = 10; // DZ + } + // + else + { + line_scores[i] = 1; // ޼ֵ + } + break; + + // ϣѴ + default: + break; + } + } + + // ܷ֣ȡ߷+ּȨ + int max_score = 0; + int sum_score = 0; + + for (int i = 0; i < 4; i++) + { + if (line_scores[i] > max_score) + { + max_score = line_scores[i]; + } + sum_score += line_scores[i]; + } + + // ȨظߣȨص + total_score = max_score * 10 + sum_score; + + board[x][y] = original; // ָ + + // λȨأλ>Եλ + int center_x = BOARD_SIZE / 2; + int center_y = BOARD_SIZE / 2; + int distance = abs(x - center_x) + abs(y - center_y); + int position_bonus = 50 * (BOARD_SIZE - distance); + + return total_score + position_bonus; +} + +// !AI㷨 +void ai_move() +{ + int best_score = -1, best_x = -1, best_y = -1; + + // + for (int i = 0; i < BOARD_SIZE; i++) + { + for (int j = 0; j < BOARD_SIZE; j++) + { + // λ + if (board[i][j] != EMPTY) + { + continue; + } + + // ۺλöAIĽֵͷֵ + int score = evaluate_pos(i, j, AI) + evaluate_pos(i, j, PLAYER) * 0.5; + + // λ + if (score > best_score) + { + best_score = score; + best_x = i; + best_y = j; + } + } + } + + // λ + if (best_x != -1 && best_y != -1) + { + board[best_x][best_y] = AI; + steps[step_count++] = (Step){AI, best_x, best_y}; + printf("AI(%d, %d)\n", best_x + 1, best_y + 1); + } +} + +// !Ϸ +void review_process() +{ + printf("\n===== ̼¼(ܲ%d) =====\n", step_count); + int c; + while ((c = getchar()) != '\n' && c != EOF) + ;// ջ + + // ؽʱ + int temp_board[MAX_BOARD_SIZE][MAX_BOARD_SIZE]; + memset(temp_board, EMPTY, sizeof(temp_board)); + + for (int i = 0; i < step_count; i++) + { + Step s = steps[i]; + // ȡ + temp_board[s.x][s.y] = s.player; + + printf("\n===== ˻ս(%dX%d) =====", BOARD_SIZE, BOARD_SIZE); + printf("\n %d/%d: %s (%d, %d)\n", + i + 1, step_count, + (s.player == PLAYER) ? "" : "AI", //* s.player == PLAYER, ӡҡ,֮ӡAI + s.x + 1, s.y + 1); // ʾΪ(,) + printf("===== ˻ս(%dX%d) =====\n", BOARD_SIZE, BOARD_SIZE); + + // ӡǰ״̬ + printf(" "); + for (int col = 0; col < BOARD_SIZE; col++) + { + printf("%2d", col + 1); + } + printf("\n"); + + for (int row = 0; row < BOARD_SIZE; row++) + { + printf("%2d ", row + 1); + for (int col = 0; col < BOARD_SIZE; col++) + { + if (temp_board[row][col] == PLAYER) + printf("x "); + else if (temp_board[row][col] == AI) + printf(" "); + else + printf(" "); + } + printf("\n"); + } + + if (i < step_count - 1) + { + printf("\nEnterһ..."); + while (getchar() != '\n') + ; + } + } + printf("\n̽Enter..."); + + getchar(); +} \ No newline at end of file diff --git a/课上代码练习/五子棋/五子棋 copy 3.c b/课上代码练习/五子棋/五子棋 copy 3.c new file mode 100644 index 0000000..9b1fdf8 --- /dev/null +++ b/课上代码练习/五子棋/五子棋 copy 3.c @@ -0,0 +1,595 @@ +#include +#include +#include +#include +#include + +/** + * @brief ָƵpowershell + * gcc "ϴϰ\\ copy 3.c" -o output/ copy 3.exe + * @brief ָƵpowershell + * .\output\ copy 3.exe + */ + +// !궨 +#define MAX_BOARD_SIZE 25 //* ֧̳ߴ(5x525x25) +int BOARD_SIZE = 15; //* ʵʹõ̳ߴ(Ĭ15) +#define PLAYER 1 //* ӱʶ +#define AI 2 //* AIӱʶ +#define EMPTY 0 //* λñʶ +#define MAX_STEPS (MAX_BOARD_SIZE * MAX_BOARD_SIZE) //* ܸ + +// !ȫֱ +int board[MAX_BOARD_SIZE][MAX_BOARD_SIZE] = {0}; //* ״̬洢(ĬȫΪ0) +int AI_DEPTH = 3; //* AI˼(Ĭ3) +const int direction[4][2] = {{1, 0}, {0, 1}, {1, 1}, {1, -1}}; //* ĸ¡ҡ¡ + +// !Ӳṹ +typedef struct // ӽṹ +{ + int player; // ӷʶ + int x, y; // λ +} Step; + +// !Ϣṹ +typedef struct +{ + int continuous_chess; // + bool check_start; // 㷽Ƿ񿪷ţλ + bool check_end; // յ㷽Ƿ񿪷ţλ +} DirInfo; + +Step steps[MAX_STEPS]; // 洢Ӳ +int step_count = 0; // ǰ + +// !ʼ̣״̬Ͳ¼ +void empty_board(); + +// !ӡǰ״̬ +void print_board(); + +// !λǷЧ̷ΧΪλ +bool have_space(int x, int y); + +// !Ӳ +bool player_move(int x, int y); + +// !ضͬɫ +DirInfo count_specific_direction(int x, int y, int dx, int dy, int player); + +// !ضλӺǷʤ +bool check_win(int x, int y, int player); + +// !ضλöԵǰҵļֵ +int evaluate_pos(int x, int y, int player); + +// !-¼֦(С㷨ʵ) +int dfs(int x, int y, int player, int depth, int alpha, int beta, bool is_maximizing); + +// !AI㷨 +void ai_move(int depth); + +// !Ϸ +void review_process(); + +// !Ϸ̿ +int main() +{ + // ʼ׶Σȡ̳ߴAIѶ + printf("===== ˻ս =====\n"); + printf("̴ͨСΪ(13X13)׼(15X15)(19X19)\n"); + printf("̴С(5~%d)(ĬΪ׼):", MAX_BOARD_SIZE); + scanf("%d", &BOARD_SIZE); + + // УǷϷϷʱʹĬֵ + if (BOARD_SIZE < 5 || BOARD_SIZE > MAX_BOARD_SIZE) + { + BOARD_SIZE = 15; + printf("ЧʹĬϱ׼15X15\n"); + } + + + printf("AI˼(1-5, ֵԽAIԽǿ˼ʱԽ, ĬΪ3):"); + scanf("%d", &AI_DEPTH); + + // УAIȷΧ + if (AI_DEPTH < 1 || AI_DEPTH > 5) + { + AI_DEPTH = 3; + printf("ЧʹĬ3\n"); + } + + empty_board(); // ʼ + printf("===== ˻ս(%dX%d, AI%d) =====", BOARD_SIZE, BOARD_SIZE, AI_DEPTH); + print_board(); // ӡʼ + + // Ϸѭ + while (1) + { + // һغ + int x, y; + printf("\n( У1~%d):", BOARD_SIZE); + scanf("%d %d", &x, &y); + // תû1-baseΪ0-base + x--; + y--; + + // ִ֤ƶ + if (!player_move(x, y)) // Чλô + { + printf("Ч롣\n"); + continue; // ѭͷ + } + print_board(); // ºӡ + + // Ƿʤ + if (check_win(x, y, PLAYER)) + { + printf("\nһʤ\n"); + review_process(); // չʾ + break; // ˳Ϸѭ + } + + // AIغ + printf("\nAI˼...\n"); + ai_move(AI_DEPTH); // AIλ + print_board(); // չʾAIӺ + + // AIǷʤͨһ + Step last_step = steps[step_count - 1]; // ȡһ + if (check_win(last_step.x, last_step.y, AI)) + { + printf("\nAIʤ\n"); + review_process(); // չʾ + break; // ˳Ϸѭ + } + + // ƽ֣ + if (step_count == BOARD_SIZE * BOARD_SIZE) + { + printf("\nƽ֣\n"); + review_process(); // չʾ + break; // ˳Ϸѭ + } + } + + return 0; +} + +// !ʼ̣״̬Ͳ¼ +void empty_board() +{ + // ʼ״̬Ϊȫ + for (int i = 0; i < BOARD_SIZE; i++) + { + for (int j = 0; j < BOARD_SIZE; j++) + { + board[i][j] = EMPTY; + } + } + step_count = 0; // ò +} + +// !ӡǰ״̬ +void print_board() +{ + // ӡкţ1-BOARD_SIZEʾ + printf("\n "); + for (int i = 0; i < BOARD_SIZE; i++) + { + printf("%2d", i + 1); + if (i + 1 == 9) // к910+Ķ + printf(" "); + } + printf("\n"); + + // дӡ + for (int i = 0; i < BOARD_SIZE; i++) + { + printf("%2d ", i + 1); // ӡкţ1-BOARD_SIZE + for (int j = 0; j < BOARD_SIZE; j++) + { + if (board[i][j] == PLAYER) + printf("x "); // + else if (board[i][j] == AI) + printf(" "); // AI(ʹáʾ) + else + printf(" "); // λ + } + printf("\n"); // ÿн + } +} + +// !λǷЧ̷ΧΪλ +bool have_space(int x, int y) +{ + // УǷڷΧҸλΪ + return (x >= 0 && x < BOARD_SIZE && y >= 0 && y < BOARD_SIZE && board[x][y] == EMPTY); +} + +// !Ӳ +bool player_move(int x, int y) +{ + // λЧ򷵻false + if (!have_space(x, y)) + return false; + + // ״̬ + board[x][y] = PLAYER; + // ¼Ӳ裺ұʶ + steps[step_count++] = (Step){PLAYER, x, y}; + return true; +} + +// !ضͬɫ +DirInfo count_specific_direction(int x, int y, int dx, int dy, int player) +{ + DirInfo info; + info.continuous_chess = 1; // ʼλѾһ + info.check_start = false; // 㷽Ƿ񿪷 + info.check_end = false; // յ㷽Ƿ񿪷 + + // dx, dy + int nx = x + dx, ny = y + dy; + while (nx >= 0 && nx < BOARD_SIZE && ny >= 0 && ny < BOARD_SIZE && board[nx][ny] == player) + { + info.continuous_chess++; // Ӽ + nx += dx; // صǰǰ + ny += dy; + } + // ж˵Ƿ񿪷ţλ + if (nx >= 0 && nx < BOARD_SIZE && ny >= 0 && ny < BOARD_SIZE) + if (board[nx][ny] == EMPTY) + info.check_end = true; + + // 鷴-dx, -dy + nx = x - dx, ny = y - dy; + while (nx >= 0 && nx < BOARD_SIZE && ny >= 0 && ny < BOARD_SIZE && board[nx][ny] == player) + { + info.continuous_chess++; // Ӽ + nx -= dx; // ෴ǰ + ny -= dy; + } + // жϷ˵Ƿ񿪷ţλ + if (nx >= 0 && nx < BOARD_SIZE && ny >= 0 && ny < BOARD_SIZE) + if (board[nx][ny] == EMPTY) + info.check_start = true; + + return info; +} + +// !ضλӺǷʤ +bool check_win(int x, int y, int player) +{ + // ĸǷ + for (int i = 0; i < 4; i++) + { + DirInfo info = count_specific_direction(x, y, direction[i][0], direction[i][1], player); + if (info.continuous_chess >= 5) // >=5ʤ + return true; + } + return false; // ĸû +} + +// !ضλöԵǰҵļֵ +int evaluate_pos(int x, int y, int player) +{ + // ԭʼֵڻԭ + int original = board[x][y]; + // ģڸλ + board[x][y] = player; + + int total_score = 0; // ܷ + int line_scores[4] = {0}; // ĸĵ÷ + + // ĸ + for (int i = 0; i < 4; i++) + { + int dx = direction[i][0], dy = direction[i][1]; + // ȡǰϵϢ + DirInfo info = count_specific_direction(x, y, dx, dy, player); + + // ֱγΪʤ + if (info.continuous_chess >= 5) + { + board[x][y] = original; // ԭ + return 1000000; // + } + + // + switch (info.continuous_chess) + { + case 4: // + if (info.check_start && info.check_end) // (˿) + line_scores[i] = 100000; + else if (info.check_start || info.check_end) // (һ˿) + line_scores[i] = 10000; + else // (˷) + line_scores[i] = 500; + break; + + case 3: // + if (info.check_start && info.check_end) // + line_scores[i] = 5000; + else if (info.check_start || info.check_end) // + line_scores[i] = 1000; + else // + line_scores[i] = 50; + break; + + case 2: // + if (info.check_start && info.check_end) // + line_scores[i] = 500; + else if (info.check_start || info.check_end) // ߶ + line_scores[i] = 100; + else // + line_scores[i] = 10; + break; + + case 1: // + if (info.check_start && info.check_end) // λ + line_scores[i] = 50; + else if (info.check_start || info.check_end) // 뿪λ + line_scores[i] = 10; + else // λ + line_scores[i] = 1; + break; + } + } + + // ܷ֣߷+ּȨ + int max_score = 0; + int sum_score = 0; + for (int i = 0; i < 4; i++) + { + if (line_scores[i] > max_score) + max_score = line_scores[i]; + sum_score += line_scores[i]; + } + total_score = max_score * 10 + sum_score; // Ȩظ + + // λýԽķԽ + int center_x = BOARD_SIZE / 2; + int center_y = BOARD_SIZE / 2; + int distance = abs(x - center_x) + abs(y - center_y); // پ + int position_bonus = 50 * (BOARD_SIZE - distance); // ԽԽ + + board[x][y] = original; // ԭ״̬ + return total_score + position_bonus; // +} + +// !-¼֦(С㷨ʵ) +int dfs(int x, int y, int player, int depth, int alpha, int beta, bool is_maximizing) +{ + // 鵱ǰǷʤ + if (check_win(x, y, player)) + { + return (player == AI) ? 1000000 + depth : -1000000 - depth; + } + + // ﵽȻƽ + if (depth == 0 || step_count >= BOARD_SIZE * BOARD_SIZE) + { + return evaluate_pos(x, y, AI) - evaluate_pos(x, y, PLAYER); + } + + int best_score = is_maximizing ? -1000000 : 1000000; + + // пλ + for (int i = 0; i < BOARD_SIZE; i++) + { + for (int j = 0; j < BOARD_SIZE; j++) + { + if (board[i][j] != EMPTY) + continue; + + // ģ⵱ǰ + board[i][j] = player; + step_count++; + + // ݹ(лҺ) + int current_score = dfs(i, j, (player == AI) ? PLAYER : AI, depth - 1, alpha, beta, !is_maximizing); + + // + board[i][j] = EMPTY; + step_count--; + + // ֵ(AI)߼ + if (is_maximizing) + { + best_score = (current_score > best_score) ? current_score : best_score; + alpha = (best_score > alpha) ? best_score : alpha; + // ֦ + if (beta <= alpha) + { + break; + } + } + // Сֵ()߼ + else + { + best_score = (current_score < best_score) ? current_score : best_score; + beta = (best_score < beta) ? best_score : beta; + // ¼֦ + if (beta <= alpha) + { + break; + } + } + } + if ((is_maximizing && best_score >= beta) || (!is_maximizing && best_score <= alpha)) + { + break; // ǰ˳ѭ + } + } + + return best_score; +} + +// !ʹô-¼֦DFSС㷨AI +void ai_move(int depth) +{ + // 1. ȼǷҪֹҵӻ + for (int i = 0; i < BOARD_SIZE; i++) + { + for (int j = 0; j < BOARD_SIZE; j++) + { + if (board[i][j] != EMPTY) + continue; + + // ģڴλ + board[i][j] = PLAYER; + bool need_block = false; + + // ĸ + for (int k = 0; k < 4; k++) + { + DirInfo info = count_specific_direction(i, j, direction[k][0], direction[k][1], PLAYER); + + // γһ˿ + if (info.continuous_chess >= 4 && (info.check_start || info.check_end)) + { + need_block = true; + break; + } + + // γӻ˿ + if (info.continuous_chess == 3 && info.check_start && info.check_end) + { + need_block = true; + break; + } + } + + board[i][j] = EMPTY; // ָ + + if (need_block) + { + // ڴλֹ + board[i][j] = AI; + steps[step_count++] = (Step){AI, i, j}; + printf("AI(%d, %d)\n", i + 1, j + 1); + return; + } + } + } + + // 2. ûҪֹ + int best_score = -1000000; + int best_x = -1, best_y = -1; + + // пλ + for (int i = 0; i < BOARD_SIZE; i++) + { + for (int j = 0; j < BOARD_SIZE; j++) + { + if (board[i][j] != EMPTY) + continue; + + // ֻӸ(2Χ) + bool has_nearby_stone = false; + for (int di = -2; di <= 2; di++) + { + for (int dj = -2; dj <= 2; dj++) + { + int ni = i + di; + int nj = j + dj; + if (ni >= 0 && ni < BOARD_SIZE && + nj >= 0 && nj < BOARD_SIZE) + { + if (board[ni][nj] != EMPTY) + { + has_nearby_stone = true; + break; + } + } + } + if (has_nearby_stone) + break; + } + if (!has_nearby_stone && step_count > 10) + continue; + + // ģAI + board[i][j] = AI; + int current_score = dfs(i, j, PLAYER, depth, -1000000, 1000000, false); + board[i][j] = EMPTY; + + // λ + if (current_score > best_score) + { + best_score = current_score; + best_x = i; + best_y = j; + } + } + } + + // ִ + if (best_x != -1 && best_y != -1) + { + board[best_x][best_y] = AI; + steps[step_count++] = (Step){AI, best_x, best_y}; + printf("AI(%d, %d)\n", best_x + 1, best_y + 1); + } +} + +// !Ϸ +void review_process() +{ + printf("\n===== ̼¼(ܲ%d) =====\n", step_count); + // 뻺 + int c; + while ((c = getchar()) != '\n' && c != EOF) + ; + + // ʱ + int temp_board[MAX_BOARD_SIZE][MAX_BOARD_SIZE]; + memset(temp_board, EMPTY, sizeof(temp_board)); // ʼΪ + + // Ϸ + for (int i = 0; i < step_count; i++) + { + Step s = steps[i]; // ȡǰ + temp_board[s.x][s.y] = s.player; // ʱ + + // ӡǰϢ + printf("\n===== ˻ս(%dX%d) =====", BOARD_SIZE, BOARD_SIZE); + printf("\n %d/%d: %s (%d, %d)\n", + i + 1, step_count, + (s.player == PLAYER) ? "" : "AI", // Ŀѡʾı + s.x + 1, s.y + 1); // ʾ1-base + + // ӡǰ + printf(" "); + for (int col = 0; col < BOARD_SIZE; col++) + printf("%2d", col + 1); // к + printf("\n"); + + for (int row = 0; row < BOARD_SIZE; row++) + { + printf("%2d ", row + 1); // к + for (int col = 0; col < BOARD_SIZE; col++) + { + if (temp_board[row][col] == PLAYER) + printf("x "); + else if (temp_board[row][col] == AI) + printf(" "); + else + printf(" "); + } + printf("\n"); // н + } + + // һȴû + if (i < step_count - 1) + { + printf("\nEnterһ..."); + while (getchar() != '\n') + ; // ȴس + } + } + printf("\n̽Enter..."); + + getchar(); // ȴû +} \ No newline at end of file diff --git a/课上代码练习/五子棋/五子棋 copy.c b/课上代码练习/五子棋/五子棋 copy.c new file mode 100644 index 0000000..ff6c5cb --- /dev/null +++ b/课上代码练习/五子棋/五子棋 copy.c @@ -0,0 +1,473 @@ +#include +#include +#include +#include +#include + +// !궨 +#define MAX_BOARD_SIZE 25 //* ֧̳ߴ +int BOARD_SIZE = 15; //* ʵʹõ̳ߴ(Ĭ15) +#define PLAYER 1 //* ӱʶ +#define AI 2 //* AIӱʶ +#define EMPTY 0 //* λñʶ +#define MAX_STEPS (MAX_BOARD_SIZE * MAX_BOARD_SIZE) //* ܸ + +// !ȫֱ +int board[MAX_BOARD_SIZE][MAX_BOARD_SIZE] = {0}; //* ״̬洢(ĬȫΪ0) +const int direction[4][2] = {{1, 0}, {0, 1}, {1, 1}, {1, -1}}; //* ĸ¡ҡ¡ + +// !Ӳṹ +typedef struct // ӽṹ +{ + int player; // ӷʶ + int x, y; // λ +} Step; + +// !Ϣṹ +typedef struct +{ + int continuous_chess; // + bool check_start; // 㷽Ƿ񿪷ţλ + bool check_end; // յ㷽Ƿ񿪷ţλ +} DirInfo; + +Step steps[MAX_STEPS]; // 洢Ӳ + +int step_count = 0; // ǰ + +// ! +void empty_board(); +void print_board(); +bool have_space(int x, int y); +bool player_move(int x, int y); +DirInfo count_specific_direction(int x, int y, int dx, int dy, int player); +bool check_win(int x, int y, int player); +int evaluate_pos(int x, int y, int player); +void ai_move(); +void review_process(); + +// !Ϸ̿ +int main() +{ + // ʼ׶Σȡ̳ߴ + printf("===== ˻ս =====\n"); + printf("̴ͨСΪ(13X13)׼(15X15)(19X19)\n"); + printf("̴С(5~%d)(ĬΪ׼):", MAX_BOARD_SIZE); + scanf("%d", &BOARD_SIZE); + if (BOARD_SIZE < 5 || BOARD_SIZE > MAX_BOARD_SIZE) + { + BOARD_SIZE = 15; + printf("ЧʹĬϱ׼15X15\n"); + } + + empty_board(); + printf("===== ˻ս(%dX%d) =====", BOARD_SIZE, BOARD_SIZE); + print_board(); + + // Ϸѭ + while (1) + { + // һغ + int x, y; + printf("\n( У1~%d):", BOARD_SIZE); + scanf("%d %d", &x, &y); + // תΪ0-BOARD_SIZE(תΪ̵) + x--; + y--; + + // ִ֤ƶ + if (!player_move(x, y)) + { + printf("Ч롣\n"); + continue; + } + print_board(); + + // Ƿʤ + if (check_win(x, y, PLAYER)) + { + printf("\nһʤ\n"); + review_process(); + break; + } + + // AIغ + printf("\nAI˼...\n"); + ai_move(); + print_board(); + + // AIǷʤ + Step last_step = steps[step_count - 1]; + if (check_win(last_step.x, last_step.y, AI)) + { + printf("\nAIʤ\n"); + review_process(); + break; + } + + // ƽ֣ + if (step_count == BOARD_SIZE * BOARD_SIZE) + { + printf("\nƽ֣\n"); + review_process(); + break; + } + } + + return 0; +} + +// !ʼ̣״̬Ͳ¼ +void empty_board() +{ + // ʼ״̬ + for (int i = 0; i < BOARD_SIZE; i++) + { + for (int j = 0; j < BOARD_SIZE; j++) + { + board[i][j] = EMPTY; + } + } + step_count = 0; +} + +// !ӡǰ״̬ +void print_board() +{ + // ӡкţ1-BOARD_SIZEʾ + printf("\n "); + for (int i = 0; i < BOARD_SIZE; i++) + { + printf("%2d", i + 1); + if (i + 1 == 9) // λкŵĶ + printf(" "); + } + printf("\n"); + + // ӡÿ + for (int i = 0; i < BOARD_SIZE; i++) + { + printf("%2d ", i + 1); // ӡкţ1-BOARD_SIZE + for (int j = 0; j < BOARD_SIZE; j++) + { + if (board[i][j] == PLAYER) + printf("x "); // + else if (board[i][j] == AI) + printf(" "); // AI + else + printf(" "); // λ + } + printf("\n"); + } +} + +// !λǷЧ̷ΧΪλ +bool have_space(int x, int y) +{ + return (x >= 0 && x < BOARD_SIZE && y >= 0 && y < BOARD_SIZE && board[x][y] == EMPTY); +} + +// !Ӳ +bool player_move(int x, int y) +{ + if (!have_space(x, y)) + { + return false; // λЧʧ + } + + board[x][y] = PLAYER; // ״̬ + steps[step_count++] = (Step){PLAYER, x, y}; // ¼ + return true; +} + +// !ضͬɫ +DirInfo count_specific_direction(int x, int y, int dx, int dy, int player) +{ + DirInfo info; + info.continuous_chess = 1; // ǰλ + info.check_start = false; + info.check_end = false; + + // dx, dy + int nx = x + dx, ny = y + dy; + while (nx >= 0 && nx < BOARD_SIZE && ny >= 0 && ny < BOARD_SIZE && board[nx][ny] == player) + { + info.continuous_chess++; + nx += dx; + ny += dy; + } + // ж˵Ƿ񿪷 + if (nx >= 0 && nx < BOARD_SIZE && ny >= 0 && ny < BOARD_SIZE) + { + if (board[nx][ny] == EMPTY) + { + info.check_end = true; + } + } + + // 鷴-dx, -dy + nx = x - dx, ny = y - dy; + while (nx >= 0 && nx < BOARD_SIZE && ny >= 0 && ny < BOARD_SIZE && board[nx][ny] == player) + { + info.continuous_chess++; + nx -= dx; + ny -= dy; + } + // жϷ˵Ƿ񿪷 + if (nx >= 0 && nx < BOARD_SIZE && ny >= 0 && ny < BOARD_SIZE) + { + if (board[nx][ny] == EMPTY) + { + info.check_start = true; + } + } + + return info; +} + +// !ضλӺǷʤ +bool check_win(int x, int y, int player) +{ + for (int i = 0; i < 4; i++) + { + DirInfo info = count_specific_direction(x, y, direction[i][0], direction[i][1], player); + if (info.continuous_chess >= 5) + return true; + } + return false; +} + +// !ضλöԵǰҵļֵ(AIһλõļֵ) +int evaluate_pos(int x, int y, int player) +{ + // ʱģӣȷ׼ȷ + int original = board[x][y]; + board[x][y] = player; + + int total_score = 0; // ܷ + int line_scores[4] = {0}; // ¼ĸķ + + // ĸ + for (int i = 0; i < 4; i++) + { + int dx = direction[i][0], dy = direction[i][1]; + + // ȡǰҵϢ + DirInfo info = count_specific_direction(x, y, dx, dy, player); + + // Ƿֱγ + if (info.continuous_chess >= 5) + { + board[x][y] = original; // ָ + return 1000000; // ֱӷ߷ + } + + // ͬ͵ļֵ + switch (info.continuous_chess) + { + // + case 4: + // ģ˿ţ + if (info.check_start && info.check_end) + { + line_scores[i] = 100000; // ʤ + } + // ģһ˿ţ + else if (info.check_start || info.check_end) + { + line_scores[i] = 10000; // + } + // ģ˷գ + else + { + line_scores[i] = 500; // ͼֵ + } + break; + + // + case 3: + // ˿ţ + if (info.check_start && info.check_end) + { + line_scores[i] = 5000; // ߼ֵ + } + // һ˿ţ + else if (info.check_start || info.check_end) + { + line_scores[i] = 1000; // еȼֵ + } + // ˷գ + else + { + line_scores[i] = 50; // ͼֵ + } + break; + + // + case 2: + // ˿ţ + if (info.check_start && info.check_end) + { + line_scores[i] = 500; // չDZ + } + // ߶һ˿ţ + else if (info.check_start || info.check_end) + { + line_scores[i] = 100; // DZ + } + // ˷գ + else + { + line_scores[i] = 10; // ޼ֵ + } + break; + + // + case 1: + // ӵ˿ + if (info.check_start && info.check_end) + { + line_scores[i] = 50; // δDZ + } + // ӵһ˿ + else if (info.check_start || info.check_end) + { + line_scores[i] = 10; // DZ + } + // + else + { + line_scores[i] = 1; // ޼ֵ + } + break; + + // ϣѴ + default: + break; + } + } + + // ܷ֣ȡ߷+ּȨ + int max_score = 0; + int sum_score = 0; + + for (int i = 0; i < 4; i++) + { + if (line_scores[i] > max_score) + { + max_score = line_scores[i]; + } + sum_score += line_scores[i]; + } + + // ȨظߣȨص + total_score = max_score * 10 + sum_score; + + board[x][y] = original; // ָ + + // λȨأλ>Եλ + int center_x = BOARD_SIZE / 2; + int center_y = BOARD_SIZE / 2; + int distance = abs(x - center_x) + abs(y - center_y); + int position_bonus = 50 * (BOARD_SIZE - distance); + + return total_score + position_bonus; +} + +// !AI㷨 +void ai_move() +{ + int best_score = -1, best_x = -1, best_y = -1; + + // + for (int i = 0; i < BOARD_SIZE; i++) + { + for (int j = 0; j < BOARD_SIZE; j++) + { + // λ + if (board[i][j] != EMPTY) + { + continue; + } + + // ۺλöAIĽֵͷֵ + int score = evaluate_pos(i, j, AI) + evaluate_pos(i, j, PLAYER) * 0.5; + + // λ + if (score > best_score) + { + best_score = score; + best_x = i; + best_y = j; + } + } + } + + // λ + if (best_x != -1 && best_y != -1) + { + board[best_x][best_y] = AI; + steps[step_count++] = (Step){AI, best_x, best_y}; + printf("AI(%d, %d)\n", best_x + 1, best_y + 1); + } +} + +// !Ϸ +void review_process() +{ + printf("\n===== ̼¼(ܲ%d) =====\n", step_count); + int c; + while ((c = getchar()) != '\n' && c != EOF) + ; // ջ + + // ؽʱ + int temp_board[MAX_BOARD_SIZE][MAX_BOARD_SIZE]; + memset(temp_board, EMPTY, sizeof(temp_board)); + + for (int i = 0; i < step_count; i++) + { + Step s = steps[i]; + // ȡ + temp_board[s.x][s.y] = s.player; + + printf("\n===== ˻ս(%dX%d) =====", BOARD_SIZE, BOARD_SIZE); + printf("\n %d/%d: %s (%d, %d)\n", + i + 1, step_count, + (s.player == PLAYER) ? "" : "AI", //* s.player == PLAYER, ӡҡ,֮ӡAI + s.x + 1, s.y + 1); // ʾΪ(,) + printf("===== ˻ս(%dX%d) =====\n", BOARD_SIZE, BOARD_SIZE); + + // ӡǰ״̬ + printf(" "); + for (int col = 0; col < BOARD_SIZE; col++) + { + printf("%2d", col + 1); + } + printf("\n"); + + for (int row = 0; row < BOARD_SIZE; row++) + { + printf("%2d ", row + 1); + for (int col = 0; col < BOARD_SIZE; col++) + { + if (temp_board[row][col] == PLAYER) + printf("x "); + else if (temp_board[row][col] == AI) + printf(" "); + else + printf(" "); + } + printf("\n"); + } + + if (i < step_count - 1) + { + printf("\nEnterһ..."); + while (getchar() != '\n') + ; + } + } + printf("\n̽Enter..."); + + getchar(); +} \ No newline at end of file diff --git a/课上代码练习/五子棋/五子棋.c b/课上代码练习/五子棋/五子棋.c new file mode 100644 index 0000000..3b07990 --- /dev/null +++ b/课上代码练习/五子棋/五子棋.c @@ -0,0 +1,429 @@ +#include +#include +#include +#include + +/** + * @brief ָƵpowershell + * gcc "ϴϰ\\.c" -o output/.exe + * @brief ָƵpowershell + * .\output\.exe + */ + +// !궨 +#define MAX_BOARD_SIZE 25 //* ֧̳ߴ +int BOARD_SIZE = 15; //* ʵʹõ̳ߴ(Ĭ15) +#define PLAYER 1 //* ӱʶ +#define AI 2 //* AIӱʶ +#define EMPTY 0 //* λñʶ +#define MAX_STEPS (MAX_BOARD_SIZE * MAX_BOARD_SIZE) //* ܸ + +// !ȫֱ +int board[MAX_BOARD_SIZE][MAX_BOARD_SIZE] = {0}; //* ״̬洢(ĬȫΪ0) +const int direction[4][2] = {{1, 0}, {0, 1}, {1, 1}, {1, -1}}; //* ĸ¡ҡ¡ + +// !Ӳṹ +typedef struct // ӽṹ +{ + int player; // ӷʶ + int x, y; // λ +} Step; + +// !Ϣṹ +typedef struct +{ + int continuous_chess; // + bool check_start; // 㷽Ƿ񿪷ţλ + bool check_end; // յ㷽Ƿ񿪷ţλ +} DirInfo; + +Step steps[MAX_STEPS]; // 洢Ӳ + +int step_count = 0; // ǰ + +// !ʼ̣״̬Ͳ¼ +void empty_board(); + +// !ӡǰ״̬ +void print_board(); + +// !λǷЧ̷ΧΪλ +bool have_space(int x, int y); + +// !Ӳ +bool player_move(int x, int y); + +// !ضͬɫ +DirInfo count_specific_direction(int x, int y, int dx, int dy, int player); + +// !ضλӺǷʤ +bool check_win(int x, int y, int player); + +// !ضλöԵǰҵļֵ +int evaluate_pos(int x, int y, int player); + +// !AI㷨 +void ai_move(); + +// !Ϸ +void review_process(); + +// !Ϸ̿ +int main() +{ + // ʼ׶Σȡ̳ߴ + printf("===== ˻ս =====\n"); + printf("̴ͨСΪ(13X13)׼(15X15)(19X19)\n"); + printf("̴С(5~%d)(ĬΪ׼):", MAX_BOARD_SIZE); + scanf("%d", &BOARD_SIZE); + if (BOARD_SIZE < 5 || BOARD_SIZE > MAX_BOARD_SIZE) + { + BOARD_SIZE = 15; + printf("ЧʹĬϱ׼15X15\n"); + } + + empty_board(); + printf("===== ˻ս(%dX%d) =====", BOARD_SIZE, BOARD_SIZE); + print_board(); + + // Ϸѭ + while (1) + { + // һغ + int x, y; + printf("\n( У1~%d):", BOARD_SIZE); + scanf("%d %d", &x, &y); + // תΪ0-BOARD_SIZE(תΪ̵) + x--; + y--; + + // ִ֤ƶ + if (!player_move(x, y)) + { + printf("Ч롣\n"); + continue; + } + print_board(); + + // Ƿʤ + if (check_win(x, y, PLAYER)) + { + printf("\nһʤ\n"); + review_process(); + break; + } + + // AIغ + printf("\nAI˼...\n"); + ai_move(); + print_board(); + + // AIǷʤ + Step last_step = steps[step_count - 1]; + if (check_win(last_step.x, last_step.y, AI)) + { + printf("\nAIʤ\n"); + review_process(); + break; + } + + // ƽ֣ + if (step_count == BOARD_SIZE * BOARD_SIZE) + { + printf("\nƽ֣\n"); + review_process(); + break; + } + } + + return 0; +} + +// !ʼ̣״̬Ͳ¼ +void empty_board() +{ + // ʼ״̬ + for (int i = 0; i < BOARD_SIZE; i++) + { + for (int j = 0; j < BOARD_SIZE; j++) + { + board[i][j] = EMPTY; + } + } + step_count = 0; +} + +// !ӡǰ״̬ +void print_board() +{ + // ӡкţ1-BOARD_SIZEʾ + printf("\n "); + for (int i = 0; i < BOARD_SIZE; i++) + { + printf("%2d", i + 1); + if (i + 1 == 9) // λкŵĶ + printf(" "); + } + printf("\n"); + + // ӡÿ + for (int i = 0; i < BOARD_SIZE; i++) + { + printf("%2d ", i + 1); // ӡкţ1-BOARD_SIZE + for (int j = 0; j < BOARD_SIZE; j++) + { + if (board[i][j] == PLAYER) + printf("x "); // + else if (board[i][j] == AI) + printf(" "); // AI + else + printf(" "); // λ + } + printf("\n"); + } +} + +// !λǷЧ̷ΧΪλ +bool have_space(int x, int y) +{ + /* λǷЧΪλ */ + return (x >= 0 && x < BOARD_SIZE && y >= 0 && y < BOARD_SIZE && board[x][y] == EMPTY); +} + +// !Ӳ +bool player_move(int x, int y) +{ + if (!have_space(x, y)) + { + return false; // λЧʧ + } + + board[x][y] = PLAYER; // ״̬ + steps[step_count++] = (Step){PLAYER, x, y}; // ¼ + return true; +} + +// !ضͬɫ +DirInfo count_specific_direction(int x, int y, int dx, int dy, int player) +{ + DirInfo info; + info.continuous_chess = 1; // ǰλ + info.check_start = false; + info.check_end = false; + + // dx, dy + int nx = x + dx, ny = y + dy; + while (nx >= 0 && nx < BOARD_SIZE && ny >= 0 && ny < BOARD_SIZE && board[nx][ny] == player) + { + info.continuous_chess++; + nx += dx; + ny += dy; + } + // ж˵Ƿ񿪷 + if (nx >= 0 && nx < BOARD_SIZE && ny >= 0 && ny < BOARD_SIZE) + { + if (board[nx][ny] == EMPTY) + { + info.check_end = true; + } + } + + // 鷴-dx, -dy + nx = x - dx, ny = y - dy; + while (nx >= 0 && nx < BOARD_SIZE && ny >= 0 && ny < BOARD_SIZE && board[nx][ny] == player) + { + info.continuous_chess++; + nx -= dx; + ny -= dy; + } + // жϷ˵Ƿ񿪷 + if (nx >= 0 && nx < BOARD_SIZE && ny >= 0 && ny < BOARD_SIZE) + { + if (board[nx][ny] == EMPTY) + { + info.check_start = true; + } + } + + return info; +} + +// !ضλӺǷʤ +bool check_win(int x, int y, int player) +{ + for (int i = 0; i < 4; i++) + { + DirInfo info = count_specific_direction(x, y, direction[i][0], direction[i][1], player); + if (info.continuous_chess >= 5) + return true; + } + return false; +} + +// !ضλöԵǰҵļֵ(AIһλõļֵ) +int evaluate_pos(int x, int y, int player) +{ + // ʱģӣȷ׼ȷ + int original = board[x][y]; + board[x][y] = player; + + int score = 0; + for (int i = 0; i < 4; i++) + { + int dx = direction[i][0], dy = direction[i][1]; + int opponent = (player == PLAYER) ? AI : PLAYER; + + // ȡǰңϢ + DirInfo self_info = count_specific_direction(x, y, dx, dy, player); + // ȡֵϢ + DirInfo oppo_info = count_specific_direction(x, y, dx, dy, opponent); + + // в߼ + if (oppo_info.continuous_chess >= 4) + { + board[x][y] = original; // ָ + return 10000; // ֹ + } + else if (oppo_info.continuous_chess == 3) + { + // + if (oppo_info.check_start && oppo_info.check_end) // ˿ŲŸв + { + score += 5000; // ˿ţв + } + else if (oppo_info.check_start || oppo_info.check_end) // ˷գӷ + { + score += 2000; // һ˿ţев + } + } + + // ߼ + if (self_info.continuous_chess >= 5) + { + board[x][y] = original; // ָ + return 20000; // ֱӻʤ + } + else if (self_info.continuous_chess == 4) + { + score += 8000; // ʤ + } + else if (self_info.continuous_chess == 3) + { + // AI + if (self_info.check_start && self_info.check_end) // ˿ŲŸ߼ֵ + { + score += 4000; // ˿ţ߼ֵ + } + else if (self_info.check_start || self_info.check_end) // ˷գӷ + { + score += 1500; // һ˿ţеȼֵ + } + } + else if (self_info.continuous_chess == 2) + { + score += 1000; // + } + } + + board[x][y] = original; // ָ + + return score; +} + +// !AI㷨 +void ai_move() +{ + int best_score = -1, best_x = -1, best_y = -1; + + // + for (int i = 0; i < BOARD_SIZE; i++) + { + for (int j = 0; j < BOARD_SIZE; j++) + { + // λ + if (board[i][j] != EMPTY) + { + continue; + } + + // ۺλöAIĽֵͷֵ + int score = evaluate_pos(i, j, AI) + evaluate_pos(i, j, PLAYER) * 0.5; + + // λ + if (score > best_score) + { + best_score = score; + best_x = i; + best_y = j; + } + } + } + + // λ + if (best_x != -1 && best_y != -1) + { + board[best_x][best_y] = AI; + steps[step_count++] = (Step){AI, best_x, best_y}; + printf("AI(%d, %d)\n", best_x + 1, best_y + 1); + } +} + +// !Ϸ +void review_process() +{ + printf("\n===== ̼¼(ܲ%d) =====\n", step_count); + int c; + while ((c = getchar()) != '\n' && c != EOF) + ; // ջ + + // ؽʱ + int temp_board[MAX_BOARD_SIZE][MAX_BOARD_SIZE]; + memset(temp_board, EMPTY, sizeof(temp_board)); + + for (int i = 0; i < step_count; i++) + { + Step s = steps[i]; + // ȡ + temp_board[s.x][s.y] = s.player; + + printf("\n===== ˻ս(%dX%d) =====", BOARD_SIZE, BOARD_SIZE); + printf("\n %d/%d: %s (%d, %d)\n", + i + 1, step_count, + (s.player == PLAYER) ? "" : "AI", //* s.player == PLAYER, ӡҡ,֮ӡAI + s.x + 1, s.y + 1); // ʾΪ(,) + printf("===== ˻ս(%dX%d) =====\n", BOARD_SIZE, BOARD_SIZE); + + // ӡǰ״̬ + printf(" "); + for (int col = 0; col < BOARD_SIZE; col++) + { + printf("%2d", col + 1); + } + printf("\n"); + + for (int row = 0; row < BOARD_SIZE; row++) + { + printf("%2d ", row + 1); + for (int col = 0; col < BOARD_SIZE; col++) + { + if (temp_board[row][col] == PLAYER) + printf("x "); + else if (temp_board[row][col] == AI) + printf(" "); + else + printf(" "); + } + printf("\n"); + } + + if (i < step_count - 1) + { + printf("\nEnterһ..."); + while (getchar() != '\n') + ; + } + } + printf("\n̽Enter..."); + + getchar(); +} \ No newline at end of file