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 :

besoin d'aide pour un programme en c++


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2009
    Messages : 4
    Par défaut besoin d'aide pour un programme en c++
    Bonjour , jai un programme en c++ à faire . Je suis debutante.
    cela devrais me retourner un tableau ayant les valeurs 0,8,31 (soit l'endroit ou le mot bon se retrouve dans la phrase) et se terminer par -1 (valeur supplementaire obligatoire) Je peux seulement utiliser strcpy, strlen, strcmp et strcat. Quelles modifications dois-je apporter à ma fonction indexe pour que cela fonctionne svp? je dois remettre ceci dans moins de 24 h . Merci de m'aider
    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
    int main(){
    char texte[]="bonjour bonsoir cava tres bien bon bye";
    char mot[]="bon";
    int *tab = indexe(texte,mot);
     
     
    }
     
    int *indexe(char *s1, char *s2){
        int i=0;
        int j=0;
        int n;
        n = strlen(s1);
        char *texte;
        s1=texte;
        char *mot;
        s2=mot;
     
        int* tabposition = (int *) malloc(strlen(s1)*sizeof(int)); 
        while(s1[i]!='\0'  && i<=n ){
     
    	if (i==n){ 
                     tabposition[j]=-1;
            }else{
     
            if (strncmp(s1,s2,3)){
            i++
     
    	}else{
     //=0
                tabposition[j]=i;
                j++;
    	    i++	
     
    	}
    	return tabposition;
       }
    }

  2. #2
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 184
    Par défaut
    Bonjour,
    Quelques commentaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	int n;
    	n = strlen(s1);
    ** Tu peux mettre les deux lignes précédentes en une seule pour plus de concision (et de clarté), les séparer n'est utile que si tu veux séparer les déclarations du reste du code, ce qui n'est apparemment pas le cas ici.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	char *texte;
    	s1 = texte;
    	char *mot;
    	s2 = mot;
    ** Les variables texte et mot sont inutiles ici, tu ne t'en sers pas par la suite. Il vaut mieux nommer explicitement s1 et s2, ça permettra d'auto-documenter la fonction et d'avoir un code plus clair.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	int *tabposition = (int *)malloc(strlen(s1) * sizeof(int));
    ** Normalement il faut toujours tester le retour de malloc au cas où ...

    ** Plusieurs choses ici :
    * Tu compares toujours les mêmes chaines, quelles que soient les valeurs de i et de j, le résultat du test est donc toujours le même.
    * De plus pourquoi le strncmp ? et pourquoi le 3 ? Tu voulais certainement utiliser la longueur du mot recherché ("bon" dans ton exemple) mais alors il vaut certainement mieux utiliser strlen(s2).
    * Enfin il faut que les tests soient le plus explicite possible, ici il vaut mieux écrire :
    if (strncmp(...) != 0)
    Utiliser le fait qu'un entier non nul soit vrai est à utiliser de préférence quand le nom de l'entier (ou de la fonction le renvoyant) est explicite exemple :
    if (estPositif(x)) { /* Faire quelque chose */ }

    ** Dès que i est différent de n, la fonction retourne, donc dès le premier tour de boucle, si la chaîne est de longueur non nulle.

    ** Il manque une accolade.
    ** Pas de libération (free()) du tableau alloué dynamiquement.
    ** Il ne faut pas hésiter à utiliser l'arithmétique des pointeurs exemple si texte = "bonjour bonsoir cava tres bien bon bye"
    alors texte + 1 = "onjour bonsoir cava tres bien bon bye"
    de plus les chaînes de caractères sont des tableaux de chars terminés par '\0' donc peut faire les choses suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char texte[] = "bonjour bonsoir cava tres bien bon bye";
    char c = texte[4];
    texte[4] = '\0';
    // ici texte contient la chaîne "bonj"
    texte[4] = c;
    // ici la texte contient à nouveau la chaîne "bonjour bonsoir cava tres bien bon bye"
    Je pense t'avoir donné des éléments pour t'en sortir, n'hésite pas si quelque chose n'est pas clair.

  3. #3
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par huit_six Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	int *tabposition = (int *)malloc(strlen(s1) * sizeof(int));
    ** Normalement il faut toujours tester le retour de malloc au cas où ...
    - Il faudrait aussi enlever le cast
    - Mettre sizeof (*tabposition) à la place de sizeof (int)

    Jc

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2009
    Messages : 4
    Par défaut
    Merci huit_six ,
    j'ai essayer de modifier ma boucle, sans succès, le tableau retourner me donne toujours 0.

    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
    include <iostream>
    #include <string.h>
    using namespace std;
     
    int *indexe(char * , char *);
     
    int main(){
    char texte[]="bonjour bonsoir cava tres bien bon bye";
    char mot[]="bon";
    int *tab = indexe(texte,mot);
    cout << *tab<< endl;
     
    }
     
    int *indexe(char *s1, char *s2){
        int i,j;
        int n,q;
        n = strlen(s1);
        q = strlen(s2);
     
     
        int* tabposition = (int *) malloc(strlen(s1)*sizeof(int)); 
        for(j=0, i=0 ; s1[i]!='\0'  && i<=n ;i++){
     
     
            if (strncmp(s1,s2,strlen(s2)))!=0{  
     
                s1=s1+1;
     
     
            }else{
                tabposition[j]=i;
                j++;
                s1=s1+1;
     
    	}
     	if (i!=n){ 
     
                }else{
    		tabposition[j]=-1;  
            }  
     
         }
    return tabposition;	
       }

    Pour ce qui est du free(), je ne sais trop comment ca marche.
    et if (strncmp(s1,s2,strlen(s2)))!=0{ me renvoie comme erreur à la compilation :
    programme3.cpp:26: erreur: expected primary-expression before ?!=? token
    programme3.cpp:26: erreur: expected `;' before ?{? token

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2009
    Messages : 4
    Par défaut
    oups pour le if, je lai mal fait , erreur stupide mais bon , ca me retourne toujours 0

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 26
    Par défaut
    La fonction retourne un tableau de 'int' mais tu affiche seulement son premier élément malgré qu'elle marche presque bien. 'indexe' doit retourner aussi le nombre d'endroits ou le mot cherché se trouve et il faut que tu l'utilise pour boucler et afficher tous les valeurs. Pour vérifier ça, change l'affichage à

    cout << tab[1] << endl;

    Si tu ne veux pas retourner le nombre des indexes, met -1 dans tous les éléments de tabposition juste après sa déclaration et vérifie cette condition quand tu l'affiche.

    Aussi, la boucle que tu utilise ne marche pas bien, efface ' s1[i]!='\0' ' et change la condition à ' i<=n - q ' - ça suffira pour trouver tous les endroits que tu cherche.

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    hormis l'utilisation du std::cout, ce code n'est qu'un problème de C. C'est pourquoi la discussion a été déplacée ici.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2009
    Messages : 4
    Par défaut
    Citation Envoyé par AndreiS Voir le message
    cout << tab[1] << endl;

    Si tu ne veux pas retourner le nombre des indexes, met -1 dans tous les éléments de tabposition juste après sa déclaration et vérifie cette condition quand tu l'affiche.

    Aussi, la boucle que tu utilise ne marche pas bien, efface ' s1[i]!='\0' ' et change la condition à ' i<=n - q ' - ça suffira pour trouver tous les endroits que tu cherche.
    Merci AndreiS, cela semble si évident, je ne comprend pas pourquoi je n'y ai pas pensé avant !

Discussions similaires

  1. Besoin d'aide pour un programme de PGCD
    Par Shapsed dans le forum C
    Réponses: 4
    Dernier message: 23/09/2007, 15h06
  2. besoin d'aide pour mon programme
    Par pouyoudu17 dans le forum Débuter avec Java
    Réponses: 11
    Dernier message: 28/05/2007, 22h18
  3. Réponses: 4
    Dernier message: 24/04/2007, 10h18
  4. [débutant] besoin d'aide pour un programme
    Par acdchornet dans le forum C++
    Réponses: 12
    Dernier message: 26/10/2006, 22h32
  5. [Free Pascal] Besoin d'aide pour un programme
    Par ricomix dans le forum Free Pascal
    Réponses: 3
    Dernier message: 04/06/2006, 17h01

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