一个简单的体育彩票模拟机与分析机

本文介绍了一个彩票软件的菜单系统及核心功能实现,包括随机数生成、数据分析、历史数据导入等功能。该系统支持不同类型的彩票玩法,并提供了一系列工具帮助用户进行数据分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
* Copyright (C) 2010 Schux
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stdarg.h>

#define MENU_CHOICE_SIZE 32
#define SIZE 36

/*菜单系统*/
void inlet ( void );/*主菜单,系统接口*/
void menu ( int sub_Num, char *sub_nameSPtr[ ], void ( *sub_codeFunc[ ] )( void ) );/*菜单*/
void subMenu ( int choice_Num, char *name_SPtr );/*菜单子项目名称*/
void subMenuCode ( void ( *code_Func )( void ) );/*菜单子项目执行代码*/

/*功能函数*/
FILE *openFile ( const char *fn, const char *mode );/*打开文件*/
void swap ( int *num_1, int *num_2 );/*数据交换*/
void bubble ( int *array, int array_size );/*冒泡升值排序*/

void randNum ( int *rand_stor, int n, int m );/*m<=n<=SIZE,产生随机数组rand_stor*/
void readNum ( FILE *read_stream, int *storage_fa, int storage_fa_size );/*从文件读出一组数组并存入storage_fa数组*/
void useNum ( int *old_a, int old_a_size, int *new_a );/*去掉old_a第一个元素存入new_a*/
long int assignPos ( FILE *pos_stream );/*获得特定条件的文件指针位置*/
void myScanf ( int *sNum, char *pStr );/*有条件地输入数据*/

/*规则定制*/
int recur ( int *recur_a1, int recur_a1_size, int *recur_a2, int recur_a2_size );/*重码*/
void recurNum ( int same_num, const char *obj_fn, int *obj_a, int obj_n, int obj_m );/*从目标文件读入数据比较,限定重码个数*/
int even ( int *even_a, int even_size );/*奇偶*/
int sum ( int *sum_a, int sum_size );/*总和*/
int difference ( int *diff_a, int diff_a_size );/*最大号与最小号差*/
int connect ( int *conn_a, int conn_a_size );/*连号*/
int finalRecur ( int *finalR_a, int finalR_a_size );/*尾数重号*/

/*所有规则应用*/

/*任选even,sum,difference,connect,finalRecur组合,满足最小界线*/
int rulesMin ( int *min_arg, int min_arg_size, int min_num, ... );

/*任选even,sum,difference,connect,finalRecur组合,满足最大界线*/
int rulesMax ( int *max_arg, int max_arg_size, int max_num, ... );


/*主菜单子项执行代码*/
void choose36 ( void );
void choose31 ( void );
void choose22 ( void );
void extend ( void );/*预留程序扩展功能*/

/*一级子菜单子项执行代码*/
void back ( void );/*返回主菜单*/

void random36 ( void );
void analyze36 ( void );
void import36 ( void );
void manualImport36 ( void );

void random31 ( void );
void analyze31 ( void );
void import31 ( void );
void manualImport31 ( void );

void random22 ( void );
void analyze22 ( void );
void import22 ( void );
void manualImport22 ( void );

void myRand ( const char *random_fn, int random_n, int random_m );/*按照特定条件产生随机数*/
void analyze ( const char *analyze_fn, int analyze_n, int analyze_m );/*分析工具*/
void import ( const char *import_fn, int import_n, int import_m );/*数据采集*/
void manualImport ( const char *manual_fn, int manual_n, int manual_m );/*手动输入参数产生随机数*/

void about ( void );/*程序说明*/
void quit ( void );/*退出程序*/



int main ()
{
    inlet();
    return 0;

}/*end main*/

void inlet ( void )
{
    char *str[ ] = { "/"36/" chooses /"7/".", "/"31/" chooses /"7/".", "/"22/" chooses /"5/".", "Extend.", "About.", "Quit." };/*子菜单名称*/
    void ( *myFunc[ ] )( void ) = { choose36, choose31, choose22, extend, about, quit };/*子菜单执行代码*/

    printf( "/nThe raffle ticket software menu: /n/n" );
    menu( 6, str, myFunc );

}/*end  inlet*/

void menu ( int sub_Num, char *sub_nameSPtr[ ], void ( *sub_codeFunc[ ] )( void ) )
{
    int counts, choice;
    char choice_Str[ MENU_CHOICE_SIZE ];

    for ( counts = 0; counts < sub_Num; counts++ )
        {
            subMenu( counts, sub_nameSPtr[ counts ] );
        }

    printf( "/n/tchoice: " );
    fgets( choice_Str, MENU_CHOICE_SIZE, stdin );
    choice = atoi( choice_Str );

    if ( 0 < choice && choice <= sub_Num )
        {
            subMenuCode( sub_codeFunc[ choice - 1 ] );
        }
    else
        {
            menu( sub_Num, sub_nameSPtr, sub_codeFunc );
        }/*end if*/

}/*end menu*/

void subMenu ( int choice_Num, char *name_SPtr )
{
    printf( "/t%d. %s/n", choice_Num + 1, name_SPtr );
}

void subMenuCode ( void ( *code_Func )( void ) )
{
    ( *code_Func )();
}


FILE *openFile ( const char *fn, const char *mode )
{
    FILE *streamFPtr;

    if( ( streamFPtr = fopen( fn, mode ) ) == NULL )
        {
            printf( "Error! Can't open the <%s> file!/n", fn );
            exit( 0 );
        }

    return streamFPtr;

}/*end openFile*/

void swap ( int *num_1, int *num_2 )
{
    int temp;

    temp = *num_1;
    *num_1 = *num_2;
    *num_2 = temp;

}/*end swap*/

void bubble ( int *array, int array_size )
{
    int i, j;

    for ( i = 0; i < array_size - 1; i++ )
        {
            for ( j = i + 1; j < array_size; j++ )
                {
                    if ( array[ i ] > array[ j ] )
                        {
                            swap( &array[ j ], &array[ i ] );
                        }
                }/*end for*/
    }/*end for*/

}/*end bubble*/

/*产生m个整数值从1-n的随机数*/
void randNum ( int *rand_stor, int n, int m )
{
    int i, j;
    int logic;

    srand( time( NULL ) );

    for ( i = 0; i < m; i++ )
        {
            do
                {
                    logic = 0;
                    rand_stor[ i ] = rand() % n + 1;/*产生1-n的随机整数*/

                    for ( j = 0; j < i; j++ )
                        {
                            if ( rand_stor[ j ] == rand_stor[ i ] )
                                {
                                    logic = 1;
                                    break;
                                }
                        }/*end for*/
                } while ( logic );
        }/*end for*/

}/*end randNum*/

void readNum ( FILE *read_stream, int *storage_fa, int storage_fa_size )
{
    int i;

    for( i = 0; i < storage_fa_size; i++ )
        {
            if( fscanf( read_stream, "%d", &storage_fa[ i ] ) == EOF )
                {
                    return;
                }
        }/*end for*/

}/*end readNum*/

void useNum ( int *old_a, int old_a_size, int *new_a )
{
    int i;

    for ( i = 0; i < old_a_size; i++ )
        {
            new_a[ i ] = old_a[ i + 1 ];
        }

}/*end useNum*/

long int assignPos ( FILE *pos_stream )
{
    long int pos;
    int i = 0, j = 0;

    /*统计回车个数*/
    rewind( pos_stream );
    while( !feof( pos_stream ) )
        {
            if( fgetc( pos_stream ) == '/n' )
            j = i++;
        }/*end while*/

    /*定位倒数第二个回车的文件指针*/
    i = 0;
    rewind( pos_stream );
    while( !feof( pos_stream ) )
        {
            if( fgetc( pos_stream ) == '/n' )
                {
                    if ( j - 1 == i )
                        pos = ftell( pos_stream );
                    i++;
                }
        }/*end while*/

    return pos;

}/*end assignPos*/

void myScanf ( int *sNum, char *pStr )
{
    char choice_Str[ MENU_CHOICE_SIZE ];

    fprintf( stdout, "%s: ", pStr );
    fgets( choice_Str, MENU_CHOICE_SIZE, stdin );
    *sNum = atoi( choice_Str );

}/*end myScanf*/


int recur ( int *recur_a1, int recur_a1_size, int *recur_a2, int recur_a2_size )
{
    int i, j, counts = 0;

    for ( i = 0; i < recur_a1_size; i++ )
        {
            for ( j = 0; j < recur_a2_size; j++ )
                {
                    if ( recur_a1[ i ] == recur_a2[ j ] )
                    {
                        counts++;
                    }
                }/*end for*/
        }/*end for*/

    return counts;

}/*end recur*/

void recurNum ( int same_num, const char *obj_fn, int *obj_a, int obj_n, int obj_m )
{
    int i;
    int read_num[ SIZE ];
    int use_num[ SIZE ];
    FILE *stream;

    stream = openFile( obj_fn, "rb" );
    fseek( stream, assignPos( stream ), SEEK_SET );
    readNum( stream, read_num, obj_m + 2 );
    useNum( read_num, obj_m + 2, use_num );

    do
        {
            randNum( obj_a, obj_n, obj_m );
        } while ( recur( obj_a, obj_m, use_num, obj_m + 1 ) < same_num );

    printf( "/nthis is <%d> lottery:/n/n/t-- ", read_num[ 0 ] );
    for ( i = 1; i < obj_m + 2; i++ )
        printf( "%d ", read_num[ i ] );

    printf( "--/n/n" );
    fclose( stream );

}/*end recurNum*/

int even ( int *even_a, int even_size )
{
    int i, counts = 0;

    for ( i = 0; i < even_size; i++ )
        {
            if ( even_a[ i ] % 2 == 0 )
            {
                counts++;
            }
        }/*end for*/

    return counts;

}/*end even*/

int sum ( int *sum_a, int sum_size )
{
    int i, array_sum = 0;

    for ( i = 0; i < sum_size; i++ )
        {
            array_sum += sum_a[ i ];
        }/*end for*/

    return array_sum;

}/*end sum*/

int difference ( int *diff_a, int diff_a_size )
{
    bubble( diff_a, diff_a_size );
    return diff_a[ diff_a_size - 1 ] - diff_a[ 0 ];

}/*end difference*/

int connect ( int *conn_a, int conn_a_size )
{
    int i, counts = 0;

    bubble( conn_a, conn_a_size );

    for ( i = 0; i < conn_a_size - 1; i++ )
        {
            if ( conn_a[ i + 1 ] - conn_a[ i ] == 1 )
                {
                    counts++;
                }
        }/*end for*/

    return counts;

}/*end connect*/

int finalRecur ( int *finalR_a, int finalR_a_size )
{
    int i, j, counts = 0;

    for ( i = 0; i < finalR_a_size - 1; i++ )
        {
            for ( j = i + 1; j < finalR_a_size; j++ )
                {
                    if ( finalR_a[ i ] % 10  == finalR_a[ j ] % 10 )
                        {
                            counts++;
                        }
                }
        }/*end for*/

    return counts;

}/*end finalRecur*/


int rulesMin ( int *min_arg, int min_arg_size, int min_num, ... )
{
    int i, logic = 0, min_first;
    va_list argument_list;
    va_start( argument_list, min_num );

    for ( i = 0; i < min_num; i++ )
        {
            logic = 0;
            min_first = va_arg( argument_list, int );

            switch ( i )
                {
                    case 0:
                        if ( even( min_arg, min_arg_size ) >= min_first )  logic = 1;
                        break;
                    case 1:
                        if ( sum( min_arg, min_arg_size ) >= min_first )  logic = 1;
                        break;
                    case 2:
                        if ( difference( min_arg, min_arg_size ) >= min_first )  logic = 1;
                        break;
                    case 3:
                        if ( connect( min_arg, min_arg_size ) >= min_first )  logic = 1;
                        break;
                    case 4:
                        if ( finalRecur( min_arg, min_arg_size ) >= min_first )  logic = 1;
                        break;
                    default:
                        logic = 0;
                        break;
                }/*end switch*/

            if ( 0 == logic )
            break;

        }/*end for */

    va_end( argument_list );

    return logic;

}/*end rulesMin*/

int rulesMax ( int *max_arg, int max_arg_size, int max_num, ... )
{
    int i, logic = 0, max_first;
    va_list argument_list;
    va_start( argument_list, max_num );

    for ( i = 0; i < max_num; i++ )
        {
        logic = 0;
        max_first = va_arg( argument_list, int );

        switch ( i )
            {
                case 0:
                    if ( even( max_arg, max_arg_size ) <= max_first )  logic = 1;
                    break;
                case 1:
                    if ( sum( max_arg, max_arg_size ) <= max_first )  logic = 1;
                    break;
                case 2:
                    if ( difference( max_arg, max_arg_size ) <= max_first )  logic = 1;
                    break;
                case 3:
                    if ( connect( max_arg, max_arg_size ) <= max_first )  logic = 1;
                    break;
                case 4:
                    if ( finalRecur( max_arg, max_arg_size ) <= max_first )  logic = 1;
                    break;
                default:
                    logic = 0;
                    break;
            }/*end switch*/

        if ( 0 == logic )
        break;

    }/*end for */

va_end( argument_list );

return logic;
}/*end rulesMax*/


void choose36 ( void )
{
    char *str[ ] = { "Random new data.", "Analyse an implement.", "Manual Import argument.", "Import history data.", "Back.", "Quit." };
    void ( *myFunc[ ] )( void ) = { random36, analyze36, manualImport36, import36, back, quit };

    printf( "/n/"36/" chooses /"7/" menu: /n/n" );
    menu( 6, str, myFunc );
}/*end choose36*/

void choose31 ( void )
{
    char *str[ ] = { "Random new data.", "Analyse an implement.", "Manual Import argument.", "Import history data.", "Back.", "Quit." };
    void ( *myFunc[ ] )( void ) = { random31, analyze31, manualImport31, import31, back, quit };

    printf( "/n/"31/" chooses /"7/" menu: /n/n" );
    menu( 6, str, myFunc );
}/*end choos31*/

void choose22 ( void )
{
    char *str[ ] = { "Random new data.", "Analyse an implement.", "Manual Import argument.", "Import history data.", "Back.", "Quit." };
    void ( *myFunc[ ] )( void ) = { random22, analyze22, manualImport22, import22, back, quit };

    printf( "/n/"22/" chooses /"5/" menu: /n/n" );
    menu( 6, str, myFunc );
}/*end choose22*/

void extend ( void )
{
    printf( "this is a extend of software./n" );
    inlet();
}/*end extend*/

void back ( void )
{
    inlet();
}


void random36 ( void )
{
    myRand( "lottery36.dat", 36, 7 );
    choose36();
}/*end myRand*/

void analyze36 ( void )
{
    analyze( "lottery36.dat", 36, 7 );
    choose36();
}/*end analyze36*/

void import36 ( void )
{
    import( "lottery36.dat", 36, 7 );
    choose36();
}/*end import36*/

void manualImport36 ( void )
{
    manualImport( "lottery36.dat", 36, 7 );
    choose36();
}/*end manualImport36*/


void random31 ( void )
{
    myRand( "lottery31.dat", 31, 7 );
    choose31();
}/*end random31*/

void analyze31 ( void )
{
    analyze( "lottery31.dat", 31, 7 );
    choose31();
}/*end analyze31*/

void import31 ( void )
{
    import( "lottery31.dat", 31, 7 );
    choose31();
}/*end import31*/

void manualImport31 ( void )
{
    manualImport( "lottery36.dat", 31, 7 );
    choose31();
}/*end manualImport31*/


void random22 ( void )
{
    myRand( "lottery22.dat", 22, 5 );
    choose22();
}/*end randmo22*/

void analyze22 ( void )
{
    analyze( "lottery22.dat", 22, 5 );
    choose22();
}/*end analyze22*/

void import22 ( void )
{
    import( "lottery22.dat", 22, 5 );
    choose22();
}/*end import22*/

void manualImport22 ( void )
{
    manualImport( "lottery22.dat", 22, 5 );
    choose22();
}/*end manualImport22*/


void myRand ( const char *random_fn, int random_n, int random_m )
{
    int i;
    int rulesMin_num = 0, rulesMax_num = 0;
    int random_a[ SIZE ];
    clock_t endtime;

    do
        {
            recurNum( 1, random_fn, random_a, random_n, random_m );
            for( i = 0; i < random_m; i++ )
            printf( "%d ", random_a[ i ] );
            printf( "/n/n" );
            endtime = clock() + CLOCKS_PER_SEC / 1000;/*CLOCKS_PER_SEC = one second*/
            while( endtime > clock() );

            rulesMin_num = rulesMin( random_a, random_m, 5, 2, random_n * 3, random_n / 3, 1, 1 );
            rulesMax_num = rulesMax( random_a, random_m, 5, 6, random_n * 5, random_n - 1, 3, 2 );
        } while ( rulesMin_num == 0 || rulesMax_num == 0 );

    printf( "/nThe result of /"%d/" chooses /"%d/" :/n/n/n/t---/t", random_n, random_m );
    for ( i = 0; i < random_m; i++ )
    printf( " %d ", random_a[ i ] );
    printf( "/t---/n/n" );

}/*end myRand*/

void analyze ( const char *analyze_fn, int analyze_n, int analyze_m )
{
    int i;
    int read_num_0[ SIZE ], use_num_0[ SIZE ];
    int read_num_1[ SIZE ], use_num_1[ SIZE ];
    fpos_t pos;

    FILE *stream;

    stream = openFile( analyze_fn, "rb" );
    rewind( stream );

    while( !feof( stream ) )
        {
            readNum( stream, read_num_0, analyze_m + 2 );/*涉及文件指针移动函数*/
            useNum( read_num_0, analyze_m + 2, use_num_0 );

            fgetpos( stream, &pos );/*取当前文件指针位置*/
            if ( !feof(stream) )
                {
                    readNum( stream, read_num_1, analyze_m + 2 );
                    useNum( read_num_1, analyze_m + 2, use_num_1 );

                    fsetpos( stream, &pos );/*置当前指针位置,指针后退*/

                    printf( "/n%d: ", read_num_1[ 0 ] );
                    for( i = 1; i < analyze_m + 2; i++ )
                        {
                            printf( "%02d ", read_num_1[ i ] );
                        }
                    printf( "rec(%d) ", recur( use_num_0, analyze_m + 1, use_num_1, analyze_m + 1 ) );
                    printf( "eve(%d) ", even( use_num_1, analyze_m + 1 ) );
                    printf( "sum(%03d) ", sum( use_num_1, analyze_m + 1 ) );
                    printf( "dif(%02d) ", difference( use_num_1, analyze_m + 1 ) );
                    printf( "con(%d) ", connect( use_num_1, analyze_m + 1 ) );
                    printf( "fin(%d) ", finalRecur( use_num_1, analyze_m + 1 ) );
                }

        }/*end while*/

    fclose( stream );
    printf( "/n" );

}/*end analyze*/

void import ( const char *import_fn, int import_n, int import_m )
{
    char write_Str[ MENU_CHOICE_SIZE ];
    int i, write_num;
    FILE *write_stream;

    write_stream = openFile( import_fn, "ab" );

    printf( "Please input the date: " );
    fgets( write_Str, MENU_CHOICE_SIZE, stdin );
    write_num = atoi( write_Str );
    fprintf( write_stream, "%d ", write_num );

    for( i = 0; i <= import_m; i++ )
        {
            printf( "Please input the lottery <%d> num: ", i + 1 );
            do
                {
                    fgets( write_Str, MENU_CHOICE_SIZE, stdin );
                    write_num = atoi( write_Str );

                    if ( write_num > import_n || write_num < 0 )
                    printf( "please input again: " );
                } while ( write_num > import_n || write_num < 0 );

            fprintf( write_stream, "%d ", write_num );

        }/*end for*/

    fprintf( write_stream, "/n" );
    fclose( write_stream );

}/*end import*/

void manualImport ( const char *manual_fn, int manual_n, int manual_m )
{
    int i;
    int rulesMin_num = 0, rulesMax_num = 0;
    int random_a[ SIZE ];
    clock_t endtime;

    int same_num = 0;
    int even_min = 0, sum_min = 0, diff_min = 0, conn_min = 0, recur_min = 0;
    int even_max = 5, sum_max = 231, diff_max = 35, conn_max = 6, recur_max = 5;

    myScanf( &same_num, "Please inmport same_num" );
    myScanf( &even_min, "Please inmport even_min" );
    myScanf( &even_max, "Please inmport even_max" );
    myScanf( &sum_min, "Please inmport sum_min" );
    myScanf( &sum_max, "Please inmport sum_max" );
    myScanf( &diff_min, "Please inmport difference_min" );
    myScanf( &diff_max, "Please inmport difference_max" );
    myScanf( &conn_min, "Please inmport connect_min" );
    myScanf( &conn_max, "Please inmport connect_max" );
    myScanf( &recur_min, "Please inmport finalRecur_min" );
    myScanf( &recur_max, "Please inmport finalRecur_max" );

    do
        {
            recurNum( same_num, manual_fn, random_a, manual_n, manual_m );
            for( i = 0; i < manual_m; i++ )
            printf( "%d ", random_a[ i ] );
            printf( "/n/n" );
            endtime = clock() + CLOCKS_PER_SEC / 1000;/*CLOCKS_PER_SEC = one second*/
            while( endtime > clock() );

            rulesMin_num = rulesMin( random_a, manual_m, 5, even_min, sum_min, diff_min, conn_min, recur_min );
            rulesMax_num = rulesMax( random_a, manual_m, 5, even_max, sum_max, diff_max, conn_max, recur_max );
        } while ( rulesMin_num == 0 || rulesMax_num == 0 );

    printf( "/nThe result of /"%d/" chooses /"%d/" :/n/n/n/t---/t", manual_n, manual_m );
    for ( i = 0; i < manual_m; i++ )
    printf( " %d ", random_a[ i ] );
    printf( "/t---/n/n" );

}/*end manualImport*/

void about ( void )
{
    printf( "/n  The software copyright belongs to /"schux/" company. Authorize the approach not to at will, spreading or applying to commerce without our company./n" );

    inlet();

}/*end about*/

void quit ( void )
{
    exit( 0 );
}/*end quit*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值