انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: learner:~$ در 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 تا استفاده نکردن از اون و استفاده از متغیر های جدید و گشتن منوال بشو ... .
کلا از حواب زندگی افتادم این چند وقت فقط فکرم درگیر این بود که مشکل چیه؟؟ :'(
-
کد جدید:
#!/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:
-
#!/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 بنویس و روی یادگیری الگوریتمت تمرکز کن!
-
#!/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 بنویس و روی یادگیری الگوریتمت تمرکز کن!
میشه بگی دقیقا چیکار کردی من که همه این ها رو زدم !!! چرا ؟؟ چه فرقی کرد واقعا میخوام گریه کنم
زبان سی رو میپرستم ولی نمیخوام مثل آدم های تازه وارد ( نوب ) به دنبال این زبان بیفتم و باید از قبل یک آمادگی هم داشت چون حس میکنم ابهتش زیر سوال میره هرچند که روی اون هم کار میکنم.
سینتکس خیلی سخت وعجیبی داره بش ???
-
بیشتر اشتباهاتت احتمالا سر اندیس نذاستن و دستور declare هست.
من زیاد کار با declare را بلد نیستم، در اینترنت اصولی یادش بگیر.
زبان سی رو میپرستم ولی نمیخوام مثل آدم های تازه وارد ( نوب ) به دنبال این زبان بیفتم و باید از قبل یک آمادگی هم داشت چون حس میکنم ابهتش زیر سوال میره هرچند که روی اون هم کار میکنم.
نفهمیدم چی شد؟!
اگه واقعا اینقدر میخوای با بش الگوریتمو پیش ببری پس از در اسکریپتت از نحوه C در بش استفاده نکن.
-
بیشتر اشتباهاتت احتمالا سر اندیس نذاستن و دستور 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
-
شرت خاتمه دوتا حلقه رو ببین. اولی 9 هست و دومی 10
آیا به مرور زمان این بی دقتی ها رفع میشه!!؟
اگه تمرین کنی خطا هارو بخونی آره.
بی دقتیت این بوده که خطا هارو نمیخونی. طرف هم شماره خط خطارو گفته و هم نخ داده. هنوز به اون نقطه نرسیدم، اگه تو رسیدی به منم بگو که شاید اومید وار شدم. :P
-
شرت خاتمه دوتا حلقه رو ببین. اولی 9 هست و دومی 10
آیا به مرور زمان این بی دقتی ها رفع میشه!!؟
من هرجا میرم میخونم مینویسم دابل پرانتز با دابل براکت زیاد فرقی نداره و کار رو راه میندازه!
https://www.pluralsight.com/resources/blog/cloud/conditions-in-bash-scripting-if-statements
(https://www.pluralsight.com/resources/blog/cloud/conditions-in-bash-scripting-if-statements)
-
بش زبون برنامهنویسی نیست زبون اسکریپتنویسیه
-
بش زبون برنامهنویسی نیست زبون اسکریپتنویسیه
چرا یک زبان برنامه نویسیه. ولی از زبان های برنامه نویسی در قسمت کاربردشون جزء زبان های اسکریپتی هست.
-
بش زبون برنامهنویسی نیست زبون اسکریپتنویسیه
چیزی به نام «زبون اسکریپتنویسی» نداریم. کدنوشتهها هم برنامه هستن و bash یک زبان برنامهنویسیه.
-
درود
خواستم پبرسم کار با آرایه های چند بعدی در بش به چه صورت هست؟؟
لطفا نگید تنها راهش فقط 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 استفاده نکرده ؟