高级语言程序设计第七次作业
高级语言程序设计第七次作业
(1)用指针与下标进行赋值与输出
定义一个二维数组和指向该数组的指针,分别以数组下标和指针的形式引用数组各个元素进行赋值与输出。
下标

指针

一步步拆解
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++;
}
接下来要做的就是让每一个循环向内缩一圈



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



(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)给定一个二维数组,使用指针把数组中的数字复制到另一个数组中相同的位置。


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

(7)含义解释

#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 个字符开始的剩余全部字符复制成为另一个字符串,并将这个新字符串输出。要求用指针处理字符串。

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

浙公网安备 33010602011771号