当前位置:文档之家› 实验10 数组指针综合练习

实验10 数组指针综合练习

C程序设计实验10:数组指针综合练习
一、实验目的
1.熟悉一维数组元素指针的基本概念和使用方法;
2.熟悉指向二维数组元素指针的基本概念和使用方法;
3了解一维数组指针的基本概念和使用方法;
二、实验内容
1. 熟悉一维数组元素指针的基本概念和使用方法;
热身练习:设a为一维数组,内容为:1-9,有int *p=a; 写程序完成如下测试1
练习:对一列整数进行输入,输出和排序,分别用函数实现,在主程序中测试,Tips2:虽然功能和实验十一一样,但是,我们这次要用指针做为参数,来传递数组的地址了。

输入输出模块举例,首先写函数,数组和数组元素的个数作为形参,定义方法如下:void InputArray(int *pArray,//指向整型变量的指针,实参将一维数组首地址传递过来
int nArrayNum )//数组元素的具体个数
{
for(int i=0;i<nArrayNum;i++)
{
scanf("%d",pArray);//逐个输入数组的每个元素
pArray++;//每次指针加1,指向下一个元素
}
}
void OutputArray(int *pArray,//指向整型变量的指针,实参将一维数组首地址传递过来
int nArrayNum )//数组元素的具体个数
{
for(int i=0;i<nArrayNum;i++)
{
printf("%d ", *pArray);//逐个输出数组元素,然后指针加1,指向下一个元素
pArray++;
}
printf("\n");
}
练习1:在主函数中,测试一下这两个函数。

再根据例子,写出冒泡法排序的函数,用指针做参数。

Tips2 指针指向一维数组,作为函数的参数,是一般软件中非常常见的方法,要熟悉并掌握。

2.熟悉指向二维数组元素指针的基本概念和使用方法;
热身练习:设a为3*2的二维数组,内容为:1-6,有int *p=a; 写程序完成如下测试2
练习2,求二维数组中的最大数和最小数。

输入输出模块举例,首先写函数,数组和数组元素的个数作为形参,定义方法如下:
void InputArray(int *pArray,//指向整型变量的指针,实参将二维数组首地址传递过来
int nArrayRow, int nArrayCol)//数组元素的行数和列数
{
for(int i=0;i<nArrayRow;i++)
for(int j=0;j<nArrayCol,j++)
{
scanf("%d",pArray);//逐个输入数组的每个元素
pArray++;//每次指针加1,指向下一个元素
}
}
void OutputArray(int *pArray,//指向整型变量的指针,实参将二维数组首地址传递过来
int nArrayRow, int nArrayCol)//数组元素的行数和列数
{
for(int i=0;i<nArrayRow;i++)
for(int j=0;j<nArrayCol,j++)
{
printf("%d ", *pArray);//逐个输出数组元素,然后指针加1,指向下一个元素
pArray++;
}
printf("\n");
}
作业:写出求二维数组最大及最小数的函数及主程序,完成程序的功能。

问题:为什么pArray这个指针,既可以用来指一维数组元素,也可以用在指二维数组元素?在两个程序中,pArray++的意思相同吗?
Tips3 指针指向二维数组元素作为函数的参数,是一般软件中非常常见的方法,需要熟悉并掌握。

3.熟悉指针指向字符串的基本概念和使用方法。

参考如下实例,完成字符串的复制:
#include “stdio.h”
#include “string.h”
main()
{
char *sz1=“I am a teacher.”; //sz 是常见的字符串变量开头
char *sz2=“You are a student.”;//字符串的指针,是字符变量的指针,存放字符串的首地址printf(“string_a=%s\n string_b=%s\n”,a,b);//输出可以使用%s完成
copy_string(sz1,sz2);//调用函数完成字符串的复制
puts(sz1);//输入输出也可以使用string.h 库里的字符串函数完成
puts(sz2);
//自制的字符串复制函数
void copy_string(char *pFrom,*pTo)
{
while(*pFrom!=’\0’)
{
*pTo=*pFrom;
pFrom++;
pTo++;
}
*pTo=’\0’;//为什么要加这一句?
}
作业:仿照例子,写出把字符串2追加粘贴到字符串1的函数及主程序,如果两个字符串相等,则不粘贴。

例如:字符串1为stu,字符串2为dent,粘贴之后,字符串1变为:student。

判断字符串相等,可以使用:strcmp函数。

4.了解一维数组指针的基本概念和使用方法;
参考如下实例片段,该程序可以实现什么功能?请将程序补全。

float average(float *p,int n);
void search(float (*p)[N] ,int n);
#define M 3
#define N 4
main()
{
static float score[M][N]….//这里添加一个读入学生成绩的函数
printf(“average=%5.2f\n”, average(score,M*N));
search(score,2);
}
void search(float (*p)[N] ,int n)
{
int i;
printf(“the score of no.%d are:”,n);
for (i=0;i<N;i++)
printf(“%5.2f \n”,*(*(p+n)+i));
}
float average(float *p,int n)
{
float *p_end;
float sum=0,aver;
p_end=p+n-1;
for (;p<=p_end; p++)
sum=sum+(*p);
aver=sum/n;
return aver;
}
编写子函数,实现查找有一门以上课程不及格的学生,打印出他们的全部课程的成绩。

课堂练习过的,忽略该题目。

5.编写程序
对于一个n*n矩阵A。

矩阵A的鞍点是一个位置(i,j),在该位置上的元素是第i行上的最小数,第j列上的最大数。

一个矩阵A也可能没有鞍点。

你的任务是找出A的鞍点。

要求将二维数组的输入、输出、求鞍点和鞍点打印,分别用4个函数完成,数组的地址通过指针传递给子函数,用主程序依次调之。

作业:提交该程序源代码,并写作业反馈。

相关主题