第三章 数组
3.1数组的概念
数组是若干个相同类型的变量在内存中有序存储的集合。一个数组中所有元素的类型是相同的,要么全是int,要么全是字符串
int a[10];
定义了一个整形的数组a,a是数组的名字,a数组中有10个元素,每个元素的类型是int,并且在内存中有序存储
这十个元素分别是a[0],a[1]……a[9],他们在内存中顺序存储,数组的下标从0开始。
3.2数组的分类
3.2.1按元素的类型分类
1、字符数组
数组中每个元素都是字符型的变量,例如:char s[10];
2、短整型数组
例如:short int a[10];对其中的变量赋值:a[8] = 4;
3、整形数组
例如:int a[10];
4、长整型数组
例如:long int a[5];
5、浮点型数组
例如:float f[5]; double d[6];
6、指针数组
例如:char* a[10]; int* b[2];
7、结构体数组
例如:struct stu boy[10]; 数组名是boy,每个元素都是struct stu类型的结构体变量。
3.2.2按维数分类
1、一维数组
例如 int a[10]; a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
2、二维数组
例如 int a[2][30];可看成有两行一维数组组成。类似于矩阵。
3、多维数组
例如 int a[4]a[2][10];可看成由两个二维数组组成。
3.3数组的定义
3.3.1一维数组的定义
格式:数据类型 数组名 [元素个数]
元素个数可以在定义数组的时候不给出,也可以根据初始化的元素个数来确定数组的大小
例如:int a[5]; char b[3];
#include <stdio.h>
int main()
{
int a[4];//整形int占用4个字节,故a数组占用的内存空间大小是16个字节
int b[] = { 1,4,6,8,2 };//b数组的元素个数是5,并且每个元素都是整形int,b数组占用的内存空间大小是20个字节
printf("sizeof(a) = %d\n", sizeof(a));
printf("sizeof(b) = %d\n", sizeof(b));
return 0;
}
3.3.2二维数组的定义
格式:数据类型 数组名 [行的个数][列的个数]
例如:int a[2][3];这里定义了一个2行3列的数组,共有6个元素,数组中每个元素都是int整形的,故占用的内存空间大小是24个字节。
按矩阵的方式:a[0][0],a[0][1],a[0][2]
a[1][0],a[1][1],a[1][2]
存储的顺序是先从左到右存储第一行,再跟着后面从左到右存储第二行,故a[1][0]跟在a[0][2]后面。
在定义时可以不给出行数,但必须给出列数,此时二维数组的大小根据初始化的行数来确定。
#include <stdio.h>
int main()
{
int a[3][4];//a数组是一个3行4列的二维数组,共有12个元素,每个元素都是int整形。
int b[][3] = { //数组是一个3列的二维数组,没有给出行数,由初始化的行数确定。
{1,2,3},
{2,3,},
{4,5,},
{7,8,9},
{1,5,8},
{2,4,6} //6行3列,也可以初始化一部分,但这一行只能从左往右按顺序初始化,不能中间少,{2, ,3}这样是错误的
};
printf("sizeof(a) = %d\n", sizeof(a));
printf("sizeof(b) = %d\n", sizeof(b));
return 0;
}
//sizeof(a) = 48
//sizeof(b) = 72
3.3.3多维数组的定义
int a[2][3][4];
int b[2][3][4]][5];……
3.4数组的初始化
在定义数组的同时给数组的元素赋值
3.4.1一维数组的初始化
1、全部初始化
int a[5] = {1,4,5,7,9};
2、部分初始化
int b[5] = {1,4,2};//只初始化了前面2个元素,后面的元素自动赋0。注意:不能中间的不赋值,即{1,4, ,2}这样是错误的
int main()
{
int a[5] = { 1,4,2 };
int i;
for (i = 0; i < 5; i++)
{
printf("a[%d] = %d,",i, a[i]);
}
return 0;
}
//a[0] = 1,a[1] = 4,a[2] = 2,a[3] = 0,a[4] = 0,
3.4.2二维数组的初始化
1、全部初始化
int a[2][3] = {{1,3,5},{2,4,6}};//内层大括号分别表示第一行的元素,第二行的元素,用逗号分隔
2、按行初始化
int a[2][3] = {{1,3},{2,4,6}};//没有初始化的元素自动赋0
#include <stdio.h>
int main()
{
int a[2][4] = { {1,4,2},{2,6} };
int i, j;
for(i = 0; i < 2; i++)
{
for (j = 0; j < 4; j++)
{
printf("a[%d][%d] = %d ", i, j, a[i][j]);
}
printf("\n");
}
return 0;
}
//a[0][0] = 1 a[0][1] = 4 a[0][2] = 2 a[0][3] = 0
//a[1][0] = 2 a[1][1] = 6 a[1][2] = 0 a[1][3] = 0
3、逐个初始化
int a[2][4] = {1,4,5,2,8,6,3,6};存放的顺序是按下标从小到大按顺序把元素排满第1行,再排满第二行。也可以只初始化一部分,但同样不能中间的不赋值就给后面的元素赋值。
int main()
{
int a[2][4] = { 1,4,5,2,8,6,3,6 };
int b[2][4] = { 1,4,2 };
int i, j;
for (i = 0; i < 2; i++)
{
for (j = 0; j < 4; j++)
{
printf("a[%d][%d] = %d ", i, j, a[i][j]);
}
printf("\n");
}
for (i = 0; i < 2; i++)
{
for (j = 0; j < 4; j++)
{
printf("b[%d][%d] = %d ", i, j, b[i][j]);
}
printf("\n");
}
return 0;
}
//a[0][0] = 1 a[0][1] = 4 a[0][2] = 5 a[0][3] = 2
//a[1][0] = 8 a[1][1] = 6 a[1][2] = 3 a[1][3] = 6
//b[0][0] = 1 b[0][1] = 4 b[0][2] = 2 b[0][3] = 0
//b[1][0] = 0 b[1][1] = 0 b[1][2] = 0 b[1][3] = 0
3.5数组元素的引用方法
3.5.1 一维数组元素的引用方法
数组名 [下标];
注意:下标表示元素在数组中的位置,下标是从0开始的,如果读取下标超出有效范围的,结果不可预知了,此时编译器会提示,但不会报错。
int main()
{
int a[5] = {0}, i;
for (i = 0; i < 7; i++)
{
printf("a[%d] = %d ", i, a[i]);
}
return 0;
}
//a[0] = 0 a[1] = 0 a[2] = 0 a[3] = 0 a[4] = 0 a[5] = -858993460 a[6] = 1755430365
3.5.2 二维数组元素的引用方法
数组名[行下标][列下标];
3.5.3 字符数组
1、一维
char c1[] = {'h',' ','l','l','o'};//5个元素,一个元素一个元素地初始化
char c2[] = "h llo";//6个元素,分别是h、 (空格)、l、l、o、\0(字符串结束标志)
可见:用字符串的方式赋值会比逐个赋值多占1个字节,在末尾处用于存放字符串结束标志\0,在这种情况下打印字符串不用考虑元素个数了,会自动停止打印。
printf("%s\n", c1); //h llo烫烫烫腆??鶝
没有自动停止打印,出现了错误的数据。
printf("%s\n", c2); //h llo
自动停止打印了。
int main()
{
char str[15];
printf("输入一个字符串:\n");
scanf_s("%s", str, 15);
printf("str:%s\n", str);
return 0;
}
2、二维
char c3[][5]={
{'a','b','c','d','e'},
{'f','g','h','i','j'}
};
char c4[][6]={"hello","world"};
第三章练习
1、任意给出一个年、月、日,判断是这一年的第几天
闰年算法:能被4整除且不能被100整除,或者能被400整除
例如:2012 5 10是这一年的第131天
#include<stdio.h>
int main()
{
char ping[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int i,year,month,day,sum = 0 ;
printf("请输入年 月 日,用空格隔开\n");
scanf_s("%d %d %d", &year, &month, &day);
for ( i = 0; i < month - 1; i++) //计算这月之前总天数
{
sum += ping[i];
}
if ((year % 4 == 0 && year % 100 != 0 || year % 400 == 0)&&(month > 2)) //判断这年是否是闰年,并且判断过没过2月份
{
sum += 1; //如果是,那么加1天
}
sum += day; //加上本月当前的天数
printf("%d年%d月%d日是这一年的第%d天\n", year, month, day, sum);
return 0;
}
2、打字游戏
(1)随机函数
srand((unsigned)time(NULL)); //以当前时间为准,设置随机种子,每次开始游戏后调用一次即可
ch = rand(); //rand()函数每次调用一次,产生一个随机数字
(2)获得键值函数
ch = _getch();//无需按下回车,可直接获得键盘上按下的数值
(3)时间函数
start_time = time(NULL);
end_time = time(NULL);
(4)清空屏幕
system("cls");
#include<stdio.h>
#include<time.h>
#include<conio.h>
#include<random>
void help(void)
{
printf("\n*******************************************");
printf("\n*输入过程中无法退出!**********************");
printf("\n*请按所给的字母敲击键盘********************");
printf("\n*按任意键开始测试,按下首字母时开始计时!**");
printf("\n*输入出错以 _ 表示*************************");
printf("\n*******************************************\n\n");
}
int main()
{
char ch;
char str[51] = "";//产生50个测试用字母
int i;
int count = 0;
time_t start_time, end_time;
while (1)
{
system("cls"); //每次游戏启动前清空屏幕
help(); //打印帮助信息
ch = _getch(); //获取键盘按下的数值,
srand((unsigned int)time(NULL)); //产生一个种子
for (i = 0; i < 50; i++)
{
str[i] = rand() % 26 + 'a'; //rand 产生的随机数对26取余,会得到一个0-25的随机数,加上'a'的ASCII码,就可以得到26个英文字母
}
str[50] = '\0'; //最后一位补字符串结束标志\0,自动停止打印
printf("%s\n", str); //打印测试用字符串
count = 0; //计数器清零
for (i = 0; i < 50; i++) //每次输入一个字符,立即与对应的测试字符比对,如果正确则打印出来,如果错误则打印_
{
ch = _getch();
if (i == 0)
{
start_time = time(NULL);
}
if (ch == str[i]) //如果正确,则计数器自增1,并打印对应的字符
{
count++;
printf("%c", ch);
}
else //如果错误,直接打印下划线_
{
printf("_");
}
}
end_time = time(NULL);
printf("\n\n");
printf("正确的个数为:%d个\n", count);
printf("正确率:%d %c\n", count * 100 / 50,'%');
printf("总计用时:%lld秒\n", (long int) end_time - start_time);
while (1) //结束后执行如下死循环,循环比对键盘输入的字符
{
ch = _getch();
if (ch == ' ') //如果按下空格键,则继续游戏,即返回主循环
{
break;
}
else if (ch == 27)// 如果按下了ESC键(对应的ASCII码是27),则退出游戏
{
return 0; //结束return 0 所在的函数,即主函数
}
}
}
return 0;
}
本文详细介绍了C语言中的数组,包括数组的概念、分类、定义、初始化和元素引用方法。内容涵盖一维、二维和多维数组,以及数组初始化的各种方式。通过实例解析了数组元素的引用,并提供了数组应用的实践练习。
6874

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



