Kiểm tra xâu đối xứng pascal và C++
Đề bài: Nhập vào một xâu S từ bàn phím rồi kiểm tra xem đó có phải là xâu đối xứng hay không? – Xâu đối xứng là xâu khi đọc từ trái sang phải hoặc đọc từ phải sang trái đều như nhau VD: “aba”, “abcba”, “12321” là xâu đối xứng. Còn ...
Đề bài: Nhập vào một xâu S từ bàn phím rồi kiểm tra xem đó có phải là xâu đối xứng hay không?
– Xâu đối xứng là xâu khi đọc từ trái sang phải hoặc đọc từ phải sang trái đều như nhau
VD: “aba”, “abcba”, “12321” là xâu đối xứng. Còn “1232”, “aabcb”, “miticc06” không là xâu đối xứng.
I. Hướng dẫn giải BT kiểm tra xâu đối xứng trong pascal C++
1. Kiểm tra xâu đối xứng cách 1
– Cách đơn giản nhất là ta sẽ đọc ngược lại xâu S và lưu vào biến S1. sau đó kiểm tra 2 xâu có hoàn toàn giống nhau hay không?
ví dụ:
S=”abcde” => S1=”edcba”. 2 xâu này không giống nhau nên không là xâu đối xứng.
S=”aabccbaa” => S1=”aabccbaa”. 2 xâu này giống nhau hoàn toàn nên kết luận được là xâu đối xứng.
– Đây cũng là cách mà trong sách giáo khoa Tin học 11 chia sẻ.
- Đầu tiên chúng ta sẽ tạo xâu đảo ngược so với xâu ban đầu,
1 2 3 | VAR s1:string; for i:=length(s) downto 1 do s1:=s1+s[i]; |
- Sau đó chúng ta so sánh if (s1=s) then .....
a. Code kiểm tra xâu đối xứng cách 1 Pascal
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | program kiem_tra_xau_doi_xung; uses crt; var s, s1: string i:integer; begin clrscr; writeln('Nhap vao xau s: '); readln(s); for i:=length(s) downto 1 do s1:=s1+s[i]; if (s1=s) then writeln('Xau doi xung') else writeln('Xau khong doi xung'); readln; end. |
b. Code kiểm tra xâu đối xứng cách 1 c++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <iostream> #include <string> using namespace std; int main() { string s, s1=""; getline(cin,s); for (int i=s.length()-1; i>=0; i--) s1=s1+s[i]; if (s1==s) cout << "La xau doi xung"; else cout << "ko la xau doi xung"; return 0; } |
2. Kiểm tra xâu đối xứng cách 2
– Cách thứ 2 cải tiến từ cách thứ nhất, thay vì sinh lại một xâu nghịch đảo rồi so sánh thì chúng ta so sánh trực tiếp từng kí tự trên xâu gốc, nên thời gian chạy sẽ nhanh hơn cách thứ nhất.
– Nhận xét chung: do xâu đối xứng là xâu khi đảo ngược lại sẽ giống hoàn toàn vơi xâu gốc nên chúng ta có thể xét dựa vào so sánh lần lượt các phần tử đầu xâu với các phần tử cuối xâu.
ví dụ s=”abba”
ta có s[1]=s[4], s[2]=s[3] nên kết luận nó là xâu đối xứng.
Như vậy chúng ta chỉ cần cho biến i chạy từ 1 đến (độ dài xâu) chia 2 và so sánh s[i] với s[(độ dài xâu) – i +1] nếu tồn tại một chỗ mà 2 kí tự khác nhau chúng ta có thể kết luận ngay nó ko đối xứng.
a. Code tham khảo kiểm tra xâu đối xứng cách 2 pascal
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | program kiem_tra_xau_doi_xung; var s : string; k: integer; function doixung(s:string):Boolean; var i:integer; begin k:=length(s); for i:= 1 to (k div 2) do begin if s[i] <> s[k-i+1] then exit (False); end; exit(true); end; begin writeln('Nhap vao xau s: '); readln(s); if (doixung(s)=true) then writeln('Xau doi xung') else writeln('Xau khong doi xung'); readln; end. |
b. Code tham khảo kiểm tra xâu đối xứng cách 2 c++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <iostream> #include <string> using namespace std; bool doixung(string s) { for (int i=0; i<=s.length()/2; i++) if (s[i]!=s[s.length()-i-1]) return 0; return 1; } int main() { string s; getline(cin,s); if (doixung(s)) cout << "La xau doi xung"; else cout << "ko la xau doi xung"; return 0; } |
II. Bài tập tương tự
1. Hãy kiểm tra số nguyên được nhập vào có là số đối xứng không?
– Ở bài này có 2 cách làm là sử dụng div mod hoặc cũng có thể xử lí bằng xâu như ở trên.
2. Viết chương trình kiểm tra mảng số nguyên nhập vào có là xâu đối xứng hay không?