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 se termine prématurément


Sujet :

C

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut Mon programme se termine prématurément
    Bonjour,

    Ce programme ne s'exécute pas ?

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    /*Nom:exercice 1 du devoir 8
    version 1.0
    auteur:
    date de création : 12/7/2009
    date de dernière mise à jour :
    Description du travail :
    -saisir un par un les mots constituants le dictionnaire
    -recherche dichotomique d'un mot dans le dictionnaire
    -affichage du résultat de la recherche*/
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
     
    #define MAXMOTS 100
    #define LONGMOT 20
     
    short dichotomie(char **dico,char *mot,short nb_mots);
     
    main()
    {
    	/*déclaration et initialisation des variables*/
    	short nb_mots=0;
    	char *mot;
    	char **dico;
    	int termine,cptr;
    	short moTrouve;
    	termine=0;
    	mot=malloc(LONGMOT*sizeof(*mot));
    	dico=malloc(MAXMOTS*sizeof(char *));
     
    	/*saisie des mots du dictionnaire*/
    	while((termine!=1)&&(nb_mots<MAXMOTS))
    	{
    		printf("entrer un mot (fin pour terminer) : ");
    		scanf("%s",mot);
     
    		if(strcmp(mot, "fin")==0)
    		{
    			termine=1;
    		}
    		else
    		{
    			*(dico+nb_mots)=malloc(strlen(mot)+1);
    			strcpy(*(dico+nb_mots),mot);
    			nb_mots++;
    		}
    	}
     
    	moTrouve=dichotomie(dico,mot,nb_mots);
    	if(moTrouve==1)
    	{
    		printf("le mot %s a ete trouve .\n",mot);
    	}
    	else
    	{
    		printf("le mot %s est introuvable .\n",mot);
    	}
     
    	/*libération espâce mémoire*/
    	free(mot);
    	free(dico);
    }
     
    short dichotomie(char **dico,char *mot,short nb_mots)
    {
    	/*initialisation des variables*/
    	int i,j,k,trouve,inter;
    	i=0;
    	j=nb_mots;
    	k=(nb_mots,2);
     
    	/*saisie du mot à trouver*/
    	printf("entrer le mot a trouver : ");
    	scanf("%s",mot);
     
    	/*recherche du mot saisi dans le dico*/
    	do
    	{
    		inter=j-i;
    		k=(j+i)/2;
    		trouve=strcmp(*(dico+k),mot);
    		if(trouve>0)j=k;
    		if(trouve<0)i=k;
    		if(trouve==0)inter=1;
    	}while(inter>1);
     
    	/*renvoi résultat recherche*/
    	if(trouve==0)
    	{
    		system("pause");
    		return 1;
    	}
    	else
    	{
    		return 0;
    	}
    }

  2. #2
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Que veux tu dire par ne s'execute pas ?

  3. #3
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    ça devrait me demander une liste de mot à écrire dans un dico et ensuite retrouvé un mot dans ce dico.
    à l'exécution ça ne me donne rien .ça me marque juste taper un mot à trouver, je le tape et ça me marque 'appuyer sur une touche pour continuer' ce qui met fin au programme

  4. #4
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    J'ai copier coller le code.

    dans un premier temps, je rentre effectivement tout les mots que je veux, puis je rentre fin afin de terminer.
    Puis je rentre un mot et le programme me dit si oui ou non il est present dans la liste de mot que je viens de rentrer.

    Ton programme doit-il faire cela ?
    Plante t'il toujours ?

  5. #5
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main(void)
    {
      /* ... */
      return EXIT_SUCCESS;
    }
    -------------------

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            *(dico+nb_mots)=malloc(strlen(mot)+1);
    	strcpy(*(dico+nb_mots),mot);
    Tu peux utiliser les crochet c'est plus facile à lire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           	dico[nb_mots]=malloc(strlen(mot)+1);
           	strcpy(dico[nb_mots], mot);
    -------------------

    Tu ne libere pas la mémoire allouée dans la boucle while
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            *(dico+nb_mots)=malloc(strlen(mot)+1);
    -------------------

    Tu peux legerment simplifier la boucle while avec un break :
    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
    	while(nb_mots<MAXMOTS)
    	{
    		printf("entrer un mot (fin pour terminer) : ");
    		scanf("%s",mot);
     
    		if(strcmp(mot, "fin")==0)
    		{
    			break;
    		}
    		else
    		{
    			dico[nb_mots]=malloc(strlen(mot)+1);
    			strcpy(dico[nb_mots], mot);
    			nb_mots++;
    		}
    	}
    ça evite l'utilisation de la variable termine.

    -------------------

    Les saisies ne sont pas sécurisées.

    ...

  6. #6
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    J'ai effectué ces changements mais ça ne fonctionne toujours pas .
    Si je mets le mot 'je' dans la liste de dico quand je tape la recherche ça ne me donne aucun résultat

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    /*Nom:exercice 1 du devoir 8
    version 1.0
    auteur:
    date de création : 12/7/2009
    date de dernière mise à jour :
    Description du travail :
    -saisir un par un les mots constituants le dictionnaire
    -recherche dichotomique d'un mot dans le dictionnaire
    -affichage du résultat de la recherche*/
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
     
    #define MAXMOTS 100
    #define LONGMOT 20
     
    short dichotomie(char **dico,char *mot,short nb_mots);
     
    main()
    {
    	/*déclaration et initialisation des variables*/
    	short nb_mots=0;
    	char *mot;
    	char **dico;
    	int termine,cptr;
    	short moTrouve;
    	termine=0;
    	mot=malloc(LONGMOT*sizeof(*mot));
    	dico=malloc(MAXMOTS*sizeof(char *));
     
    	/*saisie des mots du dictionnaire*/
    	while((termine!=1)&&(nb_mots<MAXMOTS))
    	{
    		printf("entrer un mot (fin pour terminer) : ");
    		scanf("%s",mot);
     
    		if(strcmp(mot, "fin")==0)
    		{
    			termine=1;
    		}
    		else
    		{
    			*(dico+nb_mots)=malloc(strlen(mot)+1);
    			strcpy(*(dico+nb_mots),mot);
    			nb_mots++;
    		}
    	}
     
    	moTrouve=dichotomie(dico,mot,nb_mots);
    	if(moTrouve==1)
    	{
    		printf("le mot %s a ete trouve .\n",mot);
    	}
    	else
    	{
    		printf("le mot %s est introuvable .\n",mot);
    	}
     
    	/*libération espâce mémoire*/
    	free(mot);
    	free(dico);
    	free(*(dico+nb_mots));
    }
     
    short dichotomie(char **dico,char *mot,short nb_mots)
    {
    	/*initialisation des variables*/
    	int i,j,k,trouve,inter;
    	i=0;
    	j=nb_mots;
    	k=(nb_mots,2);
     
    	/*saisie du mot à trouver*/
    	printf("entrer le mot a trouver : ");
    	scanf("%s",mot);
     
    	/*recherche du mot saisi dans le dico*/
    	do
    	{
    		inter=j-i;
    		k=(j+i)/2;
    		trouve=strcmp(*(dico+k),mot);
    		if(trouve>0)j=k;
    		if(trouve<0)i=k;
    		if(trouve==0)inter=1;
    	}while(inter>1);
     
    	/*renvoi résultat recherche*/
    	if(trouve==0)
    	{
    		system("pause");
    		return 1;
    	}
    	else
    	{
    		return 0;
    	}
    	return EXIT_SUCCESS;
    }

  7. #7
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Bonjour chicabonux

    J'ai vu dans d'autres posts que tu as mis sur le forum que tu prenais des cours par correspondance et je comprends que, seul, se mettre au C, sans personne, un collègue pour dépanner par exemple, ce n'est pas évident. Aussi, je me permets ces quelques remarques de fond, avant quelques indications sur ton programme.

    Il faut, quand tu rencontres un problème comme celui-ci, que tu tentes de cerner un peu mieux où ça foire. Surtout vu le contexte de cours par correspondance où tu dois apprendre à être le plus autonome possible.

    Aller à la pèche et balancer sur le forum 100 ou 200 lignes de code en disant "Ca marche pas" ne me parait pas être très efficace (personnellement, un jour où je suis un tantinet énervé, ça me pousserait presque à te répondre "coco, t'es gentil mais mets y un peu du tien").

    L'utilisation du debugger serait vraiment un plus (tu en as forcément un, intégré avec Visual Studio que tu utilises, je crois). Tu as déjà écrit que tu ne savais pas l'utiliser mais je pense vraiment que c'est un très bon investissement à faire.

    Au pire, utilise le "débugger du pauvre", c'est à dire, en C, des appels à fprintf(stderr,...) pour faire afficher le contenu de tes variables. Dans ton exemple, fais toi une fonction qui affiche le contenu du dictionnaire. Tu l'appelles à la fin de la saisie et, éventuellement, si tu soupçonnes un mauvais passage d'arguments à ta fonction dichotomie, au tout début de cette fonction.

    Ta fonction dichotomie ne fait pas ce que tu attends ? Affiche, à chaque itération, les bornes inf et sup de la partie du dictionnaire que tu vas utiliser pour la recherche, affiche avec quel mot du dictionnaire la comparasion (strcmp) est faite, etc...

    Le désavantage de cette façon de faire est que ton code sera à un moment truffé d'instructions parasites que tu devras enlever une fois que ton code fonctionnera. D'où l'intérêt du débugger !

    Maintenant, ton code.

    1 - qui dit recherche dichotomique sous-entend tableau trié : tu ne tries nulle part les éléments de ton dictionnaire ... ça ne peut pas marcher, que ton algo de recherche soit correct ou non !

    2 - dans ta fonction dichotomie, tu as un " k=(nb_mots,2) ". Faute de recopie ou c'est pareil dans ton code ? Ca compile et, chez moi, ça affecte systématiquement 2 à k, quelle que soit la valeur de nb_mots

    3 - utilité de l'argument mot dans ta fonction dichotomie ? En l'état, ça te dispense de déclarer une variable chaine pour y stocker le mot à rechercher, saisi par l'utilisateur (l'argument passé a été alloué dans le main) mais c'est très vilain. Il faut que tu l'enlèves du prototype de la fonction car, en l'état, on a l'impression, à la lecture, que c'est l'appelant qui fournit le mot à rechercher.

    4 - question de style : souvent, quand on définit une taille max (de tableaux, de chaines) via un #define, c'est parce que :
    - soit on débute et les allocations ...
    - soit on fait un truc vite fait, jetable
    et on ne fait pas d'allocation mémoire (dynamique) mais on dimensionne directement les variables

    Ca ferait ici :

    char dico[MAXMOTS][LONGMOT] (avec ou pas +1 pour 19 ou 20 car effectifs)

    Toi, tu utilises ces constantes pour faire l'allocation dynamique. Ce n'est pas faux mais c'est un peu contradictoire.

    Bon courage

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    Tout d'abord je te remercie de ton aide

    C'est vrai que c'est pas évident d'apprendre un langage tout seul et c'est pour ça que je viens souvent sur le forum pour rechercher de l'aide
    Toutes les astuces que tu cites , je ne peux pas les connaître seul même en cherchant longtemps sur le net.
    Dans mes cours de C on m'explique les bases avec des exercices mais c'est très compliqué à assimiler .

    je pense qu'il me faudrait énormément de temps pour apprendre le C et je dois faire un choix pour la suite de mes cours : soit rester un an ou plus sur le langage pour l'assimiler le mieux possible , tout en sachant que je ne suis pas à plein temps sur mes cours car il faut aussi bosser dans la vie et mon job n'a rien à voir avec l'informatique malheureusement ,
    soit je mets le turbo dans ces exercices pour pouvoir rendre rapidement mes devoirs et je continue en permanence plus tard à essayer de me perfectionner et d'apprendre le C . Je regarde en parallèle la FAQ C et le forum C et je pense enquiller ensuite sur le C++ mais là il me faut prendre mon temps.


    Si tu peux me donner un bon coup de main en m'expliquant certains trucs sur ce forum ça m'aiderait énormément et me ferait progresser dans le bon sens.
    J'ai compris ce que tout le monde me répond dans ce forum au sujet de mon apprentissage mais comme je vous ai expliqué plus haut je'ai décidé de faire un choix et de rendre mes devoirs au plus vite en essayant de gagner des connaissances sur le C et sur le fait d'essayer de devenir programmeur plus tard.

    Pour revenir à mes problèmes j'ai cherché des tutoriels sur Visual Studio et je n'ai trouvé pour le moment que les nouveautés de VS 2005 par rapport aux autres . C'est vrai que je n'ai là encore pas fait de recherches approfondies

    Si tu pouvais m'aiguiller dans ce sens pour VS et me dire ou m'indiquer des liens ça serait déjà un bon début je crois .

    Et pour mon exercice comment faire pour trier le tableau ? Je sais je devrais savoir mais à chaque fois que j'essaie de faire quelque chose je me trompe lamentablement

  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Par défaut
    Salut,

    Pour trier un tableau, il y'a évidemment plein de méthodes plus où moins rapides et plus ou moins faciles à coder.

    Tu trouveras ici dans les cours algo des exemples de tris, je te conseille le tri bulle ou le tri par sélection, qui sont plus faciles à implémenter en C (ils sont bien sur moins efficaces que le tri rapide ou fusion, mais tu pourras toujours en changer plus tard).

    Je pense qu'il existe sur developpez.com des exemples de code de tri, mais coder le tri à partir de l'algo est un bon exercise je trouve.

    Bon courage

  10. #10
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    En complément (car l'idée du Mérovingien d'aller voir différents types de tri est judicieuse), tu peux aussi t'exercer à utiliser l'existant. Qsort (stdlib) est une fonction de tri générique (ça trie des tableaux de "n'importe quoi", il faut juste fournir la relation d'ordre (entre deux éléments, qui est avant qui ?))

    Tu peux même raffiner ton code en demandant à l'utilisateur quel tri il souhaite utiliser (le "fait maison" que tu auras codé ou le qsort)

    ps : je te contacte via les MP

  11. #11
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    Ce n'est pas ça la formule de tri ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /*recherche du mot saisi dans le dico*/
    	do
    	{
    		inter=j-i;
    		k=(j+i)/2;
    		trouve=strcmp(*(dico+k),mot);
    		if(trouve>0)j=k;
    		if(trouve<0)i=k;
    		if(trouve==0)inter=1;
    	}while(inter>1);

  12. #12
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    Ce n'est pas ça la formule de tri ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /*recherche du mot saisi dans le dico*/
        do
        {
            inter=j-i;
            k=(j+i)/2;
            trouve=strcmp(*(dico+k),mot);
            if(trouve>0)j=k;
            if(trouve<0)i=k;
            if(trouve==0)inter=1;
        }while(inter>1);
    Non, ça c'est la formule de recherche d'un mot par dichotomie, qui te permet de retrouver rapidement un mot dans un tableau *trié* ! Ca ne trie pas le tableau. Je pense que tu as recopié/adapté ce code, mais as-tu pris le temps de le comprendre ?

  13. #13
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    En fait je poste parce que déjà le programme ne fonctionne pas mais aussi pour comprendre le code et essayer de l'améliorer .
    Il y a vraiment beaucoup de choses en C que je n'ai pas acquis et que je cherche à apprendre

  14. #14
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Par défaut
    D'accord,

    Tu peux si tu veux essayer de coder à part une fonction de tri, et la tester avec des tableaux de string comme pour ton programme, et ensuite la poster ici, comme ça tu pourras recueillir les différents avis, et ensuite tu l'inclues dans ton programme.

    Je ne sais pas à quel mement il est judicieux de trier ton tableau, car il faut essayer de le trier le moins de fois possible (c'est long de trier un tableau) donc soit tu le tries après chaque ajout de mot, soit avant chaque recherche de mot, si on peut à tour de role ajouter et rechercher des mots. Si on doit ajouter tous les mots avant de les chercher, alors tu fais seulement un tri après le dernier ajout

    Bon courage,

    @+

  15. #15
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    Je crois que j'ai des difficultés à créer la fonction tri

    Je commence la fonction comme ça je sais que c'est pas bon mais j'aimerais comprendre pourquoi)

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char *argv[])
    {
        /*déclaration des variables*/
        int t[50];
        int i,j,recherche,N,aide;
     
        printf("Introduire la taille du tableau(max.50) : ");
        scanf("%d",&N);
     
        printf("introduire l'element a recherche : ");
        scanf("%d",&recherche);
     
        /*initialisation du tableau*/
        for(i=0;i<N;i++)
        {
                        printf("%d element : ",i);
                        scanf("%d",t[i]);
                        }
     
                        /*recherche dans le tableau*/
         for(i=0;i<N;i++)
         {
                         for(j=i;j<N;j++)
                         {
                                         if(t[j]<N)t[j]=recherche;
                                         aide=t[i];
                                         t[i]=t[j];
                                         t[j]=aide;
                          }
         }
         printf("l'element recherche est : %d\n",t[i]);               
     
      system("PAUSE");	
      return 0;
    }

  16. #16
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Par défaut
    Je ne sais pas trop ce que fait ton algo, mais c'est clairement pas un tri . D'ailleurs tu l'a toi même appelé recherche, et ça s'en rapproche plus.

    Je vais poster et expliquer l'algo de tri par sélection, et tu me diras si ça te parait clair.

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>    // pour initialiser srand()
     
    /* Cette fonction échange les éléments i et j dans le tableau t */
    void echange(int t[], int i, int j)
    {
      int tmp;
     
      tmp = t[i];
      t[i] = t[j];
      t[j] = tmp;
    }
     
     
    /* Cette fonction recherche le plus grand élément du tableau t de taille n.
     * Elle renvoie l'indice qui correspond à cet élément.
     * On suppose que n > 0
     */
    int cherche_max(int t[], int n)
    {
      int i,i_max;
     
      i_max = 0;   // le i_max (indice du max) est initialisé à 0, ie le max est supposé être le 1er élément du tableau.
     
      for(i=1;i<n;i++)  // on parcourt tous les éléments à partir du 2ième.
        {
          if( t[i] > t[i_max] ) // Si on a un élément plus grand que le max trouvé pour l'instant...
        i_max = i;          // ... le nouveau max est l'élément d'indice i, ie l'indice du nouveau max est i.
        }
     
      return i_max;  // à la fin de la boucle, l'indice du max est dans i_max.
    }
     
     
    /* Le tri par sélection :
     * Algo : on va trier le tableau t de taille n en suivant l'algo suivant :
     * - on recherche l'indice de l'élément max dans le tableau de taille n ;
     * - on échange l'élément max avec le dernier, ainsi il est bien placé ;
     * - on recommence avec le meme tableau mais en allant seulement jusqu'à l'élément (n-1).
     * - A la fin, quand n vaut 1, le tableau est trié : un tableau à un seul élément est toujours trié.
     */
    void tri_selection_rec(int t[], int n)
    {
      int i_max;
     
      if( n==1 ) // c'est fini
        return;
      else
        {
          i_max = cherche_max(t,n);   // on recherche l'élément max
          echange(t, i_max, n-1 );    // on l'échange avec le dernier
          tri_selection_rec(t, n-1);  // on recommence avec le tableau sans la dernière case
        }
    }
     
     
     
    /***** Fonctions pour les tests *******/
    int alea(int n)
    {
      return (int) ((double) rand() * (n+1) / ((double)RAND_MAX+1));
    }
     
    void gen_tab_aleatoire(int t[], int n)
    {
      int i;
     
      for(i=0;i<n;i++)
        t[i] = i;
     
      for(i=n-1; i>=0; i--)
        echange(t,i,alea(i));
    }
     
    void print_tab(int t[], int n)
    {
      int i;
     
      printf("[");
     
      if(n>0)
        {
          for(i=0;i<n-1;i++)
        printf("%d; ",t[i]);
     
          printf("%d",t[n-1]);
        }
     
      printf("]\n");
    }
    /********************************************/
     
    int main(void)
    {
      int t[20];
     
      srand (time (NULL)); // initialisation du générateur de nombres aléatoires
     
      gen_tab_aleatoire(t,20);
     
      print_tab(t,20);
     
      tri_selection_rec(t,20);
     
      print_tab(t,20);
     
      return 0;
    }

Discussions similaires

  1. Mon programme java utilisant itext ne se termine jamais !
    Par Battosaiii dans le forum Langage
    Réponses: 8
    Dernier message: 14/11/2012, 17h40
  2. Veuillez m'aider pour terminer mon programme
    Par tarek_ep dans le forum Firebird
    Réponses: 4
    Dernier message: 18/07/2008, 07h44
  3. [débutant]Mon programme ne termine pas
    Par ThreeQuarks dans le forum Caml
    Réponses: 13
    Dernier message: 24/08/2007, 15h13
  4. [] Utiliser AVI d'une DLL dans mon programme
    Par seb.49 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 02/05/2003, 14h52
  5. Réponses: 11
    Dernier message: 17/03/2003, 10h56

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