c
宝くじ管理システム
1.機能紹介
3つのID:通常のユーザー、公証人、および管理者。
- 一般ユーザー:登録、ログイン、リチャージ、宝くじの購入など
- 登録:アカウント番号を入力し、重複をチェックし、パスワードを入力します。この情報はリンクリストに保存され、ローカルファイルに書き込まれます。
- ログイン:アカウント番号、パスワードを入力します。パスワードは「*」で囲む必要があります。確認コードを入力する必要があります。
- 個人情報の表示:ログイン後、セカンダリページにアクセスします。ユーザーは自分の情報(番号、ユーザー名、パスワード、残高)を表示できます。
- パスワードの変更:新しいパスワードを古いパスワードと一致させることはできません。一致しない場合、変更エラーが表示されます。
- アカウントのリチャージ:リチャージする金額を入力して確認します。
- 宝くじの購入:定期退会時に抽選券が発行されていますが、それ以外の場合は購入できず、管理者が抽選券を発行します。ユーザーはランダムに宝くじ番号を生成するか、手動で入力できます。
- 履歴の表示:ユーザーは過去の購入記録を所有できます。宝くじリストから購入したノードを探します。
- 公証人:
- アカウントとパスワードは次のように固定されています:notery
- ログインするときは、パスワードを非表示にし、確認コードを要求する必要があります。
- 抽選:ログイン後、(抽選券が既に発行されている場合)抽選。そして決定します。当選番号としていくつかの番号をランダムに生成します。
- ドローが終わった後、公証人はボーナスをすぐに発行するかどうかを決めることができます。
- 公証人は暇なときにゲームをプレイできます。これまでに完成したのは「じゃんけん」だけです。「スネークスネーク」「タンクバトル」も開発予定。
- 管理者:
- すべてのユーザーの情報を表示できます。
- 単一のユーザーの情報を照会できます。
- 抽選券が発行され、日時に基づいて抽選番号が自動生成されます。宝くじの単価は管理者が設定する必要があります。
- ユーザーリストを(名前またはIDに従って)ソートして保存できます。
- ボーナスが発行されます。現在発行されている抽選番号の下で、利用者が購入したと判断し、公証人が抽選を行います。ユーザーの宝くじ番号に従って、賞金は賞金プールから取り出され、当選したユーザーに分配されます。
- 賞金プールに手動でお金を追加します。
- ユーザーを削除します。管理者はユーザーを削除できます。
- すべての購入情報を表示します。宝くじリストから、すべての宝くじ情報が表示されます。
インタラクティブなインターフェースには以下が含まれます。
このプロジェクトは、MVCアーキテクチャ設計、つまりモジュール、インターフェース、および制御を採用しています。
src / lotview.cでsystem( "clear");とprintf();を使用して画面を継続的に更新し、動的なインタラクティブ効果を実現します。
src / lotcontrol.cでは、各インターフェースの制御ロジックは、スイッチとケースで構成されています。
choose = key_udrl(choose、4,3);この関数は、インタラクティブな動的効果の中核です。キーボードの上下左右のボタンと数字を使用して選択値を変更し、対応するロジックを入力します。そして、lotview.cで動的に更新します。
技術的な問題:
- データベースは使用されませんが、リンクリストが作成され、ローカルファイルに保存されます。
- リンクリストを使用するプロセスでは、動的メモリの適用と解放が関係します。
- 私は人生で初めて、ひどいセグメンテーションフォルトとセグフォルトを防ぐ良い習慣に気づき始めました。
2.コード
プロジェクトコードのダウンロードアドレス:https : //github.com/Kshine2017/My_GCC/tree/master/lottery_Kshine201708
プロジェクトディレクトリは次のとおりです。
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
いくつかのファイルまたは関数を取得し、簡単な表示分析を行います。
- udrl.c(右上から左下)
#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;
}
fun.cファイル内
- //入力値をブロックします
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;
}
- //検証コード
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.コンパイルして実行する
makefileはプロジェクトに書き込まれ、ユーザーは直接makeまたは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.ディスプレイを実行する
ようこそ画面:
主なインターフェース:
ユーザーログイン:
ユーザーインターフェース
ユーザー閲覧履歴
公証インターフェース:
管理者インターフェース:
管理者ユーザーの並べ替え:
その他の情報インターフェース:
基本情報はテキスト情報です。アイコンは起動画面です。QRコードは、退屈して組織のURLを変換したQRコードの画像です。(ユーザーは自分のニーズに応じて画像を配列に変換し、ここでそれらを置き換えることができます)。端末はピクセルを表すために単一の文字を使用するため、パターンが形を崩さないようにするために、画像は非常に大きくなります。これも端末表示の欠点の1つです。表示されたQRコードを表示してみましょう。
自分で発見して改善する必要があるいくつかの機能もあります。