/* F410 - FRACCIONES */ #include #include "cabecera.h" #define G_ASCII_DTOSTR_BUF_SIZE (29 + 10) #include #define _(String) gettext (String) extern GnomeCanvasGroup *root20, *root21; GnomeCanvasPoints *points; extern GtkWidget *entry1, *entry2, *entry3, *entry4; extern GtkTextBuffer *bufer21; extern GtkTextView *view21; extern GtkTextIter start21, end21; extern GtkWidget *boton8; gchar *signo=""; gchar *n1, *d1, *n2, *d2, *nr, *dr; gint num1, den1, num2, den2, numr, denr; gdouble Coordx, Coordy; void texto_inicio() { gtk_text_buffer_set_text(bufer21, "", -1); gtk_text_buffer_get_selection_bounds (bufer21, &start21, &end21); gtk_text_buffer_insert_with_tags_by_name (bufer21, &start21, _("\n1) Introduce dos fracciones (o pulsa sobre 'el dado' para que elija el ordenador).\n2) Pulsa sobre uno de los signos: "), -1, "fuente_12", NULL); gtk_text_buffer_insert_with_tags_by_name (bufer21, &start21, "(+)", -1, "fuente_12", "negrita","azul", NULL); gtk_text_buffer_insert_with_tags_by_name (bufer21, &start21, _(" Suma "), -1, "fuente_12", NULL); gtk_text_buffer_insert_with_tags_by_name (bufer21, &start21, "(⎼)", -1, "fuente_12", "negrita","azul", NULL); gtk_text_buffer_insert_with_tags_by_name (bufer21, &start21, _(" Resta "), -1, "fuente_12", NULL); gtk_text_buffer_insert_with_tags_by_name (bufer21, &start21, "(*)", -1, "fuente_12", "negrita","azul", NULL); gtk_text_buffer_insert_with_tags_by_name (bufer21, &start21, _(" Producto "), -1, "fuente_12", NULL); gtk_text_buffer_insert_with_tags_by_name (bufer21, &start21, "(≃)", -1, "fuente_12", "negrita","azul", NULL); gtk_text_buffer_insert_with_tags_by_name (bufer21, &start21, _(" División "), -1, "fuente_12", NULL); gtk_text_buffer_insert_with_tags_by_name (bufer21, &start21, "\n(≈)", -1, "fuente_12", "negrita","azul", NULL); gtk_text_buffer_insert_with_tags_by_name (bufer21, &start21, _(" Equivalencia "), -1, "fuente_12", NULL); gtk_text_buffer_insert_with_tags_by_name (bufer21, &start21, "(≦)", -1, "fuente_12", "negrita","azul", NULL); gtk_text_buffer_insert_with_tags_by_name (bufer21, &start21, _(" Comparación \n\n Pulsando sobre "), -1,"fuente_12", NULL); gtk_text_buffer_insert_with_tags_by_name (bufer21, &start21, "(=)", -1, "fuente_12", "negrita", NULL); gtk_text_buffer_insert_with_tags_by_name (bufer21, &start21, _(" obtendrás el proceso, paso a paso, y el resultado final. \n\n Para ver otro ejemplo, pulsa sobre "), -1, "fuente_12", NULL); gtk_text_buffer_insert_with_tags_by_name (bufer21, &start21, _("Limpiar"), -1, "fuente_12", "negrita", NULL); } void dibuja_signo(gchar *signo) { gnome_canvas_item_new(root20, gnome_canvas_rect_get_type(), "x1", 96.0, /*cordenas de la */ "y1", 33.0, /*esquina sup-izq */ "x2", 149.0, /*ancho */ /*coord de la esquina inf-der*/ "y2", 53.0, /*alto */ "fill_color_rgba", 0xf3f9f3ff, /*color de relleno*/ "outline_color_rgba", 0xf3f9f3ff, /*color del borde */ "width_units", 1.0, /*tamaño del borde*/ NULL); gnome_canvas_item_new(root20, gnome_canvas_text_get_type(), "size-points", 20.0, "markup", signo, "fill_color", "black", "x", 116.0, "y", 42.0, "anchor", GTK_ANCHOR_WEST, NULL); } void callback1 (GtkWidget *widget, gchar data) { signo="+"; dibuja_signo(signo); } void callback2 (GtkWidget *widget, gchar data) { signo="⎼"; dibuja_signo(signo); } void callback3 (GtkWidget *widget, gchar data) { signo="·"; dibuja_signo(signo); } void callback4 (GtkWidget *widget, gchar data) { signo=":"; dibuja_signo(signo); } void callback5 (GtkWidget *widget, gchar data) { borra_canvas(root21); signo=""; dibuja_signo(signo); if (mira_numeros()) { GString *linea; char buf[G_ASCII_DTOSTR_BUF_SIZE]; gdouble x, y; num1 = g_ascii_strtod(n1 ,NULL); num2 = g_ascii_strtod(n2 ,NULL); den1 = g_ascii_strtod(d1 ,NULL); den2 = g_ascii_strtod(d2 ,NULL); Coordx=20.0; Coordy=30.0; if ((den1==den2)&&(num1==num2)) dibuja_signo2(root21, _("Las fracciones son equivalentes (puesto que son iguales)"), Coordx+30, Coordy+30); if ((den1!=den2)||(num1!=num2)) { dibuja_fraccion(n1, d1, root21, Coordx, Coordy); x=Coordx; y=Coordy; points = gnome_canvas_points_new(2); /* 2 puntos */ points->coords[0] = x-10; points->coords[1] = y-10; points->coords[2] = x+20; points->coords[3] = y+10; gnome_canvas_item_new(root21, gnome_canvas_line_get_type(), "points", points,"fill_color", "orange", "width_units", 1.0, NULL); gnome_canvas_points_unref(points); points = gnome_canvas_points_new(3); /* 6 puntos */ points->coords[0] = x+20; points->coords[1] = y+10; points->coords[2] = x+20; points->coords[3] = y+5; points->coords[4] = x+15; points->coords[5] = y+10; gnome_canvas_item_new(root21, gnome_canvas_polygon_get_type(), "points", points,"fill_color", "orange", "outline_color", "orange","width_units", 1.0, NULL); gnome_canvas_points_unref(points); points = gnome_canvas_points_new(2); /* 2 puntos */ points->coords[0] = x-10; points->coords[1] = y+10; points->coords[2] = x+20; points->coords[3] = y-10; gnome_canvas_item_new(root21, gnome_canvas_line_get_type(), "points", points,"fill_color", "orange", "width_units", 1.0, NULL); gnome_canvas_points_unref(points); points = gnome_canvas_points_new(3); /* 3 puntos */ points->coords[0] = x+20; points->coords[1] = y-10; points->coords[2] = x+20; points->coords[3] = y-5; points->coords[4] = x+15; points->coords[5] = y-10; gnome_canvas_item_new(root21, gnome_canvas_polygon_get_type(), "points", points, "fill_color", "orange", "outline_color", "orange", "width_units", 1.0, NULL); gnome_canvas_points_unref(points); dibuja_signo2(root21, " ", Coordx, Coordy); dibuja_fraccion(n2, d2, root21, Coordx+5, Coordy); gnome_canvas_item_new(root21, gnome_canvas_text_get_type(), "font", "monospace 12", "markup", " Multiplicamos en cruz ", "fill_color", "orange", "x", Coordx, "y", Coordy, "anchor", GTK_ANCHOR_WEST, NULL); Coordx=20.0; Coordy=100.0; char buf1[G_ASCII_DTOSTR_BUF_SIZE], buf2[G_ASCII_DTOSTR_BUF_SIZE]; linea=g_string_new(NULL); gchar *prod_1, *prod_2; g_string_erase(linea,0,linea->len); g_string_append(linea, n1); g_string_append(linea, " · "); g_string_append(linea, d2); g_string_append(linea, " = "); prod_1=g_ascii_dtostr(buf1, sizeof(buf), num1*den2); g_string_append(linea, prod_1); dibuja_signo2(root21, linea->str, Coordx, Coordy); Coordx=20.0; Coordy=130.0; g_string_erase(linea,0,linea->len); g_string_append(linea, d1); g_string_append(linea, " · "); g_string_append(linea, n2); g_string_append(linea, " = "); prod_2=g_ascii_dtostr(buf2, sizeof(buf), num2*den1); g_string_append(linea, prod_2); dibuja_signo2(root21, linea->str, Coordx, Coordy); Coordx=20.0; Coordy=170.0; g_string_erase(linea,0,linea->len); gchar *color; if (num1*den2==num2*den1) { g_string_append(linea, _("Las fracciones son equivalentes \n(se obtiene el mismo resultado al multiplicar en cruz)")); color="forest green"; } else { g_string_append(linea, _("Las fracciones NO son equivalentes \n(NO se obtiene el mismo resultado al multiplicar en cruz)")); color="red"; } gnome_canvas_item_new(root21, gnome_canvas_text_get_type(), "font", "monospace 13", "markup", linea->str, "fill_color", color, "x", Coordx, "y", Coordy, "anchor", GTK_ANCHOR_WEST, NULL); g_string_free(linea,TRUE); } /* fin de else*/ } } void callback6 (GtkWidget *widget, gchar data) { borra_canvas(root21); signo=""; dibuja_signo(signo); if (mira_numeros()) { GString *linea, *linea2; gint caso; gboolean igual_sig, sig_f1, sig_f2; char buf[G_ASCII_DTOSTR_BUF_SIZE]; char buf1[G_ASCII_DTOSTR_BUF_SIZE], buf2[G_ASCII_DTOSTR_BUF_SIZE], buf3[G_ASCII_DTOSTR_BUF_SIZE], buf4[G_ASCII_DTOSTR_BUF_SIZE]; num1 = g_ascii_strtod(n1 ,NULL); num2 = g_ascii_strtod(n2 ,NULL); den1 = g_ascii_strtod(d1 ,NULL); den2 = g_ascii_strtod(d2 ,NULL); if ((den1<0)||(den2<0)) { evita_den_neg(); n1=g_ascii_dtostr(buf1, sizeof(buf1), num1); n2=g_ascii_dtostr(buf2, sizeof(buf2), num2); d1=g_ascii_dtostr(buf3, sizeof(buf3), den1); d2=g_ascii_dtostr(buf4, sizeof(buf4), den2); } if (((den1>0)&&(num1>0))||((den1<0)&&(num1<0))) sig_f1=TRUE; else sig_f1=FALSE; if (((den2>0)&&(num2>0))||((den2<0)&&(num2<0))) sig_f2=TRUE; else sig_f2=FALSE; if (((sig_f1)&&(sig_f2))||((!sig_f1)&&(!sig_f2))) igual_sig=TRUE; else igual_sig=FALSE; Coordx=20.0; Coordy=30.0; if (!igual_sig) { Coordy=Coordy+15.0; gnome_canvas_item_new(root21, gnome_canvas_text_get_type(), "font", "monospace 12", "markup", _("Puesto que tienen distinto signo, es menor la negativa"), "fill_color", "blue", "x", 20.0, "y", 110.0, "anchor", GTK_ANCHOR_WEST, NULL); } else { dibuja_fraccion(n1, d1, root21, Coordx, Coordy); dibuja_signo2(root21, " ,", Coordx, Coordy); dibuja_fraccion(n2, d2, root21, Coordx+10, Coordy); if ((den1==den2)&&(num1==num2)) caso=1; if ((den1!=den2)&&(num1==num2)) caso=2; if ((den1==den2)&&(num1!=num2)) caso=3; if ((den1!=den2)&&(num1!=num2)) caso=4; linea=g_string_new(NULL); switch (caso) { case 1: dibuja_signo2(root21, _("Las fracciones son iguales"), 50.0, 100.0); Coordy=Coordy+15; break; case 2: g_string_append (linea, _("Al tener los numeradores iguales,\nes menor la que tenga el denominador mayor\n")); if (den1str,"fill_color", "blue", "x", 20.0, "y", 110.0, "anchor", GTK_ANCHOR_WEST, NULL); break; case 3: g_string_append (linea, _("Al tener los denominadores iguales,\nes menor la que tenga el numerador menor\n")); if (num1str,"fill_color", "blue", "x", 20.0, "y", 110.0, "anchor", GTK_ANCHOR_WEST, NULL); break; case 4: g_string_append (linea,_("Tienen distinto denominador, las reducimos a común denominador.\nUna vez que tienen igual denominador, es mayor la que tenga numerador mayor.")); Coordx=Coordx+10; dibuja_signo2(root21, "=", Coordx, Coordy); gint m_c_m, div1, div2; gchar *div_1, *div_2; char buf1[G_ASCII_DTOSTR_BUF_SIZE], buf2[G_ASCII_DTOSTR_BUF_SIZE]; char buf3[G_ASCII_DTOSTR_BUF_SIZE], buf4[G_ASCII_DTOSTR_BUF_SIZE]; m_c_m=mcm(den1, den2); dr=g_ascii_dtostr(buf, sizeof(buf), m_c_m); linea2=g_string_new(NULL); div1=m_c_m/den1; div_1=g_ascii_dtostr(buf1, sizeof(buf), div1); g_string_erase(linea2,0,linea2->len); g_string_append(linea2, div_1); g_string_append(linea2, "·"); if (num1<0) g_string_append(linea2, "("); g_string_append(linea2, n1); if (num1<0) g_string_append(linea2, ")"); dibuja_fraccion(linea2->str, dr, root21, Coordx, Coordy); dibuja_signo2(root21, ",", Coordx, Coordy); div2=m_c_m/den2; g_string_erase(linea2,0,linea2->len); div_2=g_ascii_dtostr(buf2, sizeof(buf), div2); g_string_append(linea2, div_2); g_string_append(linea2, "·"); if (num2<0) g_string_append(linea2, "("); g_string_append(linea2, n2); if (num2<0) g_string_append(linea2, ")"); dibuja_fraccion(linea2->str, dr, root21, Coordx, Coordy); dibuja_signo2(root21, "=", Coordx, Coordy); g_string_erase(linea2,0,linea2->len); div1=div1*num1; div_1=g_ascii_dtostr(buf3, sizeof(buf), div1); g_string_append(linea2, div_1); dibuja_fraccion(linea2->str, dr, root21, Coordx, Coordy); dibuja_signo2(root21, ",", Coordx, Coordy); g_string_erase(linea2,0,linea2->len); div2=div2*num2; div_2=g_ascii_dtostr(buf4, sizeof(buf), div2); g_string_append(linea2, div_2); dibuja_fraccion(linea2->str, dr, root21, Coordx, Coordy); if (div1div2) g_string_append_printf (linea, _("\nComo %i es mayor que %i , es mayor la primera fracción"), div1, div2); if (div1==div2) g_string_append_printf (linea, _("\nComo tienen igual numerador , las fracciones son iguales")); gnome_canvas_item_new(root21, gnome_canvas_text_get_type(), "font", "monospace 12", "markup", linea->str, "fill_color", "blue", "x", 20.0, "y", 110.0, "anchor", GTK_ANCHOR_WEST, NULL); g_string_free(linea2, TRUE); break; } g_string_free(linea, TRUE); } /*fin de igual signo*/ gnome_canvas_item_new(root21, gnome_canvas_rect_get_type(), "x1", 185.0, /*cordenas de la */ "y1", 150.0, /*esquina sup-izq */ "x2", 330.0, /*ancho */ /*coord de la esquina inf-der*/ "y2", 210.0, /*alto */ "fill_color", "salmon", /*color de relleno*/ "outline_color", "red", /*color del borde */ "width_units", 1.0, /*tamaño del borde*/ NULL); Coordx=200.0; Coordy=Coordy+120.0; dibuja_fraccion(n1, d1, root21, Coordx, Coordy); if ((den1==den2)&&(num1==num2)) dibuja_signo2(root21, "=", Coordx, Coordy); else { if ((num1*den2)<(num2*den1)) dibuja_signo2(root21, "<", Coordx, Coordy); if ((num1*den2)>(num2*den1)) dibuja_signo2(root21, ">", Coordx, Coordy); if ((num1*den2)==(num2*den1)) dibuja_signo2(root21, "=", Coordx, Coordy); } dibuja_fraccion(n2, d2, root21, Coordx+10, Coordy); } } void callback7 (GtkWidget *widget, gchar data) { borra_canvas(root21); gtk_entry_set_text (GTK_ENTRY(entry1), ""); gtk_entry_set_text (GTK_ENTRY(entry2), ""); gtk_entry_set_text (GTK_ENTRY(entry3), ""); gtk_entry_set_text (GTK_ENTRY(entry4), ""); texto_inicio(); signo=""; dibuja_signo(signo); } void callback9 (GtkWidget *widget, gchar data) { char buf[G_ASCII_DTOSTR_BUF_SIZE]; gchar *temporal; gint azar_n1, azar_n2, azar_d1, azar_d2; azar_n1=g_random_int_range (1,20); azar_n2=g_random_int_range (1,20); azar_d1=g_random_int_range (1,20); azar_d2=g_random_int_range (1,20); temporal=g_ascii_dtostr(buf, sizeof(buf), azar_n1); gtk_entry_set_text (GTK_ENTRY(entry1), temporal); temporal=g_ascii_dtostr(buf, sizeof(buf), azar_n2); gtk_entry_set_text (GTK_ENTRY(entry2), temporal); temporal=g_ascii_dtostr(buf, sizeof(buf), azar_d1); gtk_entry_set_text (GTK_ENTRY(entry3), temporal); temporal=g_ascii_dtostr(buf, sizeof(buf), azar_d2); gtk_entry_set_text (GTK_ENTRY(entry4), temporal); borra_canvas(root21); signo=""; dibuja_signo(signo); texto_inicio(); } gboolean mira_numeros() { gchar *error=""; gboolean semaforo=TRUE; gint contador=0; n1 = gtk_editable_get_chars(GTK_EDITABLE(entry1),0,-1); n2 = gtk_editable_get_chars(GTK_EDITABLE(entry2),0,-1); d1 = gtk_editable_get_chars(GTK_EDITABLE(entry3),0,-1); d2 = gtk_editable_get_chars(GTK_EDITABLE(entry4),0,-1); if (strlen(n1)!=0) contador++; if (strlen(n2)!=0) contador++; if (strlen(d1)!=0) contador++; if (strlen(d2)!=0) contador++; if (contador<4) error=_(" Faltan datos. "); if (strlen(error)==0) if (!comprueba_num(n1)) error=_(" Caracteres no válidos en el primer numerador\n Sólo se permiten dígitos [0-9]\nprecedidos (opcionalmente) por un signo '+' ó '-' "); if (strlen(error)==0) if (!comprueba_num(n2)) error=_(" Caracteres no válidos en el segundo numerador\n Sólo se permiten dígitos [0-9]\nprecedidos (opcionalmente) por un signo '+' ó '-' "); if (strlen(error)==0) if (!comprueba_num(d1)) error=_(" Caracteres no válidos en el primer denominador\n Sólo se permiten dígitos [0-9]\nprecedidos (opcionalmente) por un signo '+' ó '-' "); if (strlen(error)==0) if (!comprueba_num(d2)) error=_(" Caracteres no válidos en el segundo denominador\n Sólo se permiten dígitos [0-9]\nprecedidos (opcionalmente) por un signo '+' ó '-' "); if (strlen(error)==0) if (g_ascii_strtod(d1 ,NULL)==0) error=_(" Hay un 0 en el denominador \nNo se puede dividir por '0' "); if (strlen(error)==0) if (g_ascii_strtod(d2 ,NULL)==0) error=_(" Hay un 0 en el denominador \nNo se puede dividir por '0' "); if (strlen(error)!=0) { muestra_error(error); semaforo=FALSE; } return semaforo; } void callback8 (GtkWidget *widget, gchar data) { borra_canvas(root21); if (signo=="") muestra_error(_("No se ha introducido ningún signo de operación (+, -, *, :)")); else if (mira_numeros()) { GString *linea, *linea2; char buf[G_ASCII_DTOSTR_BUF_SIZE]; char buf1[G_ASCII_DTOSTR_BUF_SIZE], buf2[G_ASCII_DTOSTR_BUF_SIZE], buf3[G_ASCII_DTOSTR_BUF_SIZE], buf4[G_ASCII_DTOSTR_BUF_SIZE]; num1 = g_ascii_strtod(n1 ,NULL); num2 = g_ascii_strtod(n2 ,NULL); den1 = g_ascii_strtod(d1 ,NULL); den2 = g_ascii_strtod(d2 ,NULL); if ((signo=="+")||(signo=="⎼")) if ((den1<0)||(den2<0)) { evita_den_neg(); evita_den_neg(); n1=g_ascii_dtostr(buf1, sizeof(buf1), num1); n2=g_ascii_dtostr(buf2, sizeof(buf2), num2); d1=g_ascii_dtostr(buf3, sizeof(buf3), den1); d2=g_ascii_dtostr(buf4, sizeof(buf4), den2); } Coordx=20.0; Coordy=30.0; dibuja_fraccion(n1, d1, root21, Coordx, Coordy); dibuja_signo2(root21, signo, Coordx, Coordy); dibuja_fraccion(n2, d2, root21, Coordx, Coordy); dibuja_signo2(root21, "=", Coordx, Coordy); if ((signo=="+")||(signo=="⎼")) { if (den1==den2) { linea=g_string_new(NULL); g_string_erase(linea,0,linea->len); g_string_append(linea, n1); if (signo=="+") g_string_append(linea, "+"); if (signo=="⎼") g_string_append(linea, "-"); if (num2<0) g_string_append(linea, "("); g_string_append(linea, n2); if (num2<0) g_string_append(linea, ")"); dibuja_fraccion(linea->str, d1, root21, Coordx, Coordy); g_string_free (linea, TRUE); if (signo=="+") numr=num1+num2; if (signo=="⎼") numr=num1-num2; denr=den1; } if (den1!=den2) { gint m_c_m, div1, div2; gchar *div_1, *div_2; char buf1[G_ASCII_DTOSTR_BUF_SIZE], buf2[G_ASCII_DTOSTR_BUF_SIZE]; char buf3[G_ASCII_DTOSTR_BUF_SIZE], buf4[G_ASCII_DTOSTR_BUF_SIZE]; m_c_m=mcm(den1, den2); dr=g_ascii_dtostr(buf, sizeof(buf), m_c_m); linea=g_string_new(NULL); div1=m_c_m/den1; div_1=g_ascii_dtostr(buf1, sizeof(buf), div1); g_string_erase(linea,0,linea->len); g_string_append(linea, div_1); g_string_append(linea, "·"); if (num1<0) g_string_append(linea, "("); g_string_append(linea, n1); if (num1<0) g_string_append(linea, ")"); dibuja_fraccion(linea->str, dr, root21, Coordx, Coordy); dibuja_signo2(root21, signo, Coordx, Coordy); div2=m_c_m/den2; g_string_erase(linea,0,linea->len); div_2=g_ascii_dtostr(buf2, sizeof(buf), div2); g_string_append(linea, div_2); g_string_append(linea, "·"); if (num2<0) g_string_append(linea, "("); g_string_append(linea, n2); if (num2<0) g_string_append(linea, ")"); dibuja_fraccion(linea->str, dr, root21, Coordx, Coordy); dibuja_signo2(root21, "=", Coordx, Coordy); g_string_erase(linea,0,linea->len); div1=div1*num1; div_1=g_ascii_dtostr(buf3, sizeof(buf), div1); g_string_append(linea, div_1); dibuja_fraccion(linea->str, dr, root21, Coordx, Coordy); dibuja_signo2(root21, signo, Coordx, Coordy); g_string_erase(linea,0,linea->len); div2=div2*num2; div_2=g_ascii_dtostr(buf4, sizeof(buf), div2); g_string_append(linea, div_2); dibuja_fraccion(linea->str, dr, root21, Coordx, Coordy); dibuja_signo2(root21, "=", Coordx, Coordy); g_string_erase(linea,0,linea->len); g_string_append(linea, div_1); if (signo=="+") g_string_append(linea, "+"); if (signo=="⎼") g_string_append(linea, "-"); if (div2<0) g_string_append(linea, "("); g_string_append(linea, div_2); if (div2<0) g_string_append(linea, ")"); dibuja_fraccion(linea->str, dr, root21, Coordx, Coordy); g_string_free (linea, TRUE); if (signo=="+") numr=div1+div2; if (signo=="⎼") numr=div1-div2; denr=m_c_m; } } if ((signo=="·")||(signo==":")) { linea=g_string_new(NULL); g_string_erase(linea,0,linea->len); g_string_append(linea, n1); g_string_append(linea, "·"); if (signo=="·") { if (num2<0) g_string_append(linea, "("); g_string_append(linea, n2); if (num2<0) g_string_append(linea, ")"); } if (signo==":") { if (den2<0) g_string_append(linea, "("); g_string_append(linea, d2); if (den2<0) g_string_append(linea, ")"); } linea2=g_string_new(NULL); g_string_erase(linea2,0,linea2->len); g_string_append(linea2, d1); g_string_append(linea2, "·"); if (signo=="·") { if (den2<0) g_string_append(linea2, "("); g_string_append(linea2, d2); if (den2<0) g_string_append(linea2, ")"); } if (signo==":") { if (num2<0) g_string_append(linea2, "("); g_string_append(linea2, n2); if (num2<0) g_string_append(linea2, ")"); } dibuja_fraccion(linea->str, linea2->str, root21, Coordx, Coordy); g_string_free (linea, TRUE); g_string_free (linea2, TRUE); if (signo=="·") numr=num1*num2; if (signo==":") numr=num1*den2; if (signo=="·") denr=den1*den2; if (signo==":") denr=den1*num2; } dibuja_signo2(root21, "=", Coordx, Coordy); char buf5[G_ASCII_DTOSTR_BUF_SIZE]; char buf6[G_ASCII_DTOSTR_BUF_SIZE]; nr=g_ascii_dtostr(buf5, sizeof(buf), numr); dr=g_ascii_dtostr(buf6, sizeof(buf), denr); dibuja_fraccion(nr, dr, root21, Coordx, Coordy); } /* fin de if mira_numeros*/ } void callback10 (GtkWidget *widget, gchar data) { borra_canvas(root21); signo=""; dibuja_signo(signo); if (mira_numeros()) { GString *linea; char buf[G_ASCII_DTOSTR_BUF_SIZE]; char buf1[G_ASCII_DTOSTR_BUF_SIZE], buf2[G_ASCII_DTOSTR_BUF_SIZE], buf3[G_ASCII_DTOSTR_BUF_SIZE], buf4[G_ASCII_DTOSTR_BUF_SIZE]; num1 = g_ascii_strtod(n1 ,NULL); num2 = g_ascii_strtod(n2 ,NULL); den1 = g_ascii_strtod(d1 ,NULL); den2 = g_ascii_strtod(d2 ,NULL); if ((den1<0)||(den2<0)) { evita_den_neg(); n1=g_ascii_dtostr(buf1, sizeof(buf1), num1); n2=g_ascii_dtostr(buf2, sizeof(buf2), num2); d1=g_ascii_dtostr(buf3, sizeof(buf3), den1); d2=g_ascii_dtostr(buf4, sizeof(buf4), den2); } Coordx=20.0; Coordy=30.0; dibuja_fraccion(n1, d1, root21, Coordx, Coordy); dibuja_signo2(root21, ",", Coordx, Coordy); dibuja_fraccion(n2, d2, root21, Coordx, Coordy); if (den1==den2) dibuja_signo2(root21, _("Las fracciones ya tienen el mismo denominador"), Coordx+30, Coordy); if (den1!=den2) { dibuja_signo2(root21, "=", Coordx, Coordy); gint m_c_m, div1, div2; gchar *div_1, *div_2; char buf1[G_ASCII_DTOSTR_BUF_SIZE], buf2[G_ASCII_DTOSTR_BUF_SIZE]; char buf3[G_ASCII_DTOSTR_BUF_SIZE], buf4[G_ASCII_DTOSTR_BUF_SIZE]; m_c_m=mcm(den1, den2); dr=g_ascii_dtostr(buf, sizeof(buf), m_c_m); linea=g_string_new(NULL); div1=m_c_m/den1; div_1=g_ascii_dtostr(buf1, sizeof(buf), div1); g_string_erase(linea,0,linea->len); g_string_append(linea, div_1); g_string_append(linea, "·"); if (num1<0) g_string_append(linea, "("); g_string_append(linea, n1); if (num1<0) g_string_append(linea, ")"); dibuja_fraccion(linea->str, dr, root21, Coordx, Coordy); dibuja_signo2(root21, ",", Coordx, Coordy); div2=m_c_m/den2; g_string_erase(linea,0,linea->len); div_2=g_ascii_dtostr(buf2, sizeof(buf), div2); g_string_append(linea, div_2); g_string_append(linea, "·"); if (num2<0) g_string_append(linea, "("); g_string_append(linea, n2); if (num2<0) g_string_append(linea, ")"); dibuja_fraccion(linea->str, dr, root21, Coordx, Coordy); dibuja_signo2(root21, "=", Coordx, Coordy); g_string_erase(linea,0,linea->len); div1=div1*num1; div_1=g_ascii_dtostr(buf3, sizeof(buf), div1); g_string_append(linea, div_1); dibuja_fraccion(linea->str, dr, root21, Coordx, Coordy); dibuja_signo2(root21, ",", Coordx, Coordy); g_string_erase(linea,0,linea->len); div2=div2*num2; div_2=g_ascii_dtostr(buf4, sizeof(buf), div2); g_string_append(linea, div_2); dibuja_fraccion(linea->str, dr, root21, Coordx, Coordy); } } } /* fin de calback10 */ void insert_text_handler2 (GtkEditable *editable, const gchar *text, gint length, gint *position, gpointer data) { int i; GString *result; gboolean SI=FALSE; result = g_string_new(""); for (i = 0; i < length; i++) { SI = FALSE; if (g_ascii_isdigit (text[i])) SI=TRUE; if ((text[i]=='+')||(text[i]=='-')) SI=TRUE; if (SI) g_string_append_c(result, text[i]); } g_signal_handlers_block_by_func (editable, (gpointer) insert_text_handler2, data); if (SI) gtk_editable_insert_text (editable, result->str, length, position); g_signal_handlers_unblock_by_func (editable, (gpointer) insert_text_handler2, data); g_signal_stop_emission_by_name (editable, "insert_text"); g_string_free (result, TRUE); } void evita_den_neg() { gtk_text_buffer_set_text(bufer21, "", -1); gtk_text_buffer_get_selection_bounds (bufer21, &start21, &end21); gtk_text_buffer_insert_with_tags_by_name (bufer21, &start21, _("\n Evitamos denominadores negativos.\n Para ello cambiamos signo a numerador y denominador \n [multiplicamos numerador y denominador por (-1)]\n"), -1, "fuente_12", NULL); if (den1<0) {den1=(-1)*den1; num1=(-1)*num1;} if (den2<0) {den2=(-1)*den2; num2=(-1)*num2;} } gboolean on_entry1_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data) { if ((event->keyval == 0xFF0D)||(event->keyval == 0xFF8D)) gtk_widget_grab_focus (entry3); return FALSE; } gboolean on_entry2_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data) { if ((event->keyval == 0xFF0D)||(event->keyval == 0xFF8D)) gtk_widget_grab_focus (entry4); return FALSE; } gboolean on_entry3_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data) { if ((event->keyval == 0xFF0D)||(event->keyval == 0xFF8D)) gtk_widget_grab_focus (entry2); return FALSE; }