EX060907010090余家林.docx

上传人:b****5 文档编号:8495096 上传时间:2023-01-31 格式:DOCX 页数:14 大小:61.34KB
下载 相关 举报
EX060907010090余家林.docx_第1页
第1页 / 共14页
EX060907010090余家林.docx_第2页
第2页 / 共14页
EX060907010090余家林.docx_第3页
第3页 / 共14页
EX060907010090余家林.docx_第4页
第4页 / 共14页
EX060907010090余家林.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

EX060907010090余家林.docx

《EX060907010090余家林.docx》由会员分享,可在线阅读,更多相关《EX060907010090余家林.docx(14页珍藏版)》请在冰豆网上搜索。

EX060907010090余家林.docx

EX060907010090余家林

高级语言程序设计实验报告(六)

学院:

理学院专业:

电子信息科学与技术班级:

电科091

姓名

余家林

学号

0907010090

实验组

实验时间

2011年5月4日

指导教师

谢本亮

成绩

实验项目名称

数组

实验目的:

(1)掌握一维数组和二维数组的定义、赋值和输入输出的方法。

(2)掌握字符数组和字符串函数的使用。

(3)掌握与数组有关的算法(特别是是排序算法)。

实验内容:

(1)①用“起泡法”对10个整数排序(由大至小或是由小至大)。

10个整数用scanf函数输入。

编程分析:

由于现在要对n=10个整数用比较法进行排序,那么我们知道必须要对这10个整数进行j=9趟比较,如果是j=0表示第一趟的话,而每一趟比较要进行i=(n-1)-j=9-j次比较,而每趟比较都要进行两两比较,把两者中较小的数调到前头,以此类推,就可以将10个整数从小到大进行了排序。

相反,在每次比较中,如果把较大的数掉到前头,那么就可以得到从大至小的排序。

根据题意可画出有小至大排序的N-S图如下:

输入10个整数给a[0]和a[9]

j由1变到8共执行9次循环

进行9-j次比较

真a[i]>a[i+1假

a[i]=a[i+1]

输出a[0]到a[9]

由以上的分析则可编程如下:

#include

intmain()

{inta[10],i,j,t;

printf("请输入10个整数为:

\n");

for(i=0;i<=9;i++)

scanf("%d",&a[i]);

printf("\n");

for(j=0;j<9;j++)

for(i=0;i<9-j;i++)

if(a[i]>a[i+1])

{t=a[i+1];

a[i+1]=a[i];

a[i]=t;

}

printf("这10个整数从小到大的顺序为:

\n");

for(i=0;i<=9;i++)

printf("%d",a[i]);

printf("\n");

}运行结果:

②则可知由大至小的排序N-S图为:

输入10个整数给a[0]和a[9]

j由1变到8共执行9次循环

进行9-j次比较

真a[i]

a[i]=a[i+1]

输出a[0]到a[9]

可编程如下:

#include

intmain()

{

inta[10],i,j,t;

printf("请输入10个整数为:

\n");

for(i=0;i<=9;i++)

scanf("%d",&a[i]);

printf("\n");

for(j=0;j<9;j++)

for(i=0;i<9-j;i++)

if(a[i]

{

t=a[i+1];

a[i+1]=a[i];

a[i]=t;

}

printf("这10个整数从小到大的顺序为:

\n");

for(i=0;i<=9;i++)

printf("%d",a[i]);

printf("\n");

return0;

}

运行结果:

结果分析:

对于以上的两个程序而言,均采用的是数值比较的方法来实现数据的排序,当该程序在执行外循环第一次时,j=0,然后执行第一次内循环,此时,i=0,在if语句中将a[i]和a[i+1]进行比较,就是将a[0]和a[1]比较。

执行第二次外循环时,i=1,a[i]和a[i+1]比较,就是将a[1]和a[1]进行比较…….执行最后一次内循环时,i=8,a[i]和a[i+1]比较,就是将a[8]和a[9]比较。

这时第一趟就完成。

当执行第二次外循环时,j=1,开始第二趟的过程,内循环继续的条件时i<9-j,由于j=1,因此,相当于i<8,即知i由0变到7,要执行内循环8次。

其余依次类推,均可达到相同的目的。

对于大到小排序或是从小到大的排序,取决于以上程序中的if语句中是a[i]a[i+1]。

(2)有15个数存在一个数组当中,输入一个数,要求用折半查找法找出该数是在该数组中的第几个元素的值。

如果该数不在数组中,则输出“无此数”。

以15个元素用来赋初值,要找的数则通过scanf输入。

编程分析:

折半查找法,指的就是先对该15个数进行按从小到大的顺序排列,在从键盘上输入任意想要查找的数,那么在这15个数组成的数组中,现在查找其居中的数,然后再用所输入的数和居中的这个数比较,判断要查找的数究竟是在居中数的左边还是右边,就将查找的范围减为原来的一半,以此类推,在这个个范围内进行折半查找,直至找到该数为止,这样效率比以前的“顺序查找法”要高很多。

根据以上的分析,编程如下:

#include

#defineN15

intmain()

{

inti,number,top,bott,mid,loca,a[N],flag=1,sign;

charc;

printf("请输入数据为:

\n");

scanf("%d",&a[0]);

i=1;

while(i

{

scanf("%d",&a[i]);

if(a[i]>=a[i-1])

i++;

else

printf("请重新输入此数为:

\n");

}

printf("\n");

for(i=0;i

printf("%d\t",a[i]);

printf("\n");

while(flag)

{

printf("输入所要查找的数为:

\n");

scanf("%d",&number);

sign=0;

top=0;

bott=N-1;

if((numbera[N-1]))

loca=-1;

while((!

sign)&&(top<=bott))

{

mid=(bott+top)/2;

if(number==a[mid])

{

loca=mid;

printf("已经找到的数为:

%d它所在的位置为:

%d\n",number,loca+1);

sign=1;

}

else

if(number

bott=mid-1;

else

top=mid+1;

}

if(!

sign||loca==-1)

printf("不能找到输入的数!

\n");

printf("要继续(Y/N)?

");

scanf("%c",&c);

if(c=='N')

flag=0;

}

}

运行结果:

结果分析:

从结果可以观察到,程序先是将输入的15个数进行了从小到大的排序,并采用了折半查找的方法实现数据查找,由于在程序开始时定义了一个能够存放15个元素的数组,则知,当从键盘上输入一个整数时,就通过按enter键来将数据赋予对应的元素,实现赋初值。

当从键盘上输入所要查找的数据以后,那么程序就可以采用此算法将其找出,并将其所在的位置输出,如果采用此算法没有找到该数,那么就提示编程人员此数组中无此数,并提示还继续查找否,通过一个if语句来实现。

如需继续,输入相应的字符(YorN)可驱动程序继续进行查找。

(3)将两个字符串进行连接,但是不使用strcat函数。

根据题意编程如下:

#include

#include

intmain()

{

charstr1[20],str2[20];

inti,j;

i=0;

j=0;

printf("请输入字符串1:

\n");

gets(str1);

printf("请输入字符串2:

\n");

gets(str2);

printf("\n");

while(str1[i]!

='\0')

i++;

while(str2[i]!

='\0')

str1[i++]=str2[j++];

str1[i]='\0';

printf("连接以后的字符串为:

%s\n",str1);

return0;

}

运行结果:

结果分析:

对于第一个字符串而言,当i指的位置不为其结束的位置,i的初值为0,那么就让其i加1,直至i加到其结束的‘\0’处,那么对于第二个字符串而言,当j所指的位置不为其结束位置的‘\0’,而且j的初值也是0,那么就让j所指的位置的字符赋予第一个字符串的后面结束的‘\0’处,以此类推,就可以将第二个字符串的所有字符(包括‘\0’在内)连接在第一个字符串的后面,实现字符串的连接,那么在这一个过程中,如果第一个字符串中出现了结束符‘\0’,那么此时就表示字符串的连接完毕。

在程序中如果使用gets(str)进行输入字符串,那么可以实现句子的连接,但是如果采用scanf函数输入,则只能够将某两个单词连接(这时因为scanf函数输入时,是以空格或是回车结束,而gets(str)则是以回车作为输入结束的标志)。

(4)找出一个二维数组的“鞍点”,即是该位置上的元素在该行上是最大,而在该列上是最小。

当然一个数组也能补存在“鞍点”,如果存在,那么一定是唯一的。

编程分析:

先找出在一行中最大的数,然后再检查他是否在该列中是最小,如果是,则是鞍点,输出该鞍点,;如果不是,则再找下一行的最大数……..如果每一行中的最大数都不是所在列的最小数,即是该二维数组不存在鞍点。

①根据题意编程如下:

#include

#defineN3

#defineM4

intmain()

{

inta[N][M];

inti,j,k,max,maxj,flag;

printf("请输入一个矩阵:

\n");

for(i=0;i

for(j=0;j

scanf("%d",&a[i][j]);

for(i=0;i

{

max=a[i][0];

maxj=0;

for(j=0;j

if(a[i][j]>max)

{

max=a[i][j];

maxj=j;

}

flag=1;

for(k=0;k

if(a[k][maxj]

{

flag=0;

continue;

}

if(flag)

{

printf("a[%d][%d]=%d\n",i,maxj,max);

break;

}

}

if(!

flag)

printf("其不存在鞍点!

\n");

}

运行结果:

②当对于一个4行4列的数组而言,只需要将定义符号常量时,将N、M的值改为4、4即可。

运行结果:

结果分析:

对于第一个个程序而言,先是找出每一行中的最大值,即是第一行、二行、三行进行查找,其在第一行中发现了最大值205,第二行找到最大值96,第三行找到最大值210,然后在进行判断这些最大数是否为其所在列的最小值,如是,即可判断为鞍点。

反之,不是鞍点。

我们可以发现96在其所在列为最小数而又在其行为最大数,那么即可判断其为鞍点。

对于第二个程序而言,在各行分别找到了最大值分别为:

205、196、210、156。

但是其所在列并非为最小值,即可知,该二维数组不存在鞍点。

由于该程序使用了符号常量,其既可以处理任意行与任意列的数组,在运行程序之前,只要将符号常量的数值改变即可。

就能够实现程序中所有用该符号代表的值皆发生改变,即是“一变全变”。

③当想通过程序赋予初值而不用键盘输入时,可用两重循环实现,输出一行就换一行,则可将程序改为如下:

#include

intmain()

{

inta[3][4]={{9,80,205,40},{90,-60,96,1},{210,-3,101,89}};

inti,j,k,max,maxj,flag,m=0;

printf("Array:

\n");

for(i=0;i<3;i++)

{

for(j=0;j<4;j++)

printf("%d\t",a[i][j]);

printf("\n");

}

for(i=0;i<3;i++)

{

max=a[i][0];

maxj=0;

for(j=0;j<4;j++)

if(a[i][j]>max)

{

max=a[i][j];

maxj=j;

}

flag=1;

for(k=0;k<3;k++)

if(a[k][maxj]

{

flag=0;

continue;

}

if(flag)

{

printf("a[%d][%d]=%d\n",i,maxj,max);

break;

}

}

if(!

flag)

printf("Itisnotexist!

\n");

}

运行结果:

结果分析:

以上程序使用的是在定义数组时就对其赋予初值,大括号内包含多个大括号,一行用一个大括号表示,即是其按行赋予初值。

注:

数组中的元素在内存中其却是一维的、线性,是按行进行存储。

每个大括号中即是一行中的各个元素。

采用二重循环即可实现。

当输出一行时就要求其换一行,那么其输出后就以矩阵的形式体现出来。

然后程序再进行与修改前一样的运算,同样可得出正确结果。

实验总结

(1)在使用数组对数据进行排序时(由小至大或是有大至小),首先要熟练掌握其排序算法——数值比较法(或是起泡法),要依据排序的总数来确定比较的趟数和每趟需要比较的次数,则可以结合二重循环实现之,再结合二分支选择结构if语句来实现判断两两比较的结果,再借助于第三个变量来实现交换。

(2)想通过程序查找在某一数据是否在该数组中时,我们有两条路可选,其一:

采用顺序查找法;其二,折半查找法;当在所查数组元素个数较少时,两种方法均可选,但是对于数组元素较为庞大时,第二种方法较佳,因为在一次次的比较中,可以实现查找范围一次次的减半,便可迅速查出,而前者仍然要进行很庞大的比较次数。

根据实际选择方法。

(3)在对字符数组进行处理时,有多种处理的方法,比如:

字符串的连接strcat(str)、字符串的复制strcpy(str)或是strncpy(str)、还有字符串的长度测量strlen(str)等,在运用这些函数时,必须首先在程序开头包含头文件#include

对于本实验中,采用了一种算法来实现字符串的连接,其借助于循环将str2中的每一个字符循环的连接在str1的有效字符串后面,并以‘\0’来作为其结束的标志。

注:

对于一个字符串而言,其后面还包含有一个‘\0’在内。

如:

char[6]={“china”}。

(4)在解决一些实际问题时,要从实际问题出发,确定其算法,一步步向所要实现的目标靠拢,便可以顺理成章。

比如:

本实验中要求一个二维数组的鞍点,要首先明确鞍点的含义,即可从其含义出发就可知其鞍点。

(5)如果所编写的程序中大量存在某些常量,则为了避免在修改这些常量时造成过大的工作量,则可灵活运用符号常量,即可知,再修改程序时,就只要改变这些符号常量即可,实现“一改全改”。

(6)数组中的元素在内存中其却是一维的、线性,是按行进行存储。

指导教师意见

签名:

年月日

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1