day10 数组

概述

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;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值