Équation du second degré - gestion des racines complexes

Contenu du snippet

Ce petit code donne un aperçu de l'étendue de GTK+, avec un prog simple qui résout les équations de la forme ax²+bx+c=0, il y a néanmoins un petit plus ;-) : la gestion des racines complexes (donne le résultat sous la forme de fraction non simplifiée).
source C compilée avec gcc.

Source / Exemple :


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

static GtkWidget *pLabel1;
static GtkWidget *pLabel2;
static GtkWidget *pWindow;

double a, b, c, discr, x, y;

void result_a(void);
void result_b(void);
void result_c(void);

int main(int argc, char **argv)
{
    GtkWidget *pVBox;
    GtkWidget *pHBox;
    GtkWidget *pButton1;
    GtkWidget *pButton2;

    gtk_init(&argc, &argv);

    pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(pWindow), "Equation du deuxieme degre.");
    gtk_window_set_default_size(GTK_WINDOW(pWindow), 400, 81);
    g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);

    pVBox = gtk_vbox_new(TRUE, 0);
    gtk_container_add(GTK_CONTAINER(pWindow), pVBox);

    pLabel1 = gtk_label_new("Resultat x1:");
    gtk_box_pack_start(GTK_BOX(pVBox), pLabel1, FALSE, FALSE, 0);

    pLabel2 = gtk_label_new("Resultat x2:");
    gtk_box_pack_start(GTK_BOX(pVBox), pLabel2, FALSE, FALSE, 0);

    pHBox = gtk_hbox_new(TRUE, 0);
    gtk_container_add(GTK_CONTAINER(pVBox), pHBox);

    pButton1 = gtk_button_new_with_label("Nouvelle equation");
    gtk_box_pack_start(GTK_BOX(pHBox), pButton1, FALSE, TRUE, 0);

    pButton2 = gtk_button_new_with_label("Quitter");
    gtk_box_pack_start(GTK_BOX(pHBox), pButton2, FALSE, TRUE, 0);

    g_signal_connect(G_OBJECT(pButton1), "clicked", G_CALLBACK(result_a), NULL);
    g_signal_connect(G_OBJECT(pButton2), "clicked", G_CALLBACK(gtk_main_quit), NULL);

    gtk_widget_show_all(pWindow);
    gtk_main();
    return EXIT_SUCCESS;
}

void result_a(void)
{
    GtkWidget* pBoitea;
    GtkWidget* pEntrya;
    const gchar* sA;

    pBoitea = gtk_dialog_new_with_buttons("Saisie de a",
        GTK_WINDOW(pWindow),
        GTK_DIALOG_MODAL,
        GTK_STOCK_OK,GTK_RESPONSE_OK,
        GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,
        NULL);

    pEntrya = gtk_entry_new();
    gtk_entry_set_text(GTK_ENTRY(pEntrya), "Saisissez a dans ax2+bx+c=0");
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoitea)->vbox), pEntrya, TRUE, FALSE, 0);

    gtk_widget_show_all(GTK_DIALOG(pBoitea)->vbox);

    switch (gtk_dialog_run(GTK_DIALOG(pBoitea)))
    {
        case GTK_RESPONSE_OK:
            sA = gtk_entry_get_text(GTK_ENTRY(pEntrya));
            a = strtod(sA, NULL);
            break;
        case GTK_RESPONSE_CANCEL:
        case GTK_RESPONSE_NONE:
        default:
            gtk_label_set_text(GTK_LABEL(pLabel1), "Vous n'avez rien saisi !");
            break;
    }

    gtk_widget_destroy(pBoitea);
    result_b();
}

void result_b(void)
{
    GtkWidget* pBoiteb;
    GtkWidget* pEntryb;
    const gchar* sB;

    pBoiteb = gtk_dialog_new_with_buttons("Saisie de b",
        GTK_WINDOW(pWindow),
        GTK_DIALOG_MODAL,
        GTK_STOCK_OK,GTK_RESPONSE_OK,
        GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,
        NULL);

    pEntryb = gtk_entry_new();
    gtk_entry_set_text(GTK_ENTRY(pEntryb), "Saisissez b dans ax2+bx+c=0");
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoiteb)->vbox), pEntryb, TRUE, FALSE, 0);

    gtk_widget_show_all(GTK_DIALOG(pBoiteb)->vbox);

    switch (gtk_dialog_run(GTK_DIALOG(pBoiteb)))
    {
        case GTK_RESPONSE_OK:
            sB = gtk_entry_get_text(GTK_ENTRY(pEntryb));
            b = strtod(sB, NULL);
            break;
        case GTK_RESPONSE_CANCEL:
        case GTK_RESPONSE_NONE:
        default:
            gtk_label_set_text(GTK_LABEL(pLabel1), "Vous n'avez rien saisi !");
            break;
    }

    gtk_widget_destroy(pBoiteb);
    result_c();
}

void result_c(void)
{
    GtkWidget* pBoitec;
    GtkWidget* pEntryc;
    const gchar* sC;
    char sx1[100];
    char sx2[100];

    pBoitec = gtk_dialog_new_with_buttons("Saisie de c",
        GTK_WINDOW(pWindow),
        GTK_DIALOG_MODAL,
        GTK_STOCK_OK,GTK_RESPONSE_OK,
        GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,
        NULL);

    pEntryc = gtk_entry_new();
    gtk_entry_set_text(GTK_ENTRY(pEntryc), "Saisissez c dans ax2+bx+c=0");
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoitec)->vbox), pEntryc, TRUE, FALSE, 0);

    gtk_widget_show_all(GTK_DIALOG(pBoitec)->vbox);

    switch (gtk_dialog_run(GTK_DIALOG(pBoitec)))
    {
        case GTK_RESPONSE_OK:
            sC = gtk_entry_get_text(GTK_ENTRY(pEntryc));
            c = strtod(sC, NULL);
            discr = b*b-4*a*c;
            if (discr < 0)
            {
                sprintf(sx1, "La premiere solution est: %f + i racine de %f, le tout sur %f.", -b, discr*-1, 2*a);
                sprintf(sx2, "La seconde solution est: %f - i racine de %f, le tout sur %f.", -b, discr*-1, 2*a);
            }
            else
            {
                discr = sqrt(b*b-4*a*c);
                x = (-b+discr)/(2*a);
                y = (-b-discr)/(2*a);
                sprintf(sx1, "La premiere solution est: %f", x);
                sprintf(sx2, "La seconde solution est: %f", y);
            }
            gtk_label_set_text(GTK_LABEL(pLabel1), sx1);
            gtk_label_set_text(GTK_LABEL(pLabel2), sx2);
            break;
        case GTK_RESPONSE_CANCEL:
        case GTK_RESPONSE_NONE:
        default:
            gtk_label_set_text(GTK_LABEL(pLabel1), "Vous n'avez rien saisi !");
            break;
    }

    gtk_widget_destroy(pBoitec);
}

Conclusion :


je suis désolé, mais je n'ai pas eu le temps de mettre des commentaires...(je suis un peu feignant.) Pour compiler: gcc `pkg-config --cflags --libs gtk+-2.0` -c equation.c
puis: gcc `pkg-config --cflags --libs gtk+-2.0` -o equation.o
et enfin, pour réduire la taille: strip equation
note: ce prog est portable sous C++ en rajoutant: include <cmath>

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.