高级语言程序设计课程第七次个人作业
高级语言程序设计课程第七次个人作业
- 这个作业属于哪个课程:2024高级语言程序设计
- 这个作业要求在哪里:高级语言程序设计课程第七次个人作业
- 学号:032201218
- 姓名:陈彦哲
一、完成1-8题
1.1
题目:
定义一个二维数组和指向该数组的指针,分别以数组下标和指针的形式引用数组各个元素进行赋值与输出。
#include <stdio.h> int main() { int arr[5][6]; int (*ptr)[6] = arr; for (int i = 0; i < 5; i++) { for (int j = 0; j < 6; j++) { arr[i][j] = i * 6 + j + 1; } } for (int i = 0; i < 5; i++) { for (int j = 0; j < 6; j++) { printf("%d ", arr[i][j]); } printf("\n"); } printf("\n"); for (int i = 0; i < 5; i++) { for (int j = 0; j < 6; j++) { printf("%d ", *(ptr[i] + j)); } printf("\n"); } printf("\n"); return 0; }
思路:
根据题意理解即可。
问题:无
解决:无
1.2
题目:
构造螺旋方阵。对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。
#include <stdio.h> int main() { int N; printf("请输入矩阵的维数:\n"); scanf("%d", &N); int matrix[N][N]; int left = 0, right = N - 1, top = 0, bottom = N - 1; int num = 1; while (left <= right && top <= bottom) { for (int i = left; i <= right; i++) { matrix[top][i] = num++; } top++; for (int i = top; i <= bottom; i++) { matrix[i][right] = num++; } right--; if (left <= right && top <= bottom) { for (int i = right; i >= left; i--) { matrix[bottom][i] = num++; } bottom--; for (int i = bottom; i >= top; i--) { matrix[i][left] = num++; } left++; } } for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { printf("%d ", matrix[i][j]); } printf("\n"); } return 0; }
思路:按题意理解即可
问题:无
解决:无
1.3
题目:7门课程的成绩分别存放在score[n][1]、score[n][2]、...、score[n][7]中,第0列用来存放总成绩。请编写一个函数实现计算成绩表score中每一个学生7门课程的总成绩,并将总成绩存放在该学生的第0列中。请在main函数中构造数据测试你写的函数。
#include <stdio.h> void CalculateTotalScore(int score[][8], int n) { for (int i = 0; i < n; i++) { int total = 0; for (int j = 1; j <= 7; j++) { total += score[i][j]; } score[i][0] = total; } } int main() { // 测试数据 int score[6][8] = { {0, 77, 90, 78, 92, 88, 76, 85}, {0, 72, 84, 70, 85, 90, 68, 78}, {0, 61, 88, 92, 85, 47, 80, 82}, {0, 65, 70, 72, 61, 60, 75, 70}, {0, 88, 85, 62, 95, 87, 92, 79}, {0, 18, 84, 42, 94, 84, 94, 59} }; int n = 6; CalculateTotalScore(score, n); printf("Student\tSum\tCourse1\tCourse2\tCourse3\tCourse4\tCourse5\tCourse6\tCourse7\n"); for (int i = 0; i < n; i++) { printf("%d\t%d\t", i + 1, score[i][0]); for (int j = 1; j <= 7; j++) { printf("%d\t", score[i][j]); } printf("\n"); } return 0; }
思路:按题意理解即可
问题:无
解决:无
1.4
题目:将以下定义的含义写出来。
a)int a; b)int *a; c)int **a; d)int a[10]; e)int (*a)[10];
解答:
int a;:定义一个整型变量 int *a;:定义一个整型指针 int **a;:定义一个指向整型指针的指针 int a[10];:定义一个包含10个整数元素的数组 int (*a)[10];:定义一个指向含有10个整数元素的数组的指针
思路:按题意理解即可
问题:无
解决:无
1.5
题目:给定一个二维数组,使用指针把数组中的数字复制到另一个数组中相同的位置。
#include <stdio.h> int main() { int a[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; int myCopy[3][3]; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { *((int *)myCopy + i * 3 + j) = *((int *)a + i * 3 + j); } } printf("原始的数组:\n"); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { printf("%d ", a[i][j]); } printf("\n"); } printf("\n复制的数组:\n"); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { printf("%d ", myCopy[i][j]); } printf("\n"); } return 0; }
思路:按题意理解即可
问题:无
解决:无
1.6
题目:请编写一个函数,接受一个字符串指针作为参数,并返回该字符串的长度,不包括字符串结尾的空字符。
#include <stdio.h> int stringLength(char *str) { int length = 0; while (*str != '\0') { length++; str++; } return length; } int main() { char str[] = "I am Chen Yanzhe, I love China."; printf("%s\n",str); printf("字符串长度: %d\n", stringLength(str)); return 0; }
思路:按题意理解即可
问题:无
解决:无
1.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]));)
解答如下:
#include <stdio.h> int main() { 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])); return 0; }
解答:
printf("%d\n",sizeof(a)):a是一个3x4的二维数组,每个元素的大小是int 类型,所以sizeof(a)计算的是整个数组的大小。即3*4*sizeof(int),结果是 48。 printf("%d\n",sizeof(a[0][0])):sizeof(a[0][0])计算的是一个int类型的大小,所以为4。 printf("%d\n",sizeof(a[0])):计算的是第一行数组的大小,所以是4*sizeof(int)=16。 printf("%d\n",sizeof(a[0]+1)):a[0]是一个指向包含4个int元素的数组的指针。a[0]+1是指向第二个int元素的指针。sizeof(a[0]+1)计算的是指针类型的大小,即指针的大小,为8(我的电脑是64位的)。 printf("%d\n",sizeof(*(a[0]+1))):*(a[0]+1)访问第二个int元素,计算的是int类型的大小,即4。 printf("%d\n",sizeof(a+1)):a是一个指向二维数组的指针,a+1是指向数组第二行的指针。sizeof(a+1)计算的是指针类型的大小,是8。 printf("%d\n",sizeof(*(a+1))):a+1是指向数组第二行的指针,*(a + 1)返回第二行数组,sizeof(*(a+1))计算的是第二行数组的大小,为4*4=16。 printf("%d\n",sizeof(&a[0]+1)):&a[0]是指向数组第一行的指针,&a[0]+1是指向数组第二行的指针。sizeof(&a[0]+1)计算的是指针类型的大小,为4 printf("%d\n",sizeof(*(&a[0]+1))):&a[0]+1是指向数组第二行的指针,*(&a[0]+1)返回第二行数组,sizeof(*(&a[0]+1))计算的是第二行数组的大小,即4*sizeof(int)=16。 printf("%d\n",sizeof(*a)):a是二维数组的名字,即指向第一行数组的指针。*a返回第一行数组,sizeof(*a) 计算的是第一行数组的大小,即4*sizeof(int)=16。 printf("%d\n",sizeof(a[3])):a[3]是数组的第四行,它是一个包含4个int元素的数组。sizeof(a[3])计算的是该行数组的大小,即4*sizeof(int)=16。
思路:按题意理解即可
问题:无
解决:无
1.8
题目:
键盘输入一个长度为len(1 <= len < 30)的字符串,再输入一个正整数 m(1 <= m <= len),将此字符串中从第 m 个字符开始的剩余全部字符复制成为另一个字符串,并将这个新字符串输出。要求用指针处理字符串。
#include <stdio.h> int main() { char str[30], newStr[30]; int m; //用fgets防止空格造成的问题 fgets(str, 30, stdin); scanf("%d", &m); char *ptr = str + m - 1; char *newPtr = newStr; while (*ptr) { *newPtr = *ptr; ptr++; newPtr++; } *newPtr = '\0'; printf("%s\n", newStr); return 0; }
思路:按题意理解即可
问题:一开始没有很好地解决空格的读取问题
解决:使用了fgets
函数,问题就迎刃而解了
三、总结思考:
- 复习了C语言读取字符串的各种方法,请点击这里跳转
- 复习了二维数组的使用
- 通过第七题复习了很多指针相关的内容,让我的基础更为扎实了,受益良多
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」