Déprtement Génie Electrique Automtique NOM: Prénom: Contrôle sur le Cours d'algorithme et de lngge C G.Gteu et J.Régnier Le 15 Jnvier 2008- Durée 2h Documents de cours utorisé. Le contrôle est constitué pr 1 QCM, 2 questions de cours et 2 exercices indépendnts. Les deux premières pges sont à rendre vec votre devoir. QCM (Chque question peut dmettre plusieurs réponses) [10 mn] Répondez ux questions suivntes : QCM - Cocher le OU les cses correctes : En lngge C, pour ccéder à l dresse d une vrile déclrée int vr, on utilise : *vr &vr vr En lngge C, pour ccéder u contenu d une vrile déclrée int *vr, on utilise : En lngge C, les fonctions : N existent ps Ne permettent que des pssges d rguments pr vleur Ne permettent que des pssges d rguments pr dresse Permettent des pssges d rguments pr dresse et pr vleur Peuvent renvoyer une vleur u progrmme principl *vr &vr vr int A=1; int B=3 ; int *C; C = &A; *C=A+B ; C = &B ; *C = A+1 ; Après exécution, on otient: Soit un tleu du type int t[3], tel que t=[1 2 3] : t[0] + t[1] = 3 t+1 = 2 *(t+1)+*(t+2) = 5 *( t+2) = 2 *(t)+ 1 + *(t+1) = 4 A=4 et B=2 A= 4 et B= 5 A=1 et B=3 Une erreur En lngge C, les vriles déclrées dns les fonctions: ont une portée locle ont une portée glole sont mémorisés lorsque l on quitte l fonction sont détruites lorsque l on quitte l fonction int =1, =3 ; int c= ; int d= && ; int e= & ; int f = ( & ) ; Donner l vleur de c, d, e et f : c = d = e = f = Pge 1 sur 6
Déprtement Génie Electrique Automtique Donnez l évolution du contenu de l mémoire ssociée à l exécution du progrmme suivnt : int somme (int, int ) int ; 2 = * ; return ; void min() int vr_=3,vr_=7; int ; 3 1 vr_ vr_ vr_ vr_ vriles somme Étpe 1 Étpe 2 Appel de l fonction somme à compléter vr_ vr_ vriles somme Étpe 3 printf("le t vut %d\n" ); 4 vr_ vr_ Étpe 4 Donnez l évolution du contenu de l mémoire ssociée à l exécution du progrmme suivnt : void tri_croissnt ( int * l_,int * l_ ) int ; if (*l_ < *l_) =*l_ ; *l_=*l_ ; *l_= 3 void min() int = 5, = 8 ; printf("avnt : %d - %d\n",,); Appel de l fonction tri_croissnt à compléter 2 1 printf("après : %d - %d\n",,); 4 Étpe 1 vriles tri_croissnt l_ 2756 2824 l_ Étpe 2 2751 vriles tri_croissnt l_ 2756 2824 l_ Étpe 3 2751 Étpe 4 Pge 2 sur 6
Déprtement Génie Electrique Automtique Le Jeu des Erreurs [30 mn] Cette nnée, le Père Nöel tente de se moderniser et de remplcer une prtie de ces lutins rélisnt l gestion des commndes pr un progrmme informtique (rssurez vous, il n y ur ps de réduction du personnel!!!). L poésie de Nöel est toujours présente mis le lngge C s est invité en Lponie. Le logiciel permet d enregistrer une liste de commnde de cdeu définie pr des types spéciux (vrile type_cdeu contennt un nom et l étt de l commnde 0 non trité, 1 tritée). Un menu propose soit d jouter un cdeu, soit d enregistrer le numéro d un cdeu trité, soit de lister l ensemle des cdeux et leur étt (trité ou non). Seulement, prolème, le Père Nöel n est ps une str de l progrmmtion (contrirement à JR) et son ppliction gestion des cdeux ne mrche, mis lors, ps du tout. Plntge en tout genre, interfce ncle, C est là que vous intervenez pour ider le puvre ougre à déugger son ppliction. Et çà urge, c est ientôt nöel!!! #include <stdio.h> typedef struct cdeu chr nom_enfnt[4]; int ett_cdeu ; type_cdeu ; void Ajouter_cdeu (type_cdeu *new_cdeu,int n_cdeu) printf ( " Entrez le nom de l'enfnt : \n " ) ; scnf ("%s",new_cdeu[n_cdeu].nom_enfnt) ; new_cdeu[n_cdeu].ett_cdeu = 0 ; n_cdeu = n_cdeu + 1 ; int Enregistrer_cdeu_pret() int num ; printf ( " Entrez le numero du cdeu prêt : \n " ) ; scnf ("%i",&num) ; return(num) ; Pge 3 sur 6
Déprtement Génie Electrique Automtique void Voir_liste_cdeu (type_cdeu *liste, int nomre_cdeu ) int i ; if (nomre_cdeu = 0) printf ( " Ps de cdeu dns l liste\n" ) ; else printf ( " Nomre de cdeux en commnde = %d\n", nomre_cdeu) ; printf ( " Nomre de cdeux prêt = %d\n", nomre_ceu_pret) ; for (i=0 ; i == nomre_cdeu ; i++ ) printf (" Cdeu %f \n",i); printf ( " Nom = %s \n",liste[i].nom_enfnt); printf ( " Ett cdeu = %d \n",liste[i].ett_cdeu); void min () type_cdeu Liste_cdeu[20] ; int nomre_cdeu = 0 ; // Nomre de cdeu en commnde int nomre_pret = 0 ; // Nomre de cdeu prêt int choix, i, numero ; printf ( " Logiciel de gestion des cdeux\n") ; do printf ( "1. Ajouter cdeu à l liste \n "); printf ( "2. Enregistrer un cdeu prêt\n "); printf ( "3. Voir Liste cdeu\n "); printf ( "4. Quittez\n "); printf ( "Entrez votre choix\n "); scnf ("%d",choix); switch (choix) cse 1 : Ajouter_cdeu (Liste_cdeu, nomre_cdeu) ; rek; cse 2 : numero=enregistrer_cdeu_pret () ; Liste_cdeu[numero].ett_cdeu = 1 ; nomre_pret = nomre_pret + 1 ; rek; cse 3 : Voir_liste_cdeu(Liste_cdeu,nomre_cdeu); rek ; cse 4 : while (choix == 4 ) ; printf ( " Bye \n"); rek ; Pge 4 sur 6
Déprtement Génie Electrique Automtique Exercice ALGO1: Le Crré Mgique [1h] En mthémtiques, un crré mgique d'ordre n est composé de n 2 nomres entiers générlement distincts, écrits sous l forme d'un tleu crré. Ces nomres sont disposés de mnière à ce que leurs sommes sur chque rngée, sur chque colonne et sur chque digonle soient égles. Un crré mgique est dit norml s'il est rempli vec les nomres entiers compris entre 1 et n 2 (inclus). Il existe des dispositions mgiques pour tout crré d'ordre n 1. Le crré d'ordre 1 est trivil, n'importe quel nomre indiqué dns l'unique cse permet de stisfire les règles. Le crré d'ordre 2 est églement trivil puisqu'il n'est possile qu'en répétnt le même nomre dns les qutre cses. Le plus petit cs non trivil est le crré d'ordre 3 : L somme otenue sur chque ligne, colonne ou digonle est ppelée constnte mgique ou somme mgique. L constnte mgique d'un crré mgique norml dépend uniquement de n et vut : On propose de réliser le remplissge d un crré mgique d ordre 3. L figure suivnte, nous montre un crré mgique d ordre 3 possédnt 9 cses. Ces cses sont à remplir vec des nomres llnt de 1 à 9. L mtrice ser initilisée vec des 0 (cse non remplie). Le nomre C correspondnt à l cse (0,0) ser demndé à l utilisteur u démrrge du progrmme. Ensuite, l lgorithme devr remplir les cses ligne pr ligne et proposer un crré mgique répondnt ux règles fondmentles énoncées précédemment. repérge des cellules Pge 5 sur 6
Déprtement Génie Electrique Automtique On utiliser trois fonctions permettnt de vérifier chcune de ces trois règles dont voici l définition : entier verifligne(entier ligne, entier colonne, entier proposition, entier t[4][4] ) Cette fonction vérifie que l entier proposition à mettre sur l cse (ligne, colonne) est cohérent sur l ligne considérée. Retourne 1 si unicité ou 0 sinon. entier verifcolonne(entier ligne, entier colonne, entier proposition, entier t[4][4] ) Cette fonction vérifie que l entier proposition à mettre sur l cse (ligne, colonne) est cohérent sur l colonne considérée. Retourne 1 si unicité ou 0 sinon. entier verifdig(entier ligne, entier colonne, entier proposition, entier t[4][4] ) Cette fonction vérifie que l entier proposition à mettre sur l cse (ligne, colonne) est cohérent sur l digonle considérée. Retourne 1 si unicité ou 0 sinon. On prendr soin églement de coder l fonction suivnte: void ffichge_crre_mg(entier t[3][3] ) Cette fonction ffiche le crré mgique. Progrmme principl Le progrmme principl devr initiliser le crré mgique (vec des 0), demnder à l utilisteur le nomre C et le positionner à l cse (0,0) puis remplir le crré mgique en vérifint chque proposition. Chque proposition ser effectuée pr un tirge létoire en utilisnt l fonction tirge(). int tirge() retourne un nomre compris entre 1 et 4 (Cette fonction n est ps à coder) Le progrmme principl fficher le crré mgique près l initilistion de l utilisteur puis près le remplissge. Pge 6 sur 6