Ir ao conteúdo

kgin

Membro Pleno
  • Posts

    386
  • Cadastrado em

  • Última visita

posts postados por kgin

  1. @Um mero usuário Para você utilizar a ncurses você precisa iniciá-la primeiro dessa maneira.

    	initscr(); 		/* Inicia a ncurses */

    depois de iniciada você pode escrever ou pegar algo da saída padrão com as funções.

    /* Funções de saida */
    	printw();		/* Funciona igual a printf() */
    	addch();
    	addstr();
    
    /* Funções de entrada */
    	scanw();		/* Funciona igual a scanf() */
    	getch();
    	getstr();

    você também não precisa incluir o cabeçalho stdio.h a ncurses inclui automaticamente ele e o termios.h.

     

    Quando você utilizar uma das funções de saída (como printw()) você tem que utilizar a função refresh()

    	refresh();		/* Atualiza as informções do terminal */

     

    Quando o seu programa terminar você tem que chamar a função endwin()

    	endwin(); 		/* Finaliza a ncurses */

    Ela vai restaurar todas as cagadas que você fez com o termios.h, por isso eu não recomendo a solução do @Lucca Rodrigues porque ela mexe direto com as configurações do terminal.

     

    Um programa básico com ncurses é assim.

    #include <ncurses.h>
    
    int main(void)
    {
    	initscr(); 		/* Inicia a ncurses */
    
    	printw("Ola mundo!\n");
    
    	refresh(); 		/* Atualiza o terminal */
    
    	getchar(); 		/* Espera a tecla enter */
    
    	endwin(); 		/* Finaliza a ncurses */
    	return(0);
    }

     

    Para compilar você utiliza a linha de comando

    gcc NOME_DO_ARQUIVO.c -o NOME_DO_EXECUTAVEL -Wall -lncurses

     

    para um tutorial bem mais completo e detalhado de uma olhada nesse site.

    https://tldp.org/HOWTO/NCURSES-Programming-HOWTO/

     

    Boa sorte!

    • Obrigado 1
  2. 10 minutos atrás, TsunaY disse:

    @kgin Não, a unica coisa que sei é que tem que usar Struct

    Sim você vai ter que usar estruturas (struct) e vetores para fazer esse algoritmo.

     

    você deveria fazer algo assim para começar

    #include <stdio.h>
    
    
    struct info_aluno
    {
        char nome[60];
        int ira;
        int ano;
    };
    
    
    int main(void)
    {
        struct info_aluno aluno;
        /* Pega as informações do aluno */
        printf("Digite o nome do aluno\n");
        fgets(aluno.nome, 60, stdin);
    
        printf("Digite o IRA do aluno\n");
        scanf("%d%*c", &aluno.ira);
    
        printf("Digite o ano de inicio da graduacao\n");
        scanf("%d%*c", &aluno.ano);
    
        /* Mostra as informações do aluno */
        printf("Nome do aluno:%s", aluno.nome);
        printf("IRA:%d\n", aluno.ira);
        printf("Ano:%d\n", aluno.ano);
    
        getchar();      /* Pausa o programa */
        return(0);
    }

     

    • Curtir 1
  3. @Leoprog você já estudou alguma coisa sobre a linguagem C?

     

    eu fiz um pedaço do que está pedindo para você ter uma ideia de como é.

    #include <stdio.h>
    #include <stdlib.h>
    
    //-------------------------------------------------------------
    // Protótipos das funções
    int menu();
    
    // As funções abaixo devem imprimir o resultado das operações
    // realizadas com os números passados por parâmetro.
    void soma(int num1, int num2);
    void subtracao(int num1, int num2);
    void multiplicacao(int num1, int num2);
    void divisao(int num1, int num2);
    
    // Imprime a tabuada conforme exercícios anteriores
    void tabuada(int inicio, int fim);
    
    //-------------------------------------------------------------
    // Função main
    int main()
    {
        int num1, num2;
        int opcao = 0;
    
    
        opcao = menu();
        printf("voce selecionou a opcao: %d\n", opcao);
    
        printf("digite o primeiro numero da operacao\n");
        scanf("%d%*c", &num1);
    
        printf("digite o segundo numero da operacao\n");
        scanf("%d%*c", &num2);
    
        switch (opcao) {
            case 1:
                soma(num1, num2);
                break;
    
            case 2:
                subtracao(num1, num2);
                break;
    
            case 4:
                multiplicacao(num1, num2);
                break;
        }
    
    
        // Utilizar o laço while para executar enquanto
        // não seja digitada a opção sair.
    
        // Criar um menu utilizando a variavel opção para escolher
        // Qual função deverá chamar.
    
        // Solicitar os dois numeros que serão passados por parâmetro
    
        return 0;
    }
    
    //-------------------------------------------------------------
    // Implementação da função menu
    
    int menu(){
    
        int opcao;  // Declara a variável que será utilizado dentro da função
    
        // Imprime as opções do menu.
        printf("01 - Soma\n");
        printf("02 - Subtracao\n");
        printf("03 - Divisao\n");
        printf("04 - Multiplicacao\n");
        printf("05 - Tabuada\n");
        printf("09 - Sair\n\n");
    
    
        printf("Informe a opcao: ");    // Solicita a opção.
        scanf("%d",&opcao);             // Lê o valor digitado pelo usuário.
    
        return opcao;                   // Retorna o valor para quem chamou
                                        // a função menu.
    }
    
    //-------------------------------------------------------------
    // Implementar as demais funções conforme os protótipos apresentados.
    
    void soma(int num1, int num2){
        printf("A soma dos numeros informados eh: %d", num1 + num2);
    }
    
    void subtracao(int num1, int num2){
        printf("A subtracao dos numeros informados eh: %d", num1 - num2);
    }
    
    void multiplicacao(int num1, int num2){
        printf("A multiplicacao dos numeros informados eh: %d", num1 * num2);
    }

    Depois e só completar o resto das operações e colocar o loop while na função main()

  4. 2 horas atrás, Um mero usuário disse:

    só nao entendi o que aquelas bibliotecas (ctype.h e unistd.h) fazem...

    ctype trabalha com caracteres, faz conversões de maiúscula para minuscula (e vice versa), checa se um caractere e um numero ou um gráfico (caracteres gráficos !,@,°,E,...).

     

    já o unistd está aí só para dar um delay com a função usleep (eu poderia ter usado sleep() também).

    • Curtir 1
  5. Uma alternativa se você utilizar linux seria a ncurses.

     

    exemplo

    #include <ncurses.h>
    #include <ctype.h>
    #include <unistd.h>
    
    struct vetor2
    {
        int x, y;
    };
    
    int main(void)
    {
        int tecla;
        struct vetor2 vetor = {1, 1};
        initscr();      /* inicia a ncurses */
        noecho();       /* Não deixa o caractere pressionado aparecer */
        cbreak();       /* Não espera que seja pressionado enter */
        do {
            clear();    /* Apaga a tela */
            printw("Utilize as teclas WASD para se mover, e X para sair\n");
            tecla = getch();    /* pega uma tecla */
            
            switch (toupper(tecla)) {
                case 'A':
                    if (vetor.x > 0) {
                        vetor.x--;
                    } else {
                        vetor.x = 79;
                    }
                    break;
                    
                case 'D':
                    if (vetor.x < 79) {
                        vetor.x++;
                    } else {
                        vetor.x = 0;
                    }
                    break;
                    
                case 'W':
                    if (vetor.y > 0) {
                        vetor.y--;
                    } else {
                        vetor.y = 20;
                    }
                    break;
                    
                case 'S':
                    if (vetor.y < 20) {
                        vetor.y++;
                    } else {
                        vetor.y = 0;
                    }
                    break;
            }
            
            move(vetor.y, vetor.x);
            printw("#");
            
            refresh();  /* Atualiza a tela */
            usleep(50000);  /* Faz uma pausa de 50 msec */
        } while (toupper(tecla) != 'X');
        endwin();       /* finaliza a ncurses */
        return(0);
    }

     

    para ver o funcionamento do programa.

    https://onlinegdb.com/m-r5HCBGB

    • Curtir 2
  6. Não seria melhor você deixar a função de cadastrar só para cadastrar?

     

    Dessa maneira.

    #include <stdio.h>
    #include <stdlib.h>
    
    struct dados_produto
    {
        int id;
        int quantidade;
        float preco;
    };
    
    void
    salvarCadastro(struct dados_produto *produto);
    
    int
    cadastraProduto(struct dados_produto *produto);
    
    int main(void)
    {
        struct dados_produto produto;
        if (cadastraProduto(&produto)) {
            char opcao;
            printf("id:%d\n", produto.id);
            printf("quantidade:%d\n", produto.quantidade);
            printf("preco:%.2f\n", produto.preco);
            printf("Salvar cadastro no arquivo\n");
            printf("S\\N\n");
            scanf("%c%*c", &opcao);
    
            if (opcao == 'S' || opcao == 's') {
                salvarCadastro(&produto);
                printf("Cadastro salvo no arquivo\n");
            }
        } else {
            printf("Cadastro descartado\n");
        }
        getchar();
        return(0);
    }
    
    void
    salvarCadastro(struct dados_produto *produto)
    {
        int contador;
        char buffer[256];
        FILE *arq = fopen("Cadastros.csv", "r+");
        if (arq == NULL) {
            arq = fopen("Cadastros.csv", "w+");
            if (arq == NULL) {
                perror("Nao foi possivel de criar ou ler o arquivo");
                exit(EXIT_FAILURE);
            }
        }
    
        /* Pula todos os cadastros */
        do {
            fgets(buffer, 256, arq);
        } while (!feof(arq));
    
        /* Salva o cadastro */
        fprintf(arq, "%d,%d,%.2f\n", produto->id, produto->quantidade, produto->preco);
    
        fflush(arq);
    
        fclose(arq);
    }
    
    int
    cadastraProduto(struct dados_produto *produto)
    {
        struct dados_produto tmp;
        char opcao;
        do {
            printf("Digite o id do produto\n");
            scanf("%d%*c", &tmp.id);
            printf("Digite a quantidade de produtos\n");
            scanf("%d%*c", &tmp.quantidade);
            printf("Digite o preco do produto\n");
            scanf("%f%*c", &tmp.preco);
    
            printf("O cadastro esta correto\n");
            printf("S\\N\n");
            scanf("%c%*c", &opcao);
            if (opcao == 'S' || opcao == 's') {
                *produto = tmp;
                printf("Cadastro feito com sucesso!\n");
                return(1);
            }
    
            printf("Cadastrar novamente?\n");
            printf("S\\N\n");
            scanf("%c%*c", &opcao);
        } while (opcao == 'S' || opcao == 's');
        return(0);
    }

    Assim fica mais simples para remover um cadastro depois.

  7. Tudo que você coloca no header (.h) em c vai ser visível quando você incluir em outro arquivo, então sim você colocar suas estruturas e declarações de funções e variáveis no .h se você quiser que seja visível.

    • Curtir 1
  8. 2 horas atrás, souza souza00 disse:

    acho que voce nao entendeu a minha duvida, eu so quero saber o porque ele ta dando o erro que eu postei o print,

    Olha aqui no meu compilador

    erro_cpp.png.30ecf1ac406fe4f27795e3a3124a530b.png

     

    Que está basicamente dizendo que na linha 189 do arquivo calc.cpp

    	while(value > 0)
    		convert(value % 10, digits, (*count)++);
    		value = value / 10;
    	}

    Seu while está sem a chave do bloco '{'

    e que na linha 123 do mesmo arquivo (calc.cpp) você está utilizando uma variável chamada digit no loop for que não foi declarada

    	for(digit = 0; digit < 8; digit++){
    		
       numeros[x] = num % 10;
       num /= 10;
      }

     

    e que a sua função

    void CpuSthefani::converterIntToDigits(int value, Digit *digits, int *count)

    você não fechou o bloco da função com a chave '}'

     

     

     

     

  9. @souza souza00 Pra mim esse seu código não tem salvação, mas se vocẽ ainda quiser tentar recuperar a maior parte dos erros estão no método

    void CpuSthefani::converterIntToDigits(int value, Digit *digits, int *count)

    na linha 118 do arquivo calc.cpp.

    Você não fechou o método com a chave } nem utilizou um bloco {} no while, e no for você está utilizando um ponteiro para contar deveria se uma variável do tipo inteira (int).

     

    Eu fiz um código demonstrado um display em C (avisando novamente eu não sei C++) talvez seja útil.

    #include <stdio.h>
    #include <stdlib.h>
    
    /* Informações internas do display */
    /* Seria os campos privados do objeto */
    struct info_display
    {
        int max_buffer;
        char *buffer;
    };
    
    /* Metodos do objeto */
    
    void limpaDisplay(struct info_display *display);
    /* 
     * Limpa todos os caracteres no display
     */
    
    void iniciaDisplay(struct info_display *display, int max_caracteres);
    /*
     * Inicia o display com a quantidade de caracteres suportados
     */
    
    void atualizaDisplay(struct info_display *display);
    /*
     * Mostra o display para o usuario
     */
    
    void adicionaCaractereDisplay(struct info_display *display, char caractere);
    /*
     * Coloca caracteres no display
     */
    
    void apagaUltimoCaractereDisplay(struct info_display *display);
    /*
     * Remove o ultimo caractere adicionado no display
     */
    
    void liberaDisplay(struct info_display *display);
    /*
     * Apaga a memoria reservada para o display
     */
    
    int main(void)
    {
        struct info_display display;
        iniciaDisplay(&display, 10);
    
        printf("Primeira atualizacao\n");
    
        adicionaCaractereDisplay(&display, '1');
        adicionaCaractereDisplay(&display, '3');
        adicionaCaractereDisplay(&display, '7');
        atualizaDisplay(&display);
    
        printf("Segunda atualizacao\n");
    
        apagaUltimoCaractereDisplay(&display);
        adicionaCaractereDisplay(&display, 'C');
        atualizaDisplay(&display);
    
        printf("Terceira atualizacao\n");
    
        limpaDisplay(&display);
        atualizaDisplay(&display);
        
        liberaDisplay(&display);
        return(0);
    }
    
    void limpaDisplay(struct info_display *display)
    {
        int contador = 0;
        for (contador = 0; contador < display->max_buffer; contador++)
        {
            display->buffer[contador] = '\0';
        }
    }
    
    void iniciaDisplay(struct info_display *display, int max_caracteres)
    {
        /* Reserva a quantidade caracteres maxíma do display */
        display->buffer = malloc(sizeof(*display->buffer)*display->max_buffer);
    
        /* Se foi possivel reservar memoria então limpa o display */
        if (display->buffer != NULL) {
            display->max_buffer = max_caracteres;
            limpaDisplay(display);
        } else {
            display->buffer = NULL;
        }
    }
    
    void atualizaDisplay(struct info_display *display)
    {
        int contador;
        /* Mostra uma linha */
        for (contador = 0; contador < display->max_buffer; contador++) {
            putchar('-');
        }
    
        putchar('\n');
    
        /* Mostra o conteudo do display */
        printf("%s\n",display->buffer);
    
        /* Mostra uma linha */
        for (contador = 0; contador < display->max_buffer; contador++) {
            putchar('-');
        }
    
        putchar('\n');
    }
    
    void adicionaCaractereDisplay(struct info_display *display, char caractere)
    {
        int contador;
        for (contador = 0; contador < display->max_buffer-1 && display->buffer[contador]; contador++);
    
        if (contador < display->max_buffer-1) {
            display->buffer[contador] = caractere;
            display->buffer[contador+1] = '\0';
        }
    }
    
    void apagaUltimoCaractereDisplay(struct info_display *display)
    {
        int contador;
        for (contador = 0; display->buffer[contador]; contador++);
    
        if (contador > 0) {
            display->buffer[contador-1] = '\0';
        } else {
            display->buffer[contador] = '\0';
        }
    }
    
    void liberaDisplay(struct info_display *display)
    {
        if (display->buffer != NULL) {
            free(display->buffer);
        }
    }

     

    Defina o que cada objeto em seu programa faz, e coloque cada um para fazer a sua tarefa com perfeição.

  10. 4 horas atrás, souza souza00 disse:

    postei em forma de pasta porque precisa abrir os 3 algoritmos pra calculadora funcionar.

    você pode postar no replit ou no onlineGDB que fica mais cômodo para  as pessoas visualizarem,

     

    Agora vamos ao código eu não sei C++, mas eu acho que essa calculadora está com muitos objetos para uma calculadora.

     

    Você já parou para pensar o que o objeto Cpu faz? esse objeto está fazendo serviço de outros como

    virtual void setDisplay(Display * display) = 0;

    Isso não deveria estar em Display? qual é o sentido de display ser configurado por outro objeto?

     

    É aqui nesse trecho

    virtual void setDecimalSeparator() = 0;

    Pra que ter isso sendo que você poderia ter algo como

    void addCharacterToDisplay(const character char);
    void removeLastCharacterDisplay();

     

     

    • Curtir 1
  11. 5 minutos atrás, Midori disse:

    O tópico é sobre C

    Eu sei que é, mas tudo que eu vejo os outros postarem parece que vem do C++.

     

    6 minutos atrás, Midori disse:

    mas como assim "tipificar estrutura"?

    Acabei inventando palavra.

    seria criar uma sinônimo ou alias, porque você acabou de criar uma estrutura pra que dar um nome que foge do escopo do proposito do mesmo?

    • Curtir 1
  12. Eu não sei se isso e alguma coisa do C++ ou porque eu ainda penso muito em pascal, mas pra mim não faz sentido tipificar uma estrutura.

    typedef struct{
        int codigo;
        char descricao[50];
        char fornecedor[50];
        int quantidade;
        float preco_venda;
        float preco_compra;
    }Produto;

    Isso pra mim parece que meio que "oculta" o tipo, sendo que namespace de estruturas já são distintos de outros tipos de declaração em C.

     

    outra coisa que eu acho estranho e fazer um cast quando está passando endereços(Ponteiros do tipo void) para ponteiros, o cast já não é automático? Ou em C++ e diferente?

    prod = (Produto *)malloc(sizeof(Produto) * n);

    Não seria melhor fazer assim?

    prod = malloc(sizeof(*prod)*n);

    Bem mais simples é claro.

    • Curtir 2
  13. você teria que somar as notas dessa maneira.

        /* Soma todas as notas */
        for (contador = 0; contador < 10; contador++) {
            soma  = soma+notas[contador];
        }

    troque a variável contador pela a variável que você estiver usando.

     

    Depois e só dividir pela quantidade de notas.

        /* Tira a media */
        media = soma/10;

    e mostrar

        /* Mostra a media nota */
        printf("a media e:%.2f", media);

     

    tudo isso vai depois dessa linha

    12 minutos atrás, casa1 disse:

    soma = 0;

    media = 0;

    Apague o resto até o return()

    • Curtir 1
  14. Para exemplificar o que o @mauro_b disse, seria dessa maneira.

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int main(void)
    {
        char tabuleiro[10][10];
        int bombas[10*10];      /* Mesmo tamanho do tabuleiro */
        int linha, coluna;
    
        /* Inicia o tabuleiro */
        for (linha = 0; linha < 10; linha++) {
            for (coluna = 0; coluna < 10; coluna++) {
                tabuleiro[linha][coluna] = '-';         /* Marca como vazio */
            }
        }
    
        /* Inicia as bombas */
        for (linha = 0; linha < 10*10; linha++) {
            bombas[linha] = linha;
        }
    
        /* Inicia o gerador de numeros aletorios com a data e hora do sistema */
        srand(time(NULL));
        /* Embaralha o local das bombas */
        /* Utlizando o algoritomo Fisher–Yates */
        for (linha = 0; linha < 10*10; linha++) {
            int indice, temporario = bombas[linha];
            indice = rand()%(10*10);
            bombas[linha] = bombas[indice];
            bombas[indice] = temporario;
        }
    
        /* Coloca 20 bombas no tabuleiro */
        for (linha = 0; linha < 20; linha++) {
            /* bombas[linha]%10 = linha */
            /* bombas[linha]/10 = coluna */
            tabuleiro[bombas[linha]%10][bombas[linha]/10] = '*';
        }
    
        /* Mostra o tabuleiro */
        for (linha = 0; linha < 10; linha++) {
            for (coluna = 0; coluna < 10; coluna++) {
                printf("%c|", tabuleiro[linha][coluna]);
            }
            printf("\n");
        }
        getchar();
        return(0);
    }

     

  15. 2 horas atrás, Rodney Junior disse:

     Eu estou com problema na leitura da descrição e do fornecedor, se eu coloco os números usando virgula para separar o preço ele não lê corretamente a parte de descrição e fornecedor nem o preço de venda, ai vira uma bagunça e sai errado, porém se eu coloco com ponto ele lê corretamente. Queria saber como corrigir isso pra ele executar normalmente tanto com um quanto com o outro

    Se o seu sistema operacional estiver configurado para português e só você usar a função setlocale.

    Exemplo

    	setlocale(LC_ALL, "");

    Vai configurar o programa para aceitar a região atual do sistema.

     

    É o seu programa está muito mal organizado, e eu acho que está saindo fora do enunciado.

    Aqui está pedindo para fazer uma função que sirva como menu.

    Em 04/05/2021 às 00:33, Rodney Junior disse:

    a. Procedimento para imprimir na tela um menu de opções, conforme abaixo, o qual lê do usuário a opção informada e a retorna:

    Você escreveu o menu direto na função main() eu acho que está errado.

     

    Eu recomendo você começar de novo!

    Spoiler

    Ninguém faz isso, eu acho que é um esforço desnecessário da minha parte (;一_一)

     

    Um exemplo inicial de como seria o programa seguindo o enunciado.

    Exemplo no replit

    • Curtir 1
  16. 6 horas atrás, AsafeBernardoOficial disse:

    @kgin não postei o enunciado pelo medo de estar entregando a questão de bandeja, como sei que no fórum ninguém faz trabalho para outros, decidi só botar o problema específico que eu estava enfrentando no código.

    Eu já vi essa mesma questão varias vezes aqui no fórum, então eu acho que a chance de alguém copiar logo o seu é baixa.

  17. @AsafeBernardoOficial Você ainda está inicializando o vetor de uma forma que só e valida em C++.

    6 horas atrás, AsafeBernardoOficial disse:

    qtd_produto[5]={}

    Coloque um 0 entre as chaves para ser valido em C.

     

    O vetor total_itens[] não tem posições validas.

     

    Eu recomendo você começar de novo.

     

    Eu fiz um exemplo mas eu acho que ficou muito extenso para postar no fórum, então eu vou deixar no replit.

    https://replit.com/@KGin/SandwichStore#main.c

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!