Ir ao conteúdo

Posts recomendados

Postado

Estou fazendo um projeto de calculadora.

Mas alguns caracteres ficam bugados no windows, embora no linux fica perfeito.

Teria como alterar e deixar eles corretos? 

 

* Caracteres da Logica Proposicional

* (−j)^(j + 1)

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

int main()
{
    int menu, proposicional;
    char opcao;


    printf("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n");
    printf("%%   CAL CODES CALCULATOR   %%\n");
    printf("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n");

    do{        // PERMANECER NO MENU


    printf("    MENU \n\n");

    printf("1 - SOMATORIO \n");
    printf("2 - LOGICA PROPOSICIONAL \n");
    printf("3 - MATRIZES \n");
    printf("4 - ANALISE COMBINATORIA \n");
    printf("5 - SAIR \n\n");

    printf(" * DIGITE A OPCAO DESEJADA: ");
    scanf("%d", &menu);

    printf("\n");

    switch(menu){

    int somatoria, menusomatoria;
    case 1:

            printf("1 - Somatorio de j = m ate n para a regra j\n\n");
            printf("2 - Somatorio de j = m ate n para a regra (−j)^(j + 1)\n\n");
            printf("3 - Voltar ao Menu anterior\n\n");

    printf(" * DIGITE A OPCAO DESEJADA: ");
    scanf("%d,", &menusomatoria);
    printf("\n");

        switch(menusomatoria){
        int m, n, j, soma;
        case 1:
        printf(" - DIGITE UM VALOR PARA M: ");
        scanf("%d", &m);
        printf(" - DIGITE UM VALOR PARA N: ");
        scanf("%d", &n);

        for(j=1, soma=0; j <= n; j++){  // Somatório de j = m até n para a regra
            soma = soma + j;
        }

        printf("\n");
        printf("   RESULTADO = %d \n\n", soma);
        printf("   RETORNANDO AO MENU PRINCIAL........ \n\n");

        break;

        case 2:
        printf(" - DIGITE UM VALOR PARA M: ");
        scanf("%d", &m);
        printf(" - DIGITE UM VALOR PARA N: ");
        scanf("%d", &n);
        int aux;

        for(j=1, soma=0; j <= n; j++){  // Somatório de j = m até n para a regra (−j)^(j + 1)
            soma = pow(j, j+1);         // Falta Finalizar....
            aux = soma + 1;
        }

        printf("\n");
        printf("   RESULTADO = %d \n\n", soma);
        printf("   RETORNANDO AO MENU PRINCIAL........ \n\n");

        break;

        case 3:
        printf(" ");


        }

    break;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    case 2:                                                  // LÓGICA PROPOSICIONAL
    printf("1. ~p \n\n");
    printf("2. ~q \n\n");
    printf("3. p∧q \n\n");
    printf("4. p∨q \n\n");
    printf("5. p V_ q \n\n");
    printf("6. p → q \n\n");
    printf("7. p ↔ q \n\n");
    printf("8. Voltar ao Menu anterior\n\n");

    printf(" * DIGITE A OPCAO DESEJADA: ");
    scanf("%d", &proposicional);

    switch(proposicional){
    int p, q;
    case 1:
        printf("| p | ~p |\n");
        printf("| V |  F |\n");
        printf("| F |  V |\n");
        printf("\n");
    break;

    case 2:
        printf("| q | ~q |\n");
        printf("| V |  F |\n");
        printf("| F |  V |\n");
        printf("\n");
    break;

    case 3:
        printf("| p | q | p∧q |\n");
        printf("| V | V |  V   |\n");
        printf("| V | F |  F   |\n");
        printf("| F | V |  F   |\n");
        printf("| F | F |  F   |\n");
        printf("\n");
    break;

    case 4:
        printf("| p | q | p∨q |\n");
        printf("| V | V |  V   |\n");
        printf("| V | F |  V   |\n");
        printf("| F | V |  V   |\n");
        printf("| F | F |  F   |\n");
        printf("\n");
    break;

    case 5:
        printf("| p | q | pV_q  |\n");
        printf("| V | V |  F   |\n");
        printf("| V | F |  V   |\n");
        printf("| F | V |  V   |\n");
        printf("| F | F |  F   |\n");
        printf("\n");
    break;

    case 6:
        printf("| p | q | p→q |\n");
        printf("| V | V |  V  |\n");
        printf("| V | F |  F  |\n");
        printf("| F | V |  V  |\n");
        printf("| F | F |  V  |\n");
        printf("\n");
    break;

    case 7:
        printf("| p | q | p↔q |\n");
        printf("| V | V |  V  |\n");
        printf("| V | F |  F  |\n");
        printf("| F | V |  F  |\n");
        printf("| F | F |  V  |\n");
        printf("\n");
    break;

    case 8:
        printf(" ");

    }


    break;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    case 3:                                                   // MATRIZES
    printf("  CODIGO EM CONSTRUCAO \n");
    break;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    case 4:                                                   // ANÁLISE COMBINATÓRIA
    printf("  CODIGO EM CONSTRUCAO \n");
    break;


    case 5:
    printf("DESCONECTANDO... \nPROGRAMA FINALIZADO COM SUCESSO!\n");                   // SAIR
    exit(1); // SAINDO SOMENTE NA OPÇÃO 5


    default:
    printf("** DIGITE UMA OPCAO VALIDA **\n\n");                  // OPÇÃO INVALIDA

    }
    }while(1);  // PERMANECER NO MENU


    printf("\n\n\n\n\n\n\n\n\n\n\n");
    return 0;
}

 

  • Obrigado 1
Postado

@Pedrockz    Quais caracteres ficam bugados  ?  ,  se for os acentuados , como é ã ç õ ê , então use a biblioteca 

#include <locale.h>

e dentro da função main na primeira linha coloque

setlocale(LC_ALL,"");

 

Postado
1 hora atrás, Pedrockz disse:

(−j)^(j + 1) e os caracteres da logica proposicional p ↔ q por exemplo

 

Se precisa mesmo de índices e expoentes e esses caracteres especiais, e TEM que usar programas para console use unicode. E rode seus programas no terminal do windows 10, que usa os mesmos códigos dos anos '80 do Unix, derivados do terminal VT-100

adicionado 8 minutos depois

Pode usar a console também, talvez usando  a codepage 65001 e ver se tem os caracteres que quer. E reprograme a console na saída para deixar como encontrou. E use as funções w de todas as funções, tipo wprintf(). 

 

Mas o caminho recomendado é usar unicode e o terminal

 

Pode ver as tabelas aqui https://www.unicode.org/charts/

 

  • Obrigado 1
Postado

Unicode está descrito aqui: https://www.unicode.org/charts/ e talvez valha a pena ler isso, direto do dono do Windows, em português do brasil https://docs.microsoft.com/pt-br/cpp/c-runtime-library/unicode-the-wide-character-set?view=vs-2019

Se tem algum caracter que quer imprimir poste o código e a gente pode procurar

adicionado 1 minuto depois

Unicode é o ASCII de hoje, a tabela oficial de caracteres para o mundo todo e tem hoje mais de um milhão de símbolos. Foi projetado por Rob Pike --- o mesmo que escreveu GO --- e outros.

  • Obrigado 1
Postado



 


É problemático usar isso na console, mas entenda que antes de tudo precisa usar a pagina de código correta que tenha os símbolos que quer. Provavelmente é só isso. Não dá pra ter tudo com ASCII. Com Unicode já tem mais de 1.1 milhão :D

 

A página de código referente aos tempos iniciais do Windows, pré Windows95/98  é a 437. Então se você usar

    SetConsoleCP(437);

a mágica de voltar no tempo acontece. Eu escrevi um programa um dia desses para desenhar usando aqueles caracteres de desenho que eu usava naquela época. Se eu achar posso postar aqui se quiser. Tem um exemplo de como fazer e desfazer essas mudanças.

 

Mas se você ainda só roda seus programas dentro do IDE na mesma máquina basta essa linha...

 

Veja os caras de volta:

 

image.thumb.png.5acb73b687ff7dd86f8d1478e50adfc2.png

 

e o final 
 

image.thumb.png.9ad10bfdeef15902597e498da9be140b.png

 

Não use isso. É só problema. :D


Cortesia da wikipedia a pagina toda

 

https://en.wikipedia.org/wiki/Code_page_437

 

Eu tinha isso na pasta em alguma época. E a tabela EBCDIC. E sabia a maioria de cabeça :D Não mais.

adicionado 33 minutos depois

E pode ter que mudar a fonte da console tambem, e talvez deva chamar SetConsoleOutputCP(437) ao invés de SetConsoleCP(437) 

 

 

  • Obrigado 1
  • Haha 1
Postado

@arfneto  olhei lá no Microsoft e na wikpédia , mas lá eles não dão muitas explicações não , não tem nem um exemplo , e  não consegui ver como usar os códigos ASCII ,  se você encontrar o código sobre isso e puder , então poste para vermos como fazer ,    agradeço .

Postado

As codepages atuam apenas no Extended ASCII, os codigos a partir de 128. Os caracteres abaixo de 31 tem muitos significados e  muitos eram usados em comunicação e por isso muita gente sabia de cabeça. Veja na tabela:

 

Veja os nomes deles

image.png.8ee645893ff3e818c5cd366ce31478b1.png

Então em geral não imprime nada. Não me lembro agora de como pode imprimir isso na console. Vou procurar me lembrar e te falo. 

 

Mas os acima de 127 basta inserir essa linha de que falei e pode usar o código direto. No entanto precisa confirmar se a fonte da console que está usando tem as letras para imprimir também. Aqui:
 

image.png.0c4ab9aef6c7cc7c9b705553bc63473c.png

 

E se mudar algo restaure ao sair do programa, como já te expliquei...

 

Veja o mesmo programa rodando no terminal do Windows e na console para imprimir os valores de 2 a 19....
 

image.png.c7e410a44371471f597e3528f29ea82a.png

 

O terminal imprime mais

O programa é só isso

int teste()
{
    SetConsoleOutputCP(437);
    SetConsoleCP(437);
    for (int x = 2; x < 20; x++)
        printf("%d: %c\n", x, x);
    return 0;
};

 

 

 

  • Obrigado 1
Postado

@arfneto     obrigado  ,  coloquei  esse código aqui e usei a biblioteca Windows.h , e mesmo assim não mostrou nenhum caractere desses antes de 33  

 

#include <iostream>
#include <windows.h>
int teste()
{
    SetConsoleOutputCP(437);
    SetConsoleCP(437);
    for (int x = 2; x < 20; x++)
        printf("%d: %c\n", x, x);
    return 0;
};
int main(){
    teste();
    return 32768;
}

 

 

 

1510334590_caractereschr_2.thumb.jpg.43dbbaabef8beeda336a6e57f8381c3a.jpg

Postado
2 minutos atrás, devair1010 disse:

obrigado  ,  coloquei  esse código aqui e usei a biblioteca Windows.h , e mesmo assim não mostrou nenhum caractere desses antes de 33

 

Não era pra sair nada mesmo. Talvez eu não tenha me explicado bem, mas mostrei a saída do mesmo programa rodando no Terminal e na console. Entendeu isso? O mesmo programa. 

 

E te disse também que a Codepage só atua mesmo a partir de 0x80, os caracteres do "extended ASCII" com códigos a partir de 128. E te mostrei acho um link para a página. E um resumo do final da tabela.

 

Também te disse do uso desses caracteres em comunicação e do sentido que eles tem, tipo EOT ETX ACK NAK SO H são significados muito especiais. Ou eram nos anos 80 :) Isso jamais chegava a um programa de usuário e era visto nos programas de comunicação e nas telas dos analisadores de protocolo.

 

Claro que alguns não devem mesmo mostrar nada, já que

  • 7 é o alarme e toca um BEEP
  • 8 é o backspace
  • 9 é o TAB
  • 10 é o linefeed o tal '\n'
  • 11 é o TAB vertical para quem se lembra
  • 12 é o FF para avançar a página na impressora, quem diria
  • 13 é o retorno de carro, o '\r' que voltava o carro nos terminais tty para quem se lembra. '\r' volta o cursor sem avançar a linha. Voltava nos anos 80. O cursor era físico, como o carro da máquina de escrever, de onde vem o nome CR na tabela ASCII --- carriage return
  • 27 é o ESCAPE, ESC

Para os outros o terminal mostra o esperado:

 

image.thumb.png.bab399bdfdfe18c7db6468321e85b2dc.png

 

E a console nada. Claro que antes mostrava, muito antes. Décadas atrás.
 

Fiquei curioso por isso e fui procurar na fonte normal de informações sobre Windows, a Microsoft.

Essa é a posição oficial: https://github.com/microsoft/terminal/pull/1964 a última correção sobre isso. Do ano passado.

No geral a recomendação deles é a mesma que eu falo desde o ano passado aqui: não use isso. Fuja dessas coisas a menos que seja pago ou tenha uma nota a partir disso. Se vai usar num programa moderno e de console use Unicode e troque esses caracteres pelo correspondente em Unicode.

 

Se precisa mesmo disso porque tem um programa antigo bem antigo mesmo use o "legacy mode" da console.

 

Caracteres de controle


Esses caracteres eram chamados "caracteres de controle" porque podem ser gerados usando Control, claro. Até Control-Z. 

 

Mapa de Caracteres

No windows tem esse aplicativo onde você pode achar o código atual desses símbolos e acho que copiar para seu programa. Veja

image.png.e331af5d4db3b1d1b823817c78a5e069.png

 

Para escrever mesmo isso na console tem que dar umas voltas a mais em C ou C++ usando 

int _setmode (
   int fd,
   int mode
);

como descrito em https://docs.microsoft.com/pt-br/cpp/c-runtime-library/reference/setmode?view=vs-2019

 

E escrever usando wprintf() ou WriteConsoleW() descritas na mesma documentação.

 

Se precisar avise depois posto um exemplo.

image.png

  • Obrigado 2
Postado

Eu desde sempre usei Bloco de Notas de codificação UTF-8 então antes de testar qualquer coisa modifico o terminal para a mesma codificação binária que uso no meu editor predileto.

 

No terminal digito: chcp 65001

*Esse problema da discussão experimentei uma vez, depois nunca mais.

 

 

 

 

  • Curtir 1
Postado
Em 22/06/2020 às 01:51, devair1010 disse:

@arfneto     obrigado  ,  coloquei  esse código aqui e usei a biblioteca Windows.h , e mesmo assim não mostrou nenhum caractere desses antes de 33  

 


#include <iostream>
#include <windows.h>
int teste()
{
    SetConsoleOutputCP(437);
    SetConsoleCP(437);
    for (int x = 2; x < 20; x++)
        printf("%d: %c\n", x, x);
    return 0;
};
int main(){
    teste();
    return 32768;
}

 

 

 

1510334590_caractereschr_2.thumb.jpg.43dbbaabef8beeda336a6e57f8381c3a.jpg

 

Conseguiu reaver os caracteres perdidos?

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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!