实验7 指针
更新时间:2023-11-06 06:55:01 阅读量: 教育文库 文档下载
- 实验班提优训练推荐度:
- 相关推荐
实验7 指针
【实验目的】
① 掌握指针的概念,会定义及使用指针变量、指针数组、行指针;
② 掌握指针的运算,会采用指针方法访问一维、二维数组;理解指针和数组的关系; ③ 掌握指针作为函数参数,设计通用的函数;实现对一维数组的排序、查找,矩阵运算;及常用的字符串处理函数;熟悉动态分配内存方法;
【实验7.1】在10个元素的数组中找出与平均值最接近的元素,并输出该元素的值(要求用数组指针访问一维数组)。 【指导】
算法分析:
本题要解决两个问题:
(1)计算10个元素的平均值;
(2)找出与平均值最接近的数组元素。
对于第(2)个问题,可以将第一个元素与平均值的差为基准,然后依次计算其余各个元素与平均值的差,并与基准进行比较(注意要按绝对值进行比较),从而找出最小值,它所对应的元素就是与平均值最接近的元素。
参考程序:
#include
#include
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 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 { 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;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 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 /* 函数声明 */ 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个整数
正在阅读:
实验7 指针11-06
感恩你我,真情成长02-12
乡镇农业农村规划发展年度工作总结报告08-04
以“政府预算管理过程”为主题,写一篇1200字小论文11-18
材力样题04-03
马克思实践自然观对我国生态文明建设的理论启示和实践启迪04-07
湖北省普通话水平测试说话题目10-17
五年级数学下册 质数和合数、分解质因数(二)一课一练 人教版08-26
平舌音与翘舌音分辨(附表格)04-15
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 指针
- 实验
- 房地产市场营销课程设计 - 图文
- 华为研发部门绩效考核制度及方案(经典)
- 进一步完善生态补偿机制 推进德清生态文明建设
- 刘霖 - 教书育人,需要慢下来
- (F=2500 - v=1.1 - D=400 - 8小时300天10年)同轴式二级斜齿圆柱齿轮减速器
- 体系宣贯闭卷测试题
- 二叉树及其应用(实验五)
- 社会工作实务-详细知识点
- 提防工程运行管理报告
- 非语言交际在中西方文化中差异论文
- 监理公司现场资料及归档资料规范
- 垂直运输(修改) - 图文
- 寝室文化艺术节策划案(部内流转版)
- unit 12 The giants garden试卷
- 2011年交通运输工程试题new
- 触控屏幕手指点击的人体工程学
- 2011大连理工大学工程管理考研模拟题及答案
- 创建全民健康生活方式示范食堂、餐厅台账资料 - 图文
- 表演教学中的案头工作
- (强烈推荐)基于单片机的交通灯控制系统设计毕业论文设计