Untitled

 avatar
unknown
c_cpp
2 years ago
5.6 kB
6
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...