# fonction min/max en C/C++



## patrickrochon (10 Octobre 2005)

Bonjour,

j'aurais besoin d'un petit coup de main.  Je débute en C et je dois écrire un court programme utilisant les fonctions min() et/ou max().

grosso-modo, je demande l'utilisateur d'entrer le nombre d'heures travaillées et ensuite son taux horaire.  Il faut que je calcul un maximum de 40 heures aux taux horaire (d'où l'utilisation de la fonction max() ).  Je sais que je pourrais utiliser une structure if, mais je dois utiliser min() max().

Par exemple si l'utilisateur entre 60 heures travaillées, bien il faut que je calcul une maximum de 40 heures * tauxHoraire, et la balance (en l'occurence 20 heures) * tauxDouble.

Ya juste la partie utilisant max() qui me donne des difficultées.  Je sais m'en servir pour comparer des chiffres exemple max (nombre1, nombre2, nombre3) et sortir le plus grand, mais je suis un peu embêté pour l'utilisation dans le programme que je dois faire.

Si quelqu'un peu m'aider ?


----------



## tatouille (10 Octobre 2005)

#define max(a,b) (a>=b?a:b)
#define min(a,b) (a<=b?a:b)

ou

int max(int a,int b);

int max(int a,int b);
{
  if(a>=b)
return a;
else
return b;
}

concrêtement tu veux faire quoi ?


----------



## NightWalker (10 Octobre 2005)

patrickrochon a dit:
			
		

> Bonjour,
> 
> j'aurais besoin d'un petit coup de main. Je débute en C et je dois écrire un court programme utilisant les fonctions min() et/ou max().
> 
> ...



Bonjour et bienvenue,

Je ne sais pas si tu as réellement besoin d'une fonction min() et max(), car ce dont tu as besoin est de savoir si tu dépasse les heures aux taux horaires ou non...



> Par exemple si l'utilisateur entre 60 heures travaillées, bien il faut que je calcul une maximum de 40 heures * tauxHoraire, et la balance (en l'occurence 20 heures) * tauxDouble.



En algo à priori ça donne dans le genre :

_
lHeure est un entier;   // l'heure effectuée
lfSommeTauxHoraires est un réel;  // coût aux taux horaires
lfSommeDepassement est un réel; // coût du dépassement
lfSommeTotale est un réel;  // le coût global

lfSommeTauxHoraires = 0.0;
lfSommeDepassement = 0.0;

si lHeure >= 40 alors
   lfSommeTauxHoraires = 40 * TauxHoraires;
sinon
   lfSommeTauxHoraires = lHeure * TauxHoraires;
finsi

// on calcule maintenant dans le dépassement s'il y a
si lHeure > 40 alors
   lfSommeDepassement = ( lHeure - 40 ) * TauxDouble;
finsi

lfSommeTotale = lfSommeTauxHoraires + lfSommeDepassement;
_

Donc à priori pas besoin de fonction min et max ???  l'Algo ci-dessus ne fait que traduire l'exemple que tu as donné...


PS : j'ai l'habitude de mettre un petit L  -> 'l' devant les variables pour indiquer qu'elles sont locales à la fonction. Et le "f" pour type float. Rien pour le type integer


----------



## tatouille (10 Octobre 2005)

NightWalker a dit:
			
		

> Bonjour et bienvenue,
> 
> Je ne sais pas si tu as réellement besoin d'une fonction min() et max(), car ce dont tu as besoin est de savoir si tu dépasse les heures aux taux horaires ou non...
> 
> ...



oui min max
 essaye encore


----------



## patrickrochon (10 Octobre 2005)

Mon exercice se présente comme suit :

"Vous êtes un préposé à la paie.  Vous devez calculer le salaire brut d'un employé sachant que les 40 premières heures travaillées sont payées à temps simples tandis que toutes les autres sont payées à temps double.  Arrondissez le salaire brut au centième de dollar près.  Supposez que le nombre d'heures et le taux horaires sont des réels valides, supérieurs à zéros.

Faites usage de la fonction min() et de la fonction max().  N'utilisez pas de structure décisionnelles pour cet exercice."


Aperçu de ce que devrait donner l'affichage :

Combien d'heures avez-vous travaillé cette semaine ?  61.0
Quel est votre taux horaire ? 12.50

Votre salaire brut est de 893.75 $.




voilà le petit problème.  Pour l'affichage (printf, scanf, etc) ça va, cé juste la structure du min() et du max() avec laquelle je suis embêté.


merci pour le coup de main


----------



## tatouille (10 Octobre 2005)

patrickrochon a dit:
			
		

> Mon exercice se pr&#233;sente comme suit :
> 
> "Vous &#234;tes un pr&#233;pos&#233; &#224; la paie. Vous devez calculer le salaire brut d'un employ&#233; sachant que les 40 premi&#232;res heures travaill&#233;es sont pay&#233;es &#224; temps simples tandis que toutes les autres sont pay&#233;es &#224; temps double. Arrondissez le salaire brut au centi&#232;me de dollar pr&#232;s. Supposez que le nombre d'heures et le taux horaires sont des r&#233;els valides, sup&#233;rieurs &#224; z&#233;ros.
> 
> ...


&#233;cris le en pseude code je t'aide &#224; faire la traduction je reviens dans 20 min
je vais &#224; la poste

j'&#232;sp&#232;re que cela sera suffisant 

identifie le type de tes donn&#233;es 

r&#233;el -> double -> pr&#233;cision centi&#232;me -> round ecetera


----------



## NightWalker (10 Octobre 2005)

tatouille a dit:
			
		

> oui min max
> essaye encore



Les fonctions min ou max que je connaisent retourne la valeur minimal d'un ensemble de valeur ( min() ) et la valeur maximale d'un ensemble de valeur ( max() )  ??? j'ai raté quelque chose ?


----------



## patrickrochon (10 Octobre 2005)

voilà le code qui me permet de réaliser le programme sans utiliser de if ().

int main (int argc, char * const argv[]) 
{

	//déclaration des variables

	double heuresTravaillees;	//le nombre d'heures totales travaillées
	double tauxHoraire;			//le taux horaire
								//le taux pour les heures travaillées passé 40 heures
	double heuresSupplementaires;
	double tauxEtDemi;

	double salaireNormal;
	double salaireSupplementaire;

	double salaireBrut;			//le salaire brut comprenant les heures à taux normal et taux et demi.

	//demande à l'utilisateur d'entrer les données.

	cout	<<"Combien d'heures avez-vous travaillé ? ";
	cin		>> heuresTravaillees;

	cout	<<"Quel est votre taux horaire ? ";
	cin		>> tauxHoraire;

	//Calcul des heures payées à un taux régulier

	salaireNormal = min(40.0, heuresTravaillees) * tauxHoraire;

	//calcul des heures supplémentaires

	heuresSupplementaires = heuresTravaillees - 40.0;
	tauxEtDemi = tauxHoraire * 1.5;


	salaireSupplementaire = max(0.0, heuresSupplementaires) * tauxEtDemi;


	//calcul salaire total

	salaireBrut = salaireNormal + salaireSupplementaire;

	//affiche le résultat
	//cout	<< heuresSupplementaires;
	cout	<<"Votre salaire brut est de "	<< salaireBrut	<< " $";

    return 0;
}


----------



## NightWalker (10 Octobre 2005)

Effectivement ça marche cette solution... 

Je ne sais pas pourquoi dans la définition de min() et max() que j'ai utilisé ci-dessus je n'ai pas essayé d'appliquer à un ensemble d'éléments qui n'est composé que de deux éléments...  

bien joué...


----------



## CarlitO (11 Octobre 2005)

Ca me fait marrer car je viens de rentrer en école d'ingénieur informatique. Et j'ai exactement le même genre d'exo.


----------



## molgow (11 Octobre 2005)

CarlitO a dit:
			
		

> Ca me fait marrer car je viens de rentrer en école d'ingénieur informatique. Et j'ai exactement le même genre d'exo.



C'est aussi typiquement le genre d'exo pour lequel je dois aider des étudiants de 1ère année 
Mais moi je suis assistant Java... faut pas déconner, le C c'est pour les dinosaures


----------



## molgow (11 Octobre 2005)

Au passage, mon cher patrickrochon, &#233;tant donn&#233; que tu sembles d&#233;buter en C et que tu as l'air bien parti pour revenir chaque semaine nous poser des questions sur les exercices que tu as &#224; faire, je ne saurais que trop te conseiller l'excellent "The C Programming Language" de Brian W. Kernighan et Dennis M. Ritchie, qui est selon moi (et pas que moi) LE meilleur ouvrage de r&#233;f&#233;rence pour le C :


----------



## CarlitO (12 Octobre 2005)

Personnellement pour son exo de salaire avec heure supplémentaire, j'ai fait ça :

#include<stdio.h>

/**
* Fonction salaire qui calcule le salaire!
* @param : int n : nombre d'heures travaillées
* @param : float h : salaire horaire
* @return : float s : salaire final
*/
float salaire(int n, float h)
{
    float s;
    if (n<=35) s=n*h;
    else {
        if (n<=45) s=n*h+(n-35)*h*50/100;
        else s=n*h+10*h*50/100+(n-45)*h*75/100;
    }
    return s;
}

int main()
{
    int n;
    float h,s;
    printf("nombre d'heures travaillées?\n");
    scanf("%d",&n);
    printf("Salaire horaire?\n");
    scanf("%f",&h);
    s = salaire(n,h);
    printf("%.2f\n",s);
    return 0;
}


----------



## NightWalker (13 Octobre 2005)

molgow a dit:
			
		

> Au passage, mon cher patrickrochon, étant donné que tu sembles débuter en C et que tu as l'air bien parti pour revenir chaque semaine nous poser des questions sur les exercices que tu as à faire, je ne saurais que trop te conseiller l'excellent "The C Programming Language" de Brian W. Kernighan et Dennis M. Ritchie, qui est selon moi (et pas que moi) LE meilleur ouvrage de référence pour le C :



Alors là je ne peux qu'être d'accord avec toi... c'est la bible...


----------

