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 :

Programme qui ne va pas jusqu'au bout ?


Sujet :

C

  1. #21
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    			putchar(isalnum(courant),chaine[courant]);
     
    }
    Euh, arrête de coder au hasard... putchar() attend un paramètre, pas deux...

    isalnum() retourne 0 ou 1. On l'utilise donc comme une expression, par exemple, de if :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (isalnum(...))
    {
       /* faire ... */
    Le paramètre de isalnum() est un caractère. Celui de putchar(), aussi ...

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Pourquoi ce code fonctionne pour putchar ?

    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
    #include<stdio.h>
    #include<ctype.h>
     
    int main()
    {
    	char t[100],courant=0;
     
    	printf("Tapez un cara : ");
    	courant=getchar();
     
    		for(courant;EOF!=courant;courant=getchar())
    		putchar(tolower(courant),t[courant]);
     
    	return 0;
    }
    Je m'excuse de tatonner et d'aller au hasard comme ça et je vois bien que ce n'est pas la bonne méthode mais j'ai vraiment beaucoup de mal à apprendre et je m'en rends bien compte

  3. #23
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    gl :
    En outre, je ne vois pas vraiment l'intérêt et les avantages apportés par les VLA, donc ça ne me choque pas de ne pas les utiliser.
    +1

    Ce genre "d'innovation" plombe une norme surtout quand elle est visiblement difficile à implémenter correctement.

  4. #24
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Citation Envoyé par chicabonux
    Pourquoi ce code fonctionne pour putchar ?
    Etrange, quel compilateur utilises-tu ?

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Visual Studio 2005 et le programme fonctionne correctement

    Mais c'est vrai que dans mes cours on ne m'explique pas vraiment comment utiliser les fonctions Dans le tuto du SDZ ce n'est pas spécifié non plus

  6. #26
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Mon compilateur (gcc v4.3.2) me signale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    chicab.c: In function ‘main’:
    chicab.c:11: warning: statement with no effect
    chicab.c:12: warning: array subscript has type ‘char’
    chicab.c:12: error: too many arguments to function ‘putchar’
     
    le shell a retourné 1
    Je me permet de modifier ton code comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include<stdio.h>
    #include<ctype.h>
     
    int main(void)
    {
    	int c;
    	/* Afficher les caracteres lu un a un en minuscule */
    	while( (c=getchar())!=EOF )
    	{	
    		putchar(tolower(c));	
    	}
     
    	return 0;
    }
    Citation Envoyé par chicabonux
    Mais c'est vrai que dans mes cours on ne m'explique pas vraiment comment utiliser les fonctions ...
    Tu consultes le man, dans ce cas : putc

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Je suis vos conseils et j'essaie de comprendre

    Mais pourquoi ce code me donne comme résultat des caractères non alphanumériques ?

    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
    #include<stdio.h>
    #include<ctype.h>
    #include<string.h>
     
    int main()
    {
    	char chaine[100],courant=0;
     
    	printf("Tapez un cara : ");
    	courant=getchar();
     
    			do
    			{
    				for(courant;EOF!=courant;courant=getchar()){
    					if(isalnum(courant))courant=chaine[courant];
    					putchar(chaine[courant]);
    								}
    			}
    while(chaine[courant]!='\0');
     
    	return 0;
    }

  8. #28
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    Je suis vos conseils et j'essaie de comprendre

    Mais pourquoi ce code me donne comme résultat des caractères non alphanumériques ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    				for(courant;EOF!=courant;courant=getchar()){
    					if(isalnum(courant))courant=chaine[courant];
    					putchar(chaine[courant]);
    								}
    Selon toi, 'courant' désigne un indice de tableau ou un caractère ? Il fau que les choses soient claires dans ton esprit. Si il y a 2 informations, il faut 2 variables...

    Tant que tu n'auras pas appris à formuler le fonctionnement attendu sous la forme d'un algorithme avant de coder, tu feras n'importe quoi... La programmation, c'est pas du hasard. C'est un art et ça s'apprend.

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    J'essaie d'être logique mais j'éprouve toujours autant de difficulté

    Je n'arrête pas de faire des brouillons ou des pseudos codes mais ça ne fonctionne toujours pas mieux

    Voilà mon dernier pseudo code

    -Je tape une liste de caractères
    -Je les range dans un tableau

    -Je dois parcourir ce tableau pour vérifier si chaque élément est alphanumérique ou pas

    -J'affiche seulement les éléments alphanumériques
    voila le code que j'ai réalisé :

    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
    #include<stdio.h>
    #include<ctype.h>
    #include<string.h>
     
    int main()
    {
    	/*Déclarations des variables*/
    	char chaine[100],caractereActuel=0;
    	int i=0,nombreDeCaracteres=0;
     
    /*Saisie caractères par caractères du tableau*/
    	printf("Tapez un caractere : ");
    	caractereActuel=getchar();
     
     
    /*Initialisation du tableau et je boucle tant que le compilateur n'a pas trouver la fin du tableau*/
    	do
    	{
    	for(i=0;i<nombreDeCaracteres;i++)
    		caractereActuel=chaine[nombreDeCaracteres];
    	}while(chaine[nombreDeCaracteres]!='\0');
     
    		/*Je teste chaque valeur du tableau et j'affiche les caractères alphanumériques*/
    	for(i=0;i<nombreDeCaracteres;i++)
    	{
    		if(isalnum(caractereActuel))
    		{
    			caractereActuel=chaine[nombreDeCaracteres];
    			putchar(caractereActuel);
    		}
    	}
    	return 0;
    }
    Et ça ne fonctionne toujours pas


    Je t'assure que j'essaie de ne pas faire au hasard et que j'essaie d'être logique mais c'est vrai que je ne comprends pas le mécanisme et que je suis conscient du fait que je dois apprendre encore beaucoup et surtout comprendre

    ça fait quasiment une semaine que je suis sur cet exercice et j'aimerais en fait qu'on m'explique la marche à suivre ce qui je pense me ferait progresser un petit peu

  10. #30
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    voila le code que j'ai réalisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include<stdio.h>
    #include<ctype.h>
    #include<string.h>
     
    int main()
    {
    	/*Déclarations des variables*/
    	char chaine[100],caractereActuel=0;
    	int i=0,nombreDeCaracteres=0;
     
    /*Saisie caractères par caractères du tableau*/
    	printf("Tapez un caractere : ");
    	caractereActuel=getchar();
    Ici, tu saisies UN caractère. (qui devrait être de type int et non char).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    /*Initialisation du tableau et je boucle tant que le compilateur n'a pas trouver la fin du tableau*/
    	do
    	{
    	for(i=0;i<nombreDeCaracteres;i++)
    		caractereActuel=chaine[nombreDeCaracteres];
    	}while(chaine[nombreDeCaracteres]!='\0');
    Ici, tu parcours un tableau non initialisé en cherchant un 0. Ca n'a aucun sens. Quel est le rapport avec ton algo ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    		/*Je teste chaque valeur du tableau et j'affiche les caractères alphanumériques*/
    	for(i=0;i<nombreDeCaracteres;i++)
    	{
    		if(isalnum(caractereActuel))
    		{
    			caractereActuel=chaine[nombreDeCaracteres];
    			putchar(caractereActuel);
    		}
    	}
    	return 0;
    }
    étant donné qu'il y a n'importe quoi dans le tableau, le comportement est indéterminé...

    Commence déjà par faire une saisie correcte.

    Tu peux utiliser scanf(), mais c'est assez difficile de le faire correctement. Je recommande plutôt fgets().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char ligne[TAILLE];
    fgets(ligne, sizeof ligne, stdin);

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Citation:
    Code :


    /*Initialisation du tableau et je boucle tant que le compilateur n'a pas trouver la fin du tableau*/
    do
    {
    for(i=0;i<nombreDeCaracteres;i++)
    caractereActuel=chaine[nombreDeCaracteres];
    }while(chaine[nombreDeCaracteres]!='\0');


    Ici, tu parcours un tableau non initialisé en cherchant un 0. Ca n'a aucun sens. Quel est le rapport avec ton algo ?
    Je pensais que c'était comme ça qu'on initialisait un tableau ?
    Et pour la saisie des données on me demande de saisir caractère par caractère ?

    Comment je dois faire pour initialiser le tableau ?

  12. #32
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    Je pensais que c'était comme ça qu'on initialisait un tableau ?
    En le lisant ?
    Et pour la saisie des données on me demande de saisir caractère par caractère ?

    Comment je dois faire pour initialiser le tableau ?
    Il n'y a pas besoin d'initialiser le tableau.

    Pour faire une saisie caractères par caractères dans un tableau, il suffit d'une boucle, d'un compteur/indice, et de getchar(). On s'arrête quand on a lu '\n'. On place alors un 0 en fin de tableau. On s'assure évidemment qu'on ne déborde jamais du tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    char ligne[TAILLE];
    int i = 0;
    int c;
     
    while ((c = getchar()) != '\n' && i < TAILLE - 1)
    {
       ligne[i] = c;
       i++;
    }
    ligne[i] = 0;
    C'était difficile ?

  13. #33
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Lorsque tu crées une chaine de caractères un caractère introduit par l'utilisateur à la fois, tu dois réfléchir à:
    • Ce qui va mettre fin à la saisie
    • comment placer le caractère introduit par l'utilisateur à "la place qui lui est due"
    • comment t'assurer que la chaine de caractères sera considérée comme complete une fois la saisie finie

    L'ordre d'exécution étant:
    1. attendre que l'utilisateur ait introduit un caractère
    2. voir si le caractère saisi met fin à la saisie
    3. placer le caractère à la place qui lui est due
    4. si on n'a pas mis fin à la saisie, retourner en (1)
    5. s'assurer que la chaine de caractères est correctement terminée (présence d'un '\0' après le dernier caractère utile)

    Cela nécessite un certain nombre de variables afin de pouvoir gérer, comme l'a fait remarquer Emmanuel, les différentes informations (une variable par information), et nous ramène au code que je donnais dans ma première intervention en ce qui concerne les variables qu'il nous faut:
    • un tableau de caractères pour représenter la chaine de caractères
    • un entier permettant de connaitre la place à laquelle nous devrons placer le caractère suivant
    • une constante nous permettant de ne pas essayer de placer plus de caractères que ce que la chaine ne peut en contenir
    • un caractère (ou un entier) pour récupérer l'introduction de l'utilisateur
    • une variable booléenne nous permettant de déterminer s'il faut une introduction supplémentaire ou si l'introduction est finie

    [EDIT]Ta chaine de caractères sera initialisée lorsque tu effectuera la première saisie complète

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Je m'excuse si j'ai du mal à comprendre mais j'aimerais réaliser cet exercice et là je commence à m'énerver à voir qu'il y a toujours un truc qui ne fonctionne pas

    Je vous remercie de votre aide mais j'ai l'impression que je vais mettre longtemps à maitriser le langage

  15. #35
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    Je m'excuse si j'ai du mal à comprendre mais j'aimerais réaliser cet exercice et là je commence à m'énerver à voir qu'il y a toujours un truc qui ne fonctionne pas

    Je vous remercie de votre aide mais j'ai l'impression que je vais mettre longtemps à maitriser le langage
    En fait il y a 2 choses à maitriser pour programmer :

    - La programmation (concepts généraux indépendant des langages)
    - Un ou plusieurs langages de programmation.

    Si le C est ton premier langage et que tu n'as jamais fait de programmation avant, c'est sûr que ça fait beaucoup d'un coup. Je confirme ce que je dis souvent, le langage C n'est pas un langage de débutant. (sauf exceptions avec des personnes particulièrement douées, mais ce n'est ni toi, ni moi). Le C est bourré de pièges qui obscurcissent les principes pourtant simples de la programmation.
    • valeur
    • constante
    • variable
    • opérateurs
    • fonctions
    • structures de code décisionnelles
    • structures de code itératives
    • appels de fonctions
    • tableaux
    • structures de données
    • chaines

    Personnellement, après une mauvaise expérience avec le BASIC dans les années 80, je me suis réellement initié correctement à la programmation avec le Pascal en 1987. C'est un langage universitaire (peu d'applications industrielles) de 3ème génération (L3G), fait pour apprendre la programmation par algorithme.

    Aujourd'hui, on conseillerait plutôt Ruby ou Python pour démarrer la programmation. Mais le Pascal est bien aussi, car contrairement aux langages pré-cités, il enseigne la rigueur ... Pour moi, ça reste le langage d'apprentissage de référence.

  16. #36
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Mais si au moins tu prenais la peine de réfléchir un peu aux conseils que l'on te donne...

    Le premier conseil, c'est de réfléchir à la succession logique et cohérente des étapes que tu dois appliquer.

    Au niveau de la fonction principale, la succession logique est de:
    1. Demander à l'utilisateur d'introduire un mot
    2. de gérer l'introduction du mot par l'utilisateur selon les recommandations de l'énoncé
    3. de tester si le mot en question est un palindrome
    A part le (1) (qui peut prendre place au début de la fonction expliquée en (2) ), chaque étape correspond à ce qu'il est utile de transformer en fonction, de manière à "déléguer les responsabilités": autrement dit, de manière à ce que chaque fonction ne doive s'occuper que d'une chose, mais qu'elle le fasse bien.
    l'étape (2) va se décomposer en une série d'actions plus petites, qui devrait prendre une forme proche de
    1. afficher l'invite à introduire un mot (ca, ca peut se trouver dans main())
    2. attendre que l'utilisateur introduise un caractère (getc() )
    3. voir ce que l'on fait du caractère introduit: quatre solutions s'offrent à nous:
      1. Le caractère est une minuscule: nous le placons à l'endroit qui convient
      2. c'est une majuscule, nous le transformons en minuscule avant de le placer à l'endroit qui convient
      3. ce n'est pas une lettre, nous l'oublions purement et simplement
      4. le caractère met fin à la saisie, nous nous mettons en situation de sortie de boucle
    4. Si la saisie n'est pas finie, retourner en (2)
    5. s'assurer que la chaine de caractères est bien terminée par '/0' (nous aurions pu le faire en 3-4 )
    6. renvoyer la taille de la chaine introduite, car nous l'avons calculée durant l'introduction, et il serait bête de perdre cette information qui nous sera utile par ailleurs.
    7. Nous avons mené notre job à bien

    L'étape (3) va aussi se décomposer en plusieurs étapes:
    1. Nous partons d'une position N=0 et d'une taille de mot qui ne prend pas le '\0' final en compte
    2. Tant que nous avons affaire à un mot qui est peut etre un palindrome et que nous n'avons pas testé tous les caractères du mot
      1. Si le caractère en position N est identique à celui qui est en position (taille -N)
        1. nous incrémentons N de manière à passer au caractère suivant
      2. sinon

        1. le mot n'est pas un palindrome
    3. Une fois que l'on est sorti de la boucle: si le mot est un palindrome
      1. nous indiquons que le mot est un palindrome
    4. sinon
      1. nous indiquons que le mot n'est pas est un palindrome
    5. Nous avons mené notre job à bien


    Entre la logique que je viens de t'énoncer, les différentes variables dont j'ai dit que tu avais besoin et les conseil des autres interventions, tu disposes de tout ce dont tu as besoin...

    Mais, comme l'a si bien signalé Emmanuel, la programmation n'est jamais le fruit du hasard: c'est le fruit d'un processus de mise au point d'une logique strictement suivie et cohérente avec les besoins que tu dois remplir

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    J'essaie de faire des raisonnements logiques et je vous remercie de votre très grande patience avec moi
    Je suis vos conseils (comme je peux ) et je tente un nouveau programme
    Le problème c'est que déjà je n'arrive pas à le compiler puisque ça me met une erreur de syntaxe à la ligne 45 .Donc je n'ai même pas pu tester le nouveau code qui je pense doit être encore à reprendre car je ne suis pas du tout sur de mon raisonnement
    Je vous remercie encore de votre aide et aussi de votre patience

    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
    #include<stdio.h>
    #include<ctype.h>
    #include<string.h>
     
    char min(char tableau[],char caractere);
     
     int main(int argc, char *argv[])
    {
        char chaine[100];
    	char caractereActuel,caractereTeste;
    	int i,taille;
     
    	printf("Cara : ");
    	caractereActuel=getchar();
     
    	taille =strlen(chaine);
     
    	/*Les boucles et les tests*/
     
    	do
    	{
    		for(i=0;i<=taille;i++)
    		{
    			caractereTeste=min(chaine,caractereActuel);
    			if(isalpha(caractereTeste))caractereTeste=chaine[i];
    		}
    	}while(caractereActuel!='\0');
     
    	/*Test pour vérifier si la chaine est un palindrome maintenant que nouss connaissons la
    	taille de la chaine et que les différentes valeurs du caractére tapé par l'utilisateur
    	ont été testées*/
     
    	if(caractereTeste=taille-caractereTeste)printf(" la phrase %s est un palindrome\n",chaine);
    	else printf("La phrase %s n'est pas un palindrome\n",chaine);
     
    	return 0;
     }
     
     char min(char tableau[],char caractere)
     {
    	 if(isupper(caractere))
    		 caractere=tableau[caractere];
     
    	 else(tolower(caractere))
    	 		 caractere=tableau[caractere];
     
     
    	 return caractere;
     }

  18. #38
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Bonjour,

    Voici la partie du code incriminée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    char min(char tableau[],char caractere)
     {
    	 if(isupper(caractere))
    		caractere=tableau[caractere];
     
    	 else(tolower(caractere))
    	 	caractere=tableau[caractere];
     
     
    	 return caractere;
     }
    En effet, le else ne supporte pas de conditions (à moins de mettre else if {})

    Donc le code de la fonction min devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    char min(char tableau[],char caractere)
     {
    	 if(isupper(caractere))
    		caractere=tableau[caractere];
     
    	 else
    	 	caractere=tableau[caractere];
     
     
    	 return caractere;
     }
    D'ailleurs, dans les deux cas vous faites la même chose, êtes-vous sûr que c'est bien ce que vous souhaitez faire?

    [edit] A noter que ton tableau chaine, n'est jamais initialisé, donc ton code ne fait rien

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Ce nouveau code donne à nouveau des résultats érronés ? Où se situe mes nouvelles erreurs ?

    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
    #include<stdio.h>
    #include<ctype.h>
    #include<string.h>
     
    char min(char tableau[],char caractere);
     
     int main(int argc, char *argv[])
    {
    	char chaine[100];
    	char caractereActuel=0,caractereTeste=0;
    	int i=0,taille=0;
     
    	printf("Cara : ");
    	caractereActuel=getchar();
     
    	taille=strlen(chaine);
    	for(i=0;i<=taille;i++)
    		caractereActuel=chaine[i];
     
    		/*Les boucles et les tests*/
     
    	do
    	{
    		for(i=0;i<=taille;i++)
    		{
    						caractereTeste=min(chaine,caractereActuel);
    			if(isalpha(caractereTeste))caractereTeste=chaine[i];
    		}
    	}while(caractereActuel!='\0');
     
    	/*Test pour vérifier si la chaine est un palindrome maintenant que nous connaissons la
    	taille de la chaine et que les différentes valeurs du caractére tapé par l'utilisateur
    	ont été testées*/
     
    	if(caractereTeste=taille-caractereTeste)printf(" la phrase %s est un palindrome\n",chaine);
    	else printf("La phrase %s n'est pas un palindrome\n",chaine);
     
    	return 0;
     }
     
     char min(char tableau[],char caractere)
     {
    	 if(isupper(caractere)){
    		 caractere=tableau[caractere];
    	 }
    	 else if(tolower(caractere))
    	 {
    		 caractere=tableau[caractere];
    	 }
     
    	 return caractere;
     }

  20. #40
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Il y a d'autres anomalies dans ton code quand on le lit, indépendamment de ce que ton programme veux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     int main(int argc, char *argv[])
    {
        char chaine[100];
    ...
       taille =strlen(chaine);....
    chaine n'a pas été initialisé et contient n'importe quoi. Comme strlen recherche le zéro terminal pour obtenir la longueur de la chaine, il va répondre n'importe quoi !
    Si tu veux obtenir le nombre d'éléments d'un tableau, utilise sizeof :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    taille = sizeof chaine/ sizeof *chaine ; //taille du tableau/taille d'un élément du tableau
    //ici, sizeof *chaine vaut 1 puique c'est un tableau de char
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0;i<=taille;i++) // devrait alors être for(i=0;i<taille;i++)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	do
    	{
    ...
    	}while(caractereActuel!='\0');
    ou on sort tout de suite de la boucle, ou on en sort jamais : caractereActuel n'est pas modifié dans la boucle et garde sa valeur initiale. Probablement, il manque un caractereActuel=getchar(); dans la boucle do

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	if(caractereTeste=taille-caractereTeste)printf(" la phrase %s est un palindrome\n",chaine);
    	else printf("La phrase %s n'est pas un palindrome\n",chaine);
    probalement une erreur dans le if : la condition est une assignation (=) et non une comparaison (==)
    L'expression taille-caractereTeste est bizarre; elle combine un entier taille et un caractère. Elle est possible d'un point de vue de la syntaxe, mais n'a pas de sens dans le contexte de définition de taille et de caractereTeste

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Commande batch qui ne s'exécute pas jusqu'au bout
    Par jejeman dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 03/10/2012, 13h04
  2. [1.x] fichier test qui ne s'execute pas jusqu'au bout
    Par erictomcat dans le forum Symfony
    Réponses: 2
    Dernier message: 20/08/2012, 23h04
  3. Programme qui ne réalise pas le tri
    Par Premium dans le forum C
    Réponses: 3
    Dernier message: 02/08/2006, 14h14
  4. Programme qui ne fonctionne pas
    Par jipé95 dans le forum C
    Réponses: 7
    Dernier message: 26/04/2006, 19h08
  5. Réponses: 18
    Dernier message: 13/12/2005, 13h27

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