Excercice Langage C pas évident!

Fermé
Baudouin - 10 nov. 2008 à 18:44
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 - 10 nov. 2008 à 18:45
Bonjour,
Dites, j'ai un exo de C à faire et c'est vraiment galère et la panique totale! Il s'agit du parcours d'une goutte d'eau dans un MNT!
En gros voilà le sujet, mais il manque toutes les illustrations! Un immense merci! :

(Le sujet est visible sur le site
http://www.irit.fr/ACTIVITES/EQ_TCI/ENSEIGNEMENT/CetSHELL/TP/tp02.html
sauf que c'est pas exactement celui-là pour le début, mais ça ne change rien)
MERCI !

Avant-propos :

Soit un fichier qui indique l'altitude de points géographiques repérés par leur latitude et leur longitude. Un tel fichier s'appelle un "modèle numérique de terrain", ou MNT. L'image ci-après, qui correspond à un relevé réel, constitue un MNT. Dans cette image, l'altitude est associée à une échelle en niveaux de gris. Plus une zone est élevée, plus elle est claire sur l'image. Réciproquement, une région sombre correspond à un terrain peu élevé :

Illustration de mnt

Répondre aux questions suivantes :

1) Créer un MNT contenant les cent valeurs entières strictement positives suivantes :
01 02 23 45 56 58 62 77 98 100
03 04 06 32 50 72 81 74 82 99
31 05 07 08 35 80 51 91 90 84
59 33 11 10 09 38 73 52 92 89
78 79 36 13 14 12 30 83 53 54
61 68 87 39 16 17 15 37 55 93
69 60 44 85 41 18 19 20 34 88
86 43 67 66 75 37 21 24 22 40
64 44 76 57 48 49 40 26 27 25
70 63 46 47 65 71 56 34 28 29

Pour cela :

* Sélectionner ces cent valeurs, dans la fenêtre netscape, à l'aide du bouton de gauche de la souris.

* Coller ces cent valeurs dans une fenêtre asedit vide, en cliquant sur le bouton du milieu de la souris (des tabulations apparaissent : ne pas s'en soucier).

* Sauvegarder ce fichier de texte sous le nom mnt.txt

Ce MNT peut être représenté en perspective par :
Représentation MNT

2) Écrire une fonction permettant de lire dans le fichier précédent, et de stocker les données dans une matrice de taille 12 x 12 (et non de taille 10 x 10), de manière à rajouter une bordure, qui sera initialisée à l'altitude 0
Remarques :

* On commencera obligatoirement le programme par les trois lignes suivantes :

#include <stdio.h>
#define TAILLE 12
typedef int matrice[TAILLE][TAILLE];

* On n'utilisera, à aucun endroit du programme, les valeurs 10, 11 ou 12, mais uniquement les expressions TAILLE-2, TAILLE-1 ou TAILLE.

3) Tester la fonction précédente, à l'aide d'un programme principal qui affiche les valeurs de la matrice.

4) On appelle "voisin" d'un point du MNT, un des huit points situés immédiatement autour de ce point :
8 voisins

Écrire une fonction qui renvoie dans un tableau les coordonnées du voisin le plus bas d'un point dont les coordonnées sont passées en paramètres.
Remarque :

Dans le cas où plusieurs voisins possèdent l'altitude minimale, on choisira un de ces points de manière arbitraire.

5) Écrire le programme principal, qui doit :

* Demander à l'utilisateur de taper les coordonnées d'un point du MNT (ce point désigne un endroit du MNT, où on suppose qu'on lache une goutte d'eau).

* Afficher tous les points du parcours de la goutte, sachant que :

o En chaque point, la goutte se dirige vers le voisin le plus bas.

o Le parcours se termine si la goutte atteint le bord du MNT, ou si elle tombe dans un creux, auxquels cas un message doit s'afficher pour indiquer la raison de l'arrêt.

* Proposer à l'utilisateur de lacher une autre goutte d'eau.

Il est demandé de n'utiliser aucune variable globale pour réaliser cet exercice.
7. Exercice 2.

Reprendre l'exercice précédent en rajoutant le raffinement suivant : en cas de conflit entre plusieurs voisins possédant la même altitude minimale, on choisit le point qui "perturbe" le moins le trajet de la goutte d'eau.
Exemple :

A B C
1 105 100 110
2 92 90 95
3 105 80 80

Si la goutte d'eau se trouve au point B2 et vient du point B1, lors du déplacement suivant, elle se dirige (selon la règle du plus grand dénivelé) soit vers B3, soit vers C3. Le déplacement qui perturbe le moins son trajet est B3.

On codera les huit directions, correspondant aux huit plus proches voisins, par les indices de tableaux suivants :
Direction

Indice
Est

0
Nord-Est

1
Nord

2
Nord-Ouest

3
Ouest

4
Sud-Ouest

5
Sud

6
Sud-Est

7

On pourra donc décrire la position des huit voisins d'un point par leurs décalages respectifs, suivant la latitude et la longitude, en déclarant en variables globales constantes les deux tableaux suivants :

const int deca_lat[VOISINS]={0,-1,-1,-1,0,1,1,1};
const int deca_lon[VOISINS]={1,1,0,-1,-1,-1,0,1};

L'intérêt est que, par exemple, le voisin d'indice 3 dans les tableaux précédents correspond à un déplacement dans la direction du NORD_OUEST, de code 3.

Répondre aux questions suivantes :

1) Écrire la fonction angle qui retourne l'angle entre deux directions. Cet angle est toujours compris entre 0 et 4 (compris). Par exemple, l'angle entre le SUD et le NORD_EST est égal à 3.

2) Écrire la fonction plus_bas qui renvoie dans un tableau les coordonnées du voisin le plus bas, ainsi que le code de la direction du déplacement correspondant. S'il existe plusieurs voisins possibles, on choisit celui qui fait faire l'angle le plus faible à la trajectoire de la goutte d'eau. Cette fonction fait donc appel à la fonction précédente. Au niveau du point de départ de la goutte, la direction de la trajectoire sera initialisée à la valeur SUD_OUEST.
Remarque :

Si plusieurs voisins possèdent la même altitude et font prendre le même angle (en valeur absolue) à la trajectoire, on en choisira un arbitrairement.

3) Écrire le programme principal, répondant aux mêmes exigences que celui de l'exercice 1.
A voir également:

1 réponse

Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
10 nov. 2008 à 18:45
0