高级语言程序设计课程第七次个人作业
高级语言程序设计课程第七次个人作业
- 这个作业属于哪个课程: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语言读取字符串的各种方法,请点击这里跳转
- 复习了二维数组的使用
- 通过第七题复习了很多指针相关的内容,让我的基础更为扎实了,受益良多