数组
数组就是存储一批同类型数据的地方
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;
}