实验8 指针的应用Word格式文档下载.docx
《实验8 指针的应用Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《实验8 指针的应用Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
【实验内容】
[实验任务一]:
补充完整程序,掌握C语言中与指针有关的算法。
程序填空实例8-1:
使用指针把从键盘输入的2个数按从大到小的顺序输出(不改变变量的值),请补充完整
并上机调试。
将填空后完整的程序以文件名为blank8_1.c保存在实验8文件夹里。
(需要存盘)
程序填空实例8-2:
输入10个整数存入一维数组,再按逆序重新调整该数组中元素的顺序然后再输出。
下面给出部分程序的内容,请将程序补充完整,然后上机调试。
将填空后完整的程序以文件名为nixu_1.c保存在实验8文件夹里。
程序填空实例8-3:
用指针访问简单变量。
从键盘输入三个整数,要求设三个指针变量p1,p2,p3,使p1指向三个数的最大者,p2指向次大者,p3指向最小者,然后按由小到大的顺序输出这三个数。
将填空后完整的程序以文件名为blank8_3.c保存在实验8文件夹里。
程序填空实例8-4:
用指针来处理一维数组元素。
从键盘上输入若干个字符,以符号“@”结束。
编一个C程序,统计这些符号的个数(不包括@)存入数组元素a[0],将这些符号依次存入a[1]、a[2]、a[3]、…中。
接着利用a[0]中存放的字符个数,输出这些字符。
将填空后完整的程序以文件名为blank8_4.c保存在实验8文件夹里。
【待填充的源程序参考清单】
#include<
stdio.h>
voidmain()
{chara[100]={0},=a,c;
scanf("
%c"
&
c);
while()
{;
;
*pa=c;
scanf("
}
printf("
\nnumberofstring:
%d\nstring:
\n"
a[0]);
for(pa=a+1;
pa<
=;
pa++)
*pa);
);
[实验任务二]:
通过调试和补充实例程序,以达到能正确使用指针变量作为函数的参数进行地址传递的目的。
编程实例8-1:
编一个函数intfun(*charss),它的功能是:
把ss字符串中的字符按逆序存放。
例如:
若输入字符串为ABCDEFG,则逆置后的字符串为GFEDCBA。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
string.h>
#defineM81
intfun(char*ss)
{/*答题开始*/
┇
/*答题开始*/
}
{char*a;
printf("
\nPleaseenterastring:
"
gets(a);
fun(a);
\nThenewstringis:
%s\n"
a);
将编写好的程序以文件名daoxu.c最终保存在实验8文件夹里。
编程实例8-2:
下面程序用来实现a,b两个数的交换。
{inta,b,*pa,*pb;
printf(“pleaseinputtwointegernumbers:
\n”);
scanf(“%d%d”,&
a,&
b);
printf(“thevaluesofaandbbeforeexchangingare:
printf(“a=%db=%d\n”,a,b);
pa=&
a;
pb=&
b;
swap(pa,pb);
printf(“thevaluesofaandbafterexchangingare:
swap(int*p1,int*p2)
{int*p;
*p=*p1;
*p1=*p2;
*p2=*p;
【问题】:
①上述程序能否完成两个数互换的目地,为什么?
如何改正?
②若把swap函数改写成如下形式:
能否达到此目的,为什么?
如何改正。
将改正好的程序以文件名swap.c保存在实验8文件夹里。
[实验任务三]:
上机调试《C语言程序设计上机指导与习题选解》P80-82的程序,并分析程序运行结果。
将输入的完成程序依次以文件名8_1_1.c、8_1_2.c、8_1_3.c、8_1_4.c、8_2_1.c、8_2_2.c、8_3_1.c和8_3_2.c共8个.c程序保存在实验8文件夹里。
[实验任务四]:
通过设计一个实际例子掌握数组、指针和函数的综合编程方法。
设计程序实例8-1:
打印最高分和学号
假设每班人数最多不超过40人,具体人数由键盘输入,试编程打印最高分及其学号。
程序1用一维数组和指针变量作为函数参数,编程打印某班一门课成绩的最高分及其学号。
程序2用二维数组和指针变量作为函数参数,编程打印3个班学生(假设每班4个学生)的某门课成绩的最高分,并指出具有该最高分成绩的学生是第几个班的第几个学生。
程序3用指向二维数组第0行第0列元素的指针作为函数参数,编写一个能计算任意m行n列二维数组中元素的最大值,并指出其所在的行列下标值的函数,利用该函数计算3个班学生(假设每班4个学生)的某门课成绩的最高分,并指出具有该最高分成绩的学生是第几个班的第几个学生。
程序4编写一个计算任意m行n列二维数组中元素的最大值,并指出其所在的行列下标值的函数,利用该函数和动态内存分配方法,计算任意m个班、每班n个学生的某门课成绩的最高分,并指出具有该最高分成绩的学生是第几个班的第几个学生。
【思考题】请读者思考:
①编写一个能计算任意m行n列的二维数组中的最大值,并指出其所在的行列下标值的函数,能否使用二维数组或者指向二维数组的行指针作为函数参数进行编程实现呢?
为什么?
②请读者自己分析动态内存分配方法(题目要求中的程序4)和二维数组(题目要求中的程序3)两种编程方法有什么不同?
使用动态内存分配方法存储学生成绩与用二维数组存储学生成绩相比,其优点是什么?
【说明】:
初学者通常都会对指针望而生畏,其实只要从原理上掌握了指针的概念,它就会变得如此简单而易用。
首先,指针不过是C语言提供的一种比较特殊的数据类型而已,定义为指针类型的变量与其它类型的变量相比,主要差别在于指针变量的值是一个内存地址。
其次,在C语言中,指针和数组之间有着密不可分的关系,不带下标的数组名就是一个指针,它代表数组元素的首地址,只要让声明为相同基类型的指针变量指向数组元素的首地址,那么对数组元素的引用,既可以用下标法,也可以用指针法,用指针法存取数组比用数组下标存取数组速度快一些。
反之,任何指针变量也可以取下标,可以像对待数组一样来使用。
虽然多维数组的地址概念稍微麻烦些,但只要知道它的元素在内存中是如何存放的,使用也就不难了,由于C语言中的多维数组都是按列存放的,因此,用指针法引用时,必须知道数组的一行有多长(即列的维数)。
在某种意义上,二维数组类似于一个由指向行数组的指针构成的一维指针数组。
多于二维的数组可以通过类似方法进行降维处理。
指针的一个重要应用是用指针作函数参数,为函数提供修改调用变元的手段。
当指针作函数参数使用时,需要将函数外的某个变量的地址传给函数相应的指针变元,这时,函数内的代码可以通过指针变元改变函数外的这个变量的值。
指针的另一个重要应用是同动态内存分配函数联用,使得定义动态数组成为可能。
本题程序1中,用到了一维数组作为函数参数,程序2用到了指向二维数组的行指针作函数参数,程序3用到了指向二维数组的列指针作函数参数,程序4用到了动态内存分配实现动态数组。
【设计程序实例8-1的参考答案】:
程序1参考答案:
#defineARR_SIZE40
intFindMax(intscore[],longnum[],intn,long*pMaxNum);
voidmain()
{
intscore[ARR_SIZE],maxScore,n,i;
longnum[ARR_SIZE],maxNum;
Pleaseentertotalnumber:
scanf("
%d"
n);
/*从键盘输入学生人数n*/
Pleaseenterthenumberandscore:
for(i=0;
i<
n;
i++)/*分别以长整型和整型格式输入学生的学号和成绩*/
{
%ld%d"
num[i],&
score[i]);
maxScore=FindMax(score,num,n,&
maxNum);
/*计算最高分及其学号*/
maxScore=%d,maxNum=%ld\n"
maxScore,maxNum);
/*函数功能:
计算最高分及最高分学生的学号
函数参数:
整型数组score,存储学生的成绩
长整型数组num,存储学生的学号
长整型指针变量pMaxNum,存储求出来的最高分学生的学号
函数返回值:
最高分
*/
intFindMax(intscore[],longnum[],intn,long*pMaxNum)
inti;
intmaxScore;
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*/
程序运行结果如下:
5↙
9901184↙
9901283↙
9901388↙
9901487↙
9901561↙
maxScore=88,maxNum=99013
程序2参考答案:
#defineCLASS3
#defineSTU4
intFindMa