Initiation à l'environnement Linux

Atelier Informatique de l'Association Escale - 31 140 Pechbonnieu

Calcul du pgcd de deux nombres

Description : Cet exemple calcul le pgcd de deux nombres.

Aperçu :
L'utilisateur entre les deux nombres

Après avoir cliqué sur le bouton "Valider"

Commande de compilation : si on a appelé le fichier 'programme.c', on compile le tout en tapant la commande :

gcc programme.c -o programme `pkg-config --cflags --libs gtk+-2.0`

(le signe " ` " s'obtient avec la combinaison des touches AltGr+7).

On exécute avec ./programme.c


Code source :

#include<stdio.h>
#include<stdlib.h>
#include<gtk/gtk.h>

/* On cree une structure contenant les deux boites d'editions et le
 label Resultat.
 Ceci est necessaire pour pouvoir passer plusieurs objet en argument,
 lors de l'utilistation de la fonction g_signal_connect().
 */
typedef struct{
        GtkWidget *edit1;
        GtkWidget *edit2;
        GtkWidget *labelResultat;
}Data;

/* Fonction renvoyant le pgcd de deux entiers */
int pgcd(int nb1, int nb2)
{
        int resultat, quotient;
        int reste=1;
        
        if (nb1>nb2)
        {
                while (reste!=0)
                {
                        resultat=reste;
                        quotient=nb1/nb2;
                        reste = nb1 - nb2*quotient;
                        printf("%d=%dx%d+%d\n",nb1,nb2,quotient,reste);
                        nb1=nb2;
                        nb2=reste;                        
                }
        }
        else
        {
                while (reste!=0)
                {
                        resultat=reste;
                        quotient=nb2/nb1;
                        reste = nb2 - nb1*quotient;
                        printf("%d=%dx%d+%d\n",nb2,nb1,quotient,reste);
                        nb2=nb1;
                        nb1=reste;                        
                }
        }
        
        return resultat;
}

/* Fonction affichant le resultat dans le label Resultat */
void afficher_resultat(GtkWidget *boutonCalculer, Data *data)
{
        const gchar *texte1;
        const gchar *texte2;
        gchar *resultatTexte;
        gint nb1, nb2, resultat;

        texte1 = gtk_entry_get_text ( GTK_ENTRY(data->edit1) );
        texte2 = gtk_entry_get_text ( GTK_ENTRY(data->edit2) );
        /* on convertit les variables de types chaines en types entiers */
        nb1 = atoi (texte1);
        nb2 = atoi (texte2);
        /* on calcul le resultat */
        resultat = pgcd(nb1, nb2);
        resultatTexte = malloc( 100*sizeof(char) );
        /* on convertit le resultat de type entier en type chaine pour pouvoir
         l'afficher dans un label
        */
        sprintf(resultatTexte, "Resultat : pgcd(%d,%d)=%d", nb1, nb2, resultat);
        /* on affiche le resultat */
        gtk_label_set_text( GTK_LABEL(data->labelResultat), resultatTexte);
}

/* PROGRAMME PRINCIPAL */
int main(int argc, char *argv[])
{
        /* Declaration des variables */
        int nb1,nb2,resultat;
        Data data;
        GtkWidget *window;
        GtkWidget *table;        // on cree une table pour placer les objets
        GtkWidget *label1;
        GtkWidget *label2;
        GtkWidget *boutonCalculer;
        
        /* Initialisation de la bibliotheque */
        gtk_init (&argc, &argv);
        
        /* Creation des objets */
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        table = gtk_table_new(4,2, FALSE);
        label1 = gtk_label_new("Entrer le premier nombre : ");
        data.edit1 = gtk_entry_new();
        label2 = gtk_label_new("Entrer le deuxieme nombre : ");
        data.edit2 = gtk_entry_new();
        data.labelResultat = gtk_label_new("Cliquer sur le bouton 'Valider' pour calculer le resultat du pgcd : ");
        boutonCalculer = gtk_button_new_with_label("Valider");
        
        /* Attachement des objets a la table et a la fenetre principale*/
        gtk_container_add( GTK_CONTAINER (window), table);
        gtk_table_attach( GTK_TABLE (table), label1, 0,1, 0,1, GTK_FILL, GTK_FILL, 10, 10);
        gtk_table_attach( GTK_TABLE (table), data.edit1, 1,2, 0,1, GTK_FILL, GTK_FILL, 10, 10);
        gtk_table_attach( GTK_TABLE (table), label2, 0,1, 1,2, GTK_FILL, GTK_FILL, 10, 10);
        gtk_table_attach( GTK_TABLE (table), data.edit2, 1,2, 1,2, GTK_FILL, GTK_FILL, 10, 10);
        gtk_table_attach( GTK_TABLE (table), data.labelResultat, 0,2, 2,3, GTK_EXPAND, GTK_EXPAND, 10, 10);
        gtk_table_attach( GTK_TABLE (table), boutonCalculer, 0,2, 3,4, GTK_FILL, GTK_FILL, 10, 10);
        
        /******* CONNEXION DES SIGNAUX *******/
        /* Termine l'application lorsque l'on ferme la fenetre */    
        g_signal_connect (G_OBJECT (window), "destroy",
                              G_CALLBACK (gtk_main_quit), NULL);
        /* Connexion du singnal du bouton Calculer */
        g_signal_connect (G_OBJECT (boutonCalculer), "clicked",
                                G_CALLBACK (afficher_resultat), (gpointer) &data);
        
        gtk_widget_show_all(window);
        gtk_main ();
        
        return 0;
}