第一题

个人总结:An的构造:采用递归方式,从1开始到n,每层根据当前层数i的奇偶决定符号(奇数用+,偶数用-),最后返回时加上右括号,形成嵌套的sin表达式。Sn的构造:先打印n-1个左括号,然后从i=1到n循环,每次先输出当前的Ai表达式,再加上数字n-i+1,并在除最后一次外的每次循环后加右括号,形成多层嵌套的最终表达式。
代码如下:
#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;
}
第三题

个人总结:特殊情况处理:当M=0时,任何矩阵的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。
单词打卡
