begin process at 2010 02 09 19:33:27
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Jeux

 > LE COMPTE EST BON

LE COMPTE EST BON


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Jeux Niveau :Débutant Date de création :29/04/2004 Date de mise à jour :29/04/2004 17:00:09 Vu / téléchargé :3 839 / 263

Auteur : VonCarstein

Ecrire un message privé
Site perso
Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

 Description

Ce programme donne la solution au jeu "Le compte est bon"
Avec 6 nombres et les 4 operations le programme doit obtenir un 7e nombre defini à l'avance.
Il fonctionne avec 2 modes, un mode automatique choisissant aleatoirement 6 nombre dans une liste de 13, et un resultat à obtenir compris entre 100 et 999.
Le mode personnalisé donne la possibilitié à l'utilisateur de donner lui meme les nombres et le résultat.
En cas de solution impossible le code tente pour le nombre n-1.
Pour resoudre l'operation le programme utilise une simple reccursivité.

Source

  • #include <stdio.h>
  • #include <stdlib.h>
  • #define N 13
  • #define M 6
  • #define OP 4
  • char operateur[] = "+*/-";
  • int compte(int *tab, int nombre, int total,long *compteur)
  • {
  • int i,j,k,t[M];
  • *compteur= *compteur +1;
  • for ( i=0 ; i<nombre-1 ; i++ ) {
  • for ( j=i+1 ; j<nombre ; j++) {
  • for ( k=1; k<=OP; k++) {
  • memcpy(t,tab,sizeof(int)*6);
  • switch (k)
  • {
  • case 1:
  • t[i]+=t[j];
  • if (t[i] == total && nombre==2) { printf("\n Le compte est bon! En %d opérations %\n",*compteur); printf("\n %3d %3c %3d = %3d \n",tab[i],operateur[k-1],tab[j],t[i]); return 1; }
  • if (nombre>0)
  • t[j]=t[nombre-1];
  • if (compte(t,nombre-1,total,&*compteur)) { printf("\n %3d %3c %3d = %3d \n",tab[i],operateur[k-1],tab[j],t[i]);return 1;}
  • break;
  • case 2:
  • t[i]*=t[j];
  • if (t[i] == total && nombre==2) { printf("\n Le compte est bon! En %d opérations %\n",*compteur); printf("\n %3d %3c %3d = %3d \n",tab[i],operateur[k-1],tab[j],t[i]);return 1; }
  • if (nombre>0)
  • t[j]=t[nombre-1];
  • if (compte(t,nombre-1,total,&*compteur)) { printf("\n %3d %3c %3d = %3d \n",tab[i],operateur[k-1],tab[j],t[i]);return 1; }
  • break;
  • case 3:
  • if ( (t[i]>t[j] && t[i]> 0 && t[j] > 0 && ((t[i]%t[j])==0)) ) {t[i] = t[i]/t[j]; } else break;
  • if (t[i] == total && nombre==2) { printf("\n Le compte est bon! En %d opérations %\n",*compteur); printf("\n %3d %3c %3d = %3d \n",tab[i],operateur[k-1],tab[j],t[i]);return 1; }
  • if (nombre>0)
  • t[j]=t[nombre-1];
  • if (compte(t,nombre-1,total,&*compteur)) { printf("\n %3d %3c %3d = %3d \n",tab[i],operateur[k-1],tab[j],t[i]);return 1; }
  • break;
  • case 4:
  • if (t[i]<t[j]) { t[i] = t[j]-t[i];}
  • else t[i]-=t[j];
  • if (t[i] == total&& nombre==2) { printf("\n Le compte est bon! En %d opérations %\n",*compteur); printf("\n %3d %3c %3d = %3d \n",tab[i],operateur[k-1],tab[j],t[i]); return 1; }
  • if (nombre>0)
  • t[j]=t[nombre-1];
  • if (compte(t,nombre-1,total,&*compteur)) { printf("\n %3d %3c %3d = %3d \n",tab[i],operateur[k-1],tab[j],t[i]); return 1; }
  • break;
  • }
  • }
  • }
  • }
  • return 0;
  • }
  • int main(void)
  • {
  • int depart[N],nombre[M],i=0,tranz,total,oui=3;
  • long compteur=0;
  • /* initialisation de la fonction rand() */
  • srand(time(NULL ));
  • /* Tableau de depart */
  • depart[0]=1;
  • depart[1]=2;
  • depart[2]=3;
  • depart[3]=4;
  • depart[4]=5;
  • depart[5]=6;
  • depart[6]=7;
  • depart[7]=8;
  • depart[8]=9;
  • depart[9]=10;
  • depart[10]=25;
  • depart[11]=50;
  • depart[12]=100;
  • /* Fin tableau de depart */
  • for (i=0;i<7;i++)
  • {
  • nombre[i]=0;
  • }
  • while (oui==3)
  • {
  • printf("Choisissez le mode appropriZ:\n (1) mode personnalisZ (2) mode automatique (4) sortir\n");
  • scanf("%d",&oui);
  • while (oui==2)
  • {
  • total = rand()%899+100;
  • i=0;
  • while (i<7)
  • {
  • compteur=0;
  • tranz = depart[rand() % 13];
  • if (( tranz == nombre[0] ) || (tranz == nombre[1]) || (tranz ==
  • nombre[2]) ||(tranz == nombre[3]) ||(tranz == nombre[4]) || (tranz==nombre[5]))
  • {
  • exit;
  • }
  • else
  • {
  • nombre[i]= tranz;
  • i++;
  • }
  • }
  • printf ("Le nombre a atteindre est: %d\nAvec les nombres : ",total);
  • for (i=0;i<6;i++)
  • {
  • printf(" %d ", nombre[i]);
  • }
  • printf ("\nEt les operateurs: %c %c %c %c \n",operateur[0],operateur[1],operateur[2],operateur[3]);
  • while (compte(nombre,M,total,&compteur)==0)
  • {
  • total=total-1;
  • printf("Le compte exact est impossible ^ trouver la solution qui se rapproche le plus est: %d\n",total);
  • }
  • printf ("\nTapez (2) pour continuer (3) pour changer de mode\n");
  • scanf("%d",&oui);
  • }
  • while (oui==1)
  • {
  • compteur =0;
  • printf("Inscrivez les 7 nombres sous le format a b c d e f g total\n");
  • scanf("%d %d %d %d %d %d %d",&nombre[0],&nombre[1],&nombre[2],&nombre[3],&nombre[4],&nombre[5],&total);
  • printf ("Le nombre a atteindre est: %d\nAvec les nombres : ",total);
  • for (i=0;i<6;i++)
  • {
  • printf(" %d ", nombre[i]);
  • }
  • printf ("\nEt les operateurs: %c %c %c %c \n",operateur[0],operateur[1],operateur[2],operateur[3]);
  • while (compte(nombre,M,total,&compteur)==0)
  • {
  • total=total-1;
  • printf("Le compte exact est impossible ^ trouver la solution qui se rapproche le plus est: %d\n",total);
  • }
  • printf ("\nTapez (1) pour continuer (3) pour changer de mode\n");
  • scanf("%d",&oui);
  • }
  • }
  • }
#include <stdio.h> 
#include <stdlib.h> 

#define N 13 
#define M 6 
#define OP 4 




char operateur[] = "+*/-"; 
int compte(int *tab, int nombre, int total,long *compteur) 
{ 

int i,j,k,t[M];
*compteur= *compteur +1;


for ( i=0 ; i<nombre-1 ; i++ ) { 
for ( j=i+1 ; j<nombre ; j++) { 
for ( k=1; k<=OP; k++) { 
memcpy(t,tab,sizeof(int)*6); 

switch (k) 
{ 

case 1: 
t[i]+=t[j]; 
if (t[i] == total && nombre==2) { printf("\n Le compte est bon! En %d opérations %\n",*compteur); printf("\n %3d %3c %3d = %3d \n",tab[i],operateur[k-1],tab[j],t[i]); return 1; } 
if (nombre>0)
t[j]=t[nombre-1]; 
if (compte(t,nombre-1,total,&*compteur)) { printf("\n %3d %3c %3d = %3d \n",tab[i],operateur[k-1],tab[j],t[i]);return 1;} 
break; 

case 2: 
t[i]*=t[j]; 
if (t[i] == total && nombre==2) { printf("\n Le compte est bon! En %d opérations %\n",*compteur); printf("\n %3d %3c %3d = %3d \n",tab[i],operateur[k-1],tab[j],t[i]);return 1; } 
if (nombre>0)
t[j]=t[nombre-1]; 
if (compte(t,nombre-1,total,&*compteur)) { printf("\n %3d %3c %3d = %3d \n",tab[i],operateur[k-1],tab[j],t[i]);return 1; } 
break; 

case 3: 
if (  (t[i]>t[j] && t[i]> 0 && t[j] > 0 && ((t[i]%t[j])==0)) ) {t[i] = t[i]/t[j]; } else break;
if (t[i] == total && nombre==2) { printf("\n Le compte est bon! En %d opérations %\n",*compteur); printf("\n %3d %3c %3d = %3d \n",tab[i],operateur[k-1],tab[j],t[i]);return 1; } 
if (nombre>0)
t[j]=t[nombre-1]; 
if (compte(t,nombre-1,total,&*compteur)) { printf("\n %3d %3c %3d = %3d \n",tab[i],operateur[k-1],tab[j],t[i]);return 1; } 
break; 

case 4: 
if (t[i]<t[j]) { t[i] = t[j]-t[i];} 
else t[i]-=t[j]; 
if (t[i] == total&& nombre==2) { printf("\n Le compte est bon! En %d opérations %\n",*compteur); printf("\n %3d %3c %3d = %3d \n",tab[i],operateur[k-1],tab[j],t[i]); return 1; } 
if (nombre>0)
t[j]=t[nombre-1]; 
if (compte(t,nombre-1,total,&*compteur)) { printf("\n %3d %3c %3d = %3d \n",tab[i],operateur[k-1],tab[j],t[i]); return 1; } 
break; 

} 
} 
} 
} 

return 0; 
} 




int main(void) 
{ 

int depart[N],nombre[M],i=0,tranz,total,oui=3; 
long compteur=0;
/* initialisation de la fonction rand() */ 
srand(time(NULL )); 

/* Tableau de depart */ 
depart[0]=1; 
depart[1]=2; 
depart[2]=3; 
depart[3]=4; 
depart[4]=5; 
depart[5]=6; 
depart[6]=7; 
depart[7]=8; 
depart[8]=9; 
depart[9]=10; 
depart[10]=25; 
depart[11]=50; 
depart[12]=100; 
/* Fin tableau de depart */ 

for (i=0;i<7;i++)
{
nombre[i]=0;
}

while (oui==3)
{
printf("Choisissez le mode appropriZ:\n (1) mode personnalisZ (2) mode automatique (4) sortir\n");
scanf("%d",&oui);

while (oui==2)
{

total = rand()%899+100; 
i=0;
while (i<7) 
{ 
compteur=0;
tranz = depart[rand() % 13]; 
if (( tranz == nombre[0] ) || (tranz == nombre[1]) || (tranz == 
nombre[2]) ||(tranz == nombre[3]) ||(tranz == nombre[4]) || (tranz==nombre[5])) 
{ 
exit; 
} 
else 
{ 
nombre[i]= tranz; 
i++; 
} 
} 


printf ("Le nombre a atteindre est: %d\nAvec les nombres : ",total); 
for (i=0;i<6;i++) 
{ 
printf(" %d ", nombre[i]); 
} 
printf ("\nEt les operateurs: %c %c %c %c \n",operateur[0],operateur[1],operateur[2],operateur[3]); 


while  (compte(nombre,M,total,&compteur)==0)
{
total=total-1;
printf("Le compte exact est impossible ^ trouver la solution qui se rapproche le plus est: %d\n",total);

} 

printf ("\nTapez (2) pour continuer (3) pour changer de mode\n");
scanf("%d",&oui);

}


while (oui==1)
{
compteur =0;
printf("Inscrivez les 7 nombres sous le format a b c d e f g total\n");
scanf("%d %d %d %d %d %d %d",&nombre[0],&nombre[1],&nombre[2],&nombre[3],&nombre[4],&nombre[5],&total);


printf ("Le nombre a atteindre est: %d\nAvec les nombres : ",total); 
for (i=0;i<6;i++) 
{ 
printf(" %d ", nombre[i]); 
} 
printf ("\nEt les operateurs: %c %c %c %c \n",operateur[0],operateur[1],operateur[2],operateur[3]); 


while  (compte(nombre,M,total,&compteur)==0)
{
total=total-1;
printf("Le compte exact est impossible ^ trouver la solution qui se rapproche le plus est: %d\n",total);

} 

printf ("\nTapez (1) pour continuer (3) pour changer de mode\n");
scanf("%d",&oui);

}

}


} 

 Conclusion

Le code n'est pas vraiment optimisé, et le mode personnalisé est un peu trop libre, ce qui laisse à l'utilisateur la possibilité de faire a peu pres n'importe quoi. Si aucune solution n'est trouvée le programme se relance ce qui fait que sur une machine lente, le calcul peut prendre du temps..
A part ça ça doit marcher!!

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • compte.cTélécharger ce fichier [Réservé aux membres club]Voir ce fichier4 231 octets
  • compte.exeTélécharger ce fichier [Réservé aux membres club]31 098 octets

Télécharger le zip


 Sources du même auteur

Source avec Zip FONCTION DE SAUVEGARDE DE TABLEAU ET DE LECTURE DE SAUVEGARD...

 Sources de la même categorie

Source avec Zip Source avec une capture PLUS OU MOINS par antho974
Source avec Zip Source avec une capture TETRIS EN C++ AVEC SDL par Marmalus
Source avec une capture DÉMINEUR SOUS TERMINAL par aom333
Source avec Zip JEU: MARIO SOKOBAN par astro53
Source avec Zip JEU PUISSANCE IV par ElendilAranwe

Commentaires et avis

Commentaire de cppdupdup34 le 29/04/2004 16:42:11

un ptit zip avec l'exe steplé ;-)
je suis pas chez moi et j'ai pas de compilo :-/

Commentaire de VonCarstein le 29/04/2004 17:01:07

Voila voila.....

Commentaire de MoDDiB le 29/04/2004 18:30:16

Un prog comme ca ca se commetne a mort ^^ parce que la !Sinon c'est une bonen idée :)

Commentaire de cppdupdup34 le 29/04/2004 20:00:15

le programme ne permet pas de jouer ?
chez moi je coisis le mode je tape entrer et pour le mode normal ca me donne tout de suite la sol et pour le mode personnaliser pareil apres que je lui ai donné les 7 chiffres
c'est bizarre

Commentaire de MoDDiB le 29/04/2004 20:15:17

C'est pour ca que ca s'appelle algo de resolution :p

Commentaire de StanOfSky le 30/04/2004 16:48:08

oulala attention à ta syntaxe!!!

&*compteur aieaieaie tres mauvais
l'adresse de la valeur pointé, c le pointeur :) donc suffit d'écrire : compteur

sinon a part ca c vrai que ce n'est pas forcement simple de comprendre ce que tu fais sans commentaire (surtt en lisant vie fait ton code)

bon compte c ta fonction récursive de calcul
int compte(int *tab, int nombre, int total,long *compteur)

tab c ta liste de nombre
nombre c l'index dans le tableau du nombre actuel
total c le total à trouver
compteur c le nombre d'opérations

et compte renvoi le resultat du calcul

pour ceux qui veulent faire de l'IA ou ce genre d'algo en 10 lignes de code je conseille PROLOG ;)

Commentaire de satanfifi le 06/05/2004 21:36:29

Je sais pas si cela interesse quelqu'un, mais j'ai re-ecris le code precedent en c++ de facon plus claire (pour moi) et j'ai apporte deux (toute petites) ameliorations :

* si une solution est trouvee sans utiliser toutes les valeurs, l'afficher
* et une correction (un oubli sans doute) pour l'operation de division dans la fonction compte.

#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;
#include &lt;time.h&gt;
#include &lt;iostream&gt;


using namespace std;

// Fonction abs

int absolue(int x)
{
return x&gt;0?x:-x;
}


// Fonction recursive qui va calculer toutes les combinaisons d'operandes et d'operateurs
//
// Remarque : on utilise les proprietes suivantes pour accelerer le calcul :
// a + b = b + a
// a * b = b * a
// le resultat de la soustraction doit etre positif
// le resultat de la division doit donner un entier non nul

bool compte(int *tab, int nombre, int total, int *compteur)
{
int i, j, k, t[6];
(*compteur)++;

// On va faire le test sur toutes les valeurs
for (i = 0; i &lt; nombre-1 ; ++i)
{
// i+1 = on evite de recommencer les combinaisons deja testees
for (j = i+1; j &lt; nombre; ++j)
{
for (k = 1; k &lt;= 4; ++k)
{
// Copie sur la pile locale les valeurs que l'on utilise
memcpy(t, tab, sizeof(int)*6);

switch (k)
{

case 1:
t[i] += t[j];
if(t[i] == total)
{
cout &lt;&lt; " Le compte est bon! En " &lt;&lt; (*compteur) &lt;&lt; " operations" &lt;&lt; endl &lt;&lt; endl;
cout &lt;&lt; "\t" &lt;&lt; tab[i] &lt;&lt; "\t+\t" &lt;&lt; tab[j] &lt;&lt; "\t=\t" &lt;&lt; t[i] &lt;&lt; endl &lt;&lt; endl;
return true;
}
if(nombre &gt; 0)
t[j] = t[nombre-1];
if(compte(t, nombre-1, total, compteur))
{
cout &lt;&lt; "\t" &lt;&lt; tab[i] &lt;&lt; "\t+\t" &lt;&lt; tab[j] &lt;&lt; "\t=\t" &lt;&lt; t[i] &lt;&lt; endl &lt;&lt; endl;
return true;
}
break;

case 2:
t[i] *= t[j];
if(t[i] == total)
{
cout &lt;&lt; endl &lt;&lt; " Le compte est bon! En " &lt;&lt; (*compteur) &lt;&lt; " operations" &lt;&lt; endl;
cout &lt;&lt; "\t" &lt;&lt; tab[i] &lt;&lt; "\t*\t" &lt;&lt; tab[j] &lt;&lt; "\t=\t" &lt;&lt; t[i] &lt;&lt; endl &lt;&lt; endl;
return true;
}
if(nombre &gt; 0)
t[j] = t[nombre-1];
if(compte(t, nombre-1, total, compteur))
{
cout &lt;&lt; "\t" &lt;&lt; tab[i] &lt;&lt; "\t*\t" &lt;&lt; tab[j] &lt;&lt; "\t=\t" &lt;&lt; t[i] &lt;&lt; endl &lt;&lt; endl;
return true;
}
break;

case 3:
if( t[i] &gt; t[j] && t[i] != 0 && t[j] != 0 && (t[i]%t[j]) == 0 )
{
t[i] = t[i]/t[j];
}
else
{
if( t[j] &gt; t[i] && t[i] != 0 && t[j] != 0 && (t[j]%t[i]) == 0 )
{
t[i] = t[j]/t[i];
}
else
break; // La division ne respecte pas les conditions precedentes
// Cela ne sert a rien de continuer le calcul sur cette voie
}

if(t[i] == total)
{
cout &lt;&lt; endl &lt;&lt; " Le compte est bon! En " &lt;&lt; (*compteur) &lt;&lt; " operations" &lt;&lt; endl;
if(tab[i] &gt; tab[j])
cout &lt;&lt; "\t" &lt;&lt; tab[i] &lt;&lt; "\t/\t" &lt;&lt; tab[j] &lt;&lt; "\t=\t" &lt;&lt; t[i] &lt;&lt; endl &lt;&lt; endl;
else
cout &lt;&lt; "\t" &lt;&lt; tab[j] &lt;&lt; "\t/\t" &lt;&lt; tab[i] &lt;&lt; "\t=\t" &lt;&lt; t[i] &lt;&lt; endl &lt;&lt; endl;
return true;
}
if(nombre &gt; 0)
t[j] = t[nombre-1];
if(compte(t, nombre-1, total, compteur))
{
if(tab[i] &gt; tab[j])
cout &lt;&lt; "\t" &lt;&lt; tab[i] &lt;&lt; "\t/\t" &lt;&lt; tab[j] &lt;&lt; "\t=\t" &lt;&lt; t[i] &lt;&lt; endl &lt;&lt; endl;
else
cout &lt;&lt; "\t" &lt;&lt; tab[j] &lt;&lt; "\t/\t" &lt;&lt; tab[i] &lt;&lt; "\t=\t" &lt;&lt; t[i] &lt;&lt; endl &lt;&lt; endl;
return true;
}
break;

case 4:
t[i] = absolue(t[j]-t[i]);
if(t[i] == total)
{
cout &lt;&lt; endl &lt;&lt; " Le compte est bon! En " &lt;&lt; (*compteur) &lt;&lt; " operations" &lt;&lt; endl;
if(tab[i] &gt; tab[j])
cout &lt;&lt; "\t" &lt;&lt; tab[i] &lt;&lt; "\t-\t" &lt;&lt; tab[j] &lt;&lt; "\t=\t" &lt;&lt; t[i] &lt;&lt; endl &lt;&lt; endl;
else
cout &lt;&lt; "\t" &lt;&lt; tab[j] &lt;&lt; "\t-\t" &lt;&lt; tab[i] &lt;&lt; "\t=\t" &lt;&lt; t[i] &lt;&lt; endl &lt;&lt; endl;
return true;
}
if(nombre &gt; 0)
t[j] = t[nombre-1];
if(compte(t, nombre-1, total, compteur))
{
if(tab[i] &gt; tab[j])
cout &lt;&lt; "\t" &lt;&lt; tab[i] &lt;&lt; "\t-\t" &lt;&lt; tab[j] &lt;&lt; "\t=\t" &lt;&lt; t[i] &lt;&lt; endl &lt;&lt; endl;
else
cout &lt;&lt; "\t" &lt;&lt; tab[j] &lt;&lt; "\t-\t" &lt;&lt; tab[i] &lt;&lt; "\t=\t" &lt;&lt; t[i] &lt;&lt; endl &lt;&lt; endl;
return true;
}
break;
}
}
}
}
return false;
}




int main(void)
{
int depart[13] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 25, 50, 100};
int nombre[6];
int i, tranz, total, choix, compteur, plus_proche;

// initialisation de la fonction rand()
srand(time(NULL));

for(i = 0; i &lt; 7 ; ++i)
{
nombre[i] = 0;
}

while(true)
{
cout &lt;&lt; "Choisissez le mode appropriZ :" &lt;&lt; endl &lt;&lt; "\t[1] mode personnalisZ" &lt;&lt; endl &lt;&lt; "\t[2] mode automatique" &lt;&lt; endl &lt;&lt; "\t[autre] sortir" &lt;&lt; endl;
cin &gt;&gt; choix;

compteur = 0;

switch(choix)
{

case 2:
total = (rand()%900) + 100;
i = 0;
while(i &lt; 7)
{
// Choisis de facon aleatoire les chiffres parmi la liste definie dans depart
tranz = depart[rand() % 13];
nombre[i]= tranz;
i++;
}
break;

case 1:
// Permet la saisie des nombres
cout &lt;&lt; "Inscrivez les 6 nombres sous le format a b c d e f g" &lt;&lt; endl;
cin &gt;&gt; nombre[0] &gt;&gt; nombre[1] &gt;&gt; nombre[2] &gt;&gt; nombre[3] &gt;&gt; nombre[4] &gt;&gt; nombre[5];

cout &lt;&lt; "Entrer le nombre a chercher :" &lt;&lt; endl;
cin &gt;&gt; total;
break;

default:
return 0;
}

// Quelques affichages avant le calcul
cout &lt;&lt; "Le nombre a atteindre est: "&lt;&lt; total &lt;&lt; endl &lt;&lt; "Avec les nombres : ";
for (i = 0; i &lt; 6; ++i)
{
cout &lt;&lt; nombre[i] &lt;&lt; " ";
}
cout &lt;&lt; endl &lt;&lt; "Et les operateurs: + * / -" &lt;&lt; endl;

// Lance le calcul et eventuellement cherche la solution la plus proche s'il n'y a pas de solution au probleme
plus_proche = 0;
while( compte(nombre, 6, total + plus_proche, &compteur) == 0 )
{
if(plus_proche &lt; 0)
{
plus_proche = -plus_proche;
}
else
{
plus_proche = -plus_proche-1;
}
cout &lt;&lt; "Le compte exact est impossible, chercher la solution la + proche : " &lt;&lt; total + plus_proche &lt;&lt; endl;
}
}

return 0;
}

Commentaire de VonCarstein le 07/05/2004 08:44:41

Hey pas mal :] meme si je continue à preferer le C...
Exact pour la condition manquante, par contre pour trouver la solution avec tous les nombres exclusivement c'est fait expres.
En fait c'est un exo que le prof de prog nous a filé. C'est vachement bien, tu le mets ici et on te le corrige :]

Commentaire de StanOfSky le 23/05/2004 00:56:07

heu en quoi est ce que la nouvelle version est c++???
a part le fait que tu utilises iostream c du c simple et bete
le c++ implique : classes, héritages, etc... sinon c tout simplement du c...
en plus tu utilises string.h qui est en c alors que string est effectivement une classe c++

quelques remarques sur ce fameux c++
tout d'abord using namespace std; n'est pas recommandé, il vau mieux ecrire std:: devant chaque fonction, c chiant mais ca évite des problemes entre librairies
ensuite, essai de séparaer tout ce qui est calcul de l'affichage sinon ton code n'est pas du tout portable ou réutilisable pour etre incorporé dans un environnement graphique
de meme il fau séprarer entrée/sorties des calculs

de plus une fonction telle que
int absolue(int x)
{
   return x&gt;0?x:-x;
}
est boulet... c pas du tout optimisé
tu aurai pu ecrire soit:
inline int absolue(int x)
{
return x&gt;0?x:-x;
}
ou alors fai une macro:
#define abs(x)  ((x&lt;0)?(-x):(x))

sinon une vieille source prolog qui cherche les résultat des chiff&lettres aussi. ce programme est capable de trouver toutes les solutions possible et les affiche. normalement ca va assez vite pour trouver ttes les solutions
j'ai essayé de l'optimiser pour qu'il ne donne pas trop de fois la meme solutions genre
5*9=45    équivalent à 5*3=15        etc...
45*3=135                    15*9=135

/* fonction de tri */

divise([],[],[]).
divise([X],[X],[]).
divise([X,Y|L],[X|R1],[Y|R2]) :- divise(L,R1,R2).

fusion([],L,L).
fusion(L,[],L).
fusion([X|L1],[Y|L2],[X|M]) :-
X =&lt; Y,
fusion(L1,[Y|L2],M).
fusion([X|L1],[Y|L2],[Y|M]) :-
X &gt; Y,
fusion([X|L1],L2,M).

tri_fusion([],[]).
tri_fusion([X],[X]).
tri_fusion([X,Y|L],Lt) :-
divise([X,Y|L],L1,L2),
tri_fusion(L1,L1t),
tri_fusion(L2,L2t),
fusion(L1t,L2t,Lt).

/* supprime l'élt E de la liste */

enleve(_,[],[]).
enleve(E,[E|L],L).
enleve(E,[X|L],[X|R]) :- X \== E, enleve(E,L,R).

/* fonction de permutation de listes */

permut([],[]).
permut(L,[M|R]) :-
member(M,L),
enleve(M,L,LmM),
permut(LmM,R).

/* supprime tous les élts avant E compris*/

reste(E,[E|L],L) :- !.
reste(E,[_|L],R) :- reste(E,L,R).

/* supprime les elts présents plusieurs fois */

elimine(E,L,L) :- not(member(E,L)),!.
elimine(E,L,R) :- enleve(E,L,LmE), elimine(E,LmE,R).

elimine_all([],[]).
elimine_all([X|L],[X|R]) :- elimine(X,L,Rt), elimine_all(Rt,R).

/* transforme une liste de liste en une liste d'éléments */

uneliste([],[]).
uneliste([X|L],S) :- uneliste(L,R), append(X,R,S).

/* affichage d'une liste */

aff([],[]).
aff([X|L],[A,[46]|Ecrire]) :- name(X,A), aff(L,Ecrire).

/* Affichage du résultat */

affiche([],_) :- nl.
affiche([[X,Op,Y,=,R]|L],Liste) :-
name(X,A),
name(Op,B),
name(Y,C),
name(R,D),
uneliste([A,B,C,[61],D],ListeTexte),
name(Texte,ListeTexte),
print(Texte),
affiche(L,Liste).

/*
   définition de chaque opération avec A &gt; B
+ : Addition A!=0 ou B!=0
* : multiplication A!=1 ou B!=1
- : soustraction A&gt;B donc que des valeurs positives
/ : division avec diviseur non nul et reste de la division nul
*/

operations([A,B],+,R) :- R is A+B.

operations([A,B],*,R) :-
A =\= 1,
B =\= 1,
R is A*B.

operations([A,B],-,R) :-
A =\= B,
R is A-B,
R =\= B.

operations([A,B],/,R) :-
B =\= 1,
B =\= 0,
A mod B =:= 0,
R is A / B,
R =\= B.

/*
   opérations sur listes

prend les éléments 2 par 2, effectue l'opération, supprime les
2 éléments de la liste et rajoute le résultat au début.

*/

ope(Ec,[X,Op,Y,=,R],[R|Ls2]) :-
member(A,Ec),             /* prend 1 élts */
reste(A,Ec,Lt),   /* enleve l'élts */
member(B,Lt),   /* prend 1 autre élts */
X is max(A,B),   /* X le plus gd des 2 élts */
Y is min(A,B),   /* Y le plus pt des 2 élts */
operations([X,Y],Op,R),   /* execute une opération */
enleve(X,Ec,Ls1),   /* supprime gd élt */
enleve(Y,Ls1,Ls2).   /* supprime pt élt */

/* algo de recherche de tout les résultats possible */

rechpf_op([X|_],[],[X]).
rechpf_op(Ec,[Op|Lop],Save) :-
ope(Ec,Op,Es),
rechpf_op(Es,Lop,Save).

resoudre(S) :- etatinitial(Ei), etatfinal(Ej), rechpf_op(Ei,S,Ej).
resoudre(S,Ej) :- etatinitial(Ei), rechpf_op(Ei,S,Ej).
resoudre(S,Ei,Ej) :- rechpf_op(Ei,S,[Ej]).

valeur(V) :- etatinitial(Ei), rechpf_op(Ei,_,V).

all_valeur :-
print('Recherche'), nl,
/*findall(V,valeur(V),R),
print('Elimine'), nl,
elimine_all(R,Rt),
print('Tri'), nl,
tri_fusion(Rt,L),*/
setof(V,valeur(V),L),
print('Valeurs possibles : '),
uneliste(L,ListeTexte),
print(ListeTexte).

aff_solution(_,[]).
aff_solution(Liste,[X|L]) :-
aff(Liste,Ecrire),
uneliste(Ecrire,ListeTexte),
name(Texte,ListeTexte),
print(Texte),
print('-&gt;'),
affiche(X,Liste), nl,
aff_solution(Liste,L).

solution :- setof(S,resoudre(S),L), nl, etatinitial(Liste), aff_solution(Liste,L).
solution(Ef) :- setof(S,resoudre(S,[Ef]),L), nl, etatinitial(Liste), aff_solution(Liste,L).
solution(Liste,Ef) :- setof(S,resoudre(S,Liste,[Ef]),L), nl, aff_solution(Liste,L).

/* Etatinitiaux et finaux */

etatinitial([1,7,9,75,20,5]).
etatfinal([298]).

Commentaire de patemino le 19/05/2007 12:59:38

Bonjour VonCarstein,
Ta solution algorithmique n'oblige-t-elle pas le programme à "consommer" toutes les opérations ?
Ta condition sur nombre gène l'arrêt de l'algo si le compte se trouve être bon avant 5 opérations, si je ne m'abuse. Et aussi, l'affichage des opérations se fait à l'envers ;) l'utilisation du backtracking nécessite d'inverser le résultat pour être dans le bon sens.

Commentaire de Kypper_667 le 28/02/2008 14:09:38 10/10

Très bon travail. Ca m'a toujours étonné les programmes comme ça ;) Ca vaut bien un 10/10 :D

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,733 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales