Untitled
unknown
c_cpp
3 years ago
5.6 kB
11
Indexable
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "queue.h"
#include "big_int.h"
struct Consultant{
int totalConsultants;
char timeForOneClient[256];
big_int *timeForOneClientBig;
};
typedef struct Consultant Consultant;
void readData(Consultant *experiencedConsultant,Consultant *newConsultant,int *prob){
FILE *readData=fopen("duota.txt", "r");
fscanf(readData, "%d%*[^\n]",&(experiencedConsultant->totalConsultants));
fscanf(readData, "%s%*[^\n]",(experiencedConsultant->timeForOneClient));
fscanf(readData, "%d%*[^\n]",&(newConsultant->totalConsultants));
fscanf(readData, "%s%*[^\n]",(newConsultant->timeForOneClient));
fscanf(readData, "%d%*[^\n]",prob);
fclose(readData);
}
void printBigIntCustom(big_int* num,FILE *write){
if(num->sign=='-'&&num->data[0]!=0){
fprintf(write,"%c",num->sign);
}
for(int i=0;i<num->len;++i){
fprintf(write,"%c", (num->data[i] + '0'));
}
}
void checkWork(Consultant consultant,int prob,int specificTime,int seed){
//data for statistics
int queSize=0;
int *clientsWaitTime=calloc(specificTime, sizeof(int));
int clients=0;
double *totalOneConsultantClients=calloc(consultant.totalConsultants, sizeof(double));
Queue listOfCustomers;
srand(seed);
initialize(&listOfCustomers);
FILE *write=fopen("rez.txt", "a");
big_int **consultantList=calloc(consultant.totalConsultants, sizeof(big_int));
for (int i=0;i<consultant.totalConsultants;i++) {//consultants inicialization
consultantList[i]=new_big_int("0");
}
for(int i=1;i<=specificTime;i++){
for(int j=0;j<consultant.totalConsultants;j++){//Decreasing time
if(compare_big_int(consultantList[j],new_big_int("0"))){
consultantList[j]=sub_big_int(consultantList[j],new_big_int("1"));
}
}
if(rand()%100<prob){
fprintf(write,"\nclient did come to the meeting %d\n\n",i);
if(isEmpty(&listOfCustomers)){//if queue is empty check if consultants are free
int in=0;
for(int j=0;j<consultant.totalConsultants;j++){
if(!compare_big_int(consultantList[j],new_big_int("0"))){
clients++;//client did not wait
consultantList[j]=consultant.timeForOneClientBig;
totalOneConsultantClients[j]++;
in=1;
break;
}
}
if(!in){//if consultants are not free, fo to queue
if(!isFull(&listOfCustomers)){
enqueue(&listOfCustomers, i);
}
}
}
else{
if(!isFull(&listOfCustomers)){//if queue is not empty go to queue
enqueue(&listOfCustomers, i);
}
}
}
else{
fprintf(write,"\nclient did not come to the meeting %d\n\n",i);
}
for(int j=0;j<consultant.totalConsultants;j++){//check if consultants are free if yes 1 customer from queue goes to him
if(!compare_big_int(consultantList[j],new_big_int("0"))&&(listOfCustomers.count)>0){
clientsWaitTime[clients]=i-getFirst(&listOfCustomers);//time Spent in queue
clients++;//how many cliens came to the concultants
consultantList[j]=consultant.timeForOneClientBig;
totalOneConsultantClients[j]++;
dequeue(&listOfCustomers);
}
}
for(int j=0;j<consultant.totalConsultants;j++){
fprintf(write,"%d-th worker works with client ",j+1);
printBigIntCustom(consultantList[j],write);
fprintf(write," time left\n");
}
fprintf(write,"queue size:%d\n",listOfCustomers.count);
queSize=(queSize<(listOfCustomers.count)?(listOfCustomers.count):queSize);
}
/* statistics */
double sum=0;
int maxTime=0;
for(int i=0;i<clients;i++){
sum+=clientsWaitTime[i];
maxTime=(clientsWaitTime[i]<maxTime?maxTime:clientsWaitTime[i]);
}
if(clients!=0){
for(int i =0;i<consultant.totalConsultants;i++){
printf("%2.0d Consultant was busy with %f%% of clients\n",i+1,(totalOneConsultantClients[i]/clients)*100);
}
printf("avg wait: %f\nmax wait: %d\n",sum/clients,maxTime);
printf("max queue size: %d\n",queSize);
}
else{
printf("no one came\n");
}
//freeing memory
for (int i=0;i<consultant.totalConsultants;i++) {
free_big_int(consultantList[i]);
}
free(consultantList);
free(clientsWaitTime);
free(totalOneConsultantClients);
destroy(&listOfCustomers);
fclose(write);
}
int main(){
int prob,specificTime;
FILE *write=fopen("rez.txt", "w");
fclose(write);
int seed;
/* seed=10; */
printf("enter specific seed\n");
scanf("%d",&seed);
Consultant newConsultant,experiencedConsultant;
readData(&experiencedConsultant,&newConsultant,&prob);
printf("choose specific time to see the results\n");
scanf("%d",&specificTime);
experiencedConsultant.timeForOneClientBig=new_big_int(experiencedConsultant.timeForOneClient);
newConsultant.timeForOneClientBig=new_big_int(newConsultant.timeForOneClient);
/* specificTime=100; */
printf("\nexperienced Consultants\n");
checkWork(experiencedConsultant, prob,specificTime,seed);
printf("\nnew Consultants\n");
checkWork(newConsultant, prob,specificTime,seed);
return 0;
}Editor is loading...