0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言_数组的查找、替换、排序、拼接

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2022-08-14 09:48 次阅读

这篇文章主要是总结C语言的位运算几个实战例子,接着介绍数组的基本定义用法、数组排序、插入、拼接、删除、字符串查找替换等。

1. 颜色转换的例子

1.颜色转换的例子:  RGB888  RGB565  RGB666…. 
   int data=12345; //RGB888的颜色
   要求将data转为RGB565    -去掉高位
 示例:
/*
int data=101010101010101010101010  11184810

R:01010
G:101010
B:01010

0101010101001010  21834

10101010
00111111
*/

#include 
int main(int argc, char * argv[])
{
	unsigned short rgb565_c;
   unsigned int data=11184810; //RGB888
   unsigned char r=(data>>16)&0xFF;
   unsigned char g=(data>>8)&0xFF;
   unsigned char b=(data>>0)&0xFF;
   
   printf("RGB88_r=0x%X\n",r);
   printf("RGB88_g=0x%X\n",g);
   printf("RGB88_b=0x%X\n",b);
   
   r&=0x1F; //5
   g&=0x3F; //6
   b&=0x1F; //5
   
   rgb565_c=(r<<11)|(g<<5)|(b<<0);
   printf("rgb565_c=%d\n",rgb565_c);
	return 0;
}

2. 位运算综合练习

2.位运算综合练习

#include 
int main(int argc,char **argv)
{
	
	/*1. 存放数据*/
	data|='A'<<24;
	data|='B'<<16; //F
	data|='C'<<8;
	data|='D'<<0;
	
	/*2. 修改数据*/
	data&=~(0xFF<<8*2); //清除指定位
	data|='F'<<16;

	/*3. 取出数据*/
	printf("%c\n",(data>>24)&0xFF);
	printf("%c\n",(data>>16)&0xFF);
	printf("%c\n",(data>>8)&0xFF);
	printf("%c\n",(data>>0)&0xFF);
	return 0;
}

3. 位运算实际的运用

3.实际的运用

short  c1=1234; //R占11~15位  G占2~7位
short  c2=4567; //B占 11~15位
RGB565; 
要求:  将以上RGB分量提取出来,存在另一个变量(16位的变量)中—RGB565  。
unsigned int data_1;   //整型   4个字节
	unsigned short data_2; //短整型 2个字节
   unsigned long data_3;  //长整型 4个字节
   unsigned long long data_3;  //双长整型  8个字节

示例:
/*
short  c1=1234; //R占11~15位  G占2~7位
short  c2=4567; //B占 11~15位

c1=101010101010101010101010    11184810
c2=101010101010101010101010    11184810

r: 10101
g: 101010
b: 10101
rgb565=1010110101010101  44373
*/

#include 
int main(int argc, char * argv[])
{
	unsigned int c1=11184810;
   unsigned int c2=11184810;
   unsigned char r,g,b;
	unsigned short c3;
	/*1. 转换为RGB888*/
   r=c1>>8;
   g=c1&0xFF;
   b=c2>>8;
   
   /*2. 转换为RGB565*/
   r=r>>3;
   g=g>>2;
   b=b>>3;
   
   /*3. 组合颜色*/
   c3=(r<<11)|(g<<5)|(b<<0);
   printf("c3=%d\n",c3);
	return 0;
}

4. 数组特点介绍

内存空间: 都是连续的---线性空间。
数组类型定义:  <数据类型> 数组的名称[数组的大小]; 
                 int            buff[100];
数组的特性:
(1)数组的空间是连续的。  就是同类型变量的集合
(2)数组里只能存放相同类型的数据
(3)数组的下标是从0开始
(4)数组在定义的时候,必须得有一个合法空间。 int buff[];  

#include 
int main(int argc, char * argv[])
{
	int buff_int[100]; //空间是多大? 400字节
	//下标范围: 0~99
   
   char buff_char[100]; //空间是多大?100字节
   //下标范围:0~99
	return 0;
}
数组示例:
#include 
int main(int argc, char * argv[])
{
	int buff1[]={1,2,3,4,5,6,7,8,9,0}; //大小以数据数量为准
	int buff2[1]; //空间定义必须大于0
   
   printf("%d\n",buff1[0]); //1
   printf("%d\n",buff1[2]); //3
   printf("%d\n",buff1[4]); //5
	return 0;
}
数组的数据倒序输出:

#include 
int main(int argc, char * argv[])
{
	int buff1[]={1,2,3,4,5,6,7,8,9,0}; //大小以数据数量为准
	int i;
   for(i=0;i<10;i++)
   {
		printf("%d ",buff1[9-i]);
   }
	return 0;
}

//数组的初始化
   /*
		1. 数组什么时候可以整体赋值?只有在数组定义的时候
	     2. 数组的空间必须是常量 (C89)
	       错误:
		       int data=100;
				 int buff[data];
		3. 数组的下标是从0开始
   */
数组定义:
(1)一维数组  char data[100];
(2)二维数组  char data[100][100];
(3)三维数组  char data[100][100][100]; ………….

题目:

#include 
int main(int argc, char * argv[])
{
	int i;
   float buff[5]; //buff的名称是首地址
	float sum=0;
   printf("输入成绩:");
   for(i=0;i<5;i++)
   {
		scanf("%f",&buff[i]);
   }
   
   for(i=0;i<5;i++)
   {
		sum+=buff[i];
   }
   
   printf("sum=%f\n",sum/5);
	return 0;
}

5. *号显示中文

6.  显示中文
  通过*号打印出自己的名字。
#include 
int main(int argc, char * argv[])
{
   unsigned char buff[]={0x08,0x08,0x7E,0x4A,0x7E,0x08,0x08,0x08};
	int i,j;
   unsigned char data;
   for(i=0;i<8;i++)
   {
	   data=buff[i];
		for(j=0;j<8;j++)
		{
			if(data&0x80)printf("*");
			else printf(" ");
			data<<=1; //依次判断高位
	   }
	   printf("\n");
   }
   return 0;
}

/*
8*8

0000 1000  0x08
0000 1000  0x08
0111 1110  0x7E
0100 1010  0x4A
0111 1110  0x7E
0000 1000  0x08
0000 1000  0x08
0000 1000  0x08
*/
汉字显示示例代码:
#include 
int main(int argc, char * argv[])
{
   unsigned char buff[]=
  {
	/*--  文字:  中  --*/
	/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
	0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,
	0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,   
  };
  
int i,j;
   int cnt=0;
   unsigned char data;
   for(i=0;i<32;i++)
   {
	   data=buff[i];
		for(j=0;j<8;j++)
		{
			if(data&0x80)printf("*");
			else printf(" ");
			data<<=1; //依次判断高位
		   cnt++;
	   }
	   if(cnt==16)
	   {
		   cnt=0;
	      printf("\n");
	   }
   }
   return 0;
}

6. 数组的数据插入

1.数组的数据插入:  
   int a[]={1,2,3,4,5,6,7};  在第2位数据后插入一个888
  最终 int a[]={1,2,888,3,4,5,6,7};
#include 
int main(int argc, char * argv[])
{
	int buff[50]={1,2,3,4,5,6,7,8,9,10};
	int addr=2; //插入的位置(以正常数字计数)
	int len=10; //源数组里的数据长度
   int data=888; //将要插入的数据
   int i;
   
   /*1. 依次将数据向后移动*/
   for(i=len-1;i>=addr-1;i--)
   {
		buff[i+1]=buff[i];
   }
   buff[addr-1]=data; //插入数据
   len++;  //长度加1
   
   /*2. 打印最终的结果*/
   for(i=0;i;i++)>

7. 数组数据的删除

2.数组数据的删除
  int a[]={1,2,3,4,5,6,7};  将第2位数据删除掉
  最终 int a[]={1,3,4,5,6,7};
#include 
int main(int argc, char * argv[])
{
	int buff[50]={1,2,3,4,5,6,7,8,9,10};
	int addr=2; //删除的位置(以正常数字计数)
	int len=10; //源数组里的数据长度
	int i;
   
   /*1. 向前覆盖数据*/
   for(i=addr-1;i;i++)>

8. 数组数据排序----冒泡排序

3.数组数据排序----冒泡排序
   int a[]={1,2,3,4,5,6,7};     最终 int a[]={7,6,5,4,3,2,1};
基本排序
#include 
int main(int argc, char * argv[])
{
	//将要排序的数组
	int buff[10]={12,67,34,89,54,15,90,58,66,88};
	int tmp;
	int i,j;
	int len=10; //数组的长度
	//排序
   for(i=0;ibuff[j+1])
			{
				tmp=buff[j];
				buff[j]=buff[j+1];
				buff[j+1]=tmp;
		   }
	   }
   }
   
   for(i=0;i
int main(int argc, char * argv[])
{
	//将要排序的数组
	int buff[10]={1,2,3,4,5,6,7,8,9,10};
	int tmp;
	int i,j;
	int len=10; //数组的长度
   int cnt=0;
	//排序
   for(i=0;i;i++)>;j++)>;i++)>;i++)>

9. 数组拼接

4.数组数据的拼接
     int a[]={1,3,4,5,6,7};   int b[]={11,13,14,15,16,17};
    将a和b拼接到c数组里。 最终int c[]={1,3,4,5,6,7, 11,13,14,15,16,17}
示例:
#include 
int main(int argc, char * argv[])
{
	int buff1[50]={1,2,3,4,5,6,7,8,9,10};
	int buff2[10]={11,12,13,14,15,16,17,18,19,20};
   
   int len1=10; //源数据长度
   int len2=10;  //插入的数据长度
   int i;
   for(i=0;i;i++)>

10. 字符串查找与替换

字符串数组有一个约定:  结尾有’\0’
char buff[]={'A','B','C','D'}; //字符数组定义
   char  buff[]="ABCD"; //字符串数组定义
   char buff[]={'A','B','C','D','\0'}; //字符串数组定义
“”  //双引号之前默认有’\0’ 
#include 
int main(int argc, char * argv[])
{
	char str[]="嵌入式开发"; //字符串数组--文本数据
   int i=0;
   for(i=0;str[i]!='\0';i++){}
   printf("i=%d\n",i);
   return 0;
}

查找与替换
#include 
int main(int argc, char * argv[])
{
	int buff[]={123,456,123,56,567,123,567};
   int cnt=0,i=0;
   for(i=0;i<7;i++)
   {
		if(buff[i]==123) //查找
	  {
		 buff[i]=888; //替换
		 cnt++;
	  }
   }
   printf("cnt=%d\n",cnt);
   
   for(i=0;i<7;i++)
   {
	   printf("%d ",buff[i]);
	}
   return 0;
}

作业:
1.字符串排序。 “24RERFER8RTBJV”  
2.字符串插入:  “1234567890” 
在第2个位置后面插入”ABC”
最终结果: “12ABC34567890”
3.字符串查找: “123456123abc123hbc”
  查找字符串”123”的数量。  数量是3
4.字符串删除:  “1234567890”
删除”456”  最终结果: “1237890”
5.字符串替换
字符串”1234567890”
将456替换为”888”
 最终: “1238887890”
需要考虑3种情况
  
审核编辑:汤梓红
;j++)>;j++)>
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7522

    浏览量

    127524
  • 数组
    +关注

    关注

    1

    文章

    408

    浏览量

    25593
收藏 人收藏

    评论

    相关推荐

    C语言常用排序方法大全

    C语言常用排序方法大全
    发表于 11-07 17:10

    数组进行随机排序的算法分析

    的提高了运行效率,以下分别介绍这三种方法方法一:通过随机数产生随机数组,然后在随机数中查找当前随机数是否存在,如果存在,则继续生成随机数继续查找,如果不存在,则添加至随机数组中,程序框
    发表于 05-24 15:48

    PHP数组排序

    数组排序(6个) sort() - 以升序对数组排序rsort() - 以降序对数组排序 rev
    发表于 11-04 07:48

    怎样去优化单片机C语言编程代码呢

    单片机C语言编程代码优化1、选择合适的算法和数据结构应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍。将比较慢的顺序查找法用较快的二分
    发表于 11-23 07:47

    替换数组子集函数

    Labview之替换数组子集函数,很好的Labview资料,快来下载学习吧。
    发表于 04-19 10:43 0次下载

    C语言教程之查找数组中的最值

    C语言教程之查找数组中的最值,很好的C语言资料,快来学习吧。
    发表于 04-25 15:13 0次下载

    C语言教程之对数组进行升序和降序排序

    C语言教程之对数组进行升序和降序排序,很好的C语言资料,快来学习吧。
    发表于 04-25 16:09 0次下载

    二维数组重新排序

    labview进行二维数组的重新排序
    发表于 12-12 15:15 9次下载

    基于C语言二分查找排序源代码

    本文档内容介绍了C语言归并、选择、直接插入、希尔、冒泡、快速、堆排序与顺序、二分查找排序源代码,分享给大家供大家参考。
    发表于 01-04 11:24 1次下载

    C语言: Leetcode 33搜索旋转排序数组

    假设按照升序排序数组在预先未知的某个点上进行了旋转。
    的头像 发表于 06-22 08:51 1482次阅读
    C<b class='flag-5'>语言</b>: Leetcode 33搜索旋转<b class='flag-5'>排序数组</b>

    C语言:LeetCode 153寻找旋转排序数组中的最小值

    假设按照升序排序数组在预先未知的某个点上进行了旋转。
    的头像 发表于 06-22 08:59 1600次阅读
    C<b class='flag-5'>语言</b>:LeetCode 153寻找旋转<b class='flag-5'>排序数组</b>中的最小值

    筑基_C_5_对数组的二分查找

    C语言泛型编程,实现对数组中某元素的二分查找
    发表于 12-06 10:21 9次下载
    筑基_C_5_对<b class='flag-5'>数组</b>的二分<b class='flag-5'>查找</b>

    C语言总结_数组全方位练习

    C语言数组的练习题:涉及到数组插入、数组删除、数组下标数据的左移右移、数组
    的头像 发表于 08-14 09:34 653次阅读

    C语言总结_数组知识

    当前文章复盘C语言数组数组定义规则、数组空间类型、数组下标使用、数组存放的数据类型、
    的头像 发表于 08-14 09:38 1069次阅读

    c语言数组查找指定元素

    C语言是一种通用的编程语言,广泛应用于各种领域,包括嵌入式系统、操作系统、游戏开发等。在C语言中,数组是一种非常重要的数据结构,用于存储一系列相同类型的元素。
    的头像 发表于 11-24 10:07 1288次阅读