新职课第一次博客
一周小结
在本周中,正式开始组队学习了新职课的内容。本周完成了第二章前三节的学习,完成了打卡机的任务卡。也在班会上选出了自己战队的队长。是收获颇丰的一周。
每日一练回顾
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()判断是否有键盘输入进入判断进入哪个函数,最后打印结果。