صفحه: [1]   پایین
  چاپ صفحه  
نويسنده موضوع: اسانسور  (دفعات بازدید: 539 بار)
hana
کاربر جدید
*

تشكرها : 0
آفلاین آفلاین

تعداد ارسال: 7


ديدن مشخصات
« : 08 آذر 1389,ساعت 04:17:28 »

سلام و خسته نباشید
برنامه ای دارم مینویسم در رابطه با کارکرد درب اسانسور با استفاده از کلاس و توابع دوست.
تقریبا می دونم چی باید بنویسم ولی نمی دونم چه جوری باید بنویسم.
لطفا کمکم کنید
ممنون
خارج شده است
كیانی
مديريت سايت
*****

تشكرها : 145
آنلاین آنلاین

جنسيت : پسر
تعداد ارسال: 1146


اليس الله بكاف عبده ؟!


ديدن مشخصات WWW
« پاسخ #1 : 08 آذر 1389,ساعت 11:03:48 »

سلام
برای آسانسور : شما باید توی دو تا کلاس یکی بالا رفتن و یکی پایین آمدن آسانسور رو طراحی کنید.
ولی برای برنامه درب آسانسور شما باید از المانهای ساده و سمبول ها استفاده کنید .

*_ مشکل شما کجاست ؟
*_ در کدام الگوریتم مشکل دارید ؟

پیروز باشید.
خارج شده است

" فقال رب انی لما انزلت الی من خیر فقیر (قصص 24) * اللهم عجل لوليك الفرج"
جستجو | قوانين انجمن | آياپير | مقالات تخصصي  |عضويت درتيم آياپير
آرین
مدیر بازنشسته
*****

تشكرها : 96
آفلاین آفلاین

جنسيت : پسر
تعداد ارسال: 372


هیهات من الذله ...


ديدن مشخصات WWW
« پاسخ #2 : 10 آذر 1389,ساعت 19:47:11 »

با سلام
از این سورس کمک بگیرید.

کد:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

const int MaxTrackNumber=40;
const int MaxTaskNumber=30;
const int TotalTaskNumber=1600;
const int Average=20;


struct Task
{
int startTime;
int track;
int endTime;
};

Task taskPool[TotalTaskNumber];

class Arm;


class Timer
{
friend class Arm;
private:
int working[MaxTrackNumber];
int waiting[MaxTrackNumber];
int workingCount;
int waitingCount;
int lastPeriod;
int currPeriod;
int counter;
bool possible();
bool testDir(bool forward, int current);
int taskIndex;

public:
void generate();
Timer();
int getTime(){return counter;}
void tick(int curPos);
void reset();
void taskTest(bool& forward, int& current);
bool finished(){return taskIndex==TotalTaskNumber;}
};



class Arm
{
private:
bool forward;
int current;
Timer timer;
public:
Arm();
bool step();
void report();
};


int main()
{
Arm A;
srand(time(0));
while (!A.step())
{
//A.report();
}
A.report();
return 0;
}




//timer tick and solve task, generate new task by possibility
void Timer::tick(int curPos)
{
counter++;
generate();
if (working[curPos]!=-1)
{
//if (taskPool[working[curPos]].endTime==-1)
{
taskPool[working[curPos]].endTime=counter;
workingCount--;
working[curPos]=-1;
}
}
}

bool Timer::possible()
{
currPeriod++;
//waitingCount/currPeriod
return currPeriod-rand()%lastPeriod>=0;
}

void Timer::generate()
{
int theTrack;
if (finished())
{
return;
}
if (waitingCount<MaxTaskNumber)
{
if (possible())//generate
{
taskPool[taskIndex].startTime=counter;
theTrack=rand()%MaxTrackNumber;
while (working[theTrack]!=-1||waiting[theTrack]!=-1)
{
theTrack=rand()%MaxTrackNumber;
}
taskPool[taskIndex].track=theTrack;
taskPool[taskIndex].endTime=-1;//initialize
waiting[theTrack]=taskIndex;
waitingCount++;
taskIndex++;
}
}
}

Timer::Timer()
{
counter=0;
taskIndex=0;
lastPeriod=Average;
currPeriod=0;
waitingCount=workingCount=0;
for (int i=0; i<MaxTrackNumber; i++)
{
working[i]=waiting[i]=-1;
}
}

void Timer::reset()
{
if (workingCount==0)
{
for (int i=0; i<MaxTrackNumber; i++)
{
working[i]=waiting[i];
waiting[i]=-1;//clear up
}
lastPeriod=currPeriod;
currPeriod=0;
workingCount=waitingCount;
waitingCount=0;//clear up
}
}


void Timer::taskTest(bool& forward, int& current)
{
//always to call reset in case working period finished
reset();
//first to determine direction
if (forward)
{
//always assume change direction unless...
forward=false;
//unless there is something to explore

for (int i=current+1; i<MaxTrackNumber; i++)
{
if (working[i]!=-1)
{
forward=true;
break;
}
}
}
else
{
//always assume change direction
forward=true;

for(int i=current-1; i>=0; i--)
{
if (working[i]!=-1)
{
//unless we find reason for keep going
forward=false;
break;
}
}
}
//since we setup direction,let's go
if (forward)
{
current++;
}
else
{
current--;
}
tick(current);
}

bool Arm::step()
{
//it is timer's responsibility to determine forward
timer.taskTest(forward, current);
return timer.workingCount==0&&timer.finished()&&timer.waitingCount==0;
//timer.tick(current);
}

Arm::Arm()
{
current=0;
forward=true;
//initialize to have at least one task
while (timer.waitingCount<1)
{
timer.generate();
}
}

void Arm::report()
{
long total=0;
if (timer.finished())
{
for (int i=0; i<TotalTaskNumber; i++)
{
total+=taskPool[i].endTime-taskPool[i].startTime;
}
printf("total waiting time is %d\n", total);
printf("for total number %d tasks, the average waiting time:\n%d",
TotalTaskNumber, total/TotalTaskNumber);
printf("and ratio with number of track is %d/%d=%d\n", total/TotalTaskNumber,
MaxTrackNumber, total/TotalTaskNumber/MaxTrackNumber);
}
else
{
printf("task proceeding no. %d\n", timer.taskIndex);
}
« آخرين ويرايش: 11 آذر 1389,ساعت 10:00:56 توسط كیانی » خارج شده است

كاربران گرامی : لطفاً قبل از هرگونه فعاليت ابتدا قوانين انجمن را مطالعه  و قبل از ارسال جديد در انجمن جستجو نماييد.
hana
کاربر جدید
*

تشكرها : 0
آفلاین آفلاین

تعداد ارسال: 7


ديدن مشخصات
« پاسخ #3 : 11 آذر 1389,ساعت 00:21:32 »

سپاس فراوان از هر دوی شما بزرگواران
ممنون
خارج شده است
صفحه: [1]   بالا
  چاپ صفحه  
 
پرش به :