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;}