C语言程序设计实验报告数组.docx
《C语言程序设计实验报告数组.docx》由会员分享,可在线阅读,更多相关《C语言程序设计实验报告数组.docx(18页珍藏版)》请在冰豆网上搜索。
C语言程序设计实验报告数组
一、实验项目名称
数组
二、实验目的
1.把握数组的大体概念,包括:
数组的概念、数组的类型、数组的初始化、数组的赋值、数组元素下标的范围、数组元素的正确和引用数组元素的输入/输出。
2.把握字符数组与字符串的利用方式。
明白得字符数组与其它数组的区别、明白得字符串及其特点。
把握经常使用的字符串处置库函数的用法并清楚对字符串的简单处置。
3.把握与数组相关的算法,包括排序算法和查找算法等。
三、实验内容
进行有关数组的程序设计。
具体内容:
1.编程实现:
对任意一个一维数组,从中找出数组元素的最大值和最小值。
要求:
(1)数组为整型数组(10个元素)。
(2)利用scanf函数实现数组元素的输入。
在输入前给出必要的提示。
(3)输出时给出必要的说明,第一输出原始的10个元素,换行后输出最大值和最大值在数组中的位置、最小值和最小值在数组中的位置。
(4)若是现改成20个元素的数组,如何修改程序?
修改程序后,运行程序进行检查。
若是需要数组元素不断改变,应如何修改程序?
2.编程实现:
在给定的字符串中查找知足条件的第一个字符。
要求:
(1)字符串采纳初始化的方式处置。
(2)通过scanf函数读入一个任意字符。
(3)在字符串中查找该字符,若是存在该字符,输出该字符在字符串中的位置和相应的说明。
若是不存在该字符,那么要给出相应的信息。
3.编程实现:
第一任意输入一个大于2且小于10的整数n,再输入一个由n决定的二维整型数组(n
n),形成n
n阶矩阵,将矩阵中最大元素所在的行和最小元素所在的行对调后,再输出该矩阵(注意:
数组不许诺动态概念)。
例如:
原始数据:
n=4结果数据:
12348111416
3591035910
81114161234
1527615276
要求:
(1)此题中所涉及到的循环都采纳for语句。
(2)在输入/输出时进行必要的说明。
(3)对输入的2~10之间的整数(例如4)以n=4的格式输出。
(4)输入一个n
n矩阵(假定最大值与最小值不在同一行上),输出原始矩阵数据(按上述矩阵形式)。
(5)查找最大值与最小值,将矩阵中最大元素所在的行和最小元素所在的行对调,输出对调后的矩阵数据。
(6)修改程序,对最大值与最小值可能出此刻一行上的情形做出说明。
(7)对n为3,4,5时,输入数组元素是要注意哪些问题?
执行程序,检查程序的正确性。
4.编程实现“折半查找”的进程。
折半查找的处置进程是:
在一个数据已排好序的数组中,第一比较关键字与数组中间的元素,若是二者相等,那么查找终止;若是前者比后者小,那么要查找的数据必然在数组的前半部,尔后只需在数组的前半部中继续折半查找;若是前者的数值比后者大,那么要查找的数据必然在数组的后半部,尔后只需在数组的后半部继续进行折半查找。
要求:
(1)设定一个数组寄存20个数据,用赋初值的方式在程序中给出(假设这些数据已排序)。
(2)用scanf函数输入一个要找的数。
(3)对查找的结果给出相应的说明,若是找到该数,那么给出该数是数组中第几个元素。
若是该数不在数组中,那么输出“无此数”信息。
(4)任意输入一些数据,检查程序的正确性。
(5)修改程序,设定输入的数据是无序的,采纳scanf函数的形式输入,第一要对这些无序的数据进行排序,然后再采纳“折半查找”。
最后通过测试几组不同较大的数据检查程序的正确性。
(6)修改程序,改成函数挪用的形式。
编写一个选择法排序函数,对无序数据进行排序;编写一个查找函数对已排好序的数据进行查找。
在主函数中输入数据(无序),挪用上述函数,输出结果。
5.编程实现:
三个学生、五门课程的成绩别离寄存在4×6矩阵的前3×5列,计算出每一个学生的平均成绩寄存在该数组的最后一列的对应行上。
计算单科的成绩总和寄存在最后一行的对应列上,并输出单科成绩的平均分。
输入/输出格式举例如下:
Input(输入成绩):
6587685678
8394678591
7175698489
Output(输出结果):
658768567870.5
839467859184.0
717569848977.5
219.0256.0204.0258.0232.00
average:
73.085.368.086.077.3
要求:
(1)数组类型为实型,输入成绩由scanf函数实现。
(2)输出已输入的原始成绩数据(3×5)。
(3)计算每一个学生的平均成绩和单科的成绩总和并按要求填入到数组中,输出填入结果后的数组(4×6)。
(4)j计算单科平均成绩后输出。
6.编写函数catStr(charstr1[],charstr2[])用于进行两个字符串的连接,编写函数lenStr()用于统计一个字符串的长度。
编写函数cmpStr()用于判定两个字符串的大小。
要求:
(1)不许诺利用字符处置库函数。
(2)在主函数以初始化的方式输入两个字符串str一、str2。
挪用函数lenStr()计算字符串的长度。
(3)挪用函数cmpStr()判定两个字符串的大小,若是str1大于等于str2,挪用函数catStr()进行两个字符串的连接,将str1连接在str2后,不然,将str2连接在str1后,挪用函数lenStr()统计连接后的字符串长度。
(4)在主函数中输出两个原始字符串和各自的长度和处置后字符串及其长度。
四、实验步骤
在编程软件中写如以下代码:
一、
#include<>
voidmain()
{
inta[10],i,j,k,max,min;
printf("请输入10个数:
\n");
for(i=0;i<10;++i)
scanf("%d",&a[i]);
printf("原始数据:
");
for(i=0;i<10;++i)
printf("%d",a[i]);
printf("\n");
max=a[0];/*初始化max和min*/
min=a[0];
for(i=0;i<10;++i)
{
if(a[i]>=max)
max=a[i];
if(a[i]<=min)
min=a[i];/*找最大值和最小值*/
}
printf("最大值为");
for(i=0;i<10;++i)/*应付有多个最值的情形*/
if(a[i]==max)
printf("第%d个",i+1);
printf("数,%d\n",max);
printf("最小值为");
for(i=0;i<10;++i)
if(a[i]==min)
printf("第%d个",i+1);
printf("数,%d",min);
}
修改成20个元素的方案:
将程序中所有的10改成20即可。
若是数组元素不断改变,只需将代码中的10改成元素个数即可。
二、
#include<>
#include<>
voidmain()
{
intj,n;
chari;
charc[]={"Iamastudent"};/*初始化字符串*/
printf("给定字符串为:
%s\n请输入要查找的字符:
",c);
scanf("%c",&i);
n=strlen(c);/*取得函数给定字符串的长度*/
for(j=0;jif((int)c[j]==(int)i)
{
printf("字符串中知足条件的第一个字符为第%d个字符",j+1);break;/*找到符合条件的第一个字符,终止循环*/
}
if(j>=n)
printf("字符串中不存在知足条件的字符!
");
}
三、
#include<>
voidmain()
{
intn,j,k,z,x,max,min,a[10][10];
printf("请输入一个2到10之间的数:
");
scanf("%d",&n);
printf("请输入一个n*n数组:
\n");
for(j=0;jfor(k=0;kscanf("%d",&a[j][k]);
printf("原始数组为:
n=%d\n",n);
for(j=0;jfor(k=0;kprintf("%5d",a[j][k]);/*输出原始数组*/
printf("\n");/*输出n个数后换行,使数组为n*n的格式*/}
max=a[0][0];/*初始化最大值和最小值*/
min=a[0][0];
z=0;x=0;
for(j=0;jfor(k=0;kif(a[j][k]>max)
{
max=a[j][k];
z=j;/*取得最大值的行数*/
}
for(j=0;jfor(k=0;kif(a[j][k]{
min=a[j][k];
x=j;/*取得最小值的行数*/
}
for(j=0;jk=a[z][j];
a[z][j]=a[x][j];
a[x][j]=k;/*互换最大值所在行和最小值所在行*/}
printf("结果数据:
\n");
for(j=0;jfor(k=0;kprintf("%5d",a[j][k]);
printf("\n");}
}
修改程序取得最大值和最小值所在行,只需在程序末尾加上语句:
printf(“最大值在第%d行,最小值在第%d行”,z,x);
在输入数组元素时要注意尽可能不要重复显现最大值和最小值,程序会以最值中第一个显现的值作为最值。
四、
#include<>
voidmain()
{
inta[20];
intn,j,i,k;
printf("给定的数组为:
\n");
for(n=0;n<20;++n){
a[n]=2*n+3;/*给定数组的初始化*/
printf("%d",a[n]);}
printf("\n");
printf("请输入要查找的数:
");
scanf("%d",&j);
intm=20;
for(n=0;n<=m;)/*折半查找*/{
i=(n+m)/2;
if(a[i]n=i+1;
elseif(a[i]>j)
m=i-1;
elseif(a[i]=j){
printf("该数在数组的第%d位上",i+1);break;}/*输出找到的数,终止循环*/}
if(n>m)
printf("无此数");
}
按要求修改后的程序为:
#include<>
voidarr();/*声明排序函数*/
intsea(intj);/*声明折半查找函数*/
inta[20];/*概念全局变量*/
voidmain()
{
intn,j,i,h;
printf("请输入20个数据:
\n");
for(n=0;n<20;++n)
{
scanf("%d",&a[n]);/*输入无序的20个数据*/
}
arr();/*挪用排序函数*/
printf("\n请输入要查找的数:
");
scanf("%d",&j);
h=sea(j);/*挪用折半查找函数*/
if(h==0)
printf("无此数");
else
printf("该数在已排序数组的第%d位",h);
}
voidarr()/*排序函数*/
{
intz,n;
for(intn=0;n<20;++n)
for(intk=0;k<19-n;++k)
if(a[k]>a[k+1])
{
z=a[k];
a[k]=a[k+1];
a[k+1]=z;
}
printf("将数组排序,得:
\n");
for(n=0;n<20;++n)
printf("%d",a[n]);/*输出已排序的数组*/
}
intsea(intj)
{
intn,i,h,m=20;
for(n=0;n<=m;)
{
i=(n+m)/2;
if(a[i]n=i+1;
elseif(a[i]>j)
m=i-1;
elseif(a[i]=j){
h=i+1;break;}/*找到该数后停止循环*/
}
if(n>m)
h=0;
returnh;/*返回h值*/
}
五、
#include<>
voidmain()
{
intj,k;
floata[3][5],d[3]={0},b[6]={0},c[5]={0};
printf("Input(输入成绩):
\n");
for(j=0;j<3;++j)
for(k=0;k<5;++k)
scanf("%f",&a[j][k]);
for(j=0;j<3;++j)
for(k=0;k<5;++k)
d[j]=d[j]+a[j][k]/5;
for(k=0;k<5;++k)
for(j=0;j<3;++j)
b[k]=b[k]+a[j][k];
for(j=0;j<3;++j)
b[5]=b[5]+d[j];
for(k=0;k<5;++k)
c[k]=b[k]/3;
printf("\nOutput(输出结果):
");
for(j=0;j<3;++j){
printf("\n");
for(k=0;k<5;++k)
printf("%",a[j][k]);
printf("%",d[j]);}
printf("\n");
for(k=0;k<6;++k)
printf("%",b[k]);
printf("\nAverage:
\n");
for(k=0;k<5;++k)
printf("%",c[k]);
}
六、
#include<>
voidcatStr(charstr1[],charstr2[]);/*声明连接两个字符串的函数*/
intlenStr(charstr[]);/*声明统计长度的函数*/
intcmpStr(charstr1[],charstr2[]);/*声明比较字符串大小的函数*/
charstr3[]={""};
voidmain()
{
intn,j,k,len1,len2,len3;
charc,str1[]={""},str2[]={""};
printf("请输入str1:
");
gets(str1);
printf("请输入str2:
");
gets(str2);
printf("str1原长为:
%d\nstr2原长为:
%d\n",lenStr(str1),lenStr(str2));/*挪用统计长度的函数并输出原始长度*/
j=cmpStr(str1,str2);/*挪用比较大小函数*/
if(j==1)/*将小字符串联接在大字符串后面*/{
printf("\"%s\"大于\"%s\"\n",str1,str2);
catStr(str1,str2);/*挪用连接两个字符串的函数*/
printf("合成的字符串为:
%s\n",str3);}
else{
printf("\"%s\"小于\"%s\"\n",str1,str2);
catStr(str2,str1);
printf("合成的字符串为:
%s\n",str3);}
printf("合成的字符串长度为:
%d",lenStr(str3));/*输出合成字符串的长度*/
}
intlenStr(charstr[])/*统计字符串大小的函数*/
{
intn,j,k;
for(n=0;;++n)
if(str[n]=='\0'){
returnn;
break;}
}
intcmpStr(charstr1[],charstr2[])/*比较字符串大小的函数*/
{
intn;
for(n=0;str1[n]!
='\0'&&str2[n]!
='\0';++n){
if((int)str1[n]>(int)str2[n]){
return1;
break;}
if((int)str1[n]<(int)str2[n]){
return0;
break;}}
return1;
}
voidcatStr(charstr1[],charstr2[])/*将str2连在str1后面,将取得的新字符串存入str3*/
{
intn,j;
intlenStr(charstr[]);
for(n=0;nstr3[n]=str1[n];
for(n=0;nstr3[n+lenStr(str1)]=str2[n];
str3[lenStr(str1)+lenStr(str2)]='\0';/*终止字符串str3*/
}
五、试探题或实验感想
小结有关数组和字符串的程序设计方式:
第一要概念数组,必要时进行初始化。
然后要擅长利用字符库函数,注意利用函数时不要重概念。
要注意数组的第一个下标是0。
数组和字符串的输入输出要擅长利用for循环。
利用字符串库函数时要记得预处置。