Ir ao conteúdo
  • Cadastre-se
Zin762

C Imprimir em notação de potência

Posts recomendados

Alguem sabe alguma função em C que eu consigo imprimir algo como 3⁸, onde ambos 3 e 8 são variáveis?

Obs: não quero imprimir o resultado da potência, quero que seja impresso exatamente na forma de potência.

Obrigado adiantado!

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Zin762      você quer imprimir o número três  desse tamanho e logo em seguida imprimir o número 8 que seja a metade do tamanho do 3  ?   ,   no console ainda não vi nenhuma função que faça isso ,    mas  creio que usando a API do windows    :

https://vulms.vu.edu.pk/Courses/CS410/Downloads/Charles Petzold - Programming Windows - 5th Ed.pdf

 

 você pode conseguir  usando comandos como        :   

(UINT) WM_SETFONT, (WPARAM) GetStockObject(DEFAULT_GUI_FONT)

ou outras bibliotecas , como wxwidgets , sdl   ,  sfml ,   graphics.h ,  Allegro , e se você usar o  compilador   jbuilder c++ com o método canvas .

        ou , no console , você pode criar sua própria fonte , usando a biblioteca windows.h , e configurando o compilador da IDE  codeblocks  para usar a       -lgdi32 ,   assim você poderá acessar os pixeis da tela e usando uma rotina que desenhe o número , criado por você mesmo e armazenado em um vetor ,  na tela na posição especificada onde o cursor estiver , e para saber a posição do cursor você pode usar o comando     GetConsoleScreenBufferInfo(hOut, &SBInfo);

          faça seu código e poste aqui para vermos como está e em que podemos ajudar   .

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja se o código abaixo funcionar:


#include <iostream>

using namespace std;

int main()
{
   
 
    wcout << L"x\x00B1+x\x00B2+x\x00B3";
}

Se no lugar dos expoente aparecer interrogação, e porque seu console não suportar o UTF-8 (teria que alterar os parâmetros de compilação, acredito).

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Precisa usar os códigos hexadecimais Unicode para os caracteres dos dígitos Superscript, e usar uma fonte que possui as representações desses caracteres.

 

Fiz um exemplo com caracteres superscript nesses links:

https://onlinegdb.com/HyYMzPAOB (C)
https://onlinegdb.com/r1QrxwAuB (C++)

 

E aqui estão as partes da tabela Unicode com os dígitos superscript e subscript:
https://www.compart.com/en/unicode/block/U+2070
https://www.compart.com/en/unicode/block/U+0080 (tem os dígitos 1, 2 e 3) 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick Você tem alguma ideia de como eu posso usar esses códigos como variáveis? por exemplo ao invés de:

printf("\u2079"); 

Eu ter algo do tipo:

printf("\u%d",2079);

Eu cheguei a testar o exemplo acima e não funcionou, mas acho que da pra entender o que eu preciso exatamente.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Zin762  Poderia fazer assim:

                        /*    0         1         2         3         4    */
char superscript[10][4] = {"\u2070", "\u00B9", "\u00B2", "\u00B3", "\u2074",
                           "\u2075", "\u2076", "\u2077", "\u2078", "\u2079"};
                        /*    5         6         7         8         9    */

printf("%.3s", superscript[5]); //imprime o caractere superscript do digito 5

 

Até fiz um programa com uma função para transformar um número inteiro em uma string de dígitos superscript:

Teste aqui: https://onlinegdb.com/Sk0rMLgFS

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <math.h>

char *superscriptinteger(char *buffer, int n){
                            /*    0         1         2         3         4    */
    char superscript[10][4] = {"\u2070", "\u00B9", "\u00B2", "\u00B3", "\u2074",
                               "\u2075", "\u2076", "\u2077", "\u2078", "\u2079"};
                            /*    5         6         7         8         9    */
    int digit;
    static bool finished = true;
    
    if (n == 0 && finished){
        sprintf(buffer, "%.3s", superscript[0]);
        return buffer;
    }
    
    if (finished) {
        buffer[0] = '\0';
        finished = false;
    }
    
    if (n < 0){
        strcat(buffer, "\u207B"); // sinal negativo -
        n = -n;
    }
    
    if (n > 0){
        digit = n % 10;
        superscriptinteger(buffer, n/10);
        strcat(buffer, superscript[digit]);
    }
    
    if (n == 0){
        finished = true;
    }
    
    return buffer;
}

int main()
{
    
    char expoente[22];
    
    superscriptinteger(expoente, 1234);
    printf("%s\n", expoente);
    
    superscriptinteger(expoente, -1234);
    printf("%s\n", expoente);
    
    superscriptinteger(expoente, 0);
    printf("%s\n", expoente);
    
    printf("%d%s = %d\n", 2, superscriptinteger(expoente, 12), (int)pow(2, 12));
    

    return 0;
}

 

  • Obrigado 1
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick      gostei da ideia de poder imprimir o número maior que outro ,  então colei esse código aqui no codeblocks , mas não funcionou como esperava ,  o que pode ter acontecido ? 

superscript.JPG.ac709c9b9b68f3ce91d89826b738f9ca.JPG

Compartilhar este post


Link para o post
Compartilhar em outros sites

@devair1010 O command prompt é notoriamente ruim para lidar com Unicode, mas consegui fazer o código funcionar usando a Windows API (windows.h) para alterar a codepage do console para 65001 (UTF-8), e configurando a janela do console para usar uma fonte que possui os caracteres relevantes (por exemplo a fonte Consolas).

 

Segue o código modificado para o Windows:

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <windows.h>
#include <math.h>

char *superscriptinteger(char *buffer, int n){
                            /*    0         1         2         3         4    */
    char superscript[10][4] = {"\u2070", "\u00B9", "\u00B2", "\u00B3", "\u2074",
                               "\u2075", "\u2076", "\u2077", "\u2078", "\u2079"};
                            /*    5         6         7         8         9    */
    int digit;
    static bool finished = true;
    
    if (n == 0 && finished){
        sprintf(buffer, "%.3s", superscript[0]);
        return buffer;
    }
    
    if (finished) {
        buffer[0] = '\0';
        finished = false;
    }
    
    if (n < 0){
        strcat(buffer, "\u207B"); // sinal negativo -
        n = -n;
    }
    
    if (n > 0){
        digit = n % 10;
        superscriptinteger(buffer, n/10);
        strcat(buffer, superscript[digit]);
    }
    
    if (n == 0){
        finished = true;
    }
    
    return buffer;
}

int main()
{
    char expoente[22];

    /*
    FILE *f = fopen("teste_superscript.txt", "w");
    superscriptinteger(expoente, 1234);
    fprintf(f, "%s\n", expoente);
    
    superscriptinteger(expoente, -1234);
    fprintf(f, "%s\n", expoente);
    
    superscriptinteger(expoente, 0);
    fprintf(f, "%s\n", expoente);
    
    fprintf(f, "%d%s = %d\n", 2, superscriptinteger(expoente, 12), (int)pow(2, 12));
    
    fclose(f);
    */
    
    unsigned int cp = 65001;
    
    unsigned int cpIn = GetConsoleCP();
    unsigned int cpOut = GetConsoleOutputCP();
    
    SetConsoleOutputCP(cp);
    SetConsoleCP(cp);
    
    superscriptinteger(expoente, 1234);
    printf("%s\n", expoente);
    
    superscriptinteger(expoente, -1234);
    printf("%s\n", expoente);
    
    superscriptinteger(expoente, 0);
    printf("%s\n", expoente);
    
    printf("%d%s = %d\n", 2, superscriptinteger(expoente, 12), (int)pow(2, 12));
    
    SetConsoleCP(cpIn);
    SetConsoleOutputCP(cpOut);
    
    return 0;
}

 

Pode também ser necessário salvar esse código em um arquivo de texto com encoding UTF-8 (no codeblocks vá em Edit > File Enconding > UTF-8), ou então configurar a tag de compilação -fexec-charset=utf-8 , para que o programa compilado produza os caracteres usando a codificação UTF-8 que poderá ser representada corretamente pela codepage 65001 do console.

 

OBS: A parte comentada do código gera o texto em um arquivo txt, e não tem as limitações do command prompt.

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!