写点什么

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

作者:DS小龙哥
  • 2022 年 4 月 25 日
  • 本文字数:2898 字

    阅读完需:约 10 分钟

复盘 C 语言数组的练习题:涉及到数组插入、数组删除、数组下标数据的左移右移、数组排序、数组排序优化、数组的数据拼接等等。


(1)函数基本使用: 函数基本定义、封装、传参、调用、局部变量、全局变量、只读变量、静态变量(2)数组基本使用: 数组基本定义、使用赋值、字符串。

1. 数组基本知识

1. 概念:  同一个类型的集合。2. 定义:  int data[100];  //数组data里可以存放100个int类型     100必须是常量(C89)。定义数组时,如果没有赋初始值[]一定要填大小。     int data[]={1};3.数组赋值: 只有在定义的使用才可以整体赋值。int data[10]={12,34,56,7,89};4.数组下标[]访问从0开始。  比如:  buff[100];  下标范围: 0~995.数组的名称就是首地址。int buff[100];1.2 字符串数组1. 字符串录入:  scanf(“%s”);  gets()  fgets2. 头文件: string.h3. 从键盘录入字符串的方法 scanf("%s",str); //从键盘上录入字符串,字符串结尾: '\0'gets(str);       //从键盘上录入字符串fgets(str,100,stdin); //从键盘上录入字符串 (标准输入)
#include <stdio.h>int main(int argc,char **argv){ int int_data[100]={12,34,56,78}; //整型数组 char char_data[]={'A','B','C'}; //字符数组 char str1_data[]={'A','B','C','\0'}; //字符串数组 char str2_data[]="ABC";//字符串数组 printf("char_data=%d\n",sizeof(char_data)); //3 printf("str1_data=%d\n",sizeof(str1_data)); //4 printf("str2_data=%d\n",sizeof(str2_data)); //4 return 0;}字符串数组特性: 结尾有’\0’
复制代码

2. 数组相关的题目(分析)

2.1 数组的数据插入

 int a[]={1,2,3,4,5,6,7};  在第2位数据后插入一个888   结果: 1,2,888,3,4,5,6,7#include <stdio.h>int main(int argc,char **argv){  int data[10]={1,2,3,4,5,6,7,8,9};  //1,2,3,4,4,5,6,7,8,9  int addr;  int i;  printf("输入插入的位置:");  scanf("%d",&addr);    /*1. 向后移动数据,空出位置*/  for(i=8;i>=addr;i--)  {    data[i+1]=data[i];  }    /*2. 查看移动之后的效果*/  for(i=0;i<10;i++)printf("%d ",data[i]);  printf("\n");    data[addr]=888; //插入的数据    /*3. 最终效果*/  for(i=0;i<10;i++)printf("%d ",data[i]);  printf("\n");    return 0;}
复制代码

2.2 数组数据的删除

 int a[]={1,2,3,4,2,6,7};   将第2位数据删除掉结果: 1,3,4,5,6,7示例:#include <stdio.h>int main(int argc,char **argv){  int data[10]={1,2,3,4,5,6,7,8,9,10};  //1,2,4,5,6,7,8,9,10,10  int addr;  int i;  printf("输入删除的位置:");  scanf("%d",&addr); //2
/*1. 向前移动,将数据覆盖掉*/ for(i=addr-1;i<10-1;i++) { data[i]=data[i+1]; } /*2. 查看移动之后的效果*/ for(i=0;i<9;i++)printf("%d ",data[i]); printf("\n"); return 0;}
复制代码

2.3 变量排序

数组数据排序。从键盘上输入一串数据(整数),从大到小排序,再输出。


int a[]={12,67,45,13,1,5}; 排序之后: 67,45,13,12,5,1


排序: 计算平均数。班级成绩、温度数据......


例子: 从键盘上随机输入 3 个数,将 3 个数按照从大到小的顺序输出。


#include <stdio.h>int main(int argc,char **argv){  int a,b,c;  int tmp; //存放临时数据  printf("请输入3个数:");  scanf("%d%d%d",&a,&b,&c); //以回车作为结束符号,以空格作为间隔符号  printf("源数据:%d,%d,%d\n",a,b,c);    //从大到小  if(a<b)  //b,a,c  {    tmp=a;    a=b;    b=tmp;  }  if(a<c) //b,c,a  {    tmp=a;    a=c;    c=tmp;  }    if(b<c) //c,b,a  {    tmp=b;    b=c;    c=tmp;  }  printf("从大到小排序:%d,%d,%d\n",a,b,c);  return 0;}
复制代码

2.4 数组冒泡排序

#include <stdio.h>int main(int argc,char **argv){  int data[10];  int tmp; //存放临时数据  int i,j;  int cnt=0; //排序比较的总次数    /*1. 录入数据*/  printf("请输入10个数:");  for(i=0;i<10;i++)scanf("%d",&data[i]);  /*2. 打印源数据:*/  printf("源数据:");  for(i=0;i<10;i++)printf("%d ",data[i]);  printf("\n");  /*3. 冒泡排序*/  for(i=0;i<10-1;i++) //比较轮数  {    for(j=0;j<10-1-i;j++) //每一轮比较的次数    {      if(data[j]>data[j+1]) //从小到大      {        tmp=data[j];        data[j]=data[j+1];        data[j+1]=tmp;      }      cnt++;     }  }    /*4. 打印结果数据:*/  printf("排序之后的数据:");  for(i=0;i<10;i++)printf("%d ",data[i]);  printf("\n");    printf("排序的总次数:%d\n",cnt);  return 0;}
复制代码


分析:


/*data[]={1,2,3}第一轮: [0]和[1]  [1]和[2]  2 3 1   每一轮保证最小的数在最后第二轮: [0]和[1]  3 2 1*/
排序: 从大到小1 2 3 4 5 第一轮:(1) 2 1 3 4 5(2) 2 3 1 4 5(3) 2 3 4 1 5(4) 2 3 4 5 1 第二轮:(1) 3 2 4 5 1(2) 3 4 2 5 1(3) 3 4 5 2 1(4) 3 4 5 2 1
第三轮:(1) 4 3 5 2 1(2) 4 5 3 2 1(3) 4 5 3 2 1(4) 4 5 3 2 1
第四轮:(1) 5 4 3 2 1(2) 5 4 3 2 1(3) 5 4 3 2 1(4) 5 4 3 2 1
复制代码

2.5 冒泡排序优化

#include <stdio.h>int main(int argc,char **argv){  int data[10];  int tmp; //存放临时数据  int i,j;  int cnt=0; //排序比较的总次数  45:  int flag=0; //标志位置    /*1. 录入数据*/  printf("请输入10个数:");  for(i=0;i<10;i++)scanf("%d",&data[i]);  /*2. 打印源数据:*/  printf("源数据:");  for(i=0;i<10;i++)printf("%d ",data[i]);  printf("\n");  /*3. 冒泡排序*/  for(i=0;i<10-1;i++) //比较轮数  {    for(j=0;j<10-1-i;j++) //每一轮比较的次数    {      if(data[j]>data[j+1]) //从小到大      {        tmp=data[j];        data[j]=data[j+1];        data[j+1]=tmp;        flag=1;      }      cnt++;     }    if(flag==0) //不需要继续排序    {      break; //跳出最外层循环    }    flag=0; //清除标志位,方便第2次判断  }    /*4. 打印结果数据:*/  printf("排序之后的数据:");  for(i=0;i<10;i++)printf("%d ",data[i]);  printf("\n");    printf("排序的总次数:%d\n",cnt);  return 0;}
复制代码


分析:


data[]={1,2,3}第一轮: [0]和[1]  [1]和[2]  2 3 1   每一轮保证最小的数在最后第二轮: [0]和[1]  3 2 1
复制代码

2.6 数组数据的拼接(整数)

 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} 必须保证c数组空间足够大。
复制代码


示例代码:


#include <stdio.h>int main(int argc,char **argv){  int src_data[10]={1,2,3,4,5};  int new_data[]={6,7,8,9}; //  int i;  for(i=0;i<sizeof(new_data)/sizeof(new_data[0]);i++)  {    src_data[i+5]=new_data[i];  }    for(i=0;i<10;i++)  {    printf("%d ",src_data[i]);  }  printf("\n");  return 0;}
复制代码


发布于: 刚刚阅读数: 2
用户头像

DS小龙哥

关注

之所以觉得累,是因为说的比做的多。 2022.01.06 加入

熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域

评论

发布
暂无评论
C语言总结_数组全方位练习_4月月更_DS小龙哥_InfoQ写作社区