KHÔNG ĐIỆN THOẠI
KHÔNG TÁM CHUYỆN
KHÔNG NÓI LEO
Câu hỏi : Giả sử cho biến S là biến mảng một chiều có tối đa 30 phần tử, mỗi phần tử của S là 1 kí tự. Hãy viết khai báo biến cho biến S
Var S: Array[1..30] of char;
Ví dụ: VCT nhập vào mảng A họ và tên 1 học sinh (không vượt quá 30 kí tự). Sau đó xuất ra màn hình mảng vừa nhập.
Khai báo

Nhập vào giá trị từng phần tử cho mảng


Xuất ra màn hình mảng vừa nhập
Program VD;
Uses crt;
Var A : array[1..30] of char;
i , n : byte;
Begin
Write(‘Nhap vao so luong ki tu cua ho ten hs:’); Readln(n);
For i:= 1 to n do
begin
write(‘nhap phan tu thu: ’,i);
readln(A[i]);
End;
Write(`Ho va ten HS vua nhap la:`);
For i:=1 to n do Write(A[i]);
Readln
End.
Mỗi lần nhập thì phải nhập từng kí tự, lệnh dài dòng.
? Như vậy thì tốn rất nhiều thời gian.
Bài 12: Kiểu xâu
1. Khái niệm xâu
2. Khai báo biến xâu
3. Các thao tác xử lí xâu
 Xâu là dãy các kí tự trong bộ mã ASCII
A
1 2 3 4 5 6 7
Trong đó:
Khi tham chiếu đến phần tử thứ i của xâu ta viết :
 Tên xâu:
? M?i kớ t? g?i l�
Ví dụ:
? D? d�i c?a xõu (S? kớ t? trong xõu):
H
Ví dụ: A[5]=
1. Khái niệm:
- Kí tự đầu tiên bên trái của xâu được đánh chỉ số là 1.
Ví dụ: Hãy cho biết độ dài của các xâu sau:
? Độ dài là 8
S1 = ‘XUAT SAC’
S2 = ‘THPT PHU HUNG’
S3 = ‘ ’
S4 = ‘’
? Độ dài là 13
? Độ dài là 1 (khoảng trắng)
? Độ dài là 0 (Xâu rỗng)
2. Khai báo biến xâu
Var : String[độ dài lớn nhất của xâu];
- Trong đó:
Tên của biến xâu
- Cú pháp:
Từ khóa khai báo biến xâu
:
String :
Var hoten: string[30];
Tên biến
Độ dài lớn nhất là 30
2. Khai báo biến xâu
Var : String[độ dài lớn nhất của xâu];
- VD1: Khai báo biến để lưu họ tên của một người
- Cú pháp:
Var Hoten: String[50];
- VD2: Khai báo biến để lưu địa chỉ của một người
Var diachi: String;
* Chú ý:
Khi khai báo biến nếu không đưa độ dài lớn nhất vào thì độ dài mặc định là 255
Lưu ý: Trong khi soạn thảo một chương trình, khi viết một xâu kí tự, ta phải viết xâu kí tự đó giữa hai dấu nháy đơn. Nhưng khi chạy chương trình, để nhập giá trị của một xâu, ta chỉ cần gõ các kí tự thuộc xâu đó.
B�i T?p
Chọn khai báo đúng
Var Ten:String[30];
Var TieuSu:String[300];
Var NgaySinh:String[10];
S
Var GioiTinh:String[0];
D
S
D
2. Khai báo biến xâu
Nhập:
readln();


- Xuất:
Write();
Ví D?: VCT nhập và xuất ra họ và tên của 1 học sinh
program VD;
uses crt;
Var S: String[50];
begin
write(`Nhap vao Ho Va Ten cua HS: `);
readln(S);
write(`Ho Va Ten vua nhap la:`,S);
readln
end.
2.1) Nhập xuất dữ liệu cho biến xâu
Khi viết nhập/ xuất dữ liệu cho biến xâu có gì khác so với biến mảng các kí tự?
- Viết một lệnh nhập nguyên cho cả xâu.
- Viết lệnh gọn hơn, Chương trình gọn.
Ta có thể sử dụng lệnh gán để nhập giá trị cho biến xâu:
Tên_biến_xâu := hằng_xâu
Ví dụ: St : = ‘ HA NOI’
2.2) Cấu trúc chung khi tham chiếu
 Tên biến xâu [ chỉ số tham chiếu ]
Ví dụ: st[2]
Các em hãy tìm thêm vài ví dụ?
3.1) Biểu thức xâu:
 Là biểu thức trong đó các toán hạng là các biến xâu, biến kí tự
- Sử dụng kí hiệu + để ghép nhiều xâu thành một xâu
a. Phép ghép xâu
- Ví dụ:
S:=‘Viet’+‘Nam’
S:=‘VietNam’
S1:= ‘PHU ’ + ‘HUNG’
S1:= ‘PHU HUNG’
3. Các thao tác xử lý xâu
bài tập
Em hãy cho biết kết quả của các phép ghép xâu sau:
Nhóm 1: st:=`Ha` +`Noi`;
Nhóm 2: st:=`Ha `+`Noi`;
Nhóm 3: st:=` `+ `Ha Noi`;
Nhóm 4: st:=`Ha Noi` + `Viet`+ `Nam`;
Nhóm 5: st:=`Ho`+ ` Guom`;
Nhóm 6: st:=`Ho Guom` + ` `;
st:= `HaNoi`;
st:= `Ha Noi`;
st:= ` Ha Noi`;
st:= `Ha NoiVietNam`;
st:=`Ho Guom`;
St:=`Ho Guom `;
- Các phép so sánh xâu:
b. Phép so sánh xâu
- Quy tắc:
+ Xâu A=B nếu chúng giống hệt nhau
+ Xâu A>B nếu:
Kí tự đầu tiên khác nhau giữa chúng ở xâu A có mã ASCII lớn hơn ở xâu B
`Ha Noi` `Ha Nam`
Xâu B là đoạn đầu của xâu A
`lop hoc` > `lop`
>, >=, <, <=, =, <>
>
Hãy cho biết kết quả của các phép toán trên xâu sau:
1. ‘anh’ >’em’
2. ‘hoa’ <> ’bong’
3. ‘123’=’321’
4. ‘tin’=’tin’
5. ‘adc’< ‘b’
True
False
True
True
False
⁂ Thủ tục DELETE(St, vt, n)
Xoá n kí tự của xâu St bắt đầu từ vị trí vt
Ví dụ 1:
St:= ‘Song Hong’;
Delete(St,1,5);
g
n
o
H
g
n
o
S
1 2 3 4 5 6 7 8 9
Kết quả: St = ‘Hong’
C. CÁC HÀM VÀ THỦ TỤC XỬ LÝ XÂU:
Ví dụ 2:
St:= ‘abc’
Delete(St,1,3)
St =
Ví dụ 3:
St:= ‘abc’
Delete(St,5,2)
St = ‘abc’
Ví dụ 4:
St:= ‘abc’
Delete(St,1,0)
St = ‘abc’
⁂ Thủ tục DELETE(St, vt, n)
Xoá n kí tự của xâu St bắt đầu từ vị trí vt
‘’
⁂ Thủ tục INSERT(S1, S2, vt)
Ví dụ 1:
S1:= ‘vi-’; S2:= ‘May-tinh’;
1 2 3
1 2 3 4 5 6 7 8
v
-
i
Kết quả: S2 = ‘May-vi-tinh’
1 2 3 4 5 6 7 8 9 10 11
Chèn xâu S1 vào xâu S2 bắt đầu từ vị trí vt
Insert(S1,S2,5);
Ví dụ 2:
S1:= ’abc’
Insert(S1,S2,2)
S2 := ’ef’
ef
S2 =‘eabcf’
S1:= ’abc’
Insert(S1,S2,1)
S2 := ’ef’
S2 =‘ ’
abc
ef
Chèn xâu S1 vào xâu S2 bắt đầu từ vị trí vt
⁂ Thủ tục INSERT(S1, S2, vt)
⁂ Hàm COPY(S, vt, N)
Tạo một xâu gồm N ký tự liên tiếp bắt đầu từ vị trí vt của xâu S
Ví dụ 1:
St1:= ‘Xau-ki-tu’; St2:= Copy(St1,5,5);
1 2 3 4 5 6 7 8 9
Copy
k
i
-
u
t
Kết quả St2 = ‘ki-tu’
S:= ‘abc’
Ví dụ 2:
S1:= copy(S,1,5);
S1 =
‘abc’
S:= ‘abc’
S1:= copy(S,5,2);
S1 = ‘’
Tạo một xâu gồm N ký tự liên tiếp bắt đầu từ vị trí vt của xâu S
⁂ Hàm COPY(S, vt, N)
⁂ Hàm LENGTH(S)
Ví dụ :
S:= ‘Tin hoc’;
D:= Length(S);
1
2
7
3
6
5
4
Kết quả: D = 7
Cho giá trị là độ dài của xâu S
Tiết 29 BÀI 12: KIỂU XÂU (tiết 2)
⁂ Hàm POS(S1, S2)
1
2
7
3
6
5
4
8
- Cho vị trí xuất hiện đầu tiên của xâu S1 trong xâu S2
Ví dụ 1:
S2:= ‘HOA NANG’; S1:= ‘NANG’;
Kết quả: D = 5
D:= Pos(S1,S2);
Ví dụ 2:
S2:= ‘abcde’
D:= pos(‘Cd’,S2);
D = 0
⁂ Hàm POS(S1, S2)
- Cho vị trí xuất hiện đầu tiên của xâu S1 trong xâu S2
Cho chữ cái in hoa ứng với chữ cái trong ch
⁂ Hàm UPCASE(ch)
Ch2:= Upcase(Ch1);
1 2 3 4 5 6
Upcase(st[1])
Upcase(st[2])
Upcase(st[3])
Upcase(st[4])
Upcase(st[5])
Upcase(st[6])
1 2 3 4 5 6
U
p
C
a
s
e
P
A
S
E
Kết quả: Ch2 = ‘A’
Ch1:= ‘a’;
St
Em hãy chỉ ra kết quả khi thực hiện các thao tác sau:
‘Dat ’
‘ki 2’
7
1
05
04
03
02
01
00
Câu 1: Trong ngôn ngữ lập trình Pascal, thủ tục Delete(a,b,c) thực hiện công việc gì trong các công viêc sau?
A. Xóa trong xâu a, tại vị trí b, xóa đi c kí tự
B. Xóa trong xâu a, tại vị trí c, xóa đi b kí tự
C. Xóa trong xâu c, tại vị trí b, xóa đi a kí tự
D. Xóa trong xâu c, tại vị trí a, xóa đi b kí tự

10
09
08
07
06
05
04
03
02
01
00
Câu 2:
Cho S:= ‘Tin hoc’; Tham chiếu tới phần tử thứ 4 của S ta được kết quả?
A. S[4] = ‘hoc’
B. S[4] = ‘’
C. S[4] = ‘h’
D. S[4] = ‘ ‘
10
09
08
07
06
05
04
03
02
01
00
Câu 3:
Cú pháp khai báo tổng quát, đầy đủ của dữ liệu kiểu xâu là:
A. Var of String;
B. Var : String[độ dài lớn nhất của xâu];
C. Var < tên biến> String[độ dài lớn nhất của xâu];
D. Var < tên biến> of String[độ dài lớn nhất của xâu];
05
04
03
02
01
00
Câu 4:
Tìm vị trí xuất hiện đầu tiên
của xâu ‘hoa’ trong xâu S ta viết
A. I:= Pos(‘hoa’,S);
B. S1:= ‘hoa’; I:= Pos(S1,‘hoa’);
C. I:=Pos(S,‘hoa’)
D. I:=Pos(‘hoa’,‘hoa’)
10
09
08
07
06
05
04
03
02
01
00
Câu 5: Trong ngôn ngữ lập trình pascal,hai xâu được so sánh dựa trên?
A. Độ dài tối đa của hai xâu;
B. Mã của từng kí tự trong các xâu lần lượt
từ trái sang phải;
C. Độ dài thực sự của hai xâu;
D. Số lượng kí tự khác nhau trong xâu;
Bài tập 1:
Viết chương trình nhập vào một xâu ký tự từ bàn phím. Đổi xâu ký tự đó sang chữ in hoa rồi in kết quả ra màn hình.
Ví dụ :
Input: ‘abcdAbcD’
Output: ‘ABCDABCD’
Ứng dụng của viết chữ in hoa các em gặp trong những trường hợp nào?
Khi đi làm giấy khai sinh, kê khai lý lịch, làm hồ sơ thi tốt nghiệp, ĐH-CĐ…
Làm thế nào để khi ta nhập họ tên vào máy là chữ thường thì khi hiện lên trên màn hình là chữ in hoa có dấu?
sử dụng hàm upcase(ch)
Hàm upcase(ch) chỉ đổi được 1 kí tự thành ký tự in hoa, ở đây chúng ta đổi cả 1 xâu kí tự?
Vậy chúng ta xử lý vấn đề này như thế nào?
Chúng ta đã biết có thể coi xâu là mảng 1 chiều mà mỗi phần tử là một kí tự. Mỗi kí tự của xâu được đánh số thứ tự thường bắt đầu từ 1, số kí tự của xâu chính là độ dài của xâu. Vậy để có thể chuyển 1 xâu nhập từ bàn phím thành chữ in hoa thì ta sẽ chuyển từng kí tự trong xâu thành kí tự in hoa: duyệt lần lượt từng phần tử trong xâu và gán phần tử đó bằng giá trị mới upcase(ch);
Câu lệnh for i:=1 to length(st) do St[i]:=upcase(St[i]); dùng để thực hiện yêu cầu đó.
Viết chương trình
Program inhoa;
Uses Crt;
Var St: String;
i:Byte;
Begin
Write(‘Nhap xau St: ‘); Readln(St);
For i:=1 to length(St) do St[i]:=Upcase(St[i]);
Write(‘Xau ket qua: ‘, St);
Readln;
End.
Bài tập 2: Nhập 1 xâu St từ bàn phím (St<=80), đưa ra màn hình xâu đảo ngược của xâu đó (viết theo chiều ngược lại).
VD: Input: ‘Hello’
Output: ‘olleH’
Làm thế nào để chúng ta có thể viết ngược lại xâu nhập vào?
Để duyệt lần lượt các kí tự trong xâu St từ 1 đến hết (phần tử cuối cùng có chỉ số trùng với độ dài của xâu) ở các ví dụ và bài tập 1 chúng ta sử dụng vòng lặp biết trước for i:=1 to length(st) do …Vậy nếu chúng ta sử dụng vòng lặp lùi for i:=length(s) downto 1 do …thì có thể giải quyết được yêu cầu của bài toán không?
Chương trình bài tập 2:
Program xaunguoc;
Uses Crt;
Var St: String[80];
i:Byte;
Begin
Write(‘Nhap xau St: ‘); Readln(St);
For i:=length(St) downto 1 do write(St[i]);
Write(‘Xau nguoc cua xau st la: ‘, St);
Readln;
End.
Bài tập 3: Nhập 1 xâu St từ bàn phím (St<=25), đưa ra màn hình xâu st nhưng mỗi kí tự viết trên 1 dòng
VD: Input: ‘Hello’
Output: H
e
l
l
o
Program baitap3;
Uses Crt;
Var St: String[25];
i:Byte;
Begin
Write(‘Nhap xau St: ‘); Readln(St);
Write(‘ket qua la: ‘);
For i:=1 to length(St) do writeln(St[i]:15);
Readln;
End.
Bài tập 4: Nhập 1 xâu St từ bàn phím (St<=25), đưa ra màn hình xâu st nhưng mỗi kí tự viết trên 1 dòng ngược lại với xâu St
VD: Input: ‘Hello’
Output: o
l
l
e
H
Program baitap4;
Uses Crt;
Var St: String[25];
i:Byte;
Begin
Write(‘Nhap xau St: ‘);
Readln(St);
Write(‘ketqua la:’);
For i:= length(St) downto 1 do writeln(St[i]:15);
Readln;
End.
Bài tập 5
Viết chương trình nhập vào một xâu S, in ra màn hình xâu đó ở dạng in hoa.
CHƯƠNG TRÌNH:
Program inhoa;
Uses CRT;
Var S: string; i: integer;
Begin
Clrscr;
Write(‘Nhap vao xau S: ’); readln(S);
For i:= 1 To length(S) Do upcase(S[i]);
Write(‘Xau da chuyen:’,S);
Readln;
End.
Viết chương trình nhập họ tên của 2 người vào 2 biến xâu và đưa ra màn hình xâu dài hơn, nếu bằng nhau thì đưa ra xâu nhập sau.
Bài tập 6
Program bai2;
Uses CRT;
Var a,b: string;
Begin
Clrscr;
Write(‘Nhap ho ten nguoi thu nhat ’); readln(a);
Write(‘Nhap ho ten nguoi thu hai ’); readln(b);
Readln;
End.
IF Length(a)>Length(b) Then Write(a)
Else Write(b);
Xác định bài toán
Input: Nhập vào xâu a, xâu b
Output: Thông báo trùng nhau hoặc không trùng nhau
Bài tập 7: Nhập hai xâu từ bàn phím, kiểm tra kí tự đầu tiên của xâu thứ nhất có trùng với kí tự cuối cùng của xâu thứ hai hay không?
Ý TƯỞNG
-Xác định độ dài xâu b
- So sánh giá trị a[1] với giá trị B[x], Nếu a[1] = b[x] thì đưa ra thông báo ‘Trung nhau’ ngược lại ‘Khac nhau’.
Minh họa (ví dụ 2)
Var a, b:String;
1
2
4
3

5
255
a
Write(‘Nhap vao xau thu nhat: ’);
Readln(a);
t
r
n
a
t
a
n
x := length(b);
If a[1]= b[x] then write (‘Trung nhau’)
else write (‘Khac nhau’);
Nhap vao xau thu nhat:
t
h
i
e
Màn hình
b
g
t
h
i
e
1
2
3
4
5

255
t
r
Write(‘Nhap vao xau thu hai: ’);
Readln(b);
g
x: byte;
Nhap vao xau thu hai:
t
Trung nhau
Ý TƯỞNG
Xác định bài toán
Input: Nhập vào xâu a
Output: Đưa ra màn hình xâu a theo thứ tự ngược lại
Bài tập 8: Nhập vào một xâu từ bàn phím và đưa ra màn hình xâu đó được viết theo thứ tự ngược lại.
-Tính độ dài xâu a là k.
- Lần lượt với i từ k về 1 đưa lên màn hình từng a[i]
Minh hoạ (ví dụ 3)
Var a: String;

i, k:Byte;
1
3
2

4
255
a
Write(‘Nhap vao mot xau: ’);

Readln(St);

k := length(a);
i
a
b
c
d
a
c
d
b
For i:= k downto 1 do

Write(a[i]);
Nhap vao mot xau:
4
d
c
b
a
3
2
1
Màn hình
nguon VI OLET