数组
概念和定义
数组是连续存储多个相同数据类型的变量的集合,数组属于构造数据类型。
连续存储,说明这多个变量的地址是连续的
相同数据类型,说明同一个数组中的每个变量的数据类型都是一样的
变量的集合:说明数组定义时不能为空
定义格式: 数据类型 数组名[常量]
int arr[5]
1、数据类型:可以是基本数据类型,也可以是构造数据类型、指针类型或者空类型
2、数组名:标识符,要符合标识符的命名规则
1) 只能由字母、数字、下划线组成
2) 不能以数字开头
3) 不能使用关键字
4) 严格区分大小写
5) 做到见名知意
3、中括号:表示这是数组的标识,正在定义一个数组
4、常量:表示定义的数组长度,或者说是定义的变量的个数
1)不能为0
2) 不能为小数
3) 不能空着
一个长度为N的数组中,没有下标为N的数组元素
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
int arr[5]={1,2,3,4,5};
int brr[5]={1,2,3};
int crr[]={1,2,3,4,5};
printf("%d %d %d\n",arr[0],brr[0],crr[0]);
printf("len of crr=%ld\n",sizeof(crr)/sizeof(crr[0]));
return 0;
}
数组的初始化
1、全部初始化:数组的长度为多少,就初始化几个元素的值
int arr[5] = {520, 1415, 666, 999, 1234}; arr[0] arr[1] arr[2] arr[3] arr[4]
2、部分初始化:初始化元素的个数,小于数组的长度,此时,默认从前面元素进行初始化,没有初始化的元素用0补齐
int arr[5] = {520, 1415, 666}; 0 0 arr[0] arr[1] arr[2] arr[3] arr[4]
3、特殊初始化:在定义数组并初始化时,可以不用给定数组的长度,数组的长度由初始化元素个数而定
int arr[] = {520, 1415, 666, 999, 1234}; arr[0] arr[1] arr[2] arr[3] arr[4]
对数组元素的常规操作
1. 输入输出
所谓对数组进行输入输出,其实就是对任意一个元素进行重复性输入输出,重复性的动作我们使用循环解决
注意:C语言不允许对除字符数组外的其他数组整体进行输入输出,只能找到数组元素,对单个元素进行操作
2. 求和值、均值
所谓求和值,就是将所有任意值进行累加,需要定义一个变量存储总和,但是要求,在使用之前,必须清零
所谓均值,就是将数据总和除以总个数,均值不需要循环求
3. 求最值
套路:将数组中的第一个先设置成当前的最值,然后拿着当前的最值与数组中的任意一个元素进行比较,如果比较过程中,不满足条件,则更新最值,直到所有数据都跟最值比较一遍后,得到最值
4. 查找
存在性查找:当数组中出现要查找的数据时,立即结束本次查找
统计性查找:将数组全部元素进行遍历一遍,统计出要查找数据的个数
#include<stdio.h>
#define MAX 10 //宏定义一个常量
int main(int argc, const char *argv[])
{
//定义一个数组,用于存储班级所有成员的成绩
int score[MAX] = {0};
//完成对成员成绩的输入
for(int i=0; i<MAX; i++)
{
//找到任意一个元素:score[i]
printf("请输入第%d个学生的成绩:", i+1);
scanf("%d", &score[i]);
}
//程序执行至此,表示数组元素全部赋值成功
//输出数组元素
printf("数组中的元素分别是:");
for(int i=0; i<MAX; i++)
{
printf("%d\t", score[i]);
}
putchar(10); //输出一个回车换行
//求和值、均值
int sum = 0; //记录总和
double avg = 0; //记录平均值
for(int i=0; i<MAX; i++) //遍历数组中的所有元素
{
sum += score[i]; //讲任意一个数据进行累加
}
//程序执行至此,表示总和已经求出来
avg = 1.0*sum/MAX;
printf("总和为:%d, 平均值为:%.2lf\n", sum, avg);
//求最值(以求最大值为例)
int max = 0; //存储数组的中最大值
int maxi = 0; //记录最大值所在的下标
//先将数组中的第一个当做最值
max = score[0];
maxi = 0; //记录当前最值所在的下标
for(int i=0; i<MAX; i++)
{
//将当前的最值,与任意一个数据进行比较
if(max < score[i])
{
max = score[i]; //更新最值中的数据
maxi = i; //更新记录最值下标的变量
}
}
//程序执行至此,表示最值以及最值的下标已经求出
printf("当前数组的最大值为:%d, 在数组的第%d个位置\n", max, maxi+1);
//查找
int search = 0;
int i = 0; //用于遍历数组的循环变量
printf("请输入您要查找的值:");
scanf("%d", &search);
//开始遍历数组,实现存在性查找
for(i=0; i<MAX; i++)
{
//判断数据是否是要查找的数据
if(search == score[i])
{
break;
}
}
//判断是否查找到
if(i==MAX)
{
printf("查找失败\n");
}
else
{
printf("您要查找的值,存在于数组中\n");
}
//遍历数组,完成统计性查找
int count = 0; //计数器
for(int i=0; i<MAX; i++)
{
if(search == score[i])
{
count++; //计数器自增
}
}
//循环结束后,对计数器进行判断
if(count == 0)
{
printf("查找失败\n");
}
else
{
printf("查找成功,您要找的值一共出现%d次\n", count);
}
return 0;
}
5.冒泡排序
//冒泡排序
for(int i=0;i<MAX;i++)
{
for(int j=0;j<MAX-i;j++)
{
if(score[j]>score[j+1])
{
int temp=score[j];
score[j]=score[j+1];
score[j+1]=temp;
}
}
}
printf("结果为");
for(int i=0;i<MAX;i++)
{
printf("%d\t",score[i]);
}
putchar(10);
6. 选择排序
//选择排序
int maxj=0;
for(int i=0;i<MAX;i++)
{
maxj=i;
for(int j=i+1;j<MAX;j++)
{
if(score[maxj]<score[j])
{
maxj=j;
}
}
if(maxj!=i)
{
int temp=score[i];
score[i]=score[maxj];
score[maxj]=temp;
}
}
printf("结果为");
for(int i=0;i<MAX;i++)
{
printf("%d\t",score[i]);
}
putchar(10);
二维数组
引入目的
1.需要定义大量一维数组是可以用二维数组代替
2.是多个一维数组的组合
3.二维数组也是变量的集合,是一个有行有列的容器
1、数组名[行标]:表示下标为"行号"的那个一维数组的数组名
2、数组名[行标][列标]:表示下标为 [行标][列标] 的一个变量
举个例子: int arr[3][4]; //该语句定义了一个3*4的二维数组,也可以理解成 定义了3个长度为4的一维数组
arr[0]: 表示第一个一维数组的数组名
arr[1]: 表示第二个一维数组的数组名
arr[2]: 表示第三个一维数组的数组名
arr[0][0]: 表示第一行第一列的一个变量
3、定义数组时,中括号中的数字表示定义二维数组的行数和列数,而使用数组元素时,中括号中的数字表示的是坐标
4、无论是行标还是列表,都是从0开始,到对应数据减1的位置 例如:int arr[M][N]; 行标范围:【0,M-1】 列标范围:【0,N-1】
二维数组的常规操作
1.输入输出
#include<stdio.h>
#define N 3
#define M 4
int main(int argc, char const *argv[])
{
int arr[N][M]={0};
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
printf("输入第%d行第%d列的数字\n",i+1,j+1);
scanf("%d",&arr[i][j]);
}
putchar(10);
}
printf("数组元素分别是:\n");
for(int i=0; i<N; i++)
{
for(int j=0; j<M; j++)
{
printf("%d\t", arr[i][j]);
}
printf("\n");
}
2.求数组中的最大值
int max=arr[0][0];
int maxi=0;
int maxj=0;
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
if(max<arr[i][j])
{
maxi=i;
maxj=j;
max=arr[maxi][maxj];
}
}
}
printf("最大值为:%d",max);
putchar(10);
3.求某行的最大值
for(int i=0;i<N;i++)
{
max=arr[i][0];
for(int j=0;j<M;j++)
{
if(max<arr[i][j])
{
max=arr[i][j];
}
}
printf("第%d行的最大值为%d\n",i+1,max);
}
4.二维数组转置
int brr[M][N]={0};
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
brr[j][i]=arr[i][j];
}
}
printf("二维数组转置后的结果\n");
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
{
printf("%d\t",brr[i][j]);
}
putchar(10);
}
经典练习题:杨辉三角
include<stdio.h>
#define max 10
int main(int argc, char const *argv[])
{
int h=0;
int arr[max][max]={0};
printf("输入阶数");
scanf("%d",&h);
for(int i=0;i<h;i++)
{
for(int j=0;j<=i;j++)
{
if(j==0||j==i)
{
arr[i][j]=1;
}
else{
arr[i][j]=arr[i-1][j-1]+arr[i-1][j];
}
}
}
printf("%d阶杨辉三角如下:\n", h);
for(int i=0; i<h; i++)
{
for(int j=0; j<=i; j++)
{
printf("%d\t", arr[i][j]);
}
printf("\n");
}
return 0;
}
一维字符数组
一维字符数组初始化
1、单字符处理字符数组
全部初始化:char arr[5] = {'h', 'e', 'l', 'l', 'o'};
部分初始化:char arr[5] = {'h', 'e', 'l'}; //没有初始化的部分用 0('\0') 补齐
特殊初始化:char arr[] = {'h', 'e', 'l', 'l', 'o'}; //此时字符数组的长度为 5
2、字符串的形式初始化
整体初始化:char arr[10] = {"hello"}; //或者 char arr[6] = "hello";
特殊字符串初始化: char arr[] = "ni hao"; //此时,数组的实际长度7 但是,字符串实际长度为6
字符数组的输入输出
字符串的输入输出:需要将字符数组看成一个整体,不需要使用循环完成
对于字符串的输入输出,有两组函数可供使用 格式化输入输出:printf、scanf
使用的格式控制符为:%s 专门针对于字符串的输入输出函数:puts、gets
字符串的求长度
#include<stdio.h>
#include<string.h>
int main(int argc, char const *argv[])
{
//定义两个字符数组初始化字符串
char str1[20] = "hello world";
char str2[] = "I Love China";
//测试strlen
int len = strlen(str2); //求字符串2的实际长度
printf("len = %d\n", len); //12
int size = sizeof(str2); //求字符串所占字符数组的长度
printf("size = %d\n", size); //13
size = sizeof(str1); //求字符数组1的大小
printf("size = %d\n", size); //20
比较两个字符串的大小
if(strcmp(str1, str2) >0)
{
printf("%s大\n", str1);
}else if(strcmp(str1, str2) < 0)
{
printf("%s小\n", str1);
}else
{
printf("一样大\n");
}
字符串的赋值
strcpy(str1, str2); // str1 = str2
printf("拷贝后:str1 = %s, str2 = %s\n", str1, str2);
字符串的连接
strcat(str1, str2);
printf("连接后:str1 = %s, str2 = %s\n", str1, str2);
习题
1、提示并输入一个字符串,统计该字符串中字母、数字、空格以及其他字符的个数
#include<stdio.h>
#include<string.h>
int main(int argc, char const *argv[])
{
char arr[10];
int z=0,s=0,k=0,q=0;
printf("输入字符串\n");
gets(arr);
int l=strlen(arr);
for(int i=0;i<=l;i++)
{
if(arr[i]>='A'&&arr[i]<='z')
{
z++;
}
else if(arr[i]>='0'&&arr[i]<='9')
{
s++;
}
else if(arr[i]=' ')
{
k++;
}
else{
q++;
}
}
printf("字母%d个,数字%d个,空格%d个,其他%d个\n",z,s,k,q);
return 0;
}
2、提示并输入一个字符串,求出该字符串中所有数字的总和
#include<stdio.h>
#include<string.h>
#define max 10
int main(int argc, char const *argv[])
{
char arr[max];
int sum[max]={0};
int k=0,h=0;
printf("输入字符串\n");
gets(arr);
int l=strlen(arr);
for(int i=0;i<=l;i++)
{
if(arr[i]>='0'&&arr[i]<='9')
{
sum[i]=arr[i]-48;
}
}
for(int i=0; i<10; i++)
{
h+=sum[i];
}
printf("数字之和为%d\n",h);
return 0;
}
3定义一个4*3的二维整形数组,完成对二维数组的输入、输出。并将该二维数组中每一行的最值放入到一个一维数组中,并对该一维数组进行升序排序后输出。
#include<stdio.h>
#define N 3
#define M 4
int main(int argc, char const *argv[])
{
int arr[N][M]={0};
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
printf("输入第%d行第%d列的数字\n",i+1,j+1);
scanf("%d",&arr[i][j]);
}
putchar(10);
}
printf("数组元素分别是:\n");
for(int i=0; i<N; i++)
{
for(int j=0; j<M; j++)
{
printf("%d\t", arr[i][j]);
}
printf("\n");
}
int max=arr[0][0];
int maxi=0;
int maxj=0;
int k=0;
int brr[12]={0};
for(int i=0;i<N;i++)
{
max=arr[i][0];
for(int j=0;j<M;j++)
{
if(max<arr[i][j])
{
max=arr[i][j];
}
}
brr[i]=max;
printf("%d\t",brr[i]);
}
putchar(10);
for(int i=0;i<N;i++)
{
for(int j=0;j<N-i-1;j++)
{
if(brr[j]>brr[j+1])
{
int temp=brr[j];
brr[j]=brr[j+1];
brr[j+1]=temp;
}
}
}
printf("结果为");
for(int i=0;i<N;i++)
{
printf("%d\t",brr[i]);
}
putchar(10);
return 0;
}
4、提示并输入两个一维整形数组,求这两个数组的交集。
#include<stdio.h>
#define M 5
#define N 5
int main()
{
int arr[M]={0},brr[N]={0};
printf("请输入第一个数组");
for (int i = 0; i < M; i++)
{
scanf("%d",&arr[i]);
}
printf("请输入第二个数组");
for (int i = 0; i < N; i++)
{
scanf("%d",&brr[i]);
}
printf("两个数组交集为");
for (int i = 0; i < M; i++)
{
for (int j = 0; j< N; j++)
{
if (arr[i]==brr[j])
{
printf("%d ",arr[i]);
}
}
}
printf("\n");
return 0;
}
5,完成注册和登录功能,使用两个一维字符数组储存账号和密码
#include<stdio.h>
#include<string.h>
#include<stdio.h>
#include<string.h>
int main()
{
char arr[10]="";
char brr[10]="";
char crr[10]="";
char drr[10]="";
printf("注册\n");
printf("请输入你的账号\n");
gets(arr);
printf("请输入你的密码\n");
gets(brr);
printf("登录\n");
printf("请输入你的账号\n");
gets(crr);
printf("请输入你的密码\n");
gets(drr);
if (strcmp(arr,crr)==0&&strcmp(brr,drr)==0)
{
printf("登录成功\n");
}
else
{
printf("登录失败\n");
}
return 0;
}