实验7 指针
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(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)表示。
voiddeleteData(int *pBuffer, int n, int pos)为删除模块,删除位置pos处的数据,并将其后的数据按顺利向前移,最后一个位置置-1。
#include <stdio.h>
#include <stdlib.h>
#define N 80
/* 函数声明 */
void initData(int *pBuffer, int n);//初始化模块
实验
【实验目的】
1掌握指针的概念,会定义及使用指针变量、指针数组、行指针;
2掌握指针的运算,会采用指针方法访问一维、二维数组;理解指针和数组的关系;
3掌握指针作为函数参数,设计通用的函数;实现对一维数组的排序、查找,矩阵运算;及常用的字符串处理函数;熟悉动态分配内存方法;
【实验7.1】在10个元素的数组中找出与平均值最接近的元素,并输出该元素的值(要求用数组指针访问一维数组)。
【提示】参照教材例6.11,理解指针作函数参数里,形参和实参的使用,将以下程序补充完整。
【参考程序】
#include <stdio.h>
void calc(float x,float y,float *add,float *sub)
{
*add=x+y,
*sub=x-y;
}
void main()
{
float x,y,add,sub;
void sortData(int *pBuffer, int n, int flag);//排序模块
int searchData(int *pBuffer, int n, int data );//查找模块
voiddeleteData(int *pBuffer, int n, int pos);//删除模块
}
}
【实验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)利用一个工作数组,将非注释部分按顺序拷贝到该数组中,最后将其复制到源字符串空间。
【指导】
算法分析:
本题要解决两个问题:
(1)计算10个元素的平均值;
(2)找出与平均值最接近的数组元素。
对于第(2)个问题,可以将第一个元素与平均值的差为基准,然后依次计算其余各个元素与平均值的差,并与基准进行比较(注意要按绝对值进行比较),从而找出最小值,它所对应的元素就是与平均值最接近的元素。
参考程序:
#include <math.h>
#include <stdio.h>
void main()
{ int i,k;
float a[10],aver=0,b,diff,*p=a;
for(i=0;i<10;i++)
scanf("%f",p+i); //输入原始数据存入数组
for(i=0;i<10;i++)
void initData(int *pBuffer, int n)为初始化模块,将pBuffer所指的缓冲区中的n个整数全部初始化为-1,表示该位置尚未被使用。
void inputData(int *pBuffer, int n)为输入模块,将从键盘读入得n个整数存入pBuffer所指的缓冲区中。
【参考程序】
#define N 80
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
void fun(char *str);//函数声明
voidmain (void)
{char buffer[N]="aBdEF3@#g";
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) = '_';//插入一个下划线
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 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个整数中的最小值。
【实验7.6】将下面的参考程序补充完整,要求编写如下一组函数,分别完成整型数组的数据录入、数据输出、取最大值、最小值、排序、查找和删除操作。主函数中定义一个足够大的整型数组bufferInt[N],作为数据缓冲区,用来存放非负整数,并调用这组函数实现相应的功能。其中,
pBuffer指向数据缓冲区,n表示数据个数。
}
printf("%f %f\n",diff,p[k]);
}
答案:
#include <math.h>
#include <stdio.h>
void main()
{
int pi,k;
float a[10],aver=0,b,diff,*p=a;
for (pi=0;pi<10;pi++)
scanf("%f",&p[pi]);
}
printf("最小差为:%f最接近的元素为:%f\n",diff,a[k]);
}
【实验7.2】请编制程序,利用行指针,找出二维数组a[M][N]每一行中的最大值,然后从中找出最小值min。
【指导】
算法分析:
(1)先定义数组a[M][N],s[M]及指向数组a的行指针(*p)[N],将每一行的最大值存放在数组s中,然后在数组s中找出最小值。
voidmain (void)
{int bufferInt[N];
int num;//实际需要处理的整数个数
int data,pos,n; //data为要查找的数,pos为要插入数据的位置
printf("inputቤተ መጻሕፍቲ ባይዱnumber=");
scanf("%d", &num);
initData(bufferInt, num);//缓冲区初始化
for(i=0; i<len; i++)//统计小写字母的个数
{if( islower(*(str+i)))
numLower++;
}
if (len+numLower > N-1)//定义的数组长度不足
{printf("Do nothing: having risk of buffer overflow!");
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);//求最小值模块
for(pi=0;pi<10;pi++)
aver+=p[pi];
aver/=10;
printf("平均值为:%f\n",aver);
k=0;
diff=fabs(p[0]-aver);
for(pi=1;pi<10;pi++)
{b=fabs(p[pi]-aver);
if(b<diff)
{diff=b;k=pi;}
【指导】两遍扫描字符串,先计算出小写字母的个数numLower,然后将字符串分成numLower段,分别向后移动不同的步长pace。例如:对”aBdEF3@#g”,分成3段,”aB”、”dEF3@#”、”g”,然后,将子串”g”移动3个字符位置后,插入下划线,将子串”dEF3@#”移动2个字符位置后,插入下划线,依此类推,完成操作。
参考程序:
#define M 5
#define N 5
#include <stdio.h>
void main()
{ int s[M],i,j,min;
static int a[M][N],(*p)[N]=a;
for (i=0;i<M;i++)
for (j=0;j<N;j++)
scanf("%d",p[i]+j); //输入原始数据存入二维数组
printf("Min=%d\n",min);
}
【实验7.3】请编制函数calc,其功能是对传送过来的两个实数求出和值与差值,并通过两个指针形参分别将这两个值传送回调用函数。该函数原型为:
void calc(float x,float y,float *add,float *sub)
它用来计算x+y和x-y分别存入add和sub所指的存储单元中。
fun(buffer);//函数调用
puts(buffer);//输出结果
}
/* 函数实现 */
void fun(char *str)
{int i, numLower, len, pace;
numLower = 0;//numLower表示小写字母个数
len = strlen(str);//len表示字符串长度
printf("Enter x,y:");
scanf("%f%f",&x,&y);
calc(x,y,&add,&sub);
printf("x+y=%f,x-y=%f\n",add,sub);
}
【实验7.4】请编写一个函数fun(char *str),其功能是将str所指向的字符串中的所有小写字母前加一个下划线。例如,若str指向的字符串为:aBdEF3@#g,则执行fun(str)后,str指向的字符串被修改为:_aB_dEF3@#_g。
inputData(bufferInt, num);//输入num个整数
printData(bufferInt, num, 5);//按每行5个输出缓冲区中的num个整数
printf("Max=%d\n",maxData(bufferInt,num));//输出最大值
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<diff) //寻找最接近于平均值的元素及其位置
{ diff=b; k=i; }
for (i=0;i<M;i++)
{ s[i]=p[i][0];
for (j=1;j<N;j++) //求每行最大值分别保存在数组s中
if (s[i]<p[i][j])
s[i]=p[i][j];
}
min=s[0];
for (i=1;i<M;i++) //求s中的最小值
if (min>s[i])
min=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)表示。
voiddeleteData(int *pBuffer, int n, int pos)为删除模块,删除位置pos处的数据,并将其后的数据按顺利向前移,最后一个位置置-1。
#include <stdio.h>
#include <stdlib.h>
#define N 80
/* 函数声明 */
void initData(int *pBuffer, int n);//初始化模块
实验
【实验目的】
1掌握指针的概念,会定义及使用指针变量、指针数组、行指针;
2掌握指针的运算,会采用指针方法访问一维、二维数组;理解指针和数组的关系;
3掌握指针作为函数参数,设计通用的函数;实现对一维数组的排序、查找,矩阵运算;及常用的字符串处理函数;熟悉动态分配内存方法;
【实验7.1】在10个元素的数组中找出与平均值最接近的元素,并输出该元素的值(要求用数组指针访问一维数组)。
【提示】参照教材例6.11,理解指针作函数参数里,形参和实参的使用,将以下程序补充完整。
【参考程序】
#include <stdio.h>
void calc(float x,float y,float *add,float *sub)
{
*add=x+y,
*sub=x-y;
}
void main()
{
float x,y,add,sub;
void sortData(int *pBuffer, int n, int flag);//排序模块
int searchData(int *pBuffer, int n, int data );//查找模块
voiddeleteData(int *pBuffer, int n, int pos);//删除模块
}
}
【实验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)利用一个工作数组,将非注释部分按顺序拷贝到该数组中,最后将其复制到源字符串空间。
【指导】
算法分析:
本题要解决两个问题:
(1)计算10个元素的平均值;
(2)找出与平均值最接近的数组元素。
对于第(2)个问题,可以将第一个元素与平均值的差为基准,然后依次计算其余各个元素与平均值的差,并与基准进行比较(注意要按绝对值进行比较),从而找出最小值,它所对应的元素就是与平均值最接近的元素。
参考程序:
#include <math.h>
#include <stdio.h>
void main()
{ int i,k;
float a[10],aver=0,b,diff,*p=a;
for(i=0;i<10;i++)
scanf("%f",p+i); //输入原始数据存入数组
for(i=0;i<10;i++)
void initData(int *pBuffer, int n)为初始化模块,将pBuffer所指的缓冲区中的n个整数全部初始化为-1,表示该位置尚未被使用。
void inputData(int *pBuffer, int n)为输入模块,将从键盘读入得n个整数存入pBuffer所指的缓冲区中。
【参考程序】
#define N 80
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
void fun(char *str);//函数声明
voidmain (void)
{char buffer[N]="aBdEF3@#g";
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) = '_';//插入一个下划线
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 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个整数中的最小值。
【实验7.6】将下面的参考程序补充完整,要求编写如下一组函数,分别完成整型数组的数据录入、数据输出、取最大值、最小值、排序、查找和删除操作。主函数中定义一个足够大的整型数组bufferInt[N],作为数据缓冲区,用来存放非负整数,并调用这组函数实现相应的功能。其中,
pBuffer指向数据缓冲区,n表示数据个数。
}
printf("%f %f\n",diff,p[k]);
}
答案:
#include <math.h>
#include <stdio.h>
void main()
{
int pi,k;
float a[10],aver=0,b,diff,*p=a;
for (pi=0;pi<10;pi++)
scanf("%f",&p[pi]);
}
printf("最小差为:%f最接近的元素为:%f\n",diff,a[k]);
}
【实验7.2】请编制程序,利用行指针,找出二维数组a[M][N]每一行中的最大值,然后从中找出最小值min。
【指导】
算法分析:
(1)先定义数组a[M][N],s[M]及指向数组a的行指针(*p)[N],将每一行的最大值存放在数组s中,然后在数组s中找出最小值。
voidmain (void)
{int bufferInt[N];
int num;//实际需要处理的整数个数
int data,pos,n; //data为要查找的数,pos为要插入数据的位置
printf("inputቤተ መጻሕፍቲ ባይዱnumber=");
scanf("%d", &num);
initData(bufferInt, num);//缓冲区初始化
for(i=0; i<len; i++)//统计小写字母的个数
{if( islower(*(str+i)))
numLower++;
}
if (len+numLower > N-1)//定义的数组长度不足
{printf("Do nothing: having risk of buffer overflow!");
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);//求最小值模块
for(pi=0;pi<10;pi++)
aver+=p[pi];
aver/=10;
printf("平均值为:%f\n",aver);
k=0;
diff=fabs(p[0]-aver);
for(pi=1;pi<10;pi++)
{b=fabs(p[pi]-aver);
if(b<diff)
{diff=b;k=pi;}
【指导】两遍扫描字符串,先计算出小写字母的个数numLower,然后将字符串分成numLower段,分别向后移动不同的步长pace。例如:对”aBdEF3@#g”,分成3段,”aB”、”dEF3@#”、”g”,然后,将子串”g”移动3个字符位置后,插入下划线,将子串”dEF3@#”移动2个字符位置后,插入下划线,依此类推,完成操作。
参考程序:
#define M 5
#define N 5
#include <stdio.h>
void main()
{ int s[M],i,j,min;
static int a[M][N],(*p)[N]=a;
for (i=0;i<M;i++)
for (j=0;j<N;j++)
scanf("%d",p[i]+j); //输入原始数据存入二维数组
printf("Min=%d\n",min);
}
【实验7.3】请编制函数calc,其功能是对传送过来的两个实数求出和值与差值,并通过两个指针形参分别将这两个值传送回调用函数。该函数原型为:
void calc(float x,float y,float *add,float *sub)
它用来计算x+y和x-y分别存入add和sub所指的存储单元中。
fun(buffer);//函数调用
puts(buffer);//输出结果
}
/* 函数实现 */
void fun(char *str)
{int i, numLower, len, pace;
numLower = 0;//numLower表示小写字母个数
len = strlen(str);//len表示字符串长度
printf("Enter x,y:");
scanf("%f%f",&x,&y);
calc(x,y,&add,&sub);
printf("x+y=%f,x-y=%f\n",add,sub);
}
【实验7.4】请编写一个函数fun(char *str),其功能是将str所指向的字符串中的所有小写字母前加一个下划线。例如,若str指向的字符串为:aBdEF3@#g,则执行fun(str)后,str指向的字符串被修改为:_aB_dEF3@#_g。
inputData(bufferInt, num);//输入num个整数
printData(bufferInt, num, 5);//按每行5个输出缓冲区中的num个整数
printf("Max=%d\n",maxData(bufferInt,num));//输出最大值
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<diff) //寻找最接近于平均值的元素及其位置
{ diff=b; k=i; }
for (i=0;i<M;i++)
{ s[i]=p[i][0];
for (j=1;j<N;j++) //求每行最大值分别保存在数组s中
if (s[i]<p[i][j])
s[i]=p[i][j];
}
min=s[0];
for (i=1;i<M;i++) //求s中的最小值
if (min>s[i])
min=s[i];