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


CÁC BÀI TP V XÂU KÍ T
BÀI TP 1
Nhp vào mt xâu s khác rng và thc hin chun hoá xâu, tc là:
a)      Xoá các du cách tha
b)      Chuyn nhng kí t đầu t thành ch hoa, nhng kí t khác thành ch thường.
HƯỚNG DN
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 tha đầu xâu}
     while s[length(s)]=' ' do delete(s,length(s),1); {xoá các kí t cách tha cui xâu}
{xoá các kí t cách tha gia các t: nếu s[i-1] là cách thì s[i] là du cách là tha. Phi dùng vòng lp for down­to vì nếu trong quá trình xoá ta làm gim chiu dài ca xâu, nếu for to s không dng được.}
     for i := length(s) down­to 2 do
         if (s[i]=' ') and (s[i-1]=' ') then delete(s,i,1);
{Chuyn 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]) {Chuyn 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 mt t}
                s[i] := chr(ord(s[i]) + 32); {thì phi chuyn 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 TP 2
Nhp vào mt xâu x khác rng và thông báo xâu đó có phi là xâu đối xng hay không?
HƯỚNG DN
Xâu đối xng nếu nó bng chính xâu đảo ca nó. Vy cách đơn gin nht là ta s xây dng xâu đảo ca x và kim tra xem nó có bng x không. Để xây dng xâu đảo ca x, cách đơn gin nht là cng các kí t ca x theo th t ngược (t cui v đầu).
Chương trình:
var x : string;
(************************************************)
func­tion doix­ung(x : string) : boolean; {hàm kim tra xâu đối xng}
var y : string;
    i : in­te­ger;
be­gin
     y := '';
{xây dng y là xâu đảo ca x, bng cách cng dn các kí t ca 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 ca 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 TP 3
Nhp vào mt xâu s và đếm xem nó có bao nhiêu t. T là mt dãy các kí t, cách nhau bi du cách?
HƯỚNG DN
Cách đếm t đơn gin nht là đếm du cách: nếu s[i] là kí t khác cách và s[i-1] là kí t cách thì chng t s[i] là v trí bt đầu ca mt t. Chú ý là t đầu tiên ca xâu không có du cách đứng trước.
Chương trình:
var s : string;
{Hàm đếm s t ca mt xâu}
func­tion so­tu(s : string) : in­te­ger;
var i, dem : in­te­ger;
be­gin
{cng thêm du 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í bt đầ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 TP 4
Nhp vào mt xâu s và in ra các t ca nó (T là mt dãy các kí t, cách nhau bi du cách). Xâu có bao nhiêu tđối xng?
HƯỚNG DN
Có nhiu cách để tách mt xâu thành các t. Cách đơn gin nht tiến hành như sau:
1)      B qua các du cách cho đến khi gp mt kí t khác cách (hoc hết xâu).
2)      Ghi các kí t tiếp theo vào xâu tm cho đến khi gp du cách hoc hết xâu, khi đó ta được 1 t.
3)      Nếu chưa hết xâu thì quay li bước 1.
Mi khi tìm được mt t, ta ghi luôn nó ra màn hình, nếu t đó là đối xng thì tăng biến đếm. Ta cũng có th lưu các t tách được vào mt mng nếu bài tp yêu cu dùng đến nhng t đó trong các câu sau.
Chương trình:
var s : string;
    dem : in­te­ger;
{Hàm kim tra t đối xng}
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 tc thc hin 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 du cách cho đến khi hết xâu hoc gp 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ì dng}
           t := '';                             {t là biến tm lưu t đang tách}
{B2: ly các kí t khác cách đưa vào biến tm cho đến khi hết xâu hoc gp 1 kí t cách:}
           while (s[i]<>' ') and (i<=len) do be­gin
                 t := t + s[i];
                 inc(i);
           end;
{in ra t va tách được và kim tra đối xng}
           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 TP 5
Mt s nguyên gi là palin­drom nếu nó đọc t trái sang cũng bng đọc t phi sang. Ví d 121 là mt s palin­drom. Nhp mt dãy n phn t nguyên dương t bàn phím, 5<= n<=20 và các phn t có 2 đến 4 ch s. In ra các s là palin­drom trong dãy.
HƯỚNG DN
Mt s là palin­drom thì xâu tương ng ca nó là xâu đối xng. Ta s xây dng mt hàm kim tra mt s có phi là palin­drom không bng cách chuyn s đó thành xâu và kim tra xâu đó có đối xng không?
Chương trình:
us­es crt;
var  n : in­te­ger;
     a : ar­ray[1..20] of in­te­ger;
{Th tc nhp d liu}
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 khi vòng lp}
           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 kim tra bng các kim tra xâu đối xng}
func­tion palin­drom(k : in­te­ger): boolean;
var x,y : string;
    i : in­te­ger;
be­gin
     str(k,x);        {chuyn k thành xâu x}
     y := '';
     for i := length(x) down­to 1 do y := y + x[i];
{nếu x là đối xng 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