Ir para conteúdo
Fórum Script Brasil

CPP

Membros
  • Total de itens

    117
  • Registro em

  • Última visita

Posts postados por CPP

  1. Quando você escreve um numero comecando com o (zero) está dizendo ao compilador que a base desse numero é octal, ou seja, pode representar numeros de 0 a 7.

    Então você não pode fazer 08 porque vai dar erro.

    Quando quiser representar numeros na base decimal apenas escreva sem o zero na frente, exemplo: 1,2,3...etc

    Em alguns pontos do seu programa você escreveu if terminando com ';' isso causa erro nos blocos de decisão.

    você pode terminar um if com ';', isso não é problema desde que a logica esteja correta.

    Por exemplo:

    Esse if esta errado:

    if ( d==31)
        (d=01, m++);
            printf("A data do proximo dia é: %d/%d/%d", d, m, a);
        else
        (d++);
            printf("A data do proximo dia é: %d/%d/%d", d, m, a);
    O correto seria
    if ( d==31)
           {
           d=01;
           m++;
           printf("A data do proximo dia é: %d/%d/%d", d, m, a);
           }
        else
           {
           (d++);
           printf("A data do proximo dia é: %d/%d/%d", d, m, a);
           }

    Tenta encontrar os outros erros e se precisar de ajuda é só falar.

  2. Pra não aceitar o enter sem ter digitado um numero antes:


    while (tecla != '\r' )
    {
    tecla = getch();
    if (tecla == '\r' && i == 0)
    tecla = 0;
    if (isdigit(tecla) || tecla=='-')
    numero[i++] = tecla;
    }
    }while(atoi(numero) < 0 || atoi(numero) > 100);
    [/codebox]

    numero é um array do tipo char, supondo que o conteudo dela seja "Teste 123" se fizer:

    numero[5] = '-'; você muda o conteudo para "Teste-123" porque escreveu na posição 6 da string;

    Um array em C sempre começa em 0, então a indexação seria:

    0 1 2 3 4 5 6 7 8 9 10 (indice)

    T e s t e - 1 2 4 (conteudo)

    Quando você faz numero[i++] está indicando a posição pelo valor de i.

    Deu pra entender?

  3. Os dois códigos estão bons e funcionam, mas se alguém usar um programa pra gerar o assembly do seu executavel vai pegar a senha facilmente.

    Uma maneira de dificultar a ação de um hacker e não colocar pistas.

    Se eu procurar mensagem (Senha Correta) no codigo vou achar o if e o valor da senha.

    Mas se eu usar variaveis e dificultar o ponto onde vão encontrar as mensagens o invasor vai ter mais dificuldade pra quebrar a segurança.

    Alguns algoritmos de criptografia também podem ajudar a aumentar a segurança, alem de um contador limite de tentativas.

    O codigo abaixo pode ser melhorado em muito.

    Abs


    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #include<math.h>

    int main()
    {
    int resposta = 954;
    char *msg[] = {"Senha Correta!\n\n", "Senha Incorreta\n\n"};
    int status;
    clrscr();
    resposta = 123;
    int senha;
    printf("Entre com a senha:");
    scanf("%d", &senha);
    printf("\nVerificando...\n");
    status = (senha==resposta);
    printf(msg[!status]);
    getch();
    return status;
    }
    [/codebox]

  4. AthosLive,

    Tem mais duas coisas erradas no seu codigo

    pg é um char e você ta usando scanf("%s", &pg);

    Quando você usa %s o scanf vai te retornar a tecla que você pressionou mais o terminar de string (\ 0) e como você alocou apenas um byte (char) está corrompendo a memoria do seu programa.

    O correto é usar scanf("%c", &pg) que vai te retornar apenas um byte.

    O outro erro é que comissão é com dois "s" e não com ç (rs)

    Abs

  5. Athoslive,

    Seu código tá bem confuso cara.

    Tem goto dentro de while e if que não vai fazer exatamente o que você quer.

    Alem do que printf(" o \r", seta + passo); está errado, já que você passou um parametro (seta + passo) sem nenhuma indicação de substituição na string.

    Ou seja tá faltando algum "%<tipo>" dentro da string " o \r";

    O problema acho que tá mais na lógica do que no uso da linguagem.

    Mas vamos lá.


    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <dos.h>
    #include <ctype.h>
    void main()
    {
    char a;
    int col = 10;
    clrscr();
    printf("joguinho lecal , digite D pra > e A pra <");
    printf("\n ");
    printf(" >- ");
    inicio:
    if (kbhit())
    a=tolower(getch());
    if(a=='d')
    {
    gotoxy(col--, 2);
    printf(" o \r");
    if (col == 8)
    a = ' ';
    }
    if(a=='a')
    {
    gotoxy(col++, 2);
    printf(" o \r");
    if (col == 30)
    a = ' ';
    }
    if (a=='e')
    {
    // escreva aqui seu codigo para o tiro

    }
    if(a=='s')
    {
    exit(0);
    }
    delay(50);
    goto inicio;
    }
    [/codebox]

  6. Bom, eu particularmente discordo da questão de usar apenas o que se aprende no curso.

    Desde que você saiba o porque das coisas acho valido usar tudo.

    Mas, sem arrays você pode fazer um scanf("%d", &numero); e depois chamar clrscr(); pra limpar a tela e deixar seguir o fluxo.

    O problema é que os dois usuarios não podem estar na frete do micro nesse momento.

    A funcao isdigit() apenas testa se um caracter é um digito entre 0 e 9, ela não faz nenhuma conversão.

  7. Olá Eduardo.

    Tem um problema no seu codigo.

    while ((ch != '\r'))

    {

    ch = getch();

    }

    Supondo que ch seja do tipo char quando você faz ch = getch() está recebendo o codigo ASCII da tecla pressionada, por exemplo:

    Se digitar 123 o ch vai ter apenas o valor 0x33 (51 decimal) que corresponde ao codigo ASCII (em hexa) do caracter '3'.

    E quando pressionar o ENTER ch vai ter o valor 0x0D ou 13 em decimal que corresponde ao codigo ASCII do ENTER.

    Quando ch for igual ENTER ('\r') ele encerra o whille.

    Ai você faz um scanf("%d", &chute) e compara com ch, nesse ponto você está comparando o seguinte:

    Supondo que o usuario digitou 45 seu if será: if (45 == 13) que resultará em FALSO.

    Vou enviar um codigo pra você analisar.

    Qualquer dúvida é só postar.

    Abs


    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <mem.h>

    void main()
    {
    char numero[10];
    char tecla;
    int chute;
    int i = 0;

    // preenche o array numero com zeros
    memset(numero, 0, sizeof(numero));

    tecla = 0;
    printf("Digite um numero e pressione <ENTER> para finalizar\n");
    while (tecla != '\r')
    {
    tecla = getch();
    if (isdigit(tecla)) // verifica se a tecla digitada é um numero (0 a 9)
    numero[i++] = tecla; // salva o valor digitado em numero na posicao indicada por i eincrementa i
    }
    printf("Digite um valor: ");
    scanf("%d", &chute);
    if (chute == atoi(numero)) // atoi converte uma string para int
    printf("Confere\n");
    else
    printf("não Confere\n");

    getch();
    }
    [/codebox]

  8. Tenta estudar esse código.


    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <dos.h>
    #include <ctype.h>

    void main()
    {
    char a;
    int col = 10;
    clrscr();
    printf("joguinho lecal :D, digite D pra > e A pra <");
    printf("\n ");
    printf(" >- ");
    inicio:
    if (kbhit())
    a=tolower(getch());
    if(a=='d')
    {
    gotoxy(col--, 2);
    printf(" o \r");
    if (col == 8)
    a = ' ';
    }
    if(a=='a')
    {
    gotoxy(col++, 2);
    printf(" o \r");
    if (col == 30)
    a = ' ';
    }
    if(a=='s')
    {
    exit(0);
    }
    delay(50);
    goto inicio;
    }
    [/codebox]

  9. Pequeno engano.

    a sequencia deve ser

    col = 1;

    gotoxy(col, 10); // pra posicionar na coluna 1 da linha 10

    printf(" o"); // pra exibir nas coordenas estabelecidas pelo gotoxy

    col++; // col passa a ser 2...3...4...e etc

    Quando quiser retroceder é só fazer col--

    Tenta ai, se não conseguir eu modifico seu codigo pra você ver como faz.

    Abs

  10. Olá Binder,

    Concordo com você quando diz que não se compara strings com ==, mas no codigo athoslive ele está comparando bytes quando se usa o ' apostrofe.

    Isso é perfeitamente valido ainda mais porque a variavel (a) é um char.

    AthosLive, o problema do seu codigo é o seguinte.

    Quando você simplesmente usa o printf ele vai exibir a informação na posição corrente da tela.

    O \ n faz o cursor se move para a coluna 1 da proxima linha.

    Se você quer fazer o seu ojbeto se mover você precisa indicar as coordernadas de impressao usando o gotoxy(col, linha) e ir mudando o valor de col;

    Assim o printf vai respeitar as coordenadas que você definiu.

    Pra andar pra frente é só fazer col++ e pra andar pra tras col-- dentro dos limites que você estabelecer.

    Se ainda tiver duvidas é só falar.

    Fica atento ao que o Binder falou, isso é importante pra se manipular texto. Inclusive você pode usar o toupper() ou tolower() pra tratar as letras digitadas independente de ser (s) ou (S).

    Abs

  11. Olá Eric,

    É possivel fazer um #include em qualquer parte do codigo, mas não é muito comum.

    O ideal é você criar um projeto com varios modulo e chamar as funções que eles disponibilizam.

    Nesse modelo (não muito comum) você pode usar o #include onde quiser.

    O problema é que o código é replicado no ponto onde o #include foi realizado e dessa forma consome memoria aumentando o tamanho da sua aplicacao.

    Para teste crie os arquivos teste.cpp e main.cpp


    //==============================
    // Arquivo teste.cpp
    //==============================
    printf("Texto contido em teste.cpp\n");


    //==============================
    // Arquivo main.cpp
    //==============================
    #include <stdio.h>
    #include <stdlib.h>

    void main(void)
    {
    printf("Texto contido em main.cpp\n");
    #include "teste.cpp"

    printf("Novamente texto contido em main.cpp\n");
    for(int n = 0; n < 10; n++)
    #include "teste.cpp"

    system("pause");
    }
    [/codebox]

    O ideal é criar funções em modulos separados e chama-las onde desejar.

    Assim, você só tem uma função que pode ser executada em qualquer ponto sem consumir memoria de codigo desenecessariamente.

    Para teste crie os arquivos teste.cpp, teste.hpp e main.cpp

    [codebox]
    //==============================
    // Arquivo teste.cpp
    //==============================
    void ExibeMensagem(void)
    {
    printf("Texto contido em teste.cpp\n");
    }

    //==============================
    // Arquivo teste.hpp
    //==============================
    void ExibeMensagem(void);


    //==============================
    // Arquivo main.cpp
    //==============================
    #include <stdio.h>
    #include <stdlib.h>

    #include "teste.hpp"

    void main(void)
    {
    printf("Texto contido em main.cpp\n");
    ExibeMensagem();

    printf("Novamente texto contido em main.cpp\n");
    for(int n = 0; n < 10; n++)
    ExibeMensagem();

    system("pause");
    }

  12. já que você ta usando borlando não me preocupei com portabilidade pra Linux.

    Vê se esse codigo te da alguma luz.

    Abs


    #include <stdio.h>
    #include <conio.h>
    #include <dos.h>
    #include <math.h>

    void main(void)
    {
    unsigned char col = 10; // atribui o valor da coluna inicial
    char passo = 1; // atribui o valor inicial para o passo
    char seta = '>' - 1; // atribui o caracter para exibicao usando o codigo ascii

    while(1)
    {
    if (kbhit()) // se alguma tecla for pressionada encerra o programa
    break; // encerra o laco

    gotoxy(col, 10); // indica a posicao de impressao na tela
    printf(" %c \r", seta + passo); // exibe a seta > ou <
    col += passo; // muda a coluna de impressao somando 1 para avancar ou -1 para retroceder
    if (col == 70 || col == 10) // se atingiu os limites estabelecidos muda o passo para -1 ou 1
    passo *= -1; // com uma multiplicao simples por (-1)

    // exibe o percentual com base na posicao de impressao dentro de 80 colunas
    // usando uma regra de 3 simples
    gotoxy(1,15);
    printf("Percentual: %.2f\% ", (float)(col * 100.0 / 80.0));

    delay(50); // aguarda 50 milisegundos antes de executar o laco novamente
    }
    }

    [/codebox]

  13. Olá arandoble,

    Acho que não estou entendendo o que você realmente precisa.

    O codigo que eu postei faz a leitura do arquivo lista.txt independente da quantidade de linhas que ele possua e gera o lista_inv.txt com as palavras invertidas.

    A funcao que o renatosantos17 postou faz a inversão que você deseja.

    Mas, o que é a lista que você quer inverter?

    Por exemplo, você inverter listas em memoria ou inverter linhas do arquivo usando a funcao Inverte()

    Se você usar o exemplo que trata arquivos precisa ter uma arquivo chamado "lista.txt" com o conteudo para inversão.

    O resultado será gravado no arquvo "lista_inv.txt"


    // opcao 1 --------------------------------------------------
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

    char *inverte(char *string)
    {
    static char temp[100];
    int inc;
    int dec = strlen(string)-1;

    strcpy(temp, string);
    for(inc = 0; inc < strlen(string); inc++, dec--)
    temp[inc] = string[dec];
    temp[inc] = 0;
    return (temp);
    }

    void main(void)
    {
    char *nomes[ ] = {"pedro", "paulo", "anita", "rosana", "joao", 0};

    int n = 0;
    while(nomes[n])
    {
    printf("nome: %s\t%s\n", nomes[n], inverte(nomes[n]));
    n++;
    }
    }
    [/codebox]

    [codebox]
    / opcao 2 --------------------------------------------------
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

    char *inverte(char *string)
    {
    static char temp[100];
    int inc;
    int dec = strlen(string)-1;

    strcpy(temp, string);
    for(inc = 0; inc < strlen(string); inc++, dec--)
    temp[inc] = string[dec];
    temp[inc] = 0;
    return (temp);
    }

    int main()
    {
    // cria os ponteiros para os arquivos
    FILE *fpEntrada, *fpSaida;

    // abre os arquivos de entrada e saida
    fpEntrada = fopen("lista.txt", "r+t");
    fpSaida = fopen("lista_inv.txt", "w+t");
    if (fpEntrada == NULL || fpSaida == NULL)
    return 1;

    char buffer[256];
    int n;
    while (feof(fpEntrada) == 0)
    {
    n = 0;
    if (fgets(buffer, 250, fpEntrada) != NULL)
    {
    // grava já invertido
    fputs(inverte(buffer), fpSaida);
    }
    }

    fclose(fpEntrada);
    fclose(fpSaida);

    system("pause");
    return (0);
    }

  14. Olá.

    Esse codigo deve funcionar em qualquer compilador, basta algumas mudanças (de coisas que não deveriam estar ai)

    Obrigado e parabens pela iniciativa de compartilhar codigo.

    Abs

    #include <stdio.h>
    // #include <dos.h>         // essa linha esta a mais
    #include <stdlib.h>
    void main(void)
    {
    union
    {
    unsigned char byte;
    struct
    {
    unsigned char bit0 : 1;
    unsigned char bit1 : 1;
    unsigned char bit2 : 1;
    unsigned char bit3 : 1;
    unsigned char bit4 : 1;
    unsigned char bit5 : 1;
    unsigned char bit6 : 1;
    unsigned char bit7 : 1;
    } unsigned binario;    // retirar o unsigned dessa linha e pronto, compila em Windows ou Linux
    } dado;
    
    dado.byte = 127;
    printf("Decimal: %d\n", dado.byte);
    printf("Binario: %d%d%d%d-%d%d%d%d\n", dado.binario.bit7, dado.binario.bit6, dado.binario.bit5, dado.binario.bit4,
    dado.binario.bit3, dado.binario.bit2, dado.binario.bit1, dado.binario.bit0);
    printf("Hexa...: %02X\n", dado.byte);
    
    printf("\n\n");
    
    dado.binario.bit7 = 1;
    dado.binario.bit6 = 0;
    dado.binario.bit5 = 1;
    dado.binario.bit4 = 0;
    dado.binario.bit3 = 1;
    dado.binario.bit2 = 0;
    dado.binario.bit1 = 1;
    dado.binario.bit0 = 0;
    
    printf("Binario: %d%d%d%d-%d%d%d%d\n", dado.binario.bit7, dado.binario.bit6, dado.binario.bit5, dado.binario.bit4,
    dado.binario.bit3, dado.binario.bit2, dado.binario.bit1, dado.binario.bit0);
    printf("Decimal: %d\n", dado.byte);
    printf("Hexa...: %02X\n", dado.byte);
    
    system("pause");
    }

  15. Para efeitos didáticos.

    Abs


    #include <stdio.h>
    #include <dos.h>
    #include <stdlib.h>
    void main(void)
    {
    union
    {
    unsigned char byte;
    struct
    {
    unsigned char bit0 : 1;
    unsigned char bit1 : 1;
    unsigned char bit2 : 1;
    unsigned char bit3 : 1;
    unsigned char bit4 : 1;
    unsigned char bit5 : 1;
    unsigned char bit6 : 1;
    unsigned char bit7 : 1;
    } unsigned binario;
    } dado;

    dado.byte = 127;
    printf("Decimal: %d\n", dado.byte);
    printf("Binario: %d%d%d%d-%d%d%d%d\n", dado.binario.bit7, dado.binario.bit6, dado.binario.bit5, dado.binario.bit4,
    dado.binario.bit3, dado.binario.bit2, dado.binario.bit1, dado.binario.bit0);
    printf("Hexa...: %02X\n", dado.byte);

    printf("\n\n");

    dado.binario.bit7 = 1;
    dado.binario.bit6 = 0;
    dado.binario.bit5 = 1;
    dado.binario.bit4 = 0;
    dado.binario.bit3 = 1;
    dado.binario.bit2 = 0;
    dado.binario.bit1 = 1;
    dado.binario.bit0 = 0;

    printf("Binario: %d%d%d%d-%d%d%d%d\n", dado.binario.bit7, dado.binario.bit6, dado.binario.bit5, dado.binario.bit4,
    dado.binario.bit3, dado.binario.bit2, dado.binario.bit1, dado.binario.bit0);
    printf("Decimal: %d\n", dado.byte);
    printf("Hexa...: %02X\n", dado.byte);



    system("pause");
    }
    [/codebox]

  16. Bom, estuda esse código e se tiver dúvidas posta ai que a galera ajuda.

    Abs


    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

    int main()
    {
    // cria os ponteiros para os arquivos
    FILE *fpEntrada, *fpSaida;

    // abre os arquivos de entrada e saida
    fpEntrada = fopen("lista.txt", "r+t");
    fpSaida = fopen("lista_inv.txt", "w+t");
    if (fpEntrada == NULL || fpSaida == NULL)
    return 1;

    char buffer[256];
    int n;
    while (feof(fpEntrada) == 0)
    {
    n = 0;
    if (fgets(buffer, 250, fpEntrada) != NULL)
    {
    // grava já invertido
    while (buffer[n]) // anda pelo array até encontrar o terminar ''
    {
    // strlen devolve o numero de bytes numa string.
    // Exemplo: strlen("João") devolve 5, mas tem que lembrar que um array em C começa em 0
    fputc(buffer[(strlen(buffer)-1)-n], fpSaida);
    n++;
    }
    }
    }

    fclose(fpEntrada);
    fclose(fpSaida);

    system("pause");
    return (0);
    }
    [/codebox]

  17. Opa, desculpa ai então.

    Tenta esse código como base.


    #include <stdio.h>
    #include <mem.h>

    void main(void)
    {
    FILE *fp = fopen("teste.txt", "rt");
    unsigned char ch;
    unsigned char tabela[256];
    memset(&tabela, 0, sizeof(tabela));
    while (feof(fp) == 0)
    if (ch = fgetc(fp))
    tabela[ch]++;
    printf("Fim\n");

    for(int n = 0; n < 256; n++)
    printf("%03d ", tabela[n]);
    fclose(fp);
    }
    [/codebox]

  18. Olá Victor Martins,

    Consertar seu programa até que não é muito dificil, mas tem alguns conceitos de programação, pelo menos em C/C++, que eu acho interessante passar pra você.

    Mas podemos ver isso por email e depois postar o resultado aqui, se você quiser é claro.

    Abs

×
×
  • Criar Novo...