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

Posted DS小龙哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言_数组的查找替换排序拼接相关的知识,希望对你有一定的参考价值。

这篇文章主要是总结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种情况

以上是关于C语言_数组的查找替换排序拼接的主要内容,如果未能解决你的问题,请参考以下文章

C语言总结_数组知识点练习

C的string.h里有没有字符串替换函数

c语言如何实现-数组排序,二分查找

c语言排序和查找?

verilog数字高位扩展表示方法

C语言合并两个数组