高级语言程序设计第七次作业

高级语言程序设计第七次作业

(1)用指针与下标进行赋值与输出

定义一个二维数组和指向该数组的指针,分别以数组下标和指针的形式引用数组各个元素进行赋值与输出。

下标

image

指针

image

一步步拆解
1、p 的类型是 int (*)[9]——指向一行 9 个 int 的指针。
2、p + i
指针算术:跳过 i 行,得到指向第 i 行的指针(类型仍是 int (*)[9])。
3、*(p + i)
对指针解引用,拿到第 i 行本身(类型退化为 int *,指向 arr[i][0])。
4、*(p + i) + j
在第 i 行的地址上再偏移 j 个 int,得到指向 arr[i][j] 的指针(类型 int *)。
5、&*(*(p + i) + j)
再取地址……取完地址又解引用,再取地址,等于什么都没干,最终就是 &arr[i][j]。
可以简化写成*(p + i) + j

(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
先写出绕一圈的代码

for(int j=0;j<=n-1;j++)
{
	arr[1][j] = m;
	m++;
}
for (int i = 0; i <= n-1; i++)
{
	arr[i][n - 1] = m;
	m++;
}
for (int j = n - 1; j >= 0; j--)
{
	arr[n - 1][j] = m;
	m++;
}
for (int i = n - 1; i >=0+1; i++)
{
	arr[i][1] = m;
	m++;
}

接下来要做的就是让每一个循环向内缩一圈
联想截图_20251125193959
联想截图_20251125194015
联想截图_20251125182610

(3)放成绩

7门课程的成绩分别存放在score[n][1]、score[n][2]、...、score[n][7]中,第0列用来存放总成绩。请编写一个函数实现计算成绩表score中每一个学生7门课程的总成绩,并将总成绩存放在该学生的第0列中。请在main函数中构造数据测试你写的函数。
联想截图_20251125193826
联想截图_20251125193835
联想截图_20251125193806

(4)将以下定义的含义写出来。

a)int a; b)int a; c)int **a; d)int a[10]; e)int (a)[10];

int a;//定义一个整型变量a
int*a;//定义一个指向数据类型是整型的指针
int **a;//定义一个指向指针的指针,指向类型为整型
int a[10];//定义一个长度为10的数组
int(*a)[10];//定义一个指向“长度为10的int类型的二维数组”的行指针

(5)给定一个二维数组,使用指针把数组中的数字复制到另一个数组中相同的位置。

image
联想截图_20251125200331

(6)字符串长度

请编写一个函数,接受一个字符串指针作为参数,并返回该字符串的长度,不包括字符串结尾的空字符。
image

(7)含义解释

image

#include<stdio.h>

int main()
{
    int a[3][4] = { 0 };
    //sizeof计算括号内的元素的字节大小

    printf("%d\n", sizeof(a));
    //a表示整个二维数组,字节大小是3*4*4(因为类型是int所以最后还要*4)

    printf("%d\n", sizeof(a[0][0]));
    //表示第1行第1列的单个元素,数据类型为int,4个字节

    printf("%d\n", sizeof(a[0]));
    //表示第一行的数组,4*4=16

    printf("%d\n", sizeof(a[0] + 1));
    //a[0]表示第一行的首地址,值为a[0][0],a[0]+1表示a[0][1]的地址,则字节大小就是一个内存地址的字节大小8bit

    printf("%d\n", sizeof(*(a[0] + 1)));
    //a[0]+1表示一个指针,解引用后表示a[0][1]这个函数值,4个字节

    printf("%d\n", sizeof(a + 1));
    //a是数组名,二维数组中表示第1行的行指针,a+1就是第二行的行指针,指针8字节

    printf("%d\n", sizeof(*(a + 1)));
    //*(a + 1)解引用后表示第2行数组的首地址,sizeof里表示的是一整行的数组,大小为4*4=16

    printf("%d\n", sizeof(&a[0] + 1));
    //取a[0]的地址,表示的就是第一行数组,加1就是下一行的地址,8字节

    printf("%d\n", sizeof(*(&a[0] + 1)));
    //解引用后表示一整行的元素,16字节

    printf("%d\n", sizeof(*a));
    //表示第一行整行,16字节

    printf("%d\n", sizeof(a[3]));
    //长度为3,[]最多到二,但是不报错,还是表示整行数组,大小为16

	return 0;
}

(8)输出新字符串

键盘输入一个长度为len(1 <= len < 30)的字符串,再输入一个正整数 m(1 <= m <= len),将此字符串中从第 m 个字符开始的剩余全部字符复制成为另一个字符串,并将这个新字符串输出。要求用指针处理字符串。
image

总结与反思

本周课的难点在用指针表示二位数组,要分清每个符号在不同用法中代表什么含义。
比较困难的是第二题的螺旋数组,逻辑不能搞得非常清楚,写起来较吃力,要多刷OJ
课后对上课的易混易错知识要进行总结;

posted @ 2025-11-25 21:42  黄洁琳  阅读(0)  评论(0)    收藏  举报