[r]
(1)CHƯƠNG IV: KIỂU DỮ LIỆU CÓ CẤU TRÚC Bài 11: Kiểu mảng Cho mảng a gồm n phần tử n<=15 Giá trị từng phần tử là số nguyên Thực hiện các chương trình sau: Tính tổng các phần tử mảng Input A=1 Output S = 23 Xác định bài toán: - Input: mảng a - Output: tổng các phần tử mảng Thuật toán: - B1: Nhập n, a1,a2, …, an B2: i 1, s - B3: s s + B4: i i + B5: nếu i > n, đưa S và kết thúc - B6: quay lại bước Chương trình: program tinhtong; uses crt; var n,i:byte; a:array[1 15] of integer; s:integer; begin clrscr; write('nhap so luong phan tu: '); readln(n); for i:=1 to n begin write('nhap phan tu a[',i,'] = '); readln(a[i]); end; s:=0; for i:=1 to n s:=s+a[i]; writeln('tong cac phan tu mang la: ',s); readln end (2) Tính tổng các phần tử âm của mảng Input A = -4 -7 Output S = -11 Xác định bài toán: - Input: mảng a - Output: tổng các phần tử âm mảng Thuật toán: - B1Nhập n, a1,a2, …, an B2: i 1, s - B3: nếu < thì s s + B4: i i + B5: nếu i > n, đưa S và kết thúc - B6: quay lại bước Chương trình: program tongam; uses crt; var n,i:byte; a:array[1 15] of integer; s:integer; begin clrscr; write('nhap so luong phan tu: '); readln(n); for i:=1 to n begin write('nhap phan tu a[',i,'] = '); readln(a[i]); end; s:=0; for i:=1 to n if a[i] < then s:=s+a[i]; writeln('tong cac phan tu mang la: ',s); readln end (3) Tính tổng và trung bình cộng của các phần tử chẵn của mảng Input A = -4 -7 Output S = 2, TB = Xác định bài toán: - Input: mảng a Output: tổng các phần tử chẵn và TB cộng của các phần tử chẵn mảng Thuật toán: - B1Nhập n, a1,a2, …, an - B2: i 1, s 0, d - B3: nếu chia hết cho thì s s + , d d+1 B4: i i + B5: nếu i > n, tính TB s/d, đưa S và TB rồi kết thúc - B6: quay lại bước Chương trình: program tongchan; uses crt; var n,i:byte; a:array[1 15] of integer; s:integer; TB: real; begin clrscr; write('nhap so luong phan tu: '); readln(n); for i:=1 to n begin write('nhap phan tu a[',i,'] = '); readln(a[i]); end; s:=0; d:=0; for i:=1 to n if a[i] mod = then begin s:=s+a[i]; d:=d+1; end; TB:= s/d; writeln('tong cac phan tu mang la: ',s); writeln(‘trung binh cac phan tu chan la: ‘,TB); readln end (4) Tìm phần tử có giá trị lớp nhất của mảng Input A = -4 -7 Output Max = 6, vt = Xác định bài toán: - Input: mảng a - Output: phần tử có giá trị lớn nhất mảng, và vị trí của nó Thuật toán: - B1Nhập n, a1,a2, …, an - B2: i 2, Max a1 , cs B3: nếu i > n thì đưa Max, cs và kết thúc - B4: nếu > Max, thì Max , cs i B5: i i + 1, quay lại bước Chương trình: program timmax; uses crt; var n,i,cs:byte; a:array[1 15] of integer; Max:integer; begin clrscr; write('nhap so luong phan tu: '); readln(n); for i:=1 to n begin write('nhap phan tu a[',i,'] = '); readln(a[i]); end; Max := a[i]; cs:=i; for i:=2 to n if a[i] > Max then begin Max:=a[i]; cs:=i; end; writeln(' phan tu lon nhat mang la: ',Max , ‘o vi tri ‘,i); readln end (5) Tìm phần tử có giá trị nhỏ nhất của mảng Input A = -4 -7 Output Min = -7, vt = Xác định bài toán: - Input: mảng a - Output: Phần tử có giá trị nhỏ nhất mảng và vị trí của nó Thuật toán: - B1Nhập n, a1,a2, …, an - B2: i 2, Min a1 , cs - B3: nếu i > n thì đưa Max và kết thúc - B4: nếu > Max, thì Max , cs i B5: i i + 1, quay lại bước Chương trình: program timmax; uses crt; var n,i,cs:byte; a:array[1 15] of integer; Min:integer; begin clrscr; write('nhap so luong phan tu: '); readln(n); for i:=1 to n begin write('nhap phan tu a[',i,'] = '); readln(a[i]); end; Min := a[i]; cs i; for i:=2 to n if a[i] < Min then begin Min:=a[i]; cs:= i; end; writeln(' phan tu nho nhat mang la: ',Min,’ o vi tri ‘,i); readln end (6) Sắp xếp dãy a thành dãy không giảm Input A = -4 -7 Output A = -7 -4 Xác định bài toán: - Input: mảng a - Output: mảng a là dãy không tăng Thuật toán: - B1Nhập n, a1,a2, …, an - B2: m n - B3: Nếu M < thì đưa dãy a đã được sắp xếp rồi kết thúc - B4: m m – 1, i - B5: i i + B6: Nếu i > M thì quay lại bước 3; B7: nếu > + , thì tráo đổi và ai+1 cho - B8: quay lại bước Chương trình: program sxkhonggiam; uses crt; var n,i,m,j:byte; a:array[1 15] of integer; t:integer; begin clrscr; write('nhap so luong phan tu: '); readln(n); for i:=1 to n begin write('nhap phan tu a[',i,'] = '); readln(a[i]); end; for j:=n downto for i:= to j-1 if a[i] > a[i+1] then begin t:=a[i]; a[i]:=a[i+1]; a[i+1]:=t; end; writeln(' Day so sau sap xep: ’); for i:=1 to n write(a[i]:4); readln end (7) Tính tổng các số nguyên dương chia hết cho Input A= Output S = 15 10 Xác định bài toán: - Input: mảng a - Output: tổng các phần tử mảng chia hết cho Thuật toán: - B1Nhập n, a1,a2, …, an - B2: i 1, s 0, - B3: nếu chia hết cho thì s s + B4: i i + - B5: nếu i > n, đưa S và TB rồi kết thúc - B6: quay lại bước Chương trình: program tongboi5; uses crt; var n,i:byte; a:array[1 15] of integer; s:integer; begin clrscr; write('nhap so luong phan tu: '); readln(n); for i:=1 to n begin write('nhap phan tu a[',i,'] = '); readln(a[i]); end; s:=0; for i:=1 to n if a[i] mod = then s:=s+a[i]; writeln('tong cac phan tu chia het cho la: ',s); readln end (8) Kiểm tra tính nguyên tố của các phần tử mảng Input A= là số nguyên tố là số nguyên tố Output không phải là số nguyên tố là số nguyên tố không phải là số nguyên tố Xác định bài toán: - Input: mảng a - Output: tổng các phần tử chẵn và TB cộng của các phần tử chẵn mảng Thuật toán: - B1Nhập n, a1,a2, …, an - B2: i 1, - B3: nếu là nguyên tố thì thông báo là số nguyên tố - B4: ngược lại, thông báo không phải là số nguyên tố B5: ii+1; B6: nếu i > n, kết thúc B7: quay lại bước Chương trình: program ktnguyento; uses crt; var a:array[1 15] of integer; n,i,j,d:byte; begin clrscr; write('nhap so luong phan tu: '); readln(n); for i:=1 to n begin write('nhap phan tu a[',i,']= '); readln(a[i]); end; writeln(' '); for i:=1 to n begin d:=0; for j:=2 to (a[i] div 2) if a[i] mod j = then d:=d+1; if d=0 then writeln(a[i],' la so nguyen to') else writeln(a[i],' khong phai so nguyen to'); end; readln end (9) Có bao nhiêu phần tử mảng a có giá trị bằng k Input A1 = K=4d=2 Output K=6d=0 Xác định bài toán: - Input: mảng a, giá trị k - Output: số lượng phần tử mảng có giá trị bằng k Thuật toán: B1Nhập n, a1,a2, …, an , k B2: i 1, d B3: nếu = k thì tăng d lên đơn vị d d +1 B4: ii+1; B5: nếu i > n, đưa d và kết thúc - B6: quay lại bước Chương trình: program timkiem; uses crt; var a:array[1 15] of integer; n,i,d:byte; k:integer; begin clrscr; write('nhap so luong phan tu: '); readln(n); for i:=1 to n begin write('nhap phan tu a[',i,']= '); readln(a[i]); end; write(‘phan gia tri k = ’); readln(k); d:=0; for i:=1 to n if a[i]=k then d:=d+1; writeln(‘so luong phan tu mang co gia tri bang ’,k,’ la: ‘,d); readln end (10) 10.Tìm vị trí xuất hiện của giá trị X mảng a và thay thế X thành Y Input A = 7, x = 5, y =10 Output A = 10 Xác định bài toán: - Input: mảng a, giá trị k - Output: giá trị X mảng được thay thế bằng giá trị Y Thuật toán: - B1Nhập n, a1,a2, …, an , x,y - B2: i - B3: nếu = x thì y B4: ii+1; B5: nếu i > n, đưa mảng sau thay thế và kết thúc - B6: quay lại bước Chương trình: program thaythe; uses crt; var a:array[1 15] of integer; n,i:byte; x,y:integer; begin clrscr; write('nhap so luong phan tu: '); readln(n); for i:=1 to n begin write('nhap phan tu a[',i,'] ='); readln(a[i]); end; write('mang moi nhap la: '); for i:=1 to n write(a[i]:4); writeln; write('nhap gia tri can tim: '); readln(x); write('nhap gia tri thay the: '); readln(y); for i:=1 to n if a[i]=x then a[i]:=y; write('mang sau thay the: '); for i:=1 to n write(a[i]:4); readln end (11) 11 Tim kiếm các căp phần tử gần co tổng chia hết cho 10 Thay thế các phần tử đo băng tổng của chúng Input A = 14 16 24 Output A = 10 10 30 30 24 Xác định bài toán: - Input: mảng a, giá trị k - Output: mảng a sau thay thế Thuật toán: B1Nhập n, a1,a2, …, an , x,y B2: i B3: nếu + ai+1 chia hết cho 10 thì và ai+1 nhận giá trị mới là tổng của chúng B4: ii+1; - B5: nếu i > n, đưa mảng sau thay thế và kết thúc - B6: quay lại bước Chương trình: program thaythe; uses crt; var a:array[1 15] of integer; n,i:byte; x,y:integer; begin clrscr; write('nhap so luong phan tu: '); readln(n); for i:=1 to n begin write('nhap phan tu a[',i,'] ='); readln(a[i]); end; write('mang moi nhap la: '); for i:=1 to n write(a[i]:4); writeln; for i:=1 to n if (a[i] +a[i+1]) mod 10 = then begin a[i]:=a[i]+a[i+1]; a[i+1]:=a[i]; end; write('mang sau thay the: '); for i:=1 to n write(a[i]:4); readln end (12) 12 Kiểm tra mảng co đối xứng hay không? A1 = Input A2 = A3 = 3 A1 không đối xứng Output A2 đối xứng A3 đối xứng Xác định bài toán: - Input: mảng a, giá trị k - Output: thông báo mảng a có đối xứng hay không Thuật toán: - B1Nhập n, a1,a2, …, an - B2: i 1, dx true B3: nếu <> an-i+1 thì dx nhận giá trị mới là false B4: ii+1; - B5: nếu i > n, o B5.1: kiểm tra nếu dx = true thì tb mảng đối xứng và kết thúc o B5.2: dx = false thì thông báo mảng không đối xứng và kết thúc - B6: quay lại bước Chương trình: program doixung; uses crt; var a:array[1 15] of integer; n,i:byte; dx:boolean; begin clrscr; write('nhap so luong phan tu: '); readln(n); for i:=1 to n begin write('nhap phan tu a[',i,'] ='); readln(a[i]); end; write('mang moi nhap la: '); for i:=1 to n write(a[i]:4); writeln; dx:=true; for i:=1 to n if a[i] <> a[n-i+1] then dx:=false; if dx= true then writeln('day la mang doi xung') else writeln('day khong phai mang doi xung'); readln end (13) 13 Kiểm tra xem mảng a co phải la mảng tăng theo câp số công d hay không? A1 = A2 = 10 A1 không phải cấp số cộng Output A2 là cấp số cộng có công sai là Input Xác định bài toán: - Input: mảng a, giá trị k - Output: thông báo mảng a có phải là cấp số cộng hay không? Thuật toán: - B1Nhập n, a1,a2, …, an - B2: i 2, d a2 – a1, csc true B3: nếu <> ai-1 + d, thì csc false B4: ii+1; - B5: nếu i > n, o B5.1: kiểm tra nếu csc = true thì tb mảng là cấp số cộng, kết thúc o B5.2: csc = false thì tb mảng không là cấp số cộng và kết thúc - B6: quay lại bước Chương trình: program cscong; uses crt; var a:array[1 15] of integer; d:integer; n,i:byte; csc:boolean; begin clrscr; write('nhap so luong ptu cua mang '); readln(n); for i:=1 to n begin write('nhap phan tu a[',i,'] = '); readln(a[i]); end; write('mang moi nhap la: '); for i:=1 to n write(a[i]:4); writeln; d:=a[2]-a[1]; csc:=true; for i:=2 to n if (a[i]-a[i-1]<>d) then csc:= false; if csc=true then writeln('day la cap so cong co cong sai = ',d) else writeln('day khong la cap so cong'); readln end (14) 14 Chèn phần tử X vao vị trí k mảng Input A = 7, k = 3, x = 10 Output A = 10 Xác định bài toán: - Input: mảng a, giá trị k - Output: mảng a sau chèn Thuật toán: - B1: Nhập n, a1,a2, …, an , x, k - B2: Chia mảng làm đôi, xuất mảng từ vị trí thứ nhất đến k -1 - B3: dịch chuyển các phần từ ở nửa cuối mảng đến i + - B4: tại vị trí k của mảng nhận giá trị x B5: Đưa mảng sau thay thế và kết thúc Chương trình: program chenso; uses crt; var a:array[1 15] of integer; n,i,k:byte; x:integer; begin clrscr; write('nhap so luong phan tu: '); readln(n); for i:=1 to n begin write('nhap phan tu a[',i,'] ='); readln(a[i]); end; write('mang moi nhap la: '); for i:=1 to n write(a[i]:4); writeln; write('nhap vi tri can chen: '); readln(k); write('nhap gia tri can chen: '); readln(x); write('mang sau thay chen: '); for i:=1 to k-1 write(a[i]:4); for i:=n+1 downto k+1 a[i]:=a[i-1]; a[k]:=x; for i:=k to n+1 write(a[i]:4); readln end (15) Bài 12: Kiểu xâu: Bài 1: nhập vào xâu, đưa xâu có độ dài lớn hơn, và đưa xâu lớn S1 = ‘tin hoc’ S2 = ‘hoc tin hoc’ Xâu dài hơn: S2 = ‘hoc tin hoc’ Output Xâu lớn hơn: S1 = ‘tin hoc’ Ý tưởng: - So sánh hai xâu, xâu nào lớn thì xuất màn hình - So sánh hai xâu, xâu nào dài thì xuất màn hình Chương trình: program sosanh; uses crt; var s1,s2:string; begin clrscr; write('Nhap xau thu nhat: '); readln(s1); write('Nhap xau thu hai: '); readln(s2); if s1> s2 then writeln(‘xau lon hon la:’,s1) else writeln(‘xau lon hon la:’,s2); if length(s1) > length(s2) then writeln(‘xau dai hon la:’,s1) else writeln(‘xau dai hon la:’,s2); readln end Input (16) Bài 2: nhập vào xâu, đếm số kí tự chữ số có xâu Input Nam sinh 21/10/1999 Output Ý tưởng: - Khởi tạo một biến đếm d = - Lần lượt từ đầu xâu đến cuối xâu kiểm tra xem kí tự nào là số từ …9 nếu là số thì tăng biến đếm lên đơn vị Chương trình: program demso; uses crt; var s1:string; i:byte; begin clrscr; write('nhap xau: '); readln(s1); d:=0; for i:=1 to length(s1) if ('0'<=s1[i]) and (s1[i]<='9') then d:=d+1; writeln('ket qua: ',d); readln end (17) Bai 3: nhâp vao xâu, kiểm tra xâu đo co phải la xâu đối xứng hay không? S1= ‘tin hoc’ S2= ‘tot’ S1 không đối xứng Output S2 là xâu đối xứng Ý tưởng: - Khởi tạo xâu rỗng - Xâu rỗng vừa tạo lưu trữ xâu nhập vào theo thứ tự từ sau trước - Nếu xâu bằng thì xâu nhập vào là xâu đối xứng và ngược lại Chương trình: program doixung; uses crt; var s1,s2:string; i:byte; begin clrscr; write('nhap xau: '); readln(s1); s2:=''; for i:=length(s1) downto s2:=s2+s1[i]; if s1 = s2 then writeln('day la xau doi xung') else writeln('day khong phai xau doi xung'); readln end Input (18) Bai 4: nhâp vao xâu, đưa man hinh các chư số co xâu Input Nam sinh nam 1999 – ki mao Output 1999 Ý tưởng: - Khởi tạo xâu rỗng - Lần lượt từ đầu xâu đến cuối xâu kiểm tra xem kí tự nào là số từ …9 nếu là số thì đưa vào xâu rỗng trên Chương trình: program inso; uses crt; var s1,s2:string; i:byte; begin clrscr; write('nhap xau: '); readln(s1); s2:=''; for i:=1 to length(s1) if ('0'<=s1[i]) and (s1[i]<='9') then s2:=s2+s1[i]; writeln('ket qua: ',s2); readln end (19) Bai 5: nhâp vao xâu, chuyển xâu vưa nh âp xâu in hoa Input tin hoc Output TIN HOC Ý tưởng: - Sử dụng câu lệnh chuyển chữ thường thành chữ hoa - Lần lượt từ đầu xâu đến cuối xâu và thực hiện chuyển chữ Chương trình: program chuyenchu; uses crt; var s:string; i:byte; begin clrscr; write('nhap xau: '); readln(s); for i:=1 to length(s) s[i]:= upcase(s[i]); writeln('xau sau chuyen: ',s); readln end (20) Bài 6: nhập vào xâu, thay thế tất cả các cụm kí tự “anh” bằng cụm kí tự “em” Ý tưởng: - Xác định vị trí của cụm kí tự anh - Xóa cụm kí tự anh - Chèn cụm kí tự em vào vị trí vừa xóa Chương trình: program thaychu; uses crt; var s:string; i,vt:byte; begin clrscr; write('nhap xau: '); readln(s); while pos('anh',s)<>0 begin vt:=pos('anh',s); delete(s,vt,3); insert('em',s,vt); end; writeln('xau sau chuyen: ',s); readln end (21) Bài 7: nhập vào xâu, xóa các kí tự trắng thừa xâu (kí tự trắng thừa là kí tự ở đầu và cuối xâu, giữa hai từ có kí tự trắng) Input ‘ hoc tin hoc ’ Output ‘hoc tin hoc’ Ý tưởng: - Xóa kí tự trắng ở đầu và cuối dãy trước - Lần lượt từ đầu xâu đến cuối xâu nếu kí tự liền là kí tự trắng thì xóa bớt kí tự trắng Chương trình: program xoatrang; uses crt; var st:string; i,n: byte; begin clrscr; write('Nhap xau: '); readln(st); n:=length(st); if st[1]=' ' then delete(st,1,1); if st[n]=' ' then delete(st,n,1); for i:=1 to n if (st[i]=' ') and (st[i+1]=' ') then delete(st,i,1); writeln('Ket qua la: ',st); readln end (22) Bài 8: nhập vào họ tên của người, điều chỉnh các kí tự đầu của các từ thành chữ in hoa Input kieu le quyen Output Kieu Le Quyen Ý tưởng: - Tìm vị trí của các dấu cách - Chuyển kí tự tiếp theo sau dấu cách thành kí tự in hoa - Chuyển kí tự đầu tiên xâu thành kí tự in hoa Chương trình: program doichu; uses crt; var st,ten:string; i: byte; begin clrscr; write('Nhap xau: '); readln(st); for i:=1 to length(st) if st[i]=' ' then st[i+1]:=upcase(st[i+1]); st[1]:=upcase(st[1]); writeln('ket qua la: ',st); readln end (23) Bài 9: nhập vào họ tên của người, đưa phần tên Input Kieu Le Quyen Output Quyen Ý tưởng: - Tìm vị trí của dấu cách cuối cùng (vt) - Đếm số kí tự của phần tên (độ dài của tên: dai) Copy từ xâu vừa nhập dai kí tự từ vị trí vt được tên Chương trình: program tach_ten; uses crt; var st,ten:string; vt,dai,i: byte; begin clrscr; write('Nhap xau: '); readln(st); for i:=1 to length(st) if st[i]=' ' then vt:=i+1; dai:=length(st) - vt + 1; ten:=copy(st,vt,dai); writeln('Phan ten la: ',ten); readln end (24) Bài 10: Nhập vào một xâu, mã hóa xâu vừa nhập theo vòng tròn k =1 Input abc Output bcd Ý tưởng: - Tìm vị trí của dấu cách cuối cùng (vt) - Đếm số kí tự của phần tên (độ dài của tên: dai) Copy từ xâu vừa nhập dai kí tự từ vị trí vt được tên Chương trình: program mahoa; uses crt; var st:string; i: byte; begin clrscr; write('Nhap xau: '); readln(st); for i:=1 to length(st) st[i]:= succ(st[i]); {giới thiệu thêm cho HS} writeln('ket qua sau ma hoa: ',st); readln end (25) Bài 11: nhập vào xâu, thông báo màn hình chữ cái có xâu và số lượng của chúng.(không phân biệt chữ hoa, chữ thường); Input ‘hoc tin hoc’ H:2 O:2 C:2 Output T:1 I:1 N:1 Ý tưởng: - Khởi tạo một mảng dem để đếm các kí tự - Chuyển kí tự dãy thành kí tự in hoa - Đi từ đầu xâu đến cuối xâu so xâu vừa nhập với bảng chữ cái in hoa, nếu xuất hiện kí tự nào thì thực hiện đếm kí tự đó - Kí tự có xâu thì biến đếm kí tự đó > Từ điều kiện này ta xuất màn hình kí tự và số lượng kí tự có xâu Chương trình: program demkitu; Uses Crt; Var St:String; dem: Array['A' 'Z'] Of Byte; i:Byte; ch:Char; Begin clrscr; Write('Nhap xau St: '); Readln(St); For ch:='A' To 'Z' Do dem[ch]:=0; For i:=1 To Length(St) Do If (Upcase(St[i]) >='A') and (Upcase(St[i]) <='Z') Then dem[Upcase(St[i])]:=dem[Upcase(St[i])] +1; For ch:='A' To 'Z' Do If dem[ch]>0 Then Writeln(ch,' : ',dem[ch]); Readln; End (26)