【C语言】学习笔记 第9章 函数 编程题 今天药忘吃喽~ 2024-03-22 10:19 24阅读 0赞 ### 【C语言】学习笔记 ### #### 文章目录 #### * * 【C语言】学习笔记 * * 第9章 函数 * * 编程题 #### 第9章 函数 #### ![在这里插入图片描述][af2aa4707f564e8f9970d60bb893f3fe.png_pic_center] 函数是 C 程序的构建块。每个函数本质上是一个自带声明和语句的小程序。可以利用函数 把程序划分成小块,这样便于人们理解和修改程序。由于不必重复编写要多次使用的代码,函 数可以使编程不那么单调乏味。此外,函数可以复用:一个函数最初可能是某个程序的一部分, 但可以将其用于其他程序。 ##### 编程题 ##### 【1】编写程序,要求用户输入一串整数(把这串整数存储在数组中),然后通过调用 selection\_sort 函数来排序这些整数。在给定 n 个元素的数组后,selection\_sort 函数必须做下列工作: (a) 搜索数组找出最大的元素,然后把它移到数组的最后; (b) 递归地调用函数本身来对前 n - 1 个数组元素进行排序。 #include <stdio.h> int selection_sort(int a[], int n) { if (n == 0) { return 0; } int max, pos = 0; for (int i = 0; i < n; i++) { if (a[pos] < a[i]) { pos = i; } } max = a[pos]; a[pos] = a[n - 1]; a[n - 1] = max; return selection_sort(a, n - 1); } int main(void) { int number[5]; int i = 0; printf("Enter number to sort: "); for (i = 0; i < 5;i++) { scanf("%d", &number[i]); } for (i = 0; i < 5;i++) { printf("%3d", number[i]); } selection_sort(number, 5); printf("\nAfter sort: "); for (i = 0; i < 5;i++) { printf("%3d", number[i]); } return 0; } ![在这里插入图片描述][954f097facef400e9b4e5fc9592c00ad.png_pic_center] 【2】修改第 5 章的编程题 5,用函数计算所得税的金额。在输入应纳税所得额后,函数返回税金。 #include<stdio.h> float calc_tax(float income); int main(void) { float f; printf("Enter the taxable income: "); scanf("%f", &f); printf("Tne Tax is %.2f", calc_tax(f)); } float calc_tax(float income) { float tax; if (income < 750.0f) { tax = income * 0.01; } else if (income < 2250.0f) { tax = 7.5 + (income - 750) * 0.02; } else if (income < 3750.0f) { tax = 37.5 + (income - 2250) * 0.03; } else if (income < 5250.0f) { tax = 82.5 + (income - 3750) * 0.04; } else if (income < 7000.0f) { tax = 142.5 + (income - 5250) * 0.05; } else { tax = 230 + (income - 7000) * 0.06; } return tax; } ![在这里插入图片描述][d7fa7e5addaa484f9857cbf77a574f4e.png_pic_center] 【3】修改第 8 章的编程题 9,使其包含下列函数: void generate_random_walk(char walk[10][10]); void print_array(char walk[10][10]); main 函数首先调用 generate\_random\_walk,该函数把所有数组元素都初始化为字符’.',然后将 其中一些字符替换为 A~Z 的字母,详见原题的描述。接着,main 函数调用 print\_array 函数来显 示数组。 #include <stdio.h> #include <time.h> void generate_random_walk(char walk[10][10]); void print_array(char walk[10][10]); int main(void) { char map[10][10]; generate_random_walk(map); print_array(map); return 0; } void generate_random_walk(char walk[10][10]) { for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { walk[i][j] = '.'; } } char visited = 'A'; int currentX, currentY; int direct[4] = { 0,0,0,0 }; srand((unsigned int)time(NULL)); int x; currentX = currentY = 0; walk[currentX][currentY] = visited++; while (1) { int sum = direct[0] + direct[1] + direct[2] + direct[3]; if (visited > 'Z' || sum == 4) { break; } x = rand() % 4; if (x == 0) { if (currentY == 0 || walk[currentX][currentY - 1] != '.') { direct[0] = 1; continue; } else { walk[currentX][--currentY] = visited++; direct[0] = direct[1] = direct[2] = direct[3] = 0; } } else if (x == 1) { if (currentX == 9 || walk[currentX + 1][currentY] != '.') { direct[1] = 1; continue; } else { walk[++currentX][currentY] = visited++; direct[0] = direct[1] = direct[2] = direct[3] = 0; } } else if (x == 2) { if (currentY == 9 || walk[currentX][currentY + 1] != '.') { direct[2] = 1; continue; } else { walk[currentX][++currentY] = visited++; direct[0] = direct[1] = direct[2] = direct[3] = 0; } } else if (x == 3) { if (currentX == 0 || walk[currentX - 1][currentY] != '.') { direct[3] = 1; continue; } else { walk[--currentX][currentY] = visited++; direct[0] = direct[1] = direct[2] = direct[3] = 0; } } } } void print_array(char walk[10][10]) { for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { printf(" %c", walk[i][j]); } printf("\n"); } } ![在这里插入图片描述][08363344a366438d90ce828c6badbe20.png_pic_center] 【4】修改第 8 章的编程题 16,使其包含下列函数: void read_word(int counts[26]); bool equal_array(int counts1[26], int counts2[26]); main 函数将调用 read\_word 两次,每次用于读取用户输入的一个单词。读取单词时,read\_word 用 单词中的字母更新 counts 数组,详见原题的描述。(main 将声明两个数组,每个数组用于一个单 词。这些数组用于跟踪单词中每个字母出现的次数。)接下来,main 函数调用 equal\_array 函数, 以前面提到的两个数组作为参数。如果两个数组中的元素相同(表明这两个单词是变位词), equal\_array 返回 true,否则返回 false。 #include <stdio.h> #include <stdbool.h> #include <ctype.h> void read_word(int counts[26]); bool equal_array(int counts1[26], int counts2[26]); int main(void) { int fwords[26] = { 0 }; int swords[26] = { 0 }; read_word(fwords); read_word(swords); if (equal_array(fwords, swords)) printf("The words are anagrams."); else printf("The words are not anagrams."); return 0; } void read_word(int counts[26]) { char ch; printf("Enter the word: "); while ((ch = getchar()) != '\n' && isalpha(ch)) counts[toupper(ch) - 'A'] ++; } bool equal_array(int counts1[26], int counts2[26]) { for (int i = 0; i < 26; i++) { if (counts1[i] != counts2[i]) { return false; } } return true; } ![在这里插入图片描述][0f3b1d1c16de4406a8d8662acc445f46.png_pic_center] ![在这里插入图片描述][e41a4e3b99c74ca2ba744f32585e4488.png_pic_center] 【5】修改第 8 章的编程题 17,使其包含下列函数: void create_magic_square(int n, int magic_square[n][n]); void print_magic_square(int n, int magic_square[n][n]); 获得用户输入的数 n 之后,main 函数调用 create\_magic\_square 函数,另一个调用参数是在 main 内部声明的n×n的数组。create\_magic\_square函数用1, 2, …, n 2 n^2 n2 填充数组,如原题所述。接下来, main 函数调用 print\_magic\_square,按原题描述的格式显示数组。注意:如果你的编译器不支持 变长数组,请把 main 中的数组声明为 99×99 而不是 n×n,并使用下面的原型: void create_magic_square(int n, int magic_square[99][99]); void print_magic_square(int n, int magic_square[99][99]); #include <stdio.h> void create_magic_square(int n, int magic_square[n][n]); void print_magic_square(int n, int magic_square[n][n]); int main(void) { int n; printf("This program creates a magic square of a specified size.\n"); printf("The size must be an odd number between 1 and 99.\n"); printf("Enter size of magic square: "); scanf("%d", &n); int magic[n][n]; create_magic_square(n, magic); print_magic_square(n, magic); return 0; } void create_magic_square(int n, int magic_square[n][n]) { int x = 0, y = n / 2; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { magic_square[i][j] = 0; } } for (int k = 1;k <= n * n; k++) { if (magic_square[x][y] != 0) { x = (x + 2 + n) % n; y = (--y + n) % n; magic_square[x][y] = k; } else { magic_square[x][y] = k; } x = (--x + n) % n; y = (++y + n) % n; } } void print_magic_square(int n, int magic_square[n][n]) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { printf("%d\t", magic_square[i][j]); } printf("\n"); } } ![在这里插入图片描述][4d4d76e343934ab1b1f0d9d4c04cdb29.png_pic_center] 【6】编写函数计算下面多项式的值: 3 x 5 + 2 x 4 − 5 x 3 − x 2 + 7 x − 6 3x^5 + 2x^4 - 5x^3 - x^2 + 7x - 6 3x5\+2x4−5x3−x2\+7x−6 编写程序要求用户输入 x 的值,调用该函数计算多项式的值并显示函数返回的值。 #include <stdio.h> float power(float x, int n); float polynomial(float x); int main(void) { float f; printf("Enter a number: "); scanf("%f", &f); printf("The result is %f.", polynomial(f)); return 0; } float power(float x, int n) { float result = 1; for (int i = 1; i <= n; i++) { result *= x; } return result; } float polynomial(float x) { return (3 * power(x, 5) + 2 * power(x, 4) - 5 * power(x, 3) + power(x, 2) + 7 * x - 6); } ![在这里插入图片描述][fdc9a089bdc740fe9739bd3defbd55cf.png_pic_center] 【7】如果换一种方法计算 x n x^n xn ,9.6 节的 power 函数速度可以更快。我们注意到,如果 n 是 2 的幂,则可以 通过自乘的方法计算 x n x^n xn 。例如, x 4 x^4 x4 是 x 2 x^2 x2 的平方,所以 x 4 x^4 x4 可以用两次乘法计算,而不需要三次乘 法。这种方法甚至可以用于 n 不是 2 的幂的情况。如果 n 是偶数,则 x n = ( x n / 2 ) 2 x^n=\\left(x^\{n / 2\}\\right)^2 xn=(xn/2)2 ;如果 n 是奇数,则 x n = x ⋅ x n − 1 x^n=x \\cdot x^\{n-1\} xn=x⋅xn−1。编写计算 x n x^n xn 的递归函数(递归在 n=0 时结束,此时函数返回 1)。为了测试该函数,写 一个程序要求用户输入 x 和 n 的值,调用 power 计算 x n x^n xn ,然后显示函数的返回值。 #include <stdio.h> int power(int x, int n); int main(void) { int m, n; printf("Eeter two number to calc power: "); scanf("%d %d", &m, &n); printf("The result is %d", power(m, n)); return 0; } int power(int x, int n) { int result = 1; if (n == 0) return result; if (n % 2 != 0) result = x * power(x, n - 1); else result = power(x, n / 2) * power(x, n / 2); return result; } ![在这里插入图片描述][19591ea04cb24315a8564740a48761c2.png_pic_center] 【8】编写函数模拟掷骰子的游戏(两个骰子)。第一次掷的时候,如果点数之和为 7 或 11 则获胜;如果点 数之和为2、3或12则落败;其他情况下的点数之和称为“目标”,游戏继续。在后续的投掷中,如 果玩家再次掷出“目标”点数则获胜,掷出 7 则落败,其他情况都忽略,游戏继续进行。每局游戏 结束时,程序询问用户是否再玩一次,如果用户输入的回答不是y或 Y,程序会显示胜败的次数然后 终止。 You rolled: 8 Your point is 8 You rolled: 3 You rolled: 10 You rolled: 8 You win! Play again? y You rolled: 6 Your point is 6 You rolled: 5 You rolled: 12 You rolled: 3 You rolled: 7 You lose! Play again? y You rolled: 11 You win! Play again? n Wins: 2 Losses: 1 编写三个函数:main、roll\_dice 和 play\_game。下面给出了后两个函数的原型: int roll_dice(void); bool play_game(void); roll\_dice 应生成两个随机数(每个都在 1~6 范围内),并返回它们的和。play\_game 应进行一次掷 骰子游戏(调用 roll\_dice 确定每次掷的点数),如果玩家获胜则返回 true,如果玩家落败则返回 false。play\_game 函数还要显示玩家每次掷骰子的结果。main 函数反复调用 play\_game 函数,记 录获胜和落败的次数,并显示“you win”和“you lose”消息。提示:使用 rand 函数生成随机数。 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <time.h> int roll_dice(void); bool play_game(void); int win = 0, lose = 0; int main(void) { char ch; do { if (play_game()) { printf("You win!\n"); win++; } else { printf("You lose!\n"); lose++; } printf("\n Play again? "); ch = getchar(); while (getchar() != '\n'); } while (ch == 'y'); printf("Wins: %d Losses: %d\n", win, lose); return 0; } int roll_dice(void) { srand((unsigned)time(NULL)); return (rand() % 6 + 1) + (rand() % 6 + 1); } bool play_game(void) { int temp; int point = roll_dice(); printf("You rolled: %d\n", point); if (point == 7 || point == 11) return true; printf("Your point is %d\n", point); while (1) { temp = roll_dice(); printf("You rolled: %d\n", temp); if (temp == point) return true; if (temp == 7) return false; } } ![在这里插入图片描述][552a0bade5c94bfaabf099e5dbba942b.png_pic_center] [af2aa4707f564e8f9970d60bb893f3fe.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/22/ebf97951c4c343218cfb57cc27728af5.png [954f097facef400e9b4e5fc9592c00ad.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/22/b47df4d5daa147f287b9d24b03ec1ddf.png [d7fa7e5addaa484f9857cbf77a574f4e.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/22/3a6e8e4c9abb4692916ea470cdeab138.png [08363344a366438d90ce828c6badbe20.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/22/c0a5a961d6864135a08a5fd1bc85b2a1.png [0f3b1d1c16de4406a8d8662acc445f46.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/22/de75a463a0034c038a41e60caaa9e755.png [e41a4e3b99c74ca2ba744f32585e4488.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/22/37f18e22498a4dcba4e210c32778ee44.png [4d4d76e343934ab1b1f0d9d4c04cdb29.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/22/8714ffd43ba54ff1a96fe3760735a00a.png [fdc9a089bdc740fe9739bd3defbd55cf.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/22/398b41ad98e647a192181dc3917dda6e.png [19591ea04cb24315a8564740a48761c2.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/22/5abfb30780a3466ba1fe3f7031c86245.png [552a0bade5c94bfaabf099e5dbba942b.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/22/6cf40625207a44b6b2c50b60d428a3ff.png
相关 【C语言】学习笔记 第4章 表达式 编程题 【C语言】学习笔记 文章目录 【C语言】学习笔记 第4章 表达式 编程题 第4章 表达式 ![在 浅浅的花香味﹌/ 2024年03月23日 16:56/ 0 赞/ 73 阅读
相关 【C语言】学习笔记 第11章 指针 编程题 【C语言】学习笔记 文章目录 【C语言】学习笔记 第11章 指针 编程题 第11章 指针 ![在 古城微笑少年丶/ 2024年03月22日 10:46/ 0 赞/ 13 阅读
相关 【C语言】学习笔记 第9章 函数 编程题 【C语言】学习笔记 文章目录 【C语言】学习笔记 第9章 函数 编程题 第9章 函数 ![在这里 今天药忘吃喽~/ 2024年03月22日 10:19/ 0 赞/ 25 阅读
相关 【C语言】学习笔记 第9章 函数 9.6 递归 【C语言】学习笔记 文章目录 【C语言】学习笔记 第9章 函数 9.6 递归 布满荆棘的人生/ 2024年03月22日 10:19/ 0 赞/ 67 阅读
相关 【C语言】学习笔记 第9章 函数 9.4 return语句 【C语言】学习笔记 文章目录 【C语言】学习笔记 第9章 函数 9.4 return语句 第9章 函 港控/mmm°/ 2024年03月22日 10:18/ 0 赞/ 31 阅读
相关 【C语言】学习笔记 第9章 函数 9.5 程序终止 【C语言】学习笔记 文章目录 【C语言】学习笔记 第9章 函数 9.5 程序终止 我就是我/ 2024年03月22日 10:18/ 0 赞/ 25 阅读
相关 【C语言】学习笔记 第9章 函数 9.3 实际参数 【C语言】学习笔记 文章目录 【C语言】学习笔记 第9章 函数 9.3 实际参数 喜欢ヅ旅行/ 2024年03月22日 10:18/ 0 赞/ 53 阅读
相关 【C语言】学习笔记 第9章 函数 9.2 函数声明 【C语言】学习笔记 文章目录 【C语言】学习笔记 第9章 函数 9.2 函数声明 第9章 函数 一时失言乱红尘/ 2024年03月22日 10:18/ 0 赞/ 22 阅读
相关 【C语言】学习笔记 第8章 数组 编程题 【C语言】学习笔记 文章目录 【C语言】学习笔记 第8章 数组 编程题 第8章 数组 ![在这里 左手的ㄟ右手/ 2024年03月22日 09:45/ 0 赞/ 57 阅读
相关 【C语言】学习笔记 第6章 循环 编程题 【C语言】学习笔记 文章目录 【C语言】学习笔记 第6章 循环 编程题 第6章 循环 ![在这里 左手的ㄟ右手/ 2024年03月22日 08:44/ 0 赞/ 72 阅读
还没有评论,来说两句吧...