c语言基础----数组

4. 数组

  1. 概念:数组是若干个相同类型的变量在内存中有序存储的集合。
  2. 数组的分类
  1. 按元素的类型分类
  2. 指针数组
    1. 普通类型的数组的定义(如果不给出元素个数,数组元素所占空间的大小取决于初始化数组的大小)
    2. 结构体数组
//-----------------------------------数组的定义-------------------
//数组类型  数组名  [数组的元素的个数]
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]);

      1. 字符数组(特殊之处:字符串就是一个字符数组)
      2. 两种方式
// -------------------------字符数组---------------------------
//对于着一串字符串的讲解:字符串本身是由若干个字符的集合,后面是\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;
    1. 按维数分类
  1. 一维数组
    1. 初始化: :和普通类型数组定义数组一样的,在初始化是,可以先空着元素可以先不写,但是只能是这一层的最后一个元素.
  2. 二维数组
    1. 初始化:(定义是最好一维和二维的元素个数都要给),在初始化是,可以先空着元素可以先不写,但是只能是这一层的最后一个元素.
//------------------------------二维数组的定义--------------------------------------
// 两种定义方式
//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]);
	}
}
      1. 多维数组

练习:使用数组来计算日期对应的天数

//-------------使用数组来计算日期对应的天数------------------------
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;
		}
	}

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值