انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => برنامه‌سازی => نویسنده: محمدرضا ح. در 05 دی 1393، 12:35 ق‌ظ

عنوان: تاپیک آموزش زبان برنامه نویسی Ruby (حلقه های تکرار)
ارسال شده توسط: محمدرضا ح. در 05 دی 1393، 12:35 ق‌ظ
با سلام خدمت تک تک خوانندگان این تاپیک، و اعضای محترم انجمن.

روبی، یک زبان سطح بالا، شیء گرا و اسکریپتی هست که توسط یک شخص ژاپنی به اسم Yukihiro Matsumoto طراحی شده. وبسایت این زبان در این آدرس (http://ruby-lang.org) قرار داره، و میتونید آخرین ویرایش این زبان رو بسته به سیستم عاملتون، از این وبسایت، دریافت کنید.
در این تاپیک، قصد دارم اصولی از این زبان رو مطرح کنم، و باقیش رو بزارم به عهده خودتون :D . کاربرد این زبان، در ساخت برنامه های کاربردی، نوشتن backend وبسایت ها و ... است.

قدم اول : نصب در اوبونتو

خب مفسر این زبان در اوبونتو به راحتی با دستور زیر قابل نصب هست :
sudo apt-get install ruby
قدم دوم : آشنایی با محیط توسعه و شل اینتراکتیو

آیا تابحال دستور python رو اجرا کردید؟ دیدید که این دستور، چه کار میکنه؟ بله! یک Interactive Shell به شما نشون میده! و شما میتونید دستورات مورد نظرتون رو در اون شل وارد کنید و نتیجه رو در لحظه مشاهده کنید!!
برای دسترسی به شل اینتراکتیو روبی، کافیه تا دستور زیر رو در ترمینال بزنید :
irbو حالا بهتره که به جهان سلام کنید!
درون شل اینتراکتیو این دستور رو وارد کنید :
puts "Hello, World!"و این اولین خط کدی هست که شما در روبی نوشتید! تبریک :)
خب، طبیعی است که تا ابد الدهر نمیشه در شل اینتراکتیو برنامه نوشت، و مجبوریم که حتما کدها رو درون یک فایل بریزیم و اون رو هر موقع که میخوایم اجرا کنیم، فراخوانی کنیم!
به عنوان ادیتور، ادیتوری که پیشفرض میزکارتون نصب هست کفایت میکنه، بخصوص gedit و kate که هر دو محیط های خوبی برای کدنویسی هستند، اگر هم میخواید کمی بهتر و پیشرفته تر کار کنید، میتونید geany رو نصب کنید.
یک فایل به اسم HelloWorld.rb ایجاد کنید (*.rb پسوند فایلهای روبی هست)، و درونش این کدها رو بنویسید :
puts "Hello, World!"
با فرض اینکه این فایل رو روی دسکتاپ ایجاد کردید، میریم تا تفسیرش کنیم! پس این دستور رو در ترمینال اجرا کنید :
$ruby ~/Desktop/HelloWorld.rb
و بعد باید عبارتی که خواستیم رو برامون چاپ کنه.
تا اینجا، آشنایی بسیار خوبی با روبی پیدا کردید. در ادامه، روش نوشتن تابع، دستورات شرطی، آرایه و دیکشنری رو با هم بررسی میکنیم.

قدم سوم : آشنایی با متغیرها و عملگرها

اینجا هم مثل پایتون، نیازی نیست تا نوع متغیر ها رو تعریف کنید، فقط کافیه که به متغیر با اسم دلخواه، مقداری رو نسبت بدید. (نکته مهم : به هیچ عنوان از کلمات کلیدی و رزرو شده زبان، به عنوان نام متغیر استفاده نکنید)

خب در کد زیر من چند متغیر رو مقدار دهی کردم :
a = 2
b = 3
name = "Muhammadreza"

در صورت اجرای کد فوق، هیچ نتیجه ای رو به عنوان خروجی دریافت نخواهید کرد، اما نگران نباشید، چرا که کد شما درست کار میکنه، شما فقط متغیرها رو فراخوانی نکردید.
خب، ما سه متغیر بالا رو داریم، میخوایم روی اونها، عملیات ویژه انجام بدیم، پس نیاز داریم تا عملگرها رو بشناسیم! همونطور که میدونید، هرزبانی عملگرهای خاص خودش رو داره، و اگر کار با این عملگرها رو بلد باشید، به راحتی میتونید برنامه های دلخواهتون رو بنویسید (البته دونستن عملگرها برای برنامه نویس شدن به تنهایی کافی نیست!) .

خب عملگرهای + (جمع) ، - (تفریق)، * (ضرب) ، / (تقسیم) و ٪ (باقی مانده) در این زبان با سایر زبان ها مشترکه :
a+b
a-b
a/b
a*b
a%b

با قرار دادن عبارت puts جلوی هر خط، میتونید نتیجه رو بررسی کنید!
عملگر توان‌رسانی در این زبان، با زبان پایتون مشترک هست و اگر میخواید a رو به توان b برسونید باید مشابه زیر عمل کنید :
a**b
و این به این معناست که شما تا الان کار با متغیر ها رو هم یاد گرفتید. متغیر سوم، از نوع متنی هست، و در قدم چهارم، سعی داریم تا روی متن ها کار کنیم. بعد از یادگیری کار با متن ها، میریم به سراغ توابع و چند تابع ساده برای کار با اعداد و متون مینویسیم.

قدم چهارم : روبی با متن ها چه میکند؟

خب، در قدم قبلی، یک متغیر متنی ایجاد کردم، به اسم name و اسم خودم رو درونش گذاشتم. قصدم از این کار، نمایش توانایی های روبی، در کار با متن بود. خب، اولین کاری که باید بکنیم اینه، به اسم خودمون سلام کنیم :)
puts "Hello, " + name
خب عملگر + (و *) میتونن روی متن هم اعمال بشن، بدون مشکل. پس نتیجه به این شکل خواهد بود :
Hello, Muhammadreza
و این نشون میده که ما در کارمون موفق بودیم. حالا نیاز داریم تا ببینیم متن چه ویژگی هایی داره!

طول متن : روبی یک خاصیت خوب برای متون در نظر گرفته. مثلا اسم من با حروف لاتین (Muhammadreza) ، دوازده کاراکتر داره، و میتونم با استفاده از خاصیت length در روبی، به این مقدار دسترسی پیدا کنم :

name.length
کاراکترهای تشکیل دهنده و پیمایش آنها: یکی از راه هایی که باهاش بشه فهمید مثلا کاراکتر n ام کدوم هست، استفاده از خاصیتی مشترک بین روبی و پایتون هست :
name[n]
نکته بسیار مهم : دقت کنید اولین کاراکتر در یک رشته، کاراکتر 0 ام است، و عدد گذاری از 0 تا length -1 انجام می شوند.

خب، عدد داخل براکت، میتونه منفی هم باشه. دقت کنید اعداد منفی، از آخر به اول شروع میکنن (مثلا کد زیر حرف a رو بر میگردونه) :

name[-1]
جایگزین کردن بخشی از یک رشته با یک مقدار دیگر : خب، برای این کار، دو راه داریم.

اول : اگر کاراکتر مورد نظر، فقط یک بار تکرار شده، و میخواید یک کاراکتر که اشتباه شده رو برگردونید به حالت اصلی (مثلا فرض کنیم شما Muhammadreza رو Muhammadrezs تایپ کردید و a آخر با s اشتباه شده!) :

name['s'] = 'a'و این اشکار درست میشه.

دوم : فرض کنیم که کاراکتر n ام رشته شما، اشتباه شده، یا به هر دلیلی دلتون میخواد عوضش کنید! خب، ساده است. فقط کافیه ببینید چندمین کاراکتر هست و عوضش کنید :
name[11] = 'a'
البته اینجا، آخرین کاراکتر (همون s ) ، کاراکتر ۱۱ از دید مفسر هست، که عوضش کردیم.

توجه : مورد بالا، در مورد آرایه ها و دیکشنری ها هم صدق میکنه، و مطالب بیشتر رو در اون قسمت فرا خواهید گرفت!

برعکس کردن رشته : رشته برعکس شده، بعضی جا ها میتونه کاربرد داشته باشه. خاصیت reverse در روبی، این امکان رو به شما میده تا به سادگی، یک رشته رو برعکس کنید :
name.reverseکه البته این خاصیت میتونه برای اکثر متغیرها، آرایه ها و ... هم استفاده بشه.

جداکردن قسمت خاصی از یک رشته : با زبان اسپرانتو آشنایی دارید؟ در این زبان، هر کلمه ای که با mal آغاز بشه، متضاد بخش بدون mal هست. یعنی malamiko یعنی دشمن، و amiko یعنی دوست. خب، میخوایم این mal رو جدا کنیم. خاصیتی در این زبان هست که این امکان رو به ما میده، ما میخوایم n کاراکتر اول رو جدا کنیم، پس :
"malamiko"[0, 3]و خروجی دریافتی، قطعا mal خواهد بود. در بخش توابع، از این خاصیت استفاده خواهیم کرد، و تابعی خواهیم نوشت که یک کلمه متضاد رو تشخیص بده.
در قدم بعدی، با آرایه ها آشنا خواهیم شد، و همچنین دیکشنری ها، و بعد میریم سراغ شروط و بعد هم توابع و کلاس ها.

قدم پنجم : آرایه و دیکشنری

در اینجا، میخوایم کمی فراتر از ایجاد یک متغیر ساده بریم، و میخوایم مجموعه ای از متغیرها رو مورد بررسی قرار بدیم! استفاده از آرایه و دیکشنری، برنامه شما رو بهتر میکنه. حداقل این که میتونید به سادگی چیزایی رو که لازم دارید فراخوانی کنید، و نیازی به ایجاد متغیرهای اضافی نیست. خب، از این بحث که بگذریم، تعریف ها رو اینجا بیان میکنیم و میریم سراغ استفاده از آرایه و دیکشنری!
آرایه :  آرایه، مجموعه ای از متغیرهاست که همگی از یک نوع هستند.
دیکشنری :  در واقع، دیکشنری نوع خاصی از آرایه هست که به ازای یک نام خاص، یک مقدار خاص رو بر میگردونه.

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

array = [1, 2, 3, 56, 67, 32, 1, -1, 56]
آرایه بالا، یک مجموعه از اعداده و عضو تکراری هم داره :) . خب، الان کاری باهاش نداریم، ولی باید چندتا خاصیت از آرایه ها رو بگیم، و اون موقع نیاز خواهیم داشت تا عملیاتی رو روی آرایه، انجام بدیم.

دیکشنری هم به این شکل تعریف میشه :
dic = {"Muhammadreza" => 75, "Mehdy" => 74, "Amir" => 73, "Alireza" =>75}
خب، دستور بالا هم یک دیکشنری رو تعریف میکنه، این دیکشنری کاربردش چیه؟ مثلا من تعدادی اسم و تعدادی عدد رو تعریف کردم. جلوی هر اسم، سال تولد شخص رو قرار دادم. خب، الان نوبتی هم باشه، نوبت به گشت و گذار درون آرایه ها و دیکشنری هاست!

مرتب کردن یک آرایه :
اگر با زبان ++C آشنا باشید، خواهید دید که برای مرتب کردن آرایه، نیاز دارید تا تابعی بنویسید که براتون این کار رو بکنه. اما خوشبختانه، روبی خاصیت sort رو به صورت پیش ساخته درون خودش داره، برای مرتب کردن آرایه تعریف شده، کافیه تایپ کنیم :
array.sortخب، خاصیت sort آرایه رو از «کوچک به بزرگ» مرتب میکنه، و اگر میخواید که «از بزرگ به کوچک» مرتب کنید، کافیه از دستور زیر استفاده کنید :
array.sort.reverseدر بخش توابع ، سعی میکنم که این موارد رو بهتر پوشش بدیم.

چک کردن وجود یک مقدار درون آرایه :
خاصیت include در این زبان، به ما کمک میکنه تا چک کنیم مقداری درون آرایه هست یا نه، و بدین شکل، میتونیم به سادگی از دستور زیر استفاده کنیم :
array.include?2دستور فوق، چک میکنه که آیا عدد ۲ درون آرایه ما هست یا نه. اگر بود مقدار true و اگر نبود، مقدار false رو برمیگردونه.

خب، برای دیدن دستورات بیشتر، مادامی که irb فعاله، میتونید تایپ کنید :
array.methods
و ببینید چه خواص دیگری برای آرایه در نظر گرفته شده.
حالا بریم سراغ چک کردن کار دیکشنری ها!

خب، دیکشنری دو تا دستور مهم داره، و الباقیش با آرایه و متن یکی هست!

چک کردن کلید ها و مقادیر :
کلید، یعنی عبارتی مثل Muhammadreza در دیکشنری dic که ایجاد کردیم. میخوایم چک کنیم که آیا Mehdy درون این دیکشنری هست یا نه؟! پس کافیه تایپ کنیم :
dic.has_key?"Mehdy"
و اگر کلید مورد نظر موجود باشه، طبعیتا باید true رو دریافت کنیم و در غیر این صورت، false .
برای مقدار هم میخوایم ببینیم آیا متولد ۶۹ در این دیکشنری هست یا نه؟؟!
پس کافیه به این شکل دنبالش باشیم :
dic.has_value?69
در قدم بعدی، دستورات شرطی و حلقه ها رو خواهم گفت. بعدش میتونیم بریم سراغ توابع و کلاس ها.

قدم ششم : ساختارهای کنترلی (دستورات شرطی)

بدون شک، دستورات شرطی در یک زبان برنامه نویسی، نقش بسیار مهمی ایفا میکنن، و برای نوشتن برنامه هایی با بهترین کارایی، مجبوریم که ازشون استفاده کنیم. در روبی، سه دستور if, elsif و else وجود دارن، که سه ساختار زیر رو به خودشون اختصاص دادن :

if
...
end

if
...
else
...
end

و آخرین ساختار :
if
...
elsif
...
elsif
...
elsif
...
else
...
end

کاربرد دستور if به تنهایی، یعنی فقط یک شرط داریم، و در صورت غلط بودن نیازی نیست تا اروری چاپ بشه یا عملیات دیگری انجام بشه، در نتیجه، ما فقط به یک عدد if نیاز داریم :

if 27%2 != 0
    puts "True"
end

که البته if رو به تنهایی به این شکل هم میشه در یک خط به کار برد :

puts "True" if 27%2 != 0

پس دیدیم که شرطی که فقط یک حالت داره، رو میشه به دو روش استفاده کرد. حالا میخوایم موقعی که ورودی، مناسب نبود عملیات دیگری انجام بشه، پس از else استفاده میکنیم :

if n == 0
 return 1
else
 return n * f(n-1)
end

نکته : کد فوق، قسمتی از یک تابع بازگشتی است، که در ادامه به تفصیل در موردش توضیح خواهیم داد.

و حالا، اگر چند شرط داشتیم چطور؟ طبیعیه که از elsif استفاده میکنیم :

if n == 0
 return 0
elsif n == 1
 return 1
else
return f(n-1) + f(n-2)
end

نکته : کد فوق، قسمتی از یک تابع بازگشتی است، که در ادامه به تفصیل در موردش توضیح خواهیم داد.

خب، این دستورات شرطی در زبان روبی، در قدم بعدی، میریم سراغ حلقه های تکرار.

قدم هفتم : حلقه های تکرار

به یقین میدونید که هر زبانی، یک روشی برای تکرار رو درون خودش داره ، و اگر نداشته باشه، قطعا دستوراتی هست که بشه با استفاده از اونها، یک تکرار رو ایجاد و مدیریت کرد. حلقه ها، در اکثر زبان های برنامه نویسی هستند، و معمولا چندین شکل مختلف دارند. در زبان روبی، حلقه های while و for و until  داریم. این چهار حلقه هر کدوم ویژگی های خاص خودشون رو دارند، که در این قسمت از متن باهاشون آشنا خواهیم شد.

حلقه while

این حلقه، یک حلقه پایه ای و ساده هست. با استفاده از این حلقه، به سادگی میتونید یک تکرار ساده رو برای نمایش حروف یک کلمه، استفاده کنید و ... (متغیر name رو به یاد دارید؟) . حالا ما با استفاده از این حلقه، میخوایم که تک تک حروف اسم رو چاپ کنیم :) . اینجا نیاز داریم که یک سری خواص رو استفاده کنیم تا حلقه رو کامل و بی نقص بنویسیم :

i = 0

while i < name.length
    puts name[i]
    i += 1
end

خب این حلقه میگه : تا موقعی که متغیر i کوچک تر از طول اسم هست، حرف i ام از متغیر name رو چاپ کن، به i یک واحد اضافه کن و شرط رو چک کن.
در نهایت هم باید گفت که حلقه وایل، تا زمانی ادامه داره که شرط درست باشه، و به محض غلط شدن شرط، حلقه تمام میشه.

حلقه for

حلقه for در این زبان، یکم عملکردش متفاوت هست، و عملکردش مشابه عملکرد for در زبان پایتون هستش. به طور کل، فرض کنیم قطعه کد بالا رو میخواید با for بنویسید، کافیه یک بازه تعریف کنید و بعد با for بنویسیدش :

for i in 0...name.length
             puts name[i]
end
و خب این حلقه متغیر رو در بازه ۰ تا طول اسم (اینجا ۱۲) چک میکنه، و در بدنه حلقه، یکی یکی چک میکنه تا به آخر بازه برسه. در کل، این حلقه سادست ولی پرکاربرد.
چطوره یک جدول ضرب باهاش درست کنیم؟

for col in 0...10
       line = " "
       for row in 0...10
                   line += "#{col * row}\t"
         end
 puts line
end

خب کد بالا رو اجرا کنید، طبیعتا از دیدن یک جدول ضرب در پنجره ترمینال، تعجب خواهید کرد :D .

حلقه until
این حلقه یکم عملکردش عجیبه، در واقع، این حلقه به کار خودش تا موقعی ادامه میده که شرط درست شه! مثالی که با while زدم رو اینجا با until بازنویسی میکنم :

i = 0
until i == name.length
     puts name[i]
     i += 1
end
و این رو خودتون هم تست کنید، این حلقه هم در نوع خودش جالبه :) .


خب، در قدم بعدی میریم سراغ توابع. یکی دو تا تابع مینویسیم و بعدش هم میریم سراغ کلاس ها :) .

عنوان: پاسخ : تاپیک آموزش زبان برنامه نویسی Ruby
ارسال شده توسط: محمدرضا ح. در 05 دی 1393، 01:39 ب‌ظ
پست اول بروز شده، مطالب مربوط به متغیرها افزوده شد.
عنوان: پاسخ : تاپیک آموزش زبان برنامه نویسی Ruby (کار با متغیرها)
ارسال شده توسط: abedzadeh در 05 دی 1393، 01:50 ب‌ظ
ممنون
حتما ادامه بدید :)
عنوان: پاسخ : تاپیک آموزش زبان برنامه نویسی Ruby (کار با متغیرها)
ارسال شده توسط: Amir Emad در 05 دی 1393، 02:35 ب‌ظ
جالبه ها

فکر میکردم خیلی پیچیده باشه ولی معمولیه مثل پایتون
عنوان: پاسخ : تاپیک آموزش زبان برنامه نویسی Ruby (کار با متغیرها)
ارسال شده توسط: محمدرضا ح. در 05 دی 1393، 07:58 ب‌ظ
ممنون از دوستان بابت نظراتشون، پست اول رو بروز کردم و روش کار با رشته ها رو بهش اضافه کردم :).
عنوان: پاسخ : تاپیک آموزش زبان برنامه نویسی Ruby (کار با متغیرها)
ارسال شده توسط: alireza.crs در 06 دی 1393، 12:30 ق‌ظ
ممنون از دوستان بابت نظراتشون، پست اول رو بروز کردم و روش کار با رشته ها رو بهش اضافه کردم :).
واقعا عالیه.حیفم میاد که چرا تو این مدت نتونستم با این زبان ارتباط برقرار کنم.
میگم چرا به جای پست اول،یه pdf درست نمیکنین تا به جای پست اول،اون pdf رو به روز کنین؟
عنوان: پاسخ : تاپیک آموزش زبان برنامه نویسی Ruby (کار با متغیرها)
ارسال شده توسط: محمدرضا ح. در 06 دی 1393، 02:10 ب‌ظ
ممنون از دوستان بابت نظراتشون، پست اول رو بروز کردم و روش کار با رشته ها رو بهش اضافه کردم :).
واقعا عالیه.حیفم میاد که چرا تو این مدت نتونستم با این زبان ارتباط برقرار کنم.
میگم چرا به جای پست اول،یه pdf درست نمیکنین تا به جای پست اول،اون pdf رو به روز کنین؟
ممنون بابت لطفتون دوست عزیز. این آموزش تموم بشه، همه رو در قالب PDF منتشر خواهم کرد.

====
پست اول آپدیت شد!
عنوان: پاسخ : تاپیک آموزش زبان برنامه نویسی Ruby (کار با متغیرها)
ارسال شده توسط: محمدرضا ح. در 02 بهمن 1393، 10:37 ب‌ظ
پست اول بروز شد!
عنوان: پاسخ : تاپیک آموزش زبان برنامه نویسی Ruby (حلقه های تکرار)
ارسال شده توسط: محمدرضا ح. در 08 بهمن 1393، 01:32 ب‌ظ
پست اول بروز شده، مطالب مربوط به حلقه های تکرار اضافه شد.
عنوان: پاسخ : تاپیک آموزش زبان برنامه نویسی Ruby (حلقه های تکرار)
ارسال شده توسط: محمد فدوی در 08 بهمن 1393، 07:40 ب‌ظ
ممنون بابت لطفتون دوست عزیز. این آموزش تموم بشه، همه رو در قالب PDF منتشر خواهم کرد.

====
پست اول آپدیت شد!

محمدرضا جان خسته نباشی و آموزش خیلی خوبی رو شروع کردی. حتما هم ادامه‌ش بده. فقط یه پیشنهاد؛ بعد از تکمیلش سعی کن کل آموزش رو بصورت یه Cheat Sheet توی قالب یک یا دو صفحه منتشر کنی. به نظرم خیلی خوب میشه.
عنوان: پاسخ : تاپیک آموزش زبان برنامه نویسی Ruby (حلقه های تکرار)
ارسال شده توسط: محمدرضا ح. در 13 بهمن 1393، 04:21 ب‌ظ
دوستان این آموزش رو PDF ش رو دارم طرح ریزی میکنم که چطور باشه. این آموزش اونقدری ازش نمونده. ان شاء الله PDF که منتشر شه، همانند سایر کتاب های موجود دارای تمرین و مساله خواهد بود.
عنوان: پاسخ : تاپیک آموزش زبان برنامه نویسی Ruby (حلقه های تکرار)
ارسال شده توسط: محمدرضا ح. در 24 بهمن 1393، 11:07 ب‌ظ
اگر به یاد داشته باشید قول PDF داده بودم. کتاب رو شروع کردم به نوشتن و تا آخر ساختار کنترلی، پیش رفتم (همچنان از این تاپیک عقب تره) :

http://github.com/prp-e/rubybook-fa

در پوشه compiled فایل PDF قرار داره.
عنوان: پاسخ : تاپیک آموزش زبان برنامه نویسی Ruby (حلقه های تکرار)
ارسال شده توسط: محمدرضا ح. در 27 بهمن 1393، 09:44 ب‌ظ
اگر به یاد داشته باشید قول PDF داده بودم. کتاب رو شروع کردم به نوشتن و تا آخر ساختار کنترلی، پیش رفتم (همچنان از این تاپیک عقب تره) :

http://github.com/prp-e/rubybook-fa

در پوشه compiled فایل PDF قرار داره.

این فایل آپدیت شده و الان خیلی جلو تر از این تاپیکه. هم حلقه for رو توضیح دادم هم each 
عنوان: پاسخ : تاپیک آموزش زبان برنامه نویسی Ruby (حلقه های تکرار)
ارسال شده توسط: shahryarjb در 21 خرداد 1394، 12:05 ب‌ظ
درود خدمت شما من یک آرایه رو با  ech بررسی کردم به شرح زیر

user_select_name = 'shahryar'
user_select_lastname = 'tavakkoli'


  phons_array.each do |emeleytor|

    if emeleytor[0] == user_select_name && emeleytor[1] == user_select_lastname
      puts "#{emeleytor[1]}\t\t#{emeleytor[2]}"

    else
        puts "your user not exi"

    end
  end


مشکل اساسی من این هست که اصلا به esle من ارزش نمی زاره  ](*,)  و همینطور شرط رو کامل اجرا می کنه در صورتی که اسم درست رو پیدا کرده

و جوابش هم
tavakkoli 0921000009
your user not exi

Process finished with exit code 0

در صورتی که شرط درست هست ولی داره بعد از esle رو می یاد و اگر من شرط رو اشتباه بکنیم دوباره
your user not exi
your user not exi

رو می یاره اگر دوستان در این زمینه کمک کنند ممنون می شم


لینک تصویر از ایدتورم
http://up.vbiran.ir/uploads/2237143400849825731_Screen%20Shot%202015-06-11%20at%20120013%20PM.png

لینک دانلود فایل rb
http://up.vbiran.ir/uploads/5655143400853428248_stubrb.zip


و ۳ مشکل اساسی که من در بیشتر آموزش ها می بینم که

۱. به هیچ عنوان پروژه محور نیستن و فقط دارند سینتگز رو یاد می دند و کار دیگه ای توشون نیست متاسفانه و امید وارم شما هم چندین پروژه بزرگ رو شروع کنید و مرحله به مرحله برید جلو حتی برای فروش
۲. مشکل بعدی اینکه به هیچ عنوان منبعی برای دریافت پروژه های رایگان و متن باز برای ساخت کتاب خانه شخصی که یکی از مهمترین موارد در برنامه نویسی هست معرفی نمی شه یا دانلود قرار نمی گیره و بدون اینکه کدی رو ببنیم می خواهیم یک چیزی رو شروع کنیم و اگر بخواهیم در گیت هاب بگردیم یا پروژه انقدر بزرگه که نمی تونیم یا نتیجه ای برایمون نداره
۳. مشکل بعدی که در آموزش های ruby دیده می شه متاسفانه کسی از بانک اطلاعاتی و استفاده اون صحبت نکرده و هم اینکه کسی صحبت از اپلیکیشن نویسی و کمی گرافیکی گردنش ننوشته که امید وارم شما این لطف بکنید وقتی این همه وقت گزاشتید

با تشکراز شما
عنوان: پاسخ : تاپیک آموزش زبان برنامه نویسی Ruby (حلقه های تکرار)
ارسال شده توسط: 藤沼 در 21 خرداد 1394، 02:01 ب‌ظ
امیدوارم مفید واقع بشه:
contacts = [
  %w(shahryar tavakkoli 09213380329),
  %w(arash ebrahimi 09368094936)
]

included = contacts.find { |i| i[0] == 'shahryar' && i[1] == 'tavakkoli' }
if included
  puts "#{included[1]}\t#{included[2]}"
else
  puts "contact doesn't exist."
end
عنوان: پاسخ : تاپیک آموزش زبان برنامه نویسی Ruby (حلقه های تکرار)
ارسال شده توسط: shahryarjb در 21 خرداد 1394، 03:15 ب‌ظ
امیدوارم مفید واقع بشه:
contacts = [
  %w(shahryar tavakkoli 09213380329),
  %w(arash ebrahimi 09368094936)
]

included = contacts.find { |i| i[0] == 'shahryar' && i[1] == 'tavakkoli' }
if included
  puts "#{included[1]}\t#{included[2]}"
else
  puts "contact doesn't exist."
end


با تشکر از شما که این مطالب گزاشتید و مشکل من با این کار کلا حل شد ولی به صورت منطقی هنوز متوجه این نشدم که چرا شرط بنده کار نمی کنه !؟
یک بار پیدا می کنه ولی در نبود شرط کارایی نداره اگر مطالبی دارید که می تونید اون رو توضیح بدید ممنون می شم که بگید

بازم تشکر می کنم انجمن دکمه تشکر نداشت یا بنده ندیدم که بزنم
ممنون
عنوان: پاسخ : تاپیک آموزش زبان برنامه نویسی Ruby (حلقه های تکرار)
ارسال شده توسط: 藤沼 در 21 خرداد 1394، 04:24 ب‌ظ
برنامهٔ پایین دقیقاً برنامهٔ قبلی شماست‌ (با چندجا تغییر نام) و اگر اون رو اجرا کنید درست خروجی برنامهٔ پیش رو برمی‌گردونه. اول برنامه به «استاتمان» (اعلان) if می‌رسه شرط رو بررسی و خروجی puts رو قرار می‌ده و else نادیده گرفته‌ می‌شه. چون شرط *تنها* یکبار درست ارزیابی می‌شه پس حلقه از حرکت باز نمی‌ایسته و در تناقض‌های بعدی فقط پیغام هشدار رو چاپ می‌کنه.
phonebook = [
  %w(shahryar tavakkoli 09213380329),
  %w(arash ebrahimi 09368094936)
]

phonebook.each do |contact|
  if contact[0] == 'shahryar' && contact[1] == 'tavakkoli'
    puts "[#{contact[1]}][#{contact[2]}]"
  else
    puts "the contact you searched for doesn't exist in the phonebook."
  end
end
وارونهٔ برنامهٔ بالا:(حلقه رو بعد از یکبار اجرا و چاپ خروجی وامی‌ستونه)
phonebook = [
  %w(shahryar tavakkoli 09213380329),
  %w(arash ebrahimi 09368094936)
]

phonebook.each do |contact|
  if contact[0] == 'shahryar' && contact[1] == 'tavakkoli'
    puts "[#{contact[1]}][#{contact[2]}]"
  else
    break
  end
end
عنوان: پاسخ : تاپیک آموزش زبان برنامه نویسی Ruby (حلقه های تکرار)
ارسال شده توسط: shahryarjb در 21 خرداد 1394، 10:29 ب‌ظ
درود خدمت شما تشکر از اینکه وقت می زارید و تازه واردیم متاسفانه شما رو اذیت هم می کنیم البته کد اولیتون که با متد find بود کلا کار می کنه و هیچ مشکلی هم نداره و اینجوری تو دستم اومد نباید تو حلقه each شرط بزاریم چون کامل تمام موارد رو چک می کنه

فقط موردی که هست اینکه کد دومی که وارونه دادید متاسفانه کار نمی کنه یا خروجی نشون نمی ده اگر شرط درست باشه یا نباشه
phonebook = [
  %w(shahryar tavakkoli 09213380329),
  %w(arash ebrahimi 09368094936)
]

phonebook.each do |contact|
  if contact[0] == 'shahryar' && contact[1] == 'tavakkoli'
    puts "[#{contact[1]}][#{contact[2]}]"
  else
    break
  end
end



فقط موردی که برای من به عنوان تازه وارد کمی درکش سخت هست اینکه وقتی یک حلقه با شرطش یکی شد چرا باز کلشو می گرده و اگر اینجوری باشه کمی فکر کنم تو آینده برای برنامه های بزرگ تر به مشکل خیلی بزرگی بخورم احتمالا در جایی اشتباه دارم فکر می کنم اگر از نظر منطقی هم کمی بیشتر توضیح بدید ممنون می شم
عنوان: پاسخ : تاپیک آموزش زبان برنامه نویسی Ruby (حلقه های تکرار)
ارسال شده توسط: 藤沼 در 21 خرداد 1394، 10:52 ب‌ظ
شما اگر از هر حلقه‌ای استفاده می‌کنید باید بعد از برآورده کردن خواسته‌تون اون رو اصطلاحاً بشکنید یا واستونید وگرنه حلقه به‌کار خودش ادامه می‌ده - کد دوم هم پیچیدگی خاصی نداره و به‌ خوبی اجرا می‌شه. اگر دوست دارید بیشتر در این باره گفتگو کنیم برای من ایمیل (http://n3vtelen@gmail.com) بفرستید.