📄 cai1.c
字号:
/* 注意:在此样板程序之后有一些函数功能模块, */
/* 大家可以直接调用或作少许修改后调用. */
#include "hncc.h"
#define uchar unsigned char
#define RBAK ((int *)0x10900) /* 用于存放所显示的记录号 */
#define TYPE 0 /* N1 */
#define ID 1 /* C3 */
#define NAME 2 /* C8 */
#define PRICE 3 /* N3 */
#define NUMBER 4 /* N2 */
#define TYPE_LEN 1
#define ID_LEN 3
#define NAME_LEN 8
#define PRICE_LEN 3
#define NUMBER_LEN 2
#define F1 0x88
#define F2 0x89
#define ENTER 0x8D
#define UP 0x8E
#define DOWN 0x8F
#define DBH 0 /* 电表号 C10 */
#define HM 1 /* 户名 C20 */
#define DJH 2 /* 电价号 C3 */
#define SYXD 3 /* 上月底度 N10 */
#define BYXD 4 /* 本月底度 N10 */
#define CBBZ 5 /* 抄表标志 N2 */
#define RQ 6 /* 抄表日期 D8 */
#define YDDZ 7 /* 用电地址 C30 */
#define BL 8 /* 倍率 N3 */
#define CBH 9 /* 抄表号 N4 */
#define SYDL 10 /* 上月电量 N10 */
#define BYDL 11 /* 本月电量 N10 */
#define XCBH 12 /* 新抄表号N4 */
void select(xdata uchar type);
void disp_select();
int select_cai(xdata int record);
void writetocard();
void finish();
void change();
void dateup(xdata uchar *d);
uchar ksh(xdata uchar *cdata,xdata uchar n1,xdata uchar n2,xdata uchar reg);
xdata int total; /* 全局变量,用于存放总记录数 */
xdata int first[4], last[4];
no_init int xhao;
void main(void)
{
xdata uchar k,s[9],s1[11], type[TYPE_LEN], id[ID_LEN + 1];
xdata int i, j;
screen(1); /* 设定为汉字显示状态 */
libopen(0); /* 打开第一数据库 */
total=libsumr(); /* 计算第一数据库的总记录数 */
if(RBAK[0]>total||RBAK[0]<0)
/* 对刚下装的数据库,RBAK中的值(记录号)可能会超出其范围,若超出,置其为0(即第一记录) */
RBAK[0]=0;
for(i = 0; i < 4; i++) {
first[i] = -1;
last[i] = -1;
}
for(i = 0; i < total; i++) {
libset(i, TYPE);
libread(type);
j = type[0] - '1';
if (first[j] == -1)
{
first[j] = i;
}
last[j] = i;
}
do {
cls(); /* 清一屏 */
moveto(15,14); /* 屏幕定位 */
putstr(" "); /* 覆盖屏幕右下角的"123" */
moveto(1,3);
putstr("顺角轩大酒店");
moveto(3,1);
putstr_h("[1] 风味冷菜");
moveto(5,1);
putstr_h("[2] 精炒热菜");
moveto(7,1);
putstr_h("[3] 汤羹砂锅");
moveto(9,1);
putstr_h("[4] 香烟酒水");
moveto(11,1);
putstr_h("[F1] 统计");
moveto(13,1);
putstr_h("[F2] 结束点菜");
dateup(s); /*设定日期格式*/
s1[0]=s[0];
s1[1]=s[1];
s1[2]=s[2];
s1[3]=s[3];
s1[4]='.';
s1[5]=s[4];
s1[6]=s[5];
s1[7]='.';
s1[8]=s[6];
s1[9]=s[7];
s1[10]=0;
moveto(15,1);
putstr("日期: ");
putstr_h(s1);
do {
k=key(0); /* 等待输入一个字符,不回显 */
}while(k!=0x31&&k!=0x32&&k!=0x33&&k!=0x34&&k!=F1&&k!=F2);
/* 判断输入的键值,若输入的不是'1','2','3','4','F1','F2',则继续等待输入 */
switch(k) { /* 根据输入的按键调用相应的函数 */
case '1':
case '2':
case '3':
case '4':
select(k);
break;
case F1:
disp_select();
break;
case F2:
finish();
}
}while(1);
}
/* 显示菜单并点菜 */
void select(xdata uchar select_type)
{
xdata int start, end, i, j, x, y, curr_record;
xdata uchar type[TYPE_LEN+1], id[ID_LEN+1], name[NAME_LEN+1], price[PRICE_LEN+1];
xdata uchar f, cdata[7];
start = first[select_type - '1'];
end = last[select_type - '1'];
i = start;
if (start == -1)
{
cls();
clsn(15,2);
moveto(3, 3);
putstr_h("没有该类菜!");
moveto(7, 3);
putstr_h("任意键返回...");
key(0);
return;
}
do {
sel_1: cls();
moveto(15,14); /* 屏幕定位 */
putstr(" "); /* 覆盖屏幕右下角的"123" */
curr_record = i;
for (x = 1; x <= 7; x++ ) {
while(curr_record <= end) {
libset(curr_record, TYPE);
libread(type);
if (type[0] == select_type)
break;
curr_record++;
}
if (curr_record > end)
break;
moveto(x*2-1, 1);
libset(curr_record, ID);
libread(id);
putstr_h(id);
putstr_h(" ");
libset(curr_record, NAME);
libread(name);
putstr_h(name);
moveto(x*2-1, 13);
putstr_h(" ");
libset(curr_record, PRICE);
libread(price);
sprintf(name, "%3s", price);
putstr_h(name);
curr_record++;
}
do {
sel_2:
clsn(15,2);
moveto(15,1);
putstr("请选择: ");
moveto(15,9);
putstr_h(" ");
moveto(15,9);
f=ksh(cdata,0,3,0); /* 等待输入一串字符,只允许是数字,最多2位 */
if(f==0) { /* 输入不是数字加确认键 */
if (cdata[1] == 0) /* 若输入是数值加其它功能键 */
{
bell(5);
continue;
} else { /* 否则所按第一个键即为功能键 */
if (cdata[1] == F1)
{
disp_select();
return;
}
if (cdata[1] == F2)
{
return; /* 退回上层菜单 */
}
if (cdata[1] == UP ) {
i -= 7;
if (i < start){
i = start;
bell(5);
continue;
}
goto sel_1;
}
if (cdata[1] == DOWN ) {
if (curr_record > end){
bell(5);
continue;
}
i += 7;
if (i > end){
i = curr_record;
bell(5);
continue;
}
goto sel_1;
}
moveto(15,1);
putstr_h("输入错误!");
bell(5);
clsn(15,2);
}
}
} while(!f);
for (j = start; j <= end; j++)
{
libset(j, ID);
libread(id);
if (!strncmp(cdata, id, 3))
{
break;
}
}
if (j > end)
{
moveto(15,1);
putstr_h("未找到该菜!");
bell(5);
goto sel_2;
}
select_cai(j);
} while(1);
return;
}
/* 点菜 */
int select_cai(xdata int record)
{
xdata uchar id[ID_LEN+1], name[NAME_LEN+1], price[PRICE_LEN+1];
xdata uchar number[NUMBER_LEN+1], f, cdata[7];
xdata int num;
clsn(1,16);
moveto(15,14); /* 屏幕定位 */
putstr(" "); /* 覆盖屏幕右下角的"123" */
moveto(1,1);
putstr("编号: ");
libset(record, ID);
libread(id);
putstr_h(id);
moveto(3,1);
putstr("菜名: ");
libset(record, NAME);
libread(name);
putstr_h(name);
moveto(5,1);
putstr("单价: ");
libset(record, PRICE);
libread(price);
putstr_h(price);
libset(record, NUMBER);
libread(number);
if (strlen(number) == 0)
{
num = 0;
}
else
num = stoi(strlen(number), number);
if (num != 0)
{
moveto(9,1);
putstr_h("你已经点了");
putstr_h(number);
putstr_h("份该菜,要修改吗?\n");
putstr_h("F1修改,ENTER退出");
do
{
f=key(0);
}
while (f != F1 && f != ENTER);
if (f == ENTER)
{
return;
}
}
clsn(7,10);
do {
moveto(7,1);
putstr("请输入数量: ");
moveto(7,13);
putstr_h(" ");
moveto(7,13);
f=ksh(cdata,0,2,0); /* 等待输入一串字符,只允许是数字,最多2位 */
if(f==0) { /* 输入不是数字加确认键 */
if (cdata[1] == 0) /* 若输入是数值加其它功能键 */
{
bell(5);
continue;
} else { /* 否则所按第一个键即为功能键 */
if (cdata[1] == F1 ) {
}
if (cdata[1] == F2 ) {
return 1;
}
moveto(15,1);
putstr_h("输入错误!");
bell(5);
clsn(15,2);
}
}
} while(!f);
if(cdata[0] == '0') {
cdata[0] = cdata[1];
cdata[1] = '\0';
}
clsn(9,2);
moveto(9,1);
putstr("数量: ");
putstr_h(cdata);
libset(record, NUMBER);
libwrite(cdata);
moveto(11,1);
putstr("金额: ");
strmul(price, cdata, 6);
putstr_h(cdata);
moveto(15,1);
putstr("按任意键继续...");
key(0);
return(0);
}
/* 显示点菜结果 */
void disp_select()
{
xdata uchar type[TYPE+1], id[ID_LEN+1], name[NAME_LEN+1], number[NUMBER_LEN+1], price[PRICE+1];
xdata uchar cdata[9], money[9], f;
xdata int num, total_num[4];
xdata int total_select, end_flag;
xdata int i, j, curr_record, len;
sel_1:
end_flag = 0;
money[0] = '\0';
total_select = 0;
for (i=0; i<4; i++) {
total_num[i] = 0;
}
cls();
moveto(1,4);
putstr_h("点菜统计");
for(i = 0; i < total; i++) {
libset(i, NUMBER);
libread(number);
if (strlen(number) == 0)
{
num = 0;
}
else
num = stoi(strlen(number), number);
if (num != 0)
{
libset(i, TYPE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -