周报和打卡机核心功能

新职课第一次博客

一周小结

在本周中,正式开始组队学习了新职课的内容。本周完成了第二章前三节的学习,完成了打卡机的任务卡。也在班会上选出了自己战队的队长。是收获颇丰的一周。

每日一练回顾

1编译期错误,链接期错误,运行期错误:

编译期错误发生在将高级语言程序文本编译成二进制的对象,一般是语法错误
链接期错误发生在多个.o文件被连接成一个可执行文件的过程中,一般是函数,变量等地址的重定向发生冲突或者未定义的错误
运行期错误是在程序编译成可执行文件之后发生,出现了访问受保护的内存位置,栈溢出,栈被破坏等情况。

2简述下变量的作用范围,以及你们对变量的理解

(1)动态局部变量:也称局部变量、自动变量,是指在函数内部定义的自动变量,不带
static修饰,作用域是定义该变量的子程序。在退出函数后,变量自带内存会自动释放
(2)静态局部变量:是指在函数内部定义的静态变量,带static修饰,作用域是定义该变
量的子程序。只被定义和初始化一次,这种变量在函数退出后不会释放内存,且保持其值,
下次调用时不再重新创造和初始化该变量,而是直接用上一次留下的值为基础来进行操作。
直到程序退出时一起释放(生存期为整个源文件)
(3)动态全局变量:也称全局变量,是指在所有函数外定义的动态变量,作用域为整个程
序,即可以在任何函数内使用,且可以被程序的其他文件所访问。只被定义和初始化一次,
以后调用时值保持上一次的不变
(4)静态全局变量:是指在所有函数外定义的静态变量,作用域为整个程序,可以在定义
它的文件内的任何地方被访问,不可以被程序的其他文件所访问。
对变量的理解:变量就是对一块内存进行标记的标识符,是程序组织和编写简化和关联的基
础。

3sizeof()是不是函数

sizeof()是返回一条表达式或者一个类型名字所占的字节数的运算符
sizeof当然不是函数,它是编译的时候处理的编译时,编译器推断出sizeof参数的类型,sizeof
根据这个类型确定一个整数,所以它可以当常量使用函数肯定不能当常量使用,函数只能运
行时求值所以某种层面上,sizeof更类似于一个宏。

打卡机项目小结

首先定义了一个struct来表示员工

在这里插入代码片
typedef struct people
{
	int number;
	int securitycode;
	int day;
	int daylate;
	int backearly;
	int timego[5];
	int timeback[5];
}people;

number表示编号,securitycode代表密码,day表示记录第几天打卡,daylate记录迟到次数,backearly表示早退次数,两个数组分别记录上下班打卡的时间。

void restart()
{
	
	for (int i = 0; i < 3; i++)
	{
		int less = team1[i].number - 100000;
		char temp[6];
		itoa(less, temp, 10);
		char* temp1 = Reverse(temp);
		less = atoi(temp1);//换算出验证码
		team1[i].securitycode = team1[i].number + less;
	}
}

restart函数算出每个人的验证码

void GoToWork(int time0)
{
	int number,securitycode,num;
	printf("请输入员工编号\n");
	scanf("%d", &number);
	for (int i = 0; i < 3; i++)
	{
		if(number==team1[i].number)
		{
			num = i;
			break;
		}
		else
		{
			printf("请输入员工编号\n");
			scanf("%d", &number);
		}
	}
	printf("请输入验证码\n");
	scanf("%d", &securitycode);
	while (securitycode!=team1[num].securitycode)
	{
		printf("请输入验证码\n");
		scanf("%d", &securitycode);
	}
	time_t now1;
	struct tm *localtp1;
	time(&now1);
	localtp1 = gmtime(&now1);
	team1[num].timego[team1[num].day] = localtp1->tm_hour * 3600 + localtp1->tm_min * 60 + localtp1->tm_sec-time0;
	printf("%d打卡成功\n",(team1[num].timego[team1[num].day]));
	islate(num);
	team1[num].day++;
}

上班打卡程序,通过当前打卡的时间,记录入打卡数组中,每天日期自加

void GoOffWork(int time0)
{   int number, num;
	printf("请输入员工编号\n");
	scanf("%d", &number);
	for (int i = 0; i < 3; i++)
	{
		if (number == team1[i].number)
		{
			num = i;
			break;
		}
		else
		{
			printf("请输入员工编号\n");
			scanf("%d", &number);
		}
	}
	time_t now2;
	struct tm *localtp2;
	time(&now2);
	localtp2 = gmtime(&now2);
	team1[num].timeback[team1[num].day-1] = localtp2->tm_hour * 3600 + localtp2->tm_min * 60 + localtp2->tm_sec-time0;
	printf("%d下班打卡成功\n", (team1[num].timeback[team1[num].day - 1] - team1[num].timego[team1[num].day -1]));
	if (team1[num].timeback[team1[num].day - 1] - team1[num].timego[team1[num].day - 1] < 54)
	{
		int temp1 = 54 - team1[num].timeback[team1[num].day - 1] - team1[num].timego[team1[num].day - 1];
		printf("早退%d分钟\n", temp1 * 10);
		team1[num].backearly++;
	}
}

下班打卡程序
通过当前的打卡时间,判断是否早退。

void clockin_machine_start()
{
	char exitflag = '\0';
	restart();
	time_t now;
	struct tm *localtp;
	time(&now);
	localtp = gmtime(&now);
	int time0 = localtp->tm_hour * 3600 + localtp->tm_min * 60 + localtp->tm_sec;

	while (timere - time0 < 720)
	{
		printf("-----------1.上班打卡-------------\n");
		printf("-----------2.下班打卡-------------\n");
		printf("-----------3.设置上班时长---------\n");
		Sleep(1000);
		time_t nowre;
		struct tm *localtpre;
		time(&nowre);
		localtpre = gmtime(&nowre);
		timere = localtpre->tm_hour * 3600 + localtpre->tm_min * 60 + localtpre->tm_sec;
		if (_kbhit())
		{
			exitflag = _getch();
			switch (exitflag)
			{
			case '1':
				GoToWork(time0);
				break;
			case '2':
				GoOffWork(time0);
				break;
			case '3':
				printf("请输入上班时长\n");
				scanf("%d", &timeforwork);
				timeforwork = timeforwork * 6;
			default:
				printf("请重新输入!");
				break;
			}
		}
	}
	outputresult();
}

在时间满足之前一直循环,_kbhit()判断是否有键盘输入进入判断进入哪个函数,最后打印结果。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页