IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Mon programme affiche n'importe quoi


Sujet :

C

  1. #21
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Donc pour fgets je dois remplacer gets(choix) par fgets(choix,9,stdin) ?

    Sinon pour le tableau ,je crois que je n'assimile pas encore bien la notion .
    Pour moi le tableau doit être composé des différentes villes et je dois partir de la ville de départ et chercher toutes les possibilités d'itinéraire pour arriver à trouver l'itinéraire optimal .
    Les possibilités de parcours entre les différentes villes sont insérés dans la structure matrice .

    Comment faire pour dépiler et empiler le tableau ?

  2. #22
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Je comprends pas pourquoi on me dit que optimal[i] donne des valeurs erronées ? Pour moi on débute à i=o et on incrémente i tant que optimal[i]!=-1 ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	/*affichage de la longueur optimale*/
    	printf("\nla longueur optimale est de : %i\n",long_opti);
     
    	/*affichage du parcours*/
    	i=0;
     
    	printf("\nles villes a traverser sont :\n");
     
    	do
    	{
    		printf("\n\t%s",pville+(optimal[i]*LONGNOM));
    		i++;
    	}while(optimal[i]!=-1);
    }

  3. #23
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    Donc pour fgets je dois remplacer gets(choix) par fgets(choix,9,stdin) ?
    Il faut peut être adapter la taille du buffer (à cause du \n), utiliser sizeof plutôt qu'une taille en dur et gérer la présence/absence de \n dans les données lues pour avoir une entrée plus robuste, mais l'idée est bien celle-ci.

    Citation Envoyé par chicabonux Voir le message
    Sinon pour le tableau ,je crois que je n'assimile pas encore bien la notion .
    Pour moi le tableau doit être composé des différentes villes et je dois partir de la ville de départ et chercher toutes les possibilités d'itinéraire pour arriver à trouver l'itinéraire optimal .
    Les possibilités de parcours entre les différentes villes sont insérés dans la structure matrice .
    Tu as besoin de différent tableau dans ton code. Il y a effectivement le tableau contenant le nom des différentes ville (ville) ainsi qu'un tableau correspondant au graphe (chemin).

    Mais on te demande également d'utiliser un tableau pour représenter une pile qui est utilisé pour explorer les chemins possibles et trouver le chemin optimal.

    Citation Envoyé par chicabonux Voir le message
    Comment faire pour dépiler et empiler le tableau ?
    Qu'est ce que tu ne comprends pas précisément dans mon explication précédente ?

  4. #24
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    Je comprends pas pourquoi on me dit que optimal[i] donne des valeurs erronées ? Pour moi on débute à i=o et on incrémente i tant que optimal[i]!=-1 ?
    Le parcours de optimal lors de l'affichage n'est pas en cause, c'est le remplissage de optimal qui est incorrect.

  5. #25
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Il faut peut être adapter la taille du buffer (à cause du \n)
    comment gère -t-on la taille du buffer ?

    gérer la présence/absence de \n dans les données lues pour avoir une entrée plus robuste
    Même question ?

    un tableau correspondant au graphe (chemin)
    C'est bien la structure matrice chemin ?

    Mais on te demande également d'utiliser un tableau pour représenter une pile qui est utilisé pour explorer les chemins possibles et trouver le chemin optimal

    C'est le tableau optimal ou la structure ITINERAIRE ?

    Je me mélange dans tous ces tableaux et toutes ces structures en fait

  6. #26
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    comment gère -t-on la taille du buffer ?
    C'est toi qui donne la taille du tableau dans sa déclaration.

    Citation Envoyé par chicabonux Voir le message
    Même question ?
    Sujet maintes fois abordés dans ce forum. Je t'invite à faire une recherche sur l'usage de fgets().

    Citation Envoyé par chicabonux Voir le message
    C'est bien la structure matrice chemin ?
    Je parlais bien de la variable chemin qui est un tableau bidimensionnel de struct matrice.

    Citation Envoyé par chicabonux Voir le message
    C'est le tableau optimal ou la structure ITINERAIRE ?
    L'énoncé incite à utiliser un tableau de struct ITINERAIRE qui représentera bien à la fin de l'algorithme le chemin optimal.

    Citation Envoyé par chicabonux Voir le message
    Je me mélange dans tous ces tableaux et toutes ces structures en fait
    Le problème est surtout qu'encore une fois tu cherches à te raccrocher au code alors que tu n'as pas fait le travail préliminaire de conception : découpage en tâche élémentaire, description du comportement détaillé, découpage en fonction, etc.
    Tant que tu n'auras pas les idées claires sur ce que tu cherches à faire, tu vas butter sur la réalisation.

  7. #27
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Je vais donc commencer déjà par découper la fonction optimise en taches élémentaires
    Peux tu m'aiguiller déjà un peu dans ce sens ?

  8. #28
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Je relis mes cours sur les fonctions et sur les tableaux .

    Voilà une fonction qui devrait faire le tri croissant et décroissant d'un tableau mais en fait ça ne fait que le tri croissant ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    #include<stdio.h>
     
    void permute(int tab[],int i,int j)
    {
    	int temp;
     
    	temp=tab[i];
    	tab[i]=tab[j];
    	tab[j]=temp;
    }
     
    void tritab(int tab[],int taille,int(*ordre)(int,int))
    {
    	int i;
    	int j;
    	int min;
     
    	for(i=0;i<taille;i++)
    	{
    		min=i;
    		for(j=i+1;j<taille;j++)if(tab[j]<tab[min])min=j;
    		if(i!=min)permute(tab,i,min);
    	}
    }
     
    int inferieur(int a,int b)
    {
    	return a<b;
    }
     
    int superieur(int a,int b)
    {
    	return a>b;
    }
     
    int main()
    {
    	int tab[10];
    	int i;
     
    	for(i=0;i<10;i++)
    	{
    		printf("introduire tab[%d] : ",i);
    		scanf("%d",&(tab[i]));
    	}
     
    	printf("avant le tri : \n");
    	for(i=0;i<10;i++)
    	{
    		printf("tab[%d] : %d\n",i,tab[i]);
    	}
     
    	tritab(tab,10,inferieur);
     
    	printf("apres le tri : \n");
    	for(i=0;i<10;i++)
    	{
    		printf("tab[%d] : %d\n",i,tab[i]);
    	}
     
    	tritab(tab,10,superieur);
     
    	printf("apres le tri ;\n ");
    	for(i=0;i<10;i++)
    	{
    		printf("tab[%d] : %d\n",i,tab[i]);
    	}
    }

  9. #29
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    Je relis mes cours sur les fonctions et sur les tableaux .

    Voilà une fonction qui devrait faire le tri croissant et décroissant d'un tableau mais en fait ça ne fait que le tri croissant ?
    Dans la fonction tritab(), tu n'utilises pas le paramètre ordre qui est la fonction de comparaison. Tu effectue toujours la comparaison avec l'opérateur <, donc tu ne tries que dans l'ordre croissant.

    PS : au passage pour trier un tableau, il existe la fonction standard qsort().

  10. #30
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Dans la fonction tritab(), tu n'utilises pas le paramètre ordre qui est la fonction de comparaison
    Pourtant j'ai bien tritab(tab,10,inferieur) , tritab(tab,10,superieur) et void tritab(int tab[],taille,int(*ordre)(int,int)) ?

    Pourquoi je n'utilise pas le paramètre ordre ?
    Pourquoi mettre int(*ordre) en paramètre ? C'est donc une fonction en pointeur que j'envoie ?

  11. #31
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pourquoi mettre int(*ordre) en paramètre ? C'est donc une fonction en pointeur que j'envoie ?
    Oui.

    Citation Envoyé par chicabonux Voir le message
    Pourquoi je n'utilise pas le paramètre ordre ?
    Parce que tu as oublié de l'appeler, dans le corps de la fonction.
    Je pense que tu dois remplacer if(tab[j]<tab[min]) par if(ordre(tab[j], tab[min])).

    NOTE: Ce type de fonction de comparaison est "à la C++": On retourne un résultat booléen montrant l'infériorité. Je tiens à rappeler que ce n'est pas le cas "habituel" pour les fonctions de comparaison en C: Habituellement, une fonction de comparaison retourne une valeur négative, nulle ou positive selon le résultat de la comparaison.
    (pour info, .Net aussi compare "à la C")
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #32
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    ça fonctionne mieux en appelant le paramètre dans la fonction

    Pourquoi envoyer une fonction en pointeur ? Envoyer la fonction n'aurait pas fonctionner ?

  13. #33
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Une fonction ne s'envoie pas et ne peut se passer par copie. C'est toujours un pointeur.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #34
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Autre question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
     
    main()
    {
    	int i;
    	char *chaine1,*chaine2,*res;
     
    	chaine1="chaine";
    	chaine2="de caracteres";
    	res=(char*)malloc(strlen(chaine1)+strlen(chaine2)*sizeof(char));
    	for(i=0;i<strlen(chaine1);i++);
    	*res++=chaine1[i];
    	for(i=0;i<strlen(chaine2);i++)
    	*res++=chaine2[i];
    	printf("\nnombre de caracteres de res= %d\n",strlen(res));
    }
    c'est marqué dans mon cours que ça doit imprimer 0 pour res puisqu'il a été modifié au cours du programme
    Et en fait ça me donne 13 à l'exécution ?

    En plus je comprends pas comment res est modifié ?

  15. #35
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    res est modifié par les *res++ dans les boucles.
    Mais le buffer est trop petit pour contenir un zéro terminal, le résultat du dernier strlen() est donc indéfini.

    Le plus simple pour corriger cela est de modifier ainsi cette ligne:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    	res=(char*)malloc(strlen(chaine1)+strlen(chaine2)*sizeof(char));
    Remplacer par:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    	res = calloc(strlen(chaine1)+strlen(chaine2)+1, sizeof(char));
    (note: si tu as une erreur sans le cast, vérifie que tu compiles bien en C et non en C++)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #36
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    res est modifié par les *res++ dans les boucles.
    Mais le buffer est trop petit pour contenir un zéro terminal, le résultat du dernier strlen() est donc indéfini.
    Je crois que c'est là que je coince
    Je ne comprends pas ce que fait la ligne *res++=chaine1[i]

    Peux tu m'expliquer son fonctionnement ?

    (je compile avec Visual Studio qui doit compiler en C++ je pense , c'est pour ça que ça me donne 13 comme résultat ?)

  17. #37
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Corrige d'abord la ligne que je t'ai dit, et tu devrais avoir le bon résultat (0).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  18. #38
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Effectivement ça me donne bien 0

    Mais je ne comprends pas le fonctionnement du programme ?

  19. #39
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    Je crois que c'est là que je coince
    Je ne comprends pas ce que fait la ligne *res++=chaine1[i]
    Cette ligne affecte le contenu de chaine1[i] à *res (c'est à dire qu'elle copie le contenu de chaine1[i] à l'adresse pointée par res) puis incrémente le pointeur res (qui est donc déplacé "sur la case suivante").

    Ceci étant, cette écriture gagnerait à être simplifiée en parenthésant l'expression voire mieux en la scindant en plusieurs lignes.

  20. #40
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    On pourrait noter ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    *res=chaine1[i];
    *res++;

Discussions similaires

  1. Printf qui affiche n'importe quoi
    Par med1001 dans le forum C
    Réponses: 2
    Dernier message: 13/04/2012, 04h11
  2. mon programme affiche aucun resultat !
    Par domxaline dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 20/08/2009, 05h39
  3. Cherche à afficher n'importe quoi
    Par nahouto dans le forum MATLAB
    Réponses: 12
    Dernier message: 17/08/2009, 17h49
  4. Mon PC affiche n'importe quoi après un moment
    Par hardredman dans le forum Windows XP
    Réponses: 7
    Dernier message: 23/04/2008, 19h14
  5. Programme qui m'affiche n'importe quoi
    Par Gryzzly dans le forum C
    Réponses: 8
    Dernier message: 02/01/2006, 19h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo