표준 입력에서 매개 변수(하루 학습 시간)를 가져와 학생이 정기적으로 공부하는지 확인하는 스크립트를 작성하고 싶습니다. 정규 학습이란 연속 7일 동안 하루 최소 4시간, 이 7일 중 최소 2일은 하루 최소 6시간(연속일 필요는 없음)을 의미합니다. 나는 이것을 시도했습니다 :
four_h=0
six_h=0
for i in $@ ; do
if [ $i -ge 6 ]; then let six_h=six_h+1
elif [ $i -ge 4 ]; then let four_h=four_h+1
else :
fi
done
if [ $four_h -ge 7 ] && [ $six_h -ge 2 ];
then echo "you are regularly studying"
else echo "you are not regularly studying"
fi
하지만 작동하지 않습니다. 반복할 수는 없지만 이유를 이해하지 못하는 것 같습니다. 그리고 학생이 4시간 이상 "지속적으로" 공부하는지 어떻게 확인하는지 모르겠습니다.
답변1
두 가지 조건이 충족되는지 확인해야 할 것 같습니다.
- 연속된 7개의 값 중 모든 숫자는 4 이상이어야 합니다.
- 연속된 7개의 숫자 중 2개가 6 이상이어야 합니다.
따라서 숫자 배열을 유지해야 하는 것처럼 보이며 배열에 정확히 7개의 숫자가 포함된 경우부터 두 가지 조건을 모두 확인해야 합니다.
그 후에는 시작할 수 있습니다바꾸다루프에서 배열의 숫자를 읽고 각각의 새 숫자에 대한 조건을 다시 확인하십시오.
아래 스크립트가 bash
바로 그 일을 합니다. 그냥 이렇게나타나다숙제 문제로 코드의 주석에 나와 있는 것 이상은 말하지 않겠습니다. 생각해보세요. 코드가 무엇인지도 모르고 숙제에 대한 답으로 코드를 사용한다면 스스로에게 해를 끼치는 것입니다. 코드의 품질이 귀하나 귀하의 동료가 보는 것과 다른 경우 부정행위로 기소될 수도 있습니다.
#!/bin/bash
has_studied () {
# Tests the integers (given as arguments) and returns true if
# 1. All numbers are 4 or larger, and
# 2. There are at least two numbers that are 6 or greater
local enough large
enough=0 large=0
for number do
[ "$number" -ge 4 ] && enough=$(( enough + 1 ))
[ "$number" -ge 6 ] && large=$(( large + 1 ))
done
# Just some debug output:
printf 'Number of sufficient study days: %d\n' "$enough" >&2
printf 'Number of long study days (out of those): %d\n' "$large" >&2
[ "$enough" -eq 7 ] && [ "$large" -ge 2 ]
}
# Array holding the read integers
ints=()
echo 'Please enter hours of study, one integer per line' >&2
echo 'End by pressing Ctrl+D' >&2
# Loop over standard input, expecting to read an integer at as time.
# No input validation is done to check whether we are actually reading
# integers.
while read integer; do
# Add the integer to the array in a cyclic manner.
ints[i%7]=$integer
i=$(( i + 1 ))
# If the array now holds 7 integers, call our function.
# If the function returns true, continue, otherwise terminate
# with an error.
if [ "${#ints[@]}" -eq 7 ]; then
if ! has_studied "${ints[@]}"; then
echo 'Has not studied!'
exit 1
fi
fi
done
# If the script hasn't terminated inside the loop, then all input has
# been read and the student appears to have studied enough.
echo 'Appears to have studied'
답변2
awk
버전 읽기stdin
awk 'BEGIN{print "Enter study hours and finish input with ctrl+d:"}
{if ($0 >=0) {count++; print $0" hours on day "count}
if ($0 >= 4 && $0 < 6) hrs[4]++;
if ($0 >= 6) hrs[6]++}
END{print "\nStudy scheme over "count" days:";
for (d in hrs) print d" hours studied on "hrs[d]" days";
if (hrs[4]+hrs[6] < 7 || hrs[6] < 2) not=" not";
print "You are"not" studying regularly"
}' -