高级语言程序设计第七次个人作业
这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/2024C
这个作业要求在哪里: https://edu.cnblogs.com/campus/fzu/2024C/homework/13304
学号:102300107
姓名:陈沁怡
(1)定义一个二维数组和指向该数组的指针,分别以数组下标和指针的形式引用数组各个元素进行赋值与输出。
(2)构造螺旋方阵。对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。
输入格式:
输入在一行中给出一个正整数N(<10)。
输出格式:
输出N×N的螺旋方阵。每行N个数字,每个数字占3位。
输入样例:
5
输出样例:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
`#include <stdio.h>
int main() {
int N;
scanf("%d", &N);
int matrix[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
matrix[i][j] = 0;
}
}
int directions[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int x = 0, y = 0, dir = 0;
int value = 1;
while (value <= N * N) {
matrix[x][y] = value++;
int next_x = x + directions[dir][0];
int next_y = y + directions[dir][1];
if (next_x >= 0 && next_x < N && next_y >= 0 && next_y < N && matrix[next_x][next_y] == 0) {
x = next_x;
y = next_y;
} else {
dir = (dir + 1) % 4;
x += directions[dir][0];
y += directions[dir][1];
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%3d", matrix[i][j]);
}
printf("\n");
}
return 0;
}
`
(3)7门课程的成绩分别存放在score[n][1]、score[n][2]、...、score[n][7]中,第0列用来存放总成绩。请编写一个函数实现计算成绩表score中每一个学生7门课程的总成绩,并将总成绩存放在该学生的第0列中。请在main函数中构造数据测试你写的函数。
include <stdio.h>
// 函数:计算每个学生的总成绩并存储在第0列
void calculateTotalScores(int score[][8], int N) {
for (int n = 0; n < N; n++) {
int total = 0;
// 计算该学生7门课程的成绩总和
for (int i = 1; i <= 7; i++) {
total += score[n][i];
}
// 将总成绩存放在第0列
score[n][0] = total;
}
}
int main() {
int N = 5; // 假设有5个学生
// 模拟成绩数据,成绩数据包括总成绩列 (score[n][0]) 和7门课程成绩 (score[n][1] 到 score[n][7])
int score[5][8] = {
{0, 80, 85, 90, 75, 88, 92, 85}, // 第0列将会是总成绩
{0, 70, 75, 80, 85, 90, 78, 88},
{0, 88, 92, 86, 79, 83, 91, 87},
{0, 65, 72, 78, 84, 82, 88, 90},
{0, 95, 91, 89, 84, 90, 93, 91}
};
calculateTotalScores(score, N);
// 输出每个学生的总成绩和各科成绩
printf("学号 总成绩 课程1 课程2 课程3 课程4 课程5 课程6 课程7\n");
for (int n = 0; n < N; n++) {
printf("%d %d %d %d %d %d %d %d %d\n",
n + 1, score[n][0], score[n][1], score[n][2], score[n][3],
score[n][4], score[n][5], score[n][6], score[n][7]);
}
return 0;
}
(4)将以下定义的含义写出来。
a)int a; b)int a; c)int **a; d)int a[10]; e)int (a)[10];
(a)含义:声明了一个普通的整型变量 a,它可以存储一个整数值。
(b)含义:声明了一个指向整数类型的指针 a。
(c)含义:声明了一个指向指针的指针 a,它指向一个 int* 类型的变量。
(d)含义:声明了一个包含10个整数的数组 a。
(e)含义:声明了一个指向包含10个整数的数组的指针 a。
5)给定一个二维数组,使用指针把数组中的数字复制到另一个数组中相同的位置。
(6)请编写一个函数,接受一个字符串指针作为参数,并返回该字符串的长度,不包括字符串结尾的空字符。
(7)输出以下内容,并解释每一个输出内容的含义。
int a[3][4] = {0};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a[0][0]));
printf("%d\n",sizeof(a[0]));
printf("%d\n",sizeof(a[0]+1));
printf("%d\n",sizeof(*(a[0]+1)));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(*(a+1)));
printf("%d\n",sizeof(&a[0]+1));
printf("%d\n",sizeof(*(&a[0]+1)));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a[3]));)
printf("%d\n", sizeof(a));
sizeof(a)返回整个二维数组a的大小。
数组a的类型是int[3][4],即3行4列,总共12个int元素。每个int占4字节,所以总大小为12 * 4 = 48字节。
输出:48
printf("%d\n", sizeof(a[0][0]));
a[0][0]是数组中的一个元素,类型是int。
sizeof(a[0][0])即sizeof(int),通常int占4字节。
输出:4
printf("%d\n", sizeof(a[0]));
a[0]是a的第一行,即一个包含4个int元素的数组。a[0]的类型是int[4]。
sizeof(a[0])返回的是这一行数组的大小。4个int元素,每个int占4字节,所以大小是4 * 4 = 16字节。
输出:16
printf("%d\n", sizeof(a[0] + 1));
a[0] + 1是a[0]数组的第二个元素,即a[0][1]的地址。此时,a[0] + 1的类型是int。
sizeof(a[0] + 1)即sizeof(int),int通常占4字节(在32位系统上),也可能是8字节(在64位系统上)。
假设是32位系统,输出:4
printf("%d\n", sizeof((a[0] + 1)));
(a[0] + 1)解引用a[0] + 1,即访问a[0][1]。
sizeof((a[0] + 1))即sizeof(a[0][1]),它是int类型。
因为int通常占4字节,所以输出:4
printf("%d\n", sizeof(a + 1));
a + 1是a数组的第二行的地址,类型是int[4],指向a[1]的地址。
sizeof(a + 1)即sizeof(int()[4]),这是指向包含4个int元素的数组的指针。
int()[4]通常占4字节(在32位系统上),也可能是8字节(在64位系统上)。
假设是32位系统,输出:4
printf("%d\n", sizeof((a + 1)));
(a + 1)是解引用a + 1,即a[1],它是int[4]类型的数组。
sizeof((a + 1))即sizeof(a[1]),它是包含4个int元素的数组的大小。
a[1]的大小是4 * 4 = 16字节。
输出:16
printf("%d\n", sizeof(&a[0] + 1));
&a[0]是数组a第一行的地址,它的类型是int()[4]。
&a[0] + 1是a[1]的地址,类型依然是int()[4]。
sizeof(&a[0] + 1)即sizeof(int()[4]),这是指向一个包含4个int元素的数组的指针,通常占4字节(在32位系统上)。
假设是32位系统,输出:4
printf("%d\n", sizeof((&a[0] + 1)));
&a[0] + 1指向a[1],(&a[0] + 1)即a[1],它是int[4]类型的数组。
sizeof((&a[0] + 1))即sizeof(a[1]),它是包含4个int元素的数组的大小。
a[1]的大小是4 * 4 = 16字节。
输出:16
printf("%d\n", sizeof(*a));
a是a的第一行,即a[0],它是int[4]类型的数组。
sizeof(a)即sizeof(a[0]),它是包含4个int元素的数组的大小。
a[0]的大小是4 * 4 = 16字节。
输出:16
printf("%d\n", sizeof(a[3]));
a[3]是a的第四行,类型是int[4]。
然而,数组a只有3行,因此访问a[3]会越界。
根据C语言标准,sizeof(a[3])的结果依然是有效的,它会返回int[4]的大小,即4 * 4 = 16字节。
输出:16
(8)键盘输入一个长度为len(1 <= len < 30)的字符串,再输入一个正整数 m(1 <= m <= len),将此字符串中从第 m 个字符开始的剩余全部字符复制成为另一个字符串,并将这个新字符串输出。要求用指针处理字符串。