高级程序设计第七次个人作业
| 这个作业属于哪个课程 | <班级的链接> |
|---|---|
| 这个作业要求在哪里 | <作业链接> |
| 学号 | 092300303 |
| 姓名 | 池博洋 |
@
目录
- 1.定义一个二维数组和指向该数组的指针,分别以数组下标和指针的形式引用数组各个元素进行赋值与输出
- 2.构造螺旋方阵。对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里
- 3.请编写一个函数实现计算成绩表score中每一个学生7门课程的总成绩,并将总成绩存放在该学生的第0列中。
- 4.将以下定义的含义写出来
- 5.给定一个二维数组,使用指针把数组中的数字复制到另一个数组中相同的位置
- 6.请编写一个函数,接受一个字符串指针作为参数,并返回该字符串的长度,不包括字符串结尾的空字符
- 7.输出以下内容,并解释每一个输出内容的含义
- 8.键盘输入一个长度为len(1 <= len < 30)的字符串,再输入一个正整数 m(1 <= m <= len),将此字符串中从第 m 个字符开始的剩余全部字符复制成为另一个字符串,并将这个新字符串输出
1.定义一个二维数组和指向该数组的指针,分别以数组下标和指针的形式引用数组各个元素进行赋值与输出
点击查看代码
#include <stdio.h>
int main() {
// 定义二维数组
int arr[3][4];
// 定义指向二维数组的指针
int (*ptr)[4] = arr;
printf("=== 使用数组下标赋值和输出 ===\n");
// 使用数组下标赋值
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 4; j++) {
arr[i][j] = i * 4 + j + 1;
}
}
// 使用数组下标输出
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 4; j++) {
printf("%3d", arr[i][j]);
}
printf("\n");
}
printf("=== 使用指针赋值和输出 ===\n");
// 使用指针赋值
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 4; j++) {
*(*(ptr + i) + j) = (i * 4 + j + 1) * 10;
}
}
// 使用指针输出
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 4; j++) {
printf("%3d", *(*(ptr + i) + j));
}
printf("\n");
}
return 0;
}
结果:

2.构造螺旋方阵。对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里
点击查看代码
#include <stdio.h>
int main() {
int N;
printf("请输入N: ");
scanf("%d", &N);
int spiral[10][10] = {0};
int num = 1;
int top = 0, bottom = N - 1, left = 0, right = N - 1;
// 螺旋填充数字
while(num <= N * N) {
// 从左到右填充上边
for(int i = left; i <= right && num <= N * N; i++) {
spiral[top][i] = num++;
}
top++;
// 从上到下填充右边
for(int i = top; i <= bottom && num <= N * N; i++) {
spiral[i][right] = num++;
}
right--;
// 从右到左填充下边
for(int i = right; i >= left && num <= N * N; i--) {
spiral[bottom][i] = num++;
}
bottom--;
// 从下到上填充左边
for(int i = bottom; i >= top && num <= N * N; i--) {
spiral[i][left] = num++;
}
left++;
}
// 输出螺旋方阵
printf("螺旋方阵:\n");
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
printf("%3d", spiral[i][j]);
}
printf("\n");
}
return 0;
}
结果:

3.请编写一个函数实现计算成绩表score中每一个学生7门课程的总成绩,并将总成绩存放在该学生的第0列中。
点击查看代码
#include <stdio.h>
// 计算总成绩的函数
void calculateTotalScore(int score[][8], int n) {
for(int i = 0; i < n; i++) {
score[i][0] = 0; // 初始化总成绩
for(int j = 1; j < 8; j++) {
score[i][0] += score[i][j]; // 累加各科成绩
}
}
}
int main() {
// 初始化成绩表,第0列用于存放总成绩
int score[3][8] = {
{0, 85, 90, 78, 92, 88, 76, 95}, // 学生1
{0, 72, 68, 85, 90, 79, 82, 88}, // 学生2
{0, 95, 92, 87, 84, 90, 86, 91} // 学生3
};
// 调用函数计算总成绩
calculateTotalScore(score, 3);
// 输出结果
printf("学生成绩表:\n");
for(int i = 0; i < 3; i++) {
printf("学生%d: 总成绩=%d, 各科成绩: ", i+1, score[i][0]);
for(int j = 1; j < 8; j++) {
printf("%d ", score[i][j]);
}
printf("\n");
}
return 0;
}
结果:

4.将以下定义的含义写出来
点击查看代码
#include <stdio.h>
int main() {
printf("各种定义的含义:\n\n");
printf("a) int a; // 定义一个整型变量a\n");
printf("b) int a[10]; // 定义一个包含10个整数的数组a\n");
printf("c) int *a; // 定义一个指向整型的指针变量a\n");
printf("d) int **a; // 定义一个指向整型指针的指针变量a(二级指针)\n");
printf("e) int (*a)[10]; // 定义一个指向包含10个整数的数组的指针a\n\n");
// 实际示例
int a; // 整型变量
int arr[10]; // 整型数组
int *ptr; // 整型指针
int **pptr; // 指向整型指针的指针
int (*arrayPtr)[10]; // 指向包含10个整数的数组的指针
printf("实际使用示例:\n");
a = 10;
printf("int a = %d\n", a);
ptr = &a;
printf("int *ptr = &a, *ptr = %d\n", *ptr);
pptr = &ptr;
printf("int **pptr = &ptr, **pptr = %d\n", **pptr);
arrayPtr = &arr;
printf("int (*arrayPtr)[10] = &arr\n");
return 0;
}
结果:

5.给定一个二维数组,使用指针把数组中的数字复制到另一个数组中相同的位置
点击查看代码
#include <stdio.h>
int main() {
// 定义原数组和目标数组
int src[2][3] = {{1, 2, 3}, {4, 5, 6}};
int dest[2][3];
// 使用指针复制数组
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 3; j++) {
// 使用指针形式复制元素
*(*(dest + i) + j) = *(*(src + i) + j);
}
}
// 输出原数组
printf("原数组:\n");
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 3; j++) {
printf("%d ", src[i][j]);
}
printf("\n");
}
// 输出复制后的数组
printf("复制后的数组:\n");
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 3; j++) {
printf("%d ", dest[i][j]);
}
printf("\n");
}
return 0;
}
结果:

6.请编写一个函数,接受一个字符串指针作为参数,并返回该字符串的长度,不包括字符串结尾的空字符
点击查看代码
#include <stdio.h>
// 计算字符串长度的函数
int stringLength(const char *str) {
int length = 0;
// 遍历字符串直到遇到空字符
while(*str != '\0') {
length++;
str++; // 移动指针到下一个字符
}
return length;
}
int main() {
char testStr1[] = "Hello, World!";
char testStr2[] = "C Programming";
char testStr3[] = "";
printf("字符串长度计算:\n");
printf("'%s' 的长度: %d\n", testStr1, stringLength(testStr1));
printf("'%s' 的长度: %d\n", testStr2, stringLength(testStr2));
printf("空字符串的长度: %d\n", stringLength(testStr3));
return 0;
}
结果:

7.输出以下内容,并解释每一个输出内容的含义
点击查看代码
#include <stdio.h>
int main() {
int a[3][4] = {0};
printf("分析结果:\n\n");
// 1. sizeof(a) - 整个数组的大小
printf("sizeof(a) = %zu\n", sizeof(a));
printf("含义: 整个二维数组a的大小 = 3行 × 4列 × sizeof(int) = 3×4×4 = 48字节\n\n");
// 2. sizeof(a[0][0]) - 单个元素的大小
printf("sizeof(a[0][0]) = %zu\n", sizeof(a[0][0]));
printf("含义: 数组单个元素的大小 = sizeof(int) = 4字节\n\n");
// 3. sizeof(a[0]) - 第一行的大小
printf("sizeof(a[0]) = %zu\n", sizeof(a[0]));
printf("含义: 第一行数组的大小 = 4列 × sizeof(int) = 4×4 = 16字节\n\n");
// 4. sizeof(a[0]+1) - 指针运算
printf("sizeof(a[0]+1) = %zu\n", sizeof(a[0]+1));
printf("含义: a[0]在表达式中退化为指针,a[0]+1是指向第二列的指针,大小为指针大小(8字节)\n\n");
// 5. sizeof(*a[0]+1) - 解引用后的值加1
printf("sizeof(*a[0]+1) = %zu\n", sizeof(*a[0]+1));
printf("含义: *a[0]得到a[0][0]的值,加1后还是int类型,大小为4字节\n\n");
// 6. sizeof(a+1) - 数组指针运算
printf("sizeof(a+1) = %zu\n", sizeof(a+1));
printf("含义: a在表达式中退化为指针,a+1是指向第二行的指针,大小为指针大小(8字节)\n\n");
// 7. sizeof(*a+1) - 解引用后加1
printf("sizeof(*a+1) = %zu\n", sizeof(*a+1));
printf("含义: *a得到第一行数组的首地址,*a+1是指向第一行第二列的指针,大小为指针大小(8字节)\n\n");
// 8. sizeof(&a[0]+1) - 取地址后加1
printf("sizeof(&a[0]+1) = %zu\n", sizeof(&a[0]+1));
printf("含义: &a[0]是指向第一行的指针,&a[0]+1是指向第二行的指针,大小为指针大小(8字节)\n\n");
// 9. sizeof(*(&a[0]+1)) - 解引用指向第二行的指针
printf("sizeof(*(&a[0]+1)) = %zu\n", sizeof(*(&a[0]+1)));
printf("含义: *(&a[0]+1)得到第二行数组,大小为4×4=16字节\n\n");
// 10. sizeof(*a) - 解引用数组名
printf("sizeof(*a) = %zu\n", sizeof(*a));
printf("含义: *a得到第一行数组,大小为4×4=16字节\n\n");
// 11. sizeof(a[3]) - 超出边界的行
printf("sizeof(a[3]) = %zu\n", sizeof(a[3]));
printf("含义: a[3]虽然超出数组边界,但sizeof在编译时确定类型,仍按int[4]计算,大小为16字节\n");
return 0;
}
结果:

8.键盘输入一个长度为len(1 <= len < 30)的字符串,再输入一个正整数 m(1 <= m <= len),将此字符串中从第 m 个字符开始的剩余全部字符复制成为另一个字符串,并将这个新字符串输出
点击查看代码
#include <stdio.h>
#include <string.h>
int main() {
char str[31]; // 原始字符串,最大长度30+1
char newStr[31]; // 新字符串
int m, len;
// 输入字符串
printf("请输入一个字符串(长度1-30): ");
fgets(str, sizeof(str), stdin);
// 去除换行符
len = strlen(str);
if(len > 0 && str[len-1] == '\n') {
str[len-1] = '\0';
len--;
}
// 输入m
printf("请输入正整数m(1-%d): ", len);
scanf("%d", &m);
// 验证m的范围
if(m < 1 || m > len) {
printf("错误: m必须在1到%d之间\n", len);
return 1;
}
// 使用指针处理字符串复制
char *srcPtr = str + (m - 1); // 指向第m个字符
char *destPtr = newStr; // 指向新字符串开头
// 复制剩余字符
while(*srcPtr != '\0') {
*destPtr = *srcPtr;
srcPtr++;
destPtr++;
}
*destPtr = '\0'; // 添加字符串结束符
// 输出结果
printf("原始字符串: %s\n", str);
printf("从第%d个字符开始复制\n", m);
printf("新字符串: %s\n", newStr);
return 0;
}
结果:

浙公网安备 33010602011771号