printf("%5d",a[i]);
printf("\n");
}
(3)找出一个二行三列二维数组中的最大值,输出该最大值及其行列下标,建议二维数组值由初始化给出。
#include"stdio.h"
#include"conio.h"
main()
{
inti,j,max,s,t;
/**********FOUND**********/
inta[2][]={1,34,23,56,345,7};
clrscr();
/**********FOUND**********/
max=0;
s=t=0;
for(i=0;i<2;i++)
/**********FOUND**********/
for(j=1;j<3;j++)
if(a[i][j]>max)
{max=a[i][j];s=i;t=j;}
/**********FOUND**********/
printf("max=a[%d][%d]=%d\n",i,j,max);
}
3、程序设计
说明,所有题目均需添加main(),在main()中调用子函数并设计完整的输入输出才可调试通过。
(1)功能:
编写函数floatfun(intn),求一分数序列2/1,3/2,5/3,8/5,13/8,21/13…的前n项之和。
说明:
每一分数的分母是前两项的分母之和,每一分数的分子是前两项的分子之和。
例如:
求前20项之和的值为32.660259。
(2)完成子函数intfun(intn),找出一个大于给定整数且紧随这个整数的素数,并作为函数值返回。
说明,以下四个关于数组的题目,可以先用一个main()函数实现,然后相关内容学习后再利用数组作函数参数的子函数和main()函数共同实现。
(3)功能:
编写函数voidfun(intn,inta[]),按顺序将一个4位的正整数每一位上的数字存到一维数组,然后在主函数输出。
例如输入5918,则输出结果为5918。
(4)功能:
编写函数voidfun(intarr[],intn)将一个数组中的值按逆序存放,并在main()函数中输出。
例如:
原来存顺序为18,2,50,43,69。
要求改为:
69,43,50,2,18。
(5)功能:
程序定义了N×N的二维数组,并在主函数中自动赋值。
请编写函数voidfun(inta[][N],intn),使数组a左下三角元素中的值乘以任意整数n。
例如:
若n的值为2,a数组中的值为
|197||297|
a=|238|则返回主程序后a数组中的值应为|468|
|456||81012|
(6)功能:
编写函数voidfun(intarray[3][3]),实现矩阵(3行3列)的转置(即行列互换)。
例如:
输入下面的矩阵:
100200300
400500600
700800900
程序输出:
100400700
200500800
300600900
五、实验注意事项
(1)调用系统库函数要包含相应头文件;
(2)函数可以嵌套调用,但不可以嵌套定义;
(3)注意数组的越界问题;
(4)找最大值(最小值)的算法:
先将第一个值认为是最大(小)的,检索以后的值,判断如果当前数组元素值比保留在变量中的最大(小)值大(小),则用当前数组元素值替换该变量中的值。
六、讨论、思考题
1、功能:
编写函数floatfun(),利用以简单迭代方法Xn+1=cos(Xn)求方程:
cos(x)-x=0的一个实根。
迭代步骤如下:
(1)取x1初值为0.0;
(2)x0=x1,把x1的值赋给x0;
(3)x1=cos(x0),求出一个新的x1;
(4)若x0-x1的绝对值小于0.000001,执行步骤(5),否则执行步骤
(2);
(5)所求x1就是方程cos(x)-x=0的一个实根,作为函数值返回。
输出:
程序将输出结果Root=0.739085。
2、功能:
编写floatfun(floatarray[],intn),统计出若干个学生的平均成绩,最高分以及得最高分的人数。
例如:
输入10名学生的成绩分别为92,87,68,56,92,84,67,75,92,66,则输出平均成绩为77.9,最高分为92,得最高分的人数为3人。
3、编写函数intfun(intlim,intaa[MAX]),该函数的功能是求出小于lim的所有素数并放在aa数组中,该函数返回求出素数的个数。
4、功能:
编写函数intfun(inta[M][M]),求5行5列矩阵的主、副对角线上元素之和。
注意,两条对角线相交的元素只加一次。
5、功能:
请编一个函数voidfun(inttt[M][N],intpp[N]),tt指向一个M行N列的二维数组,求出二维数组每列中最小元素,并依次放入pp所指一维数组中。
二维数组中的数已在主函数中赋予。
程序清单及流程图:
四、实验结果与分析(程序运行结果及其分析)
五、实验体会(遇到问题及解决办法,编程后的心得体会)
实验项目名称:
高级程序设计实验学时:
6
同组学生姓名:
实验地点:
实验日期:
实验成绩:
批改教师:
批改时间:
实验3高级程序设计
一、实验目的和要求
(1)理解C语言中指针的本质,区分指针与指针变量,掌握有关指针的应用;
(2)熟练掌握字符串常量和字符串的存储及字符串处理函数的使用;
(3)掌握字符指针的定义、使用等;
(4)掌握向函数传递字符串的方法;
二、实验仪器和设备
奔腾以上计算机,装有windowsXP以上版本操作系统和VisualC++6.0软件。
三、实验内容与过程
1、程序调试
(1)main()
{inta=10,b=20,x,*pa,*pb;
pa=&a;pb=&b;
printf(“%d,%d,%d,%d”,a,b,*pa,*pb);
x=*pa;*pa=*pb;*pb=x;
printf(“%d,%d,%d,%d”,a,b,*pa,*pb);
}
(2)main()
{inta=10,b=20,*p,*pa=&a,*pb=&b;
printf(“%d,%d,%d,%d”,a,b,*pa,*pb);
p=pa;pa=pb;pb=p;
printf(“%d,%d,%d,%d”,a,b,*pa,*pb);
}
(3)int*swap(int*a,int*b)
{int*p;
p=a;a=b;b=p;
return(a);
}
main()
{intx=3,y=4,z=5;
swap(swap(&x,&y),&z);
printf(“%d,%d,%d”,x,y,z);
}
思考:
上面程序中函数swap()预将两个数的值相互交换,但结果为什么没有交换?
2、程序改错
要求:
1、改错时,只允许修改现有语句中的一部分内容,不允许添加和删除语句。
2、提示行下一行为错误行。
(1)功能:
为一维数组输入10个整数;将其中最小的数与第一个数对换,将最大的数与最后一个数对换,输出数组元素。
#include
voidinput(int*arr,intn)
{
int*p,i;
p=arr;
printf("pleaseenter10integers:
\n");
for(i=0;i/**********ERROR**********/
scanf("%d",p);
}
voidmax_min(int*arr,intn)
{
int*min,*max,*p,t;
min=max=arr;
for(p=arr+1;p/**********ERROR**********/
if(*p<*max)
max=p;
elseif(*p<*min)min=p;
t=*arr;*arr=*min;*min=t;
/**********ERROR**********/
if(max=arr)max=min;
t=*(arr+n-1);
*(arr+n-1)=*max;
*max=t;
}
voidoutput(int*arr,intn)
{
int*p,i;
p=arr;
printf("Thechangedarrayis:
\n");
/**********ERROR**********/
while(i=0;iprintf("%3d",*p++);
printf("\n");
}
main()
{
inta[10];
input(a,10);
max_min(a,10);
output(a,10);
}
(2)功能:
将s所指字符串的反序和正序进行连接形成一个新串放在t所指的数组中。
例如:
当s所指的字符串的内容为"ABCD"时,t所指数组中的内容为"DCBAABCD"。
#include
#include
#include
/**********FOUND**********/
voidfun(chars,chart)
{
inti,d;
/**********FOUND**********/
d=len(s);
/**********FOUND**********/
for(i=1;it[i]=s[d-1-i];
for(i=0;it[d+i]=s[i];
/**********FOUND**********/
t[2*d]='/0';
}
main()
{
chars[100],t[100];
printf("\nPleaseenterstringS:
");
scanf("%s",s);
fun(s,t);
printf("\nTheresultis:
%s\n",t);
}
3、程序设计
说明,所有要求子函数的题目均需添加main(),在main()中调用子函数并设计完整的输入输出才可调试通过。
(1)编写一main()函数,要求利用指针,实现从键盘输入三个数,然后按照由小到大的顺序输出此三个数。
(2)功能:
编写函数 f