Fonction et procedure

Fonction et procedure - C++ - Programmation

Marsh Posté le 04-11-2015 à 15:13:16    

Bonjour,  
 
J'ai un problème sur un exercice, voici les consignes :
 
Les procédures et fonctions qui seront écrites dans cet exercice devront être compilées séparément.
Votre projet devra donc comporter un fichier "main. cpp il dans lequel on trouvera la fonction
main, un fichier "fonctions.h" dans lequel se trouveront les déclarations de toutes les fonctions que
l'on vous demande d'écrire, et un fichier "fonctions.cpp" dans lequel se trouvera le corps de ces
fonctions
o Ecrire une procédure permettant la saisie d’une chaine.
o Ecrire une fonction permettant de déterminer la longueur d'une chaine.
Elle calculera et retournera la longueur de la chaîne de caractères.
o Ecrire une procédure permettant de convertir tous les caractères Majuscule d’une chaine en
minuscule.
o Ecrire une fonction permettant de rechercher un caractère dans une chaine
Si le caractère donné est trouvé, la fonction retournera son adresse dans la chaine ; sinon elle
retournera le pointeur NULL.  
 
Ecrire une procédure qui permette de remplacer tous les caractères égaux à un caractère donné,
par un autre caractère donné. Par exemple le remplacement des ‘e’ par ‘o’ dans la chaine
« telephone » donnera la chaine « tolophono
o Ecrire une procédure qui permette d’éliminer tous les caractères égaux à un caractère donné, par
un autre caractère donné. Par exemple l’élimination des ‘e’ dans la chaine « telephone » donnera
la chaine « tlphon ».
o Ecrire un programme permettant de tester chacune de ces procédures et fonctions
 
 
 
Voici mon header :
 

Code :
  1. typedef char chaine[100];
  2. int LongueurChaine(char *);
  3. char *RechercheCaractere(char *);
  4. void SaisieChaine(char *);
  5. void Convertion(char *);
  6. void ChangementCaractere(char *);
  7. void SuppresionCaractere(char *);


 
mon cpp avec les fonctions et procédure :

Code :
  1. #include <iostream>
  2. #include <conio.h>
  3. using namespace std;
  4. void SaisieChaine(char *chaine)  //Première procédure pour l'insertion de la chaine de caractère
  5. {
  6. cout << "Inserez votre chaine de caractere puis appuyez sur ENTRER" << endl;
  7. cin >> chaine;
  8. _getch();
  9. system("cls" );
  10. }
  11. int LongueurChaine(char *chaine)
  12. {
  13. int longueur = 0;
  14. longueur = strlen(chaine);    // strlen permet de compter le nombre de caractère présente dans une chaine
  15. return longueur;
  16. }
  17. void Convertion(char *chaine)
  18. {
  19. for (int i = 0; i < strlen(chaine); i++)
  20. {
  21.  if (chaine[i] >= 'A' && chaine[i] <= 'Z')
  22.  {
  23.   chaine[i] = chaine[i] - 'A' + 'a';
  24.  }
  25. }
  26. cout << "la nouvelle chaine est :\n";
  27. for (int i = 0; i < strlen(chaine); i++)
  28. {
  29.  cout << chaine[i];
  30. }
  31. }
  32. char *RechercheCaractere(char *chaine)
  33. {
  34. char choix;
  35. cout << "\nQuel Caractere cherchez vous \n";
  36. cin >> choix;
  37. int i = 0;
  38. while (choix != chaine[i] && chaine[i])
  39. {
  40.  i++;
  41. }
  42. if (!chaine[i])
  43. {
  44.  return NULL;
  45. }
  46. else
  47. {
  48.  return chaine + i;
  49. }
  50. }
  51. void ChangementCaractere(char * chaine)
  52. {
  53. char base;
  54. char nouvelle;
  55. cout << "\n Quelle lettre voulez vous remplacer :\n";
  56. cin >> base;
  57. cout << "\n Par quelle lettre voulez vous la remplacer : \n";
  58. cin >> nouvelle;
  59. for (int i = 0; i < strlen(chaine); i++)
  60. {
  61.  if (chaine[i] == base)
  62.  {
  63.   chaine[i] = nouvelle;
  64.  }
  65. }
  66. cout << "Votre nouvelle chaine est :\n";
  67. for (int i = 0; i < strlen(chaine); i++)
  68. {
  69.  cout << chaine[i];
  70. }
  71. }
  72. void SuppresionCharactere(char *chaine)
  73. {
  74. char suppression;
  75. cout << "\n Quelle lettre voulez vous supprimer? :\n";
  76. cin >> suppression;
  77. for (int i = 0; i < strlen(chaine); i++)
  78. {
  79.  if (chaine[i] == suppression)
  80.  {
  81.   for (int j = i; j <= strlen(chaine); j++)
  82.   {
  83.    chaine[j] = chaine[j + 1];
  84.   }
  85.  }
  86. }
  87. cout << "Voici votre nouvelle phrase :\n";
  88. for (int i = 0; i < strlen(chaine); i++)
  89. {
  90.  cout << chaine[i];
  91. }
  92. }


 
 
et enfin mon cpp main :

Code :
  1. #include <iostream>
  2. #include <conio.h>
  3. #include "fonction.h"
  4. using namespace std;
  5. void main()
  6. {
  7. const int Cmax = 100;
  8. int choix;
  9. chaine a, b, c, d, e, f;
  10. SaisieChaine(a); // procédure saisie de la chaine de caractère
  11. for (int i = 0; i <= Cmax; i++)
  12. {
  13.  b[i] = a[i];
  14.  c[i] = a[i];
  15.  d[i] = a[i];
  16.  e[i] = a[i];
  17.  f[i] = a[i];
  18. }
  19. cout << "***************************************************************************" << endl;
  20. cout << "* Choisissez ce que vous voulez faire parmis les propositions suivantes   *" << endl;
  21. cout << "*               1. Calculer la longueur de la chaine.                     *" << endl;
  22. cout << "*       2. Convertir les majuscules de votre phrase en minuscule.         *" << endl;
  23. cout << "*           3. Rechercher un caractere dans votre chaine.                 *" << endl;
  24. cout << "*       4. Effectuer un changement de caractere dans votre phrase.        *" << endl;
  25. cout << "*      5. Effectuer une suppression de caractere dans votre phrase.       *" << endl;
  26. cout << "***************************************************************************" << endl;
  27. cin >> choix;
  28. switch (choix)
  29. {
  30. case 1: cout << "la taille de la chaine est : " << LongueurChaine(b) << endl; // Fonction Longueur de la chaine
  31.  break;
  32. case 2: Convertion(c); // Convertion Majuscule --> Minuscule
  33.  break;
  34. case 3: cout << "l'adresse du caractere voulus dans la chaine est : " << RechercheCaractere(d); // Fonction Recherche de caractère
  35.  break;
  36. case 4: ChangementCaractere(e);
  37.  break;
  38. case 5: SuppresionCaractere(f);
  39.  break;
  40. default: cout << " Vous n'avez pas choisit une option du tableau, au revoir." << endl;
  41. }
  42. _getch();
  43. }


 
Sa mafiche deux erreurs que je ne comprend pas, Quelqu'un voit le probleme svp?
 
Cordialement

Reply

Marsh Posté le 04-11-2015 à 15:13:16   

Reply

Marsh Posté le 04-11-2015 à 15:52:47    

Déjà: mise en page du code à revoir...

 
sylargh a écrit :


Sa mafiche deux erreurs que je ne comprend pas, Quelqu'un voit le probleme svp?
Cordialement


Ca serait bien de nous dire quelles erreurs...

 

Bon, MinGW me dit

Citation :


fonctions.cpp|11|error: 'system' was not declared in this scope|
fonctions.cpp|16|error: 'strlen' was not declared in this scope|


D'après internet faut rajouter

Code :
  1. #include <cstdlib>
  2. #include <cstring>


dans fonctions.cpp, ce qui résout le problème. Entre parenthèses, le system() c'est probablement pas très élégant, il n'y a pas mieux en C++? (Je connais juste le C.)

 

Après il y a une faute de frappe #include "fonction.h" il manque un 's' et une autre erreur facile à corriger:

Citation :

main.cpp|5|error: '::main' must return 'int'|

 

et puis

Citation :

main.o:main.cpp: (.text.startup+0x1b8)||undefined reference to `SuppresionCaractere(char*)'|


problème de nom dans fonctions.cpp: SuppresionCharactere vs SuppresionCaractere

 

Restent les warnings (si il y en a pas faut indiquer -Wall au GCC/MinGW!):

Citation :

fonctions.cpp|21|warning: comparison between signed and unsigned integer expressions [-Wsign-compare]|

à de nombreuses reprises, "unsigned" résout le problème.

 

et puis

Citation :

main.cpp|13|warning: array subscript is above array bounds [-Warray-bounds]|

à plusieurs reprises. Ca c'est plus grave et effectivement le programme plante rapidement. Je te laisse vérifier ton code/algo.

 

edit: D'ailleurs, si c'est du C++, il y a plus élégant/pratique que des array of char il me semble, mais bon, je ne sais pas ce que veut le prof...


Message édité par rat de combat le 04-11-2015 à 15:56:16
Reply

Marsh Posté le 04-11-2015 à 16:25:43    

Quelque remarques en vrac...
 
Dans convertion() (qui d'ailleurs s'écrit conversion en français...):

Code :
  1. cout << "la nouvelle chaine est :\n";
  2.     for (unsigned int i = 0; i < strlen(chaine); i++)
  3.     {
  4.         cout << chaine[i];
  5.     }


 :ouch:  

Code :
  1. cout << "la nouvelle chaine est :"<<chaine<<"\n";


idem dans ChangementCaractere() et SuppresionCaractere()...
 
RechercheCaractere():

Code :
  1. {
  2.     char choix;
  3.     cout << "\nQuel Caractere cherchez vous \n";
  4.     cin >> choix;
  5.     unsigned int i = 0;
  6.     while (choix != chaine[i] && chaine[i])
  7.     {
  8.         i++;
  9.     }


Danger: Si le caractère cherché n'est pas dans la chaîne au dernier tour de la boucle on dépasse les bornes de la chaîne de caractère (out of bound). Il faut d'abord vérifier si la chaîne n'est pas terminée et ensuite faire la comparaison pour voir si on a trouvé le caractère demandé.
 
main():

Code :
  1. cout << "l'adresse du caractere voulus dans la chaine est : "<< RechercheCaractere(d);


n'affiche pas une adresse comme demandé. Je ne parle pas C++, je ne sais donc pas comment faire avec cout.
 
Pour le warning dont je parlais, ta boucle for() (toujours dans main) est fausse et inutile, si a chaque exécution du programme on ne peut choisir qu'une seule opération il est inutile de sauvegarder / faire des copies de la chaîne initiale (ce qui en plus peut se faire de manière plus élégante qu'une boucle).
 
Ah oui, je pense que par "déterminer la longueur d'une chaine" le prof entends autre chose qu'un appel de strlen() non?
 
Et perso je virerais les system("cls" ) et les _getch().

Reply

Marsh Posté le 04-11-2015 à 22:35:41    

Le problème de ton exercice, c'est que soit tu fais du C, ou les chaines sont des suites de caractères accédées par pointeur char *, soit tu fais du C++ moderne, ou tu utilises le type standard string et tu as la librairie standard.
Mais il faut surtout pas mélanger les deux.
 
Typiquement, en C++ (11), on ferait un truc du genre

Code :
  1. #include <algorithm>
  2. #include <cctype>
  3. #include <iostream>
  4. #include <string>
  5. void get_input(std::string& s) {
  6.     std::cout << "Taper une phrase : " << std::flush;
  7.     std::getline(std::cin, s);
  8. }
  9. size_t get_length(std::string& s) {
  10.     return s.size();
  11. }
  12. void upcase(std::string& s) {
  13.     std::transform(s.begin(), s.end(), s.begin(), ::toupper);
  14. }
  15. char *find_char(std::string& s, char c) {
  16.     size_t pos = s.find(c);
  17.     return (pos ==  std::string::npos)?NULL:&s[pos];
  18. }
  19. void replace_char(std::string& s, char from, char to) {
  20.     std::replace_if(s.begin(), s.end(), [from](char c) {return (c == from);}, to);
  21. }
  22. void remove_char(std::string& s, char from) {
  23.     std::string::iterator nend = std::remove_if(s.begin(), s.end(), [from](char c) {return (c == from);});
  24.     s.resize(nend - s.begin());
  25. }
  26. int main() {
  27.     std::string input;
  28.     get_input(input);
  29.     std::string test = input;
  30.     std::cout << "Phrase entree: " << test << std::endl;
  31.     std::cout << "Nombre de caracteres: " << get_length(test) << std::endl;
  32.     upcase(test);
  33.     std::cout << "En majuscules: " << test << std::endl;
  34.     test = input;
  35.     std::cout << "Saisir un caractere a chercher: " << std::flush;
  36.     std::string s;
  37.     std::cin >> s;
  38.     char c = *s.begin();
  39.     char *epos = find_char(test, c);
  40.     if (epos == NULL) {
  41.         std::cout << "Pas de caractere " << c << " dans la phrase" << std::endl;
  42.     }
  43.     else {
  44.         std::cout << "Le caractere " << c << " est a la position " << (epos - &test[0] + 1) << " dans la phrase" << std::endl;
  45.         std::cout << "et son adresse est: " << std::hex << std::showbase << ((int)epos) << std::endl;
  46.     }
  47.     replace_char(test, c, '$');
  48.     std::cout << "Remplacement de " << c << " par $: " << test << std::endl;
  49.     test = input;
  50.     remove_char(test, c);
  51.     std::cout << "Suppression de " << c << " : " << test << std::endl;
  52.     return 0;
  53. }


l'intérêt de la chose, c'est que par construction, c'est bien plus blindé contre les erreurs que la même chose écrite en C.
 
Bon, évidemment, si tu as un prof qui a pas compris que le C++ c'est pas du C, et qui attends que tu réécrives a la main un parcours de chaine de caractère un a un pour comparer avec un caractère recherché, ça sera instructif pour apprendre le C (quoique tu aies strchr en standard), mais pas vraiment pour apprendre le C++.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 07-11-2015 à 11:32:10    

Bonjour merci de vos réponses, le programme marche apres avoir enlever la faute "H" a Caractere, merci :)  
Oui mon prof date un peu, ( dans les 60 ans ), avec mes camarades
nous connaissons deja String mais ils refusent de nous le faire utiliser pour le moment... & pour les pointeurs et reference je suis encore en train d'apprendre, je me suis pas beaucoup exercé ^^, par exemple mon probleme de renvoie d'adresse qui ne fonctionne pas, je ne sais pas trop comment faire pour le moment.
Merci de l'aide apporter rapidement sur ce Forum :) :hello:

Reply

Marsh Posté le 08-11-2015 à 13:14:45    

> nous connaissons deja String mais ils refusent de nous le faire utiliser pour le moment
Ce qui le disqualifie d'emblée pour enseigner le C++ (les char * ça doit être vu après les strings, pas avant, en C++).
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 11-11-2015 à 22:20:33    

sylargh a écrit :

Bonjour merci de vos réponses, le programme marche apres avoir enlever la faute "H" a Caractere, merci :)


J'espère que tu as aussi pris en compte les autres remarques/warnings. :ouch:  
 

Citation :

Bon, évidemment, si tu as un prof qui a pas compris que le C++ c'est pas du C, et qui attends que tu réécrives a la main un parcours de chaine de caractère un a un pour comparer avec un caractère recherché, ça sera instructif pour apprendre le C (quoique tu aies strchr en standard), mais pas vraiment pour apprendre le C++.


J'ai l'impression qu'il y a pas mal de profs qui pensent qu'il suffit de faire s/printf/cout/g (idem cin) pour transformer du C en C++, parce que "C++" ça doit faire mieux que "C" sur les présentations de la formation et le CV des étudiants. :o

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed