From fe19ae275ea578f5f4047ddc67575931011c6580 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Wed, 20 Dec 2023 15:39:17 +0000 Subject: [PATCH 01/39] =?UTF-8?q?=E8=BE=93=E5=85=A5=E3=80=81=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report2.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/report2.md b/report2.md index ed607ee..66045b8 100644 --- a/report2.md +++ b/report2.md @@ -22,15 +22,24 @@ ## 问题1: - +编写程序,通过函数方便地打印各种字符组成的图案,如:矩形、平行四边形、直角三角形、金字塔(等腰三角)形等图案。 +要求图案的大小、组成图案的字符都可以灵活改变。 +``` +***** ***** * * +***** ***** ** *** +***** ***** *** ***** +***** ***** **** ******* +***** ***** ***** ********* +``` ### 1. 问题陈述 - +利用函数打印特定形状的图案,大小和形状可任意指定。 ### 2. 输入、输出描述 - +- 输入:图案形状,大小和组成字符 +- 输出:字符组成的图案 ### 3. 演算示例 -- Gitee From de9c83d9527d45fd30098d316db67132a65c210f Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Wed, 20 Dec 2023 15:59:24 +0000 Subject: [PATCH 02/39] =?UTF-8?q?=E6=BC=94=E7=AE=97=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report2.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/report2.md b/report2.md index 66045b8..c9052f6 100644 --- a/report2.md +++ b/report2.md @@ -42,9 +42,44 @@ - 输出:字符组成的图案 ### 3. 演算示例 +示例1:打印矩形。调用函数`print_ju(5, 10, '*')`,打印出一个5行10列,由字符`*`组成的矩形图案: +``` +********** +********** +********** +********** +********** +``` +示例2:打印平行四边形。调用函数`print_ping(5,10,'a')`,打印出一个5行10列,由字符`@`组成的平行四边形图案: +``` +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +``` +示例3:打印直角三角形。调用`print_zhi(5,'#)`,打印出一个5行,由字符`#`组成的直角三角形: +``` +# +## +### +#### +##### +``` +示例4:打印金字塔。调用`print_jin(5,'$')`,打印出一个5行,由字符`$`组成的金字塔: +``` +$ +$$$ +$$$$$ +$$$$$$$ +$$$$$$$$$ +``` +除此之外,设计以下函数以便调用。 +(1) 打印换行符。函数`println()`打印一个换行符。 +(2) 重复打印字符。函数`print_chars(10, '*')`打印 10 个字符`*`。 ### 4. 算法设计 -- Gitee From ce35f3ca58715dc0ab31c4b8c1eefaf176158340 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Wed, 20 Dec 2023 16:22:13 +0000 Subject: [PATCH 03/39] =?UTF-8?q?=20=E7=AE=97=E6=B3=95=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report2.md | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 72 insertions(+), 5 deletions(-) diff --git a/report2.md b/report2.md index c9052f6..16442ed 100644 --- a/report2.md +++ b/report2.md @@ -59,7 +59,7 @@ @@@@@@@@@@ ``` -示例3:打印直角三角形。调用`print_zhi(5,'#)`,打印出一个5行,由字符`#`组成的直角三角形: +示例3:打印直角三角形。调用函数`print_zhi(5,'#)`,打印出一个5行,由字符`#`组成的直角三角形: ``` # ## @@ -68,7 +68,7 @@ ##### ``` -示例4:打印金字塔。调用`print_jin(5,'$')`,打印出一个5行,由字符`$`组成的金字塔: +示例4:打印金字塔。调用函数`print_jin(5,'$')`,打印出一个5行,由字符`$`组成的金字塔: ``` $ $$$ @@ -78,12 +78,79 @@ $$$$$$$$$ ``` 除此之外,设计以下函数以便调用。 -(1) 打印换行符。函数`println()`打印一个换行符。 -(2) 重复打印字符。函数`print_chars(10, '*')`打印 10 个字符`*`。 +-(1) 打印换行符。函数`println()`打印一个换行符。 +-(2) 重复打印字符。函数`print_n_chars(10, '*')`打印 10 个字符`*`。 ### 4. 算法设计 +(1)打印换行符 +函数`println()`打印一个换行符 +``` +void println(void) +{ + putchar('\n'); +} +``` +(2)重复打印字符 +函数`print_n_chars(n, c)`重复打印n个字符 +``` +void print_n_chars(int n, char t) +{ + for(int i = 0; i < n; i++){ + putchar(c); + } +} +``` +(3)打印矩形 +函数`print_ju(m, n, c)`,打印出一个m行n列,由字符c组成的矩形图案 +算法(伪代码): +``` +FOR i = 0 TO m-1 DO + 打印出n个字符 + 打印换行 +END +``` +程序代码: +``` +void print_ju(int m, int n, char c) +{ + for (int i = 0; i < m; i++) { + print_n_chars(n, c); + println(); + } +} - +``` +(4)打印平行四边形 +函数`print_ping(m,n,c)`,打印出一个m行n列,由字符c组成的平行四边形图案 +算法(伪代码): +``` +FOR i = 0 TO m-1 DO + 打印i个空格 + 打印n个字符 + 打印换行 +END +``` +``` +void print_ping(int m, int n, char c) +{ + for (int i = 0; i < m; i++) { + print_n_chars(i, ' '); + print_n_chars(n, c); + println(); + } +} +``` +(5)打印直角三角形 +函数`print_zhi(n,c)`,打印出一个n行,由字符c组成的直角三角形: +``` +``` +(6)打印字符金字塔 +函数`print_jin(n,c)`,打印出一个n行,由字符c组成的金字塔: +``` +``` +(7)主程序 +``` +``` ### 5. 测试 -- Gitee From 625389b0ccdf61c45fbf49dfbf0fdb2b68084c8c Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Wed, 20 Dec 2023 16:26:15 +0000 Subject: [PATCH 04/39] =?UTF-8?q?=E5=AE=9E=E9=AA=8C=E4=B8=80=E5=86=99?= =?UTF-8?q?=E9=94=99=E4=BD=8D=E7=BD=AE=E4=BA=86=EF=BC=8C=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E5=A4=8D=E5=88=B6=E5=88=B0=E8=BF=99=E4=B8=AA=E4=B8=8A=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report1.md | 52 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/report1.md b/report1.md index d183aa3..5d60559 100644 --- a/report1.md +++ b/report1.md @@ -164,31 +164,75 @@ int main(void) ## 问题2:猴子吃桃 - +一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子? ### 1. 问题陈述 - +设计一个求第一天摘得桃子总数量的程序,输入一个正整数N表示猴子最后一天想再吃桃子时,桃子的数量为1。 ### 2. 输入、输出描述 - +-【输入】一个正整数N,表示猴子最后一天想再吃桃子时,桃子的数量为1。 +-【输出】一个整数,表示第一天猴子摘得桃子的总数量。 ### 3. 演算示例 +输入示例:10 +输出示例:1534 +解释:假设第一天摘得桃子总数为x,根据题意有: +·第2天剩下的桃子数量为x/2-1,即(x-2)/2; +·第3天剩下的桃子数量为(x-2)/2/2-1,即(x-4)/2/2; +·... +·第N天剩下的桃子数量为1,(x/(2^(N-1))-1)。 ### 4. 算法设计 +算法总体描述: +``` +Step 1.初始化变量 +Step 2.输入N,循环计算第一天的桃子数量 +Step 3.打印第一天摘得桃子数量 +``` +算法完整描述: +``` +//Step 1.初始化变量 +初始化桃子数量total为0 +初始化天数N为0 +//Step 2.输入天数,根据公式计算桃子数量 +输入天数 N +FOR 定义1|当第1天到第N天停止 +天数不断递增 +将前一天的桃子数量total加1后乘以2累加到总桃子数量totle中 +ENDFOR +//Step 3.输出第一天的桃子数量并打印 +``` +程序代码: - +```c +#include +int main() +{ + int n,x = 1; + scanf("%d",&n);//初始值为1 + for(int i = n; i > 1; i--){ + x = (x + 1) * 2;//第i天剩下的桃子数量 + } + printf("%d",x); + return 0; + } +``` ### 5. 测试 +测试结果与两个演算示例一致,测试通过。 ### 小结 +·本题需要倒退求解第一天摘得的=桃子的总数量,可以使用循环实现。 +·在循环中,需要根据题意推到出第i天剩下的桃子数量与第i+1天剩下的桃子数量之间的关系。 +·根据推导结果,可以得到代码实现。 ## 问题3: -- Gitee From b7fc60ce1e36cbf04c2d63b110096f75e9775579 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Wed, 20 Dec 2023 16:28:07 +0000 Subject: [PATCH 05/39] update report1.md. Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report1.md | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/report1.md b/report1.md index 5d60559..87e6cf9 100644 --- a/report1.md +++ b/report1.md @@ -234,29 +234,103 @@ int main() ·在循环中,需要根据题意推到出第i天剩下的桃子数量与第i+1天剩下的桃子数量之间的关系。 ·根据推导结果,可以得到代码实现。 + ## 问题3: +N元钱买N只鸡,公鸡每只5元,母鸡每只3元,小鸡1元3只,N元钱必须刚好买N只鸡,而且鸡必须整只买,不能劈开买。 +有几种买法呢?这就是N鸡问题。 ### 1. 问题陈述 +设计一个求买3种鸡有多少种买法,且求出所有买法的公鸡数量的和,运行一次可以处理任意数量的钱N,N属于500以内,且如果无解则公鸡的数量为-1。 ### 2. 输入、输出描述 + 【输入】一个正整数N,表示买N只鸡的情况。(N<500) + 【输出】两个整数,表示鸡的所有买法和所有买法的公鸡数量的和 ### 3. 演算示例 +用两层for循环遍布所有可能的买法,其中一个鸡的数量用总数减去前两种鸡。 +示例1:总钱数和鸡的只数N +``` +Enter N, -1 to end:100 +The sum of the number of chicken to buy is 4, +the number of roosters to buy is 24 +``` +示例2:没有买法可以买到鸡。 +``` +Enter N, -1 to end: 1 +The sum of the number of chicken to buy is 0, +the number of rootsters to buy is -1 +``` ### 4. 算法设计 +算法总体描述: +``` +Step 1.初始化变量 +Step 2.输入N,嵌套循环判断并计数 +Step 3.计算并打印鸡的买法和所有买法的公鸡数量的和 +``` +算法完整描述: +``` +//Step 1.初始化变量 +初始化买法c为0 +初始化公鸡的总数s为0 +//Step 2.输入N,嵌套循环判断并计数 +输入钱数金额和鸡的只数N +FOR 定义I 当I到能买到最多只数公鸡时停止 I递增 + FOR 定义J 当J到能买到最多只数公鸡时停止 J递增 + 根据钱数N计算出小鸡的只数 + IF 判断当前的鸡的价格是否为N + 将计数器 c 加 1 + 将公鸡的只数 s 加 i + ENDIF + ENDFOR +ENDFOR +// Step 3.判断是否无解,并打印出鸡的买法和所有买法的公鸡数量的和 +IF +买法为0,即c等于 0 THEN + 令公鸡的数目为-1 +ENDIF + 打印出鸡的买法和所有买法的公鸡数量的和 +``` +程序代码: +```c +#include +int main() { + int N, c = 0, s = 0; + scanf("%d", &N); + + // 所有可能的买法 + for (int i = 0; i <= N / 5; i++) { + for (int j = 0; j <= N / 3; j++) { + int k = N - i - j; + if (k >= 0 && k % 3 == 0 && i * 5 + j * 3 + k / 3 == N) { + c++; // 找到一种买法 + s += i; // 得到公鸡数量之和 + } + } + } + if (c == 0) { + s = -1; // 这是无解的情况 + } + printf("%d %d", c, s); //打印出买法和公鸡数量的和 + return 0; +} +``` ### 5. 测试 +测试结果与两个演算示例一致,测试通过。 ### 小结 - +·通过2个for的嵌套运用求得满足条件的麦基数量及公鸡数量之和。 +·在没有解法时公鸡的数量设置-1。 \ No newline at end of file -- Gitee From 13070661e86d3b470d2df2be11ffbf3737f98dee Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Thu, 21 Dec 2023 11:27:13 +0000 Subject: [PATCH 06/39] =?UTF-8?q?=E5=AD=97=E7=AC=A6=E5=9B=BE=E6=A1=88?= =?UTF-8?q?=E6=89=93=E5=8D=B0=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report2.md | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 93 insertions(+), 4 deletions(-) diff --git a/report2.md b/report2.md index 16442ed..237eedf 100644 --- a/report2.md +++ b/report2.md @@ -142,22 +142,111 @@ void print_ping(int m, int n, char c) ``` (5)打印直角三角形 函数`print_zhi(n,c)`,打印出一个n行,由字符c组成的直角三角形: +伪代码 ``` +FOR i = 0 TO n-1 DO + 打印 i+1 个字符c + 打印换行 +``` +程序代码 +``` +void print_zhi(n,c) + { + print_n_chars(i+1, c); + println(); +} ``` (6)打印字符金字塔 函数`print_jin(n,c)`,打印出一个n行,由字符c组成的金字塔: +分析规律 ``` +行 空格数 字符数 +1 4 1 +2 3 3 +3 2 5 +4 1 7 +5 0 9 ``` -(7)主程序 ``` +FOR i = 0 TO n-1 DO +打印 n-1+i 个空格 +打印 2*i+1个字符 c +打印换行 +END ``` -### 5. 测试 +``` +void print_jin( int n, char c) +{ + for (int i = 0; i < m; i++) { + print_n_chars(n-1+i, ' '); + print_n_chars(2*i+1, c); + println(); + } +} +``` +(7)主程序 +```c +#include +void println(void) +{ + putchar('\n'); +} +void print_n_chars(int n, char t) +{ + for(int i = 0; i < n; i++){ + putchar(t); + } +} +void print_ju(int m, int n, char c) +{ + for (int i = 0; i < m; i++) { + print_n_chars(n, c); + println(); + } +} +void print_ping(int m, int n, char c) +{ + for (int i = 0; i < m; i++) { + print_n_chars(i, ' '); + print_n_chars(n, c); + println(); + } +} +void print_zhi(int n, char c) +{ + print_n_chars(n, c); + println(); +} +void print_jin(int n, char c) +{ + for (int i = 0; i < n; i++) { + print_n_chars(n-1-i, ' '); + print_n_chars(2*i+1, c); + println(); + } +} +int main(void) +{ +// 打印矩形 +print_ju(5, 10, '*'); +// 打印平行四边形 +print_ping(5, 10, '@'); +// 打印直角三角形 +print_zhi(5, '#'); +// 打印金字塔 +print_jin(5, '*'); +return 0; +} +``` +### 5. 测试 +程序运行结果与示例结果相同,测试通过。 ### 小结 - - +(1)程序通过定义不同的函数来实现不同形状的图案打印,包括矩形、平行四边形、直角三角形和金字塔形。 +(2)主程序中通过接收用户输入的图案形状和参数,选择相应的函数进行图案打印。 +(3)在运行程序时,用户需要在一行中输入图案形状和参数,程序会根据输入的图案形状和参数打印出相应的图案。 ## 问题2: -- Gitee From 5350c39836143f8a671773d258d7b32425f14d2a Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Thu, 21 Dec 2023 12:12:50 +0000 Subject: [PATCH 07/39] =?UTF-8?q?=E9=98=B6=E4=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report2.md | 61 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 10 deletions(-) diff --git a/report2.md b/report2.md index 237eedf..cfc5fa1 100644 --- a/report2.md +++ b/report2.md @@ -20,7 +20,7 @@ -## 问题1: +## 问题1:字符打印机 编写程序,通过函数方便地打印各种字符组成的图案,如:矩形、平行四边形、直角三角形、金字塔(等腰三角)形等图案。 要求图案的大小、组成图案的字符都可以灵活改变。 @@ -81,6 +81,7 @@ $$$$$$$$$ -(1) 打印换行符。函数`println()`打印一个换行符。 -(2) 重复打印字符。函数`print_n_chars(10, '*')`打印 10 个字符`*`。 ### 4. 算法设计 + (1)打印换行符 函数`println()`打印一个换行符 ``` @@ -102,14 +103,14 @@ void print_n_chars(int n, char t) ``` (3)打印矩形 函数`print_ju(m, n, c)`,打印出一个m行n列,由字符c组成的矩形图案 -算法(伪代码): +-算法(伪代码): ``` FOR i = 0 TO m-1 DO 打印出n个字符 打印换行 END ``` -程序代码: +-程序代码: ``` void print_ju(int m, int n, char c) { @@ -122,7 +123,7 @@ void print_ju(int m, int n, char c) ``` (4)打印平行四边形 函数`print_ping(m,n,c)`,打印出一个m行n列,由字符c组成的平行四边形图案 -算法(伪代码): +-算法(伪代码): ``` FOR i = 0 TO m-1 DO 打印i个空格 @@ -130,6 +131,7 @@ FOR i = 0 TO m-1 DO 打印换行 END ``` +-程序代码 ``` void print_ping(int m, int n, char c) { @@ -142,13 +144,13 @@ void print_ping(int m, int n, char c) ``` (5)打印直角三角形 函数`print_zhi(n,c)`,打印出一个n行,由字符c组成的直角三角形: -伪代码 +-伪代码 ``` FOR i = 0 TO n-1 DO 打印 i+1 个字符c 打印换行 ``` -程序代码 +-程序代码 ``` void print_zhi(n,c) { @@ -158,7 +160,7 @@ void print_zhi(n,c) ``` (6)打印字符金字塔 函数`print_jin(n,c)`,打印出一个n行,由字符c组成的金字塔: -分析规律 +-分析规律 ``` 行 空格数 字符数 1 4 1 @@ -167,6 +169,7 @@ void print_zhi(n,c) 4 1 7 5 0 9 ``` +-伪代码 ``` FOR i = 0 TO n-1 DO 打印 n-1+i 个空格 @@ -174,6 +177,7 @@ FOR i = 0 TO n-1 DO 打印换行 END ``` +-程序代码 ``` void print_jin( int n, char c) { @@ -248,27 +252,64 @@ return 0; (2)主程序中通过接收用户输入的图案形状和参数,选择相应的函数进行图案打印。 (3)在运行程序时,用户需要在一行中输入图案形状和参数,程序会根据输入的图案形状和参数打印出相应的图案。 -## 问题2: - +## 问题2:经典递归问题 ### 1. 问题陈述 - +编程实现几个经典的递归函数,包括阶乘,自然数的和,斐波那契数列,快速幂和最大公约数。 ### 2. 输入、输出描述 +#### (1) 阶乘 + +-输入:非负整数$n$ +-输出:$n!$ ### 3. 演算示例 +#### (1) 阶乘 + +示例1:$n=0$,$n!=0!=1$。 + +示例2:$n=2$,$n!=2!=2\time 1\1=2$。 + +示例3:$n=20$,$n!=20!=2432902008176640000。 + ### 4. 算法设计 +#### (1 )阶乘 +根据fact函数的定义,可得到如下算法: +``` +//求n的阶乘 +FUNCTION fact(n) + INPUT:非负整数 n + OUTPUT: n 的阶乘 + IF n<= 1 THEN + RETURN 1 + ELSE + EWTUEN n * fact(n-1) + END IF +END FUNCTION +``` +程序代码 +```c +//求n的阶乘 +long long fact(int n) +{ + if(n<-1) + return 1; + else + return n * fact(n-1); +} +``` ### 5. 测试 +程序运行结果与示例结果相同,测试通过。 -- Gitee From 48dbd79cc0f9103e6f45afed8688aa7328acf9bb Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Thu, 21 Dec 2023 12:27:49 +0000 Subject: [PATCH 08/39] =?UTF-8?q?=20=E8=BE=93=E5=85=A5=E3=80=81=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E6=8F=8F=E8=BF=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report2.md | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 3 deletions(-) diff --git a/report2.md b/report2.md index cfc5fa1..cb72dac 100644 --- a/report2.md +++ b/report2.md @@ -266,6 +266,25 @@ return 0; -输入:非负整数$n$ -输出:$n!$ +#### (2) 自然数的和 + +-输入:非负整数$n$ +-输出:1+2+...+n的总和 + +#### (3) 斐波那契数列 + +-输入:非负整数$n$ +-输出:斐波那契数列第 n 项 + +#### (4) 快速幂 + +-输入:实数$x$和非负整数$n$ +-输出:x 的 n 次幂 + +#### (5) 最大公约数 + +-输入:整数$m$和$n$ +-输出:递归计算 m 和 n 的最大公约数 ### 3. 演算示例 @@ -273,15 +292,47 @@ return 0; 示例1:$n=0$,$n!=0!=1$。 -示例2:$n=2$,$n!=2!=2\time 1\1=2$。 +示例2:$n=2$,$n!=2!=2*1=2$。 + +示例3:$n=20$,$n!=20!=2432902008176640000。$ + +#### (1) 阶乘 + +示例1:$n=0$,$n!=0!=1$。 + +示例2:$n=2$,$n!=2!=2*1=2$。 -示例3:$n=20$,$n!=20!=2432902008176640000。 +示例3:$n=20$,$n!=20!=2432902008176640000。$ + +#### (1) 阶乘 + +示例1:$n=0$,$n!=0!=1$。 + +示例2:$n=2$,$n!=2!=2*1=2$。 + +示例3:$n=20$,$n!=20!=2432902008176640000。$ + +#### (1) 阶乘 + +示例1:$n=0$,$n!=0!=1$。 + +示例2:$n=2$,$n!=2!=2*1=2$。 + +示例3:$n=20$,$n!=20!=2432902008176640000。$ + +#### (1) 阶乘 + +示例1:$n=0$,$n!=0!=1$。 + +示例2:$n=2$,$n!=2!=2*1=2$。 + +示例3:$n=20$,$n!=20!=2432902008176640000。$ ### 4. 算法设计 -#### (1 )阶乘 +#### (1)阶乘 根据fact函数的定义,可得到如下算法: ``` @@ -308,6 +359,28 @@ long long fact(int n) return n * fact(n-1); } ``` + +#### (1)阶乘 + +根据fact函数的定义,可得到如下算法: +``` +``` +#### (1)阶乘 + +根据fact函数的定义,可得到如下算法: +``` +``` +#### (1)阶乘 + +根据fact函数的定义,可得到如下算法: +``` +``` +#### (1)阶乘 + +根据fact函数的定义,可得到如下算法: +``` +``` + ### 5. 测试 程序运行结果与示例结果相同,测试通过。 -- Gitee From 18f7e14df185ce99630cc4639c24d2c45aa609ab Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Thu, 21 Dec 2023 12:39:53 +0000 Subject: [PATCH 09/39] =?UTF-8?q?=20=E6=BC=94=E7=AE=97=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report2.md | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/report2.md b/report2.md index cb72dac..a1469fd 100644 --- a/report2.md +++ b/report2.md @@ -292,41 +292,39 @@ return 0; 示例1:$n=0$,$n!=0!=1$。 -示例2:$n=2$,$n!=2!=2*1=2$。 +示例2:$n=2$,$n!=2!=1*2=2$。 -示例3:$n=20$,$n!=20!=2432902008176640000。$ +示例3:$n=20$,$n!=20!=2432902008176640000$。 -#### (1) 阶乘 +#### (2) 自然数的和 -示例1:$n=0$,$n!=0!=1$。 +示例1:$n=1$,$sum(1)=1$。 -示例2:$n=2$,$n!=2!=2*1=2$。 +示例2:$n=2$,$sum(2)=1+2=3$。 -示例3:$n=20$,$n!=20!=2432902008176640000。$ +示例3:$n=100$,$sum(100)=5050$。 -#### (1) 阶乘 +#### (3) 斐波那契数列 -示例1:$n=0$,$n!=0!=1$。 +示例1:$n=0$,$fib(0)=0$。 -示例2:$n=2$,$n!=2!=2*1=2$。 +示例2:$n=1$,$fib(1)=1$。 -示例3:$n=20$,$n!=20!=2432902008176640000。$ +示例3:$n=40$,$fib(40)=102334155$。 -#### (1) 阶乘 - -示例1:$n=0$,$n!=0!=1$。 +#### (4) 快速幂 -示例2:$n=2$,$n!=2!=2*1=2$。 +示例1:$n=0$,$power(x,0)=1$。 -示例3:$n=20$,$n!=20!=2432902008176640000。$ +示例2:$n=1$,$power(x,1)=x$。 -#### (1) 阶乘 +示例3:$x=3.14159,n=100$,$power(3.14159, 100) = 5.18741E+49$。 -示例1:$n=0$,$n!=0!=1$。 +#### (5) 最大公约数 -示例2:$n=2$,$n!=2!=2*1=2$。 +示例1:$n=0$,$gcd(m,0)=m$。 -示例3:$n=20$,$n!=20!=2432902008176640000。$ +示例2:$m=9527,n=6553$,$gcd(9527, 6553) = 1$。 -- Gitee From 41703f716e9c350d5d1c913dc0388f7f9fcbc819 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Thu, 21 Dec 2023 13:09:04 +0000 Subject: [PATCH 10/39] =?UTF-8?q?=E7=BB=8F=E5=85=B8=E9=80=92=E5=BD=92?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report2.md | 198 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 188 insertions(+), 10 deletions(-) diff --git a/report2.md b/report2.md index a1469fd..943bbcd 100644 --- a/report2.md +++ b/report2.md @@ -358,31 +358,209 @@ long long fact(int n) } ``` -#### (1)阶乘 +#### (2) 自然数的和 -根据fact函数的定义,可得到如下算法: +根据函数sum(n)的定义,可得到如下算法: ``` +FUNCTION sum(n) + INPUT: 正整数 n + OUTPUT: 1 到 n 的和 + + IF n = 1 THEN + RETURN 1 + ELSE + RETURN n + sum(n-1) + END IF +END FUNCTION + +``` +程序代码 +```c +// 递归计算 1+2+...+n +int sum(int n) { + if (n == 1) { + return 1; + } else { + return n + sum(n - 1); + } +} ``` -#### (1)阶乘 -根据fact函数的定义,可得到如下算法: +#### (3)斐波那契数列 + +根据函数fib(n)的定义,可得到如下算法: + ``` +FUNCTION fib(n) + INPUT: 非负整数 n + OUTPUT: 斐波那契数列的第 n 项 + + IF n = 0 THEN + RETURN 0 + ELSE IF n = 1 THEN + RETURN 1 + ELSE + RETURN fib(n-1) + fib(n-2) + END IF +END FUNCTION + ``` -#### (1)阶乘 +程序代码 +```c +// 递归计算斐波那契数列第 n 项 +int fib(int n) { + if (n == 0) { + return 0; + } else if (n == 1) { + return 1; + } else { + return fib(n - 1) + fib(n - 2); + } +} +``` +#### (4) 快速幂 -根据fact函数的定义,可得到如下算法: +根据函数power(x,n)的定义,可得到如下算法: ``` +FUNCTION power(x, n) + INPUT: 实数 x, 整数 n + OUTPUT: x 的 n 次幂 + + IF n = 0 THEN + RETURN 1 + ELSE IF n = 1 THEN + RETURN x + ELSE IF n 是偶数 THEN + temp = power(x, n/2) + RETURN temp * temp + ELSE + RETURN x * power(x, n-1) + END IF +END FUNCTION + ``` -#### (1)阶乘 +程序代码 +```c +// 递归计算 x 的 n 次幂 +double power(double x, int n) { + if (n == 0) { + return 1; + } else if (n == 1) { + return x; + } else if (n % 2 == 0) { + double temp = power(x, n / 2); + return temp * temp; + } else { + return x * power(x, n - 1); + } +} -根据fact函数的定义,可得到如下算法: ``` + +#### (5) 最大公约数 + +根据函数gcd(m,n)的定义,可得到如下算法: ``` +FUNCTION gcd(m, n) + INPUT: 整数 m, n + OUTPUT: m 和 n 的最大公约数 -### 5. 测试 -程序运行结果与示例结果相同,测试通过。 + IF n = 0 THEN + RETURN m + ELSE + RETURN gcd(n, m MOD n) + END IF +END FUNCTION + +``` + +程序代码 +```c +// 递归计算 m 和 n 的最大公约数 +int gcd(int m, int n) { + if (n == 0) { + return m; + } else { + return gcd(n, m % n); + } +} + +``` + +主程序 +```c +#include + +// 递归计算 n 的阶乘 +long long fact(int n) { + if (n <= 1) { + return 1; + } else { + return n * fact(n - 1); + } +} + +// 递归计算 1+2+...+n +int sum(int n) { + if (n == 1) { + return 1; + } else { + return n + sum(n - 1); + } +} + +// 递归计算斐波那契数列第 n 项 +int fib(int n) { + if (n == 0) { + return 0; + } else if (n == 1) { + return 1; + } else { + return fib(n - 1) + fib(n - 2); + } +} + +// 递归计算 x 的 n 次幂 +double power(double x, int n) { + if (n == 0) { + return 1; + } else if (n == 1) { + return x; + } else if (n % 2 == 0) { + double temp = power(x, n / 2); + return temp * temp; + } else { + return x * power(x, n - 1); + } +} + +// 递归计算 m 和 n 的最大公约数 +int gcd(int m, int n) { + if (n == 0) { + return m; + } else { + return gcd(n, m % n); + } +} + +int main() { + printf("fact(20) = %lld\n", fact(20)); + printf("sum(100) = %d\n", sum(100)); + printf("fib(40) = %d\n", fib(40)); + printf("power(3.14159, 100) = %e\n", power(3.14159, 100)); + printf("gcd(9527, 6553) = %d\n", gcd(9527, 6553)); + return 0; +} + +``` + +### 5. 测试 + +程序运行结果与示例结果相同,测试通过。 ### 小结 +-这些函数都是使用递归的方式来实现的,其中包括基本情况和递归情况。 +-在主函数中,对这些函数进行了调用并输出了结果。 -- Gitee From 1abd5eeac5e61f28f56084f99a24125837658695 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Thu, 21 Dec 2023 13:12:01 +0000 Subject: [PATCH 11/39] =?UTF-8?q?=E7=BB=8F=E5=85=B8=E9=80=92=E5=BD=92?= =?UTF-8?q?=E9=97=AE=E9=A2=981?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/report2.md b/report2.md index 943bbcd..24a5a5d 100644 --- a/report2.md +++ b/report2.md @@ -563,4 +563,4 @@ int main() { ### 小结 -这些函数都是使用递归的方式来实现的,其中包括基本情况和递归情况。 --在主函数中,对这些函数进行了调用并输出了结果。 +-在主函数中,对这些函数进行了调用和输出了结果。 -- Gitee From a6b3747951f9a9111aa375dce429a28777a500e1 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Fri, 22 Dec 2023 06:13:38 +0000 Subject: [PATCH 12/39] =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report3.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/report3.md b/report3.md index 10682a7..f78bc3d 100644 --- a/report3.md +++ b/report3.md @@ -23,3 +23,17 @@ (5)排序算法。 + +## 问题1:数组计数器 + +### 1. 问题陈述 + +### 2. 输入输出描述 + +### 3. 演算示例 + +### 4. 算法设计 + +### 5. 测试 + +### 总结 \ No newline at end of file -- Gitee From 17fdf1cfc961c5ecd820a3a6e116b3489890a296 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Fri, 22 Dec 2023 06:55:57 +0000 Subject: [PATCH 13/39] =?UTF-8?q?=E5=88=A4=E6=96=AD=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report3.md | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/report3.md b/report3.md index f78bc3d..4026409 100644 --- a/report3.md +++ b/report3.md @@ -28,12 +28,74 @@ ### 1. 问题陈述 +利用数组,以函数形式实现下列算法。 +``` +// 判断正整数 n (的十进制表示)中是否存在重复的数字 +bool has_repeat_digit(int n); +// 判断两个正整数 m 和 n (的十进制表示)是否由相同的数字组成 +bool is_similar(int m, int n); +// 判断 n 个学生成绩中是否存在相同的分数(0 到 100 之间的整数) +bool has_same_score(int score[], int n); +``` + ### 2. 输入输出描述 +#### (1) 判断重复的数字 +- 输入: 正整数 n +- 输出: 如果 n 的十进制表示中存在重复的数字,则返回 true,否则返回 false + ### 3. 演算示例 +#### (1) 判断重复的数字 + +示例1:$n=12345$,其十进制表示中没有重复的数字,返回结果`false`。 + +示例2:$n=12321$,其十进制表示中有重复数字 1 和 2 ,函数返回`true`。 + + ### 4. 算法设计 +#### (1) 判断重复的数字 +// 判断正整数 n (的十进制表示)中是否存在重复的数字 +FUNCTION has_repeat_digit(n) + INPUT:正整数n + OUTPUT:如果 n 的十进制表示中存在重复的数字,则返回 true,否则返回 false + + digit_seen [10] = { 0 } // 声明一个长度为 10 的标记数组,初始化为 0 + + WHILE n > 0 DO + digit = n % 10 // 计算 digit 为 n 的个位数字 + IF digit_seen[digit] is 1 THEN // 数字 digit 已经出现过 + RETURN true // 存在重复的数字 + ELSE // 数字 digit 第一次出现 + digit_seen[digit] = 1 // 标记数字 digit 已经出现过 + n = n / 10 // 去掉 n 的个位数字 + END WHILE + + RETURN false // 不存在重复的数字 +END FUNCTION +``` +程序代码 +```c +// 判断正整数 n (的十进制表示)中是否存在重复的数字 +bool has_repeat_digit(int n) { + int digit_seen[10] = { 0 }; // 声明一个长度为 10 的标记数组,初始化为 0 + + while (n > 0) { + int digit = n % 10; // 计算 digit 为 n 的个位数字 + if (digit_seen[digit] == 1) { // 数字 digit 已经出现过 + return true; // 存在重复的数字 + } else { // 数字 digit 第一次出现 + digit_seen[digit] = 1; // 标记数字 digit 已经出现过 + } + n = n / 10; // 去掉 n 的个位数字 + } + + return false; // 不存在重复的数字 +} +``` ### 5. 测试 + + ### 总结 \ No newline at end of file -- Gitee From e2cd2ac91ae7215df7c0398d0d28557830abf852 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Fri, 22 Dec 2023 07:11:34 +0000 Subject: [PATCH 14/39] =?UTF-8?q?=E8=BE=93=E5=85=A5=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report3.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/report3.md b/report3.md index 4026409..959517a 100644 --- a/report3.md +++ b/report3.md @@ -44,6 +44,14 @@ bool has_same_score(int score[], int n); - 输入: 正整数 n - 输出: 如果 n 的十进制表示中存在重复的数字,则返回 true,否则返回 false +#### (2) 判断相同的数字组成 +- 输入: 正整数 m 和 n +- 输出: 如果两个正整数 m 和 n (的十进制表示)由相同的数字组成,则返回 true,否则返回 false + +#### (3) 判断存在相同的分数(0 到 100 之间的整数) +- 输入: 长度为 n 的整数数组 score +- 输出: 如果 score 数组存在相同的分数,则返回 true,否则返回 false + ### 3. 演算示例 #### (1) 判断重复的数字 @@ -52,6 +60,10 @@ bool has_same_score(int score[], int n); 示例2:$n=12321$,其十进制表示中有重复数字 1 和 2 ,函数返回`true`。 +#### (2) 判断相同的数字组成 + +#### (3) 判断存在相同的分数(0 到 100 之间的整数) + ### 4. 算法设计 @@ -94,8 +106,16 @@ bool has_repeat_digit(int n) { return false; // 不存在重复的数字 } ``` +#### (2) 判断相同的数字组成 + + +#### (3) 判断存在相同的分数(0 到 100 之间的整数) + + + ### 5. 测试 +程序运行结果与示例结果相同,测试通过。 ### 总结 \ No newline at end of file -- Gitee From 1b2ed8869463f5437baed1bc901d0f0faee4f690 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Fri, 22 Dec 2023 07:20:53 +0000 Subject: [PATCH 15/39] =?UTF-8?q?=E6=BC=94=E7=AE=97=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report3.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/report3.md b/report3.md index 959517a..fef51cd 100644 --- a/report3.md +++ b/report3.md @@ -62,8 +62,15 @@ bool has_same_score(int score[], int n); #### (2) 判断相同的数字组成 +示例1:$m=123,n=145$,它们的十进制表示没有由相同的数字组成,返回结果`false` + +示例2:$m=6789,n=8796$,它们的十进制表示由相同的数字组成,返回结果`true` + #### (3) 判断存在相同的分数(0 到 100 之间的整数) +示例1:$n=5,score[]={0,98,56,88,47}$,这 5 个学生成绩中不存在相同的分数,返回结果`false` + +示例2:$n=8,score[]={89,98,56,88,47,64,89,95}$,这 8 个学生成绩中存在相同的分数,返回结果`true` ### 4. 算法设计 -- Gitee From 897ed8c7cdfd5982e6c987f4b25343f4dedd8696 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Fri, 22 Dec 2023 07:43:06 +0000 Subject: [PATCH 16/39] =?UTF-8?q?=E5=88=A4=E6=96=AD=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report3.md | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/report3.md b/report3.md index fef51cd..bbb7cd7 100644 --- a/report3.md +++ b/report3.md @@ -75,6 +75,9 @@ bool has_same_score(int score[], int n); ### 4. 算法设计 #### (1) 判断重复的数字 + +算法伪代码 +``` // 判断正整数 n (的十进制表示)中是否存在重复的数字 FUNCTION has_repeat_digit(n) INPUT:正整数n @@ -115,10 +118,77 @@ bool has_repeat_digit(int n) { ``` #### (2) 判断相同的数字组成 +算法伪代码 + +``` +// 判断两个正整数 m 和 n (的十进制表示)是否由相同的数字组成 +FUNCTION is_similar(m, n) + INPUT:正整数 m 和 n + OUTPUT: 如果 m 和 n (的十进制表示)由相同的数字组成,则返回 true,否则返回 false + + DECLARE digit_seen [10] = { 0 } // 声明一个长度为 10 的标记数组,初始化为 0 + + WHILE m > 0 DO + digit = m % 10 // 计算 digit 为 m 的个位数字 + digit_seen[digit] = 1 // 标记数字 digit 已经出现过 + m = m / 10 // 去掉 m 的个位数字 + END WHILE + + WHILE n > 0 DO + digit = n % 10 // 计算 digit 为 n 的个位数字 + IF digit_seen[digit] is 0 THEN // 数字 digit 没有出现过 + RETURN false // 数字不相同 + n = n / 10 // 去掉 n 的个位数字 + END WHILE + + RETURN true // 数字相同 +END FUNCTION + +``` +程序代码 + +```c +// 判断两个正整数 m 和 n (的十进制表示)是否由相同的数字组成 +bool is_similar(int m, int n) { + int digit_seen[10] = { 0 }; // 声明一个长度为 10 的标记数组,初始化为 0 + + while (m > 0) { + int digit = m % 10; // 计算 digit 为 m 的个位数字 + digit_seen[digit] = 1; // 标记数字 digit 已经出现过 + m = m / 10; // 去掉 m 的个位数字 + } + + while (n > 0) { + int digit = n % 10; // 计算 digit 为 n 的个位数字 + if (digit_seen[digit] == 0) { // 数字 digit 没有出现过 + return false; // 数字不相同 + } + n = n / 10; // 去掉 n 的个位数字 + } + + return true; // 数字相同 +} +``` + #### (3) 判断存在相同的分数(0 到 100 之间的整数) +算法伪代码 + +``` +``` +程序代码 + +```c + +``` + +主程序 + +```c + +``` ### 5. 测试 -- Gitee From c22687d247402efcc62d0e7f5a787f7c23b3ee48 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Fri, 22 Dec 2023 08:48:44 +0000 Subject: [PATCH 17/39] =?UTF-8?q?=E6=95=B0=E7=BB=84=E8=AE=A1=E6=95=B0?= =?UTF-8?q?=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report3.md | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) diff --git a/report3.md b/report3.md index bbb7cd7..4dff69f 100644 --- a/report3.md +++ b/report3.md @@ -176,17 +176,117 @@ bool is_similar(int m, int n) { 算法伪代码 ``` +// 判断 n 个学生成绩中是否存在相同的分数(0 到 100 之间的整数) +FUNCTION has_same_score(score[], n) + INPUT:长度为 n 的整数数组 score + OUTPUT: 如果 score 中存在相同的分数,则返回 true,否则返回 false + + DECLARE score_seen [101] = { 0 } // 声明一个长度为 101 的标记数组,初始化为 0 + + FOR i FROM 0 TO n - 1 DO + IF score_seen[score[i]] is 1 THEN // 分数 score[i] 已经出现过 + RETURN true // 存在相同的分数 + ELSE // 分数 score[i] 第一次出现 + score_seen[score[i]] = 1 // 标记分数 score[i] 已经出现过 + END IF + END FOR + + RETURN false // 不存在相同的分数 +END FUNCTION ``` 程序代码 ```c +// 判断 n 个学生成绩中是否存在相同的分数(0 到 100 之间的整数) +bool has_same_score(int score[], int n) { + int score_seen[101] = { 0 }; // 壿明一个长度为 101 的标记数组,初始化为 0 + + for (int i = 0; i < n; i++) { + if (score_seen[score[i]] == 1) { // 分数 score[i] 已经出现过 + return true; // 存在相同的分数 + } else { // 分数 score[i] 第一次出现 + score_seen[score[i]] = 1; // 标记分数 score[i] 已经出现过 + } + } + + return false; // 不存在相同的分数 +} + ``` 主程序 ```c +#include +#include + +// 判断正整数 n (的十进制表示)中是否存在重复的数字 +bool has_repeat_digit(int n) { + int digit_seen[10] = { 0 }; // 声明一个长度为 10 的标记数组,初始化为 0 + + while (n > 0) { + int digit = n % 10; // 计算 digit 为 n 的个位数字 + if (digit_seen[digit] == 1) { // 数字 digit 已经出现过 + return true; // 存在重复的数字 + } else { // 数字 digit 第一次出现 + digit_seen[digit] = 1; // 标记数字 digit 已经出现过 + } + n = n / 10; // 去掉 n 的个位数字 + } + + return false; // 不存在重复的数字 +} + +// 判断两个正整数 m 和 n (的十进制表示)是否由相同的数字组成 +bool is_similar(int m, int n) { + int digit_seen[10] = { 0 }; // 声明一个长度为 10 的标记数组,初始化为 0 + + while (m > 0) { + int digit = m % 10; // 计算 digit 为 m 的个位数字 + digit_seen[digit] = 1; // 标记数字 digit 已经出现过 + m = m / 10; // 去掉 m 的个位数字 + } + + while (n > 0) { + int digit = n % 10; // 计算 digit 为 n 的个位数字 + if (digit_seen[digit] == 0) { // 数字 digit 没有出现过 + return false; // 数字不相同 + } + n = n / 10; // 去掉 n 的个位数字 + } + + return true; // 数字相同 +} + +// 判断 n 个学生成绩中是否存在相同的分数(0 到 100 之间的整数) +bool has_same_score(int score[], int n) { + int score_seen[101] = { 0 }; // 声明一个长度为 101 的标记数组,初始化为 0 + + for (int i = 0; i < n; i++) { + if (score_seen[score[i]] == 1) { // 分数 score[i] 已经出现过 + return true; // 存在相同的分数 + } else { // 分数 score[i] 第一次出现 + score_seen[score[i]] = 1; // 标记分数 score[i] 已经出现过 + } + } + + return false; // 不存在相同的分数 +} + +int main(void) { + printf("has_repeat_digit(12345) = %d\n", has_repeat_digit(12345)); // 0 + printf("has_repeat_digit(12321) = %d\n", has_repeat_digit(12321)); // 1 + printf("is_similar(123, 456) = %d\n", is_similar(123, 456)); // 0 + printf("is_similar(123, 1123) = %d\n", is_similar(123, 1123)); // 0 + printf("is_similar(1231, 3211) = %d\n", is_similar(1231, 3211)); // 1 + printf("has_same_score({0, 1, 2, 3, 4, 5}) = %d\n", has_same_score((int[]){0, 1, 2, 3, 4, 5}, 6)); // 0 + printf("has_same_score({10, 1, 2, 3, 4, 10}) = %d\n", has_same_score((int[]){10, 1, 2, 3, 4, 10}, 6)); // 1 + + return 0; +} + ``` @@ -195,4 +295,29 @@ bool is_similar(int m, int n) { 程序运行结果与示例结果相同,测试通过。 +### 总结 +(1)使用数组来标记数字或分数的出现情况,使得判断重复数字或相同分数的算法更加高效和简洁。 +(2)通过使用函数,可以在不同的地方多次调用相同的功能,提高了代码的重复利用性。 + + +## 问题2:生命的游戏 + +### 1. 问题陈述 + + +### 2. 输入输出描述 + + +### 3. 演算示例 + +### 4. 算法设计 + +(1)算法伪代码 + + +(2)程序代码 + +### 5. 测试 + + ### 总结 \ No newline at end of file -- Gitee From 56e87aebc6c98dc7b6fd766e607eb8322f53ffaf Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Fri, 22 Dec 2023 08:53:28 +0000 Subject: [PATCH 18/39] =?UTF-8?q?=E7=94=9F=E5=91=BD=E7=9A=84=E6=B8=B8?= =?UTF-8?q?=E6=88=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report3.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/report3.md b/report3.md index 4dff69f..b466648 100644 --- a/report3.md +++ b/report3.md @@ -299,25 +299,16 @@ int main(void) { (1)使用数组来标记数字或分数的出现情况,使得判断重复数字或相同分数的算法更加高效和简洁。 (2)通过使用函数,可以在不同的地方多次调用相同的功能,提高了代码的重复利用性。 - ## 问题2:生命的游戏 ### 1. 问题陈述 - ### 2. 输入输出描述 - ### 3. 演算示例 ### 4. 算法设计 -(1)算法伪代码 - - -(2)程序代码 - ### 5. 测试 - ### 总结 \ No newline at end of file -- Gitee From 20d2cf8d7d5cdea5004cd74fa43aaed97292361c Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Fri, 22 Dec 2023 08:57:17 +0000 Subject: [PATCH 19/39] =?UTF-8?q?=E8=BE=93=E5=85=A5=E8=BE=93=E5=87=BA?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report3.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/report3.md b/report3.md index b466648..1514412 100644 --- a/report3.md +++ b/report3.md @@ -303,8 +303,27 @@ int main(void) { ### 1. 问题陈述 +剑桥大学约翰·何顿·康威(John Horton Conway, 1937--2020)教授设计了一个叫做“生命游戏”的计算机程序。 + +Rules of Conways Game of Life + +生命游戏是一个二维网格游戏,这个网格中每个方格居住着一个活着或死了的细胞。一个细胞在下一个时刻的生死取决于相邻 8 个方格中活着或死了的细胞的数量。如果相邻方格活着的细胞数量过多,这个细胞会因为资源匮乏而在下一个时刻死去;相反,如果周围活细胞过少,这个细胞会因为孤单而死去。 + +游戏开始时,每个细胞随机地设定为“生”或“死”之一的某个状态。然后,根据某种规则,计算出下一代每个细胞的状态,画出下一代细胞的生死分布图。 + +生命游戏的规则如下: + +若一个存活细胞周围低于 2 个邻居,则该细胞会死亡(模拟生命数量稀少)。 +若一个存活细胞周围多于 3 个邻居,则该细胞会死亡(模拟生命数量过多)。 +若一个死亡细胞周围有 3 个邻居,则该细胞变成存活状态(模拟繁殖)。 +否则,该细胞保持死或活的状态不变。 +请编程模拟生命游戏。 + ### 2. 输入输出描述 +- 输入:无 +- 输出:打印出初始状态和下一状态的网格 + ### 3. 演算示例 ### 4. 算法设计 -- Gitee From c31d8a42e2fc53c261fea2ef30c941f9083955f2 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Fri, 22 Dec 2023 09:02:41 +0000 Subject: [PATCH 20/39] =?UTF-8?q?=E6=BC=94=E7=AE=97=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report3.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/report3.md b/report3.md index 1514412..4d92814 100644 --- a/report3.md +++ b/report3.md @@ -326,8 +326,39 @@ Rules of Conways Game of Life ### 3. 演算示例 +假设有一个 10x10 的网格,初始状态如下: +``` +* . * . . * . * * * +* . * * * . . . . . +. . . . . . * . * * +* * . . * * * * . . +* . * . . . * * . . +* . * . . . * . * * +* . * . . * . . * * +. . * . * * . . * . +. . * * . . . . * . +* * * * * * . . . . +``` +根据生命游戏的规则,计算出下一代每个细胞的状态,得到如下状态: +``` +. . . . . . . . . . +. . . . . . . . . . +. . . . . . . . . . +. . . . . . . . . . +. . . . . . . . . . +. . . . . . . . . . +. . . . . . . . . . +. . . . . . . . . . +. . . . . . . . . . +. . . . . . +``` ### 4. 算法设计 + + ### 5. 测试 + + + ### 总结 \ No newline at end of file -- Gitee From cb5deb8c051ec6167ef1d118ee218719e8a95991 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Fri, 22 Dec 2023 10:12:43 +0000 Subject: [PATCH 21/39] =?UTF-8?q?=E7=AE=97=E6=B3=95=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report3.md | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/report3.md b/report3.md index 4d92814..c07d393 100644 --- a/report3.md +++ b/report3.md @@ -354,6 +354,110 @@ Rules of Conways Game of Life ``` ### 4. 算法设计 +算法代码 +``` + 初始化一个 ROWS x COLS 的二维网格 grid,随机生成每个细胞的初始状态(0表示死细胞,1表示活细胞)。 + 打印出初始状态的网格。 + 计算下一代每个细胞的状态: + 对于每个细胞,统计它周围八个方向的活细胞数量。 + 根据生命游戏的规则,计算出下一代每个细胞的状态(0表示死细胞,1表示活细胞)。 + 更新网格,将下一代每个细胞的状态写入到原网格中。 + 打印出下一代状态的网格。 +``` +``` +#include +#include +#include + +#define ROWS 20 +#define COLS 20 + +// 初始化一个 ROWS x COLS 的二维网格,随机生成每个细胞的初始状态 +void initializeGrid(int grid[ROWS][COLS]) { + srand(time(0)); + for (int i = 0; i < ROWS; i++) { + for (int j = 0; j < COLS; j++) { + grid[i][j] = rand() % 2; // 0表示死细胞,1表示活细胞 + } + } +} + +// 打印二维网格,展示每个细胞的生死状态 +void printGrid(int grid[ROWS][COLS]) { + for (int i = 0; i < ROWS; i++) { + for (int j = 0; j < COLS; j++) { + if (grid[i][j] == 1) { + printf("* "); // 活细胞用*表示 + } else { + printf(". "); // 死细胞用.表示 + } + } + printf("\n"); + } +} + +// 计算下一代每个细胞的状态 +void calculateNextGeneration(int grid[ROWS][COLS]) { + int neighborCount; + int nextGrid[ROWS][COLS]; + + for (int i = 0; i < ROWS; i++) { + for (int j = 0; j < COLS; j++) { + neighborCount = 0; + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + if (x == 0 && y == 0) { + continue; // 当前细胞不计入邻居数量 + } + if (i + x >= 0 && i + x < ROWS && j + y >= 0 && j + y < COLS) { + neighborCount += grid[i + x][j + y]; + } + } + } + + if (grid[i][j] == 1) { // 活细胞 + if (neighborCount < 2 || neighborCount > 3) { + nextGrid[i][j] = 0; // 死亡 + } else { + nextGrid[i][j] = 1; // 保持活着 + } + } else { // 死细胞 + if (neighborCount == 3) { + nextGrid[i][j] = 1; // 复活 + } else { + nextGrid[i][j] = 0; // 保持死亡 + } + } + } + } + + // 更新网格 + for (int i = 0; i < ROWS; i++) { + for (int j = 0; j < COLS; j++) { + grid[i][j] = nextGrid[i][j]; + } + } +} + +int main() { + int grid[ROWS][COLS]; + + // 初始化网格 + initializeGrid(grid); + + // 循环模拟生命游戏 + for (int generation = 1; generation <= 50; generation++) { + // 打印当前状态的网格 + printf("第 %d 代:\n", generation); + printGrid(grid); + + // 计算下一代每个细胞的状态,并更新网格 + calculateNextGeneration(grid); + } + + return 0; +} +``` ### 5. 测试 -- Gitee From 05cdb1574972485c2795cdf3ceed6e91cb9a62a0 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Fri, 22 Dec 2023 10:20:37 +0000 Subject: [PATCH 22/39] =?UTF-8?q?=E6=80=BB=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report3.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/report3.md b/report3.md index c07d393..88307e3 100644 --- a/report3.md +++ b/report3.md @@ -462,7 +462,10 @@ int main() { ### 5. 测试 +程序运行结果与示例结果相同,测试通过。 +### 总结 -### 总结 \ No newline at end of file +(1) 增加了循环模拟生命游戏的功能,可以模拟多代的生命演化过程,使得程序更加完整和实用。 +(2) 通过修改宏定义的ROWS和COLS,可以轻松调整网格的大小,使得程序具有一定的灵活性和可扩展性。 \ No newline at end of file -- Gitee From f99bb1f05e0ed4b86282d96788bf5d6528365f52 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Fri, 22 Dec 2023 10:49:11 +0000 Subject: [PATCH 23/39] update report4.md. Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report4.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/report4.md b/report4.md index 29b80cf..ca46234 100644 --- a/report4.md +++ b/report4.md @@ -20,3 +20,40 @@ (4)动态数组的应用。 +## 问题:指针典型应用 + +### 1. 问题陈述 + + + + +### 2. 输入输出描述 + + + + + +### 3. 演算示例 + + + + + + +### 4. 算法设计 + + + + + +### 5. 测试 + + + + + + + +### 总结 + + -- Gitee From 367c80fafaa47b7a9a9ecb4bd6d29227e74390ce Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Fri, 22 Dec 2023 10:52:18 +0000 Subject: [PATCH 24/39] =?UTF-8?q?=E9=97=AE=E9=A2=98=E9=99=88=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report4.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/report4.md b/report4.md index ca46234..8b135e9 100644 --- a/report4.md +++ b/report4.md @@ -24,7 +24,21 @@ ### 1. 问题陈述 +(1)指针访问数组元素 +不用下标而用指针实现数组清零、数组输入和数组输出。 + +(2)指针做函数参数 + +用指针做函数参数可以实现交换两个元素、找数组最大和最小值等功能。 + +(3)返回指针 + +利用指针返回两个数中的最大值或最小值。 + +(4)字符串 + +利用指针和尽可能少的语句实现求字符串长度、复制字符串、字符串连接、字符串比较。 ### 2. 输入输出描述 -- Gitee From 5103d4d36847ff8e4ad8a3e8e3774bbb8516c544 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Fri, 22 Dec 2023 11:28:19 +0000 Subject: [PATCH 25/39] =?UTF-8?q?=E8=BE=93=E5=85=A5=E8=BE=93=E5=87=BA?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report4.md | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/report4.md b/report4.md index 8b135e9..227a014 100644 --- a/report4.md +++ b/report4.md @@ -43,8 +43,74 @@ ### 2. 输入输出描述 +1)指针访问数组元素 +数组清零: +- 输入:数组 a[n] + +- 输出: 数组 a[n] 元素已清零 + +数组输入: + +- 输入:数组 a[n] +- 输出: 数组 a[n] 中保存的输入的n个数 + + +数组输出: + +- 输入:数组 a[n] +- 输出: 显示数组 a[n] 中的元素 + +(2)指针做函数参数 + +用指针交换两个元素: + +- 输入:指向两个元素的指针 +- 输出: 交换后的两个元素 + +用指针找数组最大和最小值: + +- 输入:数组 a[n] 及两个指针,分别指向保存最大值和最小值的变量 +- 输出: 数组 a[n] 的最大值和最小值保存到指定的变量 + +(3)返回指针 + +用指针返回两个数中的最大值: + +- 输入:两个指针,分别指向两个变量 +- 输出: 指向最大值的指针 + +用指针返回两个数中的最小值: + +- 输入:两个指针,分别指向两个变量 +- 输出: 指向最小值的指针 + + +(4)字符串 + +求字符串长度: + +- 输入:字符串 +- 输出: 字符串的长度 + + +复制字符串: + +- 输入:目标字符串 t 和源字符串 s +- 输出: 复制后的目标字符串 t + + +字符串连接: + +- 输入:目标字符串 t 和源字符串 s +- 输出: 连接后的目标字符串 t + + +字符串比较: + +- 输入:两个字符串是 s 和 t +- 输出: 若字符串 s < t,则返回负整数,若字符串 s > t,则返回正整数,若字符串 s == t,则返回0 ### 3. 演算示例 -- Gitee From ed2593c56c4f420d3aed5d558d0d7044b5634bd4 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Fri, 22 Dec 2023 11:47:24 +0000 Subject: [PATCH 26/39] =?UTF-8?q?=E6=BC=94=E7=AE=97=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report4.md | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/report4.md b/report4.md index 227a014..d7f211d 100644 --- a/report4.md +++ b/report4.md @@ -110,14 +110,43 @@ 字符串比较: - 输入:两个字符串是 s 和 t -- 输出: 若字符串 s < t,则返回负整数,若字符串 s > t,则返回正整数,若字符串 s == t,则返回0 +- 输出: 若字符串 s < t,则返回负整数,若字符串 s > t,则返回正整数,若字符串 s == t,则返回 0 ### 3. 演算示例 +(1)指针访问数组元素 + +数组清零:给定数组 a[10] ,清零后数组元素均为 0 。 + +数组输入:给定数组 a[10] ,输入1 2 3 4 5 6 7 8 9 0。输入完成后数组a中的元素依次为1 2 3 4 5 6 7 8 9 0。 + +数组输出:给定数组 a[10] ,其中元素依次为1 2 3 4 5 6 7 8 9 0。则输出1 2 3 4 5 6 7 8 9 0。 + +(2)指针做函数参数 + +用指针实现交换两个元素:设变量 x = 3,y = 5,用指针交换两个元素,交换后x = 5,y = 3。 + + +用指针找数组最大和最小值:给定数组a[10] = {2, 7, 1, 8, 2, 8, 4, 5, 9, 0},以及用于保存最大值和最小值的变量max和min,用指针在数组a中寻找最大值和最小值,结果分别保存在变量max和min中,结果max = 9,min = 0。 + +(3)返回指针 + +利用指针返回两个数中的最大值:给定变量 x = 3,y = 5,将其地址作为函数的输入参数,得到指向最大值 y = 5 的指针。 + +利用指针返回两个数中的最小值:给定变量x = 3,y = 5,将其地址作为函数的输入参数,得到指向最小值 x = 3 的指针。 + +(4)字符串 + +求字符串长度:求字符串 “Hello” 的长度,结果为5,求字符串“”的长度,结果为 0。 + +复制字符串:设字符串 s = “Hello” ,复制到字符数组t中,则t = “Hello”。 +字符串连接:设字符串 t = “Hello”,连接字符串“world”以后,结果t = “Hello world”。 +字符串比较:比较给定字符串 “abc” 和 “” ,比较结果大于零;比较给定字符串 “Abc” 和 “abc”,比较结果小于零; +比较给定字符串 “Abc” 和 “Abc” ,比较结果等于 0。 ### 4. 算法设计 -- Gitee From 478c245b6aef0cdf4f3add2dee8f96512de7f418 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Fri, 22 Dec 2023 13:43:53 +0000 Subject: [PATCH 27/39] =?UTF-8?q?=E8=BF=94=E5=9B=9E=E6=8C=87=E9=92=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report4.md | 189 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 188 insertions(+), 1 deletion(-) diff --git a/report4.md b/report4.md index d7f211d..df42939 100644 --- a/report4.md +++ b/report4.md @@ -43,7 +43,7 @@ ### 2. 输入输出描述 -1)指针访问数组元素 +(1)指针访问数组元素 数组清零: @@ -151,6 +151,193 @@ ### 4. 算法设计 +(1)指针访问数组元素 + +不用下标而用指针实现数组清零、数组输入和数组输出。 +数组清零 +伪代码: +``` +// 将数组 a 中 n 个元素全部清零 +FUNCTION zeros(a[], n) +输入:数组a[n] +输出:数组a[n]元素已清零 +FOR i=0. .n-1 DO a[i] = 0 +END FOR +END FUNCTION + +// 输入数组 a 中 n 个元素 + FUNCTION input(a[], n) +输入:数组a[n] +输出:数组a[n]中保存的输入的n个数 +FOR i=0. .n-1 DO +Read a[i] = 0 +END FOR +END FUNCTION + +// 输出数组 a 中 n 个元素 + FUNCTION print( a[], n) +输入:数组a[n] +输出:显示数组a[n]中的元素 +FOR i=0. .n-1 DO +Print a[i] = 0 +END FOR +END FUNCTION +``` + +程序代码: +```c +#include // 将数组 a 中 n 个元素全部清零 +void zeros(int a[], int n); +// 输入数组 a 中 n 个元素 +void input(int a[], int n); +// 输出数组 a 中 n 个元素 +void print(int a[], int n); +int main(void) { + int a[10]; + // 清零后打印 + zeros(a, 10); + print(a, 10); + // 输入后打印 + printf("Enter 10 integer numbers: "); + input(a, 10); + print(a, 10); + return 0; +} +void zeros(int a[], int n) { + for (int i = 0; i < n; i++) + a[i] = 0; +} +void input(int a[], int n) { + for (int i = 0; i < n; i++) + scanf("%d", &a[i]); +} +void print(int a[], int n) { + for (int i = 0; i < n; i++) + printf("%d ", a[i]); +} +``` +(2)指针做函数参数 + +用指针做函数参数可以实现交换两个元素、找数组最大和最小值等功能。 +伪代码: +``` +// 交换指针 a、b 指向的两个元素的值 +FUNCTION swap(a, b) +输入:指向两个元素的指针 +输出:交换后的两个元素 +t=a +a=b +b=t +END FUNCTION// 找出数组 a[n] 中的最大元素和最小元素,并分别保存到指针 max 和 min 指向的变量中 +function max_min(array, max_ptr, min_ptr) +输入:数组a[n]及两个指针,分别指向保存最大值和最小值的变量 +输出:数组a[n]的最大值和最小值保存到指定的变量 + max_val = array[0] + min_val = array[0] + for i from 1 to length(array) - 1: + if array[i] > max_val: + max_val = array[i] + max_ptr = &array[i] + elif array[i] < min_val: + min_val = array[i] + min_ptr = &array[i] +returnend functionfunction + +``` +程序代码 + +```c + +#include + +void swap(int *a, int *b); +void max_min(int a[], int n, int *max, int *min); + +int main(void) +{ + int x = 3, y = 5; + printf("Before swap: x = %d, y = %d\n", x, y); + swap(&x, &y); + printf("After swap: x = %d, y = %d\n", x, y); + + int a[10] = {2, 7, 1, 8, 2, 8, 4, 5, 9, 0}; + int max, min; + max_min(a, 10, &max, &min); + printf("max = %d, min = %d\n", max, min); + + return 0; +} + +void swap(int *a, int *b) +{ + int t; + t = *a; + *a = *b; + *b = t; +} + +void max_min(int a[], int n, int *max, int *min) +{ + *max = a[0]; + for (int i = 0; i < n; i++) + { + if (a[i] > *max) + { + *max = a[i]; + } + } + *min = a[0]; + for (int i = 0; i < n; i++) + { + if (a[i] < *min) + { + *min = a[i]; + } + } +} +``` +(3)返回指针 + +利用指针返回两个数中的最大值或最小值。 + +``` +// 求两个数中的最大值 +程序代码 +``` +#include +int *max(int *a, int *b); // 求两个数中的最大值 +int *min(int *a, int *b); // 求两个数中的最小值 +int main(void) { + int x = 3, y = 5; + int *pmax = max(&x, &y); + int *pmin = min(&x, &y); + printf("max = %d, min = %d", *pmax, *pmin); + return 0; +} +// 求两个数中的最大值 +int *max(int *a, int *b) { + if (*a > *b) { + return a; + } else { + return b; + } +} +// 求两个数中的最小值 +int *min(int *a, int *b) { + if (*a < *b) { + return a; + } else { + return b; + } +} +``` +(4)字符串 +用指针处理字符串是最方便的,请利用指针和尽可能少的语句实现求字符串长度、复制字符串、字符串连接、字符串比较。 +伪代码: + + + + -- Gitee From 4d1317d4674e6cb90ae839f2f57634fc03ec23c0 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Sat, 23 Dec 2023 05:39:41 +0000 Subject: [PATCH 28/39] =?UTF-8?q?=E6=8C=87=E9=92=88=E5=85=B8=E5=9E=8B?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E9=97=AE=E9=A2=984?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report4.md | 312 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 218 insertions(+), 94 deletions(-) diff --git a/report4.md b/report4.md index df42939..46a3a34 100644 --- a/report4.md +++ b/report4.md @@ -157,32 +157,32 @@ 数组清零 伪代码: ``` -// 将数组 a 中 n 个元素全部清零 +// 清空数组a中的n个元素 FUNCTION zeros(a[], n) 输入:数组a[n] -输出:数组a[n]元素已清零 -FOR i=0. .n-1 DO a[i] = 0 +输出:数组a[n]中的元素已清空 +FOR i=0 TO n-1 DO +a[i] = 0 END FOR END FUNCTION -// 输入数组 a 中 n 个元素 - FUNCTION input(a[], n) +// 输入n个元素到数组a中 +FUNCTION input(a[], n) 输入:数组a[n] -输出:数组a[n]中保存的输入的n个数 -FOR i=0. .n-1 DO -Read a[i] = 0 +输出:数组a[n]中保存的n个输入数 +FOR i=0 TO n-1 DO +Read a[i] END FOR END FUNCTION -// 输出数组 a 中 n 个元素 - FUNCTION print( a[], n) +// 输出数组a中的n个元素 +FUNCTION print(a[], n) 输入:数组a[n] 输出:显示数组a[n]中的元素 -FOR i=0. .n-1 DO -Print a[i] = 0 +FOR i=0 TO n-1 DO +Print a[i] END FOR END FUNCTION -``` 程序代码: ```c @@ -221,135 +221,259 @@ void print(int a[], int n) { 用指针做函数参数可以实现交换两个元素、找数组最大和最小值等功能。 伪代码: ``` -// 交换指针 a、b 指向的两个元素的值 +//用指针交换两个元素 FUNCTION swap(a, b) -输入:指向两个元素的指针 -输出:交换后的两个元素 -t=a -a=b -b=t -END FUNCTION// 找出数组 a[n] 中的最大元素和最小元素,并分别保存到指针 max 和 min 指向的变量中 -function max_min(array, max_ptr, min_ptr) -输入:数组a[n]及两个指针,分别指向保存最大值和最小值的变量 -输出:数组a[n]的最大值和最小值保存到指定的变量 - max_val = array[0] - min_val = array[0] - for i from 1 to length(array) - 1: - if array[i] > max_val: - max_val = array[i] - max_ptr = &array[i] - elif array[i] < min_val: - min_val = array[i] - min_ptr = &array[i] -returnend functionfunction + 输入:指向两个元素的指针 + 输出: 交换后的两个元素 + temp = a + a = b + b = temp +END FUNCTION + +//用指针找数组最大和最小值 +FUNCTION max_min(a, n, max, min) +输入:数组 a[n] 及两个指针,分别指向保存最大值和最小值的变量 +输出: 数组 a[n] 的最大值和最小值保存到指定的变量 + max = a[0] + min = a[0] + FOR i FROM 1 TO n-1 + IF a[i] > max + max = a[i] + END IF + IF a[i] < min + min = a[i] + END IF + END FOR +END FUNCTION + ``` 程序代码 ```c - #include -void swap(int *a, int *b); -void max_min(int a[], int n, int *max, int *min); +// 交换指针 a、b 指向的两个元素的值 +void swap(int *a, int *b) { + int temp = *a; + *a = *b; + *b = temp; +} + +// 找出数组 a[n] 中的最大元素和最小元素,并分别保存到指针 max 和 min 指向的变量中 +void max_min(int a[], int n, int *max, int *min) { + int i; + *max = *min = a[0]; + for (i = 1; i < n; i++) { + if (a[i] > *max) { + *max = a[i]; + } + if (a[i] < *min) { + *min = a[i]; + } + } +} -int main(void) -{ +int main(void) { + // 交换元素 int x = 3, y = 5; printf("Before swap: x = %d, y = %d\n", x, y); swap(&x, &y); printf("After swap: x = %d, y = %d\n", x, y); - + + // 求最大最小值 int a[10] = {2, 7, 1, 8, 2, 8, 4, 5, 9, 0}; int max, min; max_min(a, 10, &max, &min); printf("max = %d, min = %d\n", max, min); - + return 0; } -void swap(int *a, int *b) -{ - int t; - t = *a; - *a = *b; - *b = t; -} -void max_min(int a[], int n, int *max, int *min) -{ - *max = a[0]; - for (int i = 0; i < n; i++) - { - if (a[i] > *max) - { - *max = a[i]; - } - } - *min = a[0]; - for (int i = 0; i < n; i++) - { - if (a[i] < *min) - { - *min = a[i]; - } - } -} ``` (3)返回指针 利用指针返回两个数中的最大值或最小值。 ``` -// 求两个数中的最大值 -程序代码 +//用指针返回两个数中的最大值 + + 输入:两个指针,分别指向两个变量 + 输出: 指向最大值的指针 +FUNCTION max(a, b) + IF a > b + RETURN a + ELSE + RETURN b + END IF +END FUNCTION +//用指针返回两个数中的最小值 +FUNCTION min(a, b) + 输入:两个指针,分别指向两个变量 + 输出: 指向最小值的指针 + IF a < b + RETURN a + ELSE + RETURN b + END IF +END FUNCTION + + ``` -#include -int *max(int *a, int *b); // 求两个数中的最大值 -int *min(int *a, int *b); // 求两个数中的最小值 -int main(void) { - int x = 3, y = 5; - int *pmax = max(&x, &y); - int *pmin = min(&x, &y); - printf("max = %d, min = %d", *pmax, *pmin); - return 0; -} +程序代码 +```c +#include + // 求两个数中的最大值 int *max(int *a, int *b) { - if (*a > *b) { - return a; - } else { - return b; - } + if (*a > *b) { + return a; + } else { + return b; + } } + // 求两个数中的最小值 int *min(int *a, int *b) { - if (*a < *b) { - return a; - } else { - return b; - } + if (*a < *b) { + return a; + } else { + return b; + } +} + +int main(void) { + int x = 3, y = 5; + int *pmax = max(&x, &y); + int *pmin = min(&x, &y); + printf("max = %d, min = %d\n", *pmax, *pmin); + return 0; } + + ``` (4)字符串 用指针处理字符串是最方便的,请利用指针和尽可能少的语句实现求字符串长度、复制字符串、字符串连接、字符串比较。 伪代码: +``` +//求字符串长度 +FUNCTION mystrlen(s) + 输入:字符串 + 输出: 字符串的长度 + len = 0 + WHILE s[len] 不是字符串结束符 '\0' + len = len + 1 + END WHILE + RETURN len +END FUNCTION +//复制字符串 +FUNCTION mystrcpy(t, s) + 输入:目标字符串 t 和源字符串 s + 输出: 复制后的目标字符串 t + p = t + WHILE s 没有结束 + t = s + t = t + 1 + s = s + 1 + END WHILE + t = 字符串结束符 '\0' + RETURN p +END FUNCTION +//字符串连接 +FUNCTION mystrcat(t, s) + 输入:目标字符串 t 和源字符串 s + 输出: 连接后的目标字符串 t + p = t + WHILE t 没有结束 + t = t + 1 + END WHILE + WHILE s 没有结束 + t = s + t = t + 1 + s = s + 1 + END WHILE + t = 字符串结束符 '\0' + RETURN p +END FUNCTION +//字符串比较 +FUNCTION mystrcmp(s, t) + 输入:两个字符串是 s 和 t + 输出: 若字符串 s < t,则返回负整数,若字符串 s > t,则返回正整数,若字符串 s == t,则返回 0 + WHILE s 和 t 相等 且 s 不是字符串结束符 '\0' + s = s + 1 + t = t + 1 + END WHILE + RETURN s - t +END FUNCTION +``` +程序代码 +```c +#include +// 求字符串 s 的长度 +int mystrlen(const char *s) { + int len = 0; + while (*s != '\0') { + len++; + s++; + } + return len; +} +// 将字符串 s 复制到字符数组 t 中,返回复制后的字符串 +char *mystrcpy(char *t, const char *s) { + char *p = t; + while (*s != '\0') { + *t++ = *s++; + } + *t = '\0'; + return p; +} +// 将字符串 s 连接到字符串 t 之后,返回连接后的字符串 +char *mystrcat(char *t, const char *s) { + char *p = t; + while (*t != '\0') { + t++; + } + while (*s != '\0') { + *t++ = *s++; + } + *t = '\0'; + return p; +} +// 比较字符串 s 和 t,返回正、负和零分别表示串 s>t、s 0); // 1 + printf("%d\n", mystrcmp("Abc", "abc") < 0); // 1 + printf("%d\n", mystrcmp("Abc", "Abc") == 0); // 1 + return 0; +} +``` +### 5. 测试 + 程序运行结果与示例结果相同,测试通过。 ### 总结 - - +(1)指针作为返回值可以使得函数结果以指针形式返回,从而可以在其他函数中进一步处理,增强了代码的可重用性。 +(2)使用指针可以避免在函数间传递数据时出现数据不一致或错误的情况。 -- Gitee From 0b0debb7f3f2e87ba46e328b78ed349fddeb9bf9 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Sat, 23 Dec 2023 05:41:09 +0000 Subject: [PATCH 29/39] =?UTF-8?q?=E6=94=B9=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report4.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/report4.md b/report4.md index 46a3a34..ca57e10 100644 --- a/report4.md +++ b/report4.md @@ -183,7 +183,7 @@ FOR i=0 TO n-1 DO Print a[i] END FOR END FUNCTION - +``` 程序代码: ```c #include // 将数组 a 中 n 个元素全部清零 @@ -468,7 +468,6 @@ int main(void) { return 0; } - ``` ### 5. 测试 -- Gitee From b2ba47acc714894430f529f1a4efd94fbad9cc3b Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Sat, 23 Dec 2023 06:08:35 +0000 Subject: [PATCH 30/39] =?UTF-8?q?=E5=AE=9E=E9=AA=8C=E8=A6=81=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report5.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/report5.md b/report5.md index 0d69c6e..9b84763 100644 --- a/report5.md +++ b/report5.md @@ -12,3 +12,7 @@ 利用C语言三种基本控制结构、函数、结构体、数组、指针、文件等知识设计实现一个简单信息管理类系统,能实现主要功能,并具备一定的实用性、可靠性。 + + + +shi -- Gitee From 505fb63bb0033802e197eec1d850547747db1a81 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Sat, 23 Dec 2023 06:30:35 +0000 Subject: [PATCH 31/39] =?UTF-8?q?=E8=BE=93=E5=85=A5=E8=BE=93=E5=87=BA?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report5.md | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/report5.md b/report5.md index 9b84763..53f28d8 100644 --- a/report5.md +++ b/report5.md @@ -14,5 +14,50 @@ +##问题1:统计学生代码行数 + +老师收集了本学期所有学生提交的程序设计作业源代码共 7803 个文件(存储在压缩文件 codes.zip +中),其中,每个源码文件名的前 10 个字符对应一个学生的学号。现在需要你编写程序统计每个学生编 +写了多少行代码、共多少字节。 + +### 1.问题陈述 + +根据 7803 个程序源文件统计出每个学生编写代码行数和字节数。 +为设计和求解方便,将整个问题划分成下面两个子问题分别编写程序: +- (1)统计若干文件的行数和字节数; +- (2)根据所有文件的统计结果累加计算每个学生的总代码行数和字节数。 +程序 P1 逐个统计文件,其输出结果作为程序 P2 的输入,最终得到每个学生的统计结果。 + +### 2.输入输出描述 + +(1)统计若干文件的行数和字节数 + +- 输入:若干文件名。 +- 输出:每个文件的行数和字节数;文件找不到时给出提示。 + +(2)根据所有文件的统计结果累加计算每个学生的总代码行数和字节数 + +- 输入:若干文件和行数和字节数统计结果。 +- 输出:每个学生的总代码行数和字节数。 + + +### 3.演算示例 + + + +### 4.算法设计 + + + + + +### 5.测试 + + + + + + +### 总结 + -shi -- Gitee From 6263a44bd884d9af5cbaedebd35d4f2820253bd3 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Sat, 23 Dec 2023 07:11:18 +0000 Subject: [PATCH 32/39] =?UTF-8?q?=E6=BC=94=E7=AE=97=E7=A4=BA=E4=BE=8B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report5.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/report5.md b/report5.md index 53f28d8..6a12d99 100644 --- a/report5.md +++ b/report5.md @@ -43,7 +43,37 @@ ### 3.演算示例 +(1)统计若干文件的行数和字节数 + +程序依次打开每个文件,从文件中逐个读入字符,同时统计字符个数,并根据换行符的个数计算出文件行数。 +由于待处理的文件可能数量众多,手动输入文件名费时费力。因为,为运行方便,待统计文件名以主程序参数的形式给出。假设程序 P1 对应的可执行程序名为 ln.exe ,则可以按以下方式执行程序统计 3 个文件: + +`.\ln file1.txt file2.txt file3.txt` + +假设文件`file`内容为空;文件`file2`中包含一行文字: + +`hello world` + +文件`file3`内容包含 2 行文字和 1 个空行: + +first +second + +则以上程序的执行结果是: + +``` +0 line(s) 0 byte(s) in file1.txt +1 line(s) 11 byte(s) in file2.txt +3 line(s) 13 byte(s) in file3.txt +``` +其中文件行数的统计的方法是:若文件为空,则为 0 行,否则,若文件不空,则行数按换行符个数加 1 计算。 +以主函数参数的形式给出文件名还有一个好处,就是可以利用操作系统的提供的便利处理大量文件。假设待统计的文件已经保存在 codes 文件夹下,则可以用 codes\*.c 表示该文件夹下所有以 .c 为扩展名的文件。要统计这些文件的行数和字节数,只需执行以下命令: + +`.\ln codes\*.c` + +即使是数千个文件,也能自动逐一处理,无需输入任何一个具体的文件名。如果程序找不到文件,如: file0.txt ,则执行 .\ln file0.txt 时应给出错误提示: +`file0.txt: No such file` ### 4.算法设计 -- Gitee From 28c56a79e124c5efe3b80459e5bbd8c0df4fc196 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Sat, 23 Dec 2023 07:43:18 +0000 Subject: [PATCH 33/39] =?UTF-8?q?=E6=BC=94=E7=AE=97=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report5.md | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/report5.md b/report5.md index 6a12d99..ea881b0 100644 --- a/report5.md +++ b/report5.md @@ -24,8 +24,8 @@ 根据 7803 个程序源文件统计出每个学生编写代码行数和字节数。 为设计和求解方便,将整个问题划分成下面两个子问题分别编写程序: -- (1)统计若干文件的行数和字节数; -- (2)根据所有文件的统计结果累加计算每个学生的总代码行数和字节数。 +- (P1)统计若干文件的行数和字节数; +- (P2)根据所有文件的统计结果累加计算每个学生的总代码行数和字节数。 程序 P1 逐个统计文件,其输出结果作为程序 P2 的输入,最终得到每个学生的统计结果。 ### 2.输入输出描述 @@ -74,6 +74,23 @@ second 即使是数千个文件,也能自动逐一处理,无需输入任何一个具体的文件名。如果程序找不到文件,如: file0.txt ,则执行 .\ln file0.txt 时应给出错误提示: `file0.txt: No such file` +为避免接下来使用程序 P2 统计结果时遇到错误,在执行程序 P1 时应避免出现文件找不到的情况。(P2)根据所有文件的统计结果累加计算每个学生的总代码行数和字节,程序 P2 在程序 P1 统计输出结果的基础上,根据文件名中包含的学生学号,分别统计出每个学生的代码行数和字节数。 + +假设 P1 输出结果为: + +``` +6 line(s) 64 byte(s) in codes\2114110301_xxxx.c +13 line(s) 159 byte(s) in codes\2114110302_xxxx.c +20 line(s) 254 byte(s) in codes\2114110301_xxxx.c + +``` +则程序 P2 按不同学号分别累计后输出结果是: + +``` +2114110301 26 318 +2114110302 13 159 + +``` ### 4.算法设计 -- Gitee From 3ed1a271346bbb973078f820bcd6d9350571a614 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Sat, 23 Dec 2023 09:19:40 +0000 Subject: [PATCH 34/39] =?UTF-8?q?=E7=AE=97=E6=B3=95=E8=AE=BE=E8=AE=A11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report5.md | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/report5.md b/report5.md index ea881b0..42d5f80 100644 --- a/report5.md +++ b/report5.md @@ -94,6 +94,71 @@ second ### 4.算法设计 +(P1)统计若干文件的行数和字节数 +算法总体描述: + +``` +FOR EACH 文件名 IN 文件名列表 +统计一个文件的行数和字节数 +END FOR + +``` +文件名列表是以主程序参数的形式给出的,即`int main(int argc, char *argv[])`,其中`argv[1..argc-1]`对应每个文件的文件名。在已知文件名的情况下,可以直接打开文件,然后统计行数和字节数,最后关闭文件。当然,如果打开文件失败,则提示文件找不到。 + +细化算法描述: + +``` +FOR i = 1..argc-1 DO +// 统计一个文件的行数和字节数 +打开名为 argv[i] 的文件 f +IF 打开文件失败 THEN +Print "{argv[i]}: No such file" +ELSE +统计文件 f 的行数和字节数 +显示统计结果 +关闭文件 +END IF +END FOR + +``` +在文件已打开的情况下,要统计其行数和字节数,只要逐个读取文件中的字符并统计即可,这里分别统计字符个数和换行符个数。若文件为空,则行数为 0,否则,行数按换行符个数加 1 计算。 +注:这里不严格区分字节和字符的区别。对于英文字符来说,一个字符对应一个字节,而一个汉字字符 +可能对应两个字节。 +因此,细化后算法的完整描述如下: + +``` +for i = 1..argc-1 do +open file f named argv[i] +if file opening fails then +print "{argv[i]}: No such file" +else +// 统计文件 f 的行数和字节数 +bytes = 0 +lines = 0 +while read ch from file f do +bytes = bytes + 1 +if ch == '\n' then +lines = lines + 1 +end if +end while +if bytes > 0 then +lines = lines + 1 +end if +// 显示统计结果 +print "{lines} line(s) {bytes} byte(s) in {argv[i]}" +// 关闭文件 +close file f +end if +end for + +``` + + + + + + + -- Gitee From 44a149517d2aab872b593aace366669f01ce07f4 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Sat, 23 Dec 2023 12:19:56 +0000 Subject: [PATCH 35/39] =?UTF-8?q?=E7=AE=97=E6=B3=95=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report5.md | 122 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 105 insertions(+), 17 deletions(-) diff --git a/report5.md b/report5.md index 42d5f80..9347f7a 100644 --- a/report5.md +++ b/report5.md @@ -127,45 +127,133 @@ END FOR 因此,细化后算法的完整描述如下: ``` -for i = 1..argc-1 do -open file f named argv[i] -if file opening fails then -print "{argv[i]}: No such file" -else +FOR i = 1..argc-1 DO +打开名为 argv[i] 的文件 f +IF 打开文件失败 THEN +Print "{argv[i]}: No such file" +ELSE // 统计文件 f 的行数和字节数 bytes = 0 lines = 0 -while read ch from file f do +WHILE read ch from file f DO bytes = bytes + 1 -if ch == '\n' then +IF ch == '\n' THEN lines = lines + 1 -end if -end while -if bytes > 0 then +END IF +END WHILE +IF bytes > 0 THEN lines = lines + 1 -end if +END IF // 显示统计结果 -print "{lines} line(s) {bytes} byte(s) in {argv[i]}" +Print "{lines} line(s) {bytes} byte(s) in {argv[i]}" // 关闭文件 -close file f -end if -end for +Close file f +END IF +END FOR ``` +程序代码: +``` +// file: ln.c +// +// 统计文本文件的行数和字节数 +#include +int main(int argc, const char* argv[]) +{ +// 统计若干文件的行数和字节数 +for (int i = 1; i < argc; i++) { +int bytes = 0; +int lines = 0; +int ch; +FILE* f; +// 统计一个文件的行数和字节数 +if ((f = fopen(argv[i], "r")) == NULL) + { +printf("%s: No such file\n", argv[i]); +} + else { +// 统计文件 f 的行数和字节数 +while ((ch = fgetc(f)) != EOF) { + bytes++; +if (ch == '\n') + lines++; +} +if (bytes > 0) +lines++; +// 显示统计结果 +printf("%d line(s) %d byte(s) in %s\n", lines, bytes, argv[i]); +// 关闭文件 +fclose(f); + } +} + return 0; +} +``` +(P2)根据所有文件的统计结果累加计算每个学生的总代码行数和字节数 +程序 P2 以程序 P1 的输出作为输入,按学生学号分别统计每个学生的总代码行数和总字节数。只需要根 +据程序 P1 输出结果的格式特点,从中读取所需要的行数、字节数并累计。 +算法总体思路: +``` +逐行读取统计结果并按学号并累计 +输出每个学生的总代码行数和字节数 +``` +细化: +``` +初始化每个学生的总代码行数 total_lines[MAX_SNO + 1] = 0 +初始化每个学生的总字节数 total_bytes[MAX_SNO + 1] = 0 +WHILE 从一行输入中读出行数 lines、字节数 bytes 和学号 sno DO +index = sno - SNO_BASE // 将学号转换成数组下标 +total_lines[index] += lines +total_bytes[index] += bytes +END WHILE +输出每个学生的总代码行数和字节数 +``` +程序 P1 典型的一行输出结果如下: +`20 line(s) 254 byte(s) in codes\2114110301_xxxx.c` +所以,从一行输入中读出行数 lines、字节数 bytes 和学号 sno 可以采用下面的方法实现: +`scanf("%d %*s %d %*s in codes\%d%*s", &lines, &bytes, &sno)` +其中`%*s`可以读取对应的字符串但不会赋值给变量,用于跳过我们不感兴趣的输入内容。 +程序代码如下: -### 5.测试 - +``` +// file: loc.c +// +// 统计每个学生编写的代码行数 +#include +#define MAX_SNO 38 +#define SNO_BASE 2114110300 + int main(void) + { +int total_lines[MAX_SNO + 1] = {0}; // 每个学生代码行数 +int total_bytes[MAX_SNO + 1] = {0}; // +int lines; +int bytes; +int sno; +// 逐行读取统计结果并按学号并累计 +while (scanf("%d %*s %d %*s %*s codes\\%d%*s", &lines, &bytes, &sno) == 3) { +int index = sno - SNO_BASE; +total_lines[index] += lines; +total_bytes[index] += bytes; + } +// 输出每个学生的总代码行数和字节数 +for (int i = 1; i <= MAX_SNO; i++) +printf("%d %5d %8d\n", SNO_BASE + i, total_lines[i], total_bytes[i]); +return 0; + } + +``` +### 5.测试 -- Gitee From fe879780321f61b10166b9e69bd4966d2709388b Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Sat, 23 Dec 2023 12:21:39 +0000 Subject: [PATCH 36/39] =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/report5.md b/report5.md index 9347f7a..8460bbd 100644 --- a/report5.md +++ b/report5.md @@ -255,7 +255,7 @@ return 0; ### 5.测试 - +程序运行结果与示例结果相同,测试通过。 ### 总结 -- Gitee From aa910e25f25d4749e5c85bc1d99af64b59c02b26 Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Sun, 24 Dec 2023 06:27:37 +0000 Subject: [PATCH 37/39] =?UTF-8?q?=E6=80=BB=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report5.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/report5.md b/report5.md index 8460bbd..384f0ec 100644 --- a/report5.md +++ b/report5.md @@ -260,4 +260,6 @@ return 0; ### 总结 +(1)通过将数据保存到文件中,数据可以在不同的时间点进行读取和写入,而不仅仅局限于程序运行时。 +(2)将数据保存到文件中可以保护数据不受程序关闭的影响。 -- Gitee From 8dd10d54bf2db1edf0c02d2a0de61e8ce1e0e4ae Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Sun, 24 Dec 2023 07:05:11 +0000 Subject: [PATCH 38/39] =?UTF-8?q?=E4=BB=8E=E8=BF=99=E5=88=86=E6=94=AF?= =?UTF-8?q?=E6=94=B9=E4=BA=86=E4=B8=80=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report1.md | 178 +++++++++++++++++++++++++++++------------------------ 1 file changed, 96 insertions(+), 82 deletions(-) diff --git a/report1.md b/report1.md index 87e6cf9..e17876f 100644 --- a/report1.md +++ b/report1.md @@ -177,16 +177,21 @@ int main(void) ### 3. 演算示例 +假设我们输入的N为5: -输入示例:10 -输出示例:1534 -解释:假设第一天摘得桃子总数为x,根据题意有: -·第2天剩下的桃子数量为x/2-1,即(x-2)/2; -·第3天剩下的桃子数量为(x-2)/2/2-1,即(x-4)/2/2; -·... -·第N天剩下的桃子数量为1,(x/(2^(N-1))-1)。 +1. 首先,我们输入N=5。 +2. 程序初始化第5天剩下的桃子数量为1。 +3. 进入循环,从第4天开始向前推算: + - 第4天的桃子数量 = (1+1) * 2 = 4 + - 第3天的桃子数量 = (4+1) * 2 = 10 + - 第2天的桃子数量 = (10+1) * 2 = 22 + - 第1天的桃子数量 = (22+1) * 2 = 46 +4. 输出第一天共摘了46个桃子。 + +因此,根据输入N=5,程序输出第一天共摘了46个桃子。 ### 4. 算法设计 + 算法总体描述: ``` Step 1.初始化变量 @@ -195,31 +200,40 @@ Step 3.打印第一天摘得桃子数量 ``` 算法完整描述: ``` -//Step 1.初始化变量 -初始化桃子数量total为0 -初始化天数N为0 -//Step 2.输入天数,根据公式计算桃子数量 -输入天数 N -FOR 定义1|当第1天到第N天停止 -天数不断递增 -将前一天的桃子数量total加1后乘以2累加到总桃子数量totle中 -ENDFOR -//Step 3.输出第一天的桃子数量并打印 +FUNCTION calculate_total_peaches(N) + INPUT: 正整数 N + OUTPUT: 第一天共摘了多少个桃子 + + total = 1 // 初始化第N天剩下的桃子数量为1 + + FOR day FROM N-1 DOWNTO 1 DO // 从第N-1天向第1天遍历 + total = (total + 1) * 2 // 计算前一天剩下的桃子数量 + END FOR + + RETURN total // 输出第一天共摘了多少个桃子 +END FUNCTION + ``` 程序代码: ```c #include -int main() -{ - int n,x = 1; - scanf("%d",&n);//初始值为1 - for(int i = n; i > 1; i--){ - x = (x + 1) * 2;//第i天剩下的桃子数量 + +int main() { + int N; + scanf("%d", &N); // 读取输入的N + + int total = 1; // 初始化第N天剩下的桃子数量为1 + + for (int day = N - 1; day > 0; day--) { // 从第N-1天开始向前推算 + total = (total + 1) * 2; // 根据题目描述,计算前一天的桃子数量 } - printf("%d",x); + + printf("%d", total); // 输出第一天共摘了多少个桃子 + return 0; - } +} + ``` ### 5. 测试 @@ -230,12 +244,12 @@ int main() ### 小结 -·本题需要倒退求解第一天摘得的=桃子的总数量,可以使用循环实现。 -·在循环中,需要根据题意推到出第i天剩下的桃子数量与第i+1天剩下的桃子数量之间的关系。 -·根据推导结果,可以得到代码实现。 +· 本题需要倒退求解第一天摘得的=桃子的总数量,可以使用循环实现。 +· 在循环中,需要根据题意推到出第i天剩下的桃子数量与第i+1天剩下的桃子数量之间的关系。 -## 问题3: +## 问题3:百鸡问题扩展-N鸡问题 + N元钱买N只鸡,公鸡每只5元,母鸡每只3元,小鸡1元3只,N元钱必须刚好买N只鸡,而且鸡必须整只买,不能劈开买。 有几种买法呢?这就是N鸡问题。 @@ -249,88 +263,88 @@ N元钱买N只鸡,公鸡每只5元,母鸡每只3元,小鸡1元3只,N元 ### 2. 输入、输出描述 - 【输入】一个正整数N,表示买N只鸡的情况。(N<500) - 【输出】两个整数,表示鸡的所有买法和所有买法的公鸡数量的和 +- 【输入】一个正整数N,表示买N只鸡的情况。(N<500) +- 【输出】两个整数,表示鸡的所有买法和所有买法的公鸡数量的和 ### 3. 演算示例 +``` +当输入N为15时: +1. 输入N=15。 +2. 程序初始化买法数量为0,公鸡数量之和为-1。 +3. 进入两个循环,穷举公鸡和母鸡的数量: + - 当公鸡数量为0,母鸡数量为0时,小鸡数量为15,不满足条件。 + - 当公鸡数量为0,母鸡数量为1时,小鸡数量为12,不满足条件。 + - 当公鸡数量为0,母鸡数量为2时,小鸡数量为9,满足条件,买法数量加1,公鸡数量之和更新为0。 + - 当公鸡数量为0,母鸡数量为3时,小鸡数量为6,不满足条件。 + - 其他情况依次类推。 -用两层for循环遍布所有可能的买法,其中一个鸡的数量用总数减去前两种鸡。 -示例1:总钱数和鸡的只数N -``` -Enter N, -1 to end:100 -The sum of the number of chicken to buy is 4, -the number of roosters to buy is 24 -``` -示例2:没有买法可以买到鸡。 -``` -Enter N, -1 to end: 1 -The sum of the number of chicken to buy is 0, -the number of rootsters to buy is -1 -``` +4. 输出买法数量为1,公鸡数量之和为0。 + +因此,根据输入N=15,程序输出买法数量为1,公鸡数量之和为0。 +``` ### 4. 算法设计 + 算法总体描述: + ``` Step 1.初始化变量 Step 2.输入N,嵌套循环判断并计数 Step 3.计算并打印鸡的买法和所有买法的公鸡数量的和 ``` 算法完整描述: + ``` -//Step 1.初始化变量 -初始化买法c为0 -初始化公鸡的总数s为0 -//Step 2.输入N,嵌套循环判断并计数 -输入钱数金额和鸡的只数N -FOR 定义I 当I到能买到最多只数公鸡时停止 I递增 - FOR 定义J 当J到能买到最多只数公鸡时停止 J递增 - 根据钱数N计算出小鸡的只数 - IF 判断当前的鸡的价格是否为N - 将计数器 c 加 1 - 将公鸡的只数 s 加 i - ENDIF - ENDFOR -ENDFOR -// Step 3.判断是否无解,并打印出鸡的买法和所有买法的公鸡数量的和 -IF -买法为0,即c等于 0 THEN - 令公鸡的数目为-1 -ENDIF - 打印出鸡的买法和所有买法的公鸡数量的和 +读取输入的N +初始化买法数量为0 +初始化公鸡数量之和为-1 + +对于每一个可能的公鸡数量(从0到N/5): + 对于每一个可能的母鸡数量(从0到N/3): + 计算小鸡数量 + 如果小鸡数量大于等于0并且小鸡数量是3的倍数并且总价钱符合条件: + 增加买法数量 + 如果是第一种买法,更新公鸡数量之和 + 否则,累加公鸡数量到公鸡数量之和 + ``` 程序代码: + ```c + #include int main() { - int N, c = 0, s = 0; - scanf("%d", &N); - - // 所有可能的买法 - for (int i = 0; i <= N / 5; i++) { - for (int j = 0; j <= N / 3; j++) { - int k = N - i - j; - if (k >= 0 && k % 3 == 0 && i * 5 + j * 3 + k / 3 == N) { - c++; // 找到一种买法 - s += i; // 得到公鸡数量之和 + int N; + scanf("%d", &N); // 读取输入的N + + int count = 0; // 初始化买法数量 + int sum_of_roosters = -1; // 初始化公鸡数量之和 + + for (int roosters = 0; roosters <= N / 5; roosters++) { // 公鸡数量的可能取值范围 + for (int hens = 0; hens <= N / 3; hens++) { // 母鸡数量的可能取值范围 + int chicks = N - roosters - hens; // 小鸡数量 + if (chicks >= 0 && (chicks % 3 == 0) && (5 * roosters + 3 * hens + chicks / 3 == N)) { // 检查是否满足条件 + count++; + if (sum_of_roosters == -1) { // 如果是第一种买法 + sum_of_roosters = roosters; + } else { // 如果不是第一种买法 + sum_of_roosters += roosters; + } } } } - if (c == 0) { - s = -1; // 这是无解的情况 - } - - printf("%d %d", c, s); //打印出买法和公鸡数量的和 + printf("%d %d", count, sum_of_roosters); // 输出买法数量和公鸡数量之和 return 0; } + ``` ### 5. 测试 - 测试结果与两个演算示例一致,测试通过。 ### 小结 -·通过2个for的嵌套运用求得满足条件的麦基数量及公鸡数量之和。 -·在没有解法时公鸡的数量设置-1。 \ No newline at end of file +· 通过2个for循环运用求得满足条件的买鸡数量及公鸡数量之和。 +· 在没有解法时公鸡的数量设置-1。 \ No newline at end of file -- Gitee From 78a966d15b66a5a6ef4e97b591e8cc825c3b656f Mon Sep 17 00:00:00 2001 From: YUE_DU <13673757+yue-du@user.noreply.gitee.com> Date: Sun, 24 Dec 2023 07:06:24 +0000 Subject: [PATCH 39/39] =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YUE_DU <13673757+yue-du@user.noreply.gitee.com> --- report1.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/report1.md b/report1.md index e17876f..580a1a6 100644 --- a/report1.md +++ b/report1.md @@ -244,8 +244,8 @@ int main() { ### 小结 -· 本题需要倒退求解第一天摘得的=桃子的总数量,可以使用循环实现。 -· 在循环中,需要根据题意推到出第i天剩下的桃子数量与第i+1天剩下的桃子数量之间的关系。 +- 本题需要倒退求解第一天摘得的=桃子的总数量,可以使用循环实现。 +- 在循环中,需要根据题意推到出第i天剩下的桃子数量与第i+1天剩下的桃子数量之间的关系。 ## 问题3:百鸡问题扩展-N鸡问题 @@ -346,5 +346,5 @@ int main() { 测试结果与两个演算示例一致,测试通过。 ### 小结 -· 通过2个for循环运用求得满足条件的买鸡数量及公鸡数量之和。 -· 在没有解法时公鸡的数量设置-1。 \ No newline at end of file +- 通过2个for循环运用求得满足条件的买鸡数量及公鸡数量之和。 +- 在没有解法时公鸡的数量设置-1。 \ No newline at end of file -- Gitee