Simulation des enchères en créent le vendeur qui propose un objet et sa valeur initial et un temps pour les clients doivents respecter un nombre de clients serent créés chaque client propose un pris supérieur tout en respectant l'exclusion mutuelle etla derniere misa jour du prix de l'objet bien sur en respectant son montant d'argent qui lui reste
Source / Exemple :
/*********************************************************************** université de bejaia
Fait par:
TOUATI Mohamed
BELGHALI Belaid
AZIRA Abderrezak
Proposé par M.Redhouane
TP SE2
4ieme année informatique
2007.2008 2007 . 2008
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/wait.h>
#include "ccrt.h"
int main (){
key_t cle;
pid_t f;
int num_f, nb_f, i, status;
int id_sem;
struct sembuf op_v= {0, +1, SEM_UNDO};
struct sembuf op_p= {0, -1, SEM_UNDO};
ushort init_sem[] = {1};
//génération de la clé...pour le semaphore
if ( (cle = ftok (".", 'a')) == -1){
perror ("ftok");
return -1;
}
//création d'un sémaphores...
if ( (id_sem = semget (cle, 1 ,IPC_CREAT | IPC_EXCL | 0666)) == -1 ){
perror ("semget");
return -1;
}
//initialisation du sémaphore...
if (semctl (id_sem, 0, SETALL, init_sem)==-1){
perror ("semctl");
return -1;
}
int id_mem;
const int taille=0x6400;
key_t clef;
int *val;
//génération de la clé...pour la memoire partagée
if ( (clef = ftok (".", 'a')) == -1){
perror ("ftok");
return -1;
}
//génération du segment de la mémoire partagée...
id_mem = shmget (cle, taille, IPC_CREAT|IPC_EXCL|0666);
if (id_mem == -1){
perror ("id_mem");
return -1;
}
time_t t0,t1,tc;
val = (int*)shmat (id_mem,0, 0);
val[0]= 100;
int dif,m,r,y,k,l;
int prixin;
ClrScr();
TextBackground(YELLOW);
GotoXY (3,3);
TextColor(RED);
printf("Le vendeur:");
TextColor(RED);
printf(" je propose un Golf TDI pour les enchere");
TextColor(BLUE);
GotoXY (8,5);
printf("Le prix de depart est: \t\tDA\b\b\b\b\b\b\b\b\b\b\b");
scanf("%d",&prixin);
val[0]=prixin;
printf ("Donnez le nombre de client: ");
a:scanf ("%d", &nb_f); getchar(); // pour éviter le problème d'entréé...
if (nb_f<2){
printf ("Vous devez donner un nombre superieur à 1...\n\n");
goto a;
}
int poche[100];
for(i=1;i<=nb_f;i++)
{
printf("Introduire le solde du client (%d) \t\tDA\b\b\b\b\b\b\b\b\b\b",i);
scanf("%d",&poche[i]);
}
int tmax;
printf("Introduire le temp max :");
scanf("%d",&tmax);
time(&t0);
ClrScr();
num_f = 1; // le numéro du premier client...
for (i=0; i<nb_f; i++){
srand (time(NULL));//initialisation de la génération des nombres aléatoires
f = fork();// créer un client..
switch (f){
case -1:{
perror ("fork()");
return -1;
}
case 0:{ // les client...
while (1){
sleep ((rand()%4)); // temps aléatoire entre deux prposietions
for(i=1;i<=nb_f;i++){
GotoXY (3,2*i);
TextColor(BLACK);
printf("le client(%d)",i);
}
time(&t1);
if(num_f!=val[1] && t1-t0<=tmax && poche[num_f]-val[0]>0)
{
if (semop(id_sem, &op_p, 1) == -1 ){
perror ("semop - p");
return -1;
}
dif=poche[num_f]-val[0];
m=rand()%50+1;
if(m-dif<0){
ClrScr();
time(&tc);
l=tc-t0;
k=tmax-l;
GotoXY (52,20);
printf("Le temps restant ");
TextColor(RED);
printf(" %d",k );
if(k==0) {
GotoXY (23,12);
TextColor(BLUE);
printf("Le vendeur: ");
GotoXY (38,12);
TextColor(RED);
printf(" le temps est terminé !!!");
}
for(i=1;i<=nb_f;i++){
if(i!=num_f){
GotoXY (3,2*i);
TextColor(BLACK);
printf("Le client(%d)",i);
}
if(i==num_f){
r=(rand()%4);
TextColor(BLUE);
GotoXY (3,2*i);
printf("---------->");
TextColor(RED);
GotoXY (19,2*i);
if (r== 0) printf("Le client(%d): j'ajoute %d DA",i,m);
if (r== 1) printf("Le client(%d): je propose %d DA en plus ",i,m);
if (r== 2) printf("Le client(%d): je donne %d DA",i,val[0]+m);
if (r== 3) printf("Le client(%d): %d DA ",i,val[0]+m);
}
}
GotoXY (63,4);
TextColor(BLUE);
printf ("///////////");
GotoXY (65,5);
TextColor(RED);
printf ("%d DA",val[0]+m);
TextColor(BLUE);
GotoXY (63,6);
printf ("///////////");
val[1]=num_f;
val[0]=val[0]+m;}
printf("\n\n");
if (semop (id_sem, &op_v, 1) == -1 ){
perror ("semop - v");
return -1;
}
}
// pour casser la boucle while(1)
time(&t1);
if(t1-t0>tmax)
break;
}
return 0;
}// fin zone des clients...
}
num_f++; // la prochain numéro de client..
sleep (1); // attendre une seconde avant la prochaine génération des clients...
}
// le père...
for (i=0; i<nb_f; i++)// le point de rdv avec le pere il faut execute nb_f fois pour rendre la main au père
wait (&status);
if (semctl (id_sem, 0, IPC_RMID, 0) == -1){ // la libération du sémaphore...
perror ("semctl");
return -1;
}
if(val[1]>0)
{
ClrScr();
TextColor(RED);
GotoXY (3,2);
printf("Le vendeur:");
TextColor(BLUE);
GotoXY (27,4);
printf("*************************************");
GotoXY (31,5);
printf("Filicitation pour le client %d\n",val[1]);
GotoXY (27,6);
printf("*************************************");
TextColor(RED);
GotoXY (18,10);
//TextColor();
printf("Le gagnant est le client : %d",val[1]);
GotoXY (18,12);
printf("Avec un prix de : %d DA", val[0]);
TextColor( MAGENTA);
GotoXY (3,17);
printf("Merci pour tous les perticipants, à un prochain encher.");
TextColor(BLACK);
GotoXY (1,22);
}
else /////////s'il n y a pas de proposition valide
{
printf("Dommage! la Golf n'a ete achetee par aucun des client!!\n\n ");
}
shmdt (val);
if (shmctl (id_mem, IPC_RMID, 0) == -1){ // suppression de la mémoire partagée...
perror ("shmctl");
return -1;
}
return 0;
}
Conclusion :
universté de bejaia
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.