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

316 阅读3分钟

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

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~99
 5.数组的名称就是首地址。int buff[100];
 1.2 字符串数组
 1. 字符串录入:  scanf(“%s”);  gets()  fgets
 2. 头文件: string.h
 3. 从键盘录入字符串的方法 
 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};
 将ab拼接到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;
 }