begin process at 2010 03 14 18:00:47
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Chaîne de caractères

 > MISE EN ORDRE ALPHABETIQUE DE 2 CHAINES SANS UTILISER STRCMP ET STRNCMP

MISE EN ORDRE ALPHABETIQUE DE 2 CHAINES SANS UTILISER STRCMP ET STRNCMP


 Information sur la source

Note :
Aucune note
Catégorie :Chaîne de caractères Niveau :Débutant Date de création :28/06/2004 Date de mise à jour :29/06/2004 11:24:32 Vu :2 849

Auteur : bethany

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

 Description

Cliquez pour voir la capture en taille normale
Ayant eu à faire ceci en partiel, je me suis dit que quelqu'un qui était aussi en fin d'année de DUT GEII pourrait en avoir besoin !!!
Ce partiel concernait surtout les chaines de caracteres, donc... amusez vous bien, c'est marrant cinq minutes mais apres on se lasse... :(

Source

  • #include <stdio.h>
  • #include <ctype.h>
  • #include <string.h>
  • #include <stdlib.h>
  • #define MAX 1024
  • int ordre_alpha(char *CH1, char *CH2); //definition de la fonction
  • main()
  • {
  • char CH1[MAX]; //premiere chaine de caractères
  • char CH2[MAX]; //seconde chaine de caracteres
  • int ordre;
  • printf("Entrez la chaine 1: ");
  • gets(CH1);
  • printf("Entrez la chaine 2: ");
  • gets(CH2);
  • ordre=ordre_alpha(CH1, CH2); // appel de la fonction ordre_alpha
  • if (ordre==0)
  • {
  • printf("Remise en ordre:\n%s\n%s\n", CH2, CH1);
  • }
  • if (ordre==1)
  • {
  • printf("Remise en ordre:\n%s\n%s\n", CH1, CH2);
  • }
  • if (ordre==2)
  • {
  • printf("Vous avez entre deux chaines identiques.\n");
  • }
  • return(0);
  • }
  • int ordre_alpha(char *CH1, char *CH2)
  • {
  • int i, n, m;
  • m=strlen(CH1);
  • n=strlen(CH2);
  • if (m!=n)
  • {
  • if (m<n)
  • {
  • for (i=0; i<n;i++)
  • {
  • CH1[i]= tolower(CH1[i]); //on passe tout en minuscule afin de ne pas avoir de conflits avec des majuscules
  • CH2[i]= tolower(CH2[i]);
  • if(CH1[i]!=CH2[i]) // si on détecte une différence
  • {
  • if (CH1[i]<CH2[i]) // et si la premiere chaine est inférieure de code ASCII alors
  • {
  • return (1); // on retourne 1, qui veut dire que l'on est bien dans l'odre alphabétique
  • }
  • else return 0; // sinon on retourne 0
  • }
  • }
  • }
  • if (n<m) // de meme que pour la précédente fonction
  • {
  • for (i=0; i<m;i++)
  • {
  • CH1[i]= tolower(CH1[i]);
  • CH2[i]= tolower(CH2[i]);
  • if(CH1[i]!=CH2[i])
  • {
  • if (CH1[i]<CH2[i])
  • {
  • return (1);
  • }
  • else return 0;
  • }
  • }
  • }
  • }
  • else if (m==n)
  • {
  • for (i=0; i<n;i++)
  • {
  • CH1[i]= tolower(CH1[i]);
  • CH2[i]= tolower(CH2[i]);
  • if(CH1[i]!=CH2[i])
  • {
  • if (CH1[i]<CH2[i])
  • {
  • return (1);
  • }
  • else
  • {
  • return (0);
  • }
  • }
  • }
  • return(2);
  • }
  • }
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#define MAX 1024

int ordre_alpha(char *CH1, char *CH2); //definition de la fonction

main()
{
                char CH1[MAX]; //premiere chaine de caractères 
    char CH2[MAX]; //seconde chaine de caracteres
    int ordre;

    printf("Entrez la chaine 1: ");
    gets(CH1);
    printf("Entrez la chaine 2: ");
    gets(CH2);

    ordre=ordre_alpha(CH1, CH2); // appel de la fonction ordre_alpha

    if (ordre==0)
    {
        printf("Remise en ordre:\n%s\n%s\n", CH2, CH1);
    }

    if (ordre==1)
    {
        printf("Remise en ordre:\n%s\n%s\n", CH1, CH2);
    }

    if (ordre==2)
    {
        printf("Vous avez entre deux chaines identiques.\n");
    }

    return(0);
}

int ordre_alpha(char *CH1, char *CH2)
{
    int i, n, m;
    m=strlen(CH1);
    n=strlen(CH2);

	if (m!=n)
	{
		if (m<n)
		{
			for (i=0; i<n;i++)
			{
				CH1[i]= tolower(CH1[i]); //on passe tout en minuscule afin de ne pas avoir de conflits avec des majuscules
				CH2[i]= tolower(CH2[i]);

				if(CH1[i]!=CH2[i]) // si on détecte une différence 
				{
					if (CH1[i]<CH2[i]) // et si la premiere chaine est inférieure de code ASCII alors
					{
						return (1); // on retourne 1, qui veut dire que l'on est bien dans l'odre alphabétique
					}
					else return 0; // sinon on retourne 0
				}
			}
		}


		if (n<m) // de meme que pour la précédente fonction
		{
			for (i=0; i<m;i++)
			{
				CH1[i]= tolower(CH1[i]);
				CH2[i]= tolower(CH2[i]);

				if(CH1[i]!=CH2[i])
				{
					if (CH1[i]<CH2[i])
					{
						return (1);
					}
					else return 0;
				}
			}
		}
	}

    else if (m==n)
    {
        for (i=0; i<n;i++)
        {
            CH1[i]= tolower(CH1[i]);
            CH2[i]= tolower(CH2[i]);

            if(CH1[i]!=CH2[i])
            {
                if (CH1[i]<CH2[i])
                {
                    return (1);
                }
                else 
                {
                    return (0);
                }
            }
        }
    return(2);
        
    }
}

 Conclusion

N'oubliez pas de compilez et oui je sais il y a un warning, je ne sais d'ailleurs pas trop pourquoi, si jamais vous vous savez à quoi il est du, ecrivez moi ;) et de toute facon ca marche quand meme !!!
Et aussi il faut cliqué sur le point d'exclamation plutot que sur l'autre truc pour afficher la fenetre car comme je n'ai pas mis de 'system(pause)' et bien la fenetre se ferme automatiquement!

PS: mille excuses pour mes éventuelles fautes d'orthographe...

MISE A JOUR: j'ai bien noté le dernier commentaire et j'ai rajouté un if(m!=n) avec 2 cas possible (m<n et n<m) mais ca me fait tjr le warning !!! Je ne comprends pas...


 Sources du même auteur

LECTURE ÉCRITURE DONNÉES

 Sources de la même categorie

FONCTION : CHAR * AJUSTERTAILLECHAINE() par Rockanos
Source avec Zip RECHERCHE D'ANNAGRAMMES par Torin
GESTION DE CHAINE DE CARACTÉRE EN C++ AVEC NSTRING par xmustapha
Source avec Zip COMMENTER CODE C <=> ASM (WIN64) par BruNews
Source avec Zip GSTRING - GESTION DES CHAINES DE CARACTÈRES par Neokript

Commentaires et avis

Commentaire de neo_00110010101 le 28/06/2004 17:30:46

printf("Vous avez entre deux mots identiques.\n");
&gt;&gt;
printf("Vous avez entr\202 deux mots identiques.\n");

tu auras l'accent ... et puis pour ton warning, met ça au début après les #include :

#pragma warning (disable:4715)

comme ça plus de warning (je me demande si c'est bien ?)
Cela ne resout pas le problème hein ?! il faut que tu le sâche !

Commentaire de bethany le 28/06/2004 17:43:25

Merci pour les caractères neo je savais pas !!! maintenant je saurais ... ;)

pour le warning je c pas pouquoi il me warning lol !!! mais bon je c pa si ca sert a grand chose de rajouté ton pragma puisqu'il marche pour l'instant!!!

Si quelqu'un arrive a me le planter, merci de me dire ou ca plante pour que je trouve enfin 'ZE' faille à ce petit programme de débutant ;)

Commentaire de hilairenicolas le 28/06/2004 18:44:32

ton warning vient du fait que tous les cas possibles ne produisent pas un return
en effet, si (m!=n) on retourne quoi ?
et puis la comparaison sus-nommée n'est pas bonne ... il faut un ==

Commentaire de bethany le 29/06/2004 11:16:16

Ah ok pour le m!=n !!! Mais un == ou ca???
Je vais modifier ma source :)

Commentaire de Soilwork9 le 09/08/2004 11:22:50

Salut bethany!
Oublie immediatement ce que neo t'a dit a propos du warning, c'est TRES mal :)
Un warning, en soi, ce n'est pas genant puisque ca n'empeche pas de compiler. Alors bien sur, tu peux l'ignorer, meme si c'est vrai qu'en general on n'aime pas avoir des messages a la compilation. Alors le meilleur moyen pour faire disparaitre ce warning, c'est de le corriger...

Dans ton cas, le warning indique qu'effectivement, certains embranchements (de if ... else) n'aboutissent pas à un return, or ta fonction est censée retourner un int. Cela ne veut pas dire que ton programme ne fera pas ce qu'il a à faire. Mais quand le compilateur génère ce Warning, il n'analyse pas le code dans les moindres détails pour vérifier si dans toutes les situations, il y aura une valeur de retour...

C'est un peu difficile a expliquer mais je vais essayer de prendre un exemple. Dans la première boucle FOR de ta fonction... Il y a un bloc IF (sans else) à l'interieur duquel il y a un autre bloc IF/else, avec deux return. Le compilateur ne cherche pas a savoir si ton programme va forcement passer a un moment ou a un autre par le bloc avec les return. (Il le ferait peut-etre si la condition était if(1), mais ce n'est pas le cas). En tout cas, il constate que s'il passe toujours par le "else" du premier if ("else" qui n'existe pas), il n'aura pas de return, donc il fait la gueule :) Je ne sais pas si c'est vraiment clair.. J'en doute ;)

En tout cas, pour corriger ce warning, je te conseille de retourner une valeur d'erreur (typiquement : return -1) tout à la fin de ta fonction, avant l'accolade fermante, puisque normalement tu n'es pas censé passer par la.

Je te conseille vivement, plutot que de désactiver les warnings qui t'ennuient, au contraire, de tous les activer (avec un paramètre de compilation, tel que -Wall si tu utilises GCC/G++, mais des paramètres similaires existent avec tous les compilateurs, je suppose, suffit de chercher un peu). Car corriger les warnings t'evitera bien souvent des erreurs difficiles a tracer! Et cela t'assurera un code relativement propre :)

Dernieres petites choses, a propos de ton main : int main (int argc, char**argv). Ca t'evitera un warning si tu compiles avec -Wall ;)
Et utilise plutot un switch à la place de 3 if :
switch(ordre)
{
case 0: //blabla
break;
case 1://blabla
break;
case 2: //blabla
break;
default: //Erreur!!!!!
printf("Erreur !!!! Aie Aie Aie c'est pas normal!! Qu'est-ce qui se passe?\n");
break;
}

Voila, bonne continuation!!
++
Soilwork

Commentaire de hackersmick le 31/03/2008 17:13:47

Cc bethany...

Merci pour ton programme, il m'a aidé un peu pour un projet de c.
De plus, j'ai trouvé ce qui n'allait pas :)

Un point important à savoir sur les fonctions :
Ne JAMAIS appeler une fonction avant de la définir !!(c'est ce que tu as fait pourtant :s !)

Sinon quand tu définies ton main() écris " int main() ".
J'ai augmenté MAX à 4096 et j'ai mis un system("PAUSE"); et un return 0; ...
et c'est parti !! ^^

a+

hackersmick

Commentaire de hackersmick le 31/03/2008 17:18:05

re..

j'ai oublié.. supprimes la ligne 7 de ton programme. Elle ne sert pas à grand chose ! ^^

hackersmick

 Ajouter un commentaire




Nos sponsors


Appels d'offres

Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

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,499 sec (3)

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