EXO MENSUELLE LA PLUS CAILLOUX DE MON UIG "qui peut m'aider?" URGENT

Résolu
Signaler
Messages postés
5
Date d'inscription
mardi 5 avril 2005
Statut
Membre
Dernière intervention
16 février 2006
-
Messages postés
5
Date d'inscription
mardi 5 avril 2005
Statut
Membre
Dernière intervention
16 février 2006
-
Un carré maigique de taille n est un arrangement en carré des nombres
1,2,3,4,5..., n² tel que si l'on effectue la somme des éléments d'une
ligne, d'une colonne ou de l'une des 2 diagonales, on obtienne toujours
la même valeur. Le dessin suivant represente un carré magique de
taille5.



15,
8,
1,
24,
17,

----

16,
14,
7,
5,
23,

----

22,
20,
13,
6,
4,

----

3,
21,
19,
12,
10,

----

9,
2,
25,
18,
11


Un carré peut être representé par un tableau C à deux dimensions:

1. Formuler en fonction de n la valeur constante de la somme des éléments d'une ligne, d'une colomme ou d'une diagonale.

2. Formuler les relations caracterisant un carré maigique.

3. Ecrire un programme C++ qui verifie si C est magique (C et n sont
supposés donnés). On vérifiera notamment que tous les éléments de C
sont dans l'intervalle [1...n²] et qu'ils sont tous distincts.



NB: -On produira un texte de l'analyse du problème avant la codification

-On utilisera des sous programmes

10 réponses

Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
1 ) Quel est le problème ?
2 ) En quoi est-ce urgent ?
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011
2
1 ) Il ne sait pas comment faire ou il veut gagner du temps et pas se fatiguer
2 ) C'est un travail "mensuel" comme précisé dans le titre, donc pas à rendre fin de l'année
1. Essaie déja au taton avec n 2, n 3, n = 4 et essaie de conjecturer. Fais ensuite un prog qui utilise cette conjecture pour remplir un tableau avec n fixé et vérifie que ta conjecture tient toujours.

2. Aucune idée
3. Suffit de calculer et pour la vérification, aucun souci
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011
2
Ton exercice m'a plu alors je l'ai fais :
1. somme d'une suite arithmétique de raison r 1> somme de tous les éléments du tableau : ( n² ( 1 + n² ) ) / 2
Donc par ligne, par colonne, ou par diagonale, ça donne : ( n² ( 1 + n² ) ) / 2n

2. Soient 5 nombres a, b, c, d, e appartenant à l'intervalle [1...n²].
On a, pour chaque ligne, chaque colonne, chaque diagonale : a + b + c + d + e = ( n² ( 1 + n² ) ) / 2n

C'est incomplet je sais, mais jvois pas quoi rajouter de plus...

3.

bool AllInIndex(int** c, int n) {

register int i, j;

for( i = 0; i <= (n-1); i++)
for( j = 0; j <= (n-1); j++)
if( (c[i][j] < 1) || (c[i][j] > n*n) ) return false;

return true;
}

bool isMagic(int** c, int n) {

if( !AllInIndex(c,n) ) return false;

// Application de la formule pour calculer la constante
const UINT uCte = (n*n * (1 + n*n)) / (2 * n);

// Vérification si le tableau est magique ou non
UINT uValue = 0;

// d'abord les lignes
register int i, j;

for(i = 0; i <= (n-1); i++) {

for(j = 0; j <= (n-1); j++)
uValue += c[i][j];

if( uValue != uCte ) return false;
}

uValue = 0;

// now les colonnes
for(i = 0; i <= (n-1); i++) {

for(j = 0; j <= (n-1); j++)
uValue += c[j][i]; // c'est ici le seul changement

if( uValue != uCte ) return false;
}

uValue = 0;

// puis les diagonales

for(i = 0; i <= (n-1)
uValue += c[i][i];

if(uValue != uCte) return false;
uValue = 0;

for(j = 0; j <= (n-1); j++)
uValue += c[n-i][n-i];

(uValue == uCte) ? return true : return false;
}

J'ai fais ça sans aucun test, donc essaie et dis moi si ça marche ou si j'ai omis quelque chose

Bonne soirée
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011
2
Oui, j'ai oublié de remettre uValue à 0 dans les boucles de calcul des lignes & colonnes...rajoute le. Pis j'ai une boucle for() à laquelle j'ai oublié le 3ème param...inatention sans doute...sinon j'ai bien relu, normalment ça marche tranquille
Messages postés
5
Date d'inscription
mardi 5 avril 2005
Statut
Membre
Dernière intervention
16 février 2006

merci !

Urgent parceque le delai est fixé au 15.

Problème au niveau de la 1 et 2 question qui ne me semble pas très explicite.

Nous avions debuter les pointeurs; il ya 1 semaine de cela donc; la galeur pour certaine commande.

est possible d'alleger un peu programme?

bool AllInIndex(int** c, int n

register int i, j;

bool isMagic(int** c, int n)
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011
2
1. C'est simple, ton tableau contient les nombres 1,2,3,...,n². Considère une suite Un définie par U0 = 1 artithmétique de raison r = 1. On a donc U1 = U0 + 1, U2 = U1 + 1, etc...
On sait, depuis la classe de première, que la somme des "n" termes d'une suite arithmétique de raison r est donnée par la formule :

somme = (nb_terme * (premier_terme + dernier_terme)) / 2

Dans notre cas, on a n² termes dans un tableau.
La somme de tous les éléments d'un tableau magique d'ordre n vaut donc :

(n² * (1 + n²) ) / 2

Or, il y a n lignes et n colonnes. Chaque somme de ligne ou de colonne est égal à une valeur; identique quelque soit la colonne. Il suffit donc de diviser la somme de tous les éléments du tableau par le nombre de ligne.
On obtient ainsi :

(n² * (1 + n²) ) / (2 * n)


2. On te demande juste de formuler mathématiquement le fait que la somme des termes d'une ligne ou d'une colonne est toujours la même valeur.


3. Alléger dans quel sens? On aurait du mal, il y a juste le necessaire. Pour aider à ta compréhension sur les pointeurs, dis toi que int** n'est rien d'autre que int[][] (tableau de deux dimensions)....il s'agit juste d'une autre façon d'écrire les choses.


Sinon je ne vois pas ce qui a de dur dans le reste du code...et puis ta question d'allègement me parait suspecte...à croire que t'as même pas essayer de comprendre le code que j'ai posté...sinon tu aurais vu qu'il n'y a pas de chose superflu...peut-être manque t-il des optimisations, mais ça c'est secondaire....surtout quand on demande aux autres de trouver les solutions sans se fatiguer...


Il n'y a rien à rajouter...le code me semble opérationnel....jregretterais presque de t'avoir aider...ça n'a pas l'air de t'avoir réelement rendu service...
Messages postés
5
Date d'inscription
mardi 5 avril 2005
Statut
Membre
Dernière intervention
16 février 2006

salut Gendal67

Je te remercie;

Ca faisait plusieurs année que je ne faisais pas les maths(suite ..etc)
et surtout j'avais par du presque tout les notions de
programmation .je dois fournir bcp pour me mettre en jour.

Merci . je ne sais quoi vous dire.
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011
2
Il n'y a rien à dire, j'espère que ce code te sera profitable
Et puis, comme je le disais, l'énoncé me plaisait, donc no soucy, ça ma fait plaisir de faire l'exercice

J'espère que tu auras une bonne note!
Bonne soirée
Messages postés
5
Date d'inscription
mardi 5 avril 2005
Statut
Membre
Dernière intervention
16 février 2006

salut Gendal67

Après avoir passé presque toute la nuit sur l'exo, je suis rendu compte
que tu avais deja tous corrigé debut la première et aussi à la
manière la plus simple.

Tout etait base sur la formule du carré et bon positionnement des compteurs.

merci encore pour ton aide
Messages postés
5
Date d'inscription
mardi 5 avril 2005
Statut
Membre
Dernière intervention
16 février 2006

salut Gendal67

Après plusieurs de recherche; le programme n'a pas pu se compiler; tout
compte fait je desire avoir le programme compiler si possible et
surtout le prototype.

la question 1 et 2 m'ont été très bien je t'envoyerais après la facon dont nous l'avions traiter.

merci