一维数组
认识一维数组
- 多个普通变量的集合,并且这些变量的名字是有规律,内存是连续的
- 不存在数组下标 = 数组长度
- 数组计数从0开始
- 数组最大下标是数组长度减1
- 数组名的含义:整个数组的首地址
数组的创建与自动初始化
//数组的创建
//类型 数组名 [数组长度]
int iArr[5];
float fArr[8];
char cArr[3];
//数组初始化
//全部初始化
int iArr[5] = {1,3,4,5,6};
//部分初始化
int iArr[5] = {1,3,6}; //没有初始化的部分默认为0
//缺省数组长度,数组根据数组元素自动推断
int iArr[] = {1,3,6,5,2,8,9};
//别致的写法
int array['B']; //等效 int array[66]
//错误写法一
int iArr[5];
iArr[5] = {1,3,4,5,6};
//错误写法二
int iArr[] = {};
//错误写法三
iArr[5] = {1,3,4,5,6,4,6}; //数组元素不能大于数组长度
数组的创建与手动初始化
int iArr[3]={0};
for(int i=0;i<3;i++)
{
scanf("%d",&iArr[i]);
//i=0 scanf("%d",&iArr[0])
//i=1 scanf("%d",&iArr[1])
//i=2 scanf("%d",&iArr[2])
}
//错误写法
int size=0;
scanf("%d",&size);
int array[size]; //数组长度必须是常量
数组的遍历(打印数组)
int iArr[3]={1,2,3};
for(int i=0;i<3;i++)
{
printf("%d\t",iArr[i]);
}
字符数组
字符数组创建与初始化
-
普通字符数组与数字类数组没啥区别
char cArr[3]={'A','B','C','D'}; //只有在创建数组的时候初始化 //错误写法 cArr[3]={'A','B','C'}; //输入 for(int i=0;i<3;i++) { //scanf_s("%c",&cArr[i]) scanf_s("%c",&cArr[i],1); } //输出 for(int i=0;i<3;i++) { putchar(cArr[i]); //printf("%c",cArr[i]); }
字符串数组
- 字符串结束标记 :‘\0’
- 字符串的专有格式空字符: %s
- %s工作机制: 从一个地址开始 访问到\0 结束 %s对应的是一个地址
char cArr[3]={'A','B','\0'}; //字符串
char cArr[3]="AB"; //等效 char cArr[3]={"AB"};
字符串注意事项
-
%s 的方式只能打印字符串,不能打印字符数组,如果缺少’\0’ 将会打印乱码
-
为了有效避免忘记加’\0’ 养成用空的字符串初始化一个字符数组,如
char str[20]=""; // char str[]=""; 错误写法
-
字符串输入 scanf 遇到空格时候会截取当前字符,结束输入,
-
也就是 带有空格的字符串输入要采用字符串处理函数: gets做输入,在其他编译中直接gets ,在vs中用的是:get_s(地址,长度); 与之对应的打印函数是:put_s(要打印的数组名);
-
字符和字符串输入前,需要清空缓冲区
数组的常规操作
数字类型的数组
-
数据处理
-
充当计数器
//统计数组元素出现的次数 int num[] = { 1,2,3,4,2,3,1,2,4,5,6,5,4,5,7,6,7,8,8,9,7,9 }; int nCount[10] = { 0 }; for (int i = 0; i < 22; i++) { nCount[num[i]]++; } for (int i = 0; i < 10; i++) { if (nCount[i] != 0) { printf("%d 出现了 %d\n", i, nCount[i]); } }
- 数组求和
int iArr[3] = { 1, 2, 3 }; int sum = 0; for (int i = 0; i < 3; i++) { sum += iArr[i]; } printf("sum = %d\n", sum);
-
数组有序插入
printf("请输入:"); scanf_s("%d", &temp); data[curSize++] = temp; for (int i = curSize - 1; i > 0; i--) { if (data[i] < data[i - 1]) { int temp = data[i]; data[i] = data[i - 1]; data[i - 1] = temp; } }
-
数组元素删除
printf("输入要删除的数据:"); scanf_s("%d", &temp); for (int i = 0; i < curSize; i++) { if (temp == data[i]) { //printf("%d\t", i); pos = i; break; } } //所有数组的删除都是伪删除,数组内存是栈区内存 for (int i = pos; i < curSize; i++) { //移位操作 data[i] = data[i + 1]; } break;
-
数组 元素查找
//查找 printf("输入要查找找的数据:"); scanf_s("%d", &temp); for (int i = 0; i < curSize; i++) { if (temp == data[i]) { printf("%d\t", i); } } printf("\n");
-
数组元素更改
//修改 printf("输入要修改的数据:"); scanf_s("%d", &temp); for (int i = 0; i < curSize; i++) { if (temp == data[i]) { //printf("%d\t", i); pos = i; break; } } //修改匹配到的数据 printf("请输入新的数据:"); scanf_s("%d",&temp); data[pos] = temp; printf("修改成功!\n");
-
打印所有数组元素
for (int i = 0; i < curSize; i++) { printf("%d\t", data[i]); } printf("\n");
-
一维数组冒泡排序
//冒泡排序 int iArr[] = { 12,23,45,14,67,87,38,57,83,10 }; int size = 10; for (int i = 0; i < size - 1; i++) //控制元素从第几个开始冒泡 { for (int j = 0; j < size - 1 - i; j++) //描述比较 { //小----->大 if (iArr[j] > iArr[j+1]) { int temp = iArr[j]; iArr[j] = iArr[j + 1]; iArr[j + 1] = temp; } } } //打印数组 for (int i = 0; i < size; i++) { printf("%d\t", iArr[i]); } printf("\n");
字符类型的数组
- 处理字符
- 字符串处理
//数组计数功能功能
char cStr[100] = "";
gets_s(cStr, 100);
//求输入的字符串的长度 可见长度
int i = 0;
while (cStr[i] != '\0')
i++;
printf("数组的长度是:%d", i);
//统计输入的字符串中的字母,数字,其他符号的个数
i = 0;
int count[3] = {0};
while (cStr[i] != '\0')
{
if (cStr[i] >= 'A' && cStr[i] <= 'Z')
count[0]++;
else if (cStr[i] >= 'a' && cStr[i] <= 'z')
count[0]++;
else if (cStr[i] >= '0' && cStr[i] <= '9')
count[1]++;
else
count[2]++;
i++;
}
printf("字母:%d,数字:%d,其他字符:%d\n", count[0], count[1], count[2]);