/* Ficha Divisores de un número */ #include #include #include #define _(String) gettext (String) gchar *numero; gint num_int; GArray *divisores; GArray *cocientes; GArray *restos; gint digitos=1; GString *etiqueta; GString *solucion; gdouble cx=10.0; gdouble cy=20.0; gint cuenta_div=0; gchar *texto, *texto2; void crea_arrays() { gint temp=0; divisores = g_array_new (TRUE, FALSE, sizeof (gint)); cocientes = g_array_new (TRUE, FALSE, sizeof (gint)); restos = g_array_new (TRUE, FALSE, sizeof (gint)); g_array_append_val (divisores, temp); g_array_append_val (cocientes, temp); g_array_append_val (restos, temp); } int num_digitos(int entero) { if (entero>9999) return 5; else if (entero>999) return 4; else if (entero>99) return 3; else if (entero>9) return 2; else return 1; } void espacio_numero() { switch (digitos) { case 1:g_string_append (etiqueta," "); break; case 2:g_string_append (etiqueta," "); break; case 3:g_string_append (etiqueta," "); break; case 4:g_string_append (etiqueta," "); break; } } void add_num_a_etiqueta(int entero, gboolean espacio) { gchar *temporal; if (espacio) espacio_numero(); temporal=numero; g_ascii_dtostr(temporal, 6, entero); g_string_append(etiqueta, temporal); } int main (int argc, char *argv[]) { setlocale (LC_ALL, ""); bindtextdomain ("gmateso",NULL); textdomain ("gmateso"); GtkWidget *ventana; /*declaracion de widgets*/ GtkWidget *vbox1; GtkWidget *label1, *label3, *label4, *labelb1; GtkWidget *hbox1; GtkWidget *entry1; GtkWidget *boton1; GtkWidget *hbox3; GtkWidget *label6; GtkWidget *hseparator1, *hseparator2, *hseparator3; GtkWidget *scrolled_window, *scrolled_window2; GtkTextBuffer *bufer, *bufer2; GtkTextTagTable *tags; GtkTextView *view, *view2; GtkTextTag *negrita, *cursiva, *color_azul, *fuente_13; GtkTextTag *color_rojo; GtkTextTag *fuente_11; GtkTextIter start, end, inicio, fin; GtkWidget *frame; GtkWidget *canvas; GnomeCanvasGroup *root; GnomeCanvasPoints *points; GdkColor colorfondo={0,0xB3F0,0xD3FF,0x90CD}; gnome_init ("divisores", "0.1", argc, argv); ventana = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_set_size_request (GTK_WIDGET (ventana), 700, 540); gtk_window_set_title (GTK_WINDOW (ventana), _("gMatESO - Divisores de un número")); g_signal_connect (G_OBJECT (ventana), "delete_event", G_CALLBACK (exit), NULL); vbox1 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox1); gtk_container_add (GTK_CONTAINER (ventana), vbox1); gtk_container_set_border_width(GTK_CONTAINER (vbox1), 5); label1 = gtk_label_new (_("Divisores de un número")); gtk_widget_show (label1); gtk_box_pack_start (GTK_BOX (vbox1), label1, FALSE, FALSE, 1); gtk_widget_set_size_request(GTK_WIDGET (label1), 780, 30); gtk_label_set_markup (GTK_LABEL(label1), _(" Divisores de un número ")); hseparator1 = gtk_hseparator_new (); gtk_widget_show (hseparator1); gtk_box_pack_start (GTK_BOX (vbox1), hseparator1, FALSE, FALSE, 1); scrolled_window2 = gtk_scrolled_window_new (NULL, NULL); gtk_widget_show (scrolled_window2); gtk_box_pack_start (GTK_BOX (vbox1), scrolled_window2, TRUE, TRUE, 1); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window2), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); tags = gtk_text_tag_table_new(); bufer = gtk_text_buffer_new(tags); view = GTK_TEXT_VIEW(gtk_text_view_new_with_buffer(bufer)); gtk_text_view_set_left_margin (view, 5); gtk_container_add (GTK_CONTAINER (scrolled_window2), GTK_WIDGET(view)); g_object_set(view, "wrap-mode", GTK_WRAP_WORD, NULL); gtk_widget_show (GTK_WIDGET(view)); gtk_text_buffer_set_text(bufer, _("\ Texto que aparece en el TextView\n"), -1); negrita = gtk_text_buffer_create_tag(bufer, "negrita", "weight", 500, NULL); cursiva = gtk_text_buffer_create_tag(bufer, "cursiva", "style", PANGO_STYLE_ITALIC, NULL); fuente_11 = gtk_text_buffer_create_tag(bufer, "fuente_11", "size", 11 * PANGO_SCALE, NULL); color_rojo = gtk_text_buffer_create_tag(bufer, "color_rojo", "foreground", "#ff0000", NULL); gtk_text_buffer_set_text(bufer, "", -1); gtk_text_buffer_get_selection_bounds (bufer, &start, &end); gtk_text_buffer_insert_with_tags_by_name(bufer, &start, _(" Un número es "), -1, "fuente_11", NULL); gtk_text_buffer_insert_with_tags_by_name (bufer, &start, _("divisor"), -1, "negrita","color_rojo", "fuente_11", NULL); gtk_text_buffer_insert_with_tags_by_name(bufer, &start, _(" de otro, cuando la división del segundo por el primero sea "), -1, "fuente_11", NULL); gtk_text_buffer_insert_with_tags_by_name(bufer, &start, _("exacta"), -1, "negrita","fuente_11", NULL); gtk_text_buffer_insert_with_tags_by_name(bufer, &start, _(".\n\n Para calcular todos los divisores de un número:"), -1, "fuente_11", "cursiva", NULL); gtk_text_buffer_insert_with_tags_by_name(bufer, &start, _("\n\n - Dividimos el número entre 1, 2, 3, ...\n - Cuando la división sea exacta, anotamos (como divisores) el cociente y el divisor.\n - Terminamos de dividir cuando el cociente sea menor o igual que el divisor."), -1, "fuente_11", NULL); gtk_text_view_set_editable (view, FALSE); hseparator2 = gtk_hseparator_new (); gtk_widget_show (hseparator2); gtk_box_pack_start (GTK_BOX (vbox1), hseparator2, FALSE, FALSE, 1); hbox1 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox1); gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 1); label3 = gtk_label_new ("Ejemplo: "); gtk_widget_show (label3); gtk_box_pack_start (GTK_BOX (hbox1), label3, FALSE, FALSE, 1); gtk_label_set_markup (GTK_LABEL(label3), _(" Ejemplo: ")); label4 = gtk_label_new (_("Calculamos los divisores del número:")); gtk_widget_show (label4); gtk_box_pack_start (GTK_BOX (hbox1), label4, FALSE, FALSE, 1); gtk_label_set_markup (GTK_LABEL(label4), _("Calculamos los divisores del número:")); entry1 = gtk_entry_new_with_max_length (4); gtk_entry_set_width_chars(GTK_ENTRY(entry1), 4); gtk_box_pack_start (GTK_BOX (hbox1), entry1, FALSE, FALSE, 1); gtk_widget_show (entry1); gtk_widget_grab_focus (entry1); boton1 = gtk_button_new (); gtk_widget_show (boton1); gtk_box_pack_start (GTK_BOX (hbox1), boton1, FALSE, FALSE, 30); labelb1=gtk_label_new(""); gtk_container_add (GTK_CONTAINER (boton1), labelb1); gtk_label_set_markup (GTK_LABEL(labelb1), _("Calcular")); scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_widget_show (scrolled_window); gtk_box_pack_start (GTK_BOX (vbox1), scrolled_window, TRUE, TRUE, 1); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_set_size_request(GTK_WIDGET (scrolled_window), -1, 200); canvas = gnome_canvas_new_aa(); gtk_container_add(GTK_CONTAINER(scrolled_window), canvas); root = gnome_canvas_root(GNOME_CANVAS(canvas)); gnome_canvas_set_center_scroll_region (GNOME_CANVAS(canvas), FALSE); gnome_canvas_set_scroll_region (GNOME_CANVAS(canvas),0.0,0.0,660.0,1400.0); frame = gtk_frame_new(NULL); gtk_box_pack_start (GTK_BOX (vbox1), frame, FALSE, TRUE, 1); gtk_frame_set_label( GTK_FRAME(frame), _("Los divisores son:") ); gtk_frame_set_shadow_type( GTK_FRAME(frame), GTK_SHADOW_ETCHED_OUT); gtk_widget_set_size_request(GTK_WIDGET (frame), 770, 75); gtk_widget_show (frame); gtk_widget_modify_bg (GTK_WIDGET (frame), GTK_STATE_NORMAL, &colorfondo); bufer2 = gtk_text_buffer_new(tags); view2 = GTK_TEXT_VIEW(gtk_text_view_new_with_buffer(bufer2)); gtk_text_view_set_left_margin (view2, 5); gtk_container_add (GTK_CONTAINER (frame), GTK_WIDGET(view2)); g_object_set(view2, "wrap-mode", GTK_WRAP_WORD, NULL); gtk_widget_show (GTK_WIDGET(view2)); color_azul = gtk_text_buffer_create_tag(bufer2, "color_azul", "foreground", "#0000ff", NULL); fuente_13 = gtk_text_buffer_create_tag(bufer2, "fuente_13", "size", 12 * PANGO_SCALE, NULL); hseparator3 = gtk_hseparator_new (); gtk_widget_show (hseparator3); gtk_box_pack_start (GTK_BOX (vbox1), hseparator3, FALSE, FALSE, 1); hbox3 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox3); gtk_box_pack_start (GTK_BOX (vbox1), hbox3, FALSE, FALSE, 1); label6 = gtk_label_new (_("AYUDA: Teclea un número y pulsa 'Calcular'")); gtk_widget_show (label6); gtk_box_pack_start (GTK_BOX (hbox3), label6, FALSE, FALSE, 1); gchar *cadena_markup=" "; PangoAttrList *attrList; pango_parse_markup(cadena_markup, -1, 0, &attrList, NULL, NULL, NULL); gtk_label_set_attributes(GTK_LABEL(label6), attrList); GString *carpeta; gchar *texto; carpeta=g_string_new(NULL); g_string_append (carpeta, g_get_home_dir ()); g_string_append (carpeta, "/gmateso/estilos.rc"); texto = g_string_free (carpeta, FALSE); gtk_rc_parse(texto); void escribe_texto(gchar *text, double x, double y) { gnome_canvas_item_new(root, gnome_canvas_text_get_type(), "size-points", 14.0, "markup", text, "fill_color", "black", "x", x, "y", y, "anchor", GTK_ANCHOR_WEST, NULL); } void Aceptar() { gchar num_letra[5]; gint i, coc, res ; gint num_divisiones=0; gint x1=66,y1=5,x2=66,y2=30,x3=116,y3=30; /*inicializar coordenadas*/ digitos=1; cx=10.0; cy=20.0; cuenta_div=0; /*borrar canvas*/ gnome_canvas_item_new(root, gnome_canvas_rect_get_type(), "x1", 0.0, /*cordenas de la */ "y1", 0.0, /*esquina sup-izq */ "x2", 660.0, /*ancho */ /*coord de la esquina inf-der*/ "y2", 1400.0, /*alto */ "fill_color_rgba", 0xefffefff, /*color de relleno*/ "outline_color_rgba", 0x000000ff, /*color del borde */ "width_units", 1.0, /*tamaño del borde*/ NULL); GtkWidget *dialog; numero = gtk_editable_get_chars(GTK_EDITABLE(entry1),0,-1); for (i=0; i<5; i=i+1) num_letra[i] = numero[i]; num_int = g_ascii_strtod(num_letra,NULL); if (num_int<=1) { dialog = gtk_message_dialog_new (GTK_WINDOW (ventana), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _(" Introduce un número mayor que 1 ")); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); } crea_arrays(); for (i=1; i<=(gint)(num_int/2) ; i++) { g_array_append_val (divisores, i); coc=num_int/i; g_array_append_val (cocientes, coc); res=(num_int%i); g_array_append_val (restos, res); if ((g_array_index(cocientes, gint, i)) < (g_array_index(divisores, gint, i))) break; else num_divisiones++; } digitos=num_digitos(num_int); for (i=1; i<=num_divisiones; i++) { etiqueta=g_string_new(NULL); digitos=num_digitos(num_int); add_num_a_etiqueta(num_int,TRUE); g_string_append (etiqueta, " "); add_num_a_etiqueta(g_array_index(divisores, gint, i),FALSE); texto = g_string_free (etiqueta, FALSE); escribe_texto(texto, cx, cy); cy=cy+20; points = gnome_canvas_points_new(3); points->coords[0] = x1; points->coords[1] = y1; points->coords[2] = x2; points->coords[3] = y2; points->coords[4] = x3; points->coords[5] = y3; gnome_canvas_item_new(root, gnome_canvas_line_get_type(), "points", points, "fill_color_rgba", 0x000000ff, "width_units", 2.0, NULL); gnome_canvas_points_unref(points); x1=x1+130; x2=x2+130; x3=x3+130; etiqueta=g_string_new(NULL); digitos=num_digitos(g_array_index(restos, gint, i)); add_num_a_etiqueta(g_array_index(restos, gint, i),TRUE); g_string_append (etiqueta, " "); add_num_a_etiqueta(g_array_index(cocientes, gint, i),FALSE); texto2 = g_string_free (etiqueta, FALSE); escribe_texto(texto2, cx, cy); cx=cx+130; cy=cy-20; cuenta_div++; if ((cuenta_div%5)==0) { cy=cy+60; cx=10; y1=y1+60; y2=y2+60; y3=y3+60; x1=66,x2=66,x3=116; } } solucion=g_string_new(NULL); for (i=1; i<=num_divisiones; i++) if (g_array_index(restos, gint, i)==0) { gchar *temp; temp=numero; g_ascii_dtostr(temp, 6, g_array_index(divisores, gint, i)); g_string_append(solucion, temp); g_string_append(solucion," "); if (g_array_index(divisores, gint, i)!=g_array_index(cocientes, gint, i)) { g_ascii_dtostr(temp, 6, g_array_index(cocientes, gint, i)); g_string_append(solucion, temp); g_string_append(solucion," "); } } texto2 = g_string_free (solucion, FALSE); gtk_text_buffer_set_text(bufer2, "", -1); gtk_text_buffer_get_selection_bounds (bufer2, &inicio, &fin); gtk_text_buffer_insert_with_tags_by_name(bufer2, &inicio, texto2, -1, "fuente_13","color_azul", NULL); gtk_text_view_set_editable (view2, FALSE); gtk_widget_grab_focus (GTK_WIDGET(view2)); gtk_widget_grab_focus (entry1); g_array_free (divisores,TRUE); g_array_free (cocientes,TRUE); g_array_free (restos,TRUE); } /* fin de funcion callback*/ void callback (GtkWidget *widget, gchar data) { Aceptar(); } 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_entry1_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data) { if ((event->keyval == 0xFF0D)||(event->keyval == 0xFF8D)) Aceptar(); return FALSE; } g_signal_connect ((gpointer) entry1, "key_press_event", G_CALLBACK (on_entry1_key_press_event), NULL); gtk_signal_connect (GTK_OBJECT (entry1), "insert_text", GTK_SIGNAL_FUNC (insert_text_handler1), NULL); gtk_signal_connect (GTK_OBJECT (boton1), "clicked", GTK_SIGNAL_FUNC (callback), NULL); gtk_widget_show_all (ventana); gtk_main (); return 0; }