Hoán vị giá trị của 2 biến 1
In ra Ước Số Chung Lớn Nhất của 2 số 1
In ra bội số chung nhỏ nhất của 2 số 1
Kiểm tra xem một chuỗi có phải là chuỗi số hay không 2
Kiểm tra xem số nhập vào có phải là số nguyên tố không 2
In ra các số nguyên tố trong khoảng từ min tới max 2
Nhập vào một chuỗi số, tách ra thành từng cặp 2 chử số và kiểm xem có phải là số nguyên tố hay không 3
Giải phương trình bậc 2 3
Giải hệ phương trình bậc 1 4
Nhập vào 2 ký tự, xuất ra tổng mã ASCII của chúng 5
In ra ngày giờ hệ thống bằng Tiếng Việt 5
Tính toán 2 số nhập từ bàn phím 6
Giả lập máy tính cá nhân 6
7 trang |
Chia sẻ: maiphuongtl | Lượt xem: 2226 | Lượt tải: 3
Bạn đang xem nội dung tài liệu Ôn thi thực hành Linux, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Hoán vị giá trị của 2 biến
Vidu: a=3; b=6; HoanVi a b; -> a=6, b=3
HoanVi()
{
//Khai báo biến
declare local HV_tmp
//Chi thực hiện khi cả 2 tên biến đều khác NULL
if [ "$1" != "" ] && [ "$2" != "" ]; then
eval HV_tmp='$'$1
eval $1='$'$2
eval "$2='$HV_tmp'"
fi
return 0 //TRUE
}
In ra Ước Số Chung Lớn Nhất của 2 số
(Là số lớn nhất mà cả 2 số nhập vào có thể chia hết)
VD: a=45; b=20; USCLN $a $b; -> 5
USCLN()
{
//Khai báo biến
local a=$1
local b=$2
//Thực hiện tìm USCLN của a,b
while ! [ $a -eq $b ]; do
[ $a -gt $b ] && let "a -= $b" || let "b -= $a"
done
//In kết quả
echo $a
return `[ $a -gt 1 ]`
}
In ra bội số chung nhỏ nhất của 2 số
Là số nhỏ nhất có thể chia hết cho cả 2 số nhập vào
Vi du: a=9; b=6; BSCLN $a $b; -> 18
BSCNN()
{
//Khai báo biến
local a=$1
local b=$2
//Thực hiện tìm BSCNN của a,b
while ! [ $a -eq $b ]; do
[ $a -lt $b ] && let "a += $1" || let "b += $2"
done
//In kết quả
echo $a
return 0 //TRUE
}
Kiểm tra xem một chuỗi có phải là chuỗi số hay không
KiemTraSo()
{
//Nếu chuỗi có chứa các ký tự khác số -> báo lỗi
if [ "$1" = "" ]; then
echo "Chuoi rong!"
return 1 //FALSE
fi
if [ "$( echo "$1" | sed 's/[0-9]//g' )" != "" ]; then
echo "$1 khong phai la so"
return 1 //FALSE
fi
return 0 //TRUE
}
Kiểm tra xem số nhập vào có phải là số nguyên tố không
Vi du: IsNguyenTo 23 -> TRUE
IsNguyenTo()
{
//Khai báo biến
declare local i
declare local x2
local x=$1
//Kiểm tra các trường hợp đặc biệt
// /1/ là số nguyên tố
[ "$x" = "1" ] && return 0 //TRUE
// /2/ là số nguyên tố
[ "$x" = "2" ] && return 0 //TRUE
// /số chẵn/ không là số nguyên tố
[ $(($x%2)) -eq 0 ] && return 1 //FALSE
//Kiểm tra các trường hợp còn lại
x2=$(( $x / 2 ))
for ((i=3; i<=$x2; i+=2)); do
//Neu x chia het cho i thi x khong la so nguyen to
[ $(($x%$i)) -eq 0 ] && return 1 //FALSE
Done
//Nếu x không chia hết cho số nào cả (i > x/2) thì x là số nguyên tố
return `[ $i -gt $x2 ]`
}
In ra các số nguyên tố trong khoảng từ min tới max
Vi du: DayNguyenTo 6 26 -> 7 11 13 17 19 23
DayNguyenTo()
{ //Khai báo biến
local min=$1
local max=$2
declare local i
//Nếu min>max thì đổi giá trị của 2 biến min và max
if [ $min -gt $max ]; then
min=$2; max=$1
fi
//Trường hợp đạc biệt: "2" là số nguyên tố
if [ $min -lt 3 ] && [ $max -ge 2 ]; then
echo -n "2 "
fi
//Thông thường, các số nguyên tố đều là số lẻ
//Nếu min là số chẵn thì min=min+1
[ $(($min%2)) -eq 0 ] && let min+=1
//Duyệt qua các số lẻ từ min tới max
for ((i=min; i<=max; i+=2)); do
if IsNguyenTo $i; then
echo -n "$i "
fi
done
echo
return 0 //TRUE
}
Nhập vào một chuỗi số, tách ra thành từng cặp 2 chử số và kiểm xem có phải là số nguyên tố hay không
Vi du: Nhap 7913281
KQ: 79 la SNT
13 la SNT
28 khong la SNT
1 la SNT
ChuoiSoNguyenTo()
{
read -p "nhap vao mot chuoi so: " ChuoiSo
if ! KiemTraSo "$ChuoiSo"; then return; fi
echo "$ChuoiSo" | while read -n 2 So; do
if IsNguyenTo $So; then
echo "$So la so nguyen to"
else
echo "$So khong la so nguyen to"
fi
done
}
Giải phương trình bậc 2
GPTB2()
{
echo "Giai phuong trinh bac 2: ax^2 + bx + c = 0"
read -p "Nhap a: " a
if ! KiemTraSo "$a"; then return 1; fi
read -p "Nhap b: " b
if ! KiemTraSo "$b"; then return 1; fi
read -p "Nhap c: " c
if ! KiemTraSo "$c"; then return 1; fi
if [ $a -eq 0 ]; then
if [ $b -eq 0 ]; then
if [ $c -eq 0 ]; then
echo "Phuong trinh co vo so nghiem"
else
echo "Phuong trinh vo nghiem"
fi
else
x=$( echo "scale=2; -$c / $b" | bc -l )
echo "Phuong trinh co mot nghiem don la: x = $x"
fi
else
let "delta = $b**2 - 4*$a*$c"
if [ $delta -lt 0 ]; then
echo "Phuong trinh vo nghiem do delta<0"
elif [ $delta -eq 0 ]; then
x=$( echo "scale=2; -$b / (2*$a)" | bc -l )
echo "Phuong trinh co nghiem kep la: x1 = x2 = $x"
else
x1=$( echo "scale=2; (-$b+sqrt($delta))/(2*$a)" | bc -l )
x2=$( echo "scale=2; (-$b-sqrt($delta))/(2*$a)" | bc -l )
echo "Phuong trinh co 2 nghiem la: x1=$x1, x2=$x2"
fi
fi
return 0 //TRUE
}
Giải hệ phương trình bậc 1
GHPTB1()
{
echo "Giai he phuong trinh bac 1: a1x + b1y = c1"
echo " a2x + b2y = c2"
read -p "Nhap a1: " a1
if ! KiemTraSo "$a1"; then return 1; fi
read -p "Nhap b1: " b1
if ! KiemTraSo "$b1"; then return 1; fi
read -p "Nhap c1: " c1
if ! KiemTraSo "$c1"; then return 1; fi
read -p "Nhap a2: " a2
if ! KiemTraSo "$a2"; then return 1; fi
read -p "Nhap b2: " b2
if ! KiemTraSo "$b2"; then return 1; fi
read -p "Nhap c2: " c2
if ! KiemTraSo "$c2"; then return 1; fi
let "D = $a1*$b2 - $a2*$b1"
let "Dx = $c1*$b2 - $c2*$b1"
let "Dy = $a1*$c2 - $a2*$c1"
if [ $D -eq 0 ] && [ $Dx -eq 0 ] && [ $Dy -eq 0 ]; then
echo "He co vo so nghiem!"
else
if [ $D -eq 0 ]; then
echo "He vo nghiem!"
else
x=$( echo "scale=2; ($Dx/$D)" | bc -l )
y=$( echo "scale=2; ($Dy/$D)" | bc -l )
echo "He co nghiem la: x=$x, y=$y"
fi
fi
return 0 //TRUE
}
Nhập vào 2 ký tự, xuất ra tổng mã ASCII của chúng
TongMaAscii()
{
read -n 2 -p "Nhap vao 2 ky tu: " HaiKyTu
// read -n -> Chỉ đọc vào tối đa là ký tự
echo
ChuoiAscii=$( echo -n "$HaiKyTu" | od -A n -t d1 )
ChuoiTong=$( echo $ChuoiAscii | sed "s/ / + /g" )
Tong=$(($ChuoiTong))
echo "Tong ma ascii cua 2 ky tu la: "$ChuoiTong" = $Tong"
}
In ra ngày giờ hệ thống bằng Tiếng Việt
vnNgayGio()
{
NgayHienTai=$( date )
ChuoiThanhPhan=$( echo $NgayHienTai | tr ":" " " )
// Do có field gio:phut:giay -> cần chuyển thành gio phut giay
Thu=$( echo $ChuoiThanhPhan | cut -d" " -f1 )
Thang=$( echo $ChuoiThanhPhan | cut -d" " -f2 )
Ngay=$( echo $ChuoiThanhPhan | cut -d" " -f3 )
Gio=$( echo $ChuoiThanhPhan | cut -d" " -f4 )
Phut=$( echo $ChuoiThanhPhan | cut -d" " -f5 )
Giay=$( echo $ChuoiThanhPhan | cut -d" " -f6 )
Nam=$( echo $ChuoiThanhPhan | cut -d" " -f8 )
Buoi=$( [ $Gio -gt 12 ] && echo "chieu" || echo "sang" )
case "$Thu" in
"Mon") vnThu="Thu Hai";;
"Tue") vnThu="Thu Ba";;
"Wen") vnThu="Thu Tu";;
"Thu") vnThu="Thu Nam";;
"Fri") vnThu="Thu Sau";;
"Sat") vnThu="Thu Bay";;
"Sun") vnThu="Chu Nhat";;
"*") vnThu="";;
esac
case "$Thang" in
"Jan") vnThang="1";;
"Fre") vnThang="2";;
"Mar") vnThang="3";;
"Apr") vnThang="4";;
"May") vnThang="5";;
"Jun") vnThang="6";;
"Jul") vnThang="7";;
"Aug") vnThang="8";;
"Sep") vnThang="9";;
"Oct") vnThang="10";;
"Nov") vnThang="11";;
"Dec") vnThang="12";;
*) vnThang="";;
esac
//In ra chuỗi ngày giờ
echo "$vnThu ngay $Ngay thang $vnThang nam $Nam, bay gio la $Gio gio $Phut phut $Giay giay $Buoi"
}
Tính toán 2 số nhập từ bàn phím
Tinh2So()
{
if [ "$1" = "" ]; then
read -p "Nhap chuoi tinh toan (m [+-*/] n): " BieuThuc
else
BieuThuc="$@"
fi
//Kiểm tra biểu thức hợp lệ
if [ "$( echo "$BieuThuc" | grep "^[0-9]* *[+*/-] *[0-9]*$" )" = "" ]; then
echo "Bieu thuc khong dung!"
return
fi
KetQua=$( echo "scale=2; $BieuThuc" | bc -l )
echo "$BieuThuc = $KetQua"
}
Giả lập máy tính cá nhân
MayTinhCaNhan()
{
BackSpace=$( echo -e "\b \b" )
Enter=$( echo -e "\n" )
declare KetQua
declare So
declare Dau
declare KyTu
echo "Nhan 0 1 2 3 4 5 6 7 8 9 + - * / = "
echo " Nhan cac phim khac de ket thuc ham"
echo -n ": "
KetQua=0; So=""; Dau=""
while :; do
//Đọc một ký tự, -s -> không hiển thị ký tự đó ra màn hình
read -n 1 -s KyTu
case $KyTu in
[0-9]) //Nếu ký tự nhập vào là số thì
if [ "$So" = "" ]; then
//Xoá dòng nhập khi bắt đầu số mới
len=${#KetQua}
for ((i=0; i<len; i++)); do
echo -en "$BackSpace"
done
fi
//Thêm KyTu vào So
So=$So$KyTu
//In ký tự vừa nhập ra màn hình
echo -n $KyTu
;;
[+*/=]|"-"|"$Enter")
//Nếu nhập vào là dấu (không khải số) thì
if [ "$So" = "" ]; then
So=$KetQua
fi
if [ "$Dau" = "" ]; then
//Nếu chưa gõ dấu,ó nghĩa là vừa nhập xong số thứ nhất -> không phải thực hiện phép tính
KetQua=$So
else
//Nếu đã gõ dấu có nghĩa là vừa nhập xong số thứ 2 -> Thực hiện phép tính
if [ "$Dau" = "/" ] && [ $So -eq 0 ]; then
//Lỗi: device by zero
KetQua=""
else
KetQua=$( echo "scale=2; ($KetQua $Dau $So)" | bc -l )
fi
fi
//Xóa số vừa nhập và hiện KetQua
len=${#So}
for ((i=0; i<len; i++)); do
echo -en "$BackSpace"
done
echo -en $KetQua
//Khởi gán lại các biến
So=""; Dau=""
//Nếu ký tự (dấu) nhập vào không phải là “=” thì lưu lại
if [ "$KyTu" != "=" ]; then
Dau=$KyTu
fi
;;
*) //Nếu nhấn các phím khác thì kết thúc chương trình
break;;
esac
done
echo
}