Passage d'un programme de C++ à C

Résolu
etienne.raoul Messages postés 10 Statut Membre -  
Nabla's Messages postés 18201 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
ayant changé de classe récemment, j'ai peu de bases en informatiques (le peu concerne le langage C). Mon nouveau professeur m'a demandé de passer l'algorithme suivant du langage C++ au langage C. Je comprends quelques bases (comme cout<< qui remplace printf) mais l'ensemble reste incompréhensible. Pourriez-vous m'aider s'il vous plait?

L'algorithme qu'il nous a donné est le suivant :

#include <iostream>
using namespace std;
#include <cstring>

void mot(char t[20])
{
int x,i=0, j=1;
char a;

do {
x=0;
for(i=0; i<strlen(t)-1; i++)
if(t[i] > t[i+1])
{
a=t[i]; t[i]=t[i+1]; t[i+1]=a;
x++;
}
} while(x!=0);
}

int main()
{
char t1[20], t2[20];

cout<<"Tapez le premier mot : "; cin >> t1;
cout<<" "<<endl;
cout<<"Tapez le second mot : "; cin>>t2;
cout<<" "<<endl;
mot(t1);
mot(t2);

if (strcmp(t1,t2)==0) cout<<"Ces 2 mots sont des anagrammes."<<endl;
else cout<<"Ces 2 mots ne sont pas des anagrammes."<<endl;
cout<<" "<<endl;
system("PAUSE");
return 0;
}

11 réponses

  1. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    C'est un algorithme de tri "mot()". Le problème ne doit pas venir du C++, car le code est très proche du C, à par cin et cout. cin, c'est l'équivalent de scanf.
    endl, c'est entre autre un retour à la ligne.
    0
  2. etienne.raoul Messages postés 10 Statut Membre 1
     
    Pour "cout" et "cin" j'avais compris le problème se situe sur trois parties du programme dont je ne trouves pas l'équivalent en C. :

    "void mot(char t[20])
    {
    int x,i=0, j=1;
    char a;
    do {
    x=0;
    for(i=0; i<strlen(t)-1; i++)
    if(t[i] > t[i+1])
    {
    a=t[i]; t[i]=t[i+1]; t[i+1]=a;
    x++;
    }
    } while(x!=0);
    } "

    "char t1[20], t2[20]; "

    et

    "mot(t1);
    mot(t2); "
    0
  3. Nabla's Messages postés 18201 Date d'inscription   Statut Contributeur Dernière intervention   3 228
     
    #include <iostream>
    using namespace std;
    #include <cstring>

    ca c'est à remplacer par une déclaration C des fichiers stdio.h et string.h

    ainsi que les cin et cout à remplacer par des printf et scanf ...
    0
  4. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    pour moi, ça s'écrit pareil en C...
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. etienne.raoul Messages postés 10 Statut Membre 1
     
    le problème est que je ne comprends pas le raisonnement. De plus, à quoi correspond strcmp(t1,t2)? est-ce que ça existe en C?
    enfin au début, est-ce que "void mot" correspond à l'initialisation d'une fonction appelée mot?
    0
  7. Nabla's Messages postés 18201 Date d'inscription   Statut Contributeur Dernière intervention   3 228
     
    strcmp compare 2 chaines de caractères. ca renvoie 0 si les chaines sont égales. c'est uien fonction définie dans string.h

    void mot(..){ } correspond bien à la déclaration d 'une fonction.
    0
  8. etienne.raoul Messages postés 10 Statut Membre 1
     
    J'ai compris la deuxième partie du programme, c'est à dire la fonction principale. Est-ce que quelqu'un pourrais me détailler le principe de fonctionnement de la fonction "mot"?
    0
  9. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    Je vois la souci : grosse lacunes en C. Le mieux est de prendre un cours de C et de la potasser, plein de chose deviendrons clairs après.
    pour les fonctions C, il y a les "man" pages, exemple strcmp : http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/strcmp.3.html
    Comme je te l'ai dit, "mot" est une fonction de tri.
    0
  10. etienne.raoul Messages postés 10 Statut Membre 1
     
    Effectivement je ne suis qu'un débutant...
    Par rapport à ce que j'ai compris, pour la fonction "mot":
    - x serait le nombre d'apparition de chaque lettre
    - "mot" réorganiserait les lettres selon l'ordre alphabétique (???)

    je ne vois pas à quoi correspond "if(t[i] > t[i+1])"... t[i] est bien la lettre du mot t à l'emplacement i?
    0
  11. Nabla's Messages postés 18201 Date d'inscription   Statut Contributeur Dernière intervention   3 228
     
    SVP vous deux, évites de mettre toute votre discution en haut ...

    Effectivement je ne suis qu'un débutant...
    Par rapport à ce que j'ai compris, pour la fonction "mot":
    - x serait le nombre d'apparition de chaque lettre
    - "mot" réorganiserait les lettres selon l'ordre alphabétique (???)
    
    je ne vois pas à quoi correspond "if(t[i] > t[i+1])"... t[i] est bien la lettre du mot t à l'emplacement i?

    t[i] > t[i+1] => on teste si la lettre a l'emplacement i est supérieur (sa valeur ascii) à celle qui est situé à i+1 .

    voici une belle table ascii pour les valeurs:
    http://www.morbleu.com/wp-content/uploads/2009/08/ascii.gif
    0
    1. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      En effet, je n'avais pas vu tes intervention. Décidemment, je ne suis pas fan de la nouvelle disposition de ccm sur les messages...
      0
    2. Nabla's Messages postés 18201 Date d'inscription   Statut Contributeur Dernière intervention   3 228
       
      je crois que les modos ont une fonction "faire de ce commentaire uen réponse" ...
      0
  12. etienne.raoul Messages postés 10 Statut Membre 1
     
    je viens de faire un essai en C et ça me donne ça :

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <conio.h>
    int mot (char t[20])
    { int x, i=0;
    char a;
    do {x=0;
    for(i=0;i<strlen(t)-1;i++)
    if(t[i]>t[i+1])
    {a=t[i]; t[i]=t[i+1]; t[i+1]=a; x++;}
    }
    while(x!=0);
    }
    int main()
    { char t1[20], t2[20];
    printf("Tapez le premier mot : ");
    scanf("%s",&t1);
    printf("\nTapez le second mot : ");
    scanf("%s",&t2);
    mot(t1);
    mot(t2);
    if (strcmp(t1,t2)==0) {printf("\nCes deux mots sont des anagrammes ");}
    else {printf("\nCes 2 mots ne sont pas des anagrammes ");}
    getch();
    }
    0