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

302 阅读6分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

这篇文章主要是总结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 <stdio.h>
 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 <stdio.h>
 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 <stdio.h>
 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 <stdio.h>
 int main(int argc, char * argv[])
 {
     int buff_int[100]; //空间是多大? 400字节
     //下标范围: 0~99
    
    char buff_char[100]; //空间是多大?100字节
    //下标范围:0~99
     return 0;
 }
 数组示例:
 #include <stdio.h>
 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 <stdio.h>
 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 <stdio.h>
 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 <stdio.h>
 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 <stdio.h>
 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 <stdio.h>
 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<len;i++)
    {
         printf("%d ",buff[i]);
    }
     return 0;
 }

7. 数组数据的删除

 2.数组数据的删除
   int a[]={1,2,3,4,5,6,7};  将第2位数据删除掉
   最终 int a[]={1,3,4,5,6,7};
 #include <stdio.h>
 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<len-1;i++)
    {
        buff[i]=buff[i+1];
    }
    len--;
    /*2.打印最终结果*/
    for(i=0;i<len;i++)
    {
         printf("%d ",buff[i]);
    }
     return 0;
 }

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

 3.数组数据排序----冒泡排序
    int a[]={1,2,3,4,5,6,7};     最终 int a[]={7,6,5,4,3,2,1};
 基本排序
 #include <stdio.h>
 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;i<len-1;i++) //比较的轮数
    {
         for(j=0;j<len-1;j++) //每轮的次数
         {
           if(buff[j]>buff[j+1])
             {
                 tmp=buff[j];
                 buff[j]=buff[j+1];
                 buff[j+1]=tmp;
            }
        }
    }
    
    for(i=0;i<len;i++) printf("%d ",buff[i]);
    return 0;
 }
 优化代码
 ​
 #include <stdio.h>
 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<len-1;i++) //比较的轮数
    {
         for(j=0;j<len-1-i;j++) //每轮的次数
         {
           if(buff[j]<buff[j+1]) //从大到小排序
             {
                 tmp=buff[j];
                 buff[j]=buff[j+1];
                 buff[j+1]=tmp;
            }
            cnt++;
        }
    }
    printf("cnt=%d\n",cnt); 
    for(i=0;i<len;i++) printf("%d ",buff[i]);
    return 0;
 }
 最终优化代码
 ​
 #include <stdio.h>
 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;
    int flag=0; //是否需要排序的标志位
    
     //排序
    for(i=0;i<len-1;i++) //比较的轮数
    {
         for(j=0;j<len-1-i;j++) //每轮的次数
         {
           if(buff[j]>buff[j+1]) //从小到大排序
             {
                 tmp=buff[j];
                 buff[j]=buff[j+1];
                 buff[j+1]=tmp;
                flag=1; //标记排序一次
            }
            cnt++;
        }
        if(flag) //上一次排过序
        {
            flag=0; //清除标志位
        }
        else
        {
            break; 
        }
    }
    printf("cnt=%d\n",cnt); 
    for(i=0;i<len;i++) printf("%d ",buff[i]);
    return 0;
 }

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 <stdio.h>
 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<len2;i++)
    {
         buff1[len1+i]=buff2[i]; //实现数据拼接
    }
    len1+=len2;//最终数据长度
    for(i=0;i<len1;i++)
    {
         printf("%d ",buff1[i]);
    }
     return 0;
 }

10. 字符串查找与替换

 字符串数组有一个约定:  结尾有’\0’
 char buff[]={'A','B','C','D'}; //字符数组定义
    char  buff[]="ABCD"; //字符串数组定义
    char buff[]={'A','B','C','D','\0'}; //字符串数组定义
 “”  //双引号之前默认有’\0’ 
 #include <stdio.h>
 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 <stdio.h>
 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种情况