PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : کی پاسکال بلده ؟



Sajad
January 14th, 2010, 13:25
سلام
از دوستانی که پاسکال بلدند برای کمک به جمعی از دانشجویان دعوت به عمل می آید :53:
والا امروز یکی از دوستانی که باهاش رودرواسی داشتم باهام تماس گرفت و گفت که تو درسش نمره کم داره و اگه این پروژه رو ببره نمره قبولی رو میاره. ما هم حس جوانمردیمون گل کرد و گفتیم یه کاریش میکنیم برات و از دوستامون میپرسیم ... :105:
ایشونم پر رو شد و گفت دمت گرم حالا که اینکار و میکنی چهار تا تغییر بده توش و چهار تا پروژه بده تا به بقیه دوستامم بدم :-$

اصل پروژه اینه که هر string به ورودی دادیم اون رو تفکیک کنه و بعد هم حساب کنه اون رو (عبارت ریاضی)
مثلا:

sin(90)+cos(0)-25*80

رو بتونه حساب کنه ... رایکال و رگاریتم و توان و مابقی چیزها هم بتونه حساب کنه !!
اما گفت از متعلقاتش فاکتور بگیر و یه چیزی بنویس که بتونه چهار عمل اصلی رو حساب کنه !
یعنی

25*66/456+36-55

رو حساب کنه کافیه !!!! بعد گفت اگه اینم سخته یه چیزی رو بنویس که دو تا عدد رو بتونه روش عملهای اصلی رو انجام بده هم کافیه !!!
یعنی مثلا

445*5656

انجام بده کافیه...

حالا از دوستان اگه کسی میتونه نحوه کار رو بگه من خودم شاید بتونم یکاریش بکنم...
اگر هم بتونه بنویسه که دیگه خیلی خیلی بهتر میشه...
فکر کنم بهترین روش هم postfix باشه ؟

حالا یه خیری پیدا بشه و مددی برسونه این چهار نفر نمره بگیرن @-) :63:

RezaFH
January 14th, 2010, 16:40
حالا بالاخره کدوم لازمه ؟ :d
من یخورده بلدم (یعنی درسمه مثلا باید کامل بلد باشم ... :"> )
چند تا هم برنامه ی آماده دارم که میتونم بنویسم :d

Sajad
January 14th, 2010, 21:09
اولویت بندی کردم دیگه !
اگه کسی اولی رو بتونه بگه چجوریه که خیلی عالی میشه !
دومی بگه بازم خوبه !
سومی هم بگه کار راه انداز هست !

Mohsen
January 14th, 2010, 22:51
والا من پاسکال بلد نیستم!
اما برای منطق برنامه می‌تونم راهنمایی‌تون کنم
اول از همه ورودی رو می‌گیرید و می‌ریزید تو یه رشته!
در مرحله دوم این رشته رو تفکیک می‌کیند یعنی عدد‌ها رو از بقیه چیز‌ها جدا می‌کنید و می‌ریزید تو یه آرایه!
تفکیک عدد از بقیه چیزها هم که کاری نداره! تو رشته میرین جلو و هی تا جایی که رقم هست در 10 ضرب می‌کنید با رقم جدید جمع می‌کنید تا برسید به جایی که رقم نیست!
یه مثال بزنم:
مثلا ورودی بوده


(52+3)*4

خوب اینجا اول پذرانتز باز رو می خونید که چون رقم نیست می‌ریزیدش تو یه خونه آرایه بعد 5 رو می‌خونید که عدد هست و می‌ریزیدش تو یه متغیر، بعد 2 رو می‌خونید که رقم هست، 5 رو در 10 ضرب می‌کنید و با 2 جمع می‌کنید و دوباره تو همون متغیر نگه می‌دارید. حالا علامت + رو می‌خونید که چون رقم نیست، 52 رو تو یه خونه آرایه می‌ریزید و + رو تو یه خونه و به همین ترتیب ادامه می‌دید، آخر سر تو یه آرایه عدد‌ها و عملگر‌ها رو جدا جدا دارید. اگه بخواید سینوس و اینا هم حساب کنه این مرحله یه خورده طولانی تر میشه ولی اونم خیلی سخت نیست.
خوب حالا که عملوندها و عملگرها تفکیک شدند، باید حساب کنید و اینجا هست که باید اولویت عملگرها و پرانتز رو لحاظ کنید!
خوب برای راحت تر شدن محاسبه باید فرم میانوندی یا همون اینفیکس رو به postfix تبدیل کنید که الگوریتمش به صورت زیر هست:
1- عبارت infix رو از چپ به راست پیمایش می‌کنیم(از اول آرایه به آخرش)
2- پرانتزهای سمت چپ (پرانتز باز) رو تو استک پوش می‌کنیم
3- هنگامی که به یک عملوند می‌رسیم آن را در یک صف می‌نویسیم.
4- هنگامی که به یک عملگر می‌رسیم آن‌گاه عملگرهای بالای استک را که دارای اولویتی یکسان یا بالاتر از آن هستند پاپ می‌کنیم و در صف می‌ریزیم و سپس عملگر را در استک پوش می‌کنیم
5- هنگامی که به پرانتز سمت راست (پرانتز بسته) می‌رسیم آن‌گاه عملگرهای بالای استک را پاپ کرده و در صف می‌ریزیم تا زمانی که به پرانتز سمت چپ استک برسیم و آن را پاپ می‌کنیم.

اینجا اگه بخوای کلاس بزاری می تونی صف رو چاپ کنی که معلوم بشه فرم postfix رو حساب کردی!

خوب بعد از به دست آوردن فرم postfix کار محاسبه آسون هست و باید از سر صف عملوند ها رو برداری تا برسی به عملگر، بعد عملگر رو اعمال کنی و نتیجه رو دوباره بزاری سر صف! پرانتزی هم که نمونده! آخر دست نتیجه به دست میاد! البته میشه مستقیم هم محاسبه کرد، الگوریتم مستقیمش شبیه همین هست الان دقیقش یادم نمیاد!

نکته:
1- اگه منفی تک عملوندی داری (منفی که عدد رو منفی میکنه!) باید علامت خاصی براش تعریف بشه و ...
2- سینوس و اینا رو هم بخوای بزاری یه خورده سخت تر میشه!
3- امیدوارم تونسته باشم توضیح بدم! کد سی این رو یه زمانی به عنوان تکلیف داشتیم، اما پیداش نکردم که براتون بزارمش!
4- اینم یه نمونه ساده از کار کرد برنامه!


vorudi: ((52+34)*(23+34))
tabdil be araye:
( ( 52 + 34 ) * ( 23 + 34 ) )
tabdil be postfix:
saf: 52 34 + 23 34 + *

mohasebat: saf:52 34 + 23 34 + *
a)52+34=86 saf:86 23 34 + *
b)23+34=57 saf:86 57 *
c)57*86=4092 saf:4092

khoruji=4092

Sajad
January 14th, 2010, 23:12
توضیحاتت دقیق بود تسنیم جان...
اون برنامه که میگی داشتی به زبان سی رو اگه بیزحمت بتونی بذاری خیلی خوب میشه...
٫
rezafh2 (http://www.webhostingtalk.ir/members/rezafh2/) جان نتیجه چه شد؟

Mohsen
January 14th, 2010, 23:35
متاسفانه پیداش نکردم!
شما میخوای همون حالت سوم رو فعلا براشون بنویس چون خیلی آسون هست و هیچ کدوم اون کارا رو نمی‌خواد! بعد اگه رسیدی و شد اون دو حالت رو بهش فکر کن!
تو حالت سوم، شما فقط باید دو تا عدد و عملگر رو تشخیص بدی و اون عملگر رو روش اعمال کنی! دیگه اولویت و تبدیل و اینا نمی‌خواد!
حالا من بازم میگردم رو هاردم رو، ولی اون جایی که باید می‌بود، نبود، بعید می‌دونم جای دیگه باشه.

Sajad
January 15th, 2010, 00:00
والا منطق کار برنامه رو میدونم اما چجوری به زبان ماشین ترجمه کنم که این بیچاره بفهمه رو قاطی کردم...

Mohsen
January 15th, 2010, 00:10
والا منطق کار برنامه رو میدونم اما چجوری به زبان ماشین ترجمه کنم که این بیچاره بفهمه رو قاطی کردم...

زبان ماشین! اسمبلی که منظورتون نیست؟!؟ فکر کنم منظورتون همون نوشتن برنامه هست!
خوب پاسکال که شی‌گرا نیست! مثل c تابع می‌نویسند دیگه!
برای هر کدوم از اون کارا یه تابع بنویسید!
مثلا یه تابع برای تبدیل رشته ورودی به آرایه
یه تابع برای تبدیل آرایه به حالت postfix و به همین ترتیب
به تابع‌های پاسکال البته فکر میکنم میگن پروسیجر! و مقداری هم که بر می‌گردونند با متغییری هست که هم نام تابع هست، return و اینا ندارند! (هیچی c نمیشه!)
بگذریم! تابع‌ها رو هر چقدر کوچیک تر کنید فهمیدن برنامه آسون تر میشه! یه مقدار سواد اولیه البته میخواد که اگه ندارن، شما بی خودی داری خودت رو اذیت می‌کنی!

RezaFH
January 15th, 2010, 00:45
منظورم این بود که میشه یه چیز دیگه هم نوشت ؟
دومی و سومی ساده هستن
بذارید من مثال بنویسم :

برنامه ای که 10 عدد صحیح را بگیرد و در آرایه ها ذخیره کند . سپس تعداد اعداد زوج را نمایش دهد ! :d

روال نوشتن برنامه به این شکل هست :


program t1;
var
i,m:integer;
no:array[1..10] of integer;
begin
writeln ('please enter your numbers :')
for i:= 1 to 10 do
readln (no [i] mod 2=0 then
m:=m+1;
writeln (' teedAde aadAde zooj =')
end.

در اینجا وقتی ورودی ها گرفته میشن ، در آرایه ها ذخیره میشن
مثلا :[no[1 میشه عدد اول و بعد فراخوانی میشه و توی کارهای بعدی استفاده میشه

راستش امتحان دارم و نمیرسم بشینم بنویسم
اگه وقت هست بگید ، فردا صبح مینویسم

Sajad
January 15th, 2010, 00:57
به functionهای پاسکال نمیگن procedure. هر کدومشون یه چیز جدا هستند.
که البته فانکشن رو به صورت پروسیجر هم میشه نوشت...
کار نداریم.

من خودم صبح یه کارایی خواستم بکنم اما قاطی کردم :-s
اولین کاری که کردم بعد از گرفتن رشته و اندازه گرفتن طول اون شروع کردم به verify کردن تک تک اون ...
یعنی چک کردم که اون استرینگ شامل اعداد ۰..۹ باشه و یا اپراتورهای × ÷ − + باشه و اگه چیز دیگه ای هست اخطار بده !
اگر استرینگ بدین صورت بهش میدادیم sfsfgsggs خطا میگرفت اگر 2232+2323 میدادی خطا نمیگرفت.
اما یه مشکلی داشت که اگر 3243ddf232+3434 هم بهش میدادی خطا نمیگرفت :( در حالی که ddf وقتی اون وسط هست باید خطا میداد ؟

---------- Post added at 12:57 AM ---------- Previous post was at 12:48 AM ----------


منظورم این بود که میشه یه چیز دیگه هم نوشت ؟
دومی و سومی ساده هستن
بذارید من مثال بنویسم :

برنامه ای که 10 عدد صحیح را بگیرد و در آرایه ها ذخیره کند . سپس تعداد اعداد زوج را نمایش دهد ! :d

روال نوشتن برنامه به این شکل هست :


program t1;
var
i,m:integer;
no:array[1..10] of integer;
begin
writeln ('please enter your numbers :')
for i:= 1 to 10 do
readln (no [i] mod 2=0 then
m:=m+1;
writeln (' teedAde aadAde zooj =')
end.در اینجا وقتی ورودی ها گرفته میشن ، در آرایه ها ذخیره میشن
مثلا :[no[1 میشه عدد اول و بعد فراخوانی میشه و توی کارهای بعدی استفاده میشه

راستش امتحان دارم و نمیرسم بشینم بنویسم
اگه وقت هست بگید ، فردا صبح مینویسم
ظاهرا فقط همین رو میشه نوشت که همه گفتن یه برنامه بنویسم دیگه :d اگه دلخواهی بود همشون اینو نمیگفتن . راست راست هم کلیک نمیکردن رو این !

از لحاظ وقت مشکلی نیست تا شنبه صبح وقت دارن ببرن...

من خودم کلا با حل مسائل ریاضی مشکل دارم چه برسه برنامه ای بخوام بنویسم که عبارت ریاضی رو حل کنه :d

Mohsen
January 15th, 2010, 01:02
اگر استرینگ بدین صورت بهش میدادیم sfsfgsggs خطا میگرفت اگر 2232+2323 میدادی خطا نمیگرفت.
اما یه مشکلی داشت که اگر 3243ddf232+3434 هم بهش میدادی خطا نمیگرفت :( در حالی که ddf وقتی اون وسط هست باید خطا میداد ؟



کد رو بزارین یا پ.خ. کنین، شاید فهمیدم مشکلش چیه! احتمالا روش درستی برای چک کردن انتخاب نکردین!

RezaFH
January 15th, 2010, 01:09
راستی برای مثلا سینوس و کسینوس هم توابع کتابخانه ای توی پاسکال ذخیره شده مثلا این برنامه سینوس عدد 10 رو میگیره :


program sin;
var
x:real;
x:=sin(10);
write ('sin 10 =',x)
end.

به جای sin میشه از cos (کسینوس) و (آرک تانژانت) arctan هم استفاده کرد

---------- Post added at 01:09 AM ---------- Previous post was at 01:04 AM ----------


اما یه مشکلی داشت که اگر 3243ddf232+3434 هم بهش میدادی خطا نمیگرفت در حالی که ddf وقتی اون وسط هست باید خطا میداد ؟


فکر کنم باید اون رو integer تعریف کنید (اعداد صحیح)
real میشه اعداد حقیقی

البته منم از ریاضی سر در نمیارم ، اما یذره برنامه نوشتن بلدم (فقط یه ذره) :d

راستی میتونید من رو رضا صدا کنید (از rezafh2 راحت تره :-p )

Sajad
January 15th, 2010, 03:21
مشکل اجرای غیر صحیح چک کردن رو با کمک تسنیم حل کردیم.
مشکل اینجا بود که begin end برای اجرای چک کردن همش نذاشته بودم....

حالا یه چیز دیگه.
من توی حلقه for هستم ! حالا میخوام ازش خارج شم ! دستور exit باید بزنم درسته ؟ ولی exit که میزنم کلا برنامه بسته میشه ! چیکار باید کرد ؟
چطوری میتونم تو برنامه بهش بگم برو خط فلان برنامه رو اجرا کن.
یعنی بگم تا اینجا خوندی دستت درد نکنه حالا برو از خط ۱۰۰ ادامه کارتو انجام بده :-s

1eng.ir
January 15th, 2010, 03:26
چطوری میتونم تو برنامه بهش بگم برو خط فلان برنامه رو اجرا کن.
تو برنامه نویسی همچین دستوری پیشنهاد نمیشه کما اینکه تو زبان سی با دستور goto میتونی بری به یه قسمت خاصی از برنامه! تو پاسکال رو دقیق نمیدونم چی میشه.

پروژت چیه ؟
همون چیزی که چند وقت پیش بم گفتی ؟ عملیات ریاضی و ... ؟

Sajad
January 15th, 2010, 03:42
پروژت چیه ؟
همون چیزی که چند وقت پیش بم گفتی ؟ عملیات ریاضی و ... ؟

هزار تا خط توضیح دادم.
آره همونه....

RezaFH
January 15th, 2010, 09:31
سلام
توی پاسکال حلقه for فقط دستور بعد از خودش رو انجام میده و بعد میره دستور بعدی
اگر تعداد دستوراتی که باید توی حلقه باشن ، زیاد باشه ، میتونید از یه brgin و end; بعد از حلقه استفاده کنید و دستورات مورد نیاز داخل اون باشن

Sajad
January 15th, 2010, 11:05
آره begin end یادم رفته بود که تسنیم یادآوری کرد...

بابت اینکه چطوری از حلقه خارج بشیم هم یادم اومد. باید از break استفاده میشد.

حالا چک کردن اینکه جمله شامل عدد و اپراتور هست حل شد.
جمله رو چک میکنه و هر کدوم رو به صورت جداگونه توی یه خونه از آرایه میذاره.

چیزی که الان به ذهنم میرسه اینه که حالا توی آرایه سرچ کنه و اپراتور رو پیدا کنه... اون رو بذاره به عنوان اپراتور. خونه های قبلیش باشه عدد اول و خونه های بعدی باشه عدد دوم ؟
نظرتون چیه ؟

Mohsen
January 15th, 2010, 11:49
مشکل اجرای غیر صحیح چک کردن رو با کمک تسنیم حل کردیم.
مشکل اینجا بود که begin end برای اجرای چک کردن همش نذاشته بودم....

حالا یه چیز دیگه.
من توی حلقه for هستم ! حالا میخوام ازش خارج شم ! دستور exit باید بزنم درسته ؟ ولی exit که میزنم کلا برنامه بسته میشه ! چیکار باید کرد ؟
چطوری میتونم تو برنامه بهش بگم برو خط فلان برنامه رو اجرا کن.
یعنی بگم تا اینجا خوندی دستت درد نکنه حالا برو از خط ۱۰۰ ادامه کارتو انجام بده :-s


تو c دو تا دستور برای این کار (خروج از حلقه) داریم، break و continue که هر کدوم کاربرد خودش رو داره، تو پاسکال هم باید مشابه‌اش باشه!

---------- Post added at 11:49 AM ---------- Previous post was at 11:46 AM ----------


آره begin end یادم رفته بود که تسنیم یادآوری کرد...

بابت اینکه چطوری از حلقه خارج بشیم هم یادم اومد. باید از break استفاده میشد.

حالا چک کردن اینکه جمله شامل عدد و اپراتور هست حل شد.
جمله رو چک میکنه و هر کدوم رو به صورت جداگونه توی یه خونه از آرایه میذاره.

چیزی که الان به ذهنم میرسه اینه که حالا توی آرایه سرچ کنه و اپراتور رو پیدا کنه... اون رو بذاره به عنوان اپراتور. خونه های قبلیش باشه عدد اول و خونه های بعدی باشه عدد دوم ؟
نظرتون چیه ؟

شما الان می‌خواین برنامه‌ای بنویسید که فقط دو تا عدد رو بگیره؟ یعنی همون برنامه سوم!
خوب راه‌تون درسته. از اول آرایه شروع کنید تا وقتی به عملگر نرسیدید هی در 10 ضرب کنید و با بعدی جمع کنید و برید جلو، به عملگر که رسیدید عدد اول آماده شده، برای عدد دوم هم همین کار رو بکنید، بعد هم عملگر رو بهشون اعمال کنید و نتیجه رو چاپ کنید!

RezaFH
January 15th, 2010, 12:49
برای ضرب دو عدد اصلا این چیزا نیاز نیست
شما دو تا عدد رو در دو تا متغیر میگیرید و بعد اونها رو در هم ضرب میکنید و در آخر نمایش جواب !


program t2;
var
a,b:integer;
begin
writeln ('please enter your first number :');
read (a);
writeln ('please enter your secound number :');
read (b);
writeln ( a,'*',b,'=',a*b );
end.

چیزی که نمایش داده میشه فکر کنم اینطوری باشه :


please enter your first number : 312

please enter your secound number : 42

312 * 42 = 13104

همین ! (عدد a گرفته میشود و بعد عدد b و بعد در هم ضرب شده و جواب نمایش داده میشود)
البته این فقط برای ضرب بود .
برای اینکه یکم پیشرفته تر بشه میشه یه متغیر هم برای عملگر ( علامتهای ضرب و تقسیم و ... ) از ورودی گرفت

Mohsen
January 15th, 2010, 13:18
برای ضرب دو عدد اصلا این چیزا نیاز نیست
شما دو تا عدد رو در دو تا متغیر میگیرید و بعد اونها رو در هم ضرب میکنید و در آخر نمایش جواب !


program t2;
var
a,b:integer;
begin
writeln ('please enter your first number :');
read (a);
writeln ('please enter your secound number :');
read (b);
writeln ( a,'*',b,'=',a*b );
end.

چیزی که نمایش داده میشه فکر کنم اینطوری باشه :


please enter your first number : 312

please enter your secound number : 42

312 * 42 = 13104

همین ! (عدد a گرفته میشود و بعد عدد b و بعد در هم ضرب شده و جواب نمایش داده میشود)
البته این فقط برای ضرب بود .
برای اینکه یکم پیشرفته تر بشه میشه یه متغیر هم برای عملگر ( علامتهای ضرب و تقسیم و ... ) از ورودی گرفت

دوست عزیز شما صورت مساله رو پیچوندین!
اینی که شما میگین این میشه که عددها رو جدا بگیرن و علمگر رو جدا و اعمال کنن بره!
اما صورت مساله میخواد یه رشته از ورودی گرفته بشه! نه اینکه عددها جدا جدا گرفته بشه!
اون طوری که شما میگین زیادی آسون میشه!

RezaFH
January 15th, 2010, 13:51
ببخشید من متوجه نشدم که باید در یک رشته وارد بشه
در اینجا هم میشه از while استفاده کرد
به معنی و کاربرد "تا زمانی که"

Sajad
January 15th, 2010, 18:29
ببخشید من متوجه نشدم که باید در یک رشته وارد بشه
در اینجا هم میشه از while استفاده کرد
به معنی و کاربرد "تا زمانی که"
it is ok
همینه....
سه تا while لازم هست...
حالا این whileها چیکارا میکرد رو دقیق یادم نیست.
آقا رضا اگه شما صورت مسئله اومد تو ذهنت بی زحمت بنویسش که من شبی بشینم تغییرش بدم ۴ تاش کنم که فردا صب بدم اینا ببرن دعات کنن... :52:

---------- Post added at 05:58 PM ---------- Previous post was at 05:50 PM ----------


تو c دو تا دستور برای این کار (خروج از حلقه) داریم، break و continue که هر کدوم کاربرد خودش رو داره، تو پاسکال هم باید مشابه‌اش باشه!

break از حلقه خارج میشه.
continue به اول حلقه میبرتت

قبل از اینکه شما پست بزنید خودم یادم اومد و پستم رو ادیت کردم...

---------- Post added at 06:29 PM ---------- Previous post was at 05:58 PM ----------


برای ضرب دو عدد اصلا این چیزا نیاز نیست
شما دو تا عدد رو در دو تا متغیر میگیرید و بعد اونها رو در هم ضرب میکنید و در آخر نمایش جواب !


program t2;
var
a,b:integer;
begin
writeln ('please enter your first number :');
read (a);
writeln ('please enter your secound number :');
read (b);
writeln ( a,'*',b,'=',a*b );
end.چیزی که نمایش داده میشه فکر کنم اینطوری باشه :


please enter your first number : 312

please enter your secound number : 42

312 * 42 = 13104همین ! (عدد a گرفته میشود و بعد عدد b و بعد در هم ضرب شده و جواب نمایش داده میشود)
البته این فقط برای ضرب بود .
برای اینکه یکم پیشرفته تر بشه میشه یه متغیر هم برای عملگر ( علامتهای ضرب و تقسیم و ... ) از ورودی گرفت

:104: بیا اینم برا بقیه عمل ها ! مساله اینجاست ورودی که برنامه ما باید بگیره string هست که قابل محاسبه نیست.
البته این میتونی جزئی از برنامه بذاریم و بعد از اینکه عدد اول پیدا کردیم = a و عدد دوم رو = b و اپراتور هم که = op بذاریم که حلش کنه...



uses
crt;

var
a,b:real;
op:char;

begin
clrscr;
write ('please enter two number: ');
readln (a,b);
writeln;
write ('please enter a operator: ');
readln (op);
writeln;
case op of
'+' : writeln ('sum: ',(a+b));
'-' : writeln ('subtract: ',(a-b));
'*' : writeln ('multiple: ',(a*b));
'/' : writeln (' divide: ',(a/b));
end;

writeln;
writeln ('Press Enter To Exit');
readln;
end.

Sajad
January 16th, 2010, 01:13
این while چی شد‌؟

RezaFH
January 16th, 2010, 19:29
نمیدونم چرا وقتی به اینا فکر میکنم مغذم قفل میکنه ! :d

یه مثال شاید کمک کنه :


program 3;
var
count:integer;
ch:char;
begin
writeln ('please enter statment');
read (ch);
while ch <> '.' do
begin
if (ch = 't') or ( ch = 'T') then
count=count+1;
readln (ch);
end;
writeln ('number of characters =',count);
end.

این برنامه کاراکتر های حرف t (و T) رو پیدا میکنه و میشماره !

دوشنبه خودم امتحان پاسکال دارم :((
اگه شما با اینا نتونستین کاری بکنین تا شب بازم فکر میکنم
اگه چیزی به ذهنم رسید میگم

Sajad
January 16th, 2010, 19:46
میگم رضا جان من خودم پاسکال کار کردم و این برنامه ها که شما میگی رو مث بلبل میتونم بنویسم.
مساله ما الان این پروژه هست و با این مشکل داریم که البته اگه الگوریتم دقیقش رو بفهمم میتونم بنویسم.
یه الگوریتمی رو خودم الان بهش رسیدم و با این الگوریتم دو تا از پروژه ها رو میتونم اوکی کنم (آخرش رو به ۲ صورت مینویسم!) انشالا آخر شب مینویسم اینجا هم میذارم.
اما اون روش while که کوتاه و مفید هست اصل کاری هست که اون نوشته بشه خیلی محشره... من خودم این دو تا رو به یه روش دیگه نوشتمش..

najmehdj
January 17th, 2010, 09:43
تو برنامه نویسی همچین دستوری پیشنهاد نمیشه کما اینکه تو زبان سی با دستور goto میتونی بری به یه قسمت خاصی از برنامه! تو پاسکال رو دقیق نمیدونم چی میشه.

پروژت چیه ؟
همون چیزی که چند وقت پیش بم گفتی ؟ عملیات ریاضی و ... ؟
دیگه توی کتب پاسکال که درس میدن دستور gotoجز سرفصل نیست پس نمیتونی برای پروزه کلاسی از این دستور استفاده کرد

Sajad
January 19th, 2010, 13:58
خیلی بهتر از این میشه نوشت ! ولی حالا اینو داشته باشید شاید لازمتون شد L-)



uses

crt;

var

adad: array [1..255] of integer;
inter,tak,amal:string;
e,c,w,i,j,tol,io,v,z,y,iop:integer;
adad1,adad2:longint;
op,opera:char;
flag:boolean;
save:text;

begin

clrscr;
write ('Please Inter Formula (for example 2+3) : ');
repeat
flag:=true;
readln (inter);
tol:= length(inter);
if tol=0 then
begin
write ('it is blank... please try again: ');
flag:=false;
end;
for i:= 1 to tol do
begin
tak:= inter [i];
if tak='0' then adad [i]:= 0 else
if tak='1' then adad [i]:= 1 else
if tak='2' then adad [i]:= 2 else
if tak='3' then adad [i]:= 3 else
if tak='4' then adad [i]:= 4 else
if tak='5' then adad [i]:= 5 else
if tak='6' then adad [i]:= 6 else
if tak='7' then adad [i]:= 7 else
if tak='8' then adad [i]:= 8 else
if tak='9' then adad [i]:= 9 else
if tak='+' then adad [i]:= 10 else
if tak='-' then adad [i]:= 20 else
if tak='/' then adad [i]:= 30 else
if tak='*' then adad [i]:= 40 else
begin
write ('invalid format. please try again: ');
flag:=false;
break;
end;
end;
for i:= 1 to tol do
begin
j:=adad[i];
if (j=10) or (j=20) or (j=30) or (j=40) then
begin
z:=i+1;
for c:= z to tol do
begin
y:=adad[c];
if (y=10) or (y=20) or (y=30) or (y=40) then
begin
write ('invalid format. please try again: ');
flag:=false;
break;
end;
end;

end;
end;
v:=adad[1];
if (v=10) or (v=20) or (v=30) or (v=40) then
begin
write ('invalid format. please try again: ');
flag:=false;
end;
w:=adad[tol];
if (w=10) or (w=20) or (w=30) or (w=40) then
begin
write ('invalid format. please try again: ');
flag:=false;
end;

for i := 2 to tol-1 do
begin
w:=adad[i];
if (w=10) or (w=20) or (w=30) or (w=40) then
begin
io:=adad[i];
iop:=i;
break;
end
else
if (i=tol-1) then
begin
write ('invalid format. please try again: ');
flag:=false;
end;

end;
until flag=true;
case io of
10 : op:='+';
20 : op:='-';
30 : op:='/';
40 : op:='*';
end;

assign (save,'save.dat');
rewrite (save);
writeln (save,op);
for i:= 1 to iop-1 do
write (save,adad[i]);
writeln(save,'');
for i:= iop+1 to tol do
write (save,adad[i]);
close (save);
reset (save);
readln (save,opera);
readln (save,adad1);
readln (save,adad2);
close(save);

writeln (adad1,' ',opera,' ',adad2);
write ('Result: ');
case opera of
'+' : Write (adad1+adad2);
'-' : Write (adad1-adad2);
'*' : Write (adad1*adad2);
'/' : Write (adad1/adad2);
end;
writeln;
write ('Press enter to exit...');
readln;
end.