本实验旨在巩固学生对指针这种数据结构的理解,增强程序设计能力。在这个实验中,学生将练习:
? 定义一个一维数组,含有11个数组元素并且赋予10个初值。 ? 利用循环语句,进行替换前的输出。 ? 使用scanf()函数,输入待替换的数。
? 以实参为数组名、数组的大小及待替换的数调用匹配函数。 ? 在匹配函数中,查找待替换的数。
? 从替换函数返回一个地址,将0送入该地址所指单元。 ? 利用循环语句,进行替换后的输出。
在强化练习中,学生将练习:
? 在该程序中,若将数组定义为”int a[10]”,当在数组中找不到待查找数时会产生什么后果?
? 若数组中有两个相同的待查找数据,编程查看是哪个待查找数据被置换。 ? 将指定位置的数据置换为0。
问题描述
编写程序,在一个整型数组中查找输入的一个整数,找到后把该数置换为0,没找到数组不变。
示例输出 替换前的输出:1 2 3 4 5 6 7 8 9 10 输入待替换的数:6 替换后的输出:1 2 3 4 5 0 7 8 9 10
程序模板
#include \
/*匹配函数的说明*/ void main( )
{ int a[11]={1,2,3,4,5,6,7,8,9,10};
int b, i;
/*提示替换前的输出*/ for(i=0;i<10;i++) printf(\ /*输出回车换行*/
printf(\输入待替换的数:\ /*用scanf()输入待替换的数*/ /*调用匹配函数并将数字0存入该函数的返回值中*/ printf(\替换后的输出:\ for(i=0;i<10;i++)
/*输出数组a的数组元素的值,并且每两个值之间空一格*/
printf(\
}
int *match(int *p, int n, int b) { int i;
/*循环语句,循环条件是数组的下标没超过10并且还没找到相匹配的数*/
/*返回待查找数据的单元地址或数组最后一个数组元素的地址*/ }
问题解答提示
1.match()函数是指针型函数,在说明和定义它时要在其函数名前写上“*”。
2.match()函数是指针型函数,它的返回值是地址值,所以在主函数中要用取内容运算符”*”,将数值0放入该单元。
3.因为match()函数的返回值是地址值,所以其调用可以放在赋值运算符的左边 4.在这10个数中如果查找不到待查找数的话,就会返回a[10]的地址,所以主函数中数组a的大小应定义为11。
5.如果在实验中碰到任何问题,请向实验老师寻求帮助。
强化练习
1.根据程序模板,若将数组定义为”int a[10]”,当在数组中找不到待查找数时会产生什么后果。
2.若数组中有两个相同的待查找数据,编写程序查看是哪个待查找数据被置换。 3.修改程序,将指定位置的数据置换为0。
实验练习4:编写程序,输入10个整数,将其中最小的数与第一个数交换,最大的数与最后一个数交换。
本练习要求在封闭式实验课中在助教或者讲师的指导下完成。本练习分成6个部分: 1.实验目的 2.问题描述 3.事例输出 4.程序模板 5.问题解答提示 6.后续问题和任务
程序模板是完整的、可实际运行的C程序,其中关键的一行或者多行代码已经替换为注释。请先阅读问题描述,分析事例输出;然后研究模板的代码。参考问题解答提示,用C代码替换/* */注释。编译并执行程序,并将输出结果与提供的事例输出进行比较。然后回答强化练习。
实验目的
本实验旨在巩固学生对指针这种数据结构的理解,增强程序设计能力。在这个实验中,学生将练习:
? 定义一个输入函数,从键盘输入10个整数并存入数组中。 ? 定义一个求最大值和最小值的函数max_min()。
? 在max_min()函数中,共定义四个指针变量,分别指向最大值、最小值、数组尾部及一个临时指针。
? 将指针array_end指向数组的尾部。 ? 先将指针max、min指向数组的第一个元素,然后利用循环和临时指针使max、min分别指向数组中的最大值和最小值。
? 使最小值与第一个数交换,最大值与最后一个数交换。 ? 定义一个输出函数,输出重排后的数组。
在强化练习中,学生将练习:
? 在max_min()中,只定义两个指针变量,不定义指向最大数和最小数的指针。 ? 将数组定义为全局数组。
? 将输入和输出函数部分插入到主函数中。
问题描述
编写程序,从键盘输入10个整数并存入数组,将其中最小的数与第一个数交换,最大的数与最后一个数交换,然后输出重排后的数组
。 示例输出 Input 10 integer: 78 25 36 98 12 66 58 69 79 32 Output 10 integer 12 25 36 32 78 66 58 69 79 98
程序模板
#include \
/*输入函数input()的头部*/ { int i;
printf(\ for(i=0;i<10;i++)
/*scanf()函数输入整数*/ }
void max_min(int num[ ])
{ /*定义指针变量max、min*/ int *p,*array_end;
/*使指针array_end 指向数组的最后一个数据之后*/ /*使指针max、min指向数组的第一个数据*/ /*for循环的头部。指针p为循环控制变量,循环条件是:当p指向数组的
最后一个数据之后时结束循环,每次使指针p下移一个数据*/ if(*p>*max) /*使max与p的指向相同*/ else if(*p<*min) min=p;
/*使最小值与第一个数交换*/
*p=num[9]; num[9]=*max; *max=*p; }
void output(int num[ ]) { int *p;
/*输出信息的提示*/
for(p=num;p void main( ) { int number[10]; /*调用输入函数*/ /*调用max_min()*/ /*调用输出函数*/ } 问题解答提示 1.在max_min()中,为保证数组的最后一个数据能得到处理,将指针变量array_end指向数组的最后一个数据之后。 2.p++是指针下移,在C中每次下移两个单元。因为在C中整数占两个单元。 3.语句max=p;,是把p中存放的地址值赋给max,即p和max指向同一单元。 4.条件*p<*min是指若p所指向单元中的数据小于min所指向单元中的数据,则交换。不能把它写成p 5.num[0]中数据与min所指向的单元中的最小数据交换,即是num[0]与*min交换。不能写成num[0]与min交换。 6.如果在实验中碰到任何问题,请向实验老师寻求帮助。 强化练习 1.根据程序模板,在max_min()中,只定义两个指针变量,不定义指向最大数和最小数的指针,重编程序, 2.将数组定义为全局数组,试对程序做相应的修改。 3.重新编写程序,将输入和输出函数部分插入到主函数中。 8.4 综合练习 1.求矩阵a[2][3]={11,22,33,44,55,66}的转置矩阵t[3][2],并按矩阵的形式输出两矩阵,要求用指针实现。 分析:本题的关键是以指针实现两矩阵中数据传递交换,根据需要可定义两个指针int (*p)[3]和int (*q)[2]用以分别指向矩阵a和b。 #include \void main() { int a[2][3]={11,22,33,44,55,66},t[3][2]; int (*p)[3],(*q)[2],i,j; p=a; q=t; } for(i=0;i<2;i++) for(j=0;j<3;j++) *(*(q+j)+i)=*(*(p+i)+j); printf(\矩阵A:\\n\ for(i=0;i<2;i++) { for(j=0;j<3;j++) printf(\ \ printf(\ } printf(\矩阵B:\\n\ for(i=0;i<3;i++) { for(j=0;j<2;j++) printf(\ \ printf(\ } 2.有几个人围成一圈,顺序排号。从第一个人开始报数,凡报到3的人退出圈子,问最后留下的是几号? 分析:利用含n个元素的数组,它的下标代表每个人的编号。数组元素num[i](或*(p+i))中存放着编号为i的人是否在圈内的情况,其值为非0表示该人在圈内,为1表示该人在圈外。 #include \ #define max 15 void main( ) { int i, k,n,m, num[max], *p; scanf(\ p=num; for(i=0;i while(*p= =0) p++; printf(\ %d\\n\ }