找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1688|回复: 1
打印 上一主题 下一主题
收起左侧

6818停车场数据库

[复制链接]
跳转到指定楼层
楼主
ID:394706 发表于 2018-9-6 19:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "common.h"

int  g_buz;
extern sem_t s, ss;

char *province[] = {"粤", "赣", "湘", "鄂", "贵",
                    "黑", "沪", "京", "蒙", "藏",
                    "甘", "豫", "鲁", "晋", "桂",
                    "云", "滇", "辽", "川", "闵",
                    "徽", "苏", "津", "吉", "冀",
                    "陕", "宁", "浙", "渝", "琼",
                    "港", "澳", "台"};

char alphanumeric[] = { 'A', 'B', 'C', 'D', 'E',
                        'F', 'G', 'H', 'I', 'J',
                        'K', 'L', 'M', 'N', 'O',
                        'P', 'Q', 'R', 'S', 'T',
                        'U', 'V', 'W', 'X', 'Y',
                        'Z', '0', '1', '2', '3',
                        '4', '5', '6', '7', '8',
                        '9', '0'};

char *CHIESE_NUM[] = {"零", "一", "二", "三", "四",
                         "五", "六", "七", "八", "九",
                         "十"};

char *random_alphanumeric(void)
{
        static char license_num[7];

        srand(time(NULL));
        license_num[0] = alphanumeric[rand() % 26];
        license_num[1] = alphanumeric[rand() % 37];

        srand(license_num[1]);
        license_num[2] = alphanumeric[rand() % 37];

        srand(license_num[2]);
        license_num[3] = alphanumeric[rand() % 37];

        srand(license_num[3]);
        license_num[4] = alphanumeric[rand() % 37];

        srand(license_num[4]);
        license_num[5] = alphanumeric[rand() % 37];

        return license_num;
}

char *get_license(void)
{
        // 返回车牌号作为照片的文件名存入数据库
        char *license = calloc(1, 10);
        snprintf(license, 10, "%s%s", province[rand()%33], random_alphanumeric());

        return license; // license举例:"粤B9MK48"
}

char *total_time(char *time_in, char *now)
{
        assert(time_in);
        assert(now);

        #define YEAR 0
        #define MON  1
        #define MDAY 2
        #define HOUR 3
        #define MIN  4
        #define SEC  5
        int val_time_in[6], val_now[6];

        char *delim = "-: \t";

        char *p = strtok(time_in, delim);
        int i;
        for(i=0; i<6; i++)
        {
                if(p != NULL)
                {
                        val_time_in[i] = atoi(p);
                        p = strtok(NULL, delim);
                }
        }

        p = strtok(now, delim);
        for(i=0; i<6; i++)
        {
                if(p != NULL)
                {
                        val_now[i] = atoi(p);
                        p = strtok(NULL, delim);
                }
        }

        int year = val_now[YEAR] - val_time_in[YEAR];
        int mon  = val_now[MON]  - val_time_in[MON];
        int mday = val_now[MDAY] - val_time_in[MDAY];
        int hour = val_now[HOUR] - val_time_in[HOUR];
        int min  = val_now[MIN]  - val_time_in[MIN];
        int sec  = val_now[SEC]  - val_time_in[SEC];

        static char dis[64];
        bzero(dis, 64);

        if(year != 0)
        {
                snprintf(dis+strlen(dis), 64-strlen(dis), "%d年", year);
        }
        if(mon  != 0)
        {
                snprintf(dis+strlen(dis), 64-strlen(dis), "%d月", mon);
        }
        if(mday != 0)
        {
                snprintf(dis+strlen(dis), 64-strlen(dis), "%d日", mday);
        }

        if(hour != 0)
        {
                snprintf(dis+strlen(dis), 64-strlen(dis), "%d时", hour);
        }
        if(min  != 0)
        {
                snprintf(dis+strlen(dis), 64-strlen(dis), "%d分", min);
        }
        if(sec  != 0)
        {
                switch(sec)
                {
                case 0 ... 9:
                        snprintf(dis+strlen(dis), 64-strlen(dis), "%s秒", CHIESE_NUM[sec]);
                        break;
                case 10 ... 19:
                        snprintf(dis+strlen(dis), 64-strlen(dis), "十%s秒", CHIESE_NUM[sec-10]);
                        break;
                case 20 ... 29:
                        snprintf(dis+strlen(dis), 64-strlen(dis), "二十%s秒", CHIESE_NUM[sec-20]);
                        break;
                case 30 ... 39:
                        snprintf(dis+strlen(dis), 64-strlen(dis), "三十%s秒", CHIESE_NUM[sec-30]);
                        break;
                }
        }

        return dis;
}

char *cal_fee(char *total)
{
        assert(total);

        // 停车费用政策:¥1/秒,四十元封顶
        int fee = atoi(strtok(total, "S"));

        static char val[20];
        bzero(val, 20);

        switch(fee)
        {
        case 0 ... 9:
                snprintf(val, 20, "%s元", CHIESE_NUM[fee]);
                break;
        case 10 ... 19:
                snprintf(val, 20, "十%s元", CHIESE_NUM[fee-10]);
                break;
        case 20 ... 29:
                snprintf(val, 20, "二十%s元", CHIESE_NUM[fee-20]);
                break;
        case 30 ... 39:
                snprintf(val, 20, "三十%s元", CHIESE_NUM[fee-30]);
                break;
        default:
                snprintf(val, 20, "四十元");
        }

        return val;
}

int main(int argc, char **argv)
{
        // 打开/创建数据库parking.db,并创建表carinfo
        sqlite3 *db;
        sqlite3_open_v2("parking.db", &db,
                        SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
                        NULL);

        char *errmsg;
        char *create =  "CREATE TABLE IF NOT EXISTS "
                        "carinfo(cardid TEXT PRIMARY KEY, "
                        "license TEXT, "
                        "time_in TEXT NOT NULL, "
                        "photo   TEXT);";
        if(Sqlite3_exec(db, create, NULL, NULL, &errmsg) != SQLITE_OK)
        {
                exit(0);
        }

        while(1)
        {
                // 从管道读取卡号
                char card_num[10] = {0};
                read(0, card_num, 10);

                printf("数据库得到的卡号:%#x\n", atoi(card_num));

                unsigned int cardid = atoi(card_num);

                // 随机生成车牌号
                char *license = get_license();

                if(cardid > 0)
                {
                        if(start_charging(db, license, cardid, "1.bmp"))
                        {
                                // 将欢迎辞和车牌号发送给主机合成语音并播放出来
                                char welcome_msg[200] = {0};
                                snprintf(welcome_msg, 200, "欢迎%s入场", license);
                        }
                        else
                        {
                                fprintf(stderr, "\n此卡【已进场】.\n");
                        }
                }
                else if(cardid < 0)
                {
                        cardid = -cardid;
                        char *license, *time_in;

                        if(stop_charging(db, cardid, &license, &time_in))
                        {
                                time_t t = time(NULL);
                                char *now = calloc(1, 64);
                                struct tm *p = localtime(&t);
                                snprintf(now, 64, "%d-%d-%d %02d:%02d:%02d",
                                                p->tm_year+1900, p->tm_mon+1, p->tm_mday,
                                                p->tm_hour, p->tm_min, p->tm_sec);

                                fprintf(stderr, "入场时间: %s\n", time_in);

                                char *total = total_time(time_in, now);
                                fprintf(stderr, "停车时长: %s\n", total);
                                fprintf(stderr, "车费: %s\n\n", cal_fee(total));
                        }
                        else
                        {
                                fprintf(stderr, "\n此卡【未进场】.\n");
                        }
                }

        }

        return 0 ;
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-9-8 04:31 | 只看该作者
补全源码即可获得100+黑币
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表