#include #include "cabecera.h" #define G_ASCII_DTOSTR_BUF_SIZE (29 + 10) #include #define _(String) gettext (String) extern GtkWidget *boton14, *boton15; extern GnomeCanvasGroup *root10; extern GnomeCanvasPoints *points10; extern GtkWidget *entry11, *entry12; GString *salida; extern GtkTextView *view10; extern GtkTextBuffer *bufer10; extern GtkTextIter start10, end10; extern GnomeCanvasGroup *root12; gdouble X0, Y0; gchar *num_char="", *den_char=""; gint denominador, numerador; GArray *primos; gint max_primo; gint num_primos; gboolean Fin_Simplificacion=FALSE, irreducible=TRUE; void limpia() { gnome_canvas_item_new(root10, gnome_canvas_rect_get_type(), "x1", 108.0, /*cordenas de la */ "y1", 4.0, /*esquina sup-izq */ "x2", 680.0, /*ancho */ /*coord de la esquina inf-der*/ "y2", 105.0, /*alto */ "fill_color_rgba", 0xfff9f3ff, NULL); gtk_text_view_set_editable(view10 ,TRUE); gtk_text_buffer_set_text(bufer10, "", -1); gtk_text_buffer_get_selection_bounds (bufer10, &start10, &end10); gtk_text_buffer_insert_with_tags_by_name (bufer10, &start10, _("\n\n Para introducir una fracción nueva, teclea numerador y denominador y pulsa 'Aceptar'."), -1, "fuente_12", NULL); gtk_text_buffer_insert_with_tags_by_name (bufer10, &start10, _("\n Pulsando sobre 'el dado', el ordenador elige una fracción al azar."), -1, "fuente_12", NULL); gtk_text_view_set_editable(view10 ,FALSE); borra_canvas(root12); } void callback13 (GtkWidget *widget, gchar data) { limpia(); gtk_entry_set_text (GTK_ENTRY(entry11), ""); gtk_entry_set_text (GTK_ENTRY(entry12), ""); gtk_widget_set_sensitive(boton14, FALSE); gtk_widget_set_sensitive(boton15, FALSE); } void callback11 (GtkWidget *widget, gchar data) { char buf[G_ASCII_DTOSTR_BUF_SIZE]; gchar *temporal; gint azar_n, azar_d; azar_n=g_random_int_range (1,30); azar_d=g_random_int_range (2,90); temporal=g_ascii_dtostr(buf, sizeof(buf), azar_n); gtk_entry_set_text (GTK_ENTRY(entry11), temporal); temporal=g_ascii_dtostr(buf, sizeof(buf), azar_d); gtk_entry_set_text (GTK_ENTRY(entry12), temporal); aceptar(); } void aceptar() { gchar *color; gint i; gdouble den, num, partes, x1, x2; limpia(); salida=g_string_new(""); num_char=gtk_editable_get_chars(GTK_EDITABLE(entry11),0,-1); numerador=g_ascii_strtod(num_char, NULL); if (numerador==0) g_string_append(salida, "cero"); else if (numerador==1) g_string_append(salida, "un"); else num_a_letra(num_char); den_char=gtk_editable_get_chars(GTK_EDITABLE(entry12),0,-1); g_string_append(salida, " "); denominador=g_ascii_strtod(den_char, NULL); if ((denominador<11)||(denominador==100)) switch (denominador) { case 2: g_string_append(salida, "medios"); break; case 3: g_string_append(salida, "tercios"); break; case 4: g_string_append(salida, "cuartos"); break; case 5: g_string_append(salida, "quintos"); break; case 6: g_string_append(salida, "sextos"); break; case 7: g_string_append(salida, "séptimos"); break; case 8: g_string_append(salida, "octavos"); break; case 9: g_string_append(salida, "novenos"); break; case 10: g_string_append(salida, "décimos"); break; case 100: g_string_append(salida, "centésimos"); break; } else { num_a_letra(den_char); g_string_append(salida, "avos"); } if (numerador==1) g_string_truncate (salida, salida->len-1); if (denominador==0) { gtk_widget_set_sensitive(boton14, FALSE); gtk_widget_set_sensitive(boton15, FALSE); g_string_erase(salida, 0, -1); g_string_append(salida, _("El denominador no puede ser 0.\nNo se puede dividir entre 0")); } if ((denominador!=0)&&(numerador==0)) { gtk_widget_set_sensitive(boton14, FALSE); gtk_widget_set_sensitive(boton15, FALSE); g_string_erase(salida, 0, -1); g_string_append(salida, _("Si el numerador es 0, 'en realidad' no tenemos fracción.\nSi dividimos 0 entre cualquier número, obtenemos de resultado 0")); } gnome_canvas_item_new(root10, gnome_canvas_text_get_type(), "font", "monospace 12", "markup", salida->str, "fill_color", "blue", "x", 380.0, "y", 25.0, "anchor", GTK_ANCHOR_CENTER, NULL); if ((denominador>1)&&(numerador>0)) { gtk_widget_set_sensitive(boton14, TRUE); gtk_widget_set_sensitive(boton15, TRUE); gtk_text_view_set_editable(view10 ,TRUE); gtk_text_buffer_set_text(bufer10, "", -1); gtk_text_buffer_get_selection_bounds (bufer10, &start10, &end10); gtk_text_buffer_insert_with_tags_by_name (bufer10, &start10, _("\n\n Para introducir una fracción nueva, teclea numerador y denominador y pulsa 'Aceptar'."), -1, "fuente_12", NULL); gtk_text_buffer_insert_with_tags_by_name (bufer10, &start10, _("\n Pulsando sobre 'el dado', el ordenador elige una fracción al azar."), -1, "fuente_12", NULL); gtk_text_view_set_editable(view10 ,FALSE); num=g_ascii_strtod(num_char, NULL); den=g_ascii_strtod(den_char, NULL); x1=200.0; if (num<=den) { partes=350.0/den; x2=x1+partes; if (denominador<100) {for (i=1;i<=denominador; i++) { if (i<=numerador) color="orange"; else color="white"; gnome_canvas_item_new(root10, gnome_canvas_rect_get_type(), "x1", x1, /*cordenas de la */ "y1", 45.0, /*esquina sup-izq */ "x2", x2, /*ancho */ /*coord de la esquina inf-der*/ "y2", 70.0, /*alto */ "fill_color", color, /*color de relleno*/ "outline_color_rgba", 0xf30000ff, /*color del borde */ "width_units", 0.8, /*tamaño del borde*/ NULL); x1=x1+partes; x2=x1+partes; }} else { gnome_canvas_item_new(root10, gnome_canvas_rect_get_type(), "x1", 200.0, /*cordenas de la */ "y1", 45.0, /*esquina sup-izq */ "x2", 550.0, /*ancho */ /*coord de la esquina inf-der*/ "y2", 70.0, /*alto */ "fill_color", "white", /*color de relleno*/ "outline_color_rgba", 0xf30000ff, /*color del borde */ "width_units", 0.8, /*tamaño del borde*/ NULL); gnome_canvas_item_new(root10, gnome_canvas_rect_get_type(), "x1", 200.0, /*cordenas de la */ "y1", 45.0, /*esquina sup-izq */ "x2", 200.0+partes*num, /*ancho */ /*coord de la esquina inf-der*/ "y2", 70.0, /*alto */ "fill_color", "orange", /*color de relleno*/ "outline_color_rgba", 0xf30000ff, /*color del borde */ "width_units", 0.8, /*tamaño del borde*/ NULL); } g_string_erase(salida, 0, -1); g_string_append_printf (salida, "Dividimos la unidad en %i partes y tomamos %i",denominador,numerador); gnome_canvas_item_new(root10, gnome_canvas_text_get_type(), "font", "monospace 11", "markup", salida->str, "fill_color", "red", "x", 380.0, "y", 86.0, "anchor", GTK_ANCHOR_CENTER, NULL); } else { gint enteros; enteros=numerador/denominador; gnome_canvas_item_new(root10, gnome_canvas_rect_get_type(), "x1", 110.0, "y1", 40.0, "x2", 360.0, "y2", 60.0, "fill_color", "orange", /*color de relleno*/ "outline_color_rgba", 0xf30000ff, /*color del borde */ "width_units", 0.8, /*tamaño del borde*/ NULL); g_string_erase(salida, 0, -1); g_string_append_printf (salida, "%i unidades (%i/%i)",enteros,enteros*denominador,denominador); gnome_canvas_item_new(root10, gnome_canvas_text_get_type(), "font", "monospace 11", "markup", salida->str, "fill_color", "blue", "x", 235.0, "y", 50.0, "anchor", GTK_ANCHOR_CENTER, NULL); gnome_canvas_item_new(root10, gnome_canvas_text_get_type(), "font", "monospace 16", "markup", "+", "fill_color", "blue", "x", 380.0, "y", 50.0, "anchor", GTK_ANCHOR_CENTER, NULL); x1=400.0; partes=250.0/den; x2=x1+partes; if (denominador<100) { for (i=1;i<=denominador; i++) { if (i<=(numerador%denominador)) color="orange"; else color="white"; gnome_canvas_item_new(root10, gnome_canvas_rect_get_type(), "x1", x1, /*cordenas de la */ "y1", 40.0, /*esquina sup-izq */ "x2", x2, /*ancho */ /*coord de la esquina inf-der*/ "y2", 60.0, /*alto */ "fill_color", color, /*color de relleno*/ "outline_color_rgba", 0xf30000ff, /*color del borde */ "width_units", 0.8, /*tamaño del borde*/ NULL); x1=x1+partes; x2=x1+partes; }} else { gnome_canvas_item_new(root10, gnome_canvas_rect_get_type(), "x1", 400.0, /*cordenas de la */ "y1", 40.0, /*esquina sup-izq */ "x2", 650.0, /*ancho */ /*coord de la esquina inf-der*/ "y2", 60.0, /*alto */ "fill_color", "white", /*color de relleno*/ "outline_color_rgba", 0xf30000ff, /*color del borde */ "width_units", 0.8, /*tamaño del borde*/ NULL); gnome_canvas_item_new(root10, gnome_canvas_rect_get_type(), "x1", 400.0, /*cordenas de la */ "y1", 40.0, /*esquina sup-izq */ "x2", 400.0+partes*(numerador%denominador), "y2", 60.0, /*alto */ "fill_color", "orange", /*color de relleno*/ "outline_color_rgba", 0xf30000ff, /*color del borde */ "width_units", 0.8, /*tamaño del borde*/ NULL); } g_string_erase(salida, 0, -1); g_string_append_printf (salida, "(%i/%i)",numerador%denominador,denominador); gnome_canvas_item_new(root10, gnome_canvas_text_get_type(), "font", "monospace 11", "markup", salida->str, "fill_color", "blue", "x", 525.0, "y", 50.0, "anchor", GTK_ANCHOR_CENTER, NULL); g_string_erase(salida, 0, -1); g_string_append_printf (salida, _("Si dividimos [%i:%i] obtenemos %i de cociente y %i de resto"), numerador, denominador, enteros, numerador%denominador); gnome_canvas_item_new(root10, gnome_canvas_text_get_type(), "font", "monospace 12", "markup", salida->str, "fill_color", "red", "x", 380.0, "y", 80.0, "anchor", GTK_ANCHOR_CENTER, NULL); } } g_string_free(salida,TRUE); } void num_a_letra(gchar *cadena) { gint numero=0, unidades, decenas, centenas; gchar *uni[9]={"uno","dos","tres","cuatro","cinco","seis","siete","ocho","nueve"}; gchar *dec[9]={"diez","veinte","treinta","cuarenta","cincuenta","sesenta","setenta","ochenta","noventa"}; gchar *cen[9]={"ciento ", "doscientos ", "trescientos ", "cuatrocientos ", "quinientos ", "seiscientos ", "setecientos ", "ochocientos ", "novecientos "}; gboolean bandera_uni; numero=g_ascii_strtod(cadena, NULL); if (numero>99) centenas = numero/100; else centenas=0; if (numero>9 )decenas = (numero - centenas*100)/10; else decenas=0; unidades = numero - centenas*100 - decenas*10; if (unidades>0) bandera_uni=TRUE; else bandera_uni=FALSE; if (numero>99) { if (numero==100) g_string_append(salida, "cien"); else g_string_append(salida, cen[centenas-1]); } if ((numero>9) && (decenas>0)) { if (numero%10==0) g_string_append(salida, dec[decenas-1]); else { switch (decenas) { case 1: if (unidades>5) g_string_append(salida, "dieci"); else bandera_uni=FALSE; if (unidades==1) g_string_append(salida, "once"); if (unidades==2) g_string_append(salida, "doce"); if (unidades==3) g_string_append(salida, "trece"); if (unidades==4) g_string_append(salida, "catorce"); if (unidades==5) g_string_append(salida, "quince"); break; case 2: g_string_append(salida, "veinti"); break; default: g_string_append(salida, dec[decenas-1]); if (unidades>0) g_string_append(salida, " y "); } } } if (bandera_uni) g_string_append(salida, uni[unidades-1]); } void callback12 (GtkWidget *widget, gchar data) { aceptar(); } void callback14 (GtkWidget *widget, gchar data) { gint num_re, den_re, i; char buf[G_ASCII_DTOSTR_BUF_SIZE], buf2[G_ASCII_DTOSTR_BUF_SIZE]; gchar *char_num_re, *char_den_re; GString *frac_eq; aceptar(); gtk_text_view_set_editable(view10 ,TRUE); gtk_text_buffer_set_text(bufer10, "", -1); gtk_text_buffer_get_selection_bounds (bufer10, &start10, &end10); gtk_text_buffer_insert_with_tags_by_name (bufer10, &start10, _(" Podemos obtener fracciones equivalentes a otra, de dos formas:"), -1, "fuente_12", NULL); gtk_text_buffer_insert_with_tags_by_name (bufer10, &start10, _("\n - Multiplicando numerador y denominador por un mismo número: abajo están los ejemplos."), -1, "fuente_12", NULL); gtk_text_buffer_insert_with_tags_by_name (bufer10, &start10, _("\n - Dividiendo numerador y denominador por un mismo número: no siempre es posible. Para comprobar si es posible, en este caso, pulsa sobre "), -1, "fuente_12", NULL); gtk_text_buffer_insert_with_tags_by_name (bufer10, &start10, _("Simplificar"), -1, "fuente_12", "negrita", NULL); gtk_text_view_set_editable(view10 ,FALSE); borra_canvas(root12); frac_eq=g_string_new(""); g_string_append(frac_eq, _("Las fracciones ")); for (i=2; i<=4; i++) { X0=25.0; Y0=25.0 + 60.0*(i-2); dibuja_fraccion(num_char, den_char, root12, X0, Y0); switch (i) { case 2: dib_encima_sig("x2"); break; case 3: dib_encima_sig("x3"); break; case 4: dib_encima_sig("x4"); break; } dibuja_signo2(root12, "=", X0, Y0); num_re=numerador*i; den_re=denominador*i; char_num_re=g_ascii_dtostr(buf, sizeof(buf), num_re); char_den_re=g_ascii_dtostr(buf2, sizeof(buf2), den_re); dibuja_fraccion(char_num_re, char_den_re, root12, X0, Y0); g_string_append(frac_eq, char_num_re); g_string_append(frac_eq, "/"); g_string_append(frac_eq, char_den_re); g_string_append(frac_eq, " , "); } g_string_append(frac_eq, " ... "); gnome_canvas_item_new(root12, gnome_canvas_text_get_type(), "size-points", 14.0, "text", frac_eq->str , "fill_color", "blue", "x", 200.0, "y", 60.0, "anchor", GTK_ANCHOR_WEST, NULL); g_string_erase(frac_eq, 0, -1); g_string_append_printf(frac_eq, "son equivalentes a %i/%i", numerador, denominador); gnome_canvas_item_new(root12, gnome_canvas_text_get_type(), "size-points", 14.0, "text", frac_eq->str , "fill_color", "blue", "x", 200.0, "y", 90.0, "anchor", GTK_ANCHOR_WEST, NULL); g_string_free(frac_eq, TRUE); } void callback15 (GtkWidget *widget, gchar data) { gint div_com=1; gboolean creado_array_primos=FALSE; X0=25.0; Y0=25.0; aceptar(); dibuja_fraccion(num_char, den_char, root12, X0, Y0); Fin_Simplificacion=FALSE; irreducible=TRUE; while ((numerador%2==0)&&(denominador%2==0)) { simplifica(2); } if (denominador==1) simplifica(1); if (!Fin_Simplificacion) { max_primo=2; num_primos=1; crea_array_de_primos (); creado_array_primos=TRUE; while (div_comstr); dibuja_signo2(root12, "=", X0, Y0); numerador=numerador/divisor_comun; denominador=denominador/divisor_comun; char_num_re=g_ascii_dtostr(buf, sizeof(buf), numerador); char_den_re=g_ascii_dtostr(buf2, sizeof(buf2), denominador); dibuja_fraccion(char_num_re, char_den_re, root12, X0, Y0); g_string_free(cadena, TRUE); } else { dibuja_signo2(root12, "=", X0, Y0); Y0=Y0+15; dibuja_signo2(root12, char_num_re, X0, Y0); Fin_Simplificacion=TRUE; } } void insert_text_handler1 (GtkEditable *editable, const gchar *text, gint length, gint *position, gpointer data) { int i; GString *result; gboolean SI; result = g_string_new(""); for (i = 0; i < length; i++) { SI = FALSE; if (g_ascii_isdigit (text[i])) SI=TRUE; if (SI) g_string_append_c(result, text[i]); } g_signal_handlers_block_by_func (editable, (gpointer) insert_text_handler1, data); if (SI) gtk_editable_insert_text (editable, result->str, length, position); g_signal_handlers_unblock_by_func (editable, (gpointer) insert_text_handler1, data); g_signal_stop_emission_by_name (editable, "insert_text"); g_string_free (result, TRUE); } gboolean on_entry11_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data) { if ((event->keyval == 0xFF0D)||(event->keyval == 0xFF8D)) gtk_widget_grab_focus (entry12); return FALSE; } gboolean on_entry12_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data) { if ((event->keyval == 0xFF0D)||(event->keyval == 0xFF8D)) aceptar(); return FALSE; }