high=mid-1;
elseif(m>a[mid])
low=mid+1;
elsereturn(mid);
}
return(-1);
}
main()
{inti,a[N]={-3,4,7,9,13,45,67,89,100,180},k,m;
printf("a数组中的数据如下:
");
for(i=0;iprintf("Enterm:
");scanf("%d",&m);
k=fun(a,m);
if(k>=0)printf("m=%d,index=%d\n",m,k);
elseprintf("Notbefound!
\n");
}
2.4运行结果
2.5题目要求
给定程序中fun函数的功能是:
输出M行M列的整数方阵,然后求两条对角线上的元素之和,返回此和数。
#include
#defineM5
intfun(intn,intxx[][])
{inti,j,sum=0;
printf("\nThe%dx%dmatrix:
\n",M,M);
for(i=0;i{for(j=0;jprintf("%f",xx[i][j]);
printf("\n");
}
for(i=0;isum+=xx[i][i]+xx[i][n-i-1];
return(sum);
}
main()
{intaa[M][M]={{1,2,3,4,5},{4,3,2,1,0},{6,7,8,9,0},{9,8,7,6,5},{3,4,5,6,7}};
printf("\nThesumofallelementson2diagnalsis%d.",fun(M,aa));
}
2.6错误分析
#include
#defineM5
intfun(intn,intxx[][])-----------------定义数组时对第1维的长度可以
{inti,j,sum=0;不指定,但第2维的长度不能省
printf("\nThe%dx%dmatrix:
\n",M,M);
for(i=0;i{for(j=0;jprintf("%f",xx[i][j]);-----------------输出的数组为整型数
printf("\n");
}
for(i=0;isum+=xx[i][i]+xx[i][n-i-1];
return(sum);
}
main()
{intaa[M][M]={{1,2,3,4,5},{4,3,2,1,0},{6,7,8,9,0},{9,8,7,6,5},{3,4,5,6,7}};
printf("\nThesumofallelementson2diagnalsis%d.",fun(M,aa));
}
错误点:
1.定义数组时对第1维的长度可以不指定,但第2维的长度不能省。
应改为intxx[][M]。
2.输出的数组为整型数。
应改为“%d”。
2.7改正后的程序
#include
#defineM5
intfun(intn,intxx[][M])
{inti,j,sum=0;
printf("\nThe%dx%dmatrix:
\n",M,M);
for(i=0;i{for(j=0;jprintf("%d",xx[i][j]);
printf("\n");
}
for(i=0;isum+=xx[i][i]+xx[i][n-i-1];
return(sum);
}
main()
{intaa[M][M]={{1,2,3,4,5},{4,3,2,1,0},{6,7,8,9,0},{9,8,7,6,5},{3,4,5,6,7}};
printf("\nThesumofallelementson2diagnalsis%d.",fun(M,aa));
}
2.8运行结果
3.基本编程题一
3.1题目要求
一球从50米的高度下落,每次落地后反跳回原来高度的2/3;在落下,求它在第10次落地时,共经过多少米?
第10次反弹多高?
3.2程序分析
因为要求第10次落地时经过的米数,因此用for循环解题。
首先定义第一次下落后反跳高度H和共经过的米数sumH,再定义整型变量i。
用for循环求10次后反跳高度,因为每次反跳回原高度的2/3,所以定义H=H*2/3;因为共用的米数为之前米数之和加此次反弹高度的两倍,所以sumH=sumH+H*2,循环后输出共用的米数和反弹高度。
3.3流程图
3.4源程序
#include
intmain()
{
floatH=50.0*2/3,sumH=50.0;//定义H,sumH初值为单精度浮点型
inti;//定义i为整型变量
for(i=1;i<10;i++)//已定义第一次反跳为H,所以只需循环9次
{
H=H*2/3;
sumH+=H*2;
}
printf("共经过%fm\n",sumH);
printf("第10次反弹%fm\n",H);
return0;
}
3.5运行结果
4.基本编程题二
4.1题目要求
m个人的成绩存放在score数组中,请编写函数fun,它的功能是:
将低于平均分的人数作为函数值返回。
例如,当score数组中的数据为:
10、20、30、40、50、60、70、80、90、时,函数返回的人数应该是4,below中的数据应为:
10、20、30、40。
4.2程序分析
首先定义fun函数,在fun函数中定义两个整型数组score[]和below[],定义变量i和j为整型,定义变量sum和aver为float型,利用for循环求i个学生总成绩之和及平均值。
再利用一个for循环将学生个人成绩和平均成绩比较,将低于平均分的人数返回,在主函数中调用intfun(intscore[],intm,intbelow[]),将得到的值赋给n,最后输出低于平均分的成绩。
4.3流程图
4.4源程序
#include
#include
intfun(intscore[],intm,intbelow[])//定义fun函数为整型,形参m
{和数组score,below为整型
inti,j=0;//定义变量i和j为整型
floatsum=0,aver;//定义变量sum和aver为float型
for(i=0;i{
sum+=score[i];//求i个学生总成绩之和
aver=sum/m;
}
for(i=0;i{
if(aver>score[i])
below[j++]=score[i];
}
returnj;//将低于平均分的人数返回
}
main()
{
inti,n,below[9];
intscore[9]={10,20,30,40,50,60,70,80,90};
n=fun(score,9,below);//调用fun函数将得到的值赋给nprintf("\nBelowtheaveragescoreare:
");
for(i=0;iprintf("%d",below[i]);//输出低于平均分的成绩
}
4.5运行结果
5.总结
做完这次程序设计报告,我学会了函数调用的方法及分析题目的一些思路,但是还是在做题的过程中出现了许多问题,包括编译连接的时候发生错误等。
做完报告我明白了查阅参考网络资料及团队合作的重要性。
在第一道改错中,首先能发现没有#include编译预处理指令,导致程序不能正常输入输出;fun函数定义为空函数,而最后又有返回值,显然错误,将#include补上,将fun函数定义为int函数,再将程序输入C++中,错误显示N没有定义,If没有定义;然后将N定义为10,将If改为if,再进行编译连接,没有错误,运行时输入45,显示下标值为5,输入8,显示Notbefound!
程序正确。
第二道改错中,首先看到定义数组时想到数组对第1维的长度可以不指定,但第2维的长度不能省,应改为intxx[][M],然后再在C++中编译连接,显示没有错误,但运行时有错误。
再仔细检查后发现i和数组中的数都为整型而输出时变成单精度浮点型,因此错误,应改为“%d”整型数。
再运行得出整数二维数组,且返回值正确。
编程一题中,首先拿到题目就想到用for循环解题,因为要求第10次落地时经过的米数,因此用for循环解题。
首先定义第一次下落后反跳高度H和共经过的米数sumH,再定义整型变量i。
用for循环求10次后反跳高度,因为每次反跳回原高度的2/3,所以定义H=H*2/3;因为共用的米数为之前米数之和加此次反弹高度的两倍,所以sumH=sumH+H*2,循环后输出共用的米数和反弹高度。
在C++中编译连接后可执行,执行后显示出共经过的米数及第十次反跳高度。
编程二题中,拿到题目只能想到用for循环和数组解题,没有其他思路。
经过上网查阅资料和与同学讨论,得知应首先定义fun函数,在fun函数中定义两个整型数组score[]和below[],定义变量i和j为整型,定义变量sum和aver为float型,利用for循环求i个学生总成绩之和及平均值。
再利用一个for循环将学生个人成绩和平均成绩比较,将低于平均分的人数返回,在主函数中调用intfun(intscore[],intm,intbelow[]),将得到的值赋给n,最后输出低于平均分的成绩。
上机调试中出现了没有定义的情况,再检查变量的定义情况,改正后经上机调试及运行最后结果正确。