Bài tập xâu cơ bản trong Pascal – Tài liệu text

Bài tập xâu cơ bản trong Pascal

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (641.31 KB, 29 trang )

KIỂU DỮ LIỆU CÓ CẤU TRÚC TRONG PASCAL

BÀI TẬP XÂU
CƠ BẢN-NÂNG CAO

GV: Phạm Thị Bích Tường
Email: [email protected]

THÀNH PHỐ HỒ CHÍ MINH – 2018
1

MỤC LỤC
BÀI TẬP CƠ BẢN …………………………………………………………………………………………………….. 3
Bài tập 1: Nhập xâu kí tự bất kì …………………………………………………………………………….. 3
a)
Đếm số lần xuất hiện của 1 kí tự nào đó trong câu. ……………………………………….. 3
b)
Liệt kê các kí tự có mặt trong xâu cùng số lần xuất hiện của các kí tự đó. …… 3
Bài 2: Nhập 1 xâu kí tự. …………………………………………………………………………………………. 3
a)
Xét xem trong xâu có K kí tự kề nhau mà như nhau hay không? ……………….. 3
b)
Hãy xóa đi kí tự kề nhau mà như nhau, chỉ giữ lại một. ……………………………… 3
Bài 3: Nhập 1 xâu kí tự. Kiểm tra tính đối xứng của xâu đó. Nếu xâu không đối
xứng thì đảo xâu. ……………………………………………………………………………………………….. 4
Bài 4: Cho 1 xâu kí tự. Tính xem trong số đó có bao nhiêu loại kí tự khác nhau (
không phân biệt in hoa hay in thường). ………………………………………………………………. 5
Bài 5: Cho 1 xâu kí tự bất kì, tính: Số lượng các kí tự số, Số lượng các kí tự chữ cái.
………………………………………………………………………………………………………………………….. 6
Bài 6: Cho 1 xâu kí tự bất kì (cả số lẫn chữ). Viết chương trình tách các phần là số

của xâu trên và đưa ra 1 mảng số nguyên. ………………………………………………………….. 7
Bài 7: Nhập vào 1 xâu. Biến đổi thành chữ in hoa. ………………………………………………. 8
Bài 8: Nhập vào 1 xâu. Biến đổi in thường. …………………………………………………………. 9
Bài 9: Nhập vào 1 chuỗi, in ra chuỗi ngược. ………………………………………………………… 9
Bài 10: Nhập vào danh sách HS 1 lớp. Sắp xếp lại danh sắp theo thứ tự tăng dần
theo chiều dài của tên. …………………………………………………………………………………….. 10
Bài 11: Nhập vào họ tên bất kì sau đó biến đổi các chữ cái đầu tiên là in hoa……… 10
Bài 12: Nhập vào 1 đoạn văn. Tính số câu…………………………………………………………. 11
Bài 13: Nhập vào 1 số, xóa bỏ các chữ số lẻ. Xuất kết quả dưới dạng đối xứng của
phần còn lại. Vd:1 2 4 5 6 –> 2 4 6 6 4 2 ……………………………………………………………. 11
Bài 14: Nhập vào 1 số, xóa bỏ các chữ số chẵn. Kiểm tra số còn lại có bao nhiêu chữ
số. Xuất kết quả dưới dạng đối xứng của phần còn lại. ……………………………………… 12
Bài 15: Nhập chuỗi gồm cả chữ và số. Xuất ra màn hình các số riêng và các chữ
riêng. Hãy đếm số lần xuất hiện của mỗi chữ, mỗi số. ………………………………………… 12
Bài 16: Nhập 1 xâu kí tự và bỏ đi tất cả các khoảng trống bên trái của nó………….. 13
Bài 17: Dùng hàm “copy”. Tách từ đầu tiên ra khỏi 1 xâu kí tự cho trước. ………… 14
Bài 18: Vị Giám đốc công ty XYZ cần gửi một văn bản quan trọng tới một đối tác
của mình. Để bảo mật văn bản, ông quyết định mã hóa văn bản trước khi gửi. Văn
bản là một xâu S các chữ cái la tinh in thường. Ông ta chia văn bản thành hai đoạn
liên tiếp Sb và Se. Lần lượt viết hai xâu Sb và Se nhưng đều theo thứ tự ngược lại
ông ta nhận được xâu mã hóa Q. Bức thư thứ nhất gửi cho đối tác có nội dung là Q.
Để đối tác đọc được văn bản, ông ta gửi thêm một bức thư thứ hai trong đó chứa
khóa để giải mã: độ dài k của xâu Sb. ……………………………………………………………….. 14
Bài 19: Trong giờ học Lập trình về xử lý chuỗi. Thầy giáo có cho một bài tập như
sau: Thầy sẽ đọc họ và tên của một bạn sinh viên bất kỳ trong lớp. Công việc của
chúng ta là hãy viết một chương trình để tách Họ, Tên Lót (tên đệm), và Tên của
bạn đó ra …………………………………………………………………………………………………………. 15
Bài tập 20: Viết chương trình thực hiện phép cộng 2 số tự nhiên lớn (không quá
255 chữ số). ……………………………………………………………………………………………………… 16
BÀI TẬP NÂNG CAO …………………………………………………………………………………………….. 17

Đề bài số 1 ……………………………………………………………………………………………………….. 17
Đề bài 2……………………………………………………………………………………………………………. 19
2

BÀI TẬP CƠ BẢN
Bài tập 1: Nhập xâu kí tự bất kì
a) Đếm số lần xuất hiện của 1 kí tự nào đó trong câu.
b) Liệt kê các kí tự có mặt trong xâu cùng số lần xuất hiện của các kí tự
đó.
Bài giải:
uses crt;
var str:string[100];
chu:array[#1..#254] of integer;
i:integer;
ch:char;
begin
clrscr;
for ch:=#1 to #254 do chu[ch]:=0;
write(‘ Nhap chuoi = ‘);readln(str);
for i:=1 to length(str) do
(chu[upcase(str[i])]):=chu[upcase(str[i])] +1;
writeLn(‘Cac ki tu trong xau la:’);
for ch:=#1 to #254 do
if chu[ch]>0 then writeln(ch, ‘: xuat hien ‘,chu[ch],’ lan’);
readln;
end.
Bài 2: Nhập 1 xâu kí tự.
a) Xét xem trong xâu có K kí tự kề nhau mà như nhau hay không?
b) Hãy xóa đi kí tự kề nhau mà như nhau, chỉ giữ lại một.

Bài giải:
uses crt;
var ch:string[100];
i,k,d,d1,n:integer;
(*****)
function xoa:boolean;
var i:integer;
begin
3

xoa:=false;
for i:=1 to length(ch)-1 do
if ch[i]=ch[i+1] then
begin
delete(ch,i,1);
xoa:=true;
exit
end;
end;
(*****)
begin
clrscr;
write(‘Nhap chuoi :’);readln(ch);
write(‘Nhap ki tu K:’);readln(k);
n:=length(ch);
d:=0;d1:=0;
for i:=1 to n-1 do
begin

if ch[i]=ch[i+1] then inc(d1)
else d1:=0;
if d1+1>=k then inc(d);
end;
if d>0 then writeln(‘Co ‘,k,’ ki tu nhu nhau’)
else writeln(‘Khong co ‘,k,’ ki tu nhu nhau’);
while xoa do;
write(‘In lai xau sau khi xoa:’);
writeln(ch);
readln;
end.

Bài 3: Nhập 1 xâu kí tự. Kiểm tra tính đối xứng của xâu đó. Nếu xâu không
đối xứng thì đảo xâu.
Bài giải:
uses crt;
var str,s:string[100];
n,i:integer;
(*****)
procedure sx(var a,b:char);
var tam:char;
4

begin
tam:=a;
a:=b;
b:=tam;
end;
procedure dao(n,i:integer);

var j:integer;
begin
for j:=i+1 to n do
if str[i]=str[j] then
begin
sx(str[j],str[n-i+1]);
exit
end;
end;
(*****)
begin
clrscr;
write(‘Nhap xau:’);readln(str);
n:=length(str);
s:=”;
for i:=n downto 1 do s:=s+str[i];
if str=s then writeln(‘Chuoi doi xung:’)
else
begin
writeln(‘Chuoi ko doi xung, chuoi da dao doi xung:’);
for i:=1 to n-1 do
dao(n,i);
end;
writeln(str);
readln;
end.
Bài 4: Cho 1 xâu kí tự. Tính xem trong số đó có bao nhiêu loại kí tự khác
nhau ( không phân biệt in hoa hay in thường).

Bài giải:

uses crt;
var s:string;
i,j,dem:integer;
t:boolean;
5

begin
clrscr;
write(‘Nhap xau:’);readln(s);
dem:=0;
for i:=1 to length(s) do
begin
t:=false;
for j:=1 to i-1 do
if((s[j])=(s[i])) then t:=true;
if not(t) then inc(dem);
end;
write(‘Co ‘,dem,’ ki tu khac nhau.’);
readln;
end.
Bài 5: Cho 1 xâu kí tự bất kì, tính: Số lượng các kí tự số, Số lượng các kí tự
chữ cái.

Bài giải:
uses crt;
const so: set of char=[‘0′,’1′,’2′,’3′,’4′,’5′,’6′,’7′,’8′,’9’];
var st,b:string;
a:array[1..100] of integer;
i,j,l,n,dem,dem1,c:integer;

(*****)
procedure sx(var x,y:integer);
var tam:integer;
begin
tam:=x;
x:=y;
y:=tam;
end;
(*****)
begin
clrscr;
write(‘nhap xau:’);readln(st);
dem:=0;
dem1:=0;
for i:=1 to length(st) do
begin
if (st[i] in[‘0’..’9′]) then inc(dem);
6

if (upcase(st[i]) in[‘A’..’Z’]) then inc(dem1);
end;
write(‘Co ‘,dem1,’ chu cai.’);
writeln;
writeln(‘Co ‘,dem,’ chu so.’);
l:=length(st); i:=1; n:=0;
repeat
if (st[i] in so) then
begin
b:=”;

repeat
b:=b+st[i];
inc(i);
until (not(st[i] in so)) or (i>l);
inc(n);
val(b,a[n],c);
end;
inc(i);
until i>l;
for i:=1 to n do write(a[i]:5);
writeln;
writeln(‘Sx tang:’);
for i:=1 to n-1 do
for j:=i to n do
if a[j]
readln;
end.
Bài 6: Cho 1 xâu kí tự bất kì (cả số lẫn chữ). Viết chương trình tách các
phần là số của xâu trên và đưa ra 1 mảng số nguyên.

Bài giải:
uses crt;
const so: set of char=[‘0′,’1′,’2′,’3′,’4′,’5′,’6′,’7′,’8′,’9’];
var a:array[1..100] of integer;
st,b:string;
c,l,i,n,j:integer;
(*****)
procedure sx(var x,y:integer);
var tam:integer;

7

begin
tam:=x;
x:=y;
y:=tam;
end;
(*****)
begin
clrscr;
write(‘Nhap xau:’);readln(st);
l:=length(st); i:=1; n:=0;
repeat
if (st[i] in so) then
begin
b:=”;
repeat
b:=b+st[i];
inc(i);
until (not(st[i] in so)) or (i>l);
inc(n);
val(b,a[n],c);
end;
inc(i);
until i>l;
for i:=1 to n do write(a[i]:5);
writeln;
write(‘Sx tang:’);
writeln;

for i:=1 to n-1 do
for j:=i to n do
if a[j]
readln;
end.

Bài 7: Nhập vào 1 xâu. Biến đổi thành chữ in hoa.

Bài giải:
uses crt;
var s:string;
i,k:integer;
8

begin
clrscr;
write(‘Nhap xau:’);readln(s);
write(‘Bien doi in hoa:’);
for i:=1 to length(s) do
write(upcase(s[i]));
readln;
end.

Bài 8: Nhập vào 1 xâu. Biến đổi in thường.

Bài giải:
uses crt;
var s:string;

i:integer;
begin
clrscr;
write(‘Nhap xau:’);readln(s);
for i:=1 to length(s) do
if s[i] in [‘A’..’Z’] then s[i]:=chr(ord(s[i])+32);
write(‘Bien doi thuong:’,s);
readln;
end.
Bài 9: Nhập vào 1 chuỗi, in ra chuỗi ngược.
Bài giải:
uses crt;
var s:string;
i:integer;
begin
clrscr;
write(‘nhap chuoi:’);readln(s);
write(‘Chuoi nguoc:’);
for i:=length(s) downto 1 do write(s[i]);
readln;
end.

9

Bài 10: Nhập vào danh sách HS 1 lớp. Sắp xếp lại danh sắp theo thứ tự
tăng dần theo chiều dài của tên.
Bài giải:
uses crt;
var hs:string;

i,j,n:integer;
(******)
procedure sx(var a,b:integer);
var tam:integer;
begin
tam:=a;
a:=b;
b:=tam;
end;
(******)
begin
clrscr;
write(‘Nhap so HS:’);readln(n);
for i:=1 to n do
begin
write(‘Ten HS thu ‘,i,’ :’);readln(hs[i]);
end;
for i:=1 to n-1 do
for j:=i+1 to n do
if length(hs[i]) > length(hs[j]) then sx(hs[i],hs[j]);
writeln(‘Sx theo do dai ten:’);
for i:=1 to n do writeln(hs[i]);
readln;
end.

Bài 11: Nhập vào họ tên bất kì sau đó biến đổi các chữ cái đầu tiên là in
hoa.
Bài giải:
uses crt;
const chu=[‘a’..’z’];

var hoten:string;
i,k:integer;
begin
10

clrscr;
write(‘Nhap ho ten:’);readln(hoten);
k:=length(hoten);
if hoten[1] in chu then hoten[1]:=upcase(hoten[1]);
for i:=2 to k do
if (hoten[i-1]=#32) and (hoten[i] in chu) then
hoten[i]:=upcase(hoten[i]);
write(‘sau khi bien doi:’,hoten);
readln;
end.
Bài 12: Nhập vào 1 đoạn văn. Tính số câu.
Bài giải:
uses crt;
var s:string;
i,d:integer;
begin
clrscr;
write(‘Nhap 1 doan:’);readln(s);
for i:=1 to length(s) do
if s[i]=’.’ then inc(d);
write(‘Doan tren co ‘,d,’ cau.’);
readln;
end.
Bài 13: Nhập vào 1 số, xóa bỏ các chữ số lẻ. Xuất kết quả dưới dạng đối

xứng của phần còn lại.
Vd:1 2 4 5 6 –> 2 4 6 6 4 2
Bài giải:
uses crt;
const so=[‘1′,’3′,’5′,’7′,’9’];
var s:string;
i:integer;
begin
clrscr;
write(‘Nhap 1 day so:’);readln(s);
i:=1;
while i<=length(s) do
if s[i] in so then
begin
11

delete(s,i,1);
i:=1;
end
else inc(i);
write(‘Sau khi xoa cac so le va bien doi doi xung:’,s);
for i:=length(s) downto 1 do write(s[i]);
readln;
end.

Bài 14: Nhập vào 1 số, xóa bỏ các chữ số chẵn. Kiểm tra số còn lại có bao
nhiêu chữ số. Xuất kết quả dưới dạng đối xứng của phần còn lại.
Bài giải:
uses crt;

const so=[‘0′,’2′,’4′,’6′,’8’];
var s:string;
i,dem:integer;
begin
clrscr;
dem:=0;
write(‘Nhap 1 day so:’);readln(s);
i:=1;
while i<= length(s) do
if s[i] in so then
begin
delete(s,i,1);
i:=1;
end
else inc(i);
for i:=1 to length(s) do dem:=dem+1;
writeln(‘Sau khi xoa cac so chan con ‘,dem,’ so le .’);
write(‘Sau khi xoa cac so chan va bien doi doi xung :’,s,’ ‘);
for i:=length(s) downto 1 do write(s[i]);
readln;
end.
Bài 15: Nhập chuỗi gồm cả chữ và số. Xuất ra màn hình các số riêng và các
chữ riêng. Hãy đếm số lần xuất hiện của mỗi chữ, mỗi số.
Bài giải:
uses crt;
12

var s:string;
dem:array[#1..#254] of integer;

i:integer;
chu:char;
begin
clrscr;
write(‘Nhap chuoi gom chu va so:’);readln(s);
for chu:=#1 to #254 do dem[chu]:=0;
writeln(‘Chu:’);
for i:=1 to length(s) do
if upcase(s[i]) in [‘A’..’Z’] then
begin
write(s[i]);
dem[upcase(s[i])]:=dem[upcase(s[i])] +1;
end;
writeln;
writeln(‘So:’);
for i:=1 to length(s) do
if s[i] in [‘0’..’9′] then
begin
write(s[i]);
dem[s[i]]:=dem[s[i]] +1;
end;
writeln;
for chu:=#1 to #254 do
if dem[chu]<>0 then writeln(chu,’ xuat hien ‘,dem[chu],’ lan’);
readln;
end.

Bài 16: Nhập 1 xâu kí tự và bỏ đi tất cả các khoảng trống bên trái của nó.
Bài giải:
uses crt;

var s,t:string;
i,p:integer;
begin
clrscr;
write(‘Nhap chuoi:’);readln(s);
writeln(‘khoang trong ben trai cua chuoi da bo, chuoi:’);
while s[1]=#32 do delete(s,1,1);
write(s);
13

readln;
end.
Bài 17: Dùng hàm “copy”. Tách từ đầu tiên ra khỏi 1 xâu kí tự cho trước.
Bài giải:
uses crt;
var s:string;
i:integer;
begin
clrscr;
write(‘Nhap chuoi:’);readln(s);
writeln(‘Tach tu dau tien ra khoai xau:’);
write(copy(s,1,1));
readln;
end.
Bài 18: Vị Giám đốc công ty XYZ cần gửi một văn bản quan trọng tới một
đối tác của mình. Để bảo mật văn bản, ông quyết định mã hóa văn bản
trước khi gửi. Văn bản là một xâu S các chữ cái la tinh in thường. Ông ta
chia văn bản thành hai đoạn liên tiếp Sb và Se. Lần lượt viết hai xâu Sb và
Se nhưng đều theo thứ tự ngược lại ông ta nhận được xâu mã hóa Q. Bức

thư thứ nhất gửi cho đối tác có nội dung là Q. Để đối tác đọc được văn bản,
ông ta gửi thêm một bức thư thứ hai trong đó chứa khóa để giải mã: độ dài
k của xâu Sb.
Ví dụ nội dung bức thư S = ’programming’ với với khóa k= 7 sẽ được
chia thành 2 đoạn: Sb = ’program’, Se = ’ming’, nhận được xâu mã hóa
Q = ’margorpgnim’.
Yêu cầu: Cho xâu mã hóa Q và khóa k, hãy xác định xâu S (k≥ 0 và không vượt
quá độ dài xâu S).
Dữ liệu nhập:
– Dòng thứ nhất chứa xâu mã hóa Q có độ dài từ 1 đến 250.
– Dòng thứ hai chứa khóa k.
Dữ liệu xuất:
– Là xâu S tìm được.
var k,n,i :longint;
S,l:string;
begin
read(s);
read(n);
For i:=n downto 1 do
14

l:=l+s[i];
for i:=length(s) downto n+1 do
l:=l+s[i];
WRITE(L);
end.
Bài 19: Trong giờ học Lập trình về xử lý chuỗi. Thầy giáo có cho một bài
tập như sau: Thầy sẽ đọc họ và tên của một bạn sinh viên bất kỳ trong lớp.
Công việc của chúng ta là hãy viết một chương trình để tách Họ, Tên Lót

(tên đệm), và Tên của bạn đó ra
Input:
Một chuỗi duy nhất là họ tên của bạn sinh viên mà thầy đọc.
Lưu ý: Họ tên có thể chỉ gồm họ và tên (không có tên lót), hoặc đầy đủ họ, lót,
tên.
Output:
Dòng 1: Xuất ra họ
Dòng 2: Xuất ra tên lót (nếu có).
Dòng 3: Xuất ra tên.
var ht,ten,ho,lot:string;
i,n,d:longint;
begin
read(ht);
lot:=”;
ho:=”;
ten:=ht;
n:=length(ht);
for i:=n downto 1 do
if ten[i]=’ ‘ then
begin
delete(ten,1,i);
break;
end;
for i:=length(ht) downto n-length(ten) do
begin
if ht[i]<>‘ ‘ then delete(ht,i,1);
if ht[i]=’ ‘ then break;
end;
i:=1;
while i<=length(ht) dobegin
15

if ht[i]<>‘ ‘ then ho:=ho+ht[i];
if ht[i]=’ ‘ then break;
inc(i);
end;
for i:=length(ho)+1 to length(ht) do
lot:=lot+ht[i];
writeln(‘Ho:’, ho);
if (lot <> ‘ ‘) then writeln(‘Lot:’, lot);
writeln(‘Ten:’, ten);
readln;
end.
Bài tập 20: Viết chương trình thực hiện phép cộng 2 số tự nhiên lớn (không
quá 255 chữ số).
Uses crt;
Var so1,so2,kqua:string;
Procedure LamDayXau(Var st1,st2:string);
{Them so 0 vao truoc xau ngan}
var i:Byte;
Begin
If Length(st1)>Length(st2) Then
For i:=1 To Length(st1)-Length(st2) Do st2:=’0’+st2
Else
For i:=1 To Length(st2)-Length(st1) Do st1:=’0’+st1;
End;
Function Cong(st1,st2:string):string;
Var i,a,b,c,sodu:Byte;

code:integer;
st,ch:string;
Begin
st:=”; sodu:=0;
LamDayXau(st1,st2);
{Lấy từng số của 2 xâu: từ phải sang trái}
For i:=Length(st1) DownTo 1 Do
Begin
{Đổi ký tự sang số nguyên}
Val(st1[i],a,code);
Val(st2[i],b,code);
{Tính tổng của 2 số a,b vừa lấy ra cho vào biến c}
16

c:=(a+b+sodu) MOD 10;
{Lấy phần dư của tổng a+b}
sodu:=(a+b+sodu) DIV 10;
{Đổi số nguyên c sang xâu ký tự ch}
str(c,ch);
{Cộng xâu ch vào bên trái xâu kết quả st}
st:=ch+st;
End;
{Xử lý trường hợp số dư cuối cùng >0}
If sodu>0 Then
Begin
str(sodu,ch);
st:=ch+st;
End;
Cong:=st;

End;
Begin
Write(‘Nhap so thu nhat: ‘); Readln(so1);
Write(‘Nhap so thu hai: ‘); Readln(so2);
kqua:=Cong(so1,so2);
Writeln(‘Tong= ‘,kqua);
Readln;
End
BÀI TẬP NÂNG CAO
Đề bài số 1
Ngày nay, việc sử dụng bàn phím điện thoại di động để nhấn các số đã trở
thành một việc rất quen thuộc với các bạn sinh viên. Ai cũng biết các phím
số trên điện thoại cũng là các phím dùng để nhấn các chữ cái:
2: ABC, 3: DEF, 4: GHI, 5: JKL, 6: MNO, 7: PQRS, 8: TUV, 9: WXYZ
Nam viết ra giấy một dãy ký tự và đố Bình xác định đó là dãy số nào theo
cách nhấn số trên điện thoại (chỉ xem xét sự tương ứng giữa số và ký tự
chứ không xem xét phải nhấn bao nhiêu lần phím đó, ví dụ cả A, B, C đều
là một số 2).
Bình rất nhanh chóng xác định được kết quả, không những thế Bình còn
muốn xác định nhanh xem số đó có phải là số dạng thuận nghịch hay
không. Một số là thuận nghịch nếu viết theo thứ tự ngược lại cũng là chính
nó. Hãy viết chương trình giúp Bình thực hiện công việc trên.

17

Input
Dòng đầu tiên chứa số n là số bộ test (không quá 1000).
Mỗi bộ test viết trên một dòng một dãy ký tự gồm các chữ cái có thể là chữ hoa
hoặc chữ thường, dài không quá 20 ký tự, không có khoảng trống.

Output
Với mỗi bộ test, in ra màn hình, trên một dòng, chữ “YES” nếu đó tương ứng là
số thuận nghịch, chữ “NO” nếu ngược lại.
Chương trình tham khảo
const fi=”;
type data=longint;
var
f:text;
s:string;
i,test,j:data;
function tinh(c:char):char;
begin
c:=upcase(c);
case c of
‘A’..’C’: exit(‘2’);
‘D’..’F’: exit(‘3’);
‘G’..’I’: exit(‘4’);
‘J’..’L’: exit(‘5’);
‘M’..’O’: exit(‘6’);
‘P’..’S’: exit(‘7’);
‘T’..’V’: exit(‘8’);
‘W’..’Z’: exit(‘9’);
end;
end;
function check:boolean;
var i:data;
st,sk:string;
begin
st:=”;
sk:=”;

for i:=1 to length(s) do
begin
st:=tinh(s[i])+st;
sk:=sk+tinh(s[i]);
end;
if st=sk then
18

writeln(‘YES’)
else
writeln(‘NO’);
end;
begin
assign(f,fi); reset(f);
readln(f,test);
for i:=1 to test do
begin
readln(f,s);
check;
end;
end.

Đề bài 2
Hệ điều hành XP cho phép điều khiển cùng lúc hai bàn phím. Hai anh em
Tuấn và Nam vừa được thưởng một máy tính mới nên rất muốn thử tính
năng này của XP. Tuấn và Nam, mỗi người dùng một bàn phím và đồng
thời gõ vào một từ đang nghĩ trong đầu tương ứng là S1 và S2. Do gõ đồng
thời và tốc độ gõ khác nhau nên kết quả là trên màn hình hiện ra một chuỗi
ký tự S là kết hợp của các ký tự trong S1 và S2. Các ký tự này đan xen

nhau theo một trình tự nào đó khiến Tuấn và Nam không còn nhận ra ký
tự nào do mình đã gõ.
Yêu cầu
Hãy giúp Tuấn và Nam xác định những ký tự nào có thể là của mình theo nghĩa
nếu tách những ký tự đó ra và ghép lại theo đúng thứ tự thì ta nhận được đúng
từ mà Tuấn và Nam đã gõ.
Dữ Liệu
Dữ liệu vào gồm 3 dòng, trong đó:
Dòng đầu tiên chứa từ S1 do Tuấn đã gõ. Dòng thứ hai chứa từ S2 do Nam đã
gõ.
Dòng cuối cùng chứa chuỗi S. S1 và S2 chỉ chứa các chữ cái latin (a, A, b, B.. )
và số lượng ký tự trong mỗi chuỗi không vượt quá 100.
Kết Quả
Kết quả ghi ra chỉ có một dòng duy nhất chứa chuỗi ký tự có chiều dài bằng
chiều dài chuỗi S, trong đó ký tự thứ I sẽ bằng ký tự ′1′ nếu ký tự tương ứng
S[I] do Tuấn gõ và bằng ′2′ nếu S[I] do Nam gõ.

19

Trong trường hợp có nhiều hơn một kết quả thì in ra dãy có thứ tự từ điển bé
nhất.
Ví Dụ
Input:
papa
mama
mpapamaa
Output:
21112212
2. Hướng dẫn giải NKH spoj – Tách Từ

– Xây dựng thủ tục đệ quy try(i,kt1,kt2) với ý nghĩa tìm kết quả kí tự thứ i của
xâu S khi chọn kí tự s1[kt1] hoặc s2[kt2] để ghép vào vị trí đó
Code tham khảo
const fi=”;
nmax=200;
type data=longint;
var
f:text;
s1,s2,s3:string;
n,m:data;
tr:array[0..nmax+1] of data;
procedure docfile;
var i,j:data;
begin
assign(f,fi); reset(f);
readln(f,s1); n:=length(s1);
readln(f,s2); m:=length(s2);
readln(f,s3);
close(f);
end;
procedure try(i,kt1,kt2:data); // sinh ki tu thu i
var j:data;
begin
if i>m+n then
begin
for j:=1 to m+n do
write(tr[j]);
halt;
end
20

else
begin
if s3[i]=s1[kt1] then
begin
tr[i]:=1;
try(i+1,kt1+1,kt2);
end;
if s3[i]=s2[kt2] then
begin
tr[i]:=2;
try(i+1,kt1,kt2+1);
end;
end;
end;
begin
docfile;
try(1,1,1);
end.
Đề bài 3: NKH spoj
Hệ điều hành XP cho phép điều khiển cùng lúc hai bàn phím. Hai anh em
Tuấn và Nam vừa được thưởng một máy tính mới nên rất muốn thử tính
năng này của XP. Tuấn và Nam, mỗi người dùng một bàn phím và đồng
thời gõ vào một từ đang nghĩ trong đầu tương ứng là S1 và S2. Do gõ đồng
thời và tốc độ gõ khác nhau nên kết quả là trên màn hình hiện ra một
chuỗi ký tự S là kết hợp của các ký tự trong S1 và S2. Các ký tự này đan
xen nhau theo một trình tự nào đó khiến Tuấn và Nam không còn nhận ra
ký tự nào do mình đã gõ.
Yêu cầu

Hãy giúp Tuấn và Nam xác định những ký tự nào có thể là của mình theo nghĩa
nếu tách những ký tự đó ra và ghép lại theo đúng thứ tự thì ta nhận được đúng
từ mà Tuấn và Nam đã gõ.
Dữ Liệu
Dữ liệu vào gồm 3 dòng, trong đó:
Dòng đầu tiên chứa từ S1 do Tuấn đã gõ. Dòng thứ hai chứa từ S2 do Nam đã
gõ.
Dòng cuối cùng chứa chuỗi S. S1 và S2 chỉ chứa các chữ cái latin (a, A, b, B.. )
và số lượng ký tự trong mỗi chuỗi không vượt quá 100.
Kết Quả
21

Kết quả ghi ra chỉ có một dòng duy nhất chứa chuỗi ký tự có chiều dài bằng
chiều dài chuỗi S, trong đó ký tự thứ I sẽ bằng ký tự ′1′ nếu ký tự tương ứng
S[I] do Tuấn gõ và bằng ′2′ nếu S[I] do Nam gõ.
Trong trường hợp có nhiều hơn một kết quả thì in ra dãy có thứ tự từ điển bé
nhất.
Ví Dụ
Input:
papa
mama
mpapamaa
Output:
21112212
2. Hướng dẫn giải NKH spoj – Tách Từ
– Xây dựng thủ tục đệ quy try(i,kt1,kt2) với ý nghĩa tìm kết quả kí tự thứ i của
xâu S khi chọn kí tự s1[kt1] hoặc s2[kt2] để ghép vào vị trí i đó.
Code tham khảo
const fi=”;

nmax=200;
type data=longint;
var
f:text;
s1,s2,s3:string;
n,m:data;
tr:array[0..nmax+1] of data;
procedure docfile;
var i,j:data;
begin
assign(f,fi); reset(f);
readln(f,s1); n:=length(s1);
readln(f,s2); m:=length(s2);
readln(f,s3);
close(f);
end;
procedure try(i,kt1,kt2:data); // sinh ki tu thu i
var j:data;
begin
if i>m+n then
begin
for j:=1 to m+n do
22

write(tr[j]);
halt;
end
else
begin

if s3[i]=s1[kt1] then
begin
tr[i]:=1;
try(i+1,kt1+1,kt2);
end;
if s3[i]=s2[kt2] then
begin
tr[i]:=2;
try(i+1,kt1,kt2+1);
end;
end;
end;
begin
docfile;
try(1,1,1);
end.

Đề bài 4: P156SUME spoj
Một chuỗi a được gọi là ước của chuỗi b nếu tồn tại một số nguyên dương
x sao cho khi ta viết x lần chuỗi a thì sẽ thu được chuỗi b. Ví dụ chuỗi
“abab” có 2 ước là “ab” và “abab”.
Bạn được cho 2 cho 2 chuỗi s1 và s2, hãy đếm xem chúng có tất cả bao
nhiêu ước chung?
Input
Dòng đầu tiên là 1 chuỗi s1, dòng thứ 2 là chuỗi s2.
Cả 2 chuỗi đều gồm các chữ cái thường, độ dài 2 chuỗi không quá 105.
Output
In ra một số nguyên là kết quả của bài toán.
Example
Test 1:

Input:
xyztxyzt
xyzt
Output:
1
23

Test 2:
Input:
aaa
aa
Output:
1
Hướng dẫn giải P156SUME spoj PTIT
– Gọi n1, n2 là độ dài của 2 xâu s1, s2.
– độ dài ước của xâu sẽ là [1..độ dài xâu], mà ở bài này ta cần xâu chung, như
vậy ta chỉ cần xét các xâu có độ dài từ [1..min(n1,n2)]. và xâu có độ dài i có
khả năng là ước của xâu khi n1 mod i=0 và n2 mod i = 0.
– Xét mỗi độ dài xâu ước, hãy kiểm tra xem xâu có độ dài i có phải là ước hay
không? và kiểm tra ước trên s1, s2 giống nhau không.
– Đếm kết quả bài toán…
const fi=”;
nmax=100000;
type data=longint;
var
f:text;
n1,n2:data;
s1,s2:ansistring;
procedure docfile;

begin
assign(f,fi); reset(f);
readln(f,s1);
readln(f,s2);
n1:=length(s1);
n2:=length(s2);
close(f);
end;
function min(a,b:data):data;
begin
if aend;
procedure xuli;
var i,j:data;
st1,st2,x1,x2:ansistring;
24

res:data;
begin
res:=0;
for i:=1 to min(n1,n2) do
if (n1 mod i = 0) and (n2 mod i=0) then
begin
st1:=copy(s1,1,i);
st2:=copy(s2,1,i);
if st1<>st2 then continue;
x1:=”;
for j:=1 to n1 div i do
x1:=x1+st1;

if x1<>s1 then continue;
x2:=”;
for j:=1 to n2 div i do
x2:=x2+st2;
if x2<>s2 then continue;
inc(res);
end;
writeln(res);
end;
begin
docfile;
xuli;
end.
Đề bài 5: P156PROE spoj
Cho trước dãy ký tự:
ABCDEFGHIJKLMNOPQRSTUVWXYZ_.
Phép dịch K trong dãy này được định nghĩa là đẩy một ký tự đi K vị trí.
Ví dụ: phép dịch 1 là ‘A’→’B’, ‘B’→’C’, …, ‘Z’→’_’, ‘_’→’.’, và ‘.’→’A’.
Phép dịch 3 là: ‘A’→’D’, ‘B’→’E’, …, ‘.’→’C’.
Bài toán đặt ra là cho trước số nguyên K và một xâu ký tự, hãy ghi ra kết
quả phép dịch K tương ứng của xâu đó sau khi đã đảo ngược thứ tự các
chữ cái.
Input
Mỗi bộ test ghi trên một dòng số nguyên 1<=N<=27, tiếp theo là khoảng trống
rồi đến xâu S (không quá 40 ký tự và chỉ bao gồm các chữ cái in hoa).
Bộ test cuối cùng có một số 0.
Output
25

của xâu trên và đưa ra 1 mảng số nguyên. ………………………………………………………….. 7B ài 7 : Nhập vào 1 xâu. Biến đổi thành chữ in hoa. ………………………………………………. 8B ài 8 : Nhập vào 1 xâu. Biến đổi in thường. …………………………………………………………. 9B ài 9 : Nhập vào 1 chuỗi, in ra chuỗi ngược. ………………………………………………………… 9B ài 10 : Nhập vào list HS 1 lớp. Sắp xếp lại danh sắp theo thứ tự tăng dầntheo chiều dài của tên. …………………………………………………………………………………….. 10B ài 11 : Nhập vào họ tên bất kỳ sau đó đổi khác những vần âm tiên phong là in hoa ……… 10B ài 12 : Nhập vào 1 đoạn văn. Tính số câu …………………………………………………………. 11B ài 13 : Nhập vào 1 số, xóa bỏ những chữ số lẻ. Xuất hiệu quả dưới dạng đối xứng củaphần còn lại. Vd : 1 2 4 5 6 — > 2 4 6 6 4 2 ……………………………………………………………. 11B ài 14 : Nhập vào 1 số, xóa bỏ những chữ số chẵn. Kiểm tra số còn lại có bao nhiêu chữsố. Xuất tác dụng dưới dạng đối xứng của phần còn lại. ……………………………………… 12B ài 15 : Nhập chuỗi gồm cả chữ và số. Xuất ra màn hình hiển thị những số riêng và những chữriêng. Hãy đếm số lần xuất hiện của mỗi chữ, mỗi số. ………………………………………… 12B ài 16 : Nhập 1 xâu kí tự và bỏ đi toàn bộ những khoảng trống bên trái của nó ………….. 13B ài 17 : Dùng hàm “ copy ”. Tách từ tiên phong ra khỏi 1 xâu kí tự cho trước. ………… 14B ài 18 : Vị Giám đốc công ty XYZ cần gửi một văn bản quan trọng tới một đối táccủa mình. Để bảo mật thông tin văn bản, ông quyết định hành động mã hóa văn bản trước khi gửi. Vănbản là một xâu S những vần âm la tinh in thường. Ông ta chia văn bản thành hai đoạnliên tiếp Sb và Se. Lần lượt viết hai xâu Sb và Se nhưng đều theo thứ tự ngược lạiông ta nhận được xâu mã hóa Q. Bức thư thứ nhất gửi cho đối tác chiến lược có nội dung là Q.Để đối tác chiến lược đọc được văn bản, ông ta gửi thêm một bức thư thứ hai trong đó chứakhóa để giải thuật : độ dài k của xâu Sb. ……………………………………………………………….. 14B ài 19 : Trong giờ học Lập trình về giải quyết và xử lý chuỗi. Thầy giáo có cho một bài tập nhưsau : Thầy sẽ đọc họ và tên của một bạn sinh viên bất kể trong lớp. Công việc củachúng ta là hãy viết một chương trình để tách Họ, Tên Lót ( tên đệm ), và Tên củabạn đó ra …………………………………………………………………………………………………………. 15B ài tập 20 : Viết chương trình triển khai phép cộng 2 số tự nhiên lớn ( không quá255 chữ số ). ……………………………………………………………………………………………………… 16B ÀI TẬP NÂNG CAO …………………………………………………………………………………………….. 17 Đề bài số 1 ……………………………………………………………………………………………………….. 17 Đề bài 2 ……………………………………………………………………………………………………………. 19B ÀI TẬP CƠ BẢNBài tập 1 : Nhập xâu kí tự bất kìa ) Đếm số lần xuất hiện của 1 kí tự nào đó trong câu. b ) Liệt kê những kí tự xuất hiện trong xâu cùng số lần xuất hiện của những kí tựđó. Bài giải : uses crt ; var str : string [ 100 ] ; chu : array [ # 1 .. # 254 ] of integer ; i : integer ; ch : char ; beginclrscr ; for ch : = # 1 to # 254 do chu [ ch ] : = 0 ; write ( ‘ Nhap chuoi = ‘ ) ; readln ( str ) ; for i : = 1 to length ( str ) do ( chu [ upcase ( str [ i ] ) ] ) : = chu [ upcase ( str [ i ] ) ] + 1 ; writeLn ( ‘ Cac ki tu trong xau la : ‘ ) ; for ch : = # 1 to # 254 doif chu [ ch ] > 0 then writeln ( ch, ‘ : xuat hien ‘, chu [ ch ], ‘ lan ‘ ) ; readln ; end. Bài 2 : Nhập 1 xâu kí tự. a ) Xét xem trong xâu có K kí tự kề nhau mà như nhau hay không ? b ) Hãy xóa đi kí tự kề nhau mà như nhau, chỉ giữ lại một. Bài giải : uses crt ; var ch : string [ 100 ] ; i, k, d, d1, n : integer ; ( * * * * * ) function xoa : boolean ; var i : integer ; beginxoa : = false ; for i : = 1 to length ( ch ) – 1 doif ch [ i ] = ch [ i + 1 ] thenbegindelete ( ch, i, 1 ) ; xoa : = true ; exitend ; end ; ( * * * * * ) beginclrscr ; write ( ‘ Nhap chuoi : ‘ ) ; readln ( ch ) ; write ( ‘ Nhap ki tu K : ‘ ) ; readln ( k ) ; n : = length ( ch ) ; d : = 0 ; d1 : = 0 ; for i : = 1 to n-1 dobeginif ch [ i ] = ch [ i + 1 ] then inc ( d1 ) else d1 : = 0 ; if d1 + 1 > = k then inc ( d ) ; end ; if d > 0 then writeln ( ‘ Co ‘, k, ‘ ki tu nhu nhau ‘ ) else writeln ( ‘ Khong co ‘, k, ‘ ki tu nhu nhau ‘ ) ; while xoa do ; write ( ‘ In lai xau sau khi xoa : ‘ ) ; writeln ( ch ) ; readln ; end. Bài 3 : Nhập 1 xâu kí tự. Kiểm tra tính đối xứng của xâu đó. Nếu xâu khôngđối xứng thì hòn đảo xâu. Bài giải : uses crt ; var str, s : string [ 100 ] ; n, i : integer ; ( * * * * * ) procedure sx ( var a, b : char ) ; var tam : char ; begintam : = a ; a : = b ; b : = tam ; end ; procedure dao ( n, i : integer ) ; var j : integer ; beginfor j : = i + 1 to n doif str [ i ] = str [ j ] thenbeginsx ( str [ j ], str [ n-i+1 ] ) ; exitend ; end ; ( * * * * * ) beginclrscr ; write ( ‘ Nhap xau : ‘ ) ; readln ( str ) ; n : = length ( str ) ; s : = ‘ ‘ ; for i : = n downto 1 do s : = s + str [ i ] ; if str = s then writeln ( ‘ Chuoi doi xung : ‘ ) elsebeginwriteln ( ‘ Chuoi ko doi xung, chuoi da dao doi xung : ‘ ) ; for i : = 1 to n-1 dodao ( n, i ) ; end ; writeln ( str ) ; readln ; end. Bài 4 : Cho 1 xâu kí tự. Tính xem trong số đó có bao nhiêu loại kí tự khácnhau ( không phân biệt in hoa hay in thường ). Bài giải : uses crt ; var s : string ; i, j, dem : integer ; t : boolean ; beginclrscr ; write ( ‘ Nhap xau : ‘ ) ; readln ( s ) ; dem : = 0 ; for i : = 1 to length ( s ) dobegint : = false ; for j : = 1 to i-1 doif ( ( s [ j ] ) = ( s [ i ] ) ) then t : = true ; if not ( t ) then inc ( dem ) ; end ; write ( ‘ Co ‘, dem, ‘ ki tu khac nhau. ‘ ) ; readln ; end. Bài 5 : Cho 1 xâu kí tự bất kỳ, tính : Số lượng những kí tự số, Số lượng những kí tựchữ cái. Bài giải : uses crt ; const so : set of char = [ ‘ 0 ‘, ‘ 1 ‘, ‘ 2 ‘, ‘ 3 ‘, ‘ 4 ‘, ‘ 5 ‘, ‘ 6 ‘, ‘ 7 ‘, ‘ 8 ‘, ‘ 9 ‘ ] ; var st, b : string ; a : array [ 1 .. 100 ] of integer ; i, j, l, n, dem, dem1, c : integer ; ( * * * * * ) procedure sx ( var x, y : integer ) ; var tam : integer ; begintam : = x ; x : = y ; y : = tam ; end ; ( * * * * * ) beginclrscr ; write ( ‘ nhap xau : ‘ ) ; readln ( st ) ; dem : = 0 ; dem1 : = 0 ; for i : = 1 to length ( st ) dobeginif ( st [ i ] in [ ‘ 0 ‘ .. ‘ 9 ‘ ] ) then inc ( dem ) ; if ( upcase ( st [ i ] ) in [ ‘ A ‘ .. ‘ Z ‘ ] ) then inc ( dem1 ) ; end ; write ( ‘ Co ‘, dem1, ‘ chu cai. ‘ ) ; writeln ; writeln ( ‘ Co ‘, dem, ‘ chu so. ‘ ) ; l : = length ( st ) ; i : = 1 ; n : = 0 ; repeatif ( st [ i ] in so ) thenbeginb : = ‘ ‘ ; repeatb : = b + st [ i ] ; inc ( i ) ; until ( not ( st [ i ] in so ) ) or ( i > l ) ; inc ( n ) ; val ( b, a [ n ], c ) ; end ; inc ( i ) ; until i > l ; for i : = 1 to n do write ( a [ i ] : 5 ) ; writeln ; writeln ( ‘ Sx tang : ‘ ) ; for i : = 1 to n-1 dofor j : = i to n doif a [ j ] for i : = 1 to n do write ( a [ i ] : 5 ) ; readln ; end. Bài 6 : Cho 1 xâu kí tự bất kỳ ( cả số lẫn chữ ). Viết chương trình tách cácphần là số của xâu trên và đưa ra 1 mảng số nguyên. Bài giải : uses crt ; const so : set of char = [ ‘ 0 ‘, ‘ 1 ‘, ‘ 2 ‘, ‘ 3 ‘, ‘ 4 ‘, ‘ 5 ‘, ‘ 6 ‘, ‘ 7 ‘, ‘ 8 ‘, ‘ 9 ‘ ] ; var a : array [ 1 .. 100 ] of integer ; st, b : string ; c, l, i, n, j : integer ; ( * * * * * ) procedure sx ( var x, y : integer ) ; var tam : integer ; begintam : = x ; x : = y ; y : = tam ; end ; ( * * * * * ) beginclrscr ; write ( ‘ Nhap xau : ‘ ) ; readln ( st ) ; l : = length ( st ) ; i : = 1 ; n : = 0 ; repeatif ( st [ i ] in so ) thenbeginb : = ‘ ‘ ; repeatb : = b + st [ i ] ; inc ( i ) ; until ( not ( st [ i ] in so ) ) or ( i > l ) ; inc ( n ) ; val ( b, a [ n ], c ) ; end ; inc ( i ) ; until i > l ; for i : = 1 to n do write ( a [ i ] : 5 ) ; writeln ; write ( ‘ Sx tang : ‘ ) ; writeln ; for i : = 1 to n-1 dofor j : = i to n doif a [ j ] for i : = 1 to n do write ( a [ i ] : 5 ) ; readln ; end. Bài 7 : Nhập vào 1 xâu. Biến đổi thành chữ in hoa. Bài giải : uses crt ; var s : string ; i, k : integer ; beginclrscr ; write ( ‘ Nhap xau : ‘ ) ; readln ( s ) ; write ( ‘ Bien doi in hoa : ‘ ) ; for i : = 1 to length ( s ) dowrite ( upcase ( s [ i ] ) ) ; readln ; end. Bài 8 : Nhập vào 1 xâu. Biến đổi in thường. Bài giải : uses crt ; var s : string ; i : integer ; beginclrscr ; write ( ‘ Nhap xau : ‘ ) ; readln ( s ) ; for i : = 1 to length ( s ) doif s [ i ] in [ ‘ A ‘ .. ‘ Z ‘ ] then s [ i ] : = chr ( ord ( s [ i ] ) + 32 ) ; write ( ‘ Bien doi thuong : ‘, s ) ; readln ; end. Bài 9 : Nhập vào 1 chuỗi, in ra chuỗi ngược. Bài giải : uses crt ; var s : string ; i : integer ; beginclrscr ; write ( ‘ nhap chuoi : ‘ ) ; readln ( s ) ; write ( ‘ Chuoi nguoc : ‘ ) ; for i : = length ( s ) downto 1 do write ( s [ i ] ) ; readln ; end. Bài 10 : Nhập vào list HS 1 lớp. Sắp xếp lại danh sắp theo thứ tựtăng dần theo chiều dài của tên. Bài giải : uses crt ; var hs : string ; i, j, n : integer ; ( * * * * * * ) procedure sx ( var a, b : integer ) ; var tam : integer ; begintam : = a ; a : = b ; b : = tam ; end ; ( * * * * * * ) beginclrscr ; write ( ‘ Nhap so HS : ‘ ) ; readln ( n ) ; for i : = 1 to n dobeginwrite ( ‘ Ten HS thu ‘, i, ‘ : ‘ ) ; readln ( hs [ i ] ) ; end ; for i : = 1 to n-1 dofor j : = i + 1 to n doif length ( hs [ i ] ) > length ( hs [ j ] ) then sx ( hs [ i ], hs [ j ] ) ; writeln ( ‘ Sx theo do dai ten : ‘ ) ; for i : = 1 to n do writeln ( hs [ i ] ) ; readln ; end. Bài 11 : Nhập vào họ tên bất kỳ sau đó biến hóa những vần âm tiên phong là inhoa. Bài giải : uses crt ; const chu = [ ‘ a ‘ .. ‘ z ‘ ] ; var hoten : string ; i, k : integer ; begin10clrscr ; write ( ‘ Nhap ho ten : ‘ ) ; readln ( hoten ) ; k : = length ( hoten ) ; if hoten [ 1 ] in chu then hoten [ 1 ] : = upcase ( hoten [ 1 ] ) ; for i : = 2 to k doif ( hoten [ i-1 ] = # 32 ) and ( hoten [ i ] in chu ) thenhoten [ i ] : = upcase ( hoten [ i ] ) ; write ( ‘ sau khi bien doi : ‘, hoten ) ; readln ; end. Bài 12 : Nhập vào 1 đoạn văn. Tính số câu. Bài giải : uses crt ; var s : string ; i, d : integer ; beginclrscr ; write ( ‘ Nhap 1 doan : ‘ ) ; readln ( s ) ; for i : = 1 to length ( s ) doif s [ i ] = ‘. ‘ then inc ( d ) ; write ( ‘ Doan tren co ‘, d, ‘ cau. ‘ ) ; readln ; end. Bài 13 : Nhập vào 1 số, xóa bỏ những chữ số lẻ. Xuất tác dụng dưới dạng đốixứng của phần còn lại. Vd : 1 2 4 5 6 — > 2 4 6 6 4 2B ài giải : uses crt ; const so = [ ‘ 1 ‘, ‘ 3 ‘, ‘ 5 ‘, ‘ 7 ‘, ‘ 9 ‘ ] ; var s : string ; i : integer ; beginclrscr ; write ( ‘ Nhap 1 day so : ‘ ) ; readln ( s ) ; i : = 1 ; while i < = length ( s ) doif s [ i ] in so thenbegin11delete ( s, i, 1 ) ; i : = 1 ; endelse inc ( i ) ; write ( ' Sau khi xoa cac so le va bien doi doi xung : ', s ) ; for i : = length ( s ) downto 1 do write ( s [ i ] ) ; readln ; end. Bài 14 : Nhập vào 1 số, xóa bỏ những chữ số chẵn. Kiểm tra số còn lại có baonhiêu chữ số. Xuất hiệu quả dưới dạng đối xứng của phần còn lại. Bài giải : uses crt ; const so = [ ' 0 ', ' 2 ', ' 4 ', ' 6 ', ' 8 ' ] ; var s : string ; i, dem : integer ; beginclrscr ; dem : = 0 ; write ( ' Nhap 1 day so : ' ) ; readln ( s ) ; i : = 1 ; while i < = length ( s ) doif s [ i ] in so thenbegindelete ( s, i, 1 ) ; i : = 1 ; endelse inc ( i ) ; for i : = 1 to length ( s ) do dem : = dem + 1 ; writeln ( ' Sau khi xoa cac so chan con ', dem, ' so le. ' ) ; write ( ' Sau khi xoa cac so chan va bien doi doi xung : ', s, ' ' ) ; for i : = length ( s ) downto 1 do write ( s [ i ] ) ; readln ; end. Bài 15 : Nhập chuỗi gồm cả chữ và số. Xuất ra màn hình hiển thị những số riêng và cácchữ riêng. Hãy đếm số lần xuất hiện của mỗi chữ, mỗi số. Bài giải : uses crt ; 12 var s : string ; dem : array [ # 1 .. # 254 ] of integer ; i : integer ; chu : char ; beginclrscr ; write ( ' Nhap chuoi gom chu va so : ' ) ; readln ( s ) ; for chu : = # 1 to # 254 do dem [ chu ] : = 0 ; writeln ( ' Chu : ' ) ; for i : = 1 to length ( s ) doif upcase ( s [ i ] ) in [ ' A ' .. ' Z ' ] thenbeginwrite ( s [ i ] ) ; dem [ upcase ( s [ i ] ) ] : = dem [ upcase ( s [ i ] ) ] + 1 ; end ; writeln ; writeln ( ' So : ' ) ; for i : = 1 to length ( s ) doif s [ i ] in [ ' 0 ' .. ' 9 ' ] thenbeginwrite ( s [ i ] ) ; dem [ s [ i ] ] : = dem [ s [ i ] ] + 1 ; end ; writeln ; for chu : = # 1 to # 254 doif dem [ chu ] < > 0 then writeln ( chu, ‘ xuat hien ‘, dem [ chu ], ‘ lan ‘ ) ; readln ; end. Bài 16 : Nhập 1 xâu kí tự và bỏ đi toàn bộ những khoảng trống bên trái của nó. Bài giải : uses crt ; var s, t : string ; i, p : integer ; beginclrscr ; write ( ‘ Nhap chuoi : ‘ ) ; readln ( s ) ; writeln ( ‘ khoang trong ben trai cua chuoi da bo, chuoi : ‘ ) ; while s [ 1 ] = # 32 do delete ( s, 1,1 ) ; write ( s ) ; 13 readln ; end. Bài 17 : Dùng hàm “ copy ”. Tách từ tiên phong ra khỏi 1 xâu kí tự cho trước. Bài giải : uses crt ; var s : string ; i : integer ; beginclrscr ; write ( ‘ Nhap chuoi : ‘ ) ; readln ( s ) ; writeln ( ‘ Tach tu dau tien ra khoai xau : ‘ ) ; write ( copy ( s, 1,1 ) ) ; readln ; end. Bài 18 : Vị Giám đốc công ty XYZ cần gửi một văn bản quan trọng tới mộtđối tác của mình. Để bảo mật thông tin văn bản, ông quyết định hành động mã hóa văn bảntrước khi gửi. Văn bản là một xâu S những vần âm la tinh in thường. Ông tachia văn bản thành hai đoạn liên tục Sb và Se. Lần lượt viết hai xâu Sb vàSe nhưng đều theo thứ tự ngược lại ông ta nhận được xâu mã hóa Q. Bứcthư thứ nhất gửi cho đối tác chiến lược có nội dung là Q. Để đối tác chiến lược đọc được văn bản, ông ta gửi thêm một bức thư thứ hai trong đó chứa khóa để giải thuật : độ dàik của xâu Sb. Ví dụ nội dung bức thư S = ’ programming ’ với với khóa k = 7 sẽ đượcchia thành 2 đoạn : Sb = ’ program ’, Se = ’ ming ’, nhận được xâu mã hóaQ = ’ margorpgnim ’. Yêu cầu : Cho xâu mã hóa Q và khóa k, hãy xác lập xâu S ( k ≥ 0 và không vượtquá độ dài xâu S ). Dữ liệu nhập : – Dòng thứ nhất chứa xâu mã hóa Q. có độ dài từ 1 đến 250. – Dòng thứ hai chứa khóa k. Dữ liệu xuất : – Là xâu S tìm được. var k, n, i : longint ; S, l : string ; beginread ( s ) ; read ( n ) ; For i : = n downto 1 do14l : = l + s [ i ] ; for i : = length ( s ) downto n + 1 dol : = l + s [ i ] ; WRITE ( L ) ; end. Bài 19 : Trong giờ học Lập trình về giải quyết và xử lý chuỗi. Thầy giáo có cho một bàitập như sau : Thầy sẽ đọc họ và tên của một bạn sinh viên bất kể trong lớp. Công việc của tất cả chúng ta là hãy viết một chương trình để tách Họ, Tên Lót ( tên đệm ), và Tên của bạn đó raInput : Một chuỗi duy nhất là họ tên của bạn sinh viên mà thầy đọc. Lưu ý : Họ tên hoàn toàn có thể chỉ gồm họ và tên ( không có tên lót ), hoặc vừa đủ họ, lót, tên. Output : Dòng 1 : Xuất ra họDòng 2 : Xuất ra tên lót ( nếu có ). Dòng 3 : Xuất ra tên. var ht, ten, ho, lot : string ; i, n, d : longint ; beginread ( ht ) ; lot : = ‘ ‘ ; ho : = ‘ ‘ ; ten : = ht ; n : = length ( ht ) ; for i : = n downto 1 doif ten [ i ] = ‘ ‘ thenbegindelete ( ten, 1, i ) ; break ; end ; for i : = length ( ht ) downto n-length ( ten ) dobeginif ht [ i ] < > ‘ ‘ then delete ( ht, i, 1 ) ; if ht [ i ] = ‘ ‘ then break ; end ; i : = 1 ; while i < = length ( ht ) dobegin15if ht [ i ] < > ‘ ‘ then ho : = ho + ht [ i ] ; if ht [ i ] = ‘ ‘ then break ; inc ( i ) ; end ; for i : = length ( ho ) + 1 to length ( ht ) dolot : = lot + ht [ i ] ; writeln ( ‘ Ho : ‘, ho ) ; if ( lot < > ‘ ‘ ) then writeln ( ‘ Lot : ‘, lot ) ; writeln ( ‘ Ten : ‘, ten ) ; readln ; end. Bài tập 20 : Viết chương trình thực thi phép cộng 2 số tự nhiên lớn ( khôngquá 255 chữ số ). Uses crt ; Var so1, so2, kqua : string ; Procedure LamDayXau ( Var st1, st2 : string ) ; { Them so 0 vao truoc xau ngan } var i : Byte ; BeginIf Length ( st1 ) > Length ( st2 ) ThenFor i : = 1 To Length ( st1 ) – Length ( st2 ) Do st2 : = ‘ 0 ‘ + st2ElseFor i : = 1 To Length ( st2 ) – Length ( st1 ) Do st1 : = ‘ 0 ‘ + st1 ; End ; Function Cong ( st1, st2 : string ) : string ; Var i, a, b, c, sodu : Byte ; code : integer ; st, ch : string ; Beginst : = ‘ ‘ ; sodu : = 0 ; LamDayXau ( st1, st2 ) ; { Lấy từng số của 2 xâu : từ phải sang trái } For i : = Length ( st1 ) DownTo 1 DoBegin { Đổi ký tự sang số nguyên } Val ( st1 [ i ], a, code ) ; Val ( st2 [ i ], b, code ) ; { Tính tổng của 2 số a, b vừa lấy ra cho vào biến c } 16 c : = ( a + b + sodu ) MOD 10 ; { Lấy phần dư của tổng a + b } sodu : = ( a + b + sodu ) DIV 10 ; { Đổi số nguyên c sang xâu ký tự ch } str ( c, ch ) ; { Cộng xâu ch vào bên trái xâu hiệu quả st } st : = ch + st ; End ; { Xử lý trường hợp số dư ở đầu cuối > 0 } If sodu > 0 ThenBeginstr ( sodu, ch ) ; st : = ch + st ; End ; Cong : = st ; End ; BeginWrite ( ‘ Nhap so thu nhat : ‘ ) ; Readln ( so1 ) ; Write ( ‘ Nhap so thu hai : ‘ ) ; Readln ( so2 ) ; kqua : = Cong ( so1, so2 ) ; Writeln ( ‘ Tong = ‘, kqua ) ; Readln ; EndBÀI TẬP NÂNG CAOĐề bài số 1N gày nay, việc sử dụng bàn phím điện thoại di động để nhấn những số đã trởthành một việc rất quen thuộc với những bạn sinh viên. Ai cũng biết những phímsố trên điện thoại cảm ứng cũng là những phím dùng để nhấn những vần âm : 2 : ABC, 3 : DEF, 4 : GHI, 5 : JKL, 6 : MNO, 7 : PQRS, 8 : TUV, 9 : WXYZNam viết ra giấy một dãy ký tự và đố Bình xác lập đó là dãy số nào theocách nhấn số trên điện thoại cảm ứng ( chỉ xem xét sự tương ứng giữa số và ký tựchứ không xem xét phải nhấn bao nhiêu lần phím đó, ví dụ cả A, B, C đềulà một số ít 2 ). Bình rất nhanh gọn xác lập được hiệu quả, không những thế Bình cònmuốn xác lập nhanh xem số đó có phải là số dạng thuận nghịch haykhông. Một số là thuận nghịch nếu viết theo thứ tự ngược lại cũng là chínhnó. Hãy viết chương trình giúp Bình thực thi việc làm trên. 17I nputDòng tiên phong chứa số n là số bộ test ( không quá 1000 ). Mỗi bộ test viết trên một dòng một dãy ký tự gồm những vần âm hoàn toàn có thể là chữ hoahoặc chữ thường, dài không quá 20 ký tự, không có khoảng trống. OutputVới mỗi bộ test, in ra màn hình hiển thị, trên một dòng, chữ “ YES ” nếu đó tương ứng làsố thuận nghịch, chữ “ NO ” nếu ngược lại. Chương trình tham khảoconst fi = ‘ ‘ ; type data = longint ; varf : text ; s : string ; i, test, j : data ; function tinh ( c : char ) : char ; beginc : = upcase ( c ) ; case c of’A ‘ .. ‘ C ‘ : exit ( ‘ 2 ‘ ) ; ‘ D ‘ .. ‘ F ‘ : exit ( ‘ 3 ‘ ) ; ‘ G ‘ .. ‘ I ‘ : exit ( ‘ 4 ‘ ) ; ‘ J ‘ .. ‘ L ‘ : exit ( ‘ 5 ‘ ) ; ‘ M ‘ .. ‘ O ‘ : exit ( ‘ 6 ‘ ) ; ‘ P ‘ .. ‘ S ‘ : exit ( ‘ 7 ‘ ) ; ‘ T ‘ .. ‘ V ‘ : exit ( ‘ 8 ‘ ) ; ‘ W ‘ .. ‘ Z ‘ : exit ( ‘ 9 ‘ ) ; end ; end ; function check : boolean ; var i : data ; st, sk : string ; beginst : = ‘ ‘ ; sk : = ‘ ‘ ; for i : = 1 to length ( s ) dobeginst : = tinh ( s [ i ] ) + st ; sk : = sk + tinh ( s [ i ] ) ; end ; if st = sk then18writeln ( ‘ YES ‘ ) elsewriteln ( ‘ NO ‘ ) ; end ; beginassign ( f, fi ) ; reset ( f ) ; readln ( f, test ) ; for i : = 1 to test dobeginreadln ( f, s ) ; check ; end ; end. Đề bài 2H ệ quản lý và điều hành XP được cho phép tinh chỉnh và điều khiển cùng lúc hai bàn phím. Hai anh emTuấn và Nam vừa được thưởng một máy tính mới nên rất muốn thử tínhnăng này của XP. Tuấn và Nam, mỗi người dùng một bàn phím và đồngthời gõ vào một từ đang nghĩ trong đầu tương ứng là S1 và S2. Do gõ đồngthời và vận tốc gõ khác nhau nên hiệu quả là trên màn hình hiển thị hiện ra một chuỗiký tự S là phối hợp của những ký tự trong S1 và S2. Các ký tự này đan xennhau theo một trình tự nào đó khiến Tuấn và Nam không còn nhận ra kýtự nào do mình đã gõ. Yêu cầuHãy giúp Tuấn và Nam xác lập những ký tự nào hoàn toàn có thể là của mình theo nghĩanếu tách những ký tự đó ra và ghép lại theo đúng thứ tự thì ta nhận được đúngtừ mà Tuấn và Nam đã gõ. Dữ LiệuDữ liệu vào gồm 3 dòng, trong đó : Dòng tiên phong chứa từ S1 do Tuấn đã gõ. Dòng thứ hai chứa từ S2 do Nam đãgõ. Dòng sau cuối chứa chuỗi S. S1 và S2 chỉ chứa những vần âm latin ( a, A, b, B.. ) và số lượng ký tự trong mỗi chuỗi không vượt quá 100. Kết QuảKết quả ghi ra chỉ có một dòng duy nhất chứa chuỗi ký tự có chiều dài bằngchiều dài chuỗi S, trong đó ký tự thứ I sẽ bằng ký tự ′ 1 ′ nếu ký tự tương ứngS [ I ] do Tuấn gõ và bằng ′ 2 ′ nếu S [ I ] do Nam gõ. 19T rong trường hợp có nhiều hơn một hiệu quả thì in ra dãy có thứ tự từ điển bénhất. Ví DụInput : papamamampapamaaOutput : 211122122. Hướng dẫn giải NKH spoj – Tách Từ – Xây dựng thủ tục đệ quy try ( i, kt1, kt2 ) với ý nghĩa tìm tác dụng kí tự thứ i củaxâu S khi chọn kí tự s1 [ kt1 ] hoặc s2 [ kt2 ] để ghép vào vị trí đóCode tham khảoconst fi = ‘ ‘ ; nmax = 200 ; type data = longint ; varf : text ; s1, s2, s3 : string ; n, m : data ; tr : array [ 0 .. nmax + 1 ] of data ; procedure docfile ; var i, j : data ; beginassign ( f, fi ) ; reset ( f ) ; readln ( f, s1 ) ; n : = length ( s1 ) ; readln ( f, s2 ) ; m : = length ( s2 ) ; readln ( f, s3 ) ; close ( f ) ; end ; procedure try ( i, kt1, kt2 : data ) ; / / sinh ki tu thu ivar j : data ; beginif i > m + n thenbeginfor j : = 1 to m + n dowrite ( tr [ j ] ) ; halt ; end20elsebeginif s3 [ i ] = s1 [ kt1 ] thenbegintr [ i ] : = 1 ; try ( i + 1, kt1 + 1, kt2 ) ; end ; if s3 [ i ] = s2 [ kt2 ] thenbegintr [ i ] : = 2 ; try ( i + 1, kt1, kt2 + 1 ) ; end ; end ; end ; begindocfile ; try ( 1,1,1 ) ; end. Đề bài 3 : NKH spojHệ điều hành quản lý XP được cho phép điều khiển và tinh chỉnh cùng lúc hai bàn phím. Hai anh emTuấn và Nam vừa được thưởng một máy tính mới nên rất muốn thử tínhnăng này của XP. Tuấn và Nam, mỗi người dùng một bàn phím và đồngthời gõ vào một từ đang nghĩ trong đầu tương ứng là S1 và S2. Do gõ đồngthời và vận tốc gõ khác nhau nên tác dụng là trên màn hình hiển thị hiện ra mộtchuỗi ký tự S là tích hợp của những ký tự trong S1 và S2. Các ký tự này đanxen nhau theo một trình tự nào đó khiến Tuấn và Nam không còn nhận raký tự nào do mình đã gõ. Yêu cầuHãy giúp Tuấn và Nam xác lập những ký tự nào hoàn toàn có thể là của mình theo nghĩanếu tách những ký tự đó ra và ghép lại theo đúng thứ tự thì ta nhận được đúngtừ mà Tuấn và Nam đã gõ. Dữ LiệuDữ liệu vào gồm 3 dòng, trong đó : Dòng tiên phong chứa từ S1 do Tuấn đã gõ. Dòng thứ hai chứa từ S2 do Nam đãgõ. Dòng sau cuối chứa chuỗi S. S1 và S2 chỉ chứa những vần âm latin ( a, A, b, B.. ) và số lượng ký tự trong mỗi chuỗi không vượt quá 100. Kết Quả21Kết quả ghi ra chỉ có một dòng duy nhất chứa chuỗi ký tự có chiều dài bằngchiều dài chuỗi S, trong đó ký tự thứ I sẽ bằng ký tự ′ 1 ′ nếu ký tự tương ứngS [ I ] do Tuấn gõ và bằng ′ 2 ′ nếu S [ I ] do Nam gõ. Trong trường hợp có nhiều hơn một tác dụng thì in ra dãy có thứ tự từ điển bénhất. Ví DụInput : papamamampapamaaOutput : 211122122. Hướng dẫn giải NKH spoj – Tách Từ – Xây dựng thủ tục đệ quy try ( i, kt1, kt2 ) với ý nghĩa tìm hiệu quả kí tự thứ i củaxâu S khi chọn kí tự s1 [ kt1 ] hoặc s2 [ kt2 ] để ghép vào vị trí i đó. Code tham khảoconst fi = ‘ ‘ ; nmax = 200 ; type data = longint ; varf : text ; s1, s2, s3 : string ; n, m : data ; tr : array [ 0 .. nmax + 1 ] of data ; procedure docfile ; var i, j : data ; beginassign ( f, fi ) ; reset ( f ) ; readln ( f, s1 ) ; n : = length ( s1 ) ; readln ( f, s2 ) ; m : = length ( s2 ) ; readln ( f, s3 ) ; close ( f ) ; end ; procedure try ( i, kt1, kt2 : data ) ; / / sinh ki tu thu ivar j : data ; beginif i > m + n thenbeginfor j : = 1 to m + n do22write ( tr [ j ] ) ; halt ; endelsebeginif s3 [ i ] = s1 [ kt1 ] thenbegintr [ i ] : = 1 ; try ( i + 1, kt1 + 1, kt2 ) ; end ; if s3 [ i ] = s2 [ kt2 ] thenbegintr [ i ] : = 2 ; try ( i + 1, kt1, kt2 + 1 ) ; end ; end ; end ; begindocfile ; try ( 1,1,1 ) ; end. Đề bài 4 : P156SUME spojMột chuỗi a được gọi là ước của chuỗi b nếu sống sót một số ít nguyên dươngx sao cho khi ta viết x lần chuỗi a thì sẽ thu được chuỗi b. Ví dụ chuỗi “ abab ” có 2 ước là “ ab ” và “ abab ”. Bạn được cho 2 cho 2 chuỗi s1 và s2, hãy đếm xem chúng có toàn bộ baonhiêu ước chung ? InputDòng tiên phong là 1 chuỗi s1, dòng thứ 2 là chuỗi s2. Cả 2 chuỗi đều gồm những vần âm thường, độ dài 2 chuỗi không quá 105. OutputIn ra 1 số ít nguyên là tác dụng của bài toán. ExampleTest 1 : Input : xyztxyztxyztOutput : 23T est 2 : Input : aaaaaOutput : Hướng dẫn giải P156SUME spoj PTIT – Gọi n1, n2 là độ dài của 2 xâu s1, s2. – độ dài ước của xâu sẽ là [ 1 .. độ dài xâu ], mà ở bài này ta cần xâu chung, nhưvậy ta chỉ cần xét những xâu có độ dài từ [ 1 .. min ( n1, n2 ) ]. và xâu có độ dài i cókhả năng là ước của xâu khi n1 mod i = 0 và n2 mod i = 0. – Xét mỗi độ dài xâu ước, hãy kiểm tra xem xâu có độ dài i có phải là ước haykhông ? và kiểm tra ước trên s1, s2 giống nhau không. – Đếm hiệu quả bài toán … const fi = ‘ ‘ ; nmax = 100000 ; type data = longint ; varf : text ; n1, n2 : data ; s1, s2 : ansistring ; procedure docfile ; beginassign ( f, fi ) ; reset ( f ) ; readln ( f, s1 ) ; readln ( f, s2 ) ; n1 : = length ( s1 ) ; n2 : = length ( s2 ) ; close ( f ) ; end ; function min ( a, b : data ) : data ; beginif aend ; procedure xuli ; var i, j : data ; st1, st2, x1, x2 : ansistring ; 24 res : data ; beginres : = 0 ; for i : = 1 to min ( n1, n2 ) doif ( n1 mod i = 0 ) and ( n2 mod i = 0 ) thenbeginst1 : = copy ( s1, 1, i ) ; st2 : = copy ( s2, 1, i ) ; if st1 < > st2 then continue ; x1 : = ‘ ‘ ; for j : = 1 to n1 div i dox1 : = x1 + st1 ; if x1 < > s1 then continue ; x2 : = ‘ ‘ ; for j : = 1 to n2 div i dox2 : = x2 + st2 ; if x2 < > s2 then continue ; inc ( res ) ; end ; writeln ( res ) ; end ; begindocfile ; xuli ; end. Đề bài 5 : P156PROE spojCho trước dãy ký tự : ABCDEFGHIJKLMNOPQRSTUVWXYZ_. Phép dịch K trong dãy này được định nghĩa là đẩy một ký tự đi K vị trí. Ví dụ : phép dịch 1 là ‘ A ’ → ’ B ’, ‘ B ’ → ’ C ’, …, ‘ Z ’ → ’ _ ’, ‘ _ ’ → ’. ’, và ‘. ’ → ’ A ’. Phép dịch 3 là : ‘ A ’ → ’ D ’, ‘ B ’ → ’ E ’, …, ‘. ’ → ’ C ’. Bài toán đặt ra là cho trước số nguyên K và một xâu ký tự, hãy ghi ra kếtquả phép dịch K tương ứng của xâu đó sau khi đã đảo ngược thứ tự cácchữ cái. InputMỗi bộ test ghi trên một dòng số nguyên 1 < = N < = 27, tiếp theo là khoảng chừng trốngrồi đến xâu S ( không quá 40 ký tự và chỉ gồm có những vần âm in hoa ). Bộ test ở đầu cuối có 1 số ít 0. Output25

Source: https://mix166.vn
Category: Thủ Thuật

Xổ số miền Bắc