#include #include "cabecera.h" #include #define _(String) gettext (String) extern GtkWidget *ventana1; extern gdouble Coordx, Coordy; extern gdouble X, Y, X1, Y1, X0, Y0; extern GnomeCanvasGroup *root21, *root30, *root32, *root12; void muestra_error(gchar *mensaje) { GtkWidget *dialog; dialog = gtk_message_dialog_new (GTK_WINDOW (ventana1), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, mensaje); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); } gboolean comprueba_num(gchar *numero) { gint i; gchar c; gboolean semaforo=TRUE; c = numero[0]; if (!g_ascii_isdigit(c)) if ((*numero!='+') && (*numero!='-')) semaforo=FALSE; for (i=1; i9999) return 5; else if (entero>999) return 4; else if (entero>99) return 3; else if (entero>9) return 2; else return 1; } void escribe_numero(GnomeCanvasGroup *grupo, gchar *numero, gdouble x, gdouble y, gint caracteres) { GString *linea; gint k, i; linea=g_string_new(NULL); g_string_append(linea, numero); k=caracteres-strlen(numero); if (k%2==0) for (i=1; i<=(k/2); i++) { g_string_prepend(linea, " "); g_string_append(linea, " "); } if (k%2==1) { x=x+5; for (i=1; i<=(k-1)/2; i++) g_string_prepend(linea, " "); for (i=1; i<=(k+1)/2; i++) g_string_append(linea, " "); } gnome_canvas_item_new(grupo, gnome_canvas_text_get_type(), "font", "monospace 14", "markup", linea->str, "fill_color", "black", "x", x, "y", y, "anchor", GTK_ANCHOR_WEST, NULL); g_string_free (linea, TRUE); } void dibuja_raya_fraccion(gint num_car, GnomeCanvasGroup *grupo, gdouble Cx, gdouble Cy) { GString *linea; gint i; linea=g_string_new(NULL); if (num_car>3) for (i=1; i<=num_car; i++) g_string_append(linea, "—"); else for (i=1; i<4; i++) g_string_append(linea, "—"); gnome_canvas_item_new(grupo, gnome_canvas_text_get_type(), "font", "monospace 14", "weight", "500", "markup", linea->str, "fill_color", "black", "x", Cx, "y", Cy+14, "anchor", GTK_ANCHOR_WEST, NULL); g_string_free(linea, TRUE); } void avanza (GnomeCanvasGroup *grupo, gdouble x, gdouble y) { if (grupo==root21) { Coordx=Coordx + x; Coordy=Coordy + y; } if (grupo==root30) { X=X + x; Y=Y + y; } if (grupo==root32) { X1=X1 + x; Y1=Y1 + y; } if (grupo==root12) { X0=X0 + x; Y0=Y0 + y; } } void dibuja_fraccion(gchar *num, gchar *den, GnomeCanvasGroup *grupo, gdouble Cx, gdouble Cy) { gint num_car; if (strlen(num)>strlen(den)) num_car=strlen(num); else num_car=strlen(den); if (strlen(den)>0) dibuja_raya_fraccion(num_car, grupo, Cx, Cy); if (num_car<3) num_car=3; escribe_numero(grupo, num, Cx, Cy, num_car); escribe_numero(grupo, den, Cx, Cy+30, num_car); avanza(grupo, num_car*10.0+9.0, 15.0); } void dibuja_signo2(GnomeCanvasGroup *grupo, gchar *signo, gdouble x, gdouble y) { gnome_canvas_item_new(grupo, gnome_canvas_text_get_type(), "size-points", 16.0, "text", signo, "fill_color", "black", "x", x, "y", y, "anchor", GTK_ANCHOR_WEST, NULL); if ((signo[0]=='+')||(signo[0]=='=')) avanza(grupo, 27.0, -15.0); else avanza(grupo, 16.0, -15.0); } void borra_canvas(GnomeCanvasGroup *grupo) { gdouble x, y; if (grupo==root21) {x=1096.0; y=396.0;} if ((grupo==root32)||(grupo==root12)) {x=670.0; y=800.0;} if (grupo==root30) {x=600.0; y=57.0;} gnome_canvas_item_new(grupo, gnome_canvas_rect_get_type(), "x1", 0.0, /*cordenas de la */ "y1", 0.0, /*esquina sup-izq */ "x2", x, /*ancho */ /*coord de la esquina inf-der*/ "y2", y, /*alto */ "fill_color_rgba", 0xfff9f3ff, /*color de relleno*/ "outline_color_rgba", 0x000000ff, /*color del borde */ "width_units", 1.0, /*tamaño del borde*/ NULL); } void parentesis(gchar c, GnomeCanvasGroup *grupo, gdouble x, gdouble y) { gchar *lado1, *lado2, *medio; /*"⎛⎜⎝⎞⎟⎠⎡⎢⎣⎤⎥⎦"*/ gdouble coy; if (c=='i') { lado1="⎛"; medio="⎜"; lado2="⎝"; coy=y; } if (c=='d') { lado1="⎞"; medio="⎟"; lado2="⎠"; coy=y-15; } if (c=='[') { lado1="⎡"; medio="⎢"; lado2="⎣"; coy=y; } if (c==']') { lado1="⎤"; medio="⎥"; lado2="⎦"; coy=y-15.0; } gchar *color; if ((c=='[')||(c==']')) color="blue"; else color="black"; gnome_canvas_item_new(grupo, gnome_canvas_text_get_type(), "size-points", 16.0, "text",medio , "fill_color", color, "x", x, "y", coy+15, "anchor", GTK_ANCHOR_WEST, NULL); gnome_canvas_item_new(grupo, gnome_canvas_text_get_type(), "size-points", 16.0, "text",lado1, "fill_color", color, "x", x, "y", coy+6, "anchor", GTK_ANCHOR_WEST, NULL); gnome_canvas_item_new(grupo, gnome_canvas_text_get_type(), "size-points", 16.0, "text", lado2 , "fill_color", color, "x", x, "y", coy+24, "anchor", GTK_ANCHOR_WEST, NULL); if (c==']') { X1=25; Y1=Y1+70; } else avanza(grupo, 16.0, 0.0); } extern GArray *primos; extern gint max_primo; extern gint num_primos; gboolean primo=TRUE; void crea_array_de_primos () { gint temp=0; primos = g_array_new (TRUE, FALSE, sizeof (gint)); g_array_append_val (primos, temp); temp=2; g_array_append_val (primos, temp); } gboolean es_primo(gint numero) { primo=TRUE; gint k; for (k=1; k<=num_primos; k++) if (numero%g_array_index(primos, gint, k)==0) return FALSE; return primo; } int siguiente_primo (gint numero) { gint i; for (i=max_primo; i<=numero; i++) if (es_primo(i)) { g_array_append_val (primos, i); max_primo=i; num_primos=num_primos+1; return i; } return 0; } int minimo(gint a, gint b) { if (a