🌞欢迎来到C语言的世界
🌈博客主页:卿云阁💌欢迎关注🎉点赞👍收藏⭐️留言📝
🌟本文由卿云阁原创!
🌠本阶段属于锻体阶段,希望各位仙友顺利完成突破
📆首发时间:🌹2021年1月19日🌹
✉️希望可以和大家一起完成进阶之路!
🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!
目录
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的矩阵,m和n由键盘输入,要求编程给每一个变量赋值并找出其中的最大值,并输出最大值以及其所在的行号和列号。
#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; }