Bon on rigole pas ... faire une fonction en c++ ... j'y arrive pas

j’ai un exo en c++ où je doit faire une procedure, ça j’y arrive, et une fonction et la … je galére … si quelqu’un pouvais m’expliquer de façon relativement simple, je lui en serai éternellement reconaissant.

oui je sais, j’ai pas encore cherché, mais j’y vais de ce pas

Hello,

Ta question n’est pas très claire! Elle doit faire quoi ta fonction? Qu’as-tu fait comme procédure?

Comme tu débutes ça devrait largement te suffire, ça pose les bases quoi. Mais il doit exister bien mieux en cherchant un peu sur Google .

http://coaching.epfl.ch/php/download/languageC.pdf

je m’en doutais que c’était pas trés claire, ca fait 15 jours que je fais du c++

bon en gros je doit faire un programme, avec une procedure qui me demande mon nom, prénom, année de naissance

ensuite une fonction qui vas calculer mon age à partir de l’année en cours

et enfin une autre procedure qui vas me sortir tout ça dans un fichier pret à imprimer

je suis loin d’être un spécialiste en C++ mais ton programme devrait ressembler à quelque chose comme ça:

// Définition de la classe

class CPersonalData
{
public:
// la procédure qui te demande l’entrée au clavier
// de tes données personnelles (les profs aiment 
// les noms en anglais) va savoir pourquoi.
 void GetData(void);

 // La fonction qui calcule ton age
 void ComputeAge(int actual_year);

// La procédure qui sauve dans le fichier
void SaveData(void);

private:
char first_name[30];
char last_name[30];
 int  birth_year;
int  age;
};

void CPersonalData::GetData(void)
{
// ici tu mets la procédure que tu as faite
// elle doit sauver les entrées clavier dans
// les variables privées de la classe
}

void CPersonalData::ComputeAge(int actual_year)
{
age = actual_year - birth_year;
}

void CPersonalData::SaveData(void)
{
// là tu mets ta procédure qui sauve dans le fichier
// les variables privées de la classe
}

// la fonction main
void main(void)
{
CPersonalData my_data;

my_data.GetData();
my_data.ComputeAge(2003);
my_data.SaveData();
}

Voilà c’est une possibilité, mais ce n’est sans doute pas la meilleure.
Si tu n’appelle pas ComputeAge() tu vas sauver une fausse valeure de l’age dans le fichier! Une solution serait d’initialiser par défaut la variable age à une valeure négative et avant d’appeler SaveData() tu contrôles le signe de age pour savoir si ComputeAge() a bien été appelée sinon tu renvoies une erreur.

Tu peux aussi définir la fonction ComputeAge() en tant que private et tu l’appelles automatiquement dans le corps de la fonction GetData() juste après avoir lu les données au clavier. En procédant ainsi tu as la possibilité d’avoir accès à l’âge juste directement après avoir lu les valeurs au clavier.

Si tu n’as besoin de l’âge que pour la sauvegarde dans le fichier texte alors tu définis ComputeAge() comme étant de type int et non de type void, elle devrait ressembler à ça:

int CPersonalData::ComputeAge(int actual_year) {  return actual_year - birth_year; } [/quote]Ensuite tu n'utilises plus la variable age, et quand tu écris dans le fichier tu remplaces age par ComputeAge(2003) et la fonction s'executera aussitôt et retournera l'âge sans passer par la variable age.

Le problème avec ces deux dernières méthodes c’est que tu dois passer l’année courante à la fonction ComputeAge() depuis la fonction main(). Tu peux passer en paramètre l’année courante à la fonction GetData() ou à la fonction SaveData() qui la feront ensuite passer à ComputeAge().

On voit avec ce simple exemple qu’il existe mille et une manières différentes de faire la même chose en programmation!

J’espère que je t’ai un peu éclairé! (je n’ai pas testé le code, y a peut-être des fautes de frappes)

Amuses toi bien!

merci je regarderai ça plus longuement demain, avec la tête “fraiche”

A mon avis tu fait trop compliqué zoomastétistimisque! (comme ton nom d’ailleurs) (mission cléopatre vanne inside)

Lui je pense qu’il veut une fonction toute bete qui lui demande sont age du style:

int GetData(void) {   int age = 0;   printf("Veuillez entrer votre age: ");   scanf("%d", age);   return age; }

void main (char ** argv, int argc)
{
  int valeur = 0;
  valeur = GetData();

  printf (“Votre age est de %d
”,valeur);
}

[/quote]etc… mais bon je peux me tromper c pas tres clair ce qu’il demande, mais vu la date (septembre) et sachant qu’il bite que dalle en C, je suppose qu’il doit etre a sa premiere année d’info et donc on va pas faire trop compliqué.

Tu as peut-être raison [PERE]Cil (mon pseudo au moin il a pas besoin de Alt gr pour être tapé…) mais il parle de C++ alors je lui fait du C++! De plus il dit qu’il doit calculer son age en fonction de l’année actuelle passée en paramètre.

Au moins il aura deux versions et il prendra celle dont qu’il a besoin!

Note que dans ton code il y a une petite erreur: tu dois faire scanf("%d", &age); sinon ça marche pas!

Hiih oui tu as raison pour le scanf (mais je suis un peu rouillé en C)… faut lui donner un pointeur sinon ca va pas aller.

effectivement il demande du C++ mais je connais pas les fonctions equivalentes en C++ (a part cout) donc… il faudra qu’il recompose suivant ses besoins.

Argh!!! Ca peut paraitre purement syntaxique sur cet exemple la et c’est pas dirige vers quelqu’un en particulier mais pitiee, arretez de faire du C++ comme vous faites du C. C’est pas parceque ca marche qu’il faut faire comme ca.

printf, scanf pour ca la -> BHEUARK

cin >> a;
cout << “Bonjour monsieur le programmeur C++”;

et pourtant je sais pas programmer en C++…
Ce message a été édité par GloP le 22/09/2003

Bon si tu veux du c++ j’suis plus d’accord avec ça:
 

int CPersonalData::ComputeAge(int actual_year) {  return actual_year - birth_year; } [/quote]parce que celle d'avant, si j'ai bien compris, elle travaille sur la variable "age" en variable publique -même si il y a marqué private devant-... donc pas bien...   sauf que je passerais birth_year en paramètre aussi... ça me semble un peu plus sexy quand même...

pis tant qu’a faire, mettre un parametre par défaut à actual_year, c’est plus simple pour l’appel de la fonction.

Ceci dit, j’ai jamais fait de c++, (mais je commence bientôt… enfin si j’ai réussis mes exas… sinon “back to Ada”  - et on ne se moque pas HEIN!) donc je peux pas te modifier les fonctions de manière certaine…

/ Edit
je dis pas que le code est nul il marche très bien comme çà, je donne juste mon avis comment l’améliorer un peu…
Ce message a été édité par Dadal le 22/09/2003

A Glop:

Je comprends [PERE]Cil et ses printf, scanf car je suis sûr à 99% que le cours de C++ que suis notre amis KayL n’est rien d’autre qu’un de ces fameux cours de C qui n’a de C++ que le nom et à mon avis c’est sans doute ces fonctions là qu’il a apprise!

Mais c’est vrai que tu as raison de remettre l’église au milieu du village!

A Dadal:

J’ai mis age en private et elle est appellée que par des fonctions de la classe donc je vois pas ce que tu veux dire par une utilisation publique!

Sinon il a déjà birth_year de la fonction d’avant, par contre age il la calcule en fonction de actual_year.
Ce message a été édité par Zoomastigophore le 23/09/2003

[quote]Argh!!! Ca peut paraitre purement syntaxique sur cet exemple la et c’est pas dirige vers quelqu’un en particulier mais pitiee, arretez de faire du C++ comme vous faites du C. C’est pas parceque ca marche qu’il faut faire comme ca.[/quote]J’ai pas dit que ct du C++ j’bite rien en C++ mais je supposais qu’il voulait un truc plus simple DONC j’ai fait un exemple avec ce que je connaissais, le C.

C’est moi ou vous lui avez fait tout son exo ? Pas très pédagogique…

Surtout qu’on ne parle pas de classe…
Ce message a été édité par xentyr le 23/09/2003

Au moins il a plusieurs avis et plusieurs possibilités et je pense qu’il est pas à fond avancé mais au moins il a de la lecture pour demain. Mais bon c’est toujours comme ça on nous pose une petite question et tout de suite on part en couille…
Ce message a été édité par Zoomastigophore le 23/09/2003

Je vais essayer de répondre à ta question du début :

  • Une fonction est une succession d’instructions qui sont exécutées et qui te retourne un résultat à la fin avant de te rendre la main.
  • Une procédure est simplement une fonction qui ne te retourne rien, donc une procédure est une succession d’instructions qui sont exécutées avant de te rendre la main.
    Procédures et fonctions peuvent avoir ou non des arguments qu’elles utiliseront ou non.

Exemple :

#include #include

string nom;
string prenom;
int anneeNaissance;

void Procedure1()
{
  cout << "Nom : ";
  cin >> nom;
  cout << "Prénom : ";
  cin >> prenom;
  cout << "Année de naissance : ";
  cin >> anneeNaissance;
}

int Fonction(int anneeEnCours)
{
  int ageCalcule = anneeEnCours - anneeNaissance;
  return (ageCalcule) ;
}

void Procedure2()
{
  // à remplir
}

int main()
{
  int age;

  Procedure1();
/* La procedure est exécutée puis on passe à la ligne suivante */
  cout << “Hello " << prenom << " " << nom << " !” << endl;

  age = Fonction(2003);
/* La fonction te renvoie un résultat que tu stockes dans une variable pour pouvoir l’utiliser ensuite avant de passer à la ligne suivante */
  cout << “Vous avez " << age << " ans.” << endl;

  Procedure2();
  cout << “Sauvegarde effectuée, au revoir !” << endl;

  return 0;
}

 Ouaip, finalement, être prof, c’est pas donné à tout le monde ! 

N’hésite pas à consulter les divers tutoriels présents sur le net…
Ce message a été édité par xentyr le 23/09/2003

[quote]A Dadal:

J’ai mis age en private et elle est appellée que par des fonctions de la classe donc je vois pas ce que tu veux dire par une utilisation publique!

Sinon il a déjà birth_year de la fonction d’avant, par contre age il la calcule en fonction de actual_year.
[i]Ce message a été édité par Zoomastigophore le 23/09/2003

[/i][/quote]en faite moi je pensais plutôt à une architecture du type
(bon c’est un peu un mix c-ada-français-etc mais c’est surtout pour la logique)

procedure main
{

définition du type personne (structure) contenant
 Nom : String
 Prénom : String
 Date_de_Naissance: Integer,
ou mieux un nouveau type Date avec plein de champ
fin de la définition
// Edit: oui on s’en fou un peu mais bon, ça fait jolie

procedure Saisie_Texte(variable_enregistré, Invite)
 // enregistre un texte dans variable_enregistré en affichant un petit texte
 //  basé sur Invite

procedure Saisie_Date (variable_enregistré, Invite)
 // même principe, seul le type de variable_enregistré change et est de type Date

fonction Calcul_Age(Date_De_Naissance, Date_Référence)
//  elle retourne l’age. Pour simplifier on met la date actuel par défaut 
// à Date_Référence

procedure de Sauvegarde(Variable de type Personne, Fichier)
// ben elle elle sauvegarde une variable de type Personne
// dans le Fichier

// déclaration des variables
Moi de type Personne
et une variable Fichier

// Ensuite on n’a le programme a proprement parlé

  Saisie_Texte(Moi.Nom, “Entrer votre nom”);
  Saisie_Texte(Moi.Prénom, "Entrer votre prénom);
  Saisie_Chiffre(Moi.Date_de_Naissance, “Entrer la date de naissance”);
  Calculer_Age (Moi.Date_de_Naissance, Date actuel);
  Sauvegarde(Moi);
}
fin du main…

je sais pas si tu vois ce que je veux dire… je voyais juste pas l’interet de déclarer les variables et les fonction à l’extérieur du “main”. Je trouve cette structure plus “simple”. Même si on peux encore la simplifier (la structure “Personne” c’est juste pour monter que je suis super balèze et que je suis un 3l33t, mais elle apporte pas grand chose…)

/Edit Note pour plus tard: Trouver du code plus sexy: SAIMAL!
/Edit 2: Vous genez surtout pas pour démolir tout ça… je voudrais juste des arguments, même si c’est des “en c++ on fait jamais ça, alors casses toi gamin”,
j’ai pas peur…
 
Ce message a été édité par Dadal le 23/09/2003

Attention, j’ai pas déclaré les variables à l’extérieur du main(). C’est la définition de la classe qui est à l’extérieur et à ce moment là les variables n’existe pas encore. Elles sont créée dans le main() lorsque j’instancie la classe CPersonalData et ces variables existent ensuite au travers de my_data.

De toute manière si c’est pour faire que ce qu’a demandé KayL le code de Xentyr est le mieux adapté.
Ce message a été édité par Zoomastigophore le 23/09/2003

/ mode mille-excuses ON

Tu va pas le croire, mais pendant que je relisais nos postes, je me suis brusquement aperçu de ce détail, et juste le temps que je me dépatouille(cety pas beau les vieilles expressions) avec les divers boutons, PAF ton message apparait.
Donc oui, t’as raison, et ça revient en gros au même.

/mode mille-excuse OFF

n’empeche que, ça:

int Fonction(int anneeEnCours) {   int ageCalcule = anneeEnCours - anneeNaissance;   return (ageCalcule) ; }[/quote]ça me fait tout bizarre. Le fait de voir anneeNaissance utilisé, alors qu'elle n'est ni passé en paramètre, ni déclaré dans la fonction, ça me parait pas sûr du tout.

On sait pas vraiment ce qu’elle contient cette variable(enfin si!, mais pas vraiment), elle peut avoir été changé par plein d’autre truc (oui pas là, mais bon elle peu). Et nous, on la prends, on là soustrait, on la retourne, même pas peur…

Enfin bon voilà, comme je l’ai déjà dit, c’est plus des reflexes que j’ai, et comme on n’est pas là pour me psychanaliser, je me tais
Ce message a été édité par Dadal le 23/09/2003

C’est parce que anneeNaissance, tout comme nom et prenom sont des variables globales, déclarées au tout début du source en dehors de tout bloc et donc visibles (== utilisables) dans tout le programme, et donc a fortiori dans main(…),  Procedure1(…) et Fonction(…) ici. Donc tu as raison de soulever certains points de sécurité comme le fait de ne pas savoir si les variables sont initialisées avant d’être utilisées pour la première fois. Le programmeur doit donc faire bien attention à ça.

Edit: Je mets en gras car tu as dû le zapper
Oui on déconseille l’abus des variables globales mais là, le gars, il débute…

Ce message a été édité par xentyr le 23/09/2003