Một số bài tập về Xâu kí tự


CÁC BÀI TẬP VỀ XÂU KÍ TỰ
BÀI TẬP 1
Nhập vào một xâu s khác rỗng và thực hiện chuẩn hoá xâu, tức là:
a)      Xoá các dấu cách thừa
b)      Chuyển những kí tự đầu từ thành chữ hoa, những kí tự khác thành chữ thường.
HƯỚNG DẪN
Chương trình như sau:
var s : string;
pro­ce­dure chuan­hoa(var s : string); {s là tham biến để có thể thay đổi trong chương trình con}
var i : in­te­ger;
be­gin
     while s[1]=' ' do delete(s,1,1); {xoá các kí tự cách thừa ở đầu xâu}
     while s[length(s)]=' ' do delete(s,length(s),1); {xoá các kí tự cách thừa ở cuối xâu}
{xoá các kí tự cách thừa ở giữa các từ: nếu s[i-1] là cách thì s[i] là dấu cách là thừa. Phải dùng vòng lặp for down­to vì nếu trong quá trình xoá ta làm giảm chiều dài của xâu, nếu for to sẽ không dừng được.}
     for i := length(s) down­to 2 do
         if (s[i]=' ') and (s[i-1]=' ') then delete(s,i,1);
{Chuyển kí tự đầu xâu thành chữ hoa}
     s[1] := Up­case(s[1]);
     for i := 2 to length(s) do
         if s[i-1]=' ' then s[i] := Up­case(s[i]) {Chuyển s[i] là kí tự đầu từ thành chữ hoa.}
         else
             if s[i] in ['A'..'Z'] then   {s[i] là kí tự chữ hoa không ở đầu một từ}
                s[i] := chr(ord(s[i]) + 32); {thì phải chuyển thành chữ thường}
end;
BE­GIN
   write('Nhap vao 1 xau s:');
   readln(s);
   chuan­hoa(s);
   writeln('Xau s sau khi chuan hoa:',s);
   readln;
END.
BÀI TẬP 2
Nhập vào một xâu x khác rỗng và thông báo xâu đó có phải là xâu đối xứng hay không?
HƯỚNG DẪN
Xâu đối xứng nếu nó bằng chính xâu đảo của nó. Vậy cách đơn giản nhất là ta sẽ xây dựng xâu đảo của x và kiểm tra xem nó có bằng x không. Để xây dựng xâu đảo của x, cách đơn giản nhất là cộng các kí tự của x theo thứ tự ngược (từ cuối về đầu).
Chương trình:
var x : string;
(************************************************)
func­tion doix­ung(x : string) : boolean; {hàm kiểm tra xâu đối xứng}
var y : string;
    i : in­te­ger;
be­gin
     y := '';
{xây dựng y là xâu đảo của x, bằng cách cộng dần các kí tự của x vào y theo thứ tự ngược}
     for i := length(x) down­to 1 do y := y + x[i];
{so sánh x và xâu đảo của nó}
     if x=y then doix­ung := true else doix­ung := false;
end;
BE­GIN
     write('Nhap vao 1 xau:');
     readln(x);
     if doix­ung(x) then
        writeln('Xau doi xung!')
     else
        writeln('Xau khong doi xung!');
     readln;
END.
BÀI TẬP 3
Nhập vào một xâu s và đếm xem nó có bao nhiêu từ. Từ là một dãy các kí tự, cách nhau bởi dấu cách?
HƯỚNG DẪN
Cách đếm từ đơn giản nhất là đếm dấu cách: nếu s[i] là kí tự khác cách và s[i-1] là kí tự cách thì chứng tỏ s[i] là vị trí bắt đầu của một từ. Chú ý là từ đầu tiên của xâu không có dấu cách đứng trước.
Chương trình:
var s : string;
{Hàm đếm số từ của một xâu}
func­tion so­tu(s : string) : in­te­ger;
var i, dem : in­te­ger;
be­gin
{cộng thêm dấu cách phía trước xâu để đếm cả từ đầu tiên}
     s := ' ' + s; dem := 0;
     for i := 2 to length(s) do {s[i] là vị trí bắt đầu 1 từ}
         if (s[i-1]=' ') and (s[i]<>' ') then dem := dem + 1;
     so­tu := dem;
end;
BE­GIN
     write('Nhap vao 1 xau:');
     readln(s);
     writeln('So tu trong xau la:',so­tu(s));
     readln;
END.
BÀI TẬP 4
Nhập vào một xâu s và in ra các từ của nó (Từ là một dãy các kí tự, cách nhau bởi dấu cách). Xâu có bao nhiêu từ là đối xứng?
HƯỚNG DẪN
Có nhiều cách để tách một xâu thành các từ. Cách đơn giản nhất tiến hành như sau:
1)      Bỏ qua các dấu cách cho đến khi gặp một kí tự khác cách (hoặc hết xâu).
2)      Ghi các kí tự tiếp theo vào xâu tạm cho đến khi gặp dấu cách hoặc hết xâu, khi đó ta được 1 từ.
3)      Nếu chưa hết xâu thì quay lại bước 1.
Mỗi khi tìm được một từ, ta ghi luôn nó ra màn hình, nếu từ đó là đối xứng thì tăng biến đếm. Ta cũng có thể lưu các từ tách được vào một mảng nếu bài tập yêu cầu dùng đến những từ đó trong các câu sau.
Chương trình:
var s : string;
    dem : in­te­ger;
{Hàm kiểm tra từ đối xứng}
func­tion doix­ung(x : string) : boolean;
var y : string;
    i : in­te­ger;
be­gin
     y := '';
     for i := length(x) down­to 1 do y := y + x[i];
     if x=y then doix­ung := true else doix­ung := false;
end;
{Thủ tục thực hiện tách từ}
pro­ce­dure tach;
var i, len : in­te­ger;
    t : string;
be­gin
     writeln('Cac tu trong xau:');
     i := 1; len := length(s);
     re­peat
{B1: bỏ qua các dấu cách cho đến khi hết xâu hoặc gặp 1 kí tự khác cách:}
           while (s[i]=' ') and (i<=len) do inc(i);
           if i>=len then break; {nếu hết xâu thì dừng}
           t := '';                             {t là biến tạm lưu từ đang tách}
{B2: lấy các kí tự khác cách đưa vào biến tạm cho đến khi hết xâu hoặc gặp 1 kí tự cách:}
           while (s[i]<>' ') and (i<=len) do be­gin
                 t := t + s[i];
                 inc(i);
           end;
{in ra từ vừa tách được và kiểm tra đối xứng}
           writeln(t);
           if doix­ung(t) then inc(dem);
     un­til i >= len;
     writeln('So tu doi xung trong xau:',dem);
end;
(************************************************)
BE­GIN
     write('Nhap vao 1 xau:');
     readln(s);
     tach;
END.
BÀI TẬP 5
Một số nguyên gọi là palin­drom nếu nó đọc từ trái sang cũng bằng đọc từ phải sang. Ví dụ 121 là một số palin­drom. Nhập một dãy n phần tử nguyên dương từ bàn phím, 5<= n<=20 và các phần tử có 2 đến 4 chữ số. In ra các số là palin­drom trong dãy.
HƯỚNG DẪN
Một số là palin­drom thì xâu tương ứng của nó là xâu đối xứng. Ta sẽ xây dựng một hàm kiểm tra một số có phải là palin­drom không bằng cách chuyển số đó thành xâu và kiểm tra xâu đó có đối xứng không?
Chương trình:
us­es crt;
var  n : in­te­ger;
     a : ar­ray[1..20] of in­te­ger;
{Thủ tục nhập dữ liệu}
pro­ce­dure nhap;
var i : in­te­ger;
be­gin
     clrscr;
     re­peat
           write('n= '); readln(n);
           if (n<=20) and (n>=5) then break; {nếu đã thoả mãn thì thoát khỏi vòng lặp}
           writeln('Yeu cau 5<=n<=20. Nhap lai!');
     un­til false;
     for i := 1 to n do
          re­peat
                write('A[',i,']='); readln(a[i]);
                if (a[i]<=9999) and (a[i]>=10) then break; {a[i] có 2 đến 4 chữ số}
                writeln('Yeu cau cac phan tu co 2 den 4 chu so. Nhap lai!');
          un­til false;
end;
{Hàm kiểm tra bằng các kiểm tra xâu đối xứng}
func­tion palin­drom(k : in­te­ger): boolean;
var x,y : string;
    i : in­te­ger;
be­gin
     str(k,x);        {chuyển k thành xâu x}
     y := '';
     for i := length(x) down­to 1 do y := y + x[i];
{nếu x là đối xứng thì k là palin­drom}
     if x=y then palin­drom := true else palin­drom := false;
end;
{In kết quả:}
pro­ce­dure palin;
var i : in­te­ger;
be­gin
     writeln('Cac so la palin­drom trong day:');
     for i := 1 to n do
         if palin­drom(a[i]) then writeln(a[i]);
     readln;
end;
(* Chương trình chính *)
BE­GIN
     nhap;
     palin;
END.

Không có nhận xét nào:

Đăng nhận xét