指针和函数的应用
一、实验目的
1.熟悉指针变量的定义。初始化和使用方法。
2.熟悉用户函数的一般定义格式和调用方法,特别是数据传递方法。
3.熟悉递归函数和指针型函数的定义与调用方法。
4.掌握教材中介绍的各类系统函数的调用格式与基本功能。
二、预习要求
1.复习指针变量的定义。初始化和使用方法。
2.复习函数的定义方法和调用方法,特别要注意函数间数据传递方法的4种方式及其特点,注意递归函数和指针型函数的定义与调用方法。
3.复习教材中介绍的各类系统函数的调用格式与基本功能。
三、实验准备
【问题一】用指针来处理一维数组元素
从键盘上输入若干个字符,以符号“@”结束。编一个C程序,统计这些符号的个数(不包括@)存入数组元素a[0],将这些符号依次存入a[1]、a[2]、a[3]、…中。接着利用a[0]中存放的字符个数,输出这些字符。
本题要求用指向数组a的指针变量来处理数组元素。
【待填充的源程序参考清单】
main()
{ char a[100]={0},________________________=a,c;
scanf("%c",&c);
while(________________________)
{______________________;
*(pa+(*pa))=c;
scanf("%c",&c);
}
printf("\nnumber of string:%d\nstring:\n”,*pa);
for(pa=a+1; pa<=______________________;pa++
printf("%c",*pa);
printf("\n");
}
【问题二】用指针处理二维数组元素
从键盘上输入整型数组 a[5][5]各元素的值,再按 5行 5列的格式输出这个数组(参看下面给出的例子),然后先将数组a的第i行和第j行的对应元素交换,按5行5列的格式输出交换后的数组,再将数组a的第i列和第j列的对应元素交换,按5行5列的格式输出交换后的数组。i和j由键盘输入(1≤i≤5、1≤j≤5)。
例如,i=2、j=4,数组a行列交换前后的结果如下:
交换前的数组a 交换后的数组a
1 2 3 4 5 1 4 3 2 5
6 7 8 9 10 16 19 18 17 20
11 12 13 14 15 11 14 13 12 15
16 17 18 19 20 6 9 8 7 10
21 22 23 24 25 21 24 23 22 25
本题要求分别用指向数组元素的指针变量和指向长度为5的一维数组指针变量来处理二维数组元素。
【待填充的源程序参害清单】
方法一:使用指向二维数组元素的指针变量来处理数组元素。
main()
{ int a[5][5],*pa=&a[0][0],m,n,i,j,k;
for( m=0;m<5;m++)
for(n=0;n<5;n++)
scanf("%d",____________________);
pa=&a[0][0];
for(m=0;m<5;m++)
{ for( n=0;n<5;n++)
printf("%5d",________________);
printf("\n");
}
printf("\n");
printf("input i,j:");
scanf("%d,%d",&i,&j);
____________________________;
pa=&a[0][0];
for(n=0;n<5;n++)
{ k=*(pa+ i*5+n);
*(pa+i*5+n)=_______________________;
*(pa+j*5+n)=k;
(p204)
点步行到X再下水游泳到B点)。所谓的“路线”是指求出的A点到X点的距离,误差为0.1米)。
【待填充的原程序参考清单】
float f1(X)
{ float y;
y=sqrt((4O-x)*(40-x)+30*30);
return(y);
}
float f2(X)
float x;
{__________________________;
y=x/2.0+f1(x)/1.2;
return(y);
}
main()
{ float x,min_x=0.0,min_t,t;
min_t=_____________________________;
for(x=0.1;x<= 4O.0;x+= 0.1)
if((t=f2(x))>min_t)
else
min_t=t,min_x=x;
printf("x=%f\nmin_time=%f\n", min_x,min_t);
}
提示:本题的答案是 x=17.5
min_t= 4O.0
:
【问题四】
(1)用C语言编写名为f1的指针型函数,从指定字符串的第n1个字将开始取n2个字符组成新的字符串,函数的返回值为新字符率的首地址。其中,指定的原字符串、新字符率和n1、n2的作为函数的参数。
(2)用C语言编写主函数,从键盘上输入字符串和整数n1、n2。如果“n1+n2>字符串长度+1”,则输出“ERROR!”;否则,调用f1函数,求字符串中从n1开始的共n2个字符组成的新字符串,并输出新字符串。
本题要求用指向字符串的指针变量来处理字符串。
【自己编写的源程序清单】
方法一:以“指针法”使用指针变量来引用字符串中的字符。
方法二:以“下标法”使用指针变量来引用字符串中的字符。
在方法一的程序清单基础上进行修改获得方法二的程序的清单。
四、实验步骤
【启动Turbo-C,开始实验】
1.启动计算机,进入DOS操作系统,启动Tutho-C,进入主菜单。
2.选取“File”菜单条的下拉菜单项“New”,进入源程序的编辑状态。
【问题一程序的调试与运行】
3.输入问题一中给出的、实验准备阶段已经填充好的源程序参考清单。
4.选取“File”菜单条的下拉菜单项“Save”,将源程序存盘。
【热键】 <F2>
5.选取“Compile”菜单条的下拉菜单项“Compile to OBJ”,对源程序进行编译。
【热键】 <Alt>+<F9>
6.查阅并分析系统给出的语法错误信息,重新编辑修改源程序,转第4步。反复执行,直到源程序语法没有错误,转下一步。
7.选取“Compile”菜单条的下拉菜单项“Make EXE file”,对源程序进行连接。
【热键】 <F9>
若连接中有错误,重新编辑修改源程序,转第4步。
若没有错误,转下一步。
8.选取“Run”菜单条的下拉菜单项“Run”,运行目标程序。
【热键】 <Ctrl>+<F9>
9.选取“Run”菜单条的下拉菜单项“User Screen”,查看运行结果。
【热键】 <Alt>+<F5>
看后接任一键返回Tutho-C的主菜单。
若运行结果有错,分析错误原因,重新编辑修改源程序,转第4步。
若运行结果正确,转下一步。
10.记录正确的程序清单。
【问题二(法一)程序的调试与运行】
11.选取“File”菜单条的下拉菜单项“New”,进入源程序的编辑状态。
12.输入问题二(法一)中给出的、实验准备阶段已经填充好的源程序参考清单。
13.重复前面的第4步~第9步,编译、连接、运行、调试问题二(法一)的程序。
14.记录正确的程序清单。
【问题二(法二)程序的调试与运行】
15.按照实验准备阶段的修改方案,修改已经调试成功的问题二(法一)的程序清单,成
为用法二解决问题二的程序清单。
16.重复前面的第4步~第9步,编译、连接、运行。调试问题二(法二)的程序。
17 .记录正确的程序清单。
【问题三程序的调试与运行】
18.选取“ File”菜单条的下拉菜单项“ New”,进入源程序的编辑状态。
19.输入问题三中给出的、实验准备阶段已经填充好的源程序参考清单。
20.重复前面的第4步~第9步,编译、连接、运行、调试问题三的程序。
21.记录正确的程序清单。
【问题四(法一)程序的调试与运行】
22.选取“File”菜单条的下拉菜单项“New”,进入源程序的编辑状态。
23.输入自己编写的、解决问题四(法一)的源程序清单。
24.重复前面的第4步~第9步,编译、连接、运行、调试问题四(法一)的程序。
25.记录正确的程序清单。
【问题四(法二)程序的调试与运行】
26.按照实验准备阶段的修改方案,修改已经调试成功的问题四(法一)的程序清单,成为用法二解决问题四的程序清单。
27.重复前面的第4步~第9步,编译、连接、运行、调试问题四(法二)的程序。
28.记录正确的程序清单。
【退出 TurbO- C,结束本次实验】
29.选取“File”菜单条的下拉菜单项“Quit”,退出Turbo-C,返回操作系统。
【热键】<Alt>+X
30.分析实验过程,总结实验结果。