一、数组
1.数组的定义
数组是一个变量,由数据类型相同的的一组元素组成
变量 | 内存中的一块空间 |
---|---|
数组 | 内存中一串连续的空间 |
2.数据的结构和基本要素
标识符 | 数组的名称,用于区分不同的数组 |
---|---|
数组元素 | 向数组中存放的数据 |
元素下标 | 对数组元素进行编号 |
元素类型 | 数组元素的数据类型 |
数组中只有一个名称,即标识符(用来表示数组的变量名)
元素下标标明了元素在数组中的位置,从0开始
数组中的每个元素都可以通过下标来访问
数组长度固定不变,避免数组越界
二、一维数组
语法:datatype arrayName[size]
1.初始化一维数组
(1)//正确:后面的元素个数与声明一致
int years[3]={2012,2013,2014}
(2)//正确:后面一个元素未初始化,默认值为0
int years[3]={2012,2013}
(3)//正确:元素个数为2
int years[]={2012,2013,2014}
(4)//错误:未知元素个数
int years[]={}
2.一维数组的动态赋值
#include <stdio.h>
#define N 5//宏定义,在程序中N只能等于5
void main()
{
//动态录入
double score[N];
int i;//循环变量
for (i = 0; i < N; i++) {
printf("请输入第%d位同学的成绩:",i+1);//i从0开始
scanf("%lf",&score[i]);
}
//打印数组元素
for (i = 0; i < N; i++) {
printf("第%d位同学的成绩是:%.2lf\n",i+1,score[i]);
}
}
3.一个数列:8,4,2,1,23,344,12
(1)循环输出队列的值
(2)求数列中所有数值的和及平均值
(3)猜数游戏:从键盘中任意输入一个数据,判断数列中是否包含次数
#include <stdio.h>
void main()
{
int i;//循环变量
int sum;//定义和
double avg;//定义均值
int search;//定义需要查找的数字
//一个数列:8,4,2,1,23,344,12
int nums[7]={8,4,2,1,23,344,12};
//循环输出队列的值
printf("该数列的值为:\n");
for(i = 0; i < 7; i++){
printf("%d\t",nums[i]);
}
//求数列中所有数值的和及平均值
for(i = 0; i < 7; i++){
sum += nums[i];
}
avg = sum / 7.0;
printf("\n该数列的和为:%d,均值为:%.2lf",sum,avg);
//猜数游戏:从键盘中任意输入一个数据,判断数列中是否包含次数
printf("\n请输入要查找的数字:");
scanf("%d",&search);
for (i = 0; i < 7; i++) {
if(search ==nums [i])
{
printf("找到了相同的元素!");
break;
}
}
if(i == 7){
printf("没有这个数哦!");
}
}
4.循环输入5个整型数字,进行降序排列后输出结果(冒泡排序)(重点)
冒泡排序的基础原理:遍历和交换
(1)需要比较多轮(数组长度 - 1)轮
(2)每一轮比较的次数比上一轮 - 1次;第一轮比较(数组长度 - 1)次
#include <stdio.h>
#define N 5
void main()
{
int i, j;//定义循环变量
int temp; //用于交换的临时变量
int nums[N] = {16, 25, 9, 90, 23};
//外层循环控制轮数
for (i = 0; i < N - 1; i++)
{
//内层循环控制每轮的比较次数
for (j = 0; j < N - 1; j++)
{
if(nums[j] < nums[j + 1])
{
temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
printf("排序之后的顺序为:\n");
for (i = 0; i < N ; i++) {
printf("%d\t",nums[i]);
}
}
拓展:初始无序,逆序输出
第一个元素与最后一个元素交换;第二个元素与倒数第二个元素交换…
for (i = 0; i < N ; i++)
{
temp = nums[j];
nums[j] = nums[N - i - 1];
nums[N - i - 1] = temp;
}
5.数组元素的删除和插入
删除的逻辑:
- 查找要删除数字的下标
- 从下标开始,后面一个覆盖前面一个数字
- 数组的总长度-1
#include <stdio.h>
#define N 5 //常量的值不能改变,因此采用变量方式count
void main()
{
int count = 5;//表示数组元素的个数
double powers[] = {42322, 45771, 40907, 41234, 40767};
double deletePower;//用户要删除的战力值
int deleteIndex = -1;//要删除战力值的下标,给一个不可能的初值,为了判断是否找到
double insertPower;//插入的战力值
int i;//循环变量
printf("请输入要删除的战力值:");
scanf("%lf",&deletePower);
for(i = 0; i < count; i++)
{
if(deletePower == powers[i])
{
deleteIndex = i;//记录下当前的下标
break;//找到了要删除的战力值,直接跳出循环
}
}
//根据判断是否找到,执行后续的操作
if(-1 == deleteIndex)
{
printf("很遗憾,没有找到该战力值!\n");
} else{
for(i = deleteIndex; i < count - 1; i++)
{
powers[i] = powers[i + 1];
}
count--;//数组总长度-1
}
printf("删除后的结果为:\n");
for(i = 0; i < count; i++)
{
printf("%0.lf\t",powers[i]);
}
//删除之后进行插入
printf("请输入要插入的值:\n");
scanf("%lf",&insertPower);
powers[count] = insertPower;
//插入操作完毕后数组总长度要+1
count++;
printf("插入后的结果为:\n");
for(i = 0; i < count; i++)
{
printf("%0.lf\t",powers[i]);
}
//想让战力值有序操作可以进行冒泡排序
}