嵌入式全栈开发学习笔记---C语言笔试复习大全21(编程题25~30)

news2024/12/27 22:19:55

目录

25、实现字符串的排序。(输入hello world good,输出good hello world,其中字符串个数任意)

26、输入两个有序的字符串(从小到大),合并成一个有序的字符串。(输入cdhxyz fjln 输出cdfhjlnxyz)

27、命令行参数实现字符串排序。

28、一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序(异或)找出这两个只出现一次的数字。

29、编写一个函数来查找字符串数组中的最长公共前缀。(输入abca  abc  abca  abc  abcc 输出 abc)

30、给定一个字符串,字符串是有序的整数(位数不限)集合,逗号相连,移除相同的数字,使每个数字只出现一次,输出最终的数字个数。例如输入:0,0,1,1,1,2,2,31,31,444   输出 5


上一篇复习了数组指针和指针数组、指针的指针和命令行参数,这一节完成最后6道编程题。

说明:我们学过单片机的一般都是有C语言基础的了,网上关于C语言的资料有很多,大家如果对C语言不熟悉的话可以先去详细学一下,再以这篇博文作为复习资料学习。

这篇博文的目的是复习C语言,我们会陆续以30多个编程题作为复习要点,这30多个编程题基本涵盖了C语言所有的内容了,只要你掌握了这30多个编程题,那么你的C语言基本就没什么问题了。

注意:由于本专栏是嵌入式全栈开发专栏,为了我们能熟悉以后实际工作中的开发环境,我们写C语言全部在Linux中的vim编辑器中写,这么做事为了我们能够熟练掌握Linux系统的常用命令以及Linux上的vim编辑器的常用工作命令,以达到对口训练的目的!

vim编辑器的一些工作命令在上一篇博文中已经详细介绍过了,如果不了解可以先去看看。

我们正式开始:

25、实现字符串的排序。(输入hello world good,输出good hello world,其中字符串个数任意)

提示:先申请一个空间获取输入的字符串,每一个空格为一个字符串,然后再申请一个空间存放每一个字符串的地址,再通过指针数组中的每一个指针对每一个字符串进行排序。

参考代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void sort(char**s, int count)
{
	int i,j;
	for(i=0;i<count-1;i++)//s中的元素
	{
		for(j=0;j<count-1-i;j++)//元素中的每一个字符
		{
			if(strcmp(s[j],s[j+1])>0)
			{
				//交换地址
				char *t=s[j];
				s[j]=s[j+1];
				s[j+1]=t;
			}
		}
	}
}

void save_each_str_add(char*str, char**s)
{
	int i=0;
	char*begin=str;//将字符串的地址记住
	//当没有遇到字符串结束标志时就继续
	while(*str!='\0')
	{
		if(*str==' ')//当遇到空格时就说明是一个字符串了,就给该字符串申请空间
		{
			s[i]=(char*)malloc(sizeof(char)*(str-begin));
			//将该字符串拷贝进刚刚申请的空间
			strncpy(s[i++],begin,str-begin);
			begin=str+1;//str指向空格后一个字符作为下一个起始位置
		}
		str++;
	}
	//当*str等于结束标志标志退出循环时,记得将最后一个字符串的地址存进去
	s[i]=(char*)malloc(sizeof(char)*(str-begin));
    strncpy(s[i++],begin,str-begin);
}

int main()
{
	//获取输入
	char str[1028]={0};//数组的大小一定要写,够用就行
	char ch;
	int i=0;
	int count=0;//获取字符串的同时,计算单词的个数
	while((ch=getchar())!='\n')//只要不换行就继续获取
	{
		if(ch==' ')
		{
			count++;//如果是空格就++
		}
		str[i++]=ch;//将获取到的字符依次存放到str数组中
	}
	count++;
	//申请一个指针数组空间
	char **s=(char**)malloc(sizeof(char*)*count);//有多少个字符串count就申请多大空间,申请的空间类型是char*型的地址则是char**,而存放的类型是char*
	//将每一个字符串的地址存放在指针数组中
	save_each_str_add(str,s);//将总的输入和指针数组空间的地址传过去

	//对s数组中的指针对字符串进行排序
	sort(s,count);

	//打印s
	for(i=0;i<count;i++)
	{
		printf("%s ",s[i]);
	}
	printf("\n");
	
	//释放空间
	for(i=0;i<count;i++)
	{
		free(s[i]);
	}
	free(s);
	return 0;
}

运行结果:

26、输入两个有序的字符串(从小到大),合并成一个有序的字符串。(输入cdhxyz fjln 输出cdfhjlnxyz)

提示:获取两个字符串数组和一个空数组,依次比较数组1和数组2对应位置的字符大小,把小的放到数组3中,当比到其中一个数组的’\0’时,就停止比较,将另一个数组中剩下没有比较的字符直接接到数组3的字符串后面即可。

参考代码:

#include <stdio.h>
#include <string.h>

void merge(char*s1, char*s2, char*s3)
{
	while(*s1!='\0' && *s2!='\0')
	{
		if(*s1<*s2)
		{
			*s3++=*s1++;
		}
		else
		{
			*s3++=*s2++;
		}
	}

	if(*s1=='\0')
	{
		strcat(s3,s2);
	}
	
	if(*s2=='\0')
	{
		strcat(s3,s1);
	}
}

int main()
{
	char s1[128]={0};
	char s2[128]={0};
	char s3[128]={0};

	scanf("%s %s",s1,s2);

	merge(s1,s2,s3);

	printf("%s\n",s3);

	return 0;

}

运行结果:

27、命令行参数实现字符串排序。
参考代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void sort(int size, char*str[])
{
	int i,j;
	for(i=0;i<size-1;i++)
	{
		for(j=0;j<size-1-i;j++)
		{
			if(strcmp(str[j],str[j+1])>0)
			{
				char*t=str[j];
				str[j]=str[j+1];
				str[j+1]=t;
			}
		}
	}
}

int main(int argc, char*argv[])
{
	sort(argc-1, argv+1);
	int i,j;
	for(i=1;i<argc;i++)
	{
		printf("%s ",argv[i]);
	}
	printf("\n");
	return 0;
}

运行结果:

27、命令行参数实现字符串排序。

参考代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void sort(int size, char*str[])
{
	int i,j;
	for(i=0;i<size-1;i++)
	{
		for(j=0;j<size-1-i;j++)
		{
			if(strcmp(str[j],str[j+1])>0)
			{
				char*t=str[j];
				str[j]=str[j+1];
				str[j+1]=t;
			}
		}
	}
}

int main(int argc, char*argv[])
{
	sort(argc-1, argv+1);
	int i,j;
	for(i=1;i<argc;i++)
	{
		printf("%s ",argv[i]);
	}
	printf("\n");
	return 0;
}

运行结果:

 

28、一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序(异或)找出这两个只出现一次的数字。

提示:假设一个整型数组是:1 1 2 2 3 4

0001

0001

0010

0010

0011

0100

他们放在一起异或结果就是3^4

结果 0011 ^ 0100

0111

0111就说明了3和4的最后三位不同

取这三位中的任何一位都能计算

假设取左边开始下标为2的

所有数字中,凡是左边开始下标为二是1的放在一组

0100

凡是左边开始下标为二不是1的放在一组

0001

0001

0010

0010

0011

这两组数字,第一组全部异或 结果0100 即4

第二组全部异或 0011 即3

参考代码:

#include <stdio.h>

int find_one(int r)
{
	int i;
	for(i=0;i<32;i++)
	{
		if(r&1==1)
		{
			return i+1;//第i+1位是1
		}
		r>>=1;//右移位继续找
	}
	return -1;
}

int main()
{
	int i, result=0;
	int num1=0,num2=0;
	int array[10]={1,1,2,2,3,3,4,5,6,6};
	for(i=0;i<10;i++)
	{
		result^=array[i];
	}
	//找出异或的结果为1的二进制位,然后以此为标准来分组
	int index=find_one(result);
	//从右往左开始找,如果第i+1(index)位是1则分为一组,如果是0就分为一组
	for(i=0;i<10;i++)
	{
		//判断第index位是不是1
		//将每个元素的二进制位下标为index-1的位跟1相与
		if((array[i]>>(index-1))&1==1)
		{
			//组内异或得出结果
			num1^=array[i];
		}
		else
		{
			num2^=array[i];
		}
	}

	printf("%d %d \n",num1, num2);

	return 0;
}

运行结果:

29、编写一个函数来查找字符串数组中的最长公共前缀。(输入abca  abc  abca  abc  abcc 输出 abc)

提示:

第一步:获取字符串:定义一个指针数组,申请一块内存,指针数组中每一个指针指向该内存,将获取到的几个字符串对应放到每一个指针所指针的内存中。

第二步:找出最短字符串:如果字符串下标为0,就计算该字符串的长度存在short_len中。如果字符串的下标不为0且如果该字符串的长度小于最小长度,就将该下标记录在min中,然后将该字符串的长度更新到short_len中。

第三步:将最短字符串和其他字符串比较,看看是否是它的最长前缀。

参考代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	//获取字符串
	char*str[5]={0};//存放5个字符串的地址
	//找出最短字符串
	int i,j;
	int min;//记录最短字符串的编号
	int short_len;//记录最短字符串的长度
	char sub[32]={0};//将最短字符串拷贝进去

	for(i=0;i<5;i++)
	{
		str[i]=(char*)malloc(sizeof(char)*32);
		scanf("%s",str[i]);
		if(0==i)
		{
			min=i;
			short_len=strlen(str[i]);
		}
		else
		{
			if(strlen(str[i])<short_len)
			{
				min=i;
				short_len=strlen(str[i]);
			}
		}
	}
	//找出最长公共前缀
	//把最短字符串依次和每一个字符串比较,如果都相等,说明是公共子串,如果有一个不相等,就将最短字符串缩短一个字符,再进行对比,如此反复循环,次数等于最短字符串的长度
	for(i=short_len;i>=1;i--)
	{
		//拷贝之前先清空掉sub
		memset(sub,0,32);
		//将最短字符串拷贝到一个sub中
		strncpy(sub,str[min],i);
		//判断是不是公共子串
		for(j=0;j<5;j++)
		{
			if(strncmp(sub, str[j],i)!=0)//i为子串的长度
			{
				break;//说明不是子串,直接跳出j这层循环,i--缩短子串的长度
			}
		}
		if(j==5)
		{
			printf("最长公共子串是%s\n", sub);
			return 0;
		}
	}

	printf("公共子串不存在\n");
	return 0;
}

运行结果:

30、给定一个字符串,字符串是有序的整数(位数不限)集合,逗号相连,移除相同的数字,使每个数字只出现一次,输出最终的数字个数。例如输入:0,0,1,1,1,2,2,31,31,444   输出 5

提示:

第一步:定义两个数组,一个数组用来获取字符串,然后先将这个字符串转换成数字放在一个数组里面。atoi()函数:将字符串(以’\0’位分界面)转换成int型的数字,参数只要提供字符串的地址。

第二步:将重复的数字给去除掉,再统计个数

参考代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int str_to_int(char*str, int*array)
{
	char*begin=str;//记录下开始位置
	int i=0;//数组的下标
	//如果没有到'\0'就继续循环
	while(*str!='\0')
	{
		//如果遇到逗号就将逗号转换成'\0',分割成一个子串,然后将子串转换成int型
		if(*str==',')
		{
			*str='\0';
			//转换
			array[i++]=atoi(begin);
			//更新起始位置
			begin=str+1;
		}
		str++;
	}
	//退出循环后不要忘记转换最后一个数字
	array[i]=atoi(begin);
	return i+1;//返转换成数字的个数
}

int count_dif(int*array, int size)
{
	int i;
	int count_dif=0;
	for(i=0;i<size;i++)
	{
		if(0==i)
		{
			//数组第一个元素直接计算一次
			count_dif++;
			continue;//跳到i++
		}
		//之后只有当后一个数与前一个数不相等时才计算一次
		if(array[i]!=array[i-1])
		{
			count_dif++;
		}
		//如果相等就直接不计算了,继续i++
	}
	return count_dif;
}

int main()
{
	//定义两个数组
	char str[128]={0};
	int array[128]={0};
	//获取一个字符串
	scanf("%s", str);
	//将字符串转换成int数字
	int count=str_to_int(str, array);
	
	//计算不重复的个数
	printf("%d\n", count_dif(array, count));
	return 0;
}

运行结果:

以上就是这篇内容,如想了解更多,欢迎订阅本专栏!

如有问题可评论区或者私信留言,如果想要进交流群请私信!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1695575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用EAS自动生成数据模型和sql脚本

EAS适用于敏捷开发中小系统,这节主要讲解EAS对应的模型和数据库脚本输出应用。 在这个应用程序中,用户可自定义实体模型和枚举模型,只要选择相应的实体或者枚举进行右击添加即可。 解决方案参数设定,在解决方案的设定中可设置项目名称、通用语言,命名空间和输出位置。 连…

Python+Flask+Pandas怎样实现任意时间范围的对比数据报表

话不多说,有图有源码: 1.上图 2.因为是低代码的,只能发重要有用的代码片段了 实现思路:1)获取指定时间范围内的数据:2)df合并 #----------年份替换----------------for syear in range(int(byear),int(eyear)1):start_datestr(syear)strbdate[4:]end_datestr(syear)stredate…

2024-05-22 VS2022使用modules

点击 <C 语言编程核心突破> 快速C语言入门 VS2022使用modules 前言一、准备二、使用其一, 用VS installer 安装模块:第二个选项就是, 与你的代码一同编译std模块, 这个非常简单, 但是也有坑. 总结 前言 要解决问题: 使用VS2022开启modules. 想到的思路: 跟着官方文档整…

Linux更改系统中的root密码

Linux里面的root密码忘记了怎么办&#xff1f; 1 更改系统中的 root 密码 &#xff08;1&#xff09;键盘 CtrlAltT 快捷键打开终端。 &#xff08;2&#xff09;在终端窗口中输入以下代码&#xff1a; sudo passwd root &#xff08;3&#xff09;输入锁屏密码 &#xf…

kali下载zsteg和stegpy

1.kali下载zsteg 从 GitHub 上克隆zsteg到kali git clone https://github.com/zed-0xff/zsteg 切换目录 cd zsteg 用于安装名为 zsteg 的 Ruby Gem 包 gem install zsteg 2.kali下载stegpy 下载网站内的stegpy-master压缩包GitCode - 开发者的代码家园 并拉到kali中 切换到s…

String s1 = new String(“abc“);这句话创建了几个字符串对象?

首先&#xff0c;我们来聊聊Java中的字符串&#xff08;String&#xff09;。在Java里&#xff0c;字符串是不可变的&#xff0c;也就是说&#xff0c;一旦我们创建了一个字符串&#xff0c;它的值就不能更改了。这涉及到几个核心概念&#xff1a; 字符串常量池&#xff1a;这是…

Pytorch深度学习实践笔记5

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;pytorch深度学习 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 视频来自【b站刘二大人】 目录 1 Linear Regress…

Java 登录错误次数限制,用户禁登1小时

手机号验证码登录&#xff0c;验证码输入错误次数超5次封禁 Overridepublic boolean checkCaptcha(String phoneNum, String captcha) {String codeNum (String) redisTemplate.opsForValue().get(UserCacheNames.USER_CAPTCHA phoneNum);if (codeNum null) {throw new Wan…

2024 ISCC pwn wp

iscc 练武pwn 总结第一周chaosISCC_easyFlagshopping 第二周ISCC_easyISCC_Uheapheap 第三周miaoYour_programeazy_heap 总结 总体感觉iscc考察的题目都挺基础的&#xff0c;在目前这种比赛的大环境下&#xff0c;仍然出这种&#xff0c;比较基础的题目&#xff0c;实在是难得…

24李林跌落神坛,880还刷吗?还是换1000、900、660?

“李林今年跌落神坛了&#xff01;” “全是固定题型没新题&#xff0c;结果今年考的全是新题。” 880是“老真题的神”&#xff0c; 遇到24年&#xff0c;冷门考点多&#xff0c;计算量又大&#xff0c;就不灵了。 但“老真题”&#xff0c;还是得刷。就像往年真题是要刷的…

开源大模型与闭源大模型

概述 开源大模型和闭源大模型是两种常见的大模型类型&#xff0c;它们在以下方面存在差异&#xff1a; 开放性&#xff1a; 开源大模型&#xff1a;代码和模型结构是公开可用的&#xff0c;任何人都可以访问、修改和使用。闭源大模型&#xff1a;模型的代码和结构是私有的&…

SAP揭秘者-怎么执行生产订单ATP检查及其注意点

文章摘要&#xff1a; 上篇文章给大家介绍生产订单ATP检查的相关后台配置&#xff0c;大家可以按照配置步骤去进行配置&#xff0c;配置完之后&#xff0c;我们接下来就是要执行ATP检查。本篇文章具体给大家介绍怎么来执行生产 订单ATP检查及其注意点。 执行生产订单ATP检查的…

汇编:加减乘除指令

加法指令 (ADD) ADD指令用于将两个操作数相加&#xff0c;结果存储在第一个操作数中。 语法&#xff1a; ADD destination, source 示例&#xff1a; assume cs:code ​ code segmentmov ax,3mov bx,2add ax,bx //相加&#xff0c;结果会放在ax中mov ax,4c00hint 21h co…

[C语言]自定义类型详解:结构体、联合体、枚举

目录 &#x1f680;结构体 &#x1f525;结构体类型的声明 &#x1f525;结构的自引用 &#x1f525;结构体变量的定义和初始化 &#x1f525;结构体内存对齐 &#x1f525;结构体传参 &#x1f525;结构体实现位段&#xff08;位段的填充&可移植性&#xff09; &a…

读人工智能时代与人类未来笔记14_管控人工智能

1. 管控人工智能 1.1. 历史上的战场进一步推进到与数字网络相连的所有地方 1.2. 数字程序现在控制着一个由众多实体系统构成的庞大且仍在不断增长的领域&#xff0c;而且越来越多的此类系统已实现网络化 1.2.1. 在某些情况下甚至连门锁和冰箱都实现了网络化 1.2.2. 这催生出…

Hive安装教程

前置条件:hadoop&mysql docker容器安装mysql-CSDN博客 以下的/opt/bigdata目录根据自己实际情况更改 1.上传hive包并解压 tar -zxvf apache-hive-3.1.3-bin.tar.gz -C /opt/bigdata/ 2.修改路径 mv /opt/bigdata/apache-hive-3.1.3-bin/ hive cd /opt/bigdata/hive/…

cnVcXsrv 21.1.13.1—VcXsrv 21.1.13中文版本简单说明~~

对于VcXsrv的使用目的和用途相信大家都很了解。前不久VcXsrv做了更新&#xff0c;并且将项目托管到github上了。链接如下&#xff1a; VcXsrv: Windows X-server based on the xorg git sourceshttps://github.com/marchaesen/vcxsrv也可以简单查看如下链接&#xff1a; VcXs…

python数据分析——字符串和文本数据2

参考资料&#xff1a;活用pandas库 1、字符串格式化 &#xff08;1&#xff09;格式化字符串 要格式化字符串&#xff0c;需要编写一个带有特殊占位符的字符串&#xff0c;并在字符串上调用format方法向占位符插入值。 # 案例1 varflesh wound s"Its just a {}" p…

AI大模型探索之路-实战篇7:Function Calling技术实战:自动生成函数

系列篇章&#x1f4a5; AI大模型探索之路-实战篇4&#xff1a;深入DB-GPT数据应用开发框架调研 AI大模型探索之路-实战篇5&#xff1a;探索Open Interpreter开放代码解释器调研 AI大模型探索之路-实战篇6&#xff1a;掌握Function Calling的详细流程 目录 系列篇章&#x1f4a…

Python自动化工具(桌面自动化、Web自动化、游戏辅助)

工具介绍 连点工具是一款可以模拟键鼠后台操作的连点器工具。支持鼠标连点、键鼠脚本录制&#xff0c;支持辅助您实现办公自动化以及辅助游戏操作。功能简洁易用&#xff0c;非常方便操作。连点工具让您在在玩游戏、网购抢购的时候全自动点击鼠标&#xff01;主要功能有&#…