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;ifor(j=0;jscanf("%d",&a[i][j]);
for(i=0;i{
max=a[i][0];
maxj=0;
for(j=0;jif(a[i][j]>max)
{
max=a[i][j];
maxj=j;
}
flag=1;
for(k=0;kif(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)数组中的元素在内存中其却是一维的、线性,是按行进行存储。
指导教师意见
签名:
年月日