实验7 指针

更新时间:2023-11-06 06:55:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验7 指针

【实验目的】

① 掌握指针的概念,会定义及使用指针变量、指针数组、行指针;

② 掌握指针的运算,会采用指针方法访问一维、二维数组;理解指针和数组的关系; ③ 掌握指针作为函数参数,设计通用的函数;实现对一维数组的排序、查找,矩阵运算;及常用的字符串处理函数;熟悉动态分配内存方法;

【实验7.1】在10个元素的数组中找出与平均值最接近的元素,并输出该元素的值(要求用数组指针访问一维数组)。 【指导】

算法分析:

本题要解决两个问题:

(1)计算10个元素的平均值;

(2)找出与平均值最接近的数组元素。

对于第(2)个问题,可以将第一个元素与平均值的差为基准,然后依次计算其余各个元素与平均值的差,并与基准进行比较(注意要按绝对值进行比较),从而找出最小值,它所对应的元素就是与平均值最接近的元素。

参考程序:

#include

#include void main() { int i,k;

float a[10],aver=0,b,diff,*p=a; for(i=0;i<10;i++)

scanf(\输入原始数据存入数组 for(i=0;i<10;i++)

aver+=p[i]; //计算累加和

aver/=10; //计算平均值 k=0;

diff=fabs(p[0]-aver); //计算第一个元素与平均值的差的绝对值 for(i=1;i<10;i++)

{ b=fabs(p[i]-aver);

if(b

printf(\ } 答案:

#include #include void main() {

int pi,k;

float a[10],aver=0,b,diff,*p=a; for (pi=0;pi<10;pi++) scanf(\ for(pi=0;pi<10;pi++) aver+=p[pi]; aver/=10;

printf(\平均值为:%f\\n\ k=0;

diff=fabs(p[0]-aver); for(pi=1;pi<10;pi++) {b=fabs(p[pi]-aver); if(b

printf(\最小差为:%f 最接近的元素为:%f\\n\}

【实验7.2】请编制程序,利用行指针,找出二维数组a[M][N]每一行中的最大值,然后从中找出最小值min。 【指导】

算法分析:

(1)先定义数组a[M][N],s[M]及指向数组a的行指针(*p)[N],将每一行的最大值存放在数组s中,然后在数组s中找出最小值。

(2)为了求出数组a第i行的最大值s[i],先令s[i]=a[i][0],然后将s[i]依次与a[i][1],a[i][2],……,a[i][N-1]比较,凡是比s[i]大的a[i][j]就赋给s[i],经N-1轮比较后,s[i]中存放的就是该行的最大值。

(3)根据题目要求用行指针操作,数组元素a[i][j]的地址可用p[i]+j、*(p+i)+j或&p[i][j]表示,数组元素a[i][j]的值可用p[i][j]、*(p[i]+j)或*(*(p+i)+j)表示。

参考程序:

#define M 5 #define N 5

#include void main()

{ int s[M],i,j,min;

static int a[M][N],(*p)[N]=a; for (i=0;i

scanf(\输入原始数据存入二维数组 for (i=0;i

for (j=1;j

s[i]=p[i][j]; }

min=s[0];

for (i=1;is[i]) min=s[i];

printf(\ }

【实验7.3】请编制函数calc,其功能是对传送过来的两个实数求出和值与差值,并通过两个指针形参分别将这两个值传送回调用函数。该函数原型为:

void calc(float x,float y,float *add,float *sub) 它用来计算x+y和x-y分别存入add和sub所指的存储单元中。

【提示】参照教材例6.11,理解指针作函数参数里,形参和实参的使用,将以下程序补充完整。

【参考程序】 #include

void calc(float x,float y,float *add,float *sub) {

*add=x+y, *sub=x-y; }

void main() { float x,y,add,sub; printf(\ scanf(\ calc(x,y,&add,&sub); printf(\}

【实验7.4】请编写一个函数fun(char *str),其功能是将str所指向的字符串中的所有小写字母前加一个下划线。例如,若str指向的字符串为:aBdEF3@#g,则执行fun(str)后,str指向的字符串被修改为:_aB_dEF3@#_g。 【指导】两遍扫描字符串,先计算出小写字母的个数numLower,然后将字符串分成numLower段,分别向后移动不同的步长pace。例如:对”aBdEF3@#g ”,分成3段,”aB”、 ”dEF3@#”、 ”g”,然后,将子串”g”移动3个字符位置后,插入下划线,将子串” dEF3@#”移动2个字符位置后,插入下划线,依此类推,完成操作。 【参考程序】

#define N 80

#include #include #include

#include

void fun(char *str); //函数声明

void main (void) { char buffer[N]=\

/* 函数实现 */

void fun(char *str) { int i, numLower, len, pace;

numLower = 0; //numLower表示小写字母个数 len = strlen(str); //len表示字符串长度 for(i=0; i

if (len+numLower > N-1) //定义的数组长度不足 { printf(\ exit(-1); }

i = len;

pace = numLower; //pace表示移动的步长 for( ; pace>0; pace--)

{ do //从字符串尾部开始,后移pace个字符位置

{ *(str+i+pace) = *(str+i); }while(!islower(*(str+i--))); *(str+i+pace) = '_'; //插入一个下划线 } }

fun(buffer); //函数调用 puts(buffer); //输出结果 }

【实验7.5】编写一个函数filter(char *str),将str所指向的字符串中,由”/*”包含的子串”*/”的部分删除掉。并编写程序测试该函数。

例如:对字符串”this is a test line, /*please delete the part of comment*/ no comment part should be included.”,调用函数处理后,字符串被修改为:

”this is a test line, no comment part should be included.”

【提示】该函数可用于删除C语言源程序中形如”/*…*/”的注释,有两种方法:

(1) 直接在原字符串上查找,删除,参考实验6.3。

(2) 利用一个工作数组,将非注释部分按顺序拷贝到该数组中,最后将其复制到源字符串空间。

【实验7.6】将下面的参考程序补充完整,要求编写如下一组函数,分别完成整型数组的数据录入、数据输出、取最大值、最小值、排序、查找和删除操作。主函数中定义一个足够大的整型数组bufferInt[N],作为数据缓冲区,用来存放非负整数,并调用这组函数实现相应

的功能。其中,

pBuffer指向数据缓冲区,n表示数据个数。 void initData(int *pBuffer, int n)为初始化模块,将pBuffer所指的缓冲区中的n个整数全部初始化为-1,表示该位置尚未被使用。

void inputData(int *pBuffer, int n)为输入模块,将从键盘读入得n个整数存入pBuffer所指的缓冲区中。

void printData(int *pBuffer, int n, int col)为输出模块,将pBuffer指向的n个整数,按每行col个元素显示出来。

int maxData(int *pBuffer, int n)为求最大值模块,返回pBuffer指向的n个整数中的最大值。

int minData(int *pBuffer, int n) 为求最小值模块,返回pBuffer指向的n个整数中的最小值。

void sortData(int *pBuffer, int n, int flag)为排序模块,对pBuffer指向的n个整数进行排序,flag=1,按升序排列,flag=-1,按降序排列。

int searchData(int *pBuffer, int n, int data )为查找模块,对pBuffer指向的n个整数,查找值等于data的元素。如查找成功,返回该元素相对于pBuffer的偏移徝(下标值);如未查找到,返回-1。

void deleteData(int *pBuffer, int n, int pos)为删除模块,删除位置pos处的数据,并将其后的数据按顺利向前移,最后一个位置置-1。

#include #include #define N 80

/* 函数声明 */

void initData(int *pBuffer, int n); //初始化模块 void inputData(int *pBuffer, int n); //输入数据模块 void printData(int *pBuffer, int n, int col); //输出数据模块 int maxData(int *pBuffer, int n); //求最大值模块 int minData(int *pBuffer, int n); //求最小值模块 void sortData(int *pBuffer, int n, int flag); //排序模块 int searchData(int *pBuffer, int n, int data ); //查找模块 void deleteData(int *pBuffer, int n, int pos); //删除模块

void main (void) { int bufferInt[N];

int num; //实际需要处理的整数个数

int data,pos,n; //data为要查找的数,pos为要插入数据的位置 printf(\scanf(\

initData(bufferInt, num); //缓冲区初始化 inputData(bufferInt, num); //输入num个整数 printData(bufferInt, num, 5);//按每行5个输出缓冲区中的num个整数

本文来源:https://www.bwwdw.com/article/knp2.html

Top