Giải bài tập Turbo Pascal - Bài 10 trang 80

Đề: Hãy viết chương trình nhập từ bàn phím xâu kí tự s có độ dài không quá 100. Hãy viết chương trình cho biết có bao nhiêu chữ số xuất hiện trong xâu s. Thông báo kết quả ra màn hình.

#TEST

Input:'khanh98'
Output: Co 2 chu so xuat hien trong xau

Input:'a123b1c2h456a'
Ouput: Co 6 chu so xuat hien trong xau

#Ý tưởng

1. Đề bài yêu cầu là xâu s có độ dài không quá 100 kí tự nên ta sẽ khai báo là : var s: string[100];
Như vậy, dù có nhập bao nhiêu kí tự thì máy nó cũng chỉ đọc vào tối đa 100 kí tự
2. Ta sẽ xét kí tự s[1] của xâu, vì sau khi xét thì ta lại xóa kí tự s[1] đi nên sau mỗi lần xét thì ta lại được s[1] mới. Ta sẽ gán s[1] vào một xâu s1
2. Vì xâu kí tự thì bao gồm cả chữ cái (a,b.c,...) và số (1,2,3,...) nên ta cần phải phân biệt được hai loại kí tự này. Để phát hiện xem s1 có phải là số hay không thì ta có hai cách:
  • Sử dụng một sâu s2 khác và gán s2:='0123456789'; sau đó ta dùng hàm POS(s1,s2) để kiểm tra xem kí tự đó có xuất hiện trong s2 không, nếu có thì nó là số.
  • Hoặc là các bạn sử dụng hàm ORD(s1) để lấy thứ tự thập phân của kí tự trong bảng mã ASCII (Trang 169, sgk tin học 10) . Ta đã biết rằng, kí số có mã thập phân nằm từ 48 cho tới 57 nên khi kiểm tra mà thấy mã thập phân của kí tự nào nằm trong khoảng đó thì ta biết ngay đó là 1 kí tự số
3. Khi phát hiện và đếm được một số thì ta phải thủ tiêu hoàn toàn số đó trong xâu để tránh đếm hai lần. Ta dùng vòng lặp While do và lệnh delete(s,pos(s1,s),1) 
4. Khi kiểm tra mà thấy có kí tự nào không phải là số thì cũng xóa hết kí tự đó trong xâu
5. Để ý từ bước 2 cho tới bước 4 thì thấy rằng ta sẽ đếm được một kí tự và xóa hết kí tự đó trong xâu nên ta sẽ dùng vòng lặp repeat until để lặp lại quá trình từ 2 đến 4, lặp cho đến khi length(s) = 0


#Thuật toán

Bước 1: Nhập xâu s; s1:= s[1]; s2:='0123456789'; c:=0;
Bước 2: Nếu length(s) = 0 thì kết thúc chương trình và xuất thông báo ra màn hình, ngược lại thì chuyển tới bước 3.
Bước 3: Nếu xâu s1 xuất hiện trong xâu s2 thì c:= c+1;
Bước 4: Xóa tất cả kí tự bằng xâu s1 trong xâu s và quay lại bước 2.

#Chương trình

Chương trình dưới đây sử dụng xâu s2='0123456789' và hàm Pos(s1,s2) để kiểm tra xem s1 có phải là một kí tự số hay không. Còn một cách khác là sử dụng hàm Ord(s1) như mình đã nói ở trên rồi đó, các bạn hãy tự viết xem sao. Mọi khó khăn xin bình luận xuống phía dưới, mình sẽ giải đáp tất cả trong vòng 24h.
{giai bai tap turbo pascal - bai 10 trang 80 sgk tin hoc 11}
program bai10trang80;
uses crt;
var s,s1,s2: string[100];
c,i : integer;

BEGIN
   clrscr;
   writeln('Nhap vao mot xau');
   readln(s);
   s1:='0123456789';
   repeat
      begin
         s2:=s[1];
         if pos(s2,s1) <> 0 then
     inc(c);
         while pos(s2,s) <> 0 do
         delete(s,pos(s2,s),1);
      end;
   until length(s)=0;
   writeln('Co ',c,' chu so xuat hien trong xau');
   readln;
END.

Comments