admin 管理员组

文章数量: 1184232


2024年4月22日发(作者:电脑滚动代码)

实验八 数组、指针和函数综合编程练习

打印最高分和学号

假设每班人数最多不超过40人,具体人数由键盘输入,试编程打印最高分及其学号。

程序1:用一维数组和指针变量作函数参数,编程打印某班一门课成绩的最高分和学号。

程序2:用二维数组和指针变量作函数参数,编程打印3个班学生(假设每班4个学生)

的某门课成绩的最高分,并指出具有该最高分成绩的学生是第几个班的第几个学生。

程序3:用指向二维数组第0行第0列元素的指针作函数参数,编写一个能计算任意m

行n列的二维数组中的最大值,并指出其所在的行列下标值的函数,利用该函数计算3个班

学生(假设每班4个学生)的某门课成绩的最高分,并指出具有该最高分成绩的学生是第几

个班的第几个学生。

程序4:编写一个能计算任意m行n列的二维数组中的最大值,并指出其所在的行列下

标值的函数,利用该函数和动态内存分配方法,计算任意m个班、每班n个学生的某门课

成绩的最高分,并指出具有该最高分成绩的学生是第几个班的第几个学生。

实验授课提示:

熟悉数组、指针和函数的综合编程方法。

初学者通常都会对指针望而生畏,其实只要从原理上掌握了指针的概念,它就会变得如

此简单而易用。首先,指针不过是C语言提供的一种比较特殊的数据类型而已,定义为指

针类型的变量与其它类型的变量相比,主要差别在于指针变量的值是一个内存地址。其次,

在C语言中,指针和数组之间有着密不可分的关系,不带下标的数组名就是一个指针,它

代表数组元素的首地址,只要让声明为相同基类型的指针变量指向数组元素的首地址,那么

对数组元素的引用,既可以用下标法,也可以用指针法,用指针法存取数组比用数组下标存

取数组速度快一些。反之,任何指针变量也可以取下标,可以像对待数组一样来使用。虽然

多维数组的地址概念稍微麻烦些,但只要知道它的元素在内存中是如何存放的,使用也就不

难了,由于C语言中的多维数组都是按列存放的,因此,用指针法引用时,必须知道数组

的一行有多长(即列的维数)。在某种意义上,二维数组类似于一个由指向行数组的指针构

成的一维指针数组。多于二维的数组可以通过类似方法进行降维处理。

指针的一个重要应用是用指针作函数参数,为函数提供修改调用变元的手段。当指针作

函数参数使用时,需要将函数外的某个变量的地址传给函数相应的指针变元,这时,函数内

的代码可以通过指针变元改变函数外的这个变量的值。

指针的另一个重要应用是同动态内存分配函数联用,使得定义动态数组成为可能。

本题程序1中,用到了一维数组作为函数参数,程序2用到了指向二维数组的行指针作

函数参数,程序3用到了指向二维数组的列指针作函数参数,程序4用到了动态内存分配实

现动态数组。

参考答案:

实验八 数组、指针和函数综合编程练习

程序1参考答案:

#include

#define ARR_SIZE 40

int FindMax(int score[], long num[], int n, long *pMaxNum);

main()

{

int score[ARR_SIZE], maxScore, n, i;

long num[ARR_SIZE], maxNum;

printf("Please enter total number:");

scanf("%d", &n); /*从键盘输入学生人数n*/

printf("Please enter the number and score:n");

for(i=0; i

{

scanf("%ld%d", &num[i], &score[i]);

}

maxScore = FindMax(score, num, n, &maxNum); /*计算最高分及其学号*/

printf("maxScore = %d, maxNum = %ldn", maxScore, maxNum);

}

/* 函数功能:计算最高分及最高分学生的学号

函数参数:整型数组score,存储学生的成绩

长整型数组num,存储学生的学号

长整型指针变量pMaxNum,存储求出来的最高分学生的学号

函数返回值:最高分

*/

int FindMax(int score[], long num[], int n, long *pMaxNum)

{

int i;

int maxScore;

maxScore = score[0];

*pMaxNum = num[0]; /*假设score[0]为最高分*/

for (i=1; i

if (score[i] > maxScore)

{

maxScore = score[i]; /*记录最高分*/

*pMaxNum = num[i]; /*记录最高分学生的学号num[i]*/

}

return (maxScore); /*返回最高分maxScore*/

}

程序运行结果如下:

Please enter total number:5↙

Please enter the number and score:

99011 84↙

99012 83↙

99013 88↙

99014 87↙

99015 61↙

maxScore = 88, maxNum = 99013

程序2参考答案:

#include

#define CLASS 3

#define STU 4

int FindMax(int score[CLASS][STU], int m, int *pRow, int *pCol);

main()

{

int score[CLASS][STU], i, j, maxScore, row, col;

printf("Please enter score:n");

for (i=0; i

{

for (j=0; j

{

scanf("%d", &score[i][j]); /*输入学生成绩*/

}

}

/*计算最高分及其所在班号和学号*/

maxScore = FindMax(score, CLASS, &row, &col);

printf("maxScore = %d, class = %d, number = %dn",

maxScore, row+1, col+1);

}

/* 函数功能: 计算任意m行STU列的二维数组中的最大值、并指出其所在行列下标值

函数入口参数:二维整型数组score,存储学生的成绩

整型变量m,二维整型数组的行数,代表班级数

函数出口参数:整型指针变量pRow,指向数组最大值所在的行

整型指针变量pCol,指向数组最大值所在的列

函数返回值: 数组元素的最大值

*/

int FindMax(int score[][STU], int m, int *pRow, int *pCol)

{

int i, j, maxScore;

maxScore = score[0][0]; /*置初值,假设第一个元素值最大*/

*pRow = 0;

*pCol = 0;

for (i = 0; i

{

for (j = 0; j

{

if (score[i][j] > maxScore)

{

maxScore = score[i][j]; /*记录当前最大值*/

*pRow = i; /*记录行下标*/

*pCol = j; /*记录列下标*/

} /*if结束*/

} /*内层for结束*/

} /*外层for结束*/

return (maxScore); /*返回最大值*/

}

程序3参考答案:

#include

#define CLASS 3

#define STU 4

int FindMax(int *p, int m, int n, int *pRow, int *pCol);

main()

{

int score[CLASS][STU], i, j, maxScore, row, col;

printf("Please enter score:n");

for (i=0; i

{

for (j=0; j

{

scanf("%d", &score[i][j]); /*输入学生成绩*/

}

}

/*计算最高分及其所在班号和学号*/

maxScore = FindMax(*score, CLASS, STU, &row, &col);

printf("maxScore = %d, class = %d, number = %dn",

maxScore, row+1, col+1);

}

/*函数功能: 计算任意m行n列的二维数组中的最大值、并指出其所在的行列下标值

函数入口参数:整型指针变量p,指向一个二维整型数组的第0行第0列

整型变量m,二维整型数组的行数

整型变量n,二维整型数组的列数

函数出口参数:整型指针变量pRow,指向数组最大值所在的行

整型指针变量pCol,指向数组最大值所在的列

函数返回值: 数组元素的最大值

*/

int FindMax(int *p, int m, int n, int *pRow, int *pCol)

{

int i, j, maxScore;

maxScore = p[0]; /*置初值,假设第一个元素值最大*/

*pRow = 0;

*pCol = 0;

for (i = 0; i

{

for (j = 0; j

{

if (p[i*n+j] > maxScore)

{

maxScore = p[i*n+j]; /*记录当前最大值*/

*pRow = i; /*记录行下标*/

*pCol = j; /*记录列下标*/

} /*if结束*/

} /*内层for结束*/

} /*外层for结束*/

return (maxScore); /*返回最大值*/

}

程序运行结果如下:

Please enter score:

81 72 73 64↙

65 86 77 88↙

91 90 85 92↙

max = 92, class = 3, number = 4

程序4参考答案:

#include

#include

int FindMax(int *p, int m, int n, int *pRow, int *pCol);

main()

{

int *pScore, i, j, m, n, maxScore, row, col;

printf("Please enter array size m,n:");

scanf("%d,%d", &m, &n); /*输入班级数m和学生数n*/

/*申请m*n个sizeof(int)字节的存储空间*/

pScore = (int *) calloc(m*n, sizeof (int));

if (pScore == NULL)

{

printf("No enough memory!n");

exit(0);

}

printf("Please enter the score:n");

for (i = 0; i

{

for (j = 0; j

{

scanf("%d", &pScore [i*n+j]); /*输入学生成绩*/

}

}

maxScore = FindMax(pScore, 3, 4, &row, &col); /*调用函数FindMax*/

/*输出最高分max及其所在的班级和学号*/

printf("maxScore = %d, class = %d, number = %dn",

maxScore, row+1, col+1);

free(pScore); /*释放向系统申请的存储空间*/

}

/* 函数功能: 计算任意m行n列的二维数组中的最大值,并指出其所在行列下标值

函数入口参数:整型指针变量p,指向一个二维整型数组的第0行第0列

整型变量m,二维整型数组的行数

整型变量n,二维整型数组的列数

函数出口参数:整型指针变量pRow,指向数组最大值所在的行

整型指针变量pCol,指向数组最大值所在的列

函数返回值: 数组元素的最大值

*/

int FindMax(int *p, int m, int n, int *pRow, int *pCol)

{

int i, j, max;

max = p[0]; /*置初值,假设第一个元素值最大*/

*pRow = 0;

*pCol = 0;

for (i = 0; i

{

for (j = 0; j

{

if (p[i*n+j] > max)

{

max = p[i*n+j]; /*记录当前最大值*/

*pRow = i; /*记录行下标*/

*pCol = j; /*记录列下标*/

} /*if结束*/

} /*内层for结束*/

} /*外层for结束*/

return (max); /*返回最大值*/

}

程序运行结果如下:

Please enter array size m,n:3,4↙

Please enter the score:

81 72 73 64↙

65 86 77 88↙

91 90 85 92↙

maxScore = 92, class = 3, number = 4


本文标签: 数组 指针 函数 变量 指向