第4章 数组

🌞欢迎来到C语言的世界 
🌈博客主页:卿云阁

💌欢迎关注🎉点赞👍收藏⭐️留言📝

🌟本文由卿云阁原创!

🌠本阶段属于锻体阶段,希望各位仙友顺利完成突破

📆首发时间:🌹2021年1月19日🌹

✉️希望可以和大家一起完成进阶之路!

🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!


目录

0️⃣数组的基本介绍

1️⃣插入一个元素

2️⃣删除一个元素

0️⃣✨✨✨数组的基本介绍✨✨✨   

  数组也是数据呈线性排列的一种数据结构。与前一节中的链表不同,在数组中,访问数据十分 简单,而添加和删除数据比较耗工夫。
 char a[5]={'A','C','D'};


1️⃣✨✨✨插入一个元素✨✨✨

如果想在任意位置上添加或者删除数据,数组的操作就要比链表复杂多了。这里我
们尝试将B添加到第2个位置上。

 首先,在数组的末尾确保需要增加的存储空间。 为了给新数据腾出位置,要把已有数据一个个个移开。

for(int j=4;j>=1;j --)//将i及以后的后移一位。 由于是固定位置插入,所以不需要查找插入位置。 
        a[j+1] = a[j];

 

 最后在位置上写入B。

  a[1] = 'B';//插入元素

 完整代码

#include <stdio.h>
int main() {
  char a[5]={'A','C','D'};
  for(int j=4;j>=1;j --)//将i及以后的后移一位。 由于是固定位置插入,所以不需要查找插入位置。 
        a[j+1] = a[j];
  a[1] = 'B';//插入元素。
  return 0;
}

2️⃣✨✨✨删除一个元素✨✨✨ 

首先,删掉目标数据B
然 后 把 后 面 的 数 据 一 个 个 往 空前位移
#include <stdio.h>
int main() {
  char a[5]={'A','B','C','D','E'};
  for(int j=1;j<=3;j++)
        a[j] = a[j+1];
  a[4]=0;
  return 0;
}

 

 

     这里讲解一下对数组操作所花费的运行时间。假设数组中有 n 个数据,由于访问数
据时使用的是随机访问 通过下标可计算出内存地址 ,所以需要的运行时间仅为恒定的
O ( 1 ) 。 但另一方面,想要向数组中添加新数据时,必须把目标位置后面的数据一个个移
开。所以,如果在数组头部添加数据,就需要 O ( n ) 的时间。删除操作同理
     在链表和数组中,数据都是线性地排成一列。在链表中访问数据较为复杂,添加和
删除数据较为简单;而在数组中访问数据比较简单,添加和删除数据却比较复杂。
我们可以根据哪种操作较为频繁来决定使用哪种数据结构。

3️⃣✨✨✨一维数组的应用实例✨✨✨

 1.编程从键盘输入10个学生的某门课成绩,并输出最高分。

#include <stdio.h>
int main(void)
{
    float a[10],max;   
    int i;
    printf("请输入10个学生的成绩:\n");
    for(i=0;i<=9;i++) 
        {
        	printf("请输出第%d个学生的成绩:\n",i+1);
            scanf("%f",&a[i]);
		}
    for(i=1;i<=9;i++)
       {
       	a[0]=max;
        if(a[i]>=max)
           max=a[i];
		} 
	printf("最大的值=%f\n",max);
    return 0;
}

2.定义两个大小、数据类型一致的一维数组,把其中一个初始化,然后把它的所有元素值赋给另一个数组对应元素,并输出。

#include <stdio.h>
int main(void)
{
    int a[10],b[10];   
    int i;
    printf("请输入a数组中的值:\n");
    for(i=0;i<=9;i++) 
        {
            scanf("%d",&a[i]);
		}
    for(i=0;i<=9;i++)
       {
       	b[i]=a[i];
       	printf("b[%d]=%d ",i,b[i]);
		} 
    return 0;
}

 

memcpy(内存地址a,内存地址b,字节大小n);

功能是把从地址b开始向后的n个字节数据,复制到地址a开始的空间中。

#include <stdio.h>
int main(void)
{
    int a[10],b[10];   
    int i;
    printf("请输入a数组中的值:\n");
    for(i=0;i<=9;i++) 
        {
            scanf("%d",&a[i]);
		}
	memcpy(b,a,sizeof(a));
    for(i=0;i<=9;i++)
       {
       	printf("b[%d]=%d ",i,b[i]);
		} 
    return 0;
}

  3.把Fibonacci数列的前n项由大到小输出出来,n由用户输入。

#include <stdio.h>
int main(void)
{
    int n,i,j; 
	printf("请输入数组的大小:\n");  
	scanf("%d",&n);
	int f[n];
	f[0]=0;
	f[1]=1;
    printf("%d ",f[0]);
    printf("%d ",f[1]);
	for(i=2;i<=9;i++)
    {   
       	f[i]=f[i-1]+f[i-2];
       	printf("%d ",f[i]);
	}  
	putchar('\n');
	for(j=9;j>=0;j--)
    {   
       	printf("%d ",f[j]);
	} 
    return 0;
}

4.冒泡算法

#include <stdio.h>
int main(void)
{   
    int i,j,z,temp;
    int a[10]={1, 0, 4, 8, 123, 65, -76, 100, -45, 12};
    for(j=1;j<10;j++)
    {
    for (i=0;i<10-j;i++)
    {
      if (a[i]>a[i+1])
      {
       temp=a[i];
       a[i]=a[i+1];
       a[i+1]=temp;
	  }	
	}
	}
    for(z=0;z<10;z++)
	    printf("%d ",a[z]);
    return 0;
}

 5.折半算法

#include <stdio.h>
int main(void)
{   
    int a[10]={-76,-45,0,1,4,8,12,65,100,123};
    int low=0,high=9,med;
    int x=4;//设置需要查找的值 
    while(high>=low)
    {
    	med=(low+high)/2;
    if (a[med]==4)
    {   
        printf("找到指定的数字,其对应的下标是%d",med);
        break;
	}
	else
	{
		if(a[med]>4)
		high=med-1;
		else
		low=med+1;
	}
	if(low>high)
	{
		printf("没有找到指定的数字");
        break; 
	}
	}
    return 0;
}

4️⃣✨✨✨二维数组的应用实例✨✨✨ 

1.

#include <stdio.h>
int main(void)
{   
    int a[2][3]={{1,2,3},{4,5,6}};
    int i,j;
    //arr的数据类型是有2个一维数组组成的二维数组类型
	//一共有两个元素,元素类型是由3个int类型组成的一维数组类型。
	for(i=0;i<2;i++)
	{
		if(1==i)
		    putchar('\n');
		for(j=0;j<3;j++)
	    {
	    	printf("%d ",a[i][j]);
	    	
		}
	}
    return 0;
}

 2. 有一个二维数组int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};,把它相邻奇数行与偶数行互换,并输出。

#include <stdio.h>
int main(void)
{   
    
    int i,j,c;
    int temp[3];
    int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12}; 
    c=sizeof(a[0]);
    //arr的数据类型是有2个一维数组组成的二维数组类型
	//一共有两个元素,元素类型是由3个int类型组成的一维数组类型。
	printf("-----原来的数组是-----\n");
	for(i=0;i<4;i++)
	{
		putchar('\n');
		for(j=0;j<3;j++)
	    {
	    	printf("%d ",a[i][j]);
	    	
		}
	}
    for(i=0;i<3;i+=2)
    {
    	memcpy(temp,a[i],c);
    	memcpy(a[i],a[i+1],c);
    	memcpy(a[i+1],temp,c);
	}
	putchar('\n');
	printf("-----现在的数组是-----\n");
	for(i=0;i<4;i++)
	{
		putchar('\n');
		for(j=0;j<3;j++)
	    {
	    	printf("%d ",a[i][j]);
	    	
		}
	}
    return 0;
}

 3.把矩阵转置,放入另一个矩阵,并输出转置矩阵。

#include <stdio.h>
int main(void)
{   
    
    int a[2][3]={{1,2,3},{4,5,6}};  //二维数组的定义和初始化。
    int b[3][2],i,j;             // 定义了二维数组b[3][2],并没有初始化。 
	for(i=0;i<2;i++)
	{
		putchar('\n');
		for(j=0;j<3;j++)
	    {
	    	b[j][i]=a[i][j];
	    	
		}
	}
	putchar('\n');
	printf("-----现在的数组是-----\n");
	for(i=0;i<3;i++)
	{
		putchar('\n');
		for(j=0;j<2;j++)
	    {
	    	printf("%d ",b[i][j]);
	    	
		}
	}
    return 0;
}

4.有一个m×n的矩阵,mn由键盘输入,要求编程给每一个变量赋值并找出其中的最大值,并输出最大值以及其所在的行号和列号。 

#include <stdio.h>
int main(void)
{   
    int m,n;
    int i,j;
    printf("请输入m,n的值:\n");
    scanf("%d%d",&m,&n);
    int a[m][n];
    printf("请输入数组中每一个元素的值:\n");
    for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
	    {
	    	scanf("%d",&a[i][j]);	
		}
	}
	putchar('\n');
	printf("-----现在的数组是-----\n");
	for(i=0;i<m;i++)
	{
		putchar('\n');
		for(j=0;j<n;j++)
	    {
	    	printf("%d ",a[i][j]);
	    	
		}
	}
	printf("\n");
	//处理
	int l,r,max,temp;
	max= a[0][0];
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
	    {
	    	if(max<a[i][j])
	    	{
	    		max=a[i][j];
	    		l=i;
	    		r=j;
			}
		}
	}

	printf("数组中的最大值:%d\n",max);
    printf("对应的行号和列号:%d  %d\n",l,r);
    return 0;
}

5.有一个3*4的二维数组,并已赋初值,要求输出每一行第0个数据地址值和每一行中数据的最大值。

#include<stdio.h>
int main(void)
{
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int i,j=0;
for(i=0;i<3;i++)
{
    printf("row %d:address is %ld,",i,arr[i]); //输出第i行第0个变量地址。
    int max=arr[i][0];  //把第i行的第0个变量赋给max。
   /*这个循环找出第i行的最大值。*/
   for(j=0;j<4;j++)
   if(max<arr[i][j])
       max=arr[i][j];
    printf("max value is %d\n",max);
}
	return 0;
}


5️⃣✨✨✨字符数组的应用实例✨✨✨

1. 定义一个一维字符数组,从键盘输入字符串给这个字符数组,并输出。

#include<stdio.h>
int main(void)
{
    char a[20];
    printf("请输入您的名字:\n");
    scanf("%s",a);
    printf("名字:%s",a);
	return 0;
}

 

  但scanf接收字符串时有一个不足的处,就是它是从非空格处开始接收字符,遇到空格就停止,空格后面的就不管了。如输入"  zhongguo cheng",z前面有空格,scanf忽略这些空格,从z处接收字符,到'c'字符前的空格结束,所以接收的效果与上面的输入是不一样的,所以对于此输入,输出为"zhongguo"。

也就是说name只接收了"zhongguo"这几个字符,其后的空格和字符都丢弃了。要用多个字符数组接收多个串,输入时中间用空格隔开。例如,

scanf("%s%s%s",str_1,str_2,str_3);  // str_1,str_2,str_3为一维字符数组名。

但这种输入方式需要每一个串本身不能有空格。

第二种方法是用gets函数。在实际中经常要输入中间有空格的字符串,例如姓名,这时用scanf加%s的形式就比较麻烦,所以C库中提供了gets这一函数来接收字符串数据,其使用方法为gets(一维字符数组名) 。gets把输入的字符(包括空格字符)全部取出,去掉Enter,在输入字符后再加上'\0',然后存入到以一维字符数组名值为首地址的内存空间中,各字符顺序存放。其实,在gets(一维字符数组名)中,一维字符数组名用的它表达的地址,以指定字符串从哪里开始存放,重点在地址,而不是数组名。

#include<stdio.h>
#include<string.h> 
int main(void)
{
	char name[20];
	printf("请输入您的名字:\n");
	gets(name);
	printf("%s\n",name);
	return 0;
}

 

​​​​​​​

字符串处理函数及其应用

#include<stdio.h>
#include<string.h>
int main(void)
{
char str1[10] ="Zhong Guo";  //定义两个元素值一样的一维字符数组。
char str2[10] ="Zhong Guo";
int i=0;
while(str1[i] ='\0')  //用循环遍历每一个字符。
{
if(str1[i]>='A'&&str1[i]<='Z')  //是大写字母就变成小写字母。
str1[i]=str1[i]+32;
i++;
}
puts(str1);        //输出str1。
puts(strlwr(str2));  //用strlwr把str2转换后,输出其结果。
return 0;
} 

从键盘输入5个人的姓名并存入一个二维字符数组中,并输出出来。

#include<stdio.h>
#include<string.h>
int main(void)
{
char str[5][20]; 
int i;
printf("请输入五个同学的名字:\n");
for(i=0;i<5;i++)
    gets(str[i]);
printf("五个同学的名字分别是:\n");
for(i=0;i<5;i++)
    puts(str[i]);  
return 0; 

} 

 编程输入某班同学的姓名以及C_language、higher_mathematics两门课的成绩,并按各学生总分从高到低进行排序后输出。

#include<stdio.h>
#include<string.h>
int main(void)
{
char str[5][20];
int a[5];
int b[5];
int i,j;
int temp_a,temp_b;
char str_c[20];
printf("请输入五个同学的名字,C语言和高数的成绩:\n");
for(i=0;i<5;i++)
    gets(str[i]);
for(i=0;i<5;i++)   
    scanf("%d%d",&a[i],&b[i]); 
for(j=1;j<5;j++) 
   for(i=0;i<5-j;i++)
   { if(a[i]+b[i]<a[i+1]+b[i+1])
      {
      	temp_a=a[i];
      	a[i]=a[i+1];
      	a[i+1]=temp_a;
      	temp_a=b[i];
      	b[i]=b[i+1];
      	b[i+1]=temp_b;
      	strcpy(str_c,str[i]);
      	strcpy(str[i],str[i+1]);
      	strcpy(str[i+1],str_c);
	  }
   	
   }
for(i=0;i<5;i++)
    printf("名字:%s  C语言成绩:%d  高数成绩:%d\n",str[i],a[i],b[i]); 
return 0; 

} 

 

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卿云阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值