PDA

View Full Version : برنامه نویسی یک Console برای برنامه!!!.



پریسا نامدار
یک شنبه 03 آبان 1383, 15:55 عصر
سلام دوستان عزیز.
شاید تا حالا برنامه های زیادی دید که (غیر از دلفی و ...) برای کنترل برنامه از فرمانهای تعریف شده و پارمترهای روبروی اون استفاده میکنند.
میشه یه راهنمایی بکنید که در اصل الگوریتم و نحوه پیاده سازی و ساخت Console اینجور برنامه ها چطوریه.؟

azhdari
یک شنبه 03 آبان 1383, 17:11 عصر
منظور شما پاس دادن پارامتر به یک برنامه هست ؟
در این صورت از paramstr در برنامه میتوانید استفاده کنید برای مثال :



if paramstr(0)='/?' then
// goto help section
else
if paramstr(0)='/format' then
// goto format section



و همچنین با استفاده از paramcount میتوانید بفهمید که چند پارامتر به فایل EXE ارسال شده.

پریسا نامدار
دوشنبه 04 آبان 1383, 00:18 صبح
خیلی ممنون از جوابتون.
تویه برنامه هایی مثل Dos 6.22 هم همین طوری کار میکنن؟

مهدی کرامتی
دوشنبه 04 آبان 1383, 00:31 صبح
خیر، اونها باید با کامپایلرهای تحت داس ساخته شوند.

vcldeveloper
دوشنبه 04 آبان 1383, 01:56 صبح
تویه برنامه هایی مثل Dos 6.22 هم همین طوری کار میکنن؟
این فرمایش آقای کرامتی که باید از کامپایلر تحت داس استفاده کنید درسته، اما این نکته رو هم اضافه کنم که که ParamCount و ParamStr در Turbo Pascal هم همین کار رو انجام میدن، یعنی کامپایلرها متفاوته اما Syntax هر دو (در این مورد) یکسانه

پریسا نامدار
دوشنبه 04 آبان 1383, 03:47 صبح
ممنون از جوابهای عالیتون.
اما منظور اصلی من اینکه مثلا ما یه برنامه کنترل هواپیما داریم.
بعد این برنامه کنترل هواپیما 1000 نوع کار مختلف رو انجام میده و کاربر دقیقا میتونه هواپیما رو کنترل کنه.
مثلا : میزان گردش به چپ : 500 و یا چیزهایی مثل اینا.
حالا برنامه نویس واسه نوشتن فرمانها و پارامترها میاد داخل کل برنامه مینویسه
... if paramstr(0)='/?' then
و از هزار تا IF استفاده میکنه.؟؟؟

مهدی کرامتی
دوشنبه 04 آبان 1383, 04:13 صبح
1- این دیگه میشه یک سوال دیگه که با اولی فرق داره.

2- سوالتون رو واضح بپرسید. شما چی رو میخواهید بدونید؟ دقیق بپرسید تا دقیق جواب بگیرید.

azhdari
دوشنبه 04 آبان 1383, 12:11 عصر
خوب این دیگه بستگی به نظر خود برنامه نویس داره که به چه صورت عمل کنه مثلا
در صورتیکه یه روتین بنام rotateleft داشته باشه که این روتین پارامتر بگیره میتونه
مستقیما paramstr رو توش استفاده کنه مثلا اگر برنامه به این صورت صدا زده بشه :



project1.exe SETROTATION 100
OR
project1.exe CRASHRECOVERY 45 // <-- paramstr(2) may set to unit code


پس باید توی برنامه چیزی شبیه این نوشته باشه و یا از دستور case و.... استفاده کنه



if paramstr(1)='SETROTATION' then
rotateleftroutine(paramstr(2))
else
if paramstr(1)='CRASHRECOVERY' then
crashrecoveryroutine(paramstr(2)); // paramstr(2) is unit code
//... and so on

MSK
دوشنبه 04 آبان 1383, 14:05 عصر
اون طوری که من برداشت کردم منظور شما باید این باشه که برنامه ای می خواهید بنویسید که کنسول داشته باشه؟ :گیج:

اگه منظور شما اینه بگید تا جواب بگیرید. :متفکر:

پریسا نامدار
دوشنبه 04 آبان 1383, 20:35 عصر
دقیقا منظورم همین هست. :)

Sepidar
دوشنبه 04 آبان 1383, 22:03 عصر
در موردی که می خواهید برنامتون کنسول داشته باشه 2 حالت داره:

1. تعداد دستورها کمند: در این حالت پینهاد من اینه که خودتون رو به دردسر نندازید. با یه سینتکس ساده و ارجاع به پروسیجر مربوطه خیلی راحت این کار رو میشه انجام داد:

{GLOBAL}
type
TConsoleAct=procedure(param:string);
ConsoleInput:string;
var
Reactions:array[char]:TConsoleAct;
....
{after getting instruction}
Reactions[ConsoleInput[1]](copy(ConsoleInput,2,len gth(ConsoleInput)-1);
.
.
.
{somewhere else}
//write code for proces that u want in format of TConsoleAct
.
.
{in initialization of program}
//set right values for Reactions
البته کد فوق الگوی کلی کار را نشان میدهد و توضیحات و کار و اپتیمایزیشن بیشتری میطلبد....

2. در صورتی که تعداد دستورات شما زیاد است بهتره به نظر من بهتره از یه درخت تصمیمگیری استفاده کنید (و اگر این درخت را به صورت مستقل از برنامه طراحی کنید به مراتب بهتر است، زیرا در این صورت به راحتی میتوانید در آینده بدون تغییر زیاد در کد، آنرا اصلاح کنید. چیزی شبیه «زبان توصیف زبان»)

MSK
شنبه 09 آبان 1383, 22:06 عصر
جواب بالا حالت کلی مسپلس.

جواب اختصاصی تر به این بستگی داره که در واقع شکل کدی که برنامه می گیره چجوریه؟

اگه قراره یه سری پروسیجر و فانکشن سمبولیک و مشخص با پارامترهای معلوم دریافت کنی من پیشنهاد میکنم رشته ورودی رو دریافت کنی و با یه case بلندبالا مشخص کنی کدوم یکی دستوره و یه کد اختصاصی که نماینده اون پروسیجره همراه با رشته پارامتر ها به تابعی که نقش کامپایلر داره رد کنی و در داخل اون عملیات مورد نظر رو انجام میدی.

مثلا فرض کن دستور داخل رشته s قرار داره و شکل کلی دستور به شکل: دستور(فاصله)پارامتر.
حالا با تابع pos جای فاصله پیدا میشه و این طوری s رو به دو رشته s1 و s2 که در اولی دستور و در دومی پارامتره تفکیک میکنی.حالا با یه کیس عدد معادل s1 رو که بطور قرار دادی مشخص کردی پیدا می کنی و همراه s2 به پروسیجر کامپایلر رد می کنی و در اونجا هم با یه کیس عملیات مورد نیاز رو انجام میدی.

ببخشید سرتو درد آوردم ولی من خودم سر همچین موردی خیلی معطل شده بودم. میخواستم به درد من دچار نشی. :wink: