calculadora completa em linguagem C com gtk

1. calculadora completa em linguagem C com gtk

jackson valente jacob
jackgtkaprendiz

(usa Ubuntu)

Enviado em 27/08/2020 - 10:57h

Olá! fiz todo o código da calculadora completa feita em linguagem C usando a biblioteca gtk, mas o resultado não é o esperado, está dando resultados errados. O que será que está acontecendo? Sou iniciante em linguagem C/C++ e GTK. Alguem pode me ajudar? O código completo está logo abaixo, veja:

#include <gtk/gtk.h>
#include <stdio.h>
#include <stdbool.h>

double num1, num2;
char operador_final;

GtkWidget

//|-----------------Elementos Principais---------------------------|
*janela, *entrada, *tabela,

//|--------------------Botões normais------------------------------|
*botao0, *botao1, *botao2, *botao3, *botao4,

*botao5, *botao6, *botao7, *botao8, *botao9,

*botao_virgula,

//|--------------------Operadores----------------------------------|
*botao_soma, *botao_subtrai, *botao_multiplica, *botao_dividi,

//|-------------------Meta Operadores-------------------------------|
*botao_igual, *botao_limpa;


int quantifica_numeros_totais(const char *entrada_de_texto){
int contador = 0;
for (contador = 0; entrada_de_texto[contador] != 0; ++contador){}
return (contador);
}


void inseri_numero_na_entrada (GtkButton *botao, gpointer numero){
const char *entrada_de_texto = gtk_entry_get_text(GTK_ENTRY(entrada));

const int quantidade_de_numeros = quantifica_numeros_totais(entrada_de_texto);

if(quantidade_de_numeros > 8){return ;}

char vetor_de_saida[9];
sprintf(vetor_de_saida,"%s%c",entrada_de_texto,*(char *)numero);

const char *string_de_saida = &vetor_de_saida[0];


gtk_entry_set_text(GTK_ENTRY(entrada),string_de_saida);
}


void registra_operador (GtkButton *botao, gpointer operador){
const char *entrada_de_texto = gtk_entry_get_text(GTK_ENTRY(entrada));
const int quantidade_de_numeros = quantifica_numeros_totais(entrada_de_texto);

if
(quantidade_de_numeros == 0 && *(char*)operador == '-')
{inseri_numero_na_entrada(botao,operador);
return;}

if(quantidade_de_numeros == 0){return;}


num1 = atof(entrada_de_texto);
operador_final = *(char *)operador;
gtk_entry_set_text(GTK_ENTRY(entrada),"");


}

void imprimi_resultado_na_entrada(void){
const char *entrada_de_texto = gtk_entry_get_text(GTK_ENTRY(entrada));

const int quantidade_de_numeros = quantifica_numeros_totais(entrada_de_texto);
if(quantidade_de_numeros == 0){return;}


num2 = atof(entrada_de_texto);

double resultado;
char resultado_em_vetor [20];
switch (operador_final) {

case '+':
resultado = num1 + num2;
break;

case '-':
resultado = num1 - num2;
break;

case '*':
resultado = num1 * num2;
break;

case '/':
resultado = num1 / num2;
break;

}
sprintf(resultado_em_vetor,"%lf",resultado);


const char *resultado_de_saida = &resultado_em_vetor[0];
gtk_entry_set_text(GTK_ENTRY(entrada),resultado_de_saida);

}

void limpa(void){
operador_final = 0;
num1 = 0;
num2 = 0;
gtk_entry_set_text(GTK_ENTRY(entrada),"");



}

int main (int argc, char *argv[] ){

//|-----------------------Declaração de inicialização----------------|
gtk_init (&argc, &argv);

//------------------------Inicialização de Widgets-------------------|
janela = gtk_window_new (GTK_WINDOW_TOPLEVEL); //Inicializa a janela
entrada = gtk_entry_new(); //Inicializa a entrada


botao0 = gtk_button_new_with_label ("0");
botao1 = gtk_button_new_with_label ("1");
botao2 = gtk_button_new_with_label ("2");
botao3 = gtk_button_new_with_label ("3");
botao4 = gtk_button_new_with_label ("4");
botao5 = gtk_button_new_with_label ("5");
botao6 = gtk_button_new_with_label ("6");
botao7 = gtk_button_new_with_label ("7");
botao8 = gtk_button_new_with_label ("8");
botao9 = gtk_button_new_with_label ("9");
botao_virgula = gtk_button_new_with_label (",");

botao_soma = gtk_button_new_with_label ("+");
botao_subtrai = gtk_button_new_with_label ("-");
botao_multiplica = gtk_button_new_with_label ("x");
botao_dividi = gtk_button_new_with_label ("÷");


botao_limpa = gtk_button_new_with_label ("Limpa");
botao_igual = gtk_button_new_with_label ("=");

tabela = gtk_table_new (6,4,TRUE);

gtk_window_set_title (GTK_WINDOW(janela),"Calculadora GTK");
gtk_window_set_default_size(GTK_WINDOW(janela), 220, 300);


gtk_table_attach_defaults (GTK_TABLE(tabela),entrada, 0,4,0,1);

gtk_table_attach_defaults (GTK_TABLE(tabela),botao_limpa, 0,2,1,2);
gtk_table_attach_defaults (GTK_TABLE(tabela),botao_dividi, 2,3,1,2);
gtk_table_attach_defaults (GTK_TABLE(tabela),botao_multiplica, 3,4,1,2);


gtk_table_attach_defaults (GTK_TABLE(tabela),botao7, 0,1,2,3);
gtk_table_attach_defaults (GTK_TABLE(tabela),botao8, 1,2,2,3);
gtk_table_attach_defaults (GTK_TABLE(tabela),botao9, 2,3,2,3);
gtk_table_attach_defaults (GTK_TABLE(tabela),botao_subtrai, 3,4,2,3);

gtk_table_attach_defaults (GTK_TABLE(tabela),botao4, 0,1,3,4);
gtk_table_attach_defaults (GTK_TABLE(tabela),botao5, 1,2,3,4);
gtk_table_attach_defaults (GTK_TABLE(tabela),botao6, 2,3,3,4);
gtk_table_attach_defaults (GTK_TABLE(tabela),botao_soma, 3,4,3,4);

gtk_table_attach_defaults (GTK_TABLE(tabela),botao1, 0,1,4,5);
gtk_table_attach_defaults (GTK_TABLE(tabela),botao2, 1,2,4,5);
gtk_table_attach_defaults (GTK_TABLE(tabela),botao3, 2,3,4,5);

gtk_table_attach_defaults (GTK_TABLE(tabela),botao0, 0,2,5,6);
gtk_table_attach_defaults (GTK_TABLE(tabela),botao_virgula, 2,3,5,6);
gtk_table_attach_defaults (GTK_TABLE(tabela),botao_igual, 3,4,4,6);


gtk_table_set_row_spacings (GTK_TABLE(tabela),3);
gtk_table_set_col_spacings (GTK_TABLE(tabela),3);

gtk_container_add(GTK_CONTAINER(janela),tabela); //empacota a tabela dentro da janela7

char numeros[] = "0123456789,", operadores[] = "+-*/";

g_signal_connect(G_OBJECT(janela), "destroy",G_CALLBACK(gtk_main_quit), NULL);

g_signal_connect (botao0, "clicked", G_CALLBACK (inseri_numero_na_entrada), &numeros[0]);
g_signal_connect (botao1, "clicked", G_CALLBACK (inseri_numero_na_entrada), &numeros[1]);
g_signal_connect (botao2, "clicked", G_CALLBACK (inseri_numero_na_entrada), &numeros[2]);
g_signal_connect (botao3, "clicked", G_CALLBACK (inseri_numero_na_entrada), &numeros[3]);
g_signal_connect (botao4, "clicked", G_CALLBACK (inseri_numero_na_entrada), &numeros[4]);
g_signal_connect (botao5, "clicked", G_CALLBACK (inseri_numero_na_entrada), &numeros[5]);
g_signal_connect (botao6, "clicked", G_CALLBACK (inseri_numero_na_entrada), &numeros[6]);
g_signal_connect (botao7, "clicked", G_CALLBACK (inseri_numero_na_entrada), &numeros[7]);
g_signal_connect (botao8, "clicked", G_CALLBACK (inseri_numero_na_entrada), &numeros[8]);
g_signal_connect (botao9, "clicked", G_CALLBACK (inseri_numero_na_entrada), &numeros[9]);
g_signal_connect (botao_virgula, "clicked", G_CALLBACK (inseri_numero_na_entrada), &numeros[10]);

g_signal_connect (botao_soma, "clicked", G_CALLBACK (registra_operador), &operadores[0]);
g_signal_connect (botao_subtrai, "clicked", G_CALLBACK (registra_operador), &operadores[1]);
g_signal_connect (botao_multiplica,"clicked", G_CALLBACK (registra_operador), &operadores[2]);
g_signal_connect (botao_dividi, "clicked", G_CALLBACK (registra_operador), &operadores[3]);


g_signal_connect (botao_igual, "clicked", G_CALLBACK (imprimi_resultado_na_entrada), NULL);

g_signal_connect (botao_limpa, "clicked", G_CALLBACK (limpa), NULL);

gtk_widget_show_all (janela); //Habilita a visualização da Janela
gtk_main (); // Inicia o Loop principal GTK

return 0;}