Đệ qui (1 bài TH) 2. Con trỏ (3 bài TH) 3. Chuỗi (1 bài TH) 4. Tập tin (1 bài TH) 5. Cấu trúc (4 bài TH) Đánh giá theo tiêu chí: biết, hiểu, vận dụng, tối ưu Phân bổ thời gian thực hành (10 tuần, 3 tiếttuần) Tuần 01: Ôn tập ngôn ngữ lập trình C Chương 1. Quy nạp toán học và Lập trình đệ quy Tuần 020304: Chương 2. Kiểu cấu trúc và Ứng dụng Tuần 05060708: Kiểm tra giữa kỳ (thực hành) Chương 3. Biến động và Kiểu con trỏ Tuần 0910: Chương 4. Kiểu tập tin Ôn tập, bài tập tổng hợp và kiểm tra cuối kỳ.Khoa Công nghệ thông tin – Đại học Công nghiệp TP. Hồ Chí Minh 2 BÀI TẬP THỰC HÀNH TUẦN 01 (3 tiết) Mục tiêu: (Ôn tập Nhập môn lập trình C) Hiểu và
Trang 1Đánh giá theo tiêu chí: biết, hiểu, vận dụng, tối ưu
Phân bổ thời gian thực hành (10 tuần, 3 tiết/tuần)
Kiểm tra giữa kỳ (thực hành)
Chương 3 Biến động và Kiểu con trỏ
Tuần 09-10:
Chương 4 Kiểu tập tin
Ôn tập, bài tập tổng hợp và kiểm tra cuối kỳ
Trang 2BÀI TẬP THỰC HÀNH TUẦN 01 (3 tiết)
Mục tiêu:
(Ôn tập Nhập môn lập trình C) Hiểu và áp dụng được các khái niệm của ngôn ngữ lập trình C
(kiểu dữ liệu, biến, hằng, biểu thức, cấu trúc điều khiển, cấu trúc lặp, hàm, mảng, chuỗi, …)
Trình bày được khái niệm chương trình con
Vận dụng được các định nghĩa quy nạp toán học vào chương trình cụ thể
Vận dụng được lập trình đệ quy vào bài toán cụ thể
Tính tổng các giá trị trong mảng – Tổng các số chẵn, tổng các số lẻ - Tổng các số nguyên tố …
Thêm 1 phần tử vào mảng (thêm đầu mảng, giữa mảng hoặc cuối mảng)
Xóa 1 phần tử của mảng ( xóa đầu mảng, giữa mảng hoặc cuối mảng)
Tìm kiếm phần tử trong mảng (chỉ thực hiện tìm tuyến tính)
- Khai báo hằng số MAX trước khi sử dụng
- Khai báo các thư viện liên quan stdio.h,
- Khai báo các khung hàm (prototype) trước khi viết chi tiết của hàm
Tham khảo đoạn code của hàm main() sau:
Trang 3 Hàm nhập mảng Việc nhập này nhập luôn số phần tử n của mảng
Trang 4 Hàm phát sinh ngẫu nhiên các phần tử mảng
Hàm xuất các phần tử mảng
Hàm tính tổng các phần tử mảng Các thao tác tính tổng khác SV tự thêm vào điều kiện
Hàm xóa phần tử mảng tại vị trí k, trong đó k>=0 và k<n Sử dụng khai báo &n để cập nhật số phần
tử của mảng sau khi thêm SV có thể tách hàm thành các trường hợp xóa đầu, xóa cuối hay xóa giữa mảng
Trang 5 Thao tác thêm phần tử vào vị trí k, trong đó k>=0 và k<n Kèm thêm điều kiện n nhỏ hơn số phần tử ban đầu n<MAX Sử dụng khai báo &n để cập nhật số phần tử của mảng sau khi thêm SV có thể tách hàm thành các trường hợp thêm đầu, thêm cuối hay thêm giữa mảng
Bài 2 Các thao tác trên mảng 2 chiều:
Nhập số phần tử (thực tế sử dụng) của mảng gồm số dòng N và số cột M
Nhập từng giá trị trong mảng 2 chiều (hoặc phát sinh ngẫu nhiên dùng srand() và rand())
Xuất các phần tử trong mảng (theo dạng ma trận, dòng cột)
Tính tổng các giá trị trong mảng 2 chiều – Tổng các số chẵn, tổng các số lẻ trên dòng K, cột L - Tổng các số nguyên tố trên dòng K, cột L …
Tìm kiếm phần tử X trên dòng, cột, đường chéo chính, đường chéo phụ, đường biên của mảng 2 chiều (chỉ thực hiện tìm tuyến tính)
Đếm số phần tử thỏa mãn điều kiện trên dòng/cột
Tìm số lớp nhất/nhỏ nhất trên dòng, cột, đường chéo chính, đường chéo phụ, đường biên của mảng 2 chiều
Sắp xếp mảng 2 chiều tăng dần, giảm dần
Tổng 2 mảng 2 chiều
Tích 2 mảng 2 chiều
Tìm dãy con (tăng/giảm) dài nhất trên từng dòng/cột của ma trận
Trang 6Phần đệ quy:
Bài 3 Tính n! theo đệ quy và không đệ quy
Bài 4 Thực thi chương trình dãy số Fibonaci bằng đệ quy, vòng lặp
Bài 5 Tính tổng N số nguyên theo đệ quy và không đệ quy
Trường hợp dừng: sum(0) = 0
Trường hợp đệ quy: sum(n) = n + sum(n-1)
Tham khảo hàm đệ quy
Bài 6 Tính tích N số nguyên theo đệ quy và không đệ quy
Bài 7 Viết hàm nhân 2 số m * n bằng phương pháp đệ quy
Bài 8 Viết hàm đệ quy kiểm tra 1 số là số chẵn hay số lẻ
Lưu ý:
Sử dụng Mutual Recursion
Hàm kiểm tra số lẻ: Trường hợp dừng: IsOddNumber(0) = 0
Trường hợp đệ quy: IsEvenNumber (n-1)
Hàm kiểm tra số chẵn: Trường hợp dừng: IsEvenNumber(0) = 1
Trường hợp đệ quy: IsOddNumber (n-1)
Bài 9 Tính tổng các chữ số của 1 số dùng phương pháp đệ quy và không đệ quy
Tham khảo:
Trường hợp dừng: sumOfDigit(0) = 0
Trường hợp đệ quy: sumOfDigit (n) = n%10 + sumOfDigit (n/10)
Trang 7Bài 10 Tính lũy thừa của 1 số dùng phương pháp đệ quy
Tham khảo:
Trường hợp dừng: power(0) = 1
Trường hợp đệ quy: power (n) = n* power (n, số mũ -1)
Bài 11 Tính ước số chung lớn nhất của 2 số dùng phương pháp đệ quy
Tham khảo hàm đệ quy sau:
Bài 12 Viết hàm Ackermann dùng phương pháp đệ quy (Nested recursion)
Bài 13 Bài toán tháp Hà Nội với n đĩa
Bài toán tháp Hà Nội (tiếng Anh gọi là Tower of Hanoi hay Towers of Hanoi) xuất phát từ trò chơi đố Tháp Hà Nội Mục đích của bài toán là thực hiện được yêu cầu của trò chơi
Dạng bài toán thông dụng nhất là: Người chơi được cho ba cái cọc và một số đĩa có kích thước khác nhau
có thể cho vào các cọc này Ban đầu sắp xếp các đĩa theo trật tự kích thước vào một cọc sao cho đĩa nhỏ nhất nằm trên cùng, tức là tạo ra một dạng hình nón
Trang 8Người chơi phải di chuyển toàn bộ số đĩa sang một cọc khác, tuân theo các quy tắc sau:
một lần chỉ được di chuyển một đĩa
một đĩa chỉ có thể được đặt lên một đĩa lớn hơn (không nhất thiết hai đĩa này phải có kích thước liền kề, tức là đĩa nhỏ nhất có thể nằm trên đĩa lớn nhất)
Thuật giải đệ quy
đặt tên các cọc là A, B, C những tên này có thể chuyển ở các bước khác nhau
gọi n là tổng số đĩa
đánh số đĩa từ 1 (nhỏ nhất, trên cùng) đến n (lớn nhất, dưới cùng)
Để chuyển n đĩa từ cọc A sang cọc B thì cần:
1 chuyển n-1 đĩa từ A sang C Chỉ còn lại đĩa #n trên cọc A
2 chuyển đĩa #n từ A sang B
3 chuyển n-1 đĩa từ C sang B cho chúng nằm trên đĩa #n
Bài 14
Phương pháp trên được gọi là thuật giải đệ quy: để tiến hành bước 1 và 3, áp dụng lại thuật giải cho n-1 Toàn bộ quá trình là một số hữu hạn các bước, vì đến một lúc nào đó thuật giải sẽ áp dụng cho n = 1 Bước này chỉ đơn giản là chuyển một đĩa duy nhất từ cọc A sang cọc B
Bài 15 Thực thi bài toán 8 con tượng
Bài 16 Thực thi bài toán 8 con hậu
Trang 9Bài 17 Cho công thức tính số tổ hợp m vật lấy từ n vật như sau:
C(n,m) = 1 nếu m = 0 hay m=n
C(n, m) = C(n-1, m) + C(n-1, m-1) nếu 0 < m < n
Hãy viết hàm đệ quy để tính C(n,m)
Viết chương trình nhập vào hai số nguyên n và m và gọi hàm C định nghĩa ở trên để tính C(n,m) và trình bày kết quả ra
Trang 10BÀI TẬP THỰC HÀNH TUẦN 02-03-04 (9 tiết)
Mục tiêu:
Hiểu và áp dụng được: định nghĩa kiểu cấu trúc, khai báo biến cấu trúc, khởi gán biến cấu trúc, tham chiếu các thành phần của cấu trúc
Áp dụng khai báo mảng cấu trúc cho một bài toán cụ thể
Áp dụng được các thao tác trên mảng cấu trúc: nhập, xuất, tìm kiếm, thống kê
Hiểu và áp dụng được cấu trúc bao nhau: định nghĩa, cách sử dụng, áp dụng
Áp dụng được truyền cấu trúc cho hàm: cú pháp, áp dụng
Hiểu và áp dụng được kiểu hợp union vào bài toán cụ thể
Bài 1 Viết chương trình nhập và xuất thông tin một sinh viên Thông tin về mỗi sinh viên gồm họ tên
và ngày sinh (kiểu cấu trúc)
Bài 2 Viết chương trình nhập một mảng sinh viên, thông tin về mỗi sinh viên gồm họ tên và ngày sinh
Sắp xếp mảng theo tuổi và in ra màn hình
Bài 3 Cho số phức dưới dạng cấu trúc gồm 2 thành phần là thực và ảo Viết chương trình nhập 2 số phức
và in ra tổng, tích, hiệu, thương của chúng
Bài 4 Cho phân số dưới dạng cấu trúc gồm 2 thành phần là tử và mẫu Viết chương trình nhập 2 phân
số, in ra tổng, tích, hiệu, thương của chúng dưới dạng tối giản
Bài 5 Cho một mảng các phân số (PHANSO) gồm n phần tử (n≤50) Hãy viết chương trình nhập và
xuất danh sách các phân số sau đó tìm phân số có giá trị lớn nhất, tổng và tích các phân số và nghịch đảo giá trị các phân số trong mảng
Thực hiện các bước theo thứ tự sau:
Định nghĩa cấu trúc PHANSO
typedef struct PHANSO
{
int tu, mau;
};
Xây dựng hàm nhập và xuất cho 1 phân số
void NhapPS(PHANSO &ps);
void XuatPS(PHANSO ps);
Xây dựng hàm tính tổng, hiệu, tích, thương, rút gọn, so sánh và nghịch đảo cho 2 phân số int KiemTra(PHANSO ps); // trả về 1 nếu hợp lệ
Trang 11int USCLN(int a, int b);
PHANSO Nhan(PHANSO ps1, PHANSO ps2);
PHANSO Chia(PHANSO ps1, PHANSO ps2);
PHANSO Tru(PHANSO ps1, PHANSO ps2);
PHANSO Cong(PHANSO ps1, PHANSO ps2);
int SoSanh(PHANSO ps1, PHANSO ps2);
Xây dựng hàm nhập, xuất, tính tổng, tích cho mảng các phân số
void NhapMangPS(PHANSO dsps[], int &n);
void XuatMangPS(PHANSO dsps[], int n);
PHANSO TimMax(PHANSO dsps[], int n);
PHANSO TongCacPS(PHANSO dsps[], int n);
PHANSO TichCacPS(PHANSO dsps[], int n);
void NghichDaoCacPS(PHANSO dsps[], int n);
Viết hàm main() xử lý các thao tác
Bài 6 Khai báo kiểu dữ liệu ngày (NGAY) Thực hiện các thao tác sau:
Nhập/Xuất ngày (ngày, tháng, năm)
Kiểm tra năm nhuận
Tính số thứ tự ngày trong năm
Tính số thứ tự ngày kể từ ngày 1/1/1
Tìm ngày trước đó, sau đó k ngày
Tính khoảng cách giữa hai ngày
So sánh hai ngày
Bài 7 Viết chương trình nhập vào toạ độ hai điểm trong mặt phẳng và tính tổng hai toạ độ này
Định nghĩa cấu trúc gồm tọa độ x, y
typedef struct DIEM
{
Trang 12int x;
int y;
};
Viết hàm nhập/xuất/tính tổng, tham khảo các prototype sau:
void Nhap (DIEM &d);
void Xuat (DIEM d)
DIEM Tong (DIEM d1,DIEM d2)
Viết hàm main()
Bài 8 Tính số ngày đã qua kể từ đầu năm cho đến ngày hiện tại Qui ước ngày được khai báo dưới dạng
cấu trúc và để đơn giản một năm bất kỳ được tính 365 ngày và tháng bất kỳ có 30 ngày
Bài 9 Cho cấu trúc NHANVIEN như sau:
Ma NV: kiểu số nguyên có giá trị trong khoảng 0…65535
Họ tên: kiểu chuỗi
Địa chỉ: kiểu chuỗi
CBQL: có giá trị 1 nếu nhân viên này là cán bộ quản lý
Yêu cầu chương trình thực hiện:
Viết hàm nhập vào thông tin của một nhân viên
Viết hàm xuất thông tin của một nhân viên
Viết hàm main có yêu cầu nhâp vào n nhân viên với n được nhập từ bàn phím In ra họ tên của các nhân viên là cán bộ quản lý
Xóa các nhân viên không là cán bộ quản lý ra khỏi danh sách
Nhập thêm thông tin của một nhân viên Thực hiện việc chèn nhân viên mới vào danh sách tại
vị trí k (k nhập vào từ bàn phím)
Bài 10 Quản lý thông tin sách trong một thư viện người ta lưu trữ các thông tin sau: mã sách là
số từ 1 100000, tên sách, tên tác giả, nhà xuất bản, năm xuất bản, giá thành của quyển sách Viết chương trình quản lý thông tin sách của thư viện (nhiều sách)
Nhập danh sách các quyển sách
Xuất danh sách các quyển sách
Tìm kiếm quyển sách có mã số X, X nhập vào từ bàn phím Chương trình thông báo nếu không
có sách đó
Bài 11 Quản lý thông tin của một thư viện nhạc trực tuyến người ta thực hiện như sau:
Thông tin của một bài nhạc bao gồm mã số (là duy nhất), tên bài nhạc, tên ca sĩ và số điểm đánh giá của bài nhạc (số điểm này có giá trị từ 1-10)
Danh sách các bài nhạc sẽ được lưu trữ và hỗ trợ tra cứu Thực hiện các hàm và chương trình cho phép quản lý thông tin nhạc này
Trang 13b Thực hiện nhập 1 bài nhạc với prototype:
void Nhap1BaiNhac(NHAC baihat);
void Nhap1BaiNhac(NHAC baihat)
void NhapDSBaiNhac(NHAC ds[], int sopt);
void NhapDSBaiNhac(NHAC ds[], int sopt)
{
for (int i=0; i<sopt; i++) Nhap1BaiNhac(ds[i]);
}
d Thực hiện xuất 1 bài nhạc với prototype
void Xuat1BaiNhac(NHAC *baihat);
void Xuat1BaiNhac(NHAC *baihat)
e Thực hiện xuất danh sách các bài nhạc
void XuatDSBaiNhac(NHAC ds[], int sopt);
void XuatDSBaiNhac(NHAC ds[], int sopt)
{
for (int i=0; i<sopt; i++) Xuat1BaiNhac(&ds[i]);
}
f Sắp xếp các bài nhạc theo điểm số
void SapXep(NHAC ds[], int sopt);
Trang 14Bài 12 Thực hiện thao tác quản lý thông tin của các bài hát trong một website Mỗi một bài hát
bao gồm mã số bài hát, tên bài hát, ca sỹ thực hiện và điểm đánh giá của bài hát đó Điểm đánh giá là thang điểm từ 1 -10
Lưu ý PP thực hiện:
a Định nghĩa ra kiểu dữ liệu BaiHat để lưu trữ thông tin
b Viết chương trình (bằng các thủ tục) cho phép nhập vào thông tin các bài hát với các khung hàm sau:
void NhapDSBH(BaiHat bh[], int spt);
d Viết hàm tìm kiếm theo mã số bài hát
void TimKiem1(BaiHat bh[], int spt, int masotim, int &kq);
BaiHat TimKiem1(BaiHat bh[], int spt, int masotim, int &kq);
Bài 13 Một lớp có N sinh viên mỗi sinh viên gồm họ tên và mã sinh viên (N<=60) Hãy nhập và
hiển thị dữ liệu cho lớp đó Ngoài thông tin họ tên và mã, sinh viên còn có ngày sinh và điểm các môn toán, ngoại ngữ, triết học
struct SINHVIEN
{
char MSV[20]; // ma sinh vien char hoten[30]; // ho ten sinh vien double toan, van, anh; // cac diem toan, tin, anh struct NGAYSINH {
int ngay, thang, nam;
} ngaysinhsv;
};
Cho phép nhập từng sinh viên và danh sách sinh viên của lớp
Cho phép xuất ra màn hình ở dạng danh sách
Cho phép tìm kiếm sinh viên theo họ hoặc theo tên
Sắp xếp danh sách lớp theo tên/theo điểm trung bình và theo năm sinh
Đếm xem có bao nhiêu sinh viên không nợ môn học (Điều kiện không nợ môn là điểm trung bình ≥5.0 và không có môn nào dưới 5 điểm)
Tham khảo các khung hàm:
void NhapNSinh(NGAYSINH &d);
Trang 15void XuatNSinh(NGAYSINH d);
void Nhap1SV (SINHVIEN &sv);
void Xuat1 SV (SINHVIEN sv);
void NhapDSSV(SINHVIEN lh[], int &n);
void XuatDSSV (SINHVIEN lh[], int n);
int DemSV(SINHVIEN lh[], int n);
Khi nhập dữ liệu dùng:
fflushall(); //Xóa vùng đệm gets(sv.MSV);
Bài 14 Nhập vào danh sách lớp gồm n học viên Thông tin về mỗi học viên gồm Họ tên, phái ,
điểm, kết quả Xét kết quả theo điều kiện sau : nếu Ðiểm>= 5 (đậu), điểm <5 : (rớt) Sau đó sắp xếp theo điểm và xuất ra màn hình
Bài 15 Tạo một danh sách cán bộ công nhân viên, mỗi người người xem như một cấu trúc bao
gồm Họ, Tên, Lương, Tuổi, Địa chỉ Nhập một số người N vào danh sách, sắp xếp tên theo thứ tự
từ điển, in danh sách đã sắp xếp theo mẫu sau:
Bài 16 Định nghĩa kiểu dữ liệu struct quản lý thông tin của tiểu luận Viết chương trình quản lý
thông tin tiểu luận của một môn học
Bài 17 Tổ chức dữ liệu quản lí danh mục các bộ phim VIDEO, các thông tin liên quan đến bộ
phim này như sau:
Tên phim (tựa phim)
Thể loại (3 loại : hình sự, tình cảm, hài)
Tên đạo diễn
Tên điễn viên nam chính
Tên diễn viên nữ chính
Năm sản xuất
Hãng sản xuất
Viết chương trình thực hiện những công việc sau :
Nhập vào bộ phim mới cùng với các thông tin liên quan đến bộ phim này
Nhập một thể loại: In ra danh sách các bộ phim thuộc thể loại này
Nhập một tên nam diễn viên In ra các bộ phim có diễn viên này đóng
Trang 16 Nhập tên đạo diễn In ra danh sách các bộ phim do đạo diễn này dàn dựng
Bài 18 Một thư viện cần quản lý thông tin về các đầu sách Mỗi đầu sách bao gồm các thông tin
sau : MaSSach (mã số sách), TenSach (tên sách), TacGia (tác giả), SL (số lượng các cuốn sách của đầu sách) Viết chương trình thực hiện các chức năng sau:
Nhập vào một danh sách các đầu sách (tối đa là 100 đầu sách)
Nhập vào tên của quyển sách In ra thông tin đầy đủ về các sách có tên đó, nếu không có thì tên của quyển sách đó thì báo là: Không Tìm Thấy
Tính tổng số sách có trong thư viện
Bài 19 Viết chương trình tạo một mảng danh sách các máy tính của một cửa hàng, thông tin của
một máy tính bao gồm :
Loại máy
Nơi sản xuất
Thời gian bảo hành
Viết hàm nhập một dãy các loại máy tính có thông tin như trên
Hãy viết hàm thống kê xem có bao nhiêu máy có thời gian bảo hành là 1 năm
In ra danh sách các máy tính có xuất xứ từ Mỹ
Bài 20 Để lắp ráp một máy vi tính hoàn chỉnh cần phải có tối thiểu 10 linh kiện loại A và có thể
lắp bổ sung thêm vào khoảng tối đa 8 linh kiện loại B Tại một cửa hàng vi tính cần quản lý bán hàng các loại linh kiện tại cửa hàng Thông tin về một loại linh kiện gồm có: Tên linh kiện, quy cách , loại, đơn giá loại 1 (chất lượng tốt – sốnguyên), đơn giá loại 2 (chất lượng thường – số nguyên) Viết chương trình thực hiện những công việc sau :
Nhập vào thông tin về các linh kiện có ở cửa hàng
Xuất danh sách các linh kiện đã nhập theo thứ tự tăng dần của loại linh kiện và tên linh kiện
Cho biết đã có đủ 10 linh kiện loại A cần thiết lắp ráp máy hay chưa?
Bài 21 Một cửa hàng cần quản lý các mặt hàng, thông tin một mặt hàng bao gồm:
Thời gian bảo hành (tính theo đơn vị tháng)
Thực hiện chương trình với các chức năng sau:
Nhập vào một danh sách các mặt hàng