字符串操作练习题
练习题:
找出一个二维数组中的鞍点, 即:该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。
代码思路:
首先确定数组大小和内容。从第一行开始寻找行最大值,寻找到后记录列标:假设找到第一行最大值为ary[0][2],在[2]列查找最小值。
从该列第一行开始向下寻找,如果遇到小于已查找到的行最大值的数,则说明行最大值在本列中不是最小值,故不是鞍点,可以直接放弃该行,回到初层循环,在下一行中进行查找;如果查找到最后一行也没有出现小于行最大值的值,则说明行最大值在该列为最小值,满足鞍点的条件,进行打印输出。
在每次查找列最小值时,设置一个旗标check,如果查找到小于行最大值的值时,在跳出查找的同时,旗标check会进行自加。在每一行都完成查找后,如果每一行都没有查找到鞍点,每一行旗标check都会自加,最终大于等于行数,则可以判断数组中没有鞍点,进行输出。
代码实现:
#include <stdio.h>
#include <string.h>
int main(void)
{
int x,y,i,j,k;
printf("Input size of the array:\n");
scanf("%d %d",&x,&y);
int ary[x][y];
for(i=0;i<x;++i)
{
printf("Input %d numbers of the %d line;\n",y,i+1);
for(j=0;j<y;++j)
scanf("%d",&ary[i][j]);
}
printf("---- --- --- --- ---\nSaddle points:\n");
int max,flag = 1,check = 0;
for(i=0;i<x;++i)
{
max = ary[i][0];
for(j=0;j<y;++j)
{
if(ary[i][j] > max)
max = ary[i][j];
}
for(j=0;j<y;++j)
{
if(ary[i][j] == max)
{
for(k=0;k<x;++k)
{
if(ary[k][j] < max)
--flag;
}
if(flag == 1)
printf("ary[%d][%d] = %d\n",i,j,ary[i][j]);
else
{
// printf("check=%d\n",check);
++check;
break;
}
}
}
}
if(check >= x)
printf("No saddle points\n");
printf("Array:\n---- --- --- --- ---\n");
for(i=0;i<x;++i)
{
for(j=0;j<y;++j)
printf("%3d",ary[i][j]);
printf("\n");
}
return 0;
}
练习题
输入多个字符串,并查找需要的字符串。
代码思路:
首先确定多个字符串构成的二维数组的规格。将字符串输入到字符型二维数组中。使用选择排列法、冒泡排列法或插入排列法进行升序或降序排列。对排列后的数组使用二分查找法进行查找。方法与整型数组排序和查找相似,但不同点在于对字符串的操作需要借助string.h头文件中的字符串操作函数。
代码实现:
#include <stdio.h>
#include <string.h>
int main(void)
{
int i,j,k,x,y;
printf("Input x and y:\n");
scanf("%d %d",&x,&y);
getchar();
char ary[x][y];
char tmp[10] = {};
printf("Input a array %d*%d:\n",x,y);
for(i=0;i<x;++i)
gets(ary[i]);
for(j=0;j<x;++j)
{
for(i=0;i<y-1-j;++i)
{
k = strcmp(ary[i],ary[i+1]);
if(k>0)
{
strcpy(tmp,ary[i+1]);
strcpy(ary[i+1],ary[i]);
strcpy(ary[i],tmp);
}
}
}
printf("--------\n");
for(i=0;i<x;++i)
{
puts(ary[i]);
}
int mid,begin,end;
char xx[y];
printf("Input string to be found:\n");
gets(xx);
begin = 0;
end = x-1;
while(begin <= end)
{
mid = (begin+end)/2;
if( strcmp(ary[mid] , xx) < 0)
{
begin = mid + 1;
}
else if( strcmp(ary[mid] , xx) > 0)
{
end = mid - 1;
}
else
break;
}
if(begin <= end)
printf("ary[%d]\n",mid);
else
printf("Not found\n");
return 0;
}
在代码中,输入字符串的操作使用了gets()函数,在屏幕上输入时需要严格把控字符串长度,即二维字符型数组的列数,否则将会出现越界,且编译和运行时不会报错。
函数
函数的思想为:从上到下,逐步求解。将复杂的问题不断拆解,化解为容易解决的问题,分模块完成复杂问题的各个部分,最终实现整体功能。
语法:
一 二 三
int sum(int a,int b)
{
int sum;
... 四
return sum;
}
一:类型标识符。表示函数带出的结果的数据类型。如果函数不需要返回值,返回值设类型设置为void,且可以不写return,或在return后跟空语句。
二:函数名。函数的标识符。
三:形式参数。表明函数需要的数据。每个参数都要表明数据类型,每个参数之间使用逗号分隔。如果不需要传入参数,可以将形式参数设置为void空类型。在输入参数时,实际参数要与形式参数一一对应,个数相同,类型匹配。
四:函数体代码。实现函数的具体操作代码。
定义:
定义函数的位置可以在main函数之前,也可以在main函数之后。如果在main函数之后定义,需要在main函数前对函数进行声明。在标准C语言中不支持将函数写在main函数中的写法。
代码示例:
求和函数
#include <stdio.h>
int add(int sum1,int sum2)
{
int sum ;
sum = sum1 + sum2;
return sum;
}
int main(void)
{
int a,b;
printf("input a b:\n");
scanf("%d %d",&a,&b);
int sum;
sum = add(a,b);
printf("%d\n",sum);
return 0;
}