Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
956 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Fonction et procedure

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Fonction et procedure

n°2269072
sylargh
Posté le 04-11-2015 à 15:13:16  profilanswer
 

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

mood
Publicité
Posté le 04-11-2015 à 15:13:16  profilanswer
 

n°2269076
rat de com​bat
attention rongeur méchant!
Posté le 04-11-2015 à 15:52:47  profilanswer
 

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
n°2269078
rat de com​bat
attention rongeur méchant!
Posté le 04-11-2015 à 16:25:43  profilanswer
 

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().

n°2269092
gilou
Modérateur
Modzilla
Posté le 04-11-2015 à 22:35:41  profilanswer
 

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é!  --
n°2269223
sylargh
Posté le 07-11-2015 à 11:32:10  profilanswer
 

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:

n°2269280
gilou
Modérateur
Modzilla
Posté le 08-11-2015 à 13:14:45  profilanswer
 

> 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é!  --
n°2269515
rat de com​bat
attention rongeur méchant!
Posté le 11-11-2015 à 22:20:33  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Fonction et procedure

 

Sujets relatifs
Menu externe avec fonction include et class:activeMenu externe avec fonction include et class:active
appel d'une fonction hors procédure principale dans visual basicAppeler une procédure depuis une fonction !
Procédure Sub OK mais pas Fonctionada différence fonction, procédure
[pascal] difference entre une procedure et une fonction ??Paramètres optionnels dans une fonction/procédure
SQLServer : procedure stockée ou fonctionDifference entre une procedure et une fonction ??
Plus de sujets relatifs à : Fonction et procedure


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR