4. 数组
- 概念:数组是若干个相同类型的变量在内存中有序存储的集合。
- 数组的分类
- 按元素的类型分类
- 指针数组
- 普通类型的数组的定义(如果不给出元素个数,数组元素所占空间的大小取决于初始化数组的大小)
- 结构体数组
//-----------------------------------数组的定义-------------------
//数组类型 数组名 [数组的元素的个数]
int a[10];
a[0] = 1;
printf("数组中第一个数是%d", a[0]);
//-------第二种方法直接初始化数组元素----------------------------------
int a[] = {1,2,3,4};
//int a[10];
//a[0] = 1;
//使用sizeof方法来测这个类型所占空间大小,通过除以这个类型所占字节大小就可以求出元素个数
printf("数组中的元素个数%d", sizeof(a)/4);
printf("数组中第一个数是%d", a[0]);
-
-
- 字符数组(特殊之处:字符串就是一个字符数组)
- 两种方式
-
// -------------------------字符数组---------------------------
//对于着一串字符串的讲解:字符串本身是由若干个字符的集合,后面是\0结尾.注意这个\0也占一个字符
// char a[] = {'q', 'b', 'c', ' '}
//char a[] = "fjlsjflajf";
//printf("字符串a=%s", a);
//-----通过输入赋值给字符串数组--------------------
char str[15];
printf("input string:\n");
//这里为什么输入十四位呢,应为第十五位是\0
scanf_s("%s", &str,14);
printf("output:%s", str);
return 0;
-
- 按维数分类
- 一维数组
- 初始化: :和普通类型数组定义数组一样的,在初始化是,可以先空着元素可以先不写,但是只能是这一层的最后一个元素.
- 二维数组
- 初始化:(定义是最好一维和二维的元素个数都要给),在初始化是,可以先空着元素可以先不写,但是只能是这一层的最后一个元素.
//------------------------------二维数组的定义--------------------------------------
// 两种定义方式
//int a[2][5];
//二维数组定义时,可以不给出一维的个数,但必须给出二维数组的元素个数
int a[][5] = { {1,2,3,4,5},{11,22,33,44,55} };
for (size_t i = 0; i <2; i++)
{
for (size_t j = 0; j < 5; j++) {
printf("一维数组第%d层中的%d维数组是%d\n", i, j, a[i][j]);
}
}
-
-
- 多维数组
-
练习:使用数组来计算日期对应的天数
//-------------使用数组来计算日期对应的天数------------------------
int year, month, day;
int totalday =0;
int num[] = { 31,28,31,30,31,30,31,31,30,31,30};
printf("请输入您要查询的日期");
scanf_s("%d%d%d", &year, &month, &day);
//month-1,是因为月份为一月时,我们是不需要一月的,所以只有当二月是才会相加第一个月的天数
for (size_t i = 0; i < month-1 ; i++)
{
totalday += num[i];
}
totalday += day;
if (month >2 && (year %400 == 0 || year % 4 ==0 && year % 100 !=0))
{
totalday += 1;
}
printf("您查询的日期是今年的第%d天", totalday);
练习打字小游戏
代码中出现的新东西:
1. ch = _getch()方法 : 获取键值函数,无需回车就可获得并得到这个对应的字符
2. time_t时间类型
3. time(NULL)获取时间戳
4. srand(timeSize)随机数种子方法,参数如果是一样的后面rand方法生成的随机数都是相同的
5. rand方法产生的随机数余26得到的是0-25之间的数,加上字符a就可以得到26个字母
//---------------打字游戏------------------
char ch;
char str[51] = "";
//时间戳
time_t timeSize;
//第一个手敲开始时间错,time_t时间戳类型
time_t startTime;
//最后一个时间戳
time_t endTime;
//时间差
int startAndEnd =0;
//计算正确率
float correct;
//通过while方法来重复执行这个游戏可以重复的玩
while (1)
{
//清屏
system("cls");
app();
printf("按下任意键游戏开始\n");
//获取键值函数,无需回车就可获得并得到这个对应的字符
ch = _getch();
//printf("截停获得的数%c", ch);
//生成时间戳
timeSize = time(NULL);
//产生随机数的种子后面才能产生随机数,相同的参数得到的种子种子,随机数则相同
srand(timeSize);
for (size_t i = 0; i < 50; i++)
{
//rand方法产生的随机数余26得到的是0-25之间的数,加上字符a就可以得到26个字母
//先产生随机字符
str[i] = rand()% 26 + 'a';
}
//str[50] = '\0';
printf("\n%s\n", str);
//计算正确的个数
int count = 0;
//输入
for (size_t i = 0; i < 50; i++)
{
//拿到键值,而且并不需要回车
ch = _getch();
//获取手敲第一个字符的时间错
if (i==0)
{
startTime = time(NULL);
}
//判断随机数是否对应手敲的字符
if (str[i] == ch) {
count += 1;
printf("%c", str[i]);
}
else
{
//不相同则输出下划线
//这个下划线会直接打印在哪一行字符中
printf("_");
}
}
//计算正确率
correct = ((float)count / 50)*100;
//获取最后手敲字符时间的函数
endTime = time(NULL);
//注意单位的使用
startAndEnd = (int)(endTime - startTime);
//printf("开始时间%1d结束时间%1d", (long int)startTime,(long int) endTime);
//算正确率
printf("\n你的正确率为%.0f%%\n", correct);
printf("你所花的时间为%d秒\n", startAndEnd);
//第一轮游戏结束,通过这个while循环来给用户选择是否继续,这里使用的还是死循环
while (1)
{
printf("玩家是否继续呢,继续请安空格键,推出按esc键\n");
ch = _getch();
if (ch == ' ') {
break;
}
//esc键对应数字为27
if (ch == 27 )
{
//直接退出程序
return;
}
}
}