Programmation en C

Fermé
solomon83 Messages postés 17 Date d'inscription lundi 25 juin 2007 Statut Membre Dernière intervention 29 juin 2012 - Modifié par solomon83 le 8/03/2011 à 17:56
solomon83 Messages postés 17 Date d'inscription lundi 25 juin 2007 Statut Membre Dernière intervention 29 juin 2012 - 15 mars 2011 à 21:31
Bonjour,

Je suis débutant en programmation en C, et on voit les chaînes de caractères pour l'instant.
Récemment on avait une interro à faire que j'ai échouée...Mais je voulais faire l'exercice pour comprendre.
Le but du programme est de trouver les espaces erronés et ceux mis en trop.
La phrase donnée: "PE TIT PIE RRE POSSE DE UN CANARD DE COULE UR BLANCHE"

1. Effacer les espaces erronés.
2. Trouver les espaces mis de trop et d'en remplacer un par astérisques (*).

J'ai réussi à effacer les espaces mis en trop, mais je n'arrive pas à faire remplacer le deuxième espace mis en trop par un astérisque...
Voici mon code:

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

// 1ère partie: Ecrire un programme qui reconstruit une phrase correcte (nouvelle chaîne)         
// 2ème partie: Reprendre la chaîne originale (avec les espaces erronés après le "E")         
// et remplacer par astérisque (*) les espaces normaux qui ont été         
//                                    posés après les espaces erronés qui suivent le "E".         

main ()         
{         
    char chaine1[70] = "PE TIT PIE RRE  POSSE DE  UN CANARD DE  COULE UR BLANCHE";         
    char chaine2[70]={0};         
    int i = 0, j = 0, longueur; // L'initialisation des variables         

    longueur = strlen(chaine1); // affectation de la variable "longueur" par la longueur de la chaîne         


    while (i <= (longueur-1)) // tant qu'on n'est pas à la fin de la chaîne1         
    {         
        if (chaine1[i] == ' ' && chaine1[i-1] == 'E')        
 // si en rencontre un espace et que le caractère qui le précède est un "E"     
        {         
                chaine2[j] = chaine1[i+1];         
                i = i + 1;         
        }         


        else         
              {         
                  if (chaine1[i]==' ' && chaine1[i+1]== ' ')         
                  {         
                      chaine2[j]=='*';         
                      i=i+1;         
                      j=j+1;         
                  }         

                  else         
                  {         

                    chaine2[j] = chaine1[i];         
                    i = i + 1;         
                    j = j + 1;         
                  }         
              }         

    }         

    chaine2[j] = 0;     // le zéro terminal    

    puts (chaine2);     // on affiche la chaine2    

system("PAUSE");         
return(0);         

}       



Et voici un screenshot du résultat final:
<img src="http://img203.imageshack.us/img203/9219/exercice.png" alt="Image Hosted by ImageShack.us"/><br/>By <a target="_new" href="https://imageshack.com/user/null">null</a> at 2011-03-08


1 réponse

Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
10 mars 2011 à 07:35
Bonjour,

le while (i <= (longueur-1)) ce qui vous force à faire un -1 c'est parce que vous utilisez "<=", utilisez simplement (i<longueur). Vous allez vous perdre avec toutes les conditions aidez vous des positions, j'ai du mal à expliquer testez ça :

/* for(initialisations;tests;incrementations) */
    for(i=j=0;i<longueur;i++,j++)
      {
/* passe un char si mauvais espace */
        if(chaine1[i]==' '&&chaine1[i-1]=='E')i++;
/* si deux espaces */
        if(chaine1[i]==' '&&chaine1[i-1]==' ')
          {
/* le premier est ok */
            chaine2[j]=' ';
/* remplace le second */
            chaine2[j+1]='*';
/* incremente alors j de 2, et i de 1 */
            j+=2; i++;
          }
/* copie des caracteres de la chaine */
        chaine2[j]=chaine1[i];
      }
0
solomon83 Messages postés 17 Date d'inscription lundi 25 juin 2007 Statut Membre Dernière intervention 29 juin 2012 2
15 mars 2011 à 21:31
Bonjour. Oui effectivement ton code marche très bien. Mais à vrai dire je n'ai pas compris "comment ça marche". Il y a quelque chose qui m'échappe. Tu n'aurais pas un quart d'heure un jour pour m'expliquer tout ça sur skype (ou autre) par hasard? Je te remercie pour ton aide.
0