数组综合实验.docx
《数组综合实验.docx》由会员分享,可在线阅读,更多相关《数组综合实验.docx(31页珍藏版)》请在冰豆网上搜索。
![数组综合实验.docx](https://file1.bdocx.com/fileroot1/2023-1/10/4bb33d46-42e4-4cb6-b7ed-422db8f02415/4bb33d46-42e4-4cb6-b7ed-422db8f024151.gif)
数组综合实验
《C语言程序设计》实验报告
(2)
学号:
姓名:
班级:
成绩:
实验名称:
数组综合实验
实验地点:
宿舍
所使用的工具软件及环境:
WindowsXP系统;VC++6.0
一、实验目的:
学会VisualC++6.0编辑、编译、连接和执行C程序。
掌握C语言语法基础;
熟练掌握if语句和switch语句while语句,do-while语句和for语句实现循环的方法。
掌握定义和使用数组;
加深对筛选法,选择法,冒泡法和二分法的使用。
二、实验内容:
课堂练习:
改错题:
3.2下列给定程序中,函数fun和quest的功能是:
用二分法求方程2x3-4x2+3x-6=0的一个根,并要求绝对误差不超过0.001。
例如,若给m输入-50,给n输入30,则函数求得的一个根值为2.000。
请修改程序中的错误,得出正确的结果。
注意:
不要改动main函数,不能增行或删行,也不能更改程序的结构。
#include
#include
doublequest(doublex)
{
return(2*x*x*x-4*x*x+3*x-6);
}
doublefun(doublem,doublen)
{
/********error********/
doubler;
r=(m+n)/2;
/********error********/
while(fabs(n-m)>0.001)
{
if(quest(r)*quest(n)<0)
m=r;
else
n=r;
r=(m+n)/2;
}
returnr;
}
main()
{
doublem,n,result;
printf("Pleaseinputmn:
\n");
scanf("%lf%lf",&m,&n);
result=fun(m,n);
printf("result=%6.3f\n",result);
getch();
}
22.2下列给定程序中函数fun的功能是:
用选择法对数组中的n个元素按从小到大的顺序进序请修改程序中的错误,使它能计算出正确的结果。
注意:
不要改动main函数,不能增行或删行,也不能更改程序的结构
#include
#defineM100
voidfun(intsort[],intn)
{
inti,j,temp,p;
for(j=0;j{
/********error********/
p=j;
for(i=j;iif(sort[i]{
/******error********/
p=i;
temp=sort[p];
sort[p]=sort[j];
sort[j]=temp;
}
}
}
main()
{
intsort[M]={23,3,67,-2,9,-6,27,12},
i,num=8;
printf("beforesort:
");
for(i=0;iprintf("%d,",sort[i]);
printf("\n");
fun(sort,num);
printf("aftersort:
");
for(i=0;iprintf("%d,",sort[i]);
printf("\n");
getch();
}
填空题:
20.1请补充fun函数,该函数的功能是求一维数组a[N]的平均值,并对所得结果进行四舍五入保留两位小数。
例如,当a[10]={23.1,12.3,5.3,56.4,10.0,13.7,24.5,42,1.2,9.9}时,输出结果为:
average=19.840000。
请勿改动主函数main与其他函数中的任何内容,仅在fun函数的横线上填写所需的若干表达式或语句。
注意:
部分源程序给出如下。
#include
#include
doublefun(doublea[10])
{
inti;
longtemp;
doubleaverage=0.0;
doublesum=0.0;
for(i=0;i<10;i++)
sum+=a[i];
average=sum/10;
average=average*1000;
temp=(average+5)/10;
average=(double)temp/100;
returnaverage;
}
main()
{
doubleaverage,a[10]={23.1,12.3,5.3,
56.4,10.0,13.7,24.5,42,1.2,9.9};
inti;
printf("\nThedata:
\n");
for(i=0;i<10;i++)
printf("%6.1f",a[i]);
printf("\n\n");
average=fun(a);
printf("Theaverage=%f\n\n",average);
getch();
}
43.1请补充fun函数,该函数的功能是:
把字符串s中的字符按字符的ASCII码升序排列,处理后的字符串仍然保存在原串中,字符串及其长度作为函数参数传入。
例如,如果输入"edcba",则输出为"abcde"。
请勿改动主函数main与其他函数中的任何内容,仅在fun函数的横线上填写所需的若干表达式或语句。
注意:
部分源程序给出如下。
#include
#defineN100
voidfun(charp[],intn)
{
inti,j;
chart;
for(i=0;ifor(j=i;jif(p[i]>p[j])
{
t=p[j];
p[j]=p[i];
p[i]=t;
}
}
main()
{
inti=0,strlen=0;
chars[N];
printf("Pleaseinputastring:
\n");
gets(s);
while(s[i]!
='\0')
{
strlen++;
i++;
}
fun(s,strlen);
printf("Displaystring\n");
puts(s);
getch();
}编程题:
1.3数组point中存放着m个人的成绩,请编写函数fun,它的功能是:
返回高于平均分的人数,并将高于平均分的分数放在high所指的数组中。
例如,当point数组中的数据为50、60、65、70、75、80、88、90、95时,函数返回的人数应该是5,high中的数据应为75、80、88、90、95。
请勿改动主函数main与其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
注意:
部分源程序给出如下。
#include
#include
#include
intfun(intpoint[],intn,inthigh[])
{
inti,j,average;
ints=0;
for(i=0;is+=point[i];
average=s/n;
for(j=0,i=0;jif(point[j]>average)
{
high[i]=point[j];
i++;
}
returni;
}
main()
{
intj,m,high[9];
intpoint[9]={50,60,65,70,75,80,
88,90,95};
FILE*out;
m=fun(point,9,high);
printf("\nHightheaveragepointare:
");
out=fopen("outfile.dat","w");
for(j=0;j{
printf("%d",high[j]);
fprintf(out,"%d\n0",high[j]);
}
fclose(out);
}
4.3请编写函数fun,函数的功能是求出二维数组周边元素之和,作为函数值返回。
二维数组中的值在主函数中赋予。
例如,若二维数组中的值为:
3 5 7 9
9 9 9 4
9 9 9 8
则函数值为72。
请勿改动主函数main与其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
注意:
部分源程序给出如下。
#include
#include
#defineM3
#defineN4
intfun(intb[M][N])
{
inti,j,s=0;
for(i=0;ifor(j=0;jif(i==0||i==M-1)
s+=b[i][j];
elseif(j==0||j==N-1)
s+=b[i][j];
returns;
}
main()
{
inta[M][N]={{3,5,7,9},{9,9,9,4},
{9,9,9,8}};
inti,j,sum;
FILE*out;
printf("Theoriginaldatais:
\n");
for(i=0;i{
for(j=0;jprintf("%6d",a[i][j]);
printf("\n");
}
sum=fun(a);
printf("\nThesum:
%d\n",sum);
printf("\n");
out=fopen("outfile.dat","w");
fprintf(out,"%d",sum);
fclose(out);
}
31.3编写程序,实现矩阵(3行列)的转置(即行列互换)。
例如,若输入下面的矩阵:
1 2 3
4 5 6
7 8 9
则程序输出:
1 4 7
2 5 8
3 6 9
请勿改动主函数main与其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
注意:
部分源程序给出如下。
#include
#include
voidfun(inta[3][3])
{
inti,j,k;
for(i=0;i<=2;i++)
for(j=0;j<=i;j++)
{
k=a[i][j];
a[i][j]=a[j][i];
a[j][i]=k;
}
printf("\n");
}
main()
{
inti,j;
inta[3][3]={{1,2,3},
{4,5,6},
{7,8,9}};
FILE*out;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%7d",a[i][j]);
printf("\n");
}
fun(a);
printf("Converteda:
\n");
out=fopen("outfile.dat","w");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%7d",a[i][j]);
fprintf(out,"%7d",a[i][j]);
}
printf("\n");
fprintf(out,"\n");
}
fclose(out);
getch();
}
73.1请编写函数fun,其功能是:
计算并输出给定10个数的方差:
例如,给定的10个数为76.0,65.0、72.0、85.0、57.0、67.0、45.0、92.0、44.0、58.0,则输出为F=14.982990。
请勿改动主函数main与其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
注意:
部分源程序给出如下。
#include
#include
doublefun(doubley[10])
{inti;
doubles=0,a=0,t=0;
for(i=0;i<10;i++)
s+=y[i];
a=s/10;
for(i=0;i<10;i++)
t+=(y[i]-a)*(y[i]-a);
t=t/10;
t=sqrt(t);
returnt;
}
main()
{
doublef,y[10]={76.0,65.0,72.0,85.0,
57.0,67.0,45.0,92.0,44.0,58.0};
inti;
FILE*out;
printf("\nTheoriginaldatais:
\n");
for(i=0;i<10;i++)
printf("%6.1f",y[i]);
printf("\n\n");
f=fun(y);
printf("f=%f\n\n",f);
out=fopen("outfile.dat","w");
fprintf(out,"%f",f);
fclose(out);
}
三、程序运行结果示例:
改错题:
3.2
22.2
填空题:
20.1
43.1
编程题:
1.3
4.3
31.3
73.1
四、作业
3.3请编写函数voidfun(inty,intb[],int*m),它的功能是:
求出能整除y且是奇数的各整数,并按从小到大的顺序放在b所指的数组中,这些除数的个数通过形参m返回。
例如,若y中的值为90,则有4个数符合要求,它们是1、3、5、9、15、45。
请勿改动主函数main与其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
注意:
部分源程序给出如下。
#include
#include
voidfun(inty,intb[],int*m)
{
inti=0,j=1,k=0,*t=b;
for(j=0;j<=y;j++)
if(j%2!
=0)
{
t[i]=j;
i++;
}
for(j=0;j
if(y%t[j]==0)
{
b[k]=t[j];
k++;
}
*m=k;
}
main()
{
inty,a[500],m,j;
FILE*out;
printf("\nPleaseinputanintegernumber:
\n");
scanf("%d",&y);
fun(y,a,&m);
for(j=0;jprintf("%d",a[j]);
printf("\n");
fun(730,a,&m);
out=fopen("outfile.dat","w");
for(j=0;jfprintf(out,"%d\n",a[j]);
fclose(out);
getch();
}
4.2下列给定程序中,函数fun的功能是:
判断字符ch是否与s所指串中的某个字符相同,若相同,则什么也不做;若不同,则将其插在串的最后。
请修改程序中的错误,使它能得出正确的操作。
注意:
不要改动main函数,不能增行或删行,也不能更改程序的结构。
#include
#include
#include
/*******error*********/
voidfun(char*s,charc)
{
while(*s&&*s!
='c')
s++;
/*******error*********/
if(*s==c)
{
s[0]='c';
/*******error*********/
s[1]='\0';
}
}
main()
{
charstr[81],ch;
printf("\nPleaseenterastring:
\n");
gets(str);
printf("\nPleaseenterthecharactertosearch:
");
ch=getchar();
fun(str,ch);
printf("\nTheresultis%s\n",str);
}
5.3编写函数intfun(intmm,intb[MAX]),该函数的功能是求出小于或等于mm的所有素数,并放在b数组中,该函数返回所求出的素数的个数。
请勿改动主函数main与其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
注意:
部分源程序给出如下
#include
#include
#defineMAX100
intfun(intmm,intb[MAX])
{
inti,m,n=0;
for(m=2;m<=sqrt(m);m++)
{
for(i=2;i<=sqrt(m);i++)
if(m%i==0)break;
if(i>=m)
{
b[n]=m;
n+=1;
}
}
returnn;
}
main()
{
intm,i,sum;
intb[MAX];
FILE*out;
printf("inputadata:
\n");
scanf("%d",&m);
sum=fun(m,b);
for(i=0;i{
if(i%10==0&&i!
=0)
printf("\n");
printf("%5d",b[i]);
}
sum=fun(28,b);
out=fopen("outfile.dat","w");
for(i=0;ifprintf(out,"%d\n",b[i]);
fclose(out);
}
18.1请补充fun函数,该函数的功能是求不超过给定自然数的各奇数之和。
例如,输入34,则输出结果为289。
请勿改动主函数main与其他函数中的任何内容,仅在fun函数的横线上填写所需的若干表达式或语句。
注意:
部分源程序给出如下。
#include
intfun(intn)
{
inti,sum;
sum=0;
for(i=1;isum+=i;
returnsum;
}
main()
{
inta;
do
{
printf("\nPleaseenternaturalnumbersa:
");
scanf("%d",&a);
}while(a<=0);
printf("\n不超过给定自然数%d的各奇数之和为%d\n",a,fun(a));
getch();
}
20.3编写函数fun,函数的功能是:
根据以下公式计算,计算结果作为函数值返回。
s=1+1/(1+2)+1/(1+2+3)+....+1/(1+2+3+...+n)p通过形参传入,例如,若p的值为21时,函数的值为1.909091。
请勿改动主函数main与其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
注意:
部分源程序给出如下。
#include
#include
#include
floatfun(intn)
{
inti;floats,m;s=0;m=0;
for(i=1;i<=n;i++)
{
m+=i;
s=s+1.0/m;
}
returns;
}
main()
{
intn;
floatstr;
FILE*out;
printf("\nPleaseinputtheintegern:
");
scanf("%d",&n);
str=fun(n);
printf("Theresultis:
%f\n",str);
str=fun(10);
out=fopen("outfile.dat","w");
fprintf(out,"%f",str);
fclose(out);
getch();
}
22.3请编写一个函数fun,它的功能是:
计算并输出给定整数m的所有因子(不包括1与自身)之和。
规定m的值不大于1000。
例如,若主函数从键盘给m输入的值为111,则输出为sum=40。
请勿改动主函数main与其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
注意:
部分源程序给出如下。
#include
intfun(intm)
{
inti;
intsum=0;
for(i=2;iif(!
(m%i))
sum+=i;
returnsum;
}
main()
{
intn,num;
FILE*out;
printf("Inputm:
");
scanf("%d",&n);
num=fun(n);
printf("num=%d\n",num);
out=fopen("outfile.dat","w");
fprintf(out,"%d\n",fun(123));
fprintf(out,"%d\n",fun(456));
fprintf(out,"%d\n",fun(789));
fclose(out);
getch();
}
23.1s是一个由数字和字母字符组成的字符串,由变量len传入字符串长度。
请补充fun函数,该函数的功能是把字符串s中的数字字符转换成数字并存放到整型数组a中,函数返回数组a的长度。
例如,s="Abc123e456hui7890",结果为:
1234567890。
请勿改动主函数main与其他函数中的任何内容,仅在fun函数的横线上填写所需的若干表达式或语句。
注意:
部分源程序给出如下
#include
#defineM80
inta[M];
intfun(chars[],inta[],intlen)
{
intj,m=0;
for(j=0;jif(s[j]>='0'&&s[j]<='9')
{
a[m]=s[j]-'0';
m++;
}