quarta-feira, 21 de janeiro de 2015

Gerando seriais com estruturas

Este gerador de seriais  apesar da simplicidade é bem interessante,
Uma cadeia numérica em sequência, não ordenada é copiada pela função
strcpy(); numa variável do tipo char alocada dinamicamente, e são passadas como Parâmetros para a função onde será utilizada.
O mesmo procedimento ocorre com a variável str.
Um menu de quatro opções é invocado pela função main(); onde a escolha tem que ser certa pra não ser reprovado pelo programa.
Porém o maior destaque é o fato dos códigos serem guardados em posições de um vetor de estrutura, sendo que estabeleci limites, observe que o programa não aceita que se guarde um código numa posição ocupada, nem tão pouco aceita que se guarde um serial numa posição acima de sete, friso ainda que se não for gerado nenhum codigo, e se tentar fazer leitura, o programa mostra a seguinte mensagem:
"Nada cadastrado neste código".
Este programa abre muitas portas de idéias para aperfeiçoamento, uma das idéias por exemplo seria guardar os códigos num arquivo, e depois fazia a leitura normalmente.

Veja abaixo imagens do programa em execução:











Veja abaixo o código do programa:

#include <stdio.h>
#include <conio.h>
struct Estrutura_Serial {
    int cod;
    int serial [ 20 ];
    char ser_min [ 26 ];
    char ser_mai [ 26 ];
    char ser_emb [ 26 ];
}Ser_ial [ 8 ];int codigo, num;
void Janela5(){
    int lin, col;
    for ( lin = 0; lin <= 25; lin++ ){
        for ( col = 0; col <= 80; col++ ){
            gotoxy( col, lin );
            if ( lin == 2 ){textattr ( 200 );printf( " ");}
            if ( col == 1 ){textattr ( 200 );printf(" ");}
            if ( col == 80 ){textattr ( 200 );printf(" ");}
        }
    }textattr ( 4 );
}
int continuando ( ){
    system ("title GERANDO SERIAIS COM ESTRUTURAS");
    int nr; do{system("cls");system("Color 50");Janela5();
    textcolor(LIGHTRED);gotoxy(28,5);printf("GERANDO SERIAIS COM ESTRUTURAS");
    textcolor(BROWN);gotoxy(25,7);printf("Programa desenvolvido por:");
    textcolor(WHITE);gotoxy(52,7);printf("Samuel Lima");
    textcolor(BLUE);gotoxy(34,9);printf("sa_sp10@hotmail.com");
    textcolor(LIGHTBLUE);gotoxy(23,11);printf ("Digite ");
    textcolor(LIGHTRED);printf (" 0 ");
    textcolor(LIGHTBLUE);printf (" para sair ou ");
    textcolor(LIGHTRED);printf (" 1 ");
    textcolor(LIGHTBLUE);printf (" para continuar ");
    textcolor(LIGHTRED);gotoxy(24,13);
    scanf ( "%d", &nr );fflush(stdin);
    if( nr == 0 ){
        textcolor(LIGHTRED);gotoxy(36,18);printf("MUITO OBRIGADO");
        getche();exit(0);
    }
    else if( nr == 1 ){
        return 1;
    }
    textcolor(YELLOW);gotoxy(36,16);printf ("\aopcão errada!");
    getche();
    }while ( 1 );
    return 1;
}
int main( void );
int Gera_Serial_Numerico ( char *Num, char* str, char *str1, char *str2 );
int Gera_Serial_Alfabetico ( char *Num, char* str, char *str1, char *str2 ){
    int i, j;clrscr ();system("Color 60");Janela5();
    textcolor(LIGHTRED);gotoxy(28,3);printf("GERANDO SERIAIS COM ESTRUTURAS");
    textcolor(LIGHTBLUE);gotoxy(28,5);printf("Gerando seriais alfabético" );
    textcolor(LIGHTBLUE);gotoxy(28,7);printf("Quantos caracteres terá seu serial ? ");
    textcolor(LIGHTRED);gotoxy(28,9);scanf("%d", &num );
    gotoxy(28,9);clreol();fflush(stdin);
    while ( num < 6 || num > 26 ){
        textcolor(LIGHTRED);gotoxy(23,9);
        printf("\aNúmeros Acima de 6 e menor que 26" );
        getche();Gera_Serial_Alfabetico ( Num, str, str1, str2 );clrscr ();
    }
    do{textcolor(LIGHTBLUE);gotoxy(10,9);
    printf("Digite um código entre [ 1 e 7 ] ou [ 0 ] para voltar ao menu");
    textcolor(LIGHTRED);gotoxy(40,11);scanf ( "%d",&codigo );
    gotoxy(40,11);clreol();fflush ( stdin );
    if ( codigo == 0 ){main();}
    if ( codigo < 1 || codigo > 7 ){
        textcolor(YELLOW);gotoxy(35,15); printf("\aCódigo inválido !");
        getche();clrscr ();
    }else{
        if( Ser_ial [ codigo ].cod != '\0' ){
            textcolor(YELLOW);gotoxy(35,15); printf("\aPosição ocupada !");
            getche();Gera_Serial_Alfabetico ( Num, str, str1, str2 );clrscr ();
        }
    }
    }while ( codigo < 1 || codigo > 7 );
    Ser_ial [ codigo ] . cod = codigo;
    for ( i = 0; i < num; i++ ){;
    Ser_ial [ codigo ] . ser_mai [ i ] = str [ i ];
    strcpy( str1, str );
    }
    strlwr ( str1 )  ;
    for ( i = 0; i < num; i++ ){
        Ser_ial [ codigo ] . ser_min [ i ] = str1 [ i ];
        strcpy( str2,  str1 );
    }
    strupr ( str1 );strlwr ( str2 );
    strcat( str1,  str2 );
    for ( i = 0; i < num; i++ ){
        j = i + rand() % ( strlen( str1 ) - i  );
        char t = str1 [ j ];
        str1 [ j ] = str1 [ i ];
        str1 [ i ] = t;
    }
    strcat( Num,  str1 );
    for ( i = 0; i < num; i++ ){
        j = i + rand() % ( strlen( Num ) - i  );
        char t = Num [ j ];
        Num [ j ] = Num [ i ];
        Num [ i ] = t;
    }
    for ( i = 0; i < num; i++ ){
        Ser_ial [ codigo ] . ser_emb [ i ] = Num [ i ];
    }
    textcolor(YELLOW);gotoxy(30,15);printf("Serial gerado com sucesso ");
    getche();return main();
}
int Gera_Serial_Numerico ( char *Num, char* str, char *str1, char *str2 ){
    int i, j;
    clrscr ();system("Color 70");Janela5();
    textcolor(LIGHTRED);gotoxy(28,3);printf("GERANDO SERIAIS COM ESTRUTURAS");
    textcolor(LIGHTBLUE);gotoxy(28,5);printf("Gerando seriais numérico" );
    textcolor(LIGHTBLUE);gotoxy(28,7);printf("Quantos dígitoss terá seu serial ? ");
    textcolor(LIGHTRED);gotoxy(28,9);scanf("%d", &num );fflush(stdin);
    while ( num < 6 || num > 20 ){
        textcolor(LIGHTRED);gotoxy(28,9);
        printf("\aNúmeros Acima de 6 e menor que 20" );
        getche();Gera_Serial_Numerico ( Num, str, str1, str2 );clrscr ();
    }
    do{textcolor(LIGHTBLUE);gotoxy(10,9);
    printf("Digite um código entre [ 1 e 7 ] ou [ 0 ] para voltar ao menu");
    textcolor(LIGHTRED);gotoxy(40,11);scanf ( "%d",&codigo );
    gotoxy(40,11);clreol();fflush ( stdin );
    if ( codigo == 0 ){main();}
    if ( codigo < 1 || codigo > 7 ){
        textcolor(YELLOW);gotoxy(35,15); printf("\aCódigo inválido !");
        getche();clrscr ();
    }else{
        if( Ser_ial [ codigo ].cod != '\0' ){
            textcolor(YELLOW);gotoxy(35,15); printf("\aPosição ocupada !");
            getche();Gera_Serial_Numerico ( Num, str, str1, str2 );clrscr ();
        }
    }
    }while ( codigo < 1 || codigo > 7 );
    Ser_ial [ codigo ] . cod = codigo;
    for (i = 0; i < num; i++ ){
        j = i + rand() %  ( strlen ( Num ) - i );
        char t = Num [ j ];
        Num [ j ] = Num [ i ];
        Num [ i ] = t;
    }
    for ( i = 0; i < num; i++ ){
        Ser_ial [ codigo ] . serial [ i ] = Num [ i ];
    }
    textcolor(YELLOW);gotoxy(30,15);printf("Serial gerado com sucesso ");
    getche();return main();
}
int Lista_Serial ( char *Num, char* str, char *str1, char *str2 ){
    int i, o = 0, q = 0, s = 0;char palavra [ 12 ];
    do{clrscr ();system("Color 80");Janela5();
    textcolor(LIGHTRED);gotoxy(28,3);printf("GERANDO SERIAIS COM ESTRUTURAS");
    textcolor(LIGHTBLUE);gotoxy(35,5);printf("Listando seriais" );
    textcolor(LIGHTBLUE);gotoxy(10,7);
    printf("Digite um código entre [ 1 e 7 ] ou [ 0 ] para voltar ao menu" );
    textcolor(LIGHTRED);gotoxy(40,11);scanf ( "%d",&codigo );
    gotoxy(40,11);clreol();fflush ( stdin );
    if ( codigo == 0 ){main();}
    if ( codigo < 1 || codigo > 7 ){
        textcolor(YELLOW);gotoxy(35,11); printf("\aCódigo inválido !");
        getche();clrscr ();
    }
    }while ( codigo < 1 || codigo > 7 );
    if( Ser_ial [ codigo ].cod != '\0' ){}
    else{
        textcolor(YELLOW);gotoxy(29,11); printf("\aNada cadastrado neste código !");
        getche();Lista_Serial ( Num, str, str1, str2 );
    }
    textcolor(LIGHTBLUE);gotoxy(10,9);
    printf("Digite agora o nome do serial que deseja visualizar :" );
    gotoxy(10,10);printf("As opções para os seriais são : ");
    textcolor(LIGHTBLUE);gotoxy(10,12);
    printf("[ Num ] [ Min ] [ Mai ] [ Emb ] " );
    textcolor(LIGHTRED);gotoxy(10,14);gets ( palavra );
    gotoxy(10,14);clreol();fflush ( stdin );
    if ( Ser_ial [codigo] . cod != '\0' ){
        if( strcmp ( palavra,"Num" ) == 0 ){
            if ( *Ser_ial [ codigo ] . serial >= 46 && *Ser_ial [ codigo ] . serial <= 60 ){
                textcolor(LIGHTCYAN);gotoxy(10,14);printf( "Abaixo o serial numérico guardado na posição %d ", codigo );
                gotoxy(5,16);textcolor(LIGHTRED);
                for ( i = 0; i <= num; i++ ){
                    printf(" %c ", Ser_ial [ codigo ] . serial [ i ] );
                }
            }
            if ( *Ser_ial [ codigo ] . serial == 0 ){
                textcolor(LIGHTCYAN);gotoxy(18,14);printf("Não há serial numérico nesta posição ");
            }
        }
        if( strcmp ( palavra,"Min" ) == 0 ){
            if ( *Ser_ial [ codigo ] . ser_min >= 50 && *Ser_ial [ codigo ] . ser_min <= 122 ){
                textcolor(LIGHTCYAN);gotoxy(10,14);printf( "Abaixo o serial minúsculo guardado na posição %d ", codigo );
                gotoxy(5,16);textcolor(LIGHTRED);
                for ( q = 0; q < num; q++ ){
                    printf(" %c ", Ser_ial [ codigo ] . ser_min [ q ] );
                }
            }
            if ( *Ser_ial [ codigo ] . ser_min == 0 ){
                textcolor(LIGHTCYAN);gotoxy(18,14);printf("Nenhum serial minúsculo foi gerado ");
            }
        }
        if( strcmp ( palavra,"Mai" ) == 0 ){
            if ( *Ser_ial [ codigo ] . ser_mai >= 46 && *Ser_ial [ codigo ] . ser_mai <= 122 ){
                textcolor(LIGHTCYAN);gotoxy(10,14);printf( "Abaixo o serial maiúsculo guardado na posição %d ", codigo );
                gotoxy(5,16);textcolor(LIGHTRED);
                for ( o = 0; o < num; o++ ){
                    printf(" %c ", Ser_ial [ codigo ] . ser_mai [ o ] );
                }
            }
            if ( *Ser_ial [ codigo ] . ser_mai == 0 ){
                textcolor(LIGHTCYAN);gotoxy(18,14);printf("Nenhum serial maiúsculo foi gerado ");
            }
        }
        if( strcmp ( palavra,"Emb" ) == 0 ){
            if ( *Ser_ial [ codigo ] . ser_emb >= 46 && *Ser_ial [ codigo ] . ser_emb <= 122 ){
                textcolor(LIGHTCYAN);gotoxy(10,14);printf( "Abaixo o serial guardado na posição %d ", codigo );
                gotoxy(5,16);textcolor(LIGHTRED);
                for ( s = 0; s < num; s++ ){
                    printf(" %c ", Ser_ial [ codigo ] . ser_emb [ s ] );
                }
            }
            if ( *Ser_ial [ codigo ] . ser_emb == 0 ){
                textcolor(LIGHTCYAN);gotoxy(10,14);printf("Nenhum serial maiúsculo com minúsculo foi gerado ");
            }
        }
        Sleep(1000);textcolor(YELLOW);gotoxy(30,22);printf("PRESSIONE QUALQUER TECLA");
        getche ();clrscr ();main();
    }
    return (0);
}
int main( void ) {
    continuando ( );
    int j = 0, size = 20;int si_ze = 27;
    char *Num;
    Num  = ( char* ) malloc ( size *sizeof ( char* ) );
    strcpy ( Num,"71846039257184603925" );
    char *str;
    str  = ( char* ) malloc ( si_ze *sizeof ( char* ) );
    strcpy(str,"YTAPLZHNCXWJDZFSIRKBOUEQVMG");
    char str1 [ 20 ];
    char str2 [ 20 ];
    do{system("cls");system("Color 90");Janela5();
    textcolor(LIGHTRED);gotoxy(28,3);printf("GERANDO SERIAIS COM ESTRUTURAS");
    textcolor(LIGHTBLUE);gotoxy(29,5); printf("ESCOLHA UMA OPCÃO ABAIXO");
    gotoxy(28,7);printf("1 - Gerar seriais Numérico");
    gotoxy(28,9);printf("2 - Gerar seriais Alfabético");
    gotoxy(28,11);printf("3 - Verificar seriais gerados");
    gotoxy(28,13);printf("4- Sair");
    textcolor(LIGHTRED);gotoxy(28,15);scanf("%d", &j );
    gotoxy(28,15);clreol();fflush ( stdin );
    if ( j == 1 ) {  system("cls");Gera_Serial_Numerico ( Num, str, str1, str2 ); }
    if ( j == 2 ) {  system("cls");Gera_Serial_Alfabetico ( Num, str, str1, str2 ); }
    if ( j == 3 ) {  system("cls");Lista_Serial ( Num, str, str1, str2 ); }
    if ( j == 4 ) {  textcolor(LIGHTRED);gotoxy(36,18);
    printf("MUITO OBRIGADO");getche();exit ( 0 );}
    else {textcolor(LIGHTRED);gotoxy(37,17);
    printf ("\aOpção errada");Sleep(1800);clrscr ();}
    break;
    }while ( 1 );
}