EX060907010090余家林Word格式.docx
- 文档编号:21631329
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:14
- 大小:61.34KB
EX060907010090余家林Word格式.docx
《EX060907010090余家林Word格式.docx》由会员分享,可在线阅读,更多相关《EX060907010090余家林Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
相反,在每次比较中,如果把较大的数掉到前头,那么就可以得到从大至小的排序。
根据题意可画出有小至大排序的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<
stdio.h>
intmain()
{inta[10],i,j,t;
printf("
请输入10个整数为:
\n"
);
for(i=0;
i<
=9;
i++)
scanf("
%d"
&
a[i]);
printf("
for(j=0;
j<
9;
j++)
for(i=0;
9-j;
if(a[i]>
a[i+1])
{t=a[i+1];
a[i+1]=a[i];
a[i]=t;
}
printf("
这10个整数从小到大的顺序为:
for(i=0;
printf("
%d"
a[i]);
}运行结果:
②则可知由大至小的排序N-S图为:
真a[i]<
a[i+1]假
可编程如下:
{
inta[10],i,j,t;
if(a[i]<
{
t=a[i+1];
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]还是a[i]>
a[i+1]。
(2)有15个数存在一个数组当中,输入一个数,要求用折半查找法找出该数是在该数组中的第几个元素的值。
如果该数不在数组中,则输出“无此数”。
以15个元素用来赋初值,要找的数则通过scanf输入。
折半查找法,指的就是先对该15个数进行按从小到大的顺序排列,在从键盘上输入任意想要查找的数,那么在这15个数组成的数组中,现在查找其居中的数,然后再用所输入的数和居中的这个数比较,判断要查找的数究竟是在居中数的左边还是右边,就将查找的范围减为原来的一半,以此类推,在这个个范围内进行折半查找,直至找到该数为止,这样效率比以前的“顺序查找法”要高很多。
根据以上的分析,编程如下:
#defineN15
inti,number,top,bott,mid,loca,a[N],flag=1,sign;
charc;
请输入数据为:
scanf("
a[0]);
i=1;
while(i<
N)
{
scanf("
if(a[i]>
=a[i-1])
i++;
else
printf("
请重新输入此数为:
}
for(i=0;
N;
%d\t"
while(flag)
输入所要查找的数为:
number);
sign=0;
top=0;
bott=N-1;
if((number<
a[0])||(number>
a[N-1]))
loca=-1;
while((!
sign)&
&
(top<
=bott))
{
mid=(bott+top)/2;
if(number==a[mid])
{
loca=mid;
已经找到的数为:
%d它所在的位置为:
%d\n"
number,loca+1);
sign=1;
}
if(number<
a[mid])
bott=mid-1;
else
top=mid+1;
}
if(!
sign||loca==-1)
不能找到输入的数!
要继续(Y/N)?
"
%c"
c);
if(c=='
N'
)
flag=0;
从结果可以观察到,程序先是将输入的15个数进行了从小到大的排序,并采用了折半查找的方法实现数据查找,由于在程序开始时定义了一个能够存放15个元素的数组,则知,当从键盘上输入一个整数时,就通过按enter键来将数据赋予对应的元素,实现赋初值。
当从键盘上输入所要查找的数据以后,那么程序就可以采用此算法将其找出,并将其所在的位置输出,如果采用此算法没有找到该数,那么就提示编程人员此数组中无此数,并提示还继续查找否,通过一个if语句来实现。
如需继续,输入相应的字符(YorN)可驱动程序继续进行查找。
(3)将两个字符串进行连接,但是不使用strcat函数。
根据题意编程如下:
string>
charstr1[20],str2[20];
inti,j;
i=0;
j=0;
请输入字符串1:
gets(str1);
请输入字符串2:
gets(str2);
while(str1[i]!
='
\0'
i++;
while(str2[i]!
str1[i++]=str2[j++];
str1[i]='
;
连接以后的字符串为:
%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)找出一个二维数组的“鞍点”,即是该位置上的元素在该行上是最大,而在该列上是最小。
当然一个数组也能补存在“鞍点”,如果存在,那么一定是唯一的。
先找出在一行中最大的数,然后再检查他是否在该列中是最小,如果是,则是鞍点,输出该鞍点,;
如果不是,则再找下一行的最大数……..如果每一行中的最大数都不是所在列的最小数,即是该二维数组不存在鞍点。
①根据题意编程如下:
#defineN3
#defineM4
inta[N][M];
inti,j,k,max,maxj,flag;
请输入一个矩阵:
M;
a[i][j]);
max=a[i][0];
maxj=0;
if(a[i][j]>
max)
max=a[i][j];
maxj=j;
flag=1;
for(k=0;
k<
k++)
if(a[k][maxj]<
flag=0;
continue;
if(flag)
a[%d][%d]=%d\n"
i,maxj,max);
break;
if(!
flag)
其不存在鞍点!
②当对于一个4行4列的数组而言,只需要将定义符号常量时,将N、M的值改为4、4即可。
对于第一个个程序而言,先是找出每一行中的最大值,即是第一行、二行、三行进行查找,其在第一行中发现了最大值205,第二行找到最大值96,第三行找到最大值210,然后在进行判断这些最大数是否为其所在列的最小值,如是,即可判断为鞍点。
反之,不是鞍点。
我们可以发现96在其所在列为最小数而又在其行为最大数,那么即可判断其为鞍点。
对于第二个程序而言,在各行分别找到了最大值分别为:
205、196、210、156。
但是其所在列并非为最小值,即可知,该二维数组不存在鞍点。
由于该程序使用了符号常量,其既可以处理任意行与任意列的数组,在运行程序之前,只要将符号常量的数值改变即可。
就能够实现程序中所有用该符号代表的值皆发生改变,即是“一变全变”。
③当想通过程序赋予初值而不用键盘输入时,可用两重循环实现,输出一行就换一行,则可将程序改为如下:
inta[3][4]={{9,80,205,40},{90,-60,96,1},{210,-3,101,89}};
inti,j,k,max,maxj,flag,m=0;
Array:
3;
4;
a[i][j]);
if(!
Itisnotexist!
以上程序使用的是在定义数组时就对其赋予初值,大括号内包含多个大括号,一行用一个大括号表示,即是其按行赋予初值。
注:
数组中的元素在内存中其却是一维的、线性,是按行进行存储。
每个大括号中即是一行中的各个元素。
采用二重循环即可实现。
当输出一行时就要求其换一行,那么其输出后就以矩阵的形式体现出来。
然后程序再进行与修改前一样的运算,同样可得出正确结果。
实验总结
(1)在使用数组对数据进行排序时(由小至大或是有大至小),首先要熟练掌握其排序算法——数值比较法(或是起泡法),要依据排序的总数来确定比较的趟数和每趟需要比较的次数,则可以结合二重循环实现之,再结合二分支选择结构if语句来实现判断两两比较的结果,再借助于第三个变量来实现交换。
(2)想通过程序查找在某一数据是否在该数组中时,我们有两条路可选,其一:
采用顺序查找法;
其二,折半查找法;
当在所查数组元素个数较少时,两种方法均可选,但是对于数组元素较为庞大时,第二种方法较佳,因为在一次次的比较中,可以实现查找范围一次次的减半,便可迅速查出,而前者仍然要进行很庞大的比较次数。
根据实际选择方法。
(3)在对字符数组进行处理时,有多种处理的方法,比如:
字符串的连接strcat(str)、字符串的复制strcpy(str)或是strncpy(str)、还有字符串的长度测量strlen(str)等,在运用这些函数时,必须首先在程序开头包含头文件#include<
string.h>
。
对于本实验中,采用了一种算法来实现字符串的连接,其借助于循环将str2中的每一个字符循环的连接在str1的有效字符串后面,并以‘\0’来作为其结束的标志。
对于一个字符串而言,其后面还包含有一个‘\0’在内。
如:
char[6]={“china”}。
(4)在解决一些实际问题时,要从实际问题出发,确定其算法,一步步向所要实现的目标靠拢,便可以顺理成章。
比如:
本实验中要求一个二维数组的鞍点,要首先明确鞍点的含义,即可从其含义出发就可知其鞍点。
(5)如果所编写的程序中大量存在某些常量,则为了避免在修改这些常量时造成过大的工作量,则可灵活运用符号常量,即可知,再修改程序时,就只要改变这些符号常量即可,实现“一改全改”。
(6)数组中的元素在内存中其却是一维的、线性,是按行进行存储。
指导教师意见
签名:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EX060907010090 余家
![提示](https://static.bdocx.com/images/bang_tan.gif)