Site web : http://www.exodus-lilium.org

>> Actuellement sur Aurore Cataclysm <<
 
AccueilSiteCalendrierFAQRechercherS'enregistrerMembresGroupesConnexion

Partagez | 
 

 Probleme Programmation C

Aller en bas 
Aller à la page : 1, 2  Suivant
AuteurMessage
Ellidan
Emissaire
avatar

Nombre de messages : 84
Age : 27
Date d'inscription : 14/11/2010

MessageSujet: Probleme Programmation C   Lun 22 Nov 2010 - 2:16

Voila, je dois coder un déplacement aléatoire d'un robot dans un tableau que je crée.

Le tout est regroupé dans une fonction de mise à jour qui effectue un déplacement et calcule son cout ( y'a un nombre limité d'energie pour se déplacer ) et il ne doit pas y avoir plus de 5000 mises à jour...

Donc moi , je veux que le robot se déplace aléatoirement sur une des cases adjacentes sauf si il y a un obstacle. La taille de la grille est [x][y], tab c'est le tableau, les coordonnées du robot sont (n,m).
( z c'est l'orientation du robot mais pour l'instant je ne m'en occupe pas )

Les obstacles sont représentés par des 'X'.

Si vous avez besoin de la donnée du projet pour mieux comprendre ce que je fais ou me proposer de meilleures solutions : Projet_Aspirator ( PDF )

Voici la partie de code que je n'arrive pas à faire fonctionner :

Code:


void mise_a_jour(char *tab, int x, int y, int n, int m, int z)
{
    int nbr_maj, nrj;
    int alea;
    srand (time(0));

    for( nbr_maj=5000, nrj=5200 ; nbr_maj!=0&&nrj!=0 ; nbr_maj-- )
    {
        alea=rand()%7;

    printf("%d", alea);

        switch(alea)
        {
            case 0 :
                if (*(tab+x*(n-1)+(m-1)) != 'X' )
                {
                    n=n-1;
                    m=m-1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 1 :

                if (*(tab+x*n+(m-1)) != 'X' )
                {
                    m=m-1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 2 :

                if (*(tab+x*(n+1)+(m-1)) != 'X' )
                {
                    n=n+1;
                    m=m-1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 3 :

                if (*(tab+x*(n+1)+m) != 'X' )
                {
                    n=n+1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 4 :

                if (*(tab+x*(n+1)+(m+1)) != 'X' )
                {
                    n=n+1;
                    m=m+1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 5 :

                if (*(tab+x*n+(m+1)) != 'X' )
                {
                    m=m+1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 6 :

                if (*(tab+x*(n-1)+(m+1)) != 'X' )
                {
                    n=n-1;
                    m=m+1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 7 :

                if (*(tab+x*(n-1)+m) != 'X' )
                {
                    n=n-1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
        }
    }
}


Si vous voulez le code en entier :
Code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int define(int);
void orientation(char*, int, int, int, int);
void position_obstacle(char*, int, int);
void mise_a_jour(char*, int, int, int, int, int);
void affiche(char*, int, int);

int main()
{
    int x, y, n, m, z;
    x = define(x);
    y = define(y);
    char tab[x][y];

    //initialisation du tableau par des espaces vides
    memset(tab[0], ' ', sizeof(tab));

    n = define(n);
    m = define(m);
    z = define(z);

    orientation(*tab, x, n, m, z);

    position_obstacle(*tab, x, y);

    mise_a_jour(*tab, x, y, n, m, z);

    affiche(*tab, x, y);
}

int define(int x)
{
    static int i, X, Y;

    switch (i)
    {
        case 0 :
            printf("\n Entrez la dimension verticale de l'espace ( nombre de lignes ) : ");
            do (scanf("%d", &x)); while (x<=0&&printf("Erreur la valeur entrée est incorrecte. Veuillez l'entrer à nouveau."));
            X=x;
            break;
        case 1 :
            printf("\n Entrez la dimension horizontale de l'espace ( nombre de colonnes ) : ");
            do (scanf("%d", &x)); while (x<=0&&printf("Erreur la valeur entree est incorrecte. Veuillez l'entrer à nouveau."));
            Y=x;
            break;
        case 2 :
            printf("\n Entrez l'abscisse du robot : ");
            do (scanf("%d", &x)); while ((x<=0||x>=X)&&printf("Erreur la valeur entree est incorrecte. Veuillez l'entrer à nouveau."));
            break;
        case 3 :
            printf("\n Entrez l'ordonnee du robot : ");
            do (scanf("%d", &x)); while ((x<=0||x>=Y)&&printf("Erreur la valeur entree est incorrecte. Veuillez l'entrer à nouveau."));
            break;
        case 4 :
            printf("\n Entrez l'orientation du robot : ");
            do (scanf("%d", &x)); while ((x<=0||x>3)&&printf("Erreur la valeur entree est incorrecte. Veuillez l'entrer à nouveau."));
            break;
    }

    i++;
    return x;
}

void orientation(char *tab, int x, int n, int m ,int z)
{
    switch(z)
    {
        case 0 :
            *(tab+x*n+m)='|';
            break;
        case 1 :
            *(tab+x*n+m)='/';
            break;
        case 2 :
            *(tab+x*n+m)='-';
            break;
        case 3 :
            *(tab+x*n+m)='';
            break;
    }

}


void position_obstacle(char *tab, int x, int y)
{
    int a=0, b=0;

    while(1)
    {
        printf("\n Entrez l'abscisse de l'obstacle (ou -1 si pour ne pas ajouter d'obstable) : ");
        scanf("%d", &a);
        if(a==-1)
            break;
        printf("\n Entrez l'ordonnee de l'obstacle : ");
        scanf("%d", &b);

        if ((0<=a)&&(a<=x-1)&&(0<=b)&&(b<=y-1))
            switch (*(tab+x*a+b))
            {
                case ' ':
                    *(tab+x*a+b)='X';
                    break;
                case 'X':
                    printf("\n ! Il y a des obstacles à la meme position. ! ");
                    break;
                default :
                    printf("\n ! Des obstacles sont à la meme position que le robot et n'apparaitrons pas ! ");
            }
        else
        {
            printf("\n Erreur : L'obstacle n'est pas dans l'espace. Il n'y apparaitra donc pas.");
            break;
        }
    }
}

void mise_a_jour(char *tab, int x, int y, int n, int m, int z)
{
    int nbr_maj, nrj;
    int alea;
    srand (time(0));

    for( nbr_maj=5000, nrj=5200 ; nbr_maj!=0&&nrj!=0 ; nbr_maj-- )
    {
        alea=rand()%7;

    printf("%d", alea);

        switch(alea)
        {
            case 0 :
                if (*(tab+x*(n-1)+(m-1)) != 'X' )
                {
                    n=n-1;
                    m=m-1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 1 :

                if (*(tab+x*n+(m-1)) != 'X' )
                {
                    m=m-1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 2 :

                if (*(tab+x*(n+1)+(m-1)) != 'X' )
                {
                    n=n+1;
                    m=m-1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 3 :

                if (*(tab+x*(n+1)+m) != 'X' )
                {
                    n=n+1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 4 :

                if (*(tab+x*(n+1)+(m+1)) != 'X' )
                {
                    n=n+1;
                    m=m+1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 5 :

                if (*(tab+x*n+(m+1)) != 'X' )
                {
                    m=m+1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 6 :

                if (*(tab+x*(n-1)+(m+1)) != 'X' )
                {
                    n=n-1;
                    m=m+1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            case 7 :

                if (*(tab+x*(n-1)+m) != 'X' )
                {
                    n=n-1;
                    *(tab+x*n+m)= 'o';
                    break;
                }
            default :
                printf("BUG");
                break;
        }
    }
}


//fonction affiche : affichage du tableau
void affiche(char *tab, int x, int y)
{
    //declaration des variables
    int i, j;

    //affichage du tableau avec bordures
    for(i=0;i<x;i++)
    {
        printf("\n");

        for(j=0;j<y;j++)
            printf("----");

        printf("-");
        printf("\n");

        for(j=0;j<y;j++)
            printf(": %c ", *(tab+x*i+j));

        if(j==y)
            printf(":");
    }
    printf("\n");

    for(j=0;j<y;j++)
    {
        printf("----");
    }
    printf("-");

}


Voila,

Merci de votre aide Smile
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Blip
Gardien
avatar

Nombre de messages : 793
Age : 29
Date d'inscription : 19/02/2008

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 2:38

C'est quoi qui ne fonctionne pas dans la partie que tu nous montres ?

Le printf s'affiche ?
Je te conseillerais également de sortir tes break de tes { } dans ton switch.

______________________________
Gardien de l'Exodus Lilium.

Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ellidan
Emissaire
avatar

Nombre de messages : 84
Age : 27
Date d'inscription : 14/11/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 2:48

ça me met que la console cesse de fonctionner ... :s


sinon je peux pas les sortir car sinon, si y'a un obstacle ça va pas regarder la case d'apres ... :s
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
hypopsis
Emissaire
avatar

Nombre de messages : 143
Age : 28
Date d'inscription : 22/09/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 14:20

j ai TP d info cet aprem je regarderais ca.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ellidan
Emissaire
avatar

Nombre de messages : 84
Age : 27
Date d'inscription : 14/11/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 15:14

ok merci Smile
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
hypopsis
Emissaire
avatar

Nombre de messages : 143
Age : 28
Date d'inscription : 22/09/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 15:52

y as des partie que je comprend aps tu te casse al tete sur des truc vachment compliquer pour aps grand chose.
J aurai besoin d info supplementaire car ton lien ne marche pas
1: c est du C ou du C++.


Sinon

int define(int x)
{
static int i, X, Y;

switch (i)
{
case 0 :
printf("\n Entrez la dimension verticale de l'espace ( nombre de lignes ) : ");
do (scanf("%d", &x)); while (x<=0 && printf("Erreur la valeur entrée est incorrecte. Veuillez l'entrer à nouveau."));
X=x;
break;
case 1 :
printf("\n Entrez la dimension horizontale de l'espace ( nombre de colonnes ) : ");
do (scanf("%d", &x)); while (x<=0 && printf("Erreur la valeur entree est incorrecte. Veuillez l'entrer à nouveau."));
Y=x;
break;
case 2 :
printf("\n Entrez l'abscisse du robot : ");
do (scanf("%d", &x)); while ((x<=0||x>=X)&&printf("Erreur la valeur entree est incorrecte. Veuillez l'entrer à nouveau."));
break;
case 3 :
printf("\n Entrez l'ordonnee du robot : ");
do (scanf("%d", &x)); while ((x<=0||x>=Y)&&printf("Erreur la valeur entree est incorrecte. Veuillez l'entrer à nouveau."));
break;
case 4 :
printf("\n Entrez l'orientation du robot : ");
do (scanf("%d", &x)); while ((x<=0||x>3)&&printf("Erreur la valeur entree est incorrecte. Veuillez l'entrer à nouveau."));
break;
}

i++;
return x;
}


Ton i n'est pas initialiser
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ellidan
Emissaire
avatar

Nombre de messages : 84
Age : 27
Date d'inscription : 14/11/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 16:10

alors c'est du C
le lien marche bien normalement :s

sinon le static intialise i à 0

le probleme se situe dans la la fonction de mise_a_jour car ça marche tres bien sans ( mais le robot ne se déplace pas )

comment heberger un pdf pour que vous puissiez le voir ?
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ellidan
Emissaire
avatar

Nombre de messages : 84
Age : 27
Date d'inscription : 14/11/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 16:22

Revenir en haut Aller en bas
Voir le profil de l'utilisateur
hypopsis
Emissaire
avatar

Nombre de messages : 143
Age : 28
Date d'inscription : 22/09/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 16:38

Moi en fait la console ce lance mais effectivement arrivé a la mise a jour y as un bug de segmentation
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
hypopsis
Emissaire
avatar

Nombre de messages : 143
Age : 28
Date d'inscription : 22/09/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 16:50

alors j'ai repéré une petite erreur
dans ta fonction tu met %7 et une case 7 Or tu n'aura jamais 7 vu que s'il reste 7 ca veut dire que c est divisible par 7 et donc ca fera 0.

Quand au probleme de segmentation:
Tu fait 5000 fois la meme chose en tres peu de temp.
reduit juste ton nbr_Maj a 20 tu vera

Sinon je te conseille de mettre plus d affichage genre a chaque deplacement en indiquant les deplacement precedent du robot et en mettant distinctivement la position actuel du robot.

PS ton programme marche avec ces modification:
alea=rand()%8;
nbr_maj=20
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ellidan
Emissaire
avatar

Nombre de messages : 84
Age : 27
Date d'inscription : 14/11/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 16:55

mais je dois mettre 5200 maj c'est dans la donnée :s

sinon peut etre que l'affichage intermediaire enleve la segmentation ...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
hypopsis
Emissaire
avatar

Nombre de messages : 143
Age : 28
Date d'inscription : 22/09/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 16:56

peut etre j essaye de te le faire avec 5k alors
je vien de tester malheureusement il y as un probleme au niveau d la memoire. Je vais essayer de voir au bout de combiend essai ca bug.
bon alors mon prof vien de me dire que c'est ta memeoire qui est pas asez grande et que pour que cela marche il faut utiliser des conaissance qui me depassent actuelement desoler


EDIT: ca bug ver 150 pour moi si je vais suffisament lentement apres j ai une saturation de memoire ...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ellidan
Emissaire
avatar

Nombre de messages : 84
Age : 27
Date d'inscription : 14/11/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 17:28

Je pense pas que le probleme vienne de la mémoire :s

j'ai 8 giga de ram donc normalement je peux faire tourner un truc comme ça je pense ...

pareil j'ai un i7 720Q comme processeur :s
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ellidan
Emissaire
avatar

Nombre de messages : 84
Age : 27
Date d'inscription : 14/11/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 17:52

En fait je dois pas m'y prendre correctement.

Je pense que ce que je fais est trop compliqué et peut etre remplacé par quelque chose de simple ( je ne fait de la programmation que 4h par semaine depuis 3 mois ... )

Peut etre que si j'ajoute la condition de sortie de la boucle une fois toute les cases visitées ça va marcher ...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Zildark
OWien
avatar

Nombre de messages : 1124
Age : 23
Localisation : Dans ton cul ^^ Sinon c'est Dijon xD
Date d'inscription : 26/04/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 18:49

Bonne chance Wink

En tout cas moi je sais que je ferais jamais ça ><
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ellidan
Emissaire
avatar

Nombre de messages : 84
Age : 27
Date d'inscription : 14/11/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 19:02

En fait, apres quelque test j'ai regardé ...

Au bout de 5 maj, il a parcouru les 2/3 d'une grille 10/10 ...

Donc le probleme est dans la boucle de mise à jour ...

Je pense qu'il est dans le switch plus exactement mais je vois pas ce qui ne va pas :s
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
hypopsis
Emissaire
avatar

Nombre de messages : 143
Age : 28
Date d'inscription : 22/09/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 22:00

essaye de créé ton tableau autrement.
Utilise le malloc (allocation dynamic);
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ellidan
Emissaire
avatar

Nombre de messages : 84
Age : 27
Date d'inscription : 14/11/2010

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 22:01

j'ai pas vu le malloc mais j'ai compris mon erreur ...

en fait, j'avais pas fixé de limites pour le tableau d'ou la segmention fault des que ça en sortait Smile

bref j'ai corrigé tout ça Very Happy

merci de votre aide en tout cas Smile

Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Aron
Gardien
avatar

Nombre de messages : 1393
Age : 26
Localisation : manche
Date d'inscription : 08/05/2009

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 22:25

de rien de rien ^^

______________________________
Vous m’avez reproché de penser que j’avais toujours raison. Et je me suis rendu compte que vous aviez raison. Enfin je pense. Mais va savoir si j’ai raison !
Exodus Lilium.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Grok
Gardien
avatar

Nombre de messages : 3641
Age : 34
Localisation : Besançon / Mulhouse
Date d'inscription : 09/01/2006

MessageSujet: Re: Probleme Programmation C   Lun 22 Nov 2010 - 22:54

Et Dieu inventa le Garbage Collector... :pataper:

ou c'était McCarthy.

______________________________
MP moi pour tester EVE gratuitement pendant 3 semaines.


Grok, Yom & Basmorda - Exodus Lilium.
               
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.exodus-lilium.com
Zildark
OWien
avatar

Nombre de messages : 1124
Age : 23
Localisation : Dans ton cul ^^ Sinon c'est Dijon xD
Date d'inscription : 26/04/2010

MessageSujet: Re: Probleme Programmation C   Mar 23 Nov 2010 - 1:02

GG à tous ! ^^
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
hypopsis
Emissaire
avatar

Nombre de messages : 143
Age : 28
Date d'inscription : 22/09/2010

MessageSujet: Re: Probleme Programmation C   Dim 28 Nov 2010 - 20:19

*contenue effacé*


Dernière édition par hypopsis le Mer 1 Déc 2010 - 22:36, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ellidan
Emissaire
avatar

Nombre de messages : 84
Age : 27
Date d'inscription : 14/11/2010

MessageSujet: Re: Probleme Programmation C   Dim 28 Nov 2010 - 21:12

Voila, j'ai à nouveau un probleme, en fait avant, le programme ne pouvait afficher que les tableaux qui étaient carré ....

Alors j'ai essayé de corriger le probleme mais j'ai pas réussi :s

Je pense que le probleme se situe dans la définition du mur autour de l'espace ou le robot se déplace ou bien dans l'affichage ...

Affichage :
Code:
void affiche(char *tab, int ligne, int colonne)
{
    //declaration des variables
    int i, j;

    //affichage du tableau avec bordures
    for(i=1;i<(ligne-1);i++)
    {
        printf("\n");

        for(j=1;j<(colonne-1);j++)
            printf("----");

        printf("-");
        printf("\n");

        for(j=1;j<(colonne-1);j++)
            printf(": %c ", *(tab+(colonne-1)*i+j));

        if(j==(colonne-1))
            printf(":");
    }
    printf("\n");

    for(j=1;j<(ligne-1);j++)
    {
        printf("----");
    }
    printf("-");

    printf("\n");

}

Creation du mur :
Code:
void creation_mur(char *tab, int ligne, int colonne)
{
    int i,j;

    for(j=0;j<ligne;j++)
    {
        *(tab+j*colonne)=(char) 4;
        *(tab+colonne*(j-1)+1)=(char) 4;
    }

    for(i=0;i<colonne;i++)
    {
        *(tab+i)=(char) 4;
        *(tab+colonne*(ligne-1)+i)=(char) 4;
    }

}


Code complet :

Code:
 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int define(int);
void orientation(char*, int, int, int, int);
void creation_mur(char*, int, int);
void position_obstacle(char*, int, int);
void mise_a_jour(char*, int, int, int, int, int);
void affiche(char*, int, int);

int main()
{
    srand (time(0));
    int ligne=0, colonne=0, ligne_robot=0, colonne_robot=0, z=0;
    ligne = define(ligne);
    colonne = define(colonne);
    char tab[ligne][colonne];

    //initialisation du tableau par des espaces vides
    memset(tab[0], ' ', sizeof(tab));

    ligne_robot = define(ligne_robot);
    colonne_robot = define(colonne_robot);
    z = define(z);

    orientation(*tab, ligne, ligne_robot, colonne_robot, z);

    creation_mur(*tab, ligne, colonne);

    position_obstacle(*tab, ligne, colonne);

    affiche(*tab, ligne, colonne);

    mise_a_jour(*tab, ligne, colonne, ligne_robot, colonne_robot, z);

    affiche(*tab, ligne, colonne);

    return 0;
}

int define(int x)
{
    static int k, X, Y;

    switch (k)
    {
        case 0 :
            printf("\n Entrez la dimension verticale de l'espace ( nombre de lignes ) : ");
            do (scanf("%d", &x)); while (x<=0&&printf("Erreur la valeur entrée est incorrecte. Veuillez l'entrer à nouveau."));
            x=x+2;
            X=x;
            break;
        case 1 :
            printf("\n Entrez la dimension horizontale de l'espace ( nombre de colonnes ) : ");
            do (scanf("%d", &x)); while (x<=0&&printf("Erreur la valeur entree est incorrecte. Veuillez l'entrer à nouveau."));
            x=x+2;
            Y=x;
            break;
        case 2 :
            printf("\n Entrez l'abscisse du robot : ");
            do (scanf("%d", &x)); while ((x<=0||x>X)&&printf("Erreur la valeur entree est incorrecte. Veuillez l'entrer à nouveau."));
            x=x+1;
            break;
        case 3 :
            printf("\n Entrez l'ordonnee du robot : ");
            do (scanf("%d", &x)); while ((x<=0||x>Y)&&printf("Erreur la valeur entree est incorrecte. Veuillez l'entrer à nouveau."));
            x=x+1;
            break;
        case 4 :
            printf("\n Entrez l'orientation du robot : ");
            do (scanf("%d", &x)); while ((x<0||x>3)&&printf("Erreur la valeur entree est incorrecte. Veuillez l'entrer à nouveau."));
            break;
    }

    k++;
    return x;
}

void orientation(char *tab, int ligne, int ligne_robot, int colonne_robot ,int z)
{
    switch(z)
    {
        case 0 :
            *(tab+ligne*ligne_robot+colonne_robot)='|';
            break;
        case 1 :
            *(tab+ligne*ligne_robot+colonne_robot)='/';
            break;
        case 2 :
            *(tab+ligne*ligne_robot+colonne_robot)='-';
            break;
        case 3 :
            *(tab+ligne*ligne_robot+colonne_robot)='\';
            break;
    }

}

void creation_mur(char *tab, int ligne, int colonne)
{
    int i,j;

    for(j=0;j<ligne;j++)
    {
        *(tab+j*colonne)=(char) 4;
        *(tab+colonne*(j-1)+1)=(char) 4;
    }

    for(i=0;i<colonne;i++)
    {
        *(tab+i)=(char) 4;
        *(tab+colonne*(ligne-1)+i)=(char) 4;
    }

}


void position_obstacle(char *tab, int ligne, int colonne)
{
    int a=0, b=0;

    while(1)
    {
        printf("\n Entrez l'abscisse de l'obstacle (ou -1 si pour ne pas ajouter d'obstable) : ");
        scanf("%d", &a);
        if(a==-1)
            break;
        a=a+1;
        printf("\n Entrez l'ordonnee de l'obstacle : ");
        scanf("%d", &b);
        b=b+1;

        if ((0<a)&&(a<=ligne-1)&&(0<b)&&(b<=colonne-1))
            switch (*(tab+ligne*a+b))
            {
                case ' ':
                    *(tab+ligne*a+b)='X';
                    break;
                case 'X':
                    printf("\n ! Il y a des obstacles à la meme position. ! ");
                    break;
                case ((char) 4):
                    printf("\n ! L'obstacle ne peut se trouver sur un mur ! ");
                    break;
                default :
                    printf("\n ! Des obstacles sont à la meme position que le robot et n'apparaitrons pas ! ");
            }
        else
        {
            printf("\n Erreur : L'obstacle n'est pas dans l'espace. Il n'y apparaitra donc pas.");
            break;
        }
    }
}

void mise_a_jour(char *tab, int ligne, int colonne, int ligne_robot, int colonne_robot, int z)
{
    int alea;
    int xx, yy, compteur=0, nbr_maj=0, energie=5200;


    while(nbr_maj < 5000 && energie >= 0)
    {

        nbr_maj++;
        compteur=0;

        for(xx=0; xx<ligne; xx++)
        {
            for(yy=0; yy<colonne; yy++)
            {
                if (*(tab+ligne*xx+yy) != ' ')
                    compteur++;
            }
        }

        if (compteur==(ligne*colonne)||energie==0)
            break;

        alea=rand()%8;

        switch(alea)
        {
            case 0 :
                if (*(tab+ligne*(ligne_robot-1)+(colonne_robot-1)) != 'X'
                                        && *(tab+ligne*(ligne_robot-1)+(colonne_robot-1)) != (char)4 )
                {
                    ligne_robot=ligne_robot-1;
                    colonne_robot=colonne_robot-1;
                    *(tab+ligne*ligne_robot+colonne_robot)= '\';
                }
                break;
            case 1 :

                if (*(tab+ligne*ligne_robot+(colonne_robot-1)) != 'X'
                                        && *(tab+ligne*ligne_robot+(colonne_robot-1)) !=(char)4)
                {
                    colonne_robot=colonne_robot-1;
                    *(tab+ligne*ligne_robot+colonne_robot)= '|';
                }
                break;
            case 2 :

                if (*(tab+ligne*(ligne_robot+1)+(colonne_robot-1)) != 'X'
                                        && *(tab+ligne*(ligne_robot+1)+(colonne_robot-1)) !=(char)4)
                {
                    ligne_robot=ligne_robot+1;
                    colonne_robot=colonne_robot-1;
                    *(tab+ligne*ligne_robot+colonne_robot)= '/';
                }
                break;
            case 3 :

                if (*(tab+ligne*(ligne_robot+1)+colonne_robot) != 'X'
                                        && *(tab+ligne*(ligne_robot+1)+colonne_robot) !=(char)4)
                {
                    ligne_robot=ligne_robot+1;
                    *(tab+ligne*ligne_robot+colonne_robot)= '-';
                }
                break;
            case 4 :

                if (*(tab+ligne*(ligne_robot+1)+(colonne_robot+1)) != 'X'
                                        && *(tab+ligne*(ligne_robot+1)+(colonne_robot+1)) !=(char)4)
                {
                    ligne_robot=ligne_robot+1;
                    colonne_robot=colonne_robot+1;
                    *(tab+ligne*ligne_robot+colonne_robot)= '\';
                }
                break;
            case 5 :

                if (*(tab+ligne*ligne_robot+(colonne_robot+1)) != 'X'
                                        && *(tab+ligne*ligne_robot+(colonne_robot+1)) !=(char)4)
                {
                    colonne_robot=colonne_robot+1;
                    *(tab+ligne*ligne_robot+colonne_robot)= '|';
                }
                break;
            case 6 :

                if (*(tab+ligne*(ligne_robot-1)+(colonne_robot+1)) != 'X'
                                        && *(tab+ligne*(ligne_robot-1)+(colonne_robot+1)) !=(char)4)
                {
                    ligne_robot=ligne_robot-1;
                    colonne_robot=colonne_robot+1;
                    *(tab+ligne*ligne_robot+colonne_robot)= '/';
                }
                break;
            case 7 :

                if (*(tab+ligne*(ligne_robot-1)+colonne_robot) != 'X' && *(tab+ligne*(ligne_robot-1)+colonne_robot) !=(char)4)
                {
                    ligne_robot=ligne_robot-1;
                    *(tab+ligne*ligne_robot+colonne_robot)= '-';
                }
                break;
        }
    }

    if(nbr_maj==5000)
        printf("Time Out");
    else if(energie==0)
        printf("Plus d'Energie !");
    else
        printf("Succes !");

    printf("\n Nombre de mises a jour : %d", nbr_maj);
    printf("\n Energie restante : %d", energie);
}



//fonction affiche : affichage du tableau
void affiche(char *tab, int ligne, int colonne)
{
    //declaration des variables
    int i, j;

    //affichage du tableau avec bordures
    for(i=1;i<(ligne-1);i++)
    {
        printf("\n");

        for(j=1;j<(colonne-1);j++)
            printf("----");

        printf("-");
        printf("\n");

        for(j=1;j<(colonne-1);j++)
            printf(": %c ", *(tab+(colonne-1)*i+j));

        if(j==(colonne-1))
            printf(":");
    }
    printf("\n");

    for(j=1;j<(ligne-1);j++)
    {
        printf("----");
    }
    printf("-");

    printf("\n");

}
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
hypopsis
Emissaire
avatar

Nombre de messages : 143
Age : 28
Date d'inscription : 22/09/2010

MessageSujet: Re: Probleme Programmation C   Dim 28 Nov 2010 - 23:55

ok je retravaillerais dessus demain pendant mon tp d'info (13h30 - 15h30)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ellidan
Emissaire
avatar

Nombre de messages : 84
Age : 27
Date d'inscription : 14/11/2010

MessageSujet: Re: Probleme Programmation C   Lun 29 Nov 2010 - 0:12

ok merci Smile

Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Probleme Programmation C   

Revenir en haut Aller en bas
 
Probleme Programmation C
Revenir en haut 
Page 1 sur 2Aller à la page : 1, 2  Suivant
 Sujets similaires
-
» [Résolu]probleme alicebox
» Petit probleme [Pandawa eau lvl 43]
» Idée : Solution au probleme de longueur limitée des URL?
» [RESOLU] Installer opennab probleme
» Probleme Nabaztag+tag freebox v4

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
 :: Discussion-
Sauter vers: