控制台签到程序[c语言]

 IDE:VS 2015

昨晚睡前锻炼,然后想记录每天锻炼天数,所以决定自己写个打卡程序,虽然网上很多现成的打卡APP,但是学习是永无止境的。所以就决定自己编写一个这样的程序。

程序思路:

1、获取系统时间

        获取系统时间用的是time()函数,main函数中第一行就用了time_t数据类型,什么是time_t数据类型呢?

        我们选中time_t右击->"转到定义"    显示如下:

#ifndef _CRT_NO_TIME_T
    #ifdef _USE_32BIT_TIME_T
        typedef __time32_t time_t;
    #else
        typedef __time64_t time_t;
    #endif
#endif

        我们再选中time64_t右击->"转到定义"     显示如下:

typedef __int64                       __time64_t;

        是用typydef 关键字来替代系统默认的基本类型名称等。

        所以time_t数据类型就是int64

        c语言是提供了时间结构的结构体的,所以我们直接声明结构体变量

struct tm *p;

        我们选中tm右击->"转到定义"    显示如下:

struct tm
{
    int tm_sec;   // seconds after the minute - [0, 60] including leap second
    int tm_min;   // minutes after the hour - [0, 59]
    int tm_hour;  // hours since midnight - [0, 23]
    int tm_mday;  // day of the month - [1, 31]
    int tm_mon;   // months since January - [0, 11]
    int tm_year;  // years since 1900
    int tm_wday;  // days since Sunday - [0, 6]
    int tm_yday;  // days since January 1 - [0, 365]
    int tm_isdst; // daylight savings time flag
};

       可以看到这个结构体中的成员变量,这样的话,我们引用变量的时候心里也有数

       我们引用成员变量写入到文件中,这样就获取完成了

 

2、判断日期差

        程序存在这几种情况

  1. 第一次打开文件,需要判断文件是否存在,如果不存在,就创建文件,并且写入时间
  2. 已经打开过文件,这时文件已经存在,这时候需要判断是否连续签到

        判断是否连续签到则是用if语句判断,如果满足条件进行下一次签到,并且覆盖原先的签到时间,下一次签到时读取上一次           签到时间。  

代码如下:  

 

// signIn.cpp : 定义控制台应用程序的入口点。
//1、获取系统时间
//2、判断日期差
//		如日期间差大于1天则无法签到次数+1

#include "stdafx.h"


int main()
{
	time_t timep;
	struct tm *p;
	timep = time(&timep);
	p = gmtime(&timep);
	FILE *fp;
	int daysNum = 1;
	int year = 0;
	int mon = 0;
	int day = 0;
	int hour = 0;
	int min = 0;
	int *pyear = &year;
	int *pmon = &mon;
	int *pday = &day;
	int *phour = &hour;
	int *pmin = &min;
	int *pdaysNum = &daysNum;
	fp = fopen("D:\\signIn.txt","r");
	if (fp == NULL)
	{

		year = 1900 + p->tm_year;
		mon = 1 + p->tm_mon;
		day = p->tm_mday;
		hour = 8 + p->tm_hour;
		min = p->tm_min;
		daysNum += 1;
		fp = fopen("D:\\signIn.txt", "wb");
		puts("未找到目录下文件,已创建文件");
		fwrite(pyear, sizeof(int), 1, fp);//写入年份
		fwrite(pmon, sizeof(int), 1, fp);//写入月份
		fwrite(pday, sizeof(int), 1, fp);//写入日期
		fwrite(phour, sizeof(int), 1, fp);//写入小时
		fwrite(pmin, sizeof(int), 1, fp);//写入分钟
		fwrite(pdaysNum, sizeof(int), 1, fp);
		printf("%d/%d/%d\n%d:%d\n", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, 8 + p->tm_hour, p->tm_min);
		puts("第一次签到");
		fclose(fp);
	}
	else
	{
		 year = 0;
		 mon = 0;
		 day = 0;
		 hour = 0;
		 min = 0;
		fp = fopen("D:\\signIn.txt", "rb");
		fread(pyear, sizeof(int), 1, fp);
		fread(pmon, sizeof(int), 1, fp);
		fread(pday, sizeof(int), 1, fp);
		fread(phour, sizeof(int), 1, fp);
		fread(pmin, sizeof(int), 1, fp);
		fread(pdaysNum, sizeof(int), 1, fp);
		fclose(fp);
		printf("%d/%d/%d\n%d:%d", year, mon, day, hour, min);
		if (year ==(1900+ p->tm_year)&&mon ==(1+ p->tm_mon) && ((day + 1) == p->tm_mday))
		{
			fp = fopen("D:\\signIn.txt", "wb");
			daysNum++;
			puts("今日签到时间为:");
			printf("%d/%d/%d\n%d:%d\n签到次数:%d", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, 8 + p->tm_hour, p->tm_min,daysNum);
			year = 1900 + p->tm_year;
			mon = 1 + p->tm_mon;
			day = p->tm_mday;
			hour = 8 + p->tm_hour;
			min = p->tm_min;
			fwrite(pyear, sizeof(int), 1, fp);//写入年份
			fwrite(pmon, sizeof(int), 1, fp);//写入月份
			fwrite(pday, sizeof(int), 1, fp);//写入日期
			fwrite(phour, sizeof(int), 1, fp);//写入小时
			fwrite(pmin, sizeof(int), 1, fp);//写入分钟
			fwrite(pdaysNum, sizeof(int), 1, fp);
			fclose(fp);
		}
		else if (((day + 1) < p->tm_mday))
		{
			puts("您未连续签到");
			year = 1900 + p->tm_year;
			mon = 1 + p->tm_mon;
			day = p->tm_mday;
			hour = 8 + p->tm_hour;
			min = p->tm_min;
			fp = fopen("D:\\signIn.txt", "wb");
			puts("重新写入时间");
			daysNum = 1;
			fwrite(pyear, sizeof(int), 1, fp);//写入年份
			fwrite(pmon, sizeof(int), 1, fp);//写入月份
			fwrite(pday, sizeof(int), 1, fp);//写入日期
			fwrite(phour, sizeof(int), 1, fp);//写入小时
			fwrite(pmin, sizeof(int), 1, fp);//写入分钟
			fwrite(pdaysNum, sizeof(int), 1, fp);
			puts("今日签到时间为:");
			printf("%d/%d/%d\n%d:%d\n签到次数:%d\n", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, 8 + p->tm_hour, p->tm_min, 1);
			fclose(fp);
		}
		else if (day == p->tm_mday)
		{
			puts("您已签到");
		}
	}
	/*
	printf("%d\n", p->tm_sec); //获取当前秒
	printf("%d\n", p->tm_min); //获取当前分
	printf("%d\n", 8 + p->tm_hour);//获取当前时,这里获取西方的时间,刚好相差八个小时
	printf("%d\n", p->tm_mday);//获取当前月份日数,范围是1-31
	printf("%d\n", 1 + p->tm_mon);//获取当前月份,范围是0-11,所以要加1
	printf("%d\n", 1900 + p->tm_year);//获取当前年份,从1900开始,所以要加1900
	printf("%d\n", p->tm_yday); /从今年1月1日算起至今的天数,范围为0-365
	*/
	system("pause");
    return 0;

其中,用读文件用fread函数,那么写文件最好用fwrite函数,用这两个函数的时候,程序创建的文件中,文件内容是乱码。

因为fwrite函数写到文件中的是二进制数据,用fread读出的话是一样的,如果想在文件中清楚的看到内容的话,可以使用fprintf函数写入。

 

参考资料:

https://blog.csdn.net/u012229282/article/details/79598287

 

 

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
统计某十五天内64 位员工的上班迟到早退的次数,星期天和星期六系统自动关闭;假设员工上下班都在标准点±1小时,不存在迟到或早退超过一小时的,其余时间系统自动关闭!迟到早退的次数记录在a.dat 日志分别记录在log_check_in和log_check_out里; 1.员工为我班同学,可比照代码中的结构体初始化的内容; 2.员工号为我班同学学号后3位数字,起始为067,在统计多日迟到累计次数过程有文件内容的修改操作和数据类型转换过程,为简化文件操作过程以及后面的查询过程,实际处理的是员工的序号,如员工号为073的记录为07; 3.签到有时间,如在周六周日不签,在系统关闭情况下,管理员可以进行相关维护操作,管理员密码123456; 4.签到过程记录了员工多日迟到早退的累计次数,更详细的内容写到log文件中,所有这些都可以查询; 5.程序为了更好的实现交互式查询的功能, 循环嵌套写得稍复杂 ; 6.觉得数据库的操作比文本文件的操作更有意义些,对员工信息的定义初始化直接在数组中完成;文件操作起来繁琐,没多大意义,所以打算待学会数据库初始化,数据库访问后再来完善; 7.尚未考虑如何精简程序,合理管理内存,待学会动态内存管理后再回头处理;8.感到不尽人意的是C的“不友好”,没有可视化的界面,没有面向对象语言的种种…… 康师傅 qq 1304622669 再缀:加了控台dos命令调用版缺点优点又都激增,想各程序爱好者给提多多建议,跪拜

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值