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

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: مشکل برنامه نویسی بش  (دفعات بازدید: 1035 بار)

0 کاربر و 3 مهمان درحال مشاهده موضوع.

آفلاین learner:~$

  • Hero Member
  • *
  • ارسال: 816
  • جنسیت : پسر
  • روزی روز گاری در گنو/لینوکس
مشکل برنامه نویسی بش
« : 28 بهمن 1402، 08:04 ب‌ظ »
درود

چند وقته دارم تمرین الگوریتمیک میکنم و در بش پیاد سازی میکنم و به یه مشکل سهمگین و اعصاب خورد کن بر خوردم.که طاقت نیاوردم و میخوام این رو به عنوان یک پرسش ایجاد کنم.
---------------------------------
الگوریتم: الگوریتمی که ۱۰ عدد را خوانده؛در آرایه ای قرار میدهد؛سپس بزرگترین عنصر آرایه را مشحص کرده؛تعیین میکند که این عنصر در کجای آرایه قرار دارد.


خب این تمرین الگوریتمی زیاد پیچیده ای نداره و اون رو تقریبا به صورت محاوره ای بیان میکنم:
۱-شروع( هر الگوریتمی یک شروع و پایانی داره ( هر چیزی البته ) )
۲- آرایه x  را به طول ۱۰ در نظر میگیریم.
۲- i=1
۳- تا زمانی که  i<=10 هست برو به : ۴
۴-x(i) را بخوان
۵-i++
۶- پایان حلقه ( شروع از ۳ )
۷-ma=x(i)
۸-index=0
۹-n=1
۱۰-تا زمانی که n<=۹ برو به : ۱۱
۱۱-اگر max < x(i)  آنگاه:
                        max=x(i)
                        index=i
۱۲-i++
۱۳-پایان حلقه ( شروع از ۱۰ )
۱۴-index , max  را چاپ کن
۱۵-پایان
-----------------------------
نکته:در بش عنصر اول شماره صفرم است.
-----------------------------
من سعی کردم که این کد رو در بش پیاده سازی کنم که نتایج زیر رو در بر داشت:
۱-ارور مبداد ( نحوی و منطقی )
۲-جواب مکان رو عنصر ۹ میداد ( فقط میگفت ۹ )‌
۳-جواب رو کلا صفر میداد و بعدش ارور میداد.
------------------------------
برای همین برای خودم این کار ها رو تست کردم :
۱-برای شرط از  دو پرانتز تا دو عدد براکت تست کردم(شرط در حلقه دوم)
۲- سوییچ -gt  و علامت بزرگ کوچک تست کردم.
۳-حلقه رو با while بازنویسی کردم
۴-سینتکس حلقه  for  عوض کردم
۵- از دیباگر بش استفاده کردم ( نتایج جالبی دستگیرم شد )
----------------------------
حالا میرسیم به کد بنده که به شکل زیر هست فعلا :

#!/usr/bin/bash
declare -a array
echo -e "plz enter numbers: \n"
for ((i=1;i<=10;i++))
do
    read -p "enter number ${i}: " array
done
max=$array[0]
index=0
for((i=1;i<=10;i++))
do
    if [ $array[$i] -gt $max ]
    then
        max=$array[$i]
        index=$i
    fi 
done
echo -e "the value is : $max, and the index of value is : $index\n"

و همچنین خروجی این کد به همراه حالت  bash -x  :
+ declare -a array
+ echo -e 'plz enter numbers: \n'
plz enter numbers:

+ (( i=1 ))
+ (( i<=10 ))
+ read -p 'enter number 1: ' array
enter number 1: 1
+ (( i++ ))
+ (( i<=10 ))
+ read -p 'enter number 2: ' array
enter number 2: 2
+ (( i++ ))
+ (( i<=10 ))
+ read -p 'enter number 3: ' array
enter number 3: 3
+ (( i++ ))
+ (( i<=10 ))
+ read -p 'enter number 4: ' array
enter number 4: 4
+ (( i++ ))
+ (( i<=10 ))
+ read -p 'enter number 5: ' array
enter number 5: 5
+ (( i++ ))
+ (( i<=10 ))
+ read -p 'enter number 6: ' array
enter number 6: 6
+ (( i++ ))
+ (( i<=10 ))
+ read -p 'enter number 7: ' array
enter number 7: 7
+ (( i++ ))
+ (( i<=10 ))
+ read -p 'enter number 8: ' array
enter number 8: 8
+ (( i++ ))
+ (( i<=10 ))
+ read -p 'enter number 9: ' array
enter number 9: 9
+ (( i++ ))
+ (( i<=10 ))
+ read -p 'enter number 10: ' array
enter number 10: 10
+ (( i++ ))
+ (( i<=10 ))
+ max='10[0]'
+ index=0
+ (( i=1 ))
+ (( i<=10 ))
+ '[' '10[1]' -gt '10[0]' ']'
main.sh: line 12: [: 10[1]: integer expression expected
+ (( i++ ))
+ (( i<=10 ))
+ '[' '10[2]' -gt '10[0]' ']'
main.sh: line 12: [: 10[2]: integer expression expected
+ (( i++ ))
+ (( i<=10 ))
+ '[' '10[3]' -gt '10[0]' ']'
main.sh: line 12: [: 10[3]: integer expression expected
+ (( i++ ))
+ (( i<=10 ))
+ '[' '10[4]' -gt '10[0]' ']'
main.sh: line 12: [: 10[4]: integer expression expected
+ (( i++ ))
+ (( i<=10 ))
+ '[' '10[5]' -gt '10[0]' ']'
main.sh: line 12: [: 10[5]: integer expression expected
+ (( i++ ))
+ (( i<=10 ))
+ '[' '10[6]' -gt '10[0]' ']'
main.sh: line 12: [: 10[6]: integer expression expected
+ (( i++ ))
+ (( i<=10 ))
+ '[' '10[7]' -gt '10[0]' ']'
main.sh: line 12: [: 10[7]: integer expression expected
+ (( i++ ))
+ (( i<=10 ))
+ '[' '10[8]' -gt '10[0]' ']'
main.sh: line 12: [: 10[8]: integer expression expected
+ (( i++ ))
+ (( i<=10 ))
+ '[' '10[9]' -gt '10[0]' ']'
main.sh: line 12: [: 10[9]: integer expression expected
+ (( i++ ))
+ (( i<=10 ))
+ '[' '10[10]' -gt '10[0]' ']'
main.sh: line 12: [: 10[10]: integer expression expected
+ (( i++ ))
+ (( i<=10 ))
+ echo -e 'the value is : 10[0], and the index of value is : 0\n'
the value is : 10[0], and the index of value is : 0

هرکاری که فکر بکنید کردم حتی از استفاده کردن curly brace  تا استفاده نکردن از اون و استفاده از متغیر های جدید  و گشتن منوال بشو ... .
کلا از حواب زندگی افتادم این چند وقت فقط فکرم درگیر این بود که مشکل چیه؟؟  :'(

« آخرین ویرایش: 28 بهمن 1402، 08:14 ب‌ظ توسط learner:~$ »
مثل سمی کالونم( ; ).
خواستار پایان.
محکوم به کامپایل.

آفلاین learner:~$

  • Hero Member
  • *
  • ارسال: 816
  • جنسیت : پسر
  • روزی روز گاری در گنو/لینوکس
پاسخ : مشکل برنامه نویسی بش
« پاسخ #1 : 28 بهمن 1402، 09:05 ب‌ظ »
کد جدید:
#!/usr/bin/bash
declare -a array
echo -e "plz enter numbers: \n"
for ((i=1;i<=10;i++))
do
    read -p "enter number ${i}: " array
done
max=${array[0]}
index=0
for((i=1;i<=10;i++))
do
    if [ $array[$i] -gt $max ]
    then
        max=${array[$i]}
        index=${i}
    fi
done
echo -e "the value is : ${max}, and the index of value is : ${index}\n"

خروجی جدید:
+ declare -a array
+ echo -e 'plz enter numbers: \n'
plz enter numbers:

+ (( i=1 ))
+ (( i<=10 ))
+ read -p 'enter number 1: ' array
enter number 1: 111
+ (( i++ ))
+ (( i<=10 ))
+ read -p 'enter number 2: ' array
enter number 2: 1
+ (( i++ ))
+ (( i<=10 ))
+ read -p 'enter number 3: ' array
enter number 3: 2
+ (( i++ ))
+ (( i<=10 ))
+ read -p 'enter number 4: ' array
enter number 4: 3
+ (( i++ ))
+ (( i<=10 ))
+ read -p 'enter number 5: ' array
enter number 5: 4
+ (( i++ ))
+ (( i<=10 ))
+ read -p 'enter number 6: ' array
enter number 6: 5
+ (( i++ ))
+ (( i<=10 ))
+ read -p 'enter number 7: ' array
enter number 7: 6
+ (( i++ ))
+ (( i<=10 ))
+ read -p 'enter number 8: ' array
enter number 8: 7
+ (( i++ ))
+ (( i<=10 ))
+ read -p 'enter number 9: ' array
enter number 9: 8
+ (( i++ ))
+ (( i<=10 ))
+ read -p 'enter number 10: ' array
enter number 10: 9
+ (( i++ ))
+ (( i<=10 ))
+ max=9
+ index=0
+ (( i=1 ))
+ (( i<=10 ))
+ '[' '9[1]' -gt 9 ']'
main.sh: line 12: [: 9[1]: integer expression expected
+ (( i++ ))
+ (( i<=10 ))
+ '[' '9[2]' -gt 9 ']'
main.sh: line 12: [: 9[2]: integer expression expected
+ (( i++ ))
+ (( i<=10 ))
+ '[' '9[3]' -gt 9 ']'
main.sh: line 12: [: 9[3]: integer expression expected
+ (( i++ ))
+ (( i<=10 ))
+ '[' '9[4]' -gt 9 ']'
main.sh: line 12: [: 9[4]: integer expression expected
+ (( i++ ))
+ (( i<=10 ))
+ '[' '9[5]' -gt 9 ']'
main.sh: line 12: [: 9[5]: integer expression expected
+ (( i++ ))
+ (( i<=10 ))
+ '[' '9[6]' -gt 9 ']'
main.sh: line 12: [: 9[6]: integer expression expected
+ (( i++ ))
+ (( i<=10 ))
+ '[' '9[7]' -gt 9 ']'
main.sh: line 12: [: 9[7]: integer expression expected
+ (( i++ ))
+ (( i<=10 ))
+ '[' '9[8]' -gt 9 ']'
main.sh: line 12: [: 9[8]: integer expression expected
+ (( i++ ))
+ (( i<=10 ))
+ '[' '9[9]' -gt 9 ']'
main.sh: line 12: [: 9[9]: integer expression expected
+ (( i++ ))
+ (( i<=10 ))
+ '[' '9[10]' -gt 9 ']'
main.sh: line 12: [: 9[10]: integer expression expected
+ (( i++ ))
+ (( i<=10 ))
+ echo -e 'the value is : 9, and the index of value is : 0\n'
the value is : 9, and the index of value is : 0

یه تغیر ریز دوباره تو براکت ها دادم ولی فرقی نکرد  :oops:
مثل سمی کالونم( ; ).
خواستار پایان.
محکوم به کامپایل.

آفلاین 🇬🇧بریتانیای کبیر🇬🇧

  • High Hero Member
  • *
  • ارسال: 2658
  • جنسیت : پسر
  • GOD SAVE THE KING/QUEEN
پاسخ : مشکل برنامه نویسی بش
« پاسخ #2 : 28 بهمن 1402، 09:54 ب‌ظ »
#!/bin/bash

# Define an array with a certain number of elements
declare -a array[10]

# Get numbers
for(( i=0; i<10; i++))
do
read -p "Enter number${i} : " array[$i]
done

# Define max and index
max=${array[0]}
index=0
for(( i=1; i<10; i++))
do
if ((${max} < ${array[$i]})) ; then
max=${array[$i]}
index=${i}
fi
done

echo -e "\nmax=${max} index=${index}"

باید برم if و مثل آدم یاد بگیرم، اصلا خوب بلدش نیستم!


کد جدید:
در این خط(خط 6) اصلا شناسه آرایه رو نذاشتی
    read -p "enter number ${i}: " array
نکته: بهتر نیست با C کارتو بکنی؟ چون بش اصلا برای این کارا نیست. خیلی راحت یک برنامه با C بنویس و روی یادگیری الگوریتمت تمرکز کن!
« آخرین ویرایش: 28 بهمن 1402، 10:06 ب‌ظ توسط 🇬🇧United Kingdom🇬🇧 »
🇬🇧🏴󠁧󠁢󠁥󠁮󠁧󠁿🏴󠁧󠁢󠁷󠁬󠁳󠁿🏴󠁧󠁢󠁳󠁣󠁴󠁿🇬🇧

آفلاین learner:~$

  • Hero Member
  • *
  • ارسال: 816
  • جنسیت : پسر
  • روزی روز گاری در گنو/لینوکس
پاسخ : مشکل برنامه نویسی بش
« پاسخ #3 : 28 بهمن 1402، 10:24 ب‌ظ »
#!/bin/bash

# Define an array with a certain number of elements
declare -a array[10]

# Get numbers
for(( i=0; i<10; i++))
do
read -p "Enter number${i} : " array[$i]
done

# Define max and index
max=${array[0]}
index=0
for(( i=1; i<10; i++))
do
if ((${max} < ${array[$i]})) ; then
max=${array[$i]}
index=${i}
fi
done

echo -e "\nmax=${max} index=${index}"

باید برم if و مثل آدم یاد بگیرم، اصلا خوب بلدش نیستم!


کد جدید:
در این خط(خط 6) اصلا شناسه آرایه رو نذاشتی
    read -p "enter number ${i}: " array
نکته: بهتر نیست با C کارتو بکنی؟ چون بش اصلا برای این کارا نیست. خیلی راحت یک برنامه با C بنویس و روی یادگیری الگوریتمت تمرکز کن!
میشه بگی دقیقا چیکار کردی من که همه این ها رو زدم !!! چرا ؟؟ چه فرقی کرد واقعا میخوام گریه کنم

زبان سی رو میپرستم ولی نمیخوام مثل آدم های تازه وارد ( نوب ) به دنبال این زبان بیفتم و باید از قبل یک آمادگی هم داشت چون حس میکنم ابهتش زیر  سوال میره هرچند که روی اون هم کار میکنم.
سینتکس خیلی سخت وعجیبی داره بش ???
« آخرین ویرایش: 28 بهمن 1402، 10:30 ب‌ظ توسط learner:~$ »
مثل سمی کالونم( ; ).
خواستار پایان.
محکوم به کامپایل.

آفلاین 🇬🇧بریتانیای کبیر🇬🇧

  • High Hero Member
  • *
  • ارسال: 2658
  • جنسیت : پسر
  • GOD SAVE THE KING/QUEEN
پاسخ : مشکل برنامه نویسی بش
« پاسخ #4 : 28 بهمن 1402، 11:03 ب‌ظ »
بیشتر اشتباهاتت احتمالا سر اندیس نذاستن و دستور declare هست.
من زیاد کار با declare را بلد نیستم، در اینترنت اصولی یادش بگیر.

نقل‌قول
زبان سی رو میپرستم ولی نمیخوام مثل آدم های تازه وارد ( نوب ) به دنبال این زبان بیفتم و باید از قبل یک آمادگی هم داشت چون حس میکنم ابهتش زیر  سوال میره هرچند که روی اون هم کار میکنم.
نفهمیدم چی شد؟!
اگه واقعا اینقدر میخوای با بش الگوریتمو پیش ببری پس از در اسکریپتت از نحوه C در بش استفاده نکن.

« آخرین ویرایش: 28 بهمن 1402، 11:05 ب‌ظ توسط 🇬🇧United Kingdom🇬🇧 »
🇬🇧🏴󠁧󠁢󠁥󠁮󠁧󠁿🏴󠁧󠁢󠁷󠁬󠁳󠁿🏴󠁧󠁢󠁳󠁣󠁴󠁿🇬🇧

آفلاین learner:~$

  • Hero Member
  • *
  • ارسال: 816
  • جنسیت : پسر
  • روزی روز گاری در گنو/لینوکس
پاسخ : مشکل برنامه نویسی بش
« پاسخ #5 : 28 بهمن 1402، 11:06 ب‌ظ »
بیشتر اشتباهاتت احتمالا سر اندیس نذاستن و دستور declare هست.
من زیاد کار با declare را بلد نیستم، در اینترنت اصولی یادش بگیر.
#!/bin/bash

# Define an array with a certain number of elements
declare -a array[10]

for ((i=0;i<9;i++))
do
    read -p "enter the ${i} number: " array[$i]
done
max=${array[0]}
index=0
for((i=1;i<10;i++))
do
    if ((${max} < ${array[$i]}))
    then
        max=${array[$i]}
        index=${i}

    fi
done
echo -e "the max number is : ${max}  and the index of the max number is : ${index}\n"


خروجی:
./main.sh: line 14: ((: 9 < : syntax error: operand expected (error token is "< ")
the max number is : 9  and the index of the max number is : 8

م ](*,) خب این که فرقی با کد شما نداره پس چرا ارور میده!!!  ](*,) :'(
من از شدت اندوه مردم شما ادامه بدید :'(  :-X
مثل سمی کالونم( ; ).
خواستار پایان.
محکوم به کامپایل.

آفلاین 🇬🇧بریتانیای کبیر🇬🇧

  • High Hero Member
  • *
  • ارسال: 2658
  • جنسیت : پسر
  • GOD SAVE THE KING/QUEEN
پاسخ : مشکل برنامه نویسی بش
« پاسخ #6 : 28 بهمن 1402، 11:10 ب‌ظ »
شرت خاتمه دوتا حلقه رو ببین. اولی 9 هست و دومی 10


نقل‌قول
آیا به مرور زمان این بی دقتی ها رفع میشه!!؟
اگه تمرین کنی خطا هارو بخونی آره.
بی دقتیت این بوده که خطا هارو نمیخونی. طرف هم شماره خط خطارو گفته و هم نخ داده. هنوز به اون نقطه نرسیدم، اگه تو رسیدی به منم بگو که شاید اومید وار شدم. :P
« آخرین ویرایش: 28 بهمن 1402، 11:56 ب‌ظ توسط 🇬🇧United Kingdom🇬🇧 »
🇬🇧🏴󠁧󠁢󠁥󠁮󠁧󠁿🏴󠁧󠁢󠁷󠁬󠁳󠁿🏴󠁧󠁢󠁳󠁣󠁴󠁿🇬🇧

آفلاین learner:~$

  • Hero Member
  • *
  • ارسال: 816
  • جنسیت : پسر
  • روزی روز گاری در گنو/لینوکس
پاسخ : مشکل برنامه نویسی بش
« پاسخ #7 : 28 بهمن 1402، 11:16 ب‌ظ »
شرت خاتمه دوتا حلقه رو ببین. اولی 9 هست و دومی 10
آیا به مرور زمان این بی دقتی ها رفع میشه!!؟

من هرجا میرم میخونم مینویسم دابل پرانتز با دابل براکت زیاد فرقی نداره  و کار رو راه میندازه!

https://www.pluralsight.com/resources/blog/cloud/conditions-in-bash-scripting-if-statements
« آخرین ویرایش: 28 بهمن 1402، 11:21 ب‌ظ توسط learner:~$ »
مثل سمی کالونم( ; ).
خواستار پایان.
محکوم به کامپایل.

آفلاین behzad1

  • High Sr. Member
  • *
  • ارسال: 514
  • جنسیت : پسر
پاسخ : مشکل برنامه نویسی بش
« پاسخ #8 : 29 بهمن 1402، 06:14 ق‌ظ »
بش زبون برنامه‌نویسی نیست زبون اسکریپت‌نویسیه

آفلاین 🇬🇧بریتانیای کبیر🇬🇧

  • High Hero Member
  • *
  • ارسال: 2658
  • جنسیت : پسر
  • GOD SAVE THE KING/QUEEN
پاسخ : مشکل برنامه نویسی بش
« پاسخ #9 : 29 بهمن 1402، 07:10 ق‌ظ »
بش زبون برنامه‌نویسی نیست زبون اسکریپت‌نویسیه
چرا یک زبان برنامه نویسیه. ولی از زبان های برنامه نویسی در قسمت کاربردشون جزء زبان های اسکریپتی هست.
🇬🇧🏴󠁧󠁢󠁥󠁮󠁧󠁿🏴󠁧󠁢󠁷󠁬󠁳󠁿🏴󠁧󠁢󠁳󠁣󠁴󠁿🇬🇧

آفلاین دانیال بهزادی

  • ناظر انجمن
  • *
  • ارسال: 19722
  • جنسیت : پسر
  • Urahara Kiesuke
    • وبلاگ
پاسخ : مشکل برنامه نویسی بش
« پاسخ #10 : 29 بهمن 1402، 02:57 ب‌ظ »
بش زبون برنامه‌نویسی نیست زبون اسکریپت‌نویسیه
چیزی به نام «زبون اسکریپت‌نویسی» نداریم. کدنوشته‌ها هم برنامه هستن و bash یک زبان برنامه‌نویسیه.
اگه این ارسال بهت کمک کرد، دنبال دکمهٔ تشکر نگرد. به جاش تو هم به جامعهٔ آزادت کمک کن

آفلاین learner:~$

  • Hero Member
  • *
  • ارسال: 816
  • جنسیت : پسر
  • روزی روز گاری در گنو/لینوکس
پاسخ : مشکل برنامه نویسی بش
« پاسخ #11 : 30 بهمن 1402، 07:11 ب‌ظ »
درود
خواستم پبرسم کار با آرایه های چند بعدی در بش به چه صورت هست؟؟
لطفا نگید تنها راهش فقط declare -A
هست
declare -A Array2D
RowNum=5
ColumnNum=6

for ((i=1;i<=RowNum;i++)) do
    for ((j=1;j<=ColumnNum;j++)) do
        Array2D[$i,$j]=$RANDOM
    done
done

f1="%$((${#RowNum}+1))s"
f2=" %9s"

printf "$f1" ''
for ((i=1;i<=RowNum;i++)) do
    printf "$f2" $i
done
echo

for ((j=1;j<=ColumnNum;j++)) do
    printf "$f1" $j
    for ((i=1;i<=RowNum;i++)) do
        printf "$f2" ${Array2D[$i,$j]}
    done
    echo
done

چطوری همچین کاری انجام شده؟؟ منظور از %  ها و %s  چیه؟ آپشن های printf هستند؟؟‌ ( فرمت بندی ) اگه اینطوریه چرا از خود دستور  printf استفاده نکرده ؟
« آخرین ویرایش: 30 بهمن 1402، 07:24 ب‌ظ توسط learner:~$ »
مثل سمی کالونم( ; ).
خواستار پایان.
محکوم به کامپایل.