Procédure proc 1 [Résolu]

TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 25 nov. 2015 à 14:18 - Dernière réponse : TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention
- 27 nov. 2015 à 19:48
Bonjour, je te sollicite encore cptpingu pour ceci :

Voici la procédure :


procedure proc1 (a:entier, b:entier, S c:entier)
debut
si a < b alors
c a
sinon
c b
finsi
fin


et voici les questions :

a. Préciser en clair le rôle de cette procédure et proposer un nom plus parlant que proc1.

b. Transformer cette procédure en fonction, en cherchant l'optimisation (en algo ou dans le langage de votre choix).

c. Écrire une séquence de code (en algo ou dans le langage de votre choix) qui permet de saisi trois valeurs entières et qui doit permettre d'obtenir le même résultat (pour ces 3 valeurs) que ce que permet d'obtenir la fonction pour deux valeurs seulement. La séquence de code doit afficher le résultat final, en exploitant la fonction que vous avez écrite. L'optimisation de la solution proposée sera valorisée.

Voici ce que j'ai fais, à noter que j'ai tout fait en algo et pas en codé C ou C++ :

a) Remplace un nombre en un autre en fonction de sa valeur.
nom : Remplacement de valeur (je t'avoue que sur le nom e sèche un peu.......).

b)

fonction proc1 (a:entier, b:entier, S c:entier)
debut
si a < b alors
c <- a
sinon
c <- b
finsi
retourner(c)
fin


c)

procedure proc2 (a:entier, b:entier, c:entier, S d:entier)
debut
si a < b alors
d <- a
sinon
d <- b
sinon
d <- c
finsi
fin
Afficher la suite 

17 réponses

Répondre au sujet
cptpingu 3768 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - 25 nov. 2015 à 14:56
0
Utile
Bonjour.

Je te conseille de le faire en C++, ce qui te permet de tester :).

a) Tu paraphrases l'algo, mais tu n'expliques pas son but. Je te donne un autre exemple pas du tout lié à celui-ci, afin que tu comprennes le souci.
Soit la fonction ci-dessous:
void func(int& a, int& b)
{
  int tmp = a;
  a = b;
  b = tmp;
}

La réponse que tu donnes est de ce type: "C'est une fonction qui prend la valeur de a et la sauvegarde. Puis met b dans a. Enfin, on met tmp dans b. Nom de fonction: changement_des_deux_valeurs". Bien que juste, tu paraphrases la code donné, sans expliquer ce qu'il fait, et à quoi il sert.
La réponse attendue serait: "Inverse les deux valeurs données à cette fonction: Nom de fonction: echange".

b) Fais le en C++, tu verras, c'est plus clair. Là, comme c'est un pseudo langage, difficile de te dire si c'est vraiment ok (même si ça me paraît juste).

c) Si tu ne fais pas correctement a) et b), tu ne peux malheureusement pas faire le c). C'est faux, mais il te faut d'abord corriger a) et b) avant de comprendre ce qui ne va pas dans c). Le c) dépend très *fortement*" de a) et b).
Commenter la réponse de cptpingu
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - Modifié par TheRogerFederer le 25/11/2015 à 15:59
0
Utile
a) Bah en gros la procédure la elle fait : si a < b, c <- a sinon c <- b, donc dans tous les cas c prend la valeur de a ou b ?? L'explication de la procédure semble être cela ??

b) Oui en même temps la proc est pas trop dure donc pour la transformer en fonction c'est pas trop difficile.

c) Oui je me disais aussi que ça ne serai pas aussi simple...............
Il y a surement des conditions à rajouter.............:


procedure proc2 (a:entier, b:entier, c:entier, S d:entier)
debut
si a < b ou b < c
d <- a
ou
d <- b
sinon
d <- c
finsi
fin

??
Commenter la réponse de TheRogerFederer
cptpingu 3768 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - Modifié par cptpingu le 25/11/2015 à 16:46
0
Utile
Bah en gros la procédure la elle fait : si a < b, c <- a sinon c <- b, donc dans tous les cas c prend la valeur de a ou b ?? L'explication de la procédure semble être cela ??


Encore une fois, tu paraphrases. On ne te demande pas de détailler l'algo, mais de donner sa finalité. À quoi sert cette fonction ? Quelle est son but ? Imagine que tu donnes à un client juste le nom de la fonction, sans qu'il puisse voir ce que fait l'algo. Il se moque de savoir comment tu fais les choses, il veut juste connaître l'utilité de ta fonction.
Si tu ne vois pas ce qu'elle fait, code là en C (trivial) et teste là avec plein de valeurs différentes. Tu devrais en déduire quelque chose.

La c) est absolument infaisable tant que tu n'as pas réussi la a).


Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 25 nov. 2015 à 16:37
0
Utile
D'accord je regarde ça et je te dis
Commenter la réponse de TheRogerFederer
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 25 nov. 2015 à 17:17
0
Utile
Alors quand je le code je rencontre cette erreur :


e:/ecole/programmes/eclipse/eclipsecpppack-0.1/eclipsecpppack-0.1/software/mingw/bin/../lib/gcc/mingw32/4.2.1-sjlj/../../../libmingw32.a(main.o):main.c: undefined reference to `WinMain@16' procedure1 line 0


j'ai codé cela :
#include <stdio.h>
#include <conio.h>

int proc1(int a, int b, int c)
{
	if(a < b)
	{
		c = a ;
	}
	else
	{
		c = b ;
	}
	
return(c) ;

} 
Commenter la réponse de TheRogerFederer
cptpingu 3768 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - 25 nov. 2015 à 18:10
0
Utile
Tout d'abord, en C, lorsque l'on retourne une valeur (ici "c"). Il n'est pas nécessaire de l'indiquer en tant qu'argument d'entrée, c'est juste un argument de sortie. Donc ça se met en "sortie" de la fonction (le "int" avant proc1 veut dire qu'on "retournera" un entier).
Soit:
int proc1(int a, int b)
{
  int c = 0;

  if (a < b)
    c = a;
  else
    c = b;

  return c;
}

// ou directement:

int proc1(int a, int b)
{
  if (a < b)
    return a;

  return b;
}


De plus, l'erreur est assez clair. Où est ton "main" ?
Commenter la réponse de cptpingu
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 25 nov. 2015 à 18:28
0
Utile
Ah oui d'accord mais si tu met le main en début il faut un return a la fin, a ce moment la, le main doit retourner quoi ??

un return 0 suffit ?
Commenter la réponse de TheRogerFederer
cptpingu 3768 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - Modifié par cptpingu le 25/11/2015 à 18:37
0
Utile
Le main retourne un code d'erreur utilisé par le système d'exploitation. 0 voulant dire "pas d'erreur".

Ce qui donnera (en C++):
#include <iostream>

int proc1(int a, int b)
{
  if (a < b)
    return a;

  return b;
}

int main()
{
  int a = 45;
  int b = 36;

  int c = proc1(a, b);
  std::cout << a << " " << b << " " << c << std::endl;

  return 0;
}



Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 25 nov. 2015 à 19:35
0
Utile
Ah oui d'accord, tu écrit d'abord la procédure puis tu l'insère dans le programme en faisant appelle à elle au moment ou tu en as besoin, ici pour définir c.

En faisant quelque test, en faite sur ce qu'elle fait........................ c prend toujours la plus petite valeur on est d'accord............!!?
J'ai essayé avec les 2 tiens d'exemples, en échangeant a et b de valeurs et après j'ai essayé de mettre des valeurs qui me passe par la tête et j'ai remarqué que c prenait toujours la plus petite valeur.........
Commenter la réponse de TheRogerFederer
cptpingu 3768 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - Modifié par cptpingu le 25/11/2015 à 20:26
0
Utile
Ah oui d'accord, tu écrit d'abord la procédure puis tu l'insère dans le programme en faisant appelle à elle au moment ou tu en as besoin, ici pour définir c.

Tu définis (crées si tu préfères), une fonction. Une fois cela fait, tu peux l'appeler où tu veux et autant de fois que tu veux. D'ailleurs tu as déjà appelé des fonctions, puisque "printf" et "scanf" en sont ;). Si tu regardes le codes-sources de la libC, tu trouveras même comment elles ont été codées (par contre c'est un peu costaud à lire).

prend toujours la plus petite valeur on est d'accord.

Tout à fait. Maintenant que tu sais ce que fait cette fonction, il ne te reste qu'à trouver un nom de fonction explicite.

Pour le c), on te demande maintenant de réaliser la même fonction, en un peu plus compliqué, puisque cette fois, on te demande le minimum entre 3 valeurs, et non 2. Si tu as un compris le a), c'est un peu plus long à écrire, mais pas très difficile.


Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 26 nov. 2015 à 09:59
0
Utile
Pour le c) 'ai codé ceci :
int main()
{
	// -- Déclaration --
	int a, b, c, min ;
	
	// -- Saisie des variables --
	printf(" Entrez le premier nombre : ") ;
	scanf("%d",&a) ;
	
	printf(" Entrez le second nombre : ") ;
	scanf("%d",&b) ;
		
	printf(" Entrez le troisieme nombre : ") ;
	scanf("%d",&c) ;
	
	// -- Comparaison pour trouver quelle est le minimum --
	if(a < b) 
	{
		min = a ;
	
		if (c < min)
		{
			min = c ;
		}
	}
    else 
	{
		min = b ;
	}	
    if (c < min)
    {
        min = c ;
	}
    
    printf(" Le minimum des trois est : %d\n ", min) ; // Affichage du résultat
   
getch() ;
return 0 ;

}

est ce suffisant pour répondre a la question ??
Commenter la réponse de TheRogerFederer
cptpingu 3768 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - Modifié par cptpingu le 26/11/2015 à 10:55
0
Utile
L'algorithme est juste (même si légèrement améliorable: Tout à la fin, ton dernier test pourrait être inclus dans le else, ce qui éviterait de repasser dessus inutilement si on est dans le cas "a < b").
En revanche, attention, on te demande d'écrire une *fonction*, pas de "jeter" du code dans le main. Jusqu'à maintenant, tu écrivais tout dedans, car c'était plus simple. À partir de maintenant, tu vas devoir écrire que des fonctions qui s'appellent (ou non) entre elles, et qui seront appelées par ton main. Le principe même du code c'est de diviser un problème difficile en sous parties "faciles".
Je te laisse créer une fonction, faire la petite amélioration décrite plus haut, puis poster ton code final ici. Une fois fait, je te proposerais une correction alternative (tout aussi juste que ce que tu proposes, mais un peu plus "élégant" :p).

PS: N'oublie pas de nommer la fonction qui prend deux valeurs et retourne la plus petite.


Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 27 nov. 2015 à 09:36
0
Utile
Désolé d'avoir mis du temps, je n'étais pas chez moi hier apres-midi. J'ai codé ceci pour le c) :
// Création de la fonction
int f1(int a, int b, int c)
{
  if (a < b)
    return a;

  return b;
  
 return c ;
}

// -- Programme principal --
int main()
{
	// -- Déclaration --
	int a1, b1, c1 ;
	
	// -- Saisie des variables --
	printf(" Entrez le premier nombre : ") ;
	scanf("%d",&a1) ;
	
	printf(" Entrez le second nombre : ") ;
	scanf("%d",&b1) ;
		
	printf(" Entrez le troisieme nombre : ") ;
	scanf("%d",&c1) ;
	
	// -- Comparaison pour trouver quelle est le minimum --
	f1(a1, b1, c1) ;
	
    printf(" Le minimum des trois est : %d\n ", f1(a1, b1, c1)) ; // Affichage du résultat
   
getch() ;
return 0 ;

}


Pour le a) j'ai donné le nom : minimum.
Commenter la réponse de TheRogerFederer
cptpingu 3768 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - 27 nov. 2015 à 12:52
0
Utile
a) Oui c'est un très bon nom. Tu peux le garder. C'est tout de même plus explicite que "echange deux valeurs" :). Pour info (mini hors-sujet) la fonction existe déjà en C++ et s'appelle std::min.

c) Heu... L'algorithme était bon quand tu me l'as présenté. Il fallait ensuite en faire une fonction, plutôt que de le mettre dans le main. En revanche, là tu as changé la logique, et c'est faux. Tu retournes uniquement le max entre a et b, en ignorant c. ("return c" est inaccessible, vu que tu as un "return b" devant qui te sort de la fonction).
Commenter la réponse de cptpingu
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 27 nov. 2015 à 14:27
0
Utile
Ohh bien vu j'avais pas fait attention merci..... est ce que cela irai mieux ?? J'ai testé et a priori ca a l'air de fonctionner mais bon......... :

// Création de la fonction
int f1(int a, int b, int c)
{
	int min ;
	
	if(a < b) 
	{
		min = a ;
	}
		else
		{
			min = b ;
		}
			if (c < min)
			{
				min = c ;
			}
	return(min) ;
}

// -- Programme principal --
int main()
{
	// -- Déclaration --
	int a1, b1, c1 ;
	
	// -- Saisie des variables --
	printf(" Entrez le premier nombre : ") ;
	scanf("%d",&a1) ;
	
	printf(" Entrez le second nombre : ") ;
	scanf("%d",&b1) ;
		
	printf(" Entrez le troisieme nombre : ") ;
	scanf("%d",&c1) ;
	
	// -- Comparaison pour trouver quelle est le minimum --
	f1(a1, b1, c1) ;
	
    printf(" Le minimum des trois est : %d\n ", f1(a1, b1, c1)) ; // Affichage du résultat
   
getch() ;
return 0 ;

}
Commenter la réponse de TheRogerFederer
cptpingu 3768 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - 27 nov. 2015 à 17:40
0
Utile
Oui c'est mieux. La fonction pourrait avoir un nom plus explicite que "f1".

Je te propose une version corrigée et commentée de ce que tu as réalisé:
#include <stdio.h>

/*
  Ta version est juste, mais "répète" du code
  et de la logique que l'on possède déjà. En
  réutilisant ce que l'on a déjà fait, on pourrait
  la simplifier grandement.
*/
int minimum3(int a, int b, int c)
{
  int min = 0;

  if (a < b)
    min = a;
  else
    min = b;

  if (c < min)
    min = c;

  return min;
}

/*
  Donne le minimum entre deux valeurs. On va
  s'en servir pour faciliter l'écriture d'une
  fonction plus complexe.
*/
int minimum(int a, int b)
{
  if (a < b)
    return a;

  return b;
}

/*
  Si on regarde bien le code que tu as fait, ce que tu
  calcules, c'est en fait le minimum entre "a" et "b" (que
  tu appelles "min"), puis le minimum entre "min" et "c".
  Au lieu de répéter du code, on pourrait réutiliser la
  fonction qui donne le minimum entre deux valeurs, de
  manière à exprimer: prendre le minimum entre "c" et le
  minimum de "a" et "b".
*/
int minimum3_elegant(int a, int b, int c)
{
  return minimum(minimum(a, b), c);
}

/*
  Si tu as du mal à comprendre le code ci-dessus, c'est
  la version courte de:

  int min = minimum(a, b)
  return minimum(min, c);
*/

int main()
{
  int a = 0;
  int b = 0;
  int c = 0;

  /*
    Au lieu de demander 3 fois des nombres, autant
    demander les 3 d'un coup (séparés par des espaces
    ou sauts de lignes).
  */
  printf("Entrez les 3 nombres: ");
  scanf("%d %d %d", &a, &b, &c);

  printf("Le minimum des trois est: %d\n", minimum3(a, b, c));
  printf("Le minimum des trois est: %d\n", minimum3_elegant(a, b, c));

  return 0;
}


La chose à retenir dans cet exercice très classique, c'est la notion de "découpage". Quand on programme, on n'essaie jamais de résoudre immédiatement un problème difficile. On décompose le "gros" problème en une série de petits problèmes "faciles". C'est grâce à cette technique que l'on arrive à réaliser des logiciels complexes. Toute la difficulté à partir de maintenant (et pour pas mal d'années), va être pour toi d'imaginer comment découper ton code correctement (ça fait parti de la notion d'architecture logicielle). C'est au découpage du code que l'on différencie un bon programmeur, d'un mauvais.
Commenter la réponse de cptpingu
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 27 nov. 2015 à 19:48
0
Utile
Très bien d'accord !!

Quand tu as utilisé dans le programme : minimum(minimum(a, b), c)............ je voulais faire ce genre de chose mais comme j'ai encore jamais vu cela, je ne savais pas comment l'écrire..............
En tout cas merci a nouveau pour ces aides que tu me fourni depuis 3 mois :)
Commenter la réponse de TheRogerFederer

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.