day06

一.练习:

使用循环来解决鸡兔同笼问题:

今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?

#include<myhead.h>

int main(int argc, const char *argv[]) {

//定义两个变量分别存储鸡和兔子的个数 i

nt x = 0; //表示鸡的个数 int y = 0;

//表示兔子的个数

//遍历所有鸡的可能

for(x=0; x<=35; x++) {

//遍历兔子的可能

for(y=0; y<94/4; y++) {

//遍历条件

if(x+y==35 && x*2+y*4==94) {

//输出当前可能的情况

printf("x = %d, y = %d\n", x, y);

}

}

}

return 0;

}

二、数组概述

2.1 引入目的

对于之前所学习的内容,都是对单个数据进行操作,只需要定义单个变量,然后对该变量进行处理即可。

但是,如果对于庞大的数据而言,需要定义很多变量来解决,为了批量处理数据,我们引入了数组

所谓数组,就是多个变量的集合。

2.2 数组的概念及定义

1> 定义:数组是连续存储多个相同数据类型的变量的集合,数组属于构造数据类型

2> 注意:

1、连续存储,说明这多个变量的地址是连续的 2、相同数据类型,说明同一个数组中的每个变量的数据类型都是一样的 3、变量的集合:说明数组定义时不能为空

3> 定义格式: 数据类型 数组名[常量];

1、数据类型:可以是基本数据类型,也可以是构造数据类型、指针类型或者空类型

2、数组名:标识符,要符合标识符的命名规则 1) 只能由字母、数字、下划线组成 2) 不能以数字开头 3) 不能使用关键字 4) 严格区分大小写 5) 做到见名知意

3、中括号:表示这是数组的标识,正在定义一个数组

4、常量:表示定义的数组长度,或者说是定义的变量的个数 1) 不能为0 2) 不能为小数 3) 不能空着

5、举个例子: int score[40]; //上面的语句,定义了一个长度为40的整形数组,数组名为score //上面的语句,连续定义了40个整形变量 //这些变量分别是:score[0]、score[1]、score[2]、。。。、score[37]、score[38]、score[39] //定义数组时,中括号中的数字表示的是数组的长度 //使用数组元素时,中括号中的数字表示的是该变量在数组中的编号或者说是下标 //第几个变量和他的下标相差1,原因是,下标是从0开始,到数组长度-1 -----> [0,N-1] //数组下标的最小下界为0, 最大上界为 N-1,其余的下标,都属于数组下标越界 //一个长度为N的数组中,没有下标为N的数组元素

数组的定义

#include<myhead.h> int main(int argc, const char *argv[]) {

//定义一个长度为5的整形数组 int arr[5]; //数组元素分别是:arr[0]--arr[4]

//定义一个长度为10的字符数组 char brr[10];

//定义一个长度为100的数组,存储小数 double crr[100]; printf("arr[0] = %d, brr[0] = %c, crr[0] = %lf\n", \ arr[0], brr[0], crr[0]); return 0; }

4> 数组的初始化:所谓初始化,就是在给变量申请空间时,顺便给定初始值

初始化时,用一对花括号将元素的值包裹起来,多个值之间使用逗号隔开

对于数组的初始化而言,有三种方式

1、全部初始化:数组的长度为多少,就初始化几个元素的值 int arr[5] = {520, 1415, 666, 999, 1234}; arr[0] arr[1] arr[2] arr[3] arr[4]

2、部分初始化:初始化元素的个数,小于数组的长度,此时,默认从前面元素进行初始化,没有初始化的元素用0补齐 int arr[5] = {520, 1415, 666}; 0 0 arr[0] arr[1] arr[2] arr[3] arr[4]

3、特殊初始化:在定义数组并初始化时,可以不用给定数组的长度,数组的长度由初始化元素个数而定 int arr[] = {520, 1415, 666, 999, 1234}; arr[0] arr[1] arr[2] arr[3] arr[4]

#include<myhead.h> int main(int argc, const char *argv[]) {

//定义一个长度为5的整形数组

int arr[5]; //数组元素分别是:arr[0]--arr[4]

//定义一个长度为10的字符数组

char brr[10];

//定义一个长度为100的数组,存储小数

double crr[100];

//如果对于数组,没有进行初始化的话,里面的元素值全部都是 //随机值

printf("arr[0] = %d, brr[0] = %c, crr[0] = %lf\n", \ arr[0], brr[0], crr[0]);

//定义数组并初始化

int drr[5] = {1,2,3,7,6}; //全部初始化

int err[5] = {520, 1314, 666}; //部分初始化

int frr[] = {1,3,5,7,9}; //特殊初始化

printf("sizeof(frr) = %ld\n", sizeof(frr)); //20

printf("len of frr = %ld\n", sizeof(frr)/sizeof(frr[0]));

return 0;

}

2.3 对数组元素的常规操作

1> 输入输出

所谓对数组进行输入输出,其实就是对任意一个元素进行重复性输入输出,重复性的动作我们使用循环解决

注意:C语言不允许对除字符数组外的其他数组整体进行输入输出,只能找到数组元素,对单个元素进行操作

2> 求和值、均值

所谓求和值,就是将所有任意值进行累加,需要定义一个变量存储总和,但是要求,在使用之前,必须清零

所谓均值,就是将数据总和除以总个数,均值不需要循环求

3> 求最值

套路:将数组中的第一个先设置成当前的最值,然后拿着当前的最值与数组中的任意一个元素进行比较,如果比较过程中,不满足条件,则更新最值,直到所有数据都跟最值比较一遍后,得到最值

4> 查找

存在性查找:当数组中出现要查找的数据时,立即结束本次查找

统计性查找:将数组全部元素进行遍历一遍,统计出要查找数据的个数

#include<myhead.h>
#define MAX 10            //宏定义一个常量

int main(int argc, const char *argv[])
{
    //定义一个数组,用于存储班级所有成员的成绩
    int score[MAX] = {0};     

    //完成对成员成绩的输入
    for(int i=0; i<MAX; i++)
    {
        //找到任意一个元素:score[i]
        printf("请输入第%d个学生的成绩:", i+1);
        scanf("%d", &score[i]);
    }

    //程序执行至此,表示数组元素全部赋值成功
    //输出数组元素
    printf("数组中的元素分别是:");
    for(int i=0; i<MAX; i++)
    {
        printf("%d\t", score[i]);
    }
    putchar(10);              //输出一个回车换行

    //求和值、均值
    int sum = 0;         //记录总和
    double avg = 0;      //记录平均值
    for(int i=0; i<MAX; i++)          //遍历数组中的所有元素
    {
        sum += score[i];         //讲任意一个数据进行累加
    }
    //程序执行至此,表示总和已经求出来
    avg = 1.0*sum/MAX;
    printf("总和为:%d, 平均值为:%.2lf\n", sum, avg);

    //求最值(以求最大值为例)
    int max = 0;             //存储数组的中最大值
    int maxi = 0;            //记录最大值所在的下标

    //先将数组中的第一个当做最值
    max = score[0];
    maxi = 0;                //记录当前最值所在的下标
    for(int i=0; i<MAX; i++)
    {
        //将当前的最值,与任意一个数据进行比较
        if(max < score[i])
        {
            max = score[i];           //更新最值中的数据
            maxi = i;                 //更新记录最值下标的变量
        }
    }
    //程序执行至此,表示最值以及最值的下标已经求出
    printf("当前数组的最大值为:%d, 在数组的第%d个位置\n", max, maxi+1);
    

    //查找
    int search = 0;
    int i = 0;            //用于遍历数组的循环变量
    printf("请输入您要查找的值:");
    scanf("%d", &search);
    //开始遍历数组,实现存在性查找
    for(i=0; i<MAX; i++)
    {
        //判断数据是否是要查找的数据
        if(search == score[i])
        {
            break;
        }
    }
    //判断是否查找到
    if(i==MAX)
    {
        printf("查找失败\n");
    }else
    {
        printf("您要查找的值,存在于数组中\n");
    }

    //遍历数组,完成统计性查找
    int count = 0;              //计数器
    for(int i=0; i<MAX; i++)
    {
        if(search == score[i])
        {
            count++;           //计数器自增
        }
    }
    //循环结束后,对计数器进行判断
    if(count == 0)
    {
        printf("查找失败\n");
    }else
    {
        printf("查找成功,您要找的值一共出现%d次\n", count);
    }
    


    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值