20240801嵌入式学习笔记

 字符串操作练习题

练习题:

找出一个二维数组中的鞍点, 即:该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。 

 代码思路:

首先确定数组大小和内容。从第一行开始寻找行最大值,寻找到后记录列标:假设找到第一行最大值为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;
}
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值