第一题个人总结An的构造采用递归方式从1开始到n每层根据当前层数i的奇偶决定符号奇数用偶数用-最后返回时加上右括号形成嵌套的sin表达式。Sn的构造先打印n-1个左括号然后从i1到n循环每次先输出当前的Ai表达式再加上数字n-i1并在除最后一次外的每次循环后加右括号形成多层嵌套的最终表达式。代码如下#include stdio.h void printAn(int n, int i) { if (i n) { printf(sin(%d), i); return; } printf(sin(%d%c, i, (i % 2 1) ? : -); printAn(n, i 1); printf()); } void printSn(int n) { int i; for (i 1; i n; i) { printf((); } for (i 1; i n; i) { printAn(i, 1); printf(%d, n - i 1); if (i n) { printf()); } } } int main() { int N; scanf(%d, N); printSn(N); printf(\n); return 0; }第二题个人总结每个矩形给定的是任意一对相对顶点需要先转换为左下角(min_x, min_y)和右上角(max_x, max_y)的形式。求相交矩形相交矩形的左边界 两个矩形左边界最大值相交矩形的右边界 两个矩形右边界最小值相交矩形的下边界 两个矩形下边界最大值 相交矩形的上边界 两个矩形上边界最小值。如果左边界 右边界 且 下边界 上边界则两矩形相交面积为(右边界-左边界) * (上边界-下边界)否则面积为0。最后输出。代码如下#include stdio.h double max(double a, double b) { return a b ? a : b; } double min(double a, double b) { return a b ? a : b; } int main() { double x1, y1, x2, y2; double x3, y3, x4, y4; scanf(%lf %lf %lf %lf, x1, y1, x2, y2); scanf(%lf %lf %lf %lf, x3, y3, x4, y4); double rect1_x1 min(x1, x2); double rect1_y1 min(y1, y2); double rect1_x2 max(x1, x2); double rect1_y2 max(y1, y2); double rect2_x1 min(x3, x4); double rect2_y1 min(y3, y4); double rect2_x2 max(x3, x4); double rect2_y2 max(y3, y4); double inter_x1 max(rect1_x1, rect2_x1); double inter_y1 max(rect1_y1, rect2_y1); double inter_x2 min(rect1_x2, rect2_x2); double inter_y2 min(rect1_y2, rect2_y2); double area 0; if (inter_x1 inter_x2 inter_y1 inter_y2) { area (inter_x2 - inter_x1) * (inter_y2 - inter_y1); } printf(%.2f\n, area); return 0; }第三题个人总结特殊情况处理当M0时任何矩阵的0次幂都是单位矩阵主对角线为1其余为0结果矩阵C的第i行第j列元素等于A的第i行与B的第j列对应元素乘积之和。即C[i][j] sum(A[i][k] * B[k][j])。循环计算初始化结果矩阵为原矩阵A进行M-1次乘法运算因为第1次已经是A^1每次乘法使用临时矩阵存储中间结果避免计算过程中数据被覆盖。代码如下#include stdio.h int main() { int N, M; int A[30][30], result[30][30], temp[30][30]; scanf(%d %d, N, M); for (int i 0; i N; i) { for (int j 0; j N; j) { scanf(%d, A[i][j]); } } if (M 0) { for (int i 0; i N; i) { for (int j 0; j N; j) { if (i j) { result[i][j] 1; } else { result[i][j] 0; } } } } else { for (int i 0; i N; i) { for (int j 0; j N; j) { result[i][j] A[i][j]; } } for (int k 1; k M; k) { for (int i 0; i N; i) { for (int j 0; j N; j) { temp[i][j] 0; for (int t 0; t N; t) { temp[i][j] result[i][t] * A[t][j]; } } } for (int i 0; i N; i) { for (int j 0; j N; j) { result[i][j] temp[i][j]; } } } } for (int i 0; i N; i) { for (int j 0; j N; j) { printf(%d, result[i][j]); if (j N - 1) { printf( ); } } printf(\n); } return 0; }翻译但有一个问题依然存在你如何编写一条指令让它第一次指向数组的第一个元素而下一次又指向另一个元素其实非常简单你只需借鉴你一直在使用的下标概念。不过你不再使用下标而是将下标值放在方括号中。使用这种表示法你将 number₀ 表示为 number[0]。按照惯例number₁ 变为 number[1]number₁₉ 变为 number[19]。这被称为索引。使用典型的引用方式你现在就可以通过变量来引用数组了。使用数组和循环处理这20个数字的流程图如图3C-4所示。在接下来的部分我们将研究一个数组应用频率数组及其图形表示。频率数组显示在一系列数字中具有相同值的元素的数量。例如假设你从0到19之间的100个值中抽取了一个样本。你想知道其中有多少个值是0多少个是1多少个是2依此类推直到19。单词打卡
上机练习第48天
第一题个人总结An的构造采用递归方式从1开始到n每层根据当前层数i的奇偶决定符号奇数用偶数用-最后返回时加上右括号形成嵌套的sin表达式。Sn的构造先打印n-1个左括号然后从i1到n循环每次先输出当前的Ai表达式再加上数字n-i1并在除最后一次外的每次循环后加右括号形成多层嵌套的最终表达式。代码如下#include stdio.h void printAn(int n, int i) { if (i n) { printf(sin(%d), i); return; } printf(sin(%d%c, i, (i % 2 1) ? : -); printAn(n, i 1); printf()); } void printSn(int n) { int i; for (i 1; i n; i) { printf((); } for (i 1; i n; i) { printAn(i, 1); printf(%d, n - i 1); if (i n) { printf()); } } } int main() { int N; scanf(%d, N); printSn(N); printf(\n); return 0; }第二题个人总结每个矩形给定的是任意一对相对顶点需要先转换为左下角(min_x, min_y)和右上角(max_x, max_y)的形式。求相交矩形相交矩形的左边界 两个矩形左边界最大值相交矩形的右边界 两个矩形右边界最小值相交矩形的下边界 两个矩形下边界最大值 相交矩形的上边界 两个矩形上边界最小值。如果左边界 右边界 且 下边界 上边界则两矩形相交面积为(右边界-左边界) * (上边界-下边界)否则面积为0。最后输出。代码如下#include stdio.h double max(double a, double b) { return a b ? a : b; } double min(double a, double b) { return a b ? a : b; } int main() { double x1, y1, x2, y2; double x3, y3, x4, y4; scanf(%lf %lf %lf %lf, x1, y1, x2, y2); scanf(%lf %lf %lf %lf, x3, y3, x4, y4); double rect1_x1 min(x1, x2); double rect1_y1 min(y1, y2); double rect1_x2 max(x1, x2); double rect1_y2 max(y1, y2); double rect2_x1 min(x3, x4); double rect2_y1 min(y3, y4); double rect2_x2 max(x3, x4); double rect2_y2 max(y3, y4); double inter_x1 max(rect1_x1, rect2_x1); double inter_y1 max(rect1_y1, rect2_y1); double inter_x2 min(rect1_x2, rect2_x2); double inter_y2 min(rect1_y2, rect2_y2); double area 0; if (inter_x1 inter_x2 inter_y1 inter_y2) { area (inter_x2 - inter_x1) * (inter_y2 - inter_y1); } printf(%.2f\n, area); return 0; }第三题个人总结特殊情况处理当M0时任何矩阵的0次幂都是单位矩阵主对角线为1其余为0结果矩阵C的第i行第j列元素等于A的第i行与B的第j列对应元素乘积之和。即C[i][j] sum(A[i][k] * B[k][j])。循环计算初始化结果矩阵为原矩阵A进行M-1次乘法运算因为第1次已经是A^1每次乘法使用临时矩阵存储中间结果避免计算过程中数据被覆盖。代码如下#include stdio.h int main() { int N, M; int A[30][30], result[30][30], temp[30][30]; scanf(%d %d, N, M); for (int i 0; i N; i) { for (int j 0; j N; j) { scanf(%d, A[i][j]); } } if (M 0) { for (int i 0; i N; i) { for (int j 0; j N; j) { if (i j) { result[i][j] 1; } else { result[i][j] 0; } } } } else { for (int i 0; i N; i) { for (int j 0; j N; j) { result[i][j] A[i][j]; } } for (int k 1; k M; k) { for (int i 0; i N; i) { for (int j 0; j N; j) { temp[i][j] 0; for (int t 0; t N; t) { temp[i][j] result[i][t] * A[t][j]; } } } for (int i 0; i N; i) { for (int j 0; j N; j) { result[i][j] temp[i][j]; } } } } for (int i 0; i N; i) { for (int j 0; j N; j) { printf(%d, result[i][j]); if (j N - 1) { printf( ); } } printf(\n); } return 0; }翻译但有一个问题依然存在你如何编写一条指令让它第一次指向数组的第一个元素而下一次又指向另一个元素其实非常简单你只需借鉴你一直在使用的下标概念。不过你不再使用下标而是将下标值放在方括号中。使用这种表示法你将 number₀ 表示为 number[0]。按照惯例number₁ 变为 number[1]number₁₉ 变为 number[19]。这被称为索引。使用典型的引用方式你现在就可以通过变量来引用数组了。使用数组和循环处理这20个数字的流程图如图3C-4所示。在接下来的部分我们将研究一个数组应用频率数组及其图形表示。频率数组显示在一系列数字中具有相同值的元素的数量。例如假设你从0到19之间的100个值中抽取了一个样本。你想知道其中有多少个值是0多少个是1多少个是2依此类推直到19。单词打卡