Bước 6: Sắp xếp đưa các số nguyên tố lên đầu dãy Nguyên tắc: duyệt lần lượt các phần tử của dãy, kiểm tra nếu là số nguyên tố số nguyên tố là số không có ước ngoài nó và chính nó thì thự[r]
(1)GỢI Ý BÀI THỰC HÀNH BUỔI SỐ Bài 17 (TH-CSLT-01) Hãy viết chương trình nhập vào dãy số đến gặp số thì dừng, sau đó tách các số chẵn và số lẻ 02 mảng khác Tính trung bình cộng các số chẵn dương và trung bình cộng các số lẻ âm HƯỚNG DẪN CHI TIẾT A Input: so: float B Output: tbcd, tbla: float (tbcd: trung bình chẵn dương; tbla: trung bình lẻ âm) C Process: //Các bước viết chương trình – hàm main Bước 1: Khai báo các biến chương trình so, tbcd, tbla tongD, demD, tongA, demA, demC, demL tbCD, tbLA int mangchan[20],mangle[20] Bước 2: Nhập liệu và xử lý yêu cầu - Khởi tạo tongD = 0; demD = 0; tongA = 0; demA = 0; demC=0, demL=0; - Thực nhập số (so) gặp số thì dừng (sử dụng … while), nhập so thực thì kiểm tra số chẵn thì đẩy vào mảng Mangchan (đồng thời tăng demC lên đơn vị) số lẻ thì đẩy vào mảng Mangle (đồng thời tăng demL lên đơn vị) Trong đó: demC là tổng số phần tử Chẵn và demL là tổng số phần tử lẻ { cout<<“Nhap so:”; cin>>so; if (so==0) break; if (so%2==0) { Mangchan[demC] = so; demC++; } else { Mangle[demL] = so; demL++; } }while (so!=0); - In các phần tử Mangchan - In các phần tử Mangle (2) - Duyệt trên mảng các phần tử chẵn (Mangchan, demC), kiểm tra phần tử dương thì cộng vào tongD và tăng giá trị biến đếm demD for(i=0;i<demC;i++) if (Mangchan[i]>0) { tongD = tongD + so; demD = demD + 1; } - Duyệt trên mảng các phần tử lẻ (Mangle, demL), kiểm tra phần tử âm thì cộng và đếm lại for(i=0;i<demL;i++) if (Mangle[i]<0) { tongA = tong A + so; demA = demA + 1; } - Tính giá trị trung bình chẵn dương: - Tính giá trị trung bình lẻ âm: Bước 4: In kết lên màn hình - In trung bình số chẵn dương: - In trung bình số lẻ âm: tbCD = tongD/demD tbLA = tongA/demA tbCD tbLA D Chạy thử với liệu Test sau: - Ví dụ 1: Nhap so: Nhap so: -5 Nhap so: -2 Nhap so: Nhap so: -7 Nhap so: -9 Nhap so: Nhap so: Nhap so: Kết in ra: Trung binh chan duong: Trung binh le am: -7 (3) Bài 18 (TH-CSLT-07): Nhập vào từ bàn phím dãy số gồm n số nguyên (n>0) và thực các yêu cầu sau đây a Hiển thị dãy số màn hình b Nhập vào từ bàn phím số nguyên x Hãy cho biết x xuất dãy số bao nhiêu lần và các vị trí xuất x c Xoá các số có giá trị có dãy (Xoá phần tử đầu tiên) d Sắp xếp đưa các số nguyên tố lên đầu dãy e Tính trung bình cộng các số chia hết cho có dãy HƯỚNG DẪN CHI TIẾT A Input: - n, a[20] và -x B Output: - a[20] - d: số lần giá trị x mảng, các vị trí xuất tương ứng - In lại mảng đã xoá phần tử - Mảng đã xếp -tb3: trung bình các số chia hết cho C Process: //Các bước viết chương trình – hàm main Bước 1: Khai báo các biến chương trình Bước 2: Nhập mảng Bước 3: In lại mảng Bước 4: Nhập số x và tìm kiếm -Nhập x -d = 0; -Duyệt qua tất các phần tử mảng Kiểm tra (a[i] == x) { d = d + 1; cout<<“vi tri xuat hien x:”<<i; //in vị trí xuất x mảng } -In giá trị d //số lần xuất x mảng Bước 5: Xoá phần tử có giá trị Nguyên tắc: duyệt các phần tử dãy, kiểm tra là số thì thực chuyển các phần tử từ vị trí sau đó lùi phía đầu dãy vị trí for(i=0;i<n;i++) if (a[i]==0) { for(j=i;j<n;j++) a[j] = a[j+1]; n = n - 1; i = i – 1; } (4) Bước 6: Sắp xếp đưa các số nguyên tố lên đầu dãy Nguyên tắc: duyệt các phần tử dãy, kiểm tra là số nguyên tố (số nguyên tố là số không có ước ngoài nó và chính nó) thì thực chuyển phần tử đó vị trí đầu tiên (các phần tử còn lại dịch chuyển lùi cuối vị trí) for(i=0;i<n;i++) { //Kiểm tra a[i] là nguyên tố kt = 1; for(j=2;j<a[i];j++) if(a[i]%j==0) kt = 0; if (kt==1) { tg = a[i]; for(j=i;j>0;j ) a[j] = a[j-1]; a[0] = tg; } } Bước 7: Trung bình các số chia hết cho Nguyên tắc: duyệt các phần tử dãy, kiểm tra là số chia hết cho thì cộng và đếm các phần tử đó Cuối cùng để tính trung bình tong3=0; dem3=0; for(i=0;i<n;i++) if (a[i]%3==0) { tong3 = tong3 + a[i]; dem3 = dem3 + 1; } tbc3 = tong3/dem3; cout<<”\n TB cong cac so chia het cho 3:”<<tbc3<<endl; (5) D Chạy thử với liệu Test sau: - Ví dụ 1: Nhap so phan tu: a[0]: a[1]: a[2]: a[3]: a[4]: ð Kết thu được: Mang da nhạp: Nhap so x: So lan xuat hien x: Vi tri tri xuat hien x: Mang sau da xoa 0: Mang sap xep: TB cac so chia het cho 3: (6) Bài 19 (TH-CSLT-04): Số La Mã là tập các ký hiệu: {‘I’,’V’,’X’,’L’,’C’,’D’,’M’} tương đương với các giá trị số chữ số Latin gồm: {1,5,10,50,100,500,1000} Hãy viết chương trình nhập vào số nguyên dương N (N<10000) Hiện màn hình dạng chữ số La Mã số nguyên vừa nhập HƯỚNG DẪN CHI TIẾT A Input: B Output: C Process: //Các bước viết chương trình – hàm main Bước 1: Khai báo các biến chương trình Bước 2: Nhập liệu Bước 3: Thực xử lý yêu cầu Bước 4: In kết lên màn hình D Chạy thử với liệu Test sau: - Ví dụ 1: Lần lượt nhập với yêu cầu sau: (7) Bài 20 (TH-CSLT-05): Thực các yêu cầu sau -Nhập dãy không quá 100 phần tử là các số thực gặp số thì dừng -Hiện dãy vừa nhập -Hiện Tổng các phần tử không âm mảng và Trung bình cộng các phần tử âm -Sắp xếp các phần tử dãy theo trật tự giảm dần giá trị Hiện dãy sau xếp -Giảm giá trị các phần tử vị trí chẵn dãy 10% Hiện dãy sau thực giảm giá trị -Xoá các phần tử vị trí lẻ dãy(VD: vị trí 1, 3, 5, …) Hiện dãy sau xoá HƯỚNG DẪN CHI TIẾT A Input: n, a[20] B Output: - a[20] - td (tổng phần tử không ); tba (trung bình cộng các số âm) - a[20] – Mảng đã xếp - a[20] – Các phần tử vị trí chẵn đã giảm 10% - a[20] – đã xoá các phần tử vị trí lẻ C Process: //Các bước viết chương trình – hàm main Bước 1: Khai báo các biến chương trình Bước 2: Nhập liệu (Nhập dãy không quá 100 phần tử, đến gặp thì dừng) n = 0; { cout<<”Nhap so:”; cin>>so; if (so==0) break; n++; a[n-1] = so; if (n==100) break; }while (so!=0); Bước 4: In lại mảng Bước 5: Tính tổng các phần tử không âm - td = 0; - Duyệt các phần tử mảng if (a[i]>0) td = td + a[i]; - In giá trị td lên màn hình Bước 6: Tính trung bình cộng các phần tử âm - ta = 0; da = 0; - Duyệt các phần tử mảng if (a[i]<0) { ta = ta + da++; } a[i]; (8) - Tính tba = ta/da; - In giá trị tda lên màn hình Bước 7: Sắp xếp mảng theo thứ tự giảm dần - Sử dụng thuật toán Sắp xếp - Tham khảo: for(i=0;i<n;i++) for(j=i+1;j<n;j++) if(a[i]<a[j]) { tg = a[i]; a[i] = a[j]; a[j] = tg; } - In lại mảng đã xếp Bước 8: Giảm giá trị các phần tử vị trí chẵn 10% - Duyệt các phần tử mảng if (i%2==0) a[i] = a[i] * 0.9 - In lại mảng đã xếp Bước 9: Xoá các phần tử vị trí lẻ dãy(VD: vị trí 1, 3, 5, …) Nguyên tắc: duyệt qua các phần tử mảng, là vị trí lẻ thì thực xoá vị trí đó tương ứng for(i=0;i<n;i++) if (i%2==1) { for(j=i;j<n;j++) a[j] = a[j+1]; n = n – 1; i = i - 1; } (9) D Chạy thử với liệu Test sau: - Ví dụ 1: Nhap so phan tu mang: a[0]: a[1]: a[2]: -3 a[3]: a[4]: -5 a[5]: -1 ð Kết in ra: Mang da nhap: -3 -5 -1 Tong cac so khong am: 14 Trung binh cong cac so am: -3 Mang da sap xep giam dan: -1 Cac phan tu vi tri chan giam 10%: 8.1 0.9 -1 -2.7 -5 Xoa cac phan tu le: 8.1 0.9 -2.7 -3 -5 (10) Bài 21 (TH-CSLT-02): Viết chương trình nhập vào mảng hai chiều các số thực Áp dụng: - In lại mảng chiều các phần tử dạng bảng - In các phần tử hàng thứ k mảng hai chiều (k>=0) - Tính tổng các phần tử cột thứ k mảng hai chiều (k>=0) - Thực tìm kiếm phần tử có giá trị là x, cho biết vị trí tìm thấy đầu tiên phần tử trường hợp tìm thấy - Cho biết hàng nào có tổng các phần tử lớn mảng hai chiều HƯỚNG DẪN CHI TIẾT A Input: h, c, a[20][20] //h là số hàng và c là số cột - hk: hàng cần in các phần tử - ck: cột cần tính tổng - x: phần tử cần tim B Output: - a[20][20] - các phần tử hàng thứ k - tổng các phần tử cột thứ k - vth, vtc: vị trí phần tử x tìm thấy (vth: thứ tự hàng – vtc: thứ tự cột) - hmax: số hàng có tổng phần tử lớn C Process: //Các bước viết chương trình – hàm main Bước 1: Khai báo các biến chương trình Bước 2: Nhập liệu Bước 3: In lại mảng chiều Bước 4: In các phần tử hàng thứ k - Nhập hàng k cần in - Duyệt các phần tử trên hàng k và in giá trị (các phần tử có cùng số hàng là k) for(j=0; j<c; j++) cout<<setw(7)<<a[k][j]; Bước 5: Tổng các phần tử cột thứ k - Nhập cột k cần tính tổng - S = 0; - Duyệt các phần tử trên cột k và cộng lại giá trị (các phần tử có cùng số cột là k) for(i=0; i<h; i++) S = S + a[i][k]; - In giá trị k lên màn hình Bước 6: tìm kiếm phần tử x mảng - Nhập phần tử x cần tìm - Khởi tạo vth = -1 và vtc = -1; - Duyệt qua tất các phần tử mảng hai chiều, so sánh giá trị phần tử so với x, thì lưu vị trí tìm thấy và dừng for( i = 0; i<h; i++) for( j=0; j<c; j++) if(a[i][j] == x) 10 (11) { vth = i; vtc = j; break; } - Kiểm tra (vth != -1 và vtc != -1) thì Thông báo tìm thấy phần tử x vị trí vth và vtc Ngược lại Thông báo không tìm thấy phần tử Bước 7: Cho biết hàng có tổng lớn - Tính tổng hàng và giả sử hàng có tổng lớn hmax = 0; for(j=0; j<c; j++) s = s + a[0][j]; smax = s; - Duyệt qua các hàng khác, hàng tính tổng và so sánh với giá trị tổng max (smax) để xác định vị trí hàng có tổng lớn for (i=0; i<h; i ++) { s = ; for(j=0; j<c; j++) s = s + a[i][j]; if (s > smax) { smax = s; hmax = i; } } - Thông báo hàng có tổng lớn là hàng hmax 11 (12) D Chạy thử với liệu Test sau: - Ví dụ 1: Lần lượt nhập với yêu cầu sau: Nhap so hang: Nhap so cot: a[0][0]: a[0][1]: a[0][2]: a[1][0]: a[1][1]: a[1][2]: a[2][0]: a[2][1]: a[2][2]: ð Kết qủa màn hình in ra: Mang hai chieu da nhap: Nhap hang k: Cac phan tu hang k: Nhap cot k: Tong cac phan tu cot k: 11 Nhap phan tu x: Phan tu xuat hien tai hang:1 và cot:2 Hang co tong lon nhat: 12 (13) Bài 22 (TH-CSLT-04): Trò chơi cờ Ca rô biểu diễn trên Ma trận An*m ô ( < n, m < 51), đó: Trò chơi kết thúc người X O đạt ô liên tiếp giống theo chiều ngang, chiều dọc đường chéo Trạng thái hòa là trạng thái mà kết thúc toàn bàn cờ mà không có người thắng Yêu cầu: - Input: Cho ma trận thể kết thi đấu cờ Caro - Output: Trạng thái ván đấu (X thắng; O thắng; Hòa; Trận đấu chưa kết thúc) HƯỚNG DẪN CHI TIẾT A Input: B Output: C Process: //Các bước viết chương trình – hàm main Bước 1: Khai báo các biến chương trình Bước 2: Nhập liệu Bước 3: Thực xử lý yêu cầu Bước 4: In kết lên màn hình D Chạy thử với liệu Test sau: - Ví dụ 1: Lần lượt nhập với yêu cầu sau: 13 (14) Bài 23 (TH-CSLT-06): Viết chương trình thực hiện: a) Nhập ma trận vuông n hàng, n cột các số nguyên (n<=50), b) Hiện ma trận đó màn hình c) Tính tích hàng k, hàng k nhập từ bàn phím d) Tìm hàng có tổng các phần tử nhỏ e) Cho biết có bao nhiêu phần tử âm f) Sắp xếp các phần tử ma trận giảm dần theo cột và màn hình ma trận HƯỚNG DẪN CHI TIẾT A Input: n, a[20][20] //n hàng, n cột - k: hàng cần tính tích B Output: - a[20][20] - tk: tích các phần tử trên hàng thứ k - hmin: số hàng có tổng các phần tử nhỏ - da: số phần tử âm có ma trận C Process: //Các bước viết chương trình – hàm main Bước 1: Khai báo các biến chương trình Bước 2: Nhập liệu Bước 3: In lại mảng chiều Bước 4: Tính tích các phần tử hàng k - Nhập hàng k cần tính tích - tk = 1; - Duyệt các phần tử trên hàng k và lấy giá trị các phần nhân vào kết (các phần tử có cùng số hàng là k) for(j=0; j<n; j++) tk = tk * a[k][j]; - In giá trị kết quả, in tk Bước 5: Cho biết hàng có tổng nhỏ - Tính tổng hàng và giả sử hàng có tổng nhỏ hmin = 0; for(j=0; j<n; j++) s = s + a[0][j]; smin = s; 14 (15) - Duyệt qua các hàng khác, hàng tính tổng và so sánh với giá trị tổng (smin) để xác định vị trí hàng có tổng nhỏ for (i=0; i<n; i ++) { s = ; for(j=0; j<n; j++) s = s + a[i][j]; if (s < smin) { smin = s; hmin = i; } } - Thông báo hàng có tổng nhỏ là hàng hmin Bước 6: Đếm số phần tử âm có mảng - da = 0; - Duyệt qua các phần tử có mảng, kiểm tra giá trị <0 thì tăng biến đếm lên đơn vị for(i=0;i<n;i++) for(j=0; j<n; j++) if (a[i][j]<0) da++; - In số phần tử âm, in giá trị da D Chạy thử với liệu Test sau: - Ví dụ 1: Lần lượt nhập với yêu cầu sau: Nhap n: a[0][0]: -6 a[0][1]: -2 a[0][2]: -3 a[1][0]: a[1][1]: a[1][2]: a[2][0]: a[2][1]: a[2][2]: ð Kết qủa màn hình in ra: Ma tran da nhap: -6 -2 -3 Nhap hang k: 15 (16) Tich hang k: 168 Nhap cot k: Hang co tong nho nhat: So phan tu am: 16 (17)