C语言入门_数组练习

举报
DS小龙哥 发表于 2024/01/31 14:16:00 2024/01/31
【摘要】 这篇文章一起盘盘那些C语言里关于数组和函数的实战练习题,这些题目可都是实实在在能帮助咱提升编程“内功”的硬核知识点。想想那些曾经困扰过我们的场景:在动态变化的数据海洋中,如何给数组插入、删除元素,就像玩扑克牌一样灵活地让数据左右挪移;又或者面对一堆杂乱无章的数字序列,怎样运用排序算法和优化技巧让它们乖乖排成一队;再有就是像接水管那样拼接数组中的数据块,实现信息的有效整合。

这篇文章一起盘盘那些C语言里关于数组和函数的实战练习题,这些题目可都是实实在在能帮助咱提升编程“内功”的硬核知识点。想想那些曾经困扰过我们的场景:在动态变化的数据海洋中,如何给数组插入、删除元素,就像玩扑克牌一样灵活地让数据左右挪移;又或者面对一堆杂乱无章的数字序列,怎样运用排序算法和优化技巧让它们乖乖排成一队;再有就是像接水管那样拼接数组中的数据块,实现信息的有效整合。

(1)说到函数,那可是我们编程世界里的小能手,它负责处理各种任务,从定义到封装、传参再到调用,一步步教会我们把大问题拆解成小模块。这其中,局部变量、全局变量、只读变量、静态变量等各显神通,它们各自在函数内外扮演着不同角色,管好它们的生命周期和作用范围,才能让代码既高效又稳定。

(2)而数组嘛,作为基础中的基础,你得知道怎么给它正确下定义,理解它是如何存储一串连续的数据滴。至于赋值操作,那是对数组元素进行读写的基础招式,甭管是整型、字符还是字符串类型,都得拿捏得当。特别是处理字符串时,那更是考验咱对数组本质理解和应用灵活性的关键环节。


复盘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};
将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;
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。