다음과 같이 중첩 루프를 사용하여 삼각형을 그리고 싶습니다 bash
.
/\
/ \
/ \
/ \
/________\
이것은 내 스크립트입니다.
#!/bin/bash
read -r -p "Enter depth of pyramid: " n
echo "You enetered level: $n"
s=0
space=n
for((i=1;i<=n;i++))
do
space=$((space-1)) #calculate how many spaces should be printed before /
for((j=1;j<=space;j++))
do
echo -n " " #print spaces on the same line before printing /
done
for((k=1;k<=i;k++))
do
if ((i==1))
then
echo -n "/\ " #print /\ on the same line
echo -n " " #print space after /\ on the same line
elif((k==1))
then
echo -n "/" #print / on the same line
elif((k==i))
then
for((l=1;l<=k+s;l++))
do
echo -n " " #print spaces on the same line before printing /\
done
s=$((s+1)) #as pyramid expands at bottom, so we need to recalculate inner spaces
echo -n "\ " #print \ on the same line
fi
done
echo -e #print new line after each row
done
짧은 버전을 찾도록 도와주세요.
답변1
$ ./script.sh
Size: 5
/\
/ \
/ \
/ \
/________\
#!/bin/bash
read -p 'Size: ' sz
for (( i = 0; i < sz-1; ++i )); do
printf '%*s/%*s\\\n' "$((sz-i-1))" "" "$((2*i))" ""
done
if [[ $sz -gt 1 ]]; then
printf '/%s\\\n' "$( yes '_' | head -n "$((2*i))" | tr -d '\n' )"
fi
나는 선택했다아니요느리고 불필요하므로 중첩 루프를 사용하십시오. 삼각형의 각 비트는 printf
현재 줄을 기준으로 문자 사이의 간격을 지정하는 형식을 사용하여 인쇄됩니다./
\
i
맨 아래 행은 특별하며 삼각형의 크기가 허용하는 경우에만 인쇄됩니다.
유제:
답변2
이것이 나의 시도이다. 더 나은 변수 이름, 인용된 변수, 특수 사례 없음, 변수 돌연변이 없음(루프 카운터 제외), 주석 설명 없음에 유의하세요.무엇코드가 수행하며(이것이 코드의 작업이며, 주석은 이유를 설명하거나 언어의 약점을 채워야 함) 루프가 적습니다.
#!/bin/bash
if (($# == 0))
then
read -r -p "Enter depth of pyramid: " requested_height
elif (($# == 1))
then
requested_height="$1"
fi
echo "You enetered level: $requested_height"
left_edge="/"
right_edge=\\
#this procedure can be replaced by printf, but shown here to
#demonstrate what to do if a built in does not already exist.
function draw_padding() {
width="$1"
for((i=1;i<=width;i++))
do
echo -n " "
done
}
for((line_number=1;line_number<=requested_height;line_number++))
do
initial_spaces=$((requested_height-line_number))
draw_padding "$initial_spaces"
echo -n "$left_edge"
middle_spaces="$(((line_number-1) * 2 ))"
draw_padding "$middle_spaces"
echo "$right_edge"
done
내가 한 일: - 내가 읽을 수 있도록 코드를 들여쓰기하고 이름을 잘 지정했습니다. - 조건부 질문:모두줄에는 a /
와 a 가 있으므로 \
변경되는 사항은 앞의 공백과 사이의 공백입니다.
원래 사양에 따르면 아직 완성되지 않았음을 참고하시기 바랍니다. 과제라면 더 많이 연습했을 거예요. 이렇게 하지 않으면 코스 후반에 벽에 부딪히게 됩니다. 오늘은 이번 시도나 이전 시도를 보지 않고 이 프로그램을 세 번 작성해 보세요. 그런 다음 3일 동안 하루에 한 번, 그 다음에는 일주일에 한 번씩 합니다. 비슷한 코딩 과제로 계속 연습하세요. (기타를 배우는 것처럼 연습도 해야 합니다.)