Bài toán số 3.2: Đếm số lần xuất hiện của giá trị X trong mảng A. Đếm số lần xuất hiện của các phần tử trong mảng.
Ví dụ: A: 1 5 6 7 4 1 5 5 1 1
X: 6
Kết quả: So lan xuat hien X la 1
So lan xuat hien cua cac phan tu:
1 ==> 4 5 ==> 3
6 ==> 1 7 ==> 1
4 ==> 1 1 ==> 4 …….
Hướng dẫn:
- Viết hàm đếm số lần xuất hiện củat một giá trị X nào đó được nhập vào, và xem như X nhà là tham số cho việc đếm số lần xuất hiện của nó trong A
- Viết hàm in ra số lần xuất hiên của tất cả các phần tử trong mảng, sử dụng lại hàm đã xây dựng ở trước.
- Xây dựng chương trình giải quyết bài toán trên gồm:
- Khai báo mảng A, N phần tử.
- Nhập / Xuất mảng A với N phần tử [lưu ý, phải có định nghĩa hàm nhập /xuất mảng].
- Hai hàm này được sử dụng kết quả của bài toán 3.1
- Nhập giá trị X cần đếm số là xuất hiện.
- In số lần xuất hiện của X trong A. Ý tưởng:
- Khởi tạo biến đếm ban đầu là 0.
- Sử dụng vòng lặp i, lặp từ 1 đến N.
- Đối với mỗi phần tử A[i], nếu A[i] = X thì tăng biến đếm lên 1
- Kết thúc, giá trị biến đếm là số lần xuất hiện cử X trong A.
- In số lần xuất hiện của các phần tử trong A.
Các hàm xây dựng:
{ 1. Dem so phan tu A[i] trong mang bang gia tri X } Function DemPtuX[Var A : Mang20; N, X : Integer] : Integer; Var i , Count : Integer; Begin Count := 0; For i:=0 to N do If [ A[i] = X ] then Count := Count + 1; DemPtuX := Count; End; { 2. Dem so lan xuat hien cua tat ca cac phan tu trong mang } Procedure InSoLanXHcuaPTu[ A:Mang20; N: Integer]; Var i :Integer; Begin For i:=0 to N do Writeln[ A[i] ,' ===> ', DemPtuX[ A, N, A[i] ] ]; End;
Source code chương trình chính:
BEGIN Clrscr; NhapMang1C[ A, N ]; XuatMang1C[ A, N ]; Write[ 'Gia tri X:' ]; Readln[ X ]; Writeln[ 'So lan xuat hien trong A la:', DemPtuX[A, N, X] ]; InSoLanXHcuaPTu [ A, N ]; Readln; END .
Cải tiến: Không in ra các phần tử được lặp lại.
Hướng dẫn: Đối với mỗi phần tử, trước khi in, kiểm tra xem nó xuất hiện trước nó hay không.
- Nếu A[i] chưa xuất hiện trước nó, thì in ra số lần xuất hiện của A[i]
- Nếu A[i] có xuất hiện trước nó, thì không in ra số lần xuất hiện của A[i] nữa, vì đã in ra số lần xuất hiện của phần tử có giá trị bằng A[i] rồi.
Mở rộng: In ra phần tử xuất hiện ít nhất và nhiều nhất trong mảng.
Bài toán số 3.3: Tìm kiếm và thay thế. Tìm kiếm vị trí xuất hiện của x trên mảng A. Thay thế những giá trị Ai là x thành y.
Ví dụ: A: 1 5 6 7 4 1 5 5 1 1
X=5 Y=15
Kết quả: Vi tri xuat hien X la 1
Ket qua thay the: 1 15 6 7 4 1 15 15 1 1
Hướng dẫn:
- Xây dựng hàm tìm kiếm giá trị X trong mảng A, N phần tử. Sử dụng vòng lặp từ 0 đến N-1 để kiểm tra tất cả các giá trị Ai, nếu bằng x thì trả về vị trí i tìm thấy. Nếu thoát vòng lặp mà không tìm thấy thì trả về là –1.
- Xây dựng hàm thay thế giá trị x bằng y tại vị trí tìm thấy đầu tiên. Tương tự như tìm kiếm, nhưng khi tìm thấy thì tiến hành gán giá trị mới cho Ai là y.
- Xây dựng hàm thay thế tất cả các giá trị x bằng y tại mỗi vị trí tìm thấy. Sử dụng vòng lặp duyệt qua tất cả các giá trị của Ai, nếu Ai bằng x thì tiến hành gán thành y.
Các hàm xây dựng:
{ 1. Ham tim kiem gia tri X trong mang A voi N phan tu } Function TimKiem [ A:Mang20; N:Integer; X:Integer ]:Boolean; Var Flag : Boolean; i:Integer; Begin Flag:=False; For i:=0 to N do Begin If [A[i] = x] then Begin Flag:=True; Break; {Tim thay ==> Tra ve vi tri tim thay } End; End; TimKiem:=Flag; End; { 2. Thay the phan tu X dau tien tim thay trong mang bang gia tri Y } Function ThayThe[Var A:Mang20;Var N, x, y:Integer]:Integer; Var i:Integer; Begin For i:=0 to N do If [A[i] = x] then Begin A[i] := y; { Tim thay x ==> thay the thanh y } Break; { Cham dut qua trinh thay the} End; ThayThe := i; End; { 3. Thay the tat ca cac phan tu co gia tri X tim thay bang gia tri Y } Procedure ThayTheTatCa [Var A:Mang20; Var N, x,y:Integer]; Var i:Integer; Begin For i:=0 to N do If[A[i] = x] then { Tim thay x ==> thay the thanh y } A[i] := y; End; Source code chương trình chính BEGIN NhapMang1C[A, N]; { Ham nhap xuat khong lam lai nua } XuatMang1C[A, N]; { Su du let qua o truoc } Write['Gia tri x:']; Readln[x]; If [TimKiem[A,N,x]] then Writeln[ 'Tim thay tai vi tri trong mang A.', x, k ] Else Writeln[ 'Khong tim thay trong mang A', x ]; Write['gia tri y:']; Readln[y]; ThayThe[A, N, x, y]; Writeln['Ket qua thay the ',x, y]; XuatMang1C[A, N]; ThayTheTatCa[A, N, x, y]; Writeln['Ket qua thay the tat ca la:',x, y]; XuatMang1C[A, N]; Readln; END.
Mở rộng:
+ Tìm kiếm các cặp 2 phần tử gần nhau có tổng chia hết cho 10. Thay thế các phần tử đó bằng tổng của chúng.