C
Sistema de gestión de loterías
1. Introducción a la función
Tres identidades: usuario ordinario, notario y administrador.
- Usuarios habituales: registrarse, iniciar sesión, recargar, comprar billetes de lotería, etc.
- Registro: ingrese el número de cuenta, verifique los duplicados, ingrese la contraseña. Esta información se almacena en la lista vinculada y se escribe en un archivo local.
- Inicio de sesión: Ingrese el número de cuenta, la contraseña y la contraseña debe estar cubierta con "*". Necesita ingresar el código de verificación.
- Ver información personal: después de iniciar sesión, vaya a la página secundaria. Los usuarios pueden ver su propia información (número, nombre de usuario, contraseña, saldo).
- Modificar contraseña: la nueva contraseña no puede ser coherente con la contraseña anterior; de lo contrario, generará un error de modificación.
- Recarga de cuenta: Ingrese la cantidad a recargar y confirme.
- Compra de boletos de lotería: Hay boletos de lotería que se emiten en el retiro periódico, de lo contrario no puede comprarlos; los boletos de lotería los emite el administrador. Los usuarios pueden generar números de lotería aleatoriamente o completarlos a mano.
- Ver historial: los usuarios pueden poseer sus registros de compras anteriores. Busque el nodo que compró en la lista de lotería.
- Notario:
- La cuenta y la contraseña se fijan como: notery
- Al iniciar sesión, debe ocultar su contraseña y solicitar un código de verificación.
- Sorteo: después de iniciar sesión, (siempre que ya se haya emitido un boleto de lotería) sorteo. Y determina. Genere aleatoriamente varios números como números ganadores.
- Una vez finalizado el sorteo, el notario puede decidir si emite el bono inmediatamente.
- Los notarios pueden jugar en su tiempo libre. Hasta ahora, solo se ha completado "Piedra, papel, tijera". También se desarrollarán "Snake Snake" y "Tank Battle".
- administrador:
- Puede ver la información de todos los usuarios.
- Puede consultar la información de un solo usuario.
- Se emiten billetes de lotería y el número de lotería se genera automáticamente en función de la fecha y la hora. El precio unitario de la lotería debe ser fijado por el administrador.
- Puede ordenar la lista de usuarios (según el nombre o ID) y guardarla.
- Se emiten bonificaciones. Bajo el número de lotería que se está emitiendo actualmente, se determina que un usuario lo ha comprado y el notario sacará la lotería. Según el número de lotería del usuario, el premio se saca del pozo de premios y se distribuye al usuario ganador.
- Agregue dinero manualmente al pozo de premios.
- eliminar usuarios. El administrador puede eliminar un usuario.
- Ver toda la información de compra. De la lista de lotería, se muestra toda la información de la lotería.
La interfaz interactiva implica:
Este proyecto adopta el diseño de la arquitectura MVC, es decir, módulo, interfaz y control.
En src / lotview.c, use system ("clear"); y printf (); para actualizar la pantalla continuamente para lograr un efecto interactivo dinámico.
En src / lotcontrol.c, la lógica de control de cada interfaz está constituida por switch y case.
Una de las funciones más básicas es: choose = key_udrl (choose, 4,3); esta función es el núcleo de los efectos dinámicos interactivos. Modifique el valor de elección mediante los botones y números arriba, abajo, izquierda y derecha en el teclado para ingresar la lógica correspondiente. Y actualice dinámicamente en lotview.c.
Dificultades técnicas:
- La base de datos no se utiliza, pero se crea una lista vinculada y se guarda en un archivo local.
- En el proceso de uso de la lista vinculada, están involucradas la aplicación y liberación de memoria dinámica.
- Por primera vez en la vida, comencé a darme cuenta de la terrible falla secundaria y del buen hábito de prevenir las fallas secundarias.
2. Código
Dirección de descarga del código del proyecto: https://github.com/Kshine2017/My_GCC/tree/master/lottery_Kshine201708
El directorio del proyecto es el siguiente:
root@kshine-virtual-machine:/home/kshine/桌面/lottery_Kshine201708# tree
.
├── bin
│ └── main
├── common.bin
├── include
│ ├── freelink.h
│ ├── fun.h
│ ├── gamejsb.h
│ ├── loadsave.h
│ ├── lotcontrol.h
│ ├── lottery.h
│ ├── lotview.h
│ ├── pic.h
│ └── udrl.h
├── iss.bin
├── makefile
├── obj
│ ├── freelink.o
│ ├── fun.o
│ ├── gamejsd.o
│ ├── loadsave.o
│ ├── lotcontrol.o
│ ├── lottery.o
│ ├── lotview.o
│ ├── main.o
│ ├── pic.o
│ └── udrl.o
├── src
│ ├── freelink.c
│ ├── fun.c
│ ├── gamejsd.c
│ ├── loadsave.c
│ ├── lotcontrol.c
│ ├── lottery.c
│ ├── lotview.c
│ ├── main.c
│ ├── pic.c
│ ├── udrl.c
│ └── 锛_
├── tic.bin
└── user.bin
Elija algunos archivos o funciones y haga un análisis de visualización simple:
- udrl.c (arriba abajo derecha izquierda)
#include <stdio.h>
#include <stdlib.h>
#include "lotview.h"
int key_udrl(int choose,int menu_num,int mode)
{
printf("\n\033[47;31m\t\t\t敲击Enter继续!\033[0m\n");
getchar();
while (1)
{
char c =0;
if(mode==1)
{
V_main_menu_move(choose);
}
else if(mode==2)
{
V_game_move(choose);
}
else if(mode==3)
{
V_other_move(choose);
}
else if(mode==4)
{
V_sort_move(choose);
}
else if(mode==5)
{
V_admin_menu_move(choose);
}
else if(mode==6)
{
V_user_menu_move(choose);
}
else if(mode==7)
{
V_notery_menu_move(choose);
}
while(1) //自动清掉奇怪的符号
{
system("stty -icanon");//关闭缓冲区,输入字符无需回车直接接受
c=getchar();
if(c=='\n')
{
return choose;
}
if((c>='a'&&c<='z')&& (c>='A'&&c<='Z') && (c>='9'&&c<='0'))
{
printf("\b");
continue;
}
else //是字母或者数字
{
break;
}
}
//得到上下左右或者字母数字
if(c<='9'&&c>='0')//返回数值,直接控制
{
choose = (int)(c-'0');//不要急着返回
}
else
{
if(c=='A')//up
{
choose--;
}
if(c=='B')//down
{
choose++;
}
if(c=='D')//left
{
choose=0;
}
if(c=='C')//right
{
//进入当前的choose菜单
break;
}
}
//--------------------
if(choose<0)
{
choose += menu_num;
}
if(choose>menu_num-1)
{
choose -=(menu_num);
}
//-----动态显示
//V_main_menu_move(choose);
//----
}
return choose;
}
En el archivo fun.c
- // Bloquear el valor de entrada
char* secret_num(char* str)
{
char ch=0;
int i=0;
getchar();
while(1)
{
system("stty -icanon");//关闭缓冲区,输入字符无需回车直接接受
ch=getchar();
printf("\b@");
if(ch=='\n')
{
break;
}
str[i++]=ch;
}
str[i]='\0';
return str;
}
- //Código de verificación
int identifying_code()
{
char array[100]={"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"};
char a[5]="";
char b[5]="";
srand(time(NULL));
a[0]=array[rand()%62];
a[1]=array[rand()%62];
a[2]=array[rand()%62];
a[3]=array[rand()%62];
printf("验证码是:");
printf("\033[42;31m%s\033[0m\n",a);
printf("请输入您的验证码:");
scanf("%s",b);
if(strcmp(a,b)==0)
{
printf("验证成功!\n");
return 0;
}
else
{
printf("验证失败!");
return 1;
}
return 0;
}
3. Compila y ejecuta
El archivo MAKE se escribe en el proyecto y el usuario puede ingresar directamente make o make clean.
CC:=gcc
DEPEND:=obj/main.o
DEPEND+=obj/lotcontrol.o
DEPEND+=obj/fun.o
DEPEND+=obj/udrl.o
DEPEND+=obj/lotview.o
DEPEND+=obj/loadsave.o
DEPEND+=obj/freelink.o
DEPEND+=obj/pic.o
DEPEND+=obj/lottery.o
DEPEND+=obj/gamejsd.o
bin/main:$(DEPEND)
$(CC) $^ -o $@
obj/%.o:src/%.c
$(CC) -c $^ -o $@ -Iinclude
clean:
rm -rf obj/$(DEPEND)
rm -rf src/*.c~
4. Ejecutar pantalla
Pantalla de bienvenida:
Interfaz principal:
Inicio de sesión de usuario:
Interfaz de usuario
Historial de vista de usuario
Interfaz de notario:
Interfaz de administrador:
Orden administrador-usuario:
Interfaz de otra información:
La información básica es información de texto. El icono es la pantalla de inicio. El código QR es la imagen del código QR en el que me aburrí y convertí la URL de una organización. (Los usuarios pueden convertir imágenes en matrices de acuerdo con sus propias necesidades y luego reemplazarlas aquí). Debido a que el terminal utiliza un solo carácter para representar un píxel y para evitar que el patrón pierda su forma, la imagen es muy grande. Esta es también una de las desventajas de la pantalla del terminal. Vamos a mostrar el código QR que se muestra.
También hay algunas funciones que debe descubrir y mejorar usted mismo.