概述
1.在此之前,我们处理数据,都是少量的数据,只需要存储到单独定义的变量中即可。这种方式对于处理少量数据是没有问题的,但是对于比较庞大的数据,就力不从心了。此时我们可以引入数组来解决。
2. 数组定义:连续存储的多个相同数据类型的变量的集合
(1)连续存储:申请的变量,在内存中的内存地址是连续的
(2)相同数据类型:申请的多个变量,只能存储相同数据类型的值
(3)多个变量的集合:数组是变量的集合,跟数关系不大
3.数组能实现一条语句定义成百上千个变量,但是这些变量的类型是相同的
4.数组属性构造数据类型
5.数组的分类:一维数组、二维数组、多维数组
一维数组:使用一个下标表示的数组称为一维数组;
二维数组:使用两个下标表示的数组称为二维数组;
按照类型:整形数组、实型数组、字符数组、结构体数组、指针数组...
一维数组的定义及初始化(以整形数组为例)
1、数据类型:可以是基本数据类型,也可以是其他数据类型
2、数组名:是一个标识符,要满足标识符的命名规则
3、[ ] :中括号是数组的标识,标识定义的是数组
4、常量表达式:表示定义的变量的个数(数组的长度)
5、 arr[0]、arr[1]、arr[2]、arr[3]、arr[4]:称为数组的元素,就是该数组中的变量名
6、定义数组时,中括号中的数字表示数组的长度或定义变量的个数,而使用数组元素时,中括号中的数字表示的是该变量在数组中的编号
7、定义一个长度为N的数组,其元素的下标编号为 [0, N),元素的编号中没有N
8、arr表示数组名字,在数值上跟第一个变量的地址相等 arr <====> &arr[0]
9、当一个数组的大小一旦确定后,后期就不能更改了
10、不能企图使用数组名一次性操作整个数组,需要找到数组中的任意一个元素进行逐个操作
11、定义数组中括号内四不准:不为0、不为空、不为小数、不为变量
2.一维数组初始化:一维数组的初始化有三种方式
定义数组时,使用花括号包裹多个数据给数组初始化,多个数据之间使用逗号隔开
1、全部初始化:定义多少个变量,就初始化多个值
int arr[5] = {23,5,1,2,4}; //arr[0]=23、arr[1]=5、arr[2]=1、arr[3]=2、arr[4]=4
2、部分初始化:初始化元素的个数小于变量的个数,将初始化的值,先给前面的变量初始化,没有初始化的部分使用0补齐
int arr[5] = {23,5,1}; //arr[0]=23、arr[1]=5、arr[2]=1、arr[3]=0、arr[4]=0
3、特殊初始化:定义数组并初始化时,不给定数组的长度,由初始化元素的个数确定数组的长度
int arr[] = {23,5,1}; //arr[0]=23、arr[1]=5、arr[2]=1
一维数组的相关操作
输入输出操作
1. 对于数组而言,不能企图使用数组名来操作整个数组,需要找到数组中的元素,对元素进行相关操作
2.想要找到一维数组中的任意一个元素,需要将数组遍历一遍,其中 arr[i] 表示的就是任意一个元素
3. 对一维数组进行输入输出,需要使用循环来解决
一维数组求和、均值
1.求和:将所有的变量进行累加即可 -----> sum += arr[i]
2. 均值:在和值的基础上,除以元素的个数 ----> sum/n
3. 求和值时,需要使用循环来完成,但是,求均值时,不需要循环了
一维数组求最值
可以将容器中第一个元素设置成最值,向后逐一比较
一维数组的逆置
a[i]<==>a[n-1-i]:交换次数=n/2,只需遍历一半的数据
一维数组的查找
存在性查找:找到即输出
统计性查找:统计要查找数据出现的次数
存在性查找
int i =0; //循环初始值
for(i=0; i<8; i++) {
//判断查找的值是否存在
if(score[i] == value) {
printf("您要找的值,在该数组中的第%d个位置\n", i+1);
break;
统计性查找
int key = 0; //记录查找到的个数
for(int i=0; i<8; i++) { //判断查找的值是否存在
if(value == score[i]) {
key++;
}
}
//对查找的个数进行判断
if(key == 0) {
printf("查找失败\n");
}else { printf("您要查找的数据出现%d次\n", key);
1> 使用菜单框架完成:
功能1(信息录入):提示并输入学生的个数,并分别录入学生的成绩
功能2(信息输出):输出目前的所有学生的成绩
功能3(求最值):输出所有学生中的最高分和最低分
功能4(查找):提示并输入一个分数,查找该分数是否存在
功能5(及格率):输出学生的及格率(90分及以上及格)
功能6:将成绩进行逆序
功能7:添加一个学生分数到容器末尾
功能8:提示并输入一个位置,修改该位置上的数值(也是输入进来的)
功能9:给出一个位置,删除该位置上的数据 : 1,2,3,4,5 --> 删除第三个元素后 1,2,4,5
功能0:退出系统
2> 思维导图
#include <stdio.h>
int main(int argc, const char *argv[])
{
int select = 0;
int score[100];
int num=0;
while(1) { //死循环实现重复输入做一个菜单
printf(" 学生成绩管理系\n");
printf(" 1.信息录入\n");
printf(" 2.信息输出\n");
printf(" 3.求最值\n");
printf(" 4.查找系统\n");
printf(" 5.及格率\n");
printf(" 6.逆序排列\n");
printf(" 7.添加成绩\n");
printf(" 8.修改成绩\n");
printf(" 9.删除成绩\n");
printf(" 0.退出系统\n");
printf("请输入您需要的功能:");
scanf("%d",&select);
//对功能进行多支选择
switch(select){
case 1:{
//执行信息录入的相关逻辑
printf("请输入学生的数量:\n");
scanf("%d",&num);
for(int i=0;i<num;i++)
{
printf("请输入第%d个同学的成绩:",i+1);
//将输入的数据存储在数组中
scanf("%d",&score[i]);
}
}printf("操作成功\n");
break;
case 2:{
//执行信息输出的相关逻辑
for(int i=0;i<num;i++)
{
printf("%d\n",score[i]);
}
}
break;
case 3:{
//执行求最值的相关逻辑
int max=score[0];
int min=score[0];
for(int i=0;i<num;i++)
{
if(max<=score[i])
{
max=score[i];
//将最大值赋值给max
}
}printf("最大值是:%d\n",max);
for(int i=0;i<num;i++)
{
if(min>=score[i])
{
min=score[i];
}
}printf("最小值是:%d\n",min);
}
break;
case 4:{
//执行成绩查找的相关逻辑
int grade=0;
int i=0;
printf("请输入你要查找的成绩:\n");
scanf("%d",&grade);
//输入成绩
for(int i=0;i<num;i++)
{
if(score[i]==grade)
{
printf("存在\n");
break;
}
}
if(i==8)
{
printf("不存在\n");
}
}
break;
case 5:{
//输出学生的及格率(90分以上及格)
int count=0;
for(int i=0;i<num;i++)
{
if(score[i]>=90)
{
count++;
}
}
printf("及格率=%.2lf%%",count*1.0/num*100);
}
break;
case 6:{
//将数据进行逆序排列
int temp=0;
for(int i=0;i<num/2;i++)
{
//对称数字交换实现逆序
temp=score[i];
score[i]=score[num-1-i];
score[num-1-i]=temp;
}
for(int i=0;i<num;i++)
{
printf("%d\t",score[i]);
//输出逆序后的成绩
}
}
break;
case 7:{
//添加一个同学在容器末尾
int x;
printf("请输入你要添加同学的成绩:\n");
scanf("%d",&x);
score[num]=x;
num+=1;
}
case 8:{
// 修改数值
int g,b;
printf("请输入你想要修改的位置:\n");
scanf("%d",&g);
printf("请输入你想修改的数据:\n");
scanf("%d",&b);
score[g-1]=b;
}
break;
case 9:{
//输入一个位置删除该位置上的内容
int n,m;
printf("请输入你想删除的位置:\n");
scanf("%d",&n);
for(int i=n;i<num;i++)
{
score[i-1]=score[i];
}num-=num;
for(int i=0;i<num;i++)
{
printf("%d\t",score[i]);
}
}
break;
case 0:exit(0);//退出整个进程
default:printf("您输入的功能有误,请重新输入\n");
}
} return 0;
}

782

被折叠的 条评论
为什么被折叠?



