Day06 数组
一、数组的定义
1、数组的定义和使用
格式:
数据类型 数组名[元素个数]
例子:int scores[10]; //scores[0]-scores[9]
scores[0] = 10; //赋值操作
int scores[10] = {99,66,51,516,15,3151,31,31,52,85}; //赋值操作
int scores[10] = {99,66,51}; //赋值时括号中一次为数组前面的元素赋值,如果数组长度超过元素个数,后面的值全部初始化为0
int scores[] = {99,66,51}; //数组长度为3
数组下标越界:超出了数组元素个数的下标,如果操作越界数据会出现程序错误 1、乱码结果 2、报错
2、求出数组元素个数:
两种方法
1、int len = sizeof(数组名)/sizeof(数据类型);
int len = sizeof(scores)/sizeof(int);
2、int len = sizeof(数组名)/sizeof(元素);
int len = sizeof(scores)/sizeof(scores[0]);
3、求出数组地址:
printf("%p\n",&scores[0]); //%p打印变量的内存地址,以无符号16进制格式打印,打印前需要在变量前加取地址符号【&】
printf("%p\n",&scores);
二、二维数组
1、二维数组初始化
int arr[2][3] = {{1,2,3},{2,3,4}};
int arr[][3] = {{1,2,3},{2,3,4},{3,4,5}};
int arr[4][3] = {1,2,3,4,5,6,7,8,9,10};
int arr[4][3] = {{1},{1},{1}};
int arr[4][3] = {1,2,3,4};
2、二维数组内存模型
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
int arr[3][3];
printf("二维数组的长度:%d\n", sizeof(arr));
printf("二维数组中一行的长度:%d\n", sizeof(arr[0]));
printf("行数:%d\n", sizeof(arr)/sizeof(arr[0]));
printf("列数:%d\n", sizeof(arr[0])/sizeof(arr[0][0]));
//二维数组的内存模型
printf("二维数组的内存首地址:%p\n",arr);
printf("二维数组的内存首行地址:%p\n",arr[0]);
printf("二维数组的内存第二行行地址:%p\n",arr[1]);
printf("二维数组的内存首个元素地址:%p\n",&arr[0][0]);
printf("二维数组的内存首行第二个元素地址:%p\n",&arr[0][1]);
printf("二维数组的内存首行第三个元素地址:%p\n",&arr[0][2]);
printf("二维数组的内存第二行第一个元素地址:%p\n",&arr[1][0]);
printf("二维数组的内存第二行第二个元素地址:%p\n",&arr[1][1]);
return 0;
}
三、多维数组
三维数组例子:
int arr[2][3][4] = {
{
{1,2,3,4},
{2,3,4,5},
{3,4,5,6}
}
{
{4,5,6,7},
{5,6,7,8},
{6,7,8,9}
}
}
四、字符数组
1、字符数组
char arr_1[10] = { 'H','e','l','l','o' };
char arr_2[] = { 'H','e','l','l','o' };
char arr_3[] = "hello";
char arr_4[100];
scanf("%[^\n]", arr); //碰到换行结束
//%s会接收字符串结束标志【'\0'】之前的所有字符 在ASCII中就是数字0
printf("%s", arr);
//for (int i = 0; i < 10; i++)
//{
// printf("%c", arr[i]);
//}
//printf("%d\n", sizeof(arr));
2、字符串追加
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
char arr1[6];
char arr2[6];
char arrBuf[11];
scanf("%[^\n]", arr1);
getchar();
scanf("%[^\n]", arr2);
//printf("%s", arr1);
//printf("%s", arr2);
int index = 0;
while (arr1[index] != '\0')
{
arrBuf[index] = arr1[index];
index++;
}
while (arr2[index - 5] != '\0')
{
arrBuf[index] = arr2[index - 5];
index++;
}
arrBuf[index] = '\0';
printf("%s", arrBuf);
return 0;
}
、案例
1、案例一:十只小猪称体重
//定义一个数组,存储小猪体重,通过遍历找到最重的小猪
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
int max = 0, j = 0;
int fits[10];
printf("请输入十只小猪的体重:\n");
for (int i = 0; i < 10; i++)
{
scanf("%d",&fits[i]);
if (max < fits[i])
{
max = fits[i];
j = i + 1;
}
}
printf("第%d个小猪最重,体重为:%dKg\n", j, max);
return 0;
}
2、案例二:冒泡排序
//
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int nums[] = { 1,5,9,6,7,8,4,3,2,0,98,56,12};
int len = sizeof(nums) / sizeof(nums[0]);
//打印原来顺序的数字
for (int i = 0; i < len; i++)
{
printf("%d\t", nums[i]);
}
printf("\n");
//外层循环每次执行都能确定一个最大值
for (int i = len; i > 1; i--)
{
for (int j = 0; j < i-1; j++) //每次排序需要比较的次数
{
if (nums[j] > nums[j + 1]) //前后两个数字进行比较,较大的放在后面
{
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
//打印排好顺序的数字
for (int i = 0; i < len; i++)
{
printf("%d\t", nums[i]);
}
return 0;
}
3、案例三:10名学生,三门成绩,scores[10][3],求出每名学生的总成绩和平均成绩,求出班级的语文 数学 英语的平均成绩。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
int stu[10][2] = {0};
int scores[10][3] = {0};
int scores_[3][2] = {0};
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 3; j++)
{
if (j == 0)
{
printf("请输入第%d个同学的语文成绩\t",i);
scanf("%d", &scores[i][j]);
}
if (j == 1)
{
printf("请输入第%d个同学的数学成绩\t", i);
scanf("%d", &scores[i][j]);
}
if (j == 2)
{
printf("请输入第%d个同学的英语成绩\t", i);
scanf("%d", &scores[i][j]);
}
}
}
//求出每名学生的总成绩和平均成绩
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 3; j++)
{
stu[i][0] += scores[i][j]; //求出每名同学的总成绩 stu[i][0]
}
stu[i][1] = stu[i][0] / 3; //求出每名同学的平均成绩 stu[i][1]
}
//求出班级的语文 数学 英语的平均成绩
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 10; j++)
{
scores_[i][0] += scores[i][j]; //求出每门课程的总成绩 scores_[i][0]
}
scores_[i][1] = scores_[i][0] / 10; //求出每门课程的平均成绩 scores_[i][1]
}
//打印每名同学的总成绩和平均成绩
for (int i = 0; i < 10; i++)
{
printf("第%d名同学的总成绩为%d\n", i, stu[i][0]);
printf("第%d名同学的平均成绩为%d\n", i, stu[i][1]);
}
//打印每门课的总成绩和平均成绩
printf("该班级语文总成绩为:%d\n", scores_[0][0]);
printf("该班级语文平均成绩为:%d\n", scores_[0][1]);
printf("该班级数学总成绩为:%d\n", scores_[1][0]);
printf("该班级数学平均成绩为:%d\n", scores_[1][1]);
printf("该班级英语总成绩为:%d\n", scores_[2][0]);
printf("该班级英语平均成绩为:%d\n", scores_[2][1]);
}
4、案例四:双色球
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
int main()
{
//双色球规则,红球加蓝球(6+1) 红球1-33 蓝球1-16
//红球不能重复,蓝球可以和红球重复
//红球
int r_balls[6];
srand((unsigned int)time(NULL));
for (int i = 0; i < 6; i++)
{
r_balls[i] = rand() % 33 + 1;
//去重
for (int j = 0; j < i; j++)
{
if (r_balls[j] == r_balls[i])
{
i--;
continue;
}
}
}
//红球排序
for (int i = 6; i > 1; i--)
{
for (int j = 0; j < i - 1; j++) //每次排序需要比较的次数
{
if (r_balls[j] > r_balls[j + 1]) //前后两个数字进行比较,较大的放在后面
{
int temp = r_balls[j];
r_balls[j] = r_balls[j + 1];
r_balls[j + 1] = temp;
}
}
}
//打印双色球
for (int i = 0; i < 6; i++)
{
printf("%d ", r_balls[i]);
}
printf(" + %d", rand() % 16 + 1);
return 0;
}