当前位置: 首页 > news >正文

漳州那里有做网站支持html5的网站

漳州那里有做网站,支持html5的网站,wordpress不能上传到,网站域名怎么选择最近小哥老是想浪,不想好好学习,这不行啊,得想点办法,多少做点努力,于是就自己给自己写了个打卡程序; 该程序基于Sqlite数据库,实现一个简单的打卡功能,该函数具有自动初始化的功能…

最近小哥老是想浪,不想好好学习,这不行啊,得想点办法,多少做点努力,于是就自己给自己写了个打卡程序;

该程序基于Sqlite数据库,实现一个简单的打卡功能,该函数具有自动初始化的功能,第一次使用时,会自动创建数据库和表格并赋原始初值;进入界面后,自动显示上次打卡日期以及已经打卡天数;用户可以根据提示选择打开或者不打卡退出;
先上效果图如下:
效果显示
该程序其实非常基础的一个版本,仅有一个简单的打卡记录功能,所以也非常适合刚学习sqlite新手小白去练习;

如果比较熟练了,是可以基于该程序去丰富各种功能,做出各种各样更有趣的系统,比如:接入人脸识别做成考勤打卡系统;接入邮件功能要是当天没有学习打卡,就疯狂邮件你;或者改装成一个词典,只要想象力丰富,大有可为;

好了那么正式看代码前,先简单认识一下sqlite的几个基础的函数:

sqlite3_open(const char *filename, sqlite3 **ppDb)
打开一个指向 SQLite 数据库文件的连接,返回一个用于其他 SQLite 程序的数据库连接对象。
如果打开时没有该filename的数据库,则会自动创建改名字的数据库sqlite3_close(sqlite3*)
该例程关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关闭之前完成。
如果还有查询没有完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误消息。const char *sqlite3_errmsg(sqlite3*);
返回sqlite执行错误的错误信息
sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)
提供了一个执行 SQL 命令的快捷方式,SQL 命令由 sql 参数提供,可以由多个 SQL 命令组成。简单来说就是通过该函数来执行sql语句在这里,第一个参数 sqlite3 是打开的数据库对象,sqlite_callback 是一个回调,
data 作为其第一个参数,errmsg 将被返回用来获取程序生成的任何错误。

sqlite3_exec中的回调函数sqlite_callback是有固定格式的,如下:

int callback(void *arg, int column_size, char *column_value[], char *column_name[])

其中:
void *arg:是sqlite3_exec函数的第四个参数
column_size:数据库的字段数
column_value[]:列的值
column_name:字段名字

了解完上述的几个函数,看看该系统代码吧,代码中已经详细注释了;

#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>
#include <time.h>#define BUFSIZE 32
char sql[128];//用于存放打卡天数和打卡时间
struct Data
{int day;char date[BUFSIZE];
};
sqlite3 *db;
char dbName[32] = "info.db";	//默认创建的数据库名叫info.db/*用来判断info.db数据库是否存在,如果不存在则在初始化时创建数据库和表*/
int isExist(void *arg, int column_size, char *column_value[], char *column_name[])
{   if (*column_value[0] == '0'){*(int*)arg = 0;		//即将existFlag置为0,表示不存在info表格,需要创建		}return 0; 
}/*初始化数据库:如果已经存在info.db和info表格则不操作,如果不存在,则自动创建数据库和表,并赋初值*/
int db_init()
{int ret;int existFlag = 1;	//先默认数据库info.db是存在的char *errMesg = NULL;if ((ret = sqlite3_open(dbName,&db)) == SQLITE_OK){printf("open %s success\n",dbName);}else{printf("error:%s,%d\n",sqlite3_errmsg(db),ret);return -1;}	//查询表格是否存在strcpy(sql,"SELECT count(*) FROM sqlite_master WHERE type='table' AND name = 'info'");ret = sqlite3_exec(db,sql,isExist,&existFlag,&errMesg);if (ret != SQLITE_OK){fprintf(stderr,"SQL error:%s\n",errMesg);sqlite3_free(errMesg);	//释放掉内存空间}if (existFlag == 0 ){	//创建表strcpy(sql,"create table info(day integer,date char);");ret = sqlite3_exec(db,sql,NULL,NULL,&errMesg);if (ret != SQLITE_OK){fprintf(stderr,"SQL error:%s\n",errMesg);sqlite3_free(errMesg);}//往表中插入原始数据strcpy(sql,"insert into info values(0,'20200101');");ret = sqlite3_exec(db,sql,NULL,NULL,&errMesg);if (ret != SQLITE_OK){fprintf(stderr,"SQL error:%s\n",errMesg);sqlite3_free(errMesg);}}sqlite3_free(errMesg);
}/*用来从数据库中捞取数据*/
int get_data(void *arg, int column_size, char *column_value[], char *column_name[])
{int i;struct Data *dataInfoTmp;dataInfoTmp = (struct Data *)arg;	//将void型强制转化为 struct Data*型strcpy(dataInfoTmp->date,column_value[1]); 	//将数据库存放的第二列的值,即日期赋给dataInfoTmp->date dataInfoTmp->day = atoi(column_value[0]);	//将打开天数赋给dataInfoTmp->day,atoi() :Convert char into intreturn 0;
}/*用户确认打卡后,刷新数据库数据*/
int sign_in(struct Data *arg)
{struct Data *infoDataTmp = NULL;infoDataTmp = arg;char *errMesg = NULL;	int ret;	//日期相关time_t timep;struct tm* tm;time(&timep);tm = localtime(&timep);strftime(infoDataTmp->date,BUFSIZE,"%Y-%m-%d %H:%M",tm);	//将日期字符串制作成自己想要的格式//update the dayinfoDataTmp->day += 1;//刷新数据库数据memset(sql,0,sizeof(sql));sprintf(sql,"update info set day=%d,date='%s';",infoDataTmp->day,infoDataTmp->date);ret = sqlite3_exec(db,sql,get_data,&infoDataTmp,&errMesg);	if (ret != SQLITE_OK){fprintf(stderr,"SQL error:%s\n",errMesg);sqlite3_free(errMesg);}return 0;
}int main()
{int ret,len;char cmd[BUFSIZE] = {'\0'};	//存放用户输入的指令char *errMesg = NULL;	struct Data infoData;db_init();	//初始化数据库//捞取数据库数据到结构体infoData中strcpy(sql,"select * from info;");ret = sqlite3_exec(db,sql,get_data,&infoData,&errMesg);	if (ret != SQLITE_OK){fprintf(stderr,"SQL error:%s\n",errMesg);sqlite3_free(errMesg);}//初始化界面    printf("========欢迎来打卡========\n");printf("上次打卡是:%s,已打卡%d天\n",infoData.date,infoData.day);while(1){memset(cmd,'\0',sizeof(cmd));printf("确认打卡请输入Y,退出输入Q:\n");scanf("%s",cmd);getchar();	if(strcmp(cmd,"Y") == 0){sign_in(&infoData);printf("已打卡\n");break;	}else if	(strcmp(cmd,"Q") == 0){sqlite3_free(errMesg);printf("退出打卡\n");break;}else{printf("输入错误,请重新输入:\n");	}		}return 0;
}

其实该程序中的while(1)流程可以考虑开多一个线程或者封装成一个函数,这样代码会更加简洁,这里小哥就懒得改了,大家可以自行修改;纯粹就是写着玩玩的,所以有写的的不好的地方也欢迎大家指正批评;

http://www.yayakq.cn/news/325610/

相关文章:

  • 怎么做网站推销自己的产品宁国新站seo
  • 网站商城开发一个多少钱温州 网站优化
  • 快速网站优化技巧云南大学做行测的网站
  • 中国化工建设协会网站连云港企业网站建设公司
  • 淘宝单网站建设沈阳市城乡建设局网站首页
  • 体育局网站建设做网站 需求怎么写
  • 丰富网站内容微信小程序推广赚佣金
  • 有什么做动图比较方便的网站莞城仿做网站
  • 从电子商务网站f型眼球轨迹分析其网站布局dedecms 购物网站
  • 工信网备案网站自己怎么制作一个网站
  • 物流货运网站网站推广建设策略
  • 西部数码网站管理助手 没有d盘在线制作网站源码
  • 花生壳域名直接做网站温州 网站建设公司
  • 网站建设数据库的链接网站排名优化培训哪家好
  • 佛山网站建设4-win方维优质做网站价格
  • 网站建设素材网页公司网址大全
  • 东莞网站空间我想做代理怎么找厂家
  • 企业网站建设 管理 维护 请找阿里网站制作需要多少钱
  • 做医药行业找药的网站建工网校和环球网校哪个好
  • 临西网站建设价格个人网站建设需要多少钱
  • 网站被k了wordpress 右侧广告
  • 中山网站建设收费标准简单易做的网站
  • 哪个网站有做阿里巴巴流量个人简历怎么写简短又吸引人
  • 庄浪县县住房建设局网站网站开发属于商标哪个类别
  • 山东国舜建设集团网站虾米音乐 wordpress
  • 用网站ip做代理广州做网页的公司
  • 国内最大设计网站思明区建设局网站
  • 公园网站建设方案全自动推广引流软件
  • 企业网站优化技巧电商网站开发思路
  • 企网官方网站用dw制作网站模板