数组20230707

数组

数组就是存储一批同类型数据的地方

1.数组的定义

类型 数组名【元素个数】

数组不能被动态定义,【】里只能是常量或常量表达式

int a[6];([]里是常量)

char b[24];

double c[3];

int a[3+3]; (常量表达式也可以)

上面几个类型,都占用了多少个字节的内存?

printf("%d\n", sizeof(a)); //计算数组占用的内存大小

整型四个字节 4 * 6 = 24

字符型一个字节 1 * 24 = 24

浮点型八个字节 8 * 3 = 24

2.访问数组中的元素

数组名[下标]

a[0]; //访问a数组中的第一个元素

b[1]; //访问b数组中的第二个元素

c[5]; //访问c数组中的第六个元素

注意:

int a[5]; //创建一个具有五个元素的数组

a[0]; //访问第一个元素的下标是0,不是1

a[5]; //报错,因为第五个元素的下标是a[4] (数组的越界)

3.循环和数组的关系

int a[10];

for (i = 0; i < 10; i ++)
{
	a[i] = i;
}

用数组存放班级里十名同学的成绩,并计算平均分

#include <stdio.h>
#define NUM 10 

int main()
{
	int s[NUM];
	int i, sum = 0;
	
	for(i = 0; i < 10; i ++)
	{
		printf("请输入第%d位同学的成绩:", i + 1);//i从0开始,同学从1开始
		scanf("%d", &s[i]);
		sum = sum + s[i];
	}
	printf("成绩录入完毕,该场次考试的平均分是:%.2lf\n"(double)sum / NUM);
	
	return 0;
}

4.数组的初始化

未被赋值的元素自动初始化为0: int a[10] = {0}; //其实只是给第一个数字赋值为0

若赋予不同的值,用逗号分隔开: int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};

可以只给一部分元素赋值,未被赋值的元素自动初始化为0: int a[10] = {1, 2, 3, 4, 5, 6, 7};

可以只给出各个元素的值,而不指定数组的长度(编译器会根据值的个数自动判断数组的长度):

(前提是给出了各个元素的值)

int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};

5.练习

1.用户是否可以直接自己输入字符串结束标志’\0’?

答:不可以!因为’\0’代表ASCII码为0的字符,它不是一个可以显示的字符,而是一个“
空操作符”,表示什么也不做。因此用它来作为字符串结束表示不会产生什么副作用。

2.C语言为什么不进行边界检查?

答:C语言追求的是“短小快”,C语言非常注重程序的速度,而增加边界检查会使速度相对变慢。

3.输入年份,打印该年每个月的天数

注:2 月份以外,除了 1、3、5、7、8、10 和 12 月份有 31 天,其它月份均是 30 天;闰年的 2 月份是 29 天,非闰年是 28 天。

#include <stdio.h>

int main()
{
        int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        int i, year;

        printf("请输入一个年份:");
        scanf("%d", &year);

        if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) //若这年是闰年
        {
                days[1] = 29;
        }

        for (i = 0; i < sizeof(days) / sizeof(days[0]); i++)// i < sizeof(days) / sizeof(days[0]) 表达数组的长度
        {
                printf("%2d月份:%d天\n", i+1, days[i]);
        }
		

        return 0;
}

4.生命计算器

要求用户输入生日,显示他在这个世界上活了多少天

#include <stdio.h>

int main()
{
    long count1 = 0, count2; // count用于存放一共活了多少天
    int year1, year2, year3; // year1是你的生日年份,year2是今天的年份
    int month1, month2, month3;
    int day1, day2, day3;
    int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    printf("请输入你的生日(如2004-03-27):");
    scanf("%d-%d-%d", &year1, &month1, &day1);

    printf("请输入今天的日期(如2023-05-26):");
    scanf("%d-%d-%d", &year2, &month2, &day2);

    year3 = year1 + 80;//?
    month3 = month1;
    day3 = day1;

    while (1)
    {
            days[1] = (year1 % 400 == 0 || (year1 % 4 == 0 && year1 % 100 != 0)) ? 29 : 28;//判断生日年二月的天数
            while (month1 <= 12)
            {
                    while (day1 <= days[month1 - 1])
                    {
                            if (year1 == year2 && month1 == month2 && day1 == day2)
                            {
                                    count2 = count1;
                                    printf("你在这个世界上总共生存了%d天\n", count2);
                            }

                            if (year1 == year3 && month1 == month3 && day1 == day3)
                            {
                                    printf("如果能活到80岁,你还剩下%d天\n", count1 - count2);
                          printf("你已经使用了%.2f%%的生命,请好好珍惜剩下的时间!\n", (double)count2 / count1 * 100);
                                    goto FINISH; //跳出多层循环才被迫用goto语句
                            }

                            day1++;
                            count1++;
                    }
                    day1 = 1;
                    month1++;
            }
            month1 = 1;
            year1++;
    }

FINISH: return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值