Bài tập Kỹ thuật lập trình - Lab 5 – Sử dụng mảng, chuỗi và cấu trúc - Khoa Khoa học và Kỹ thuật máy tính - Đại học BK - ĐHQG TP Hồ Chí Minh
MỤC TIÊU CỦA BÀI THỰC HÀNH
Định nghĩa được kiểu dữ liệu mới sử dụng typedef và struct.
Khai báo được các biến có kiểu struct và array
Ghi và đọc dữ liệu cho các thành phần của struct
Ghi và đọc dữ liệu cho mảng
Sử dụng struct và mảng để giải quyết một phần hoặc toàn bộ bài toán thực
tế.
Thực hiện các bài toán trên chuỗi
Định nghĩa được kiểu dữ liệu mới sử dụng typedef và struct.
Khai báo được các biến có kiểu struct và array
Ghi và đọc dữ liệu cho các thành phần của struct
Ghi và đọc dữ liệu cho mảng
Sử dụng struct và mảng để giải quyết một phần hoặc toàn bộ bài toán thực
tế.
Thực hiện các bài toán trên chuỗi
Bạn đang xem tài liệu "Bài tập Kỹ thuật lập trình - Lab 5 – Sử dụng mảng, chuỗi và cấu trúc - Khoa Khoa học và Kỹ thuật máy tính - Đại học BK - ĐHQG TP Hồ Chí Minh", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.
File đính kèm:
- bai_tap_ky_thuat_lap_trinh_lab_5_su_dung_mang_chuoi_va_cau_t.pdf
Nội dung text: Bài tập Kỹ thuật lập trình - Lab 5 – Sử dụng mảng, chuỗi và cấu trúc - Khoa Khoa học và Kỹ thuật máy tính - Đại học BK - ĐHQG TP Hồ Chí Minh
- TRƯỜNG ĐẠI HỌC BÁCH KHOA – ĐHQG TPHCM Khoa Khoa học và Kỹ thuật Máy tính Hướng dẫn: Sinh viên có thể tham khảo ví dụ sau về khai báo kiểu dữ liệu mới Máy tính với 2 thông tin: tên (chuỗi) và cân nặng (số thực): typedef struct { string name; float resolution[2]; } computer; Kiểu dữ liệu mới của chúng ta được định nghĩa dựa trên struct, nên cách khởi tạo sẽ giống struct: Cách 1 (hợp lệ trong C): computer com = { .name = "ASUS", .resolution = { 1366, 768 }, }; Hoặc nếu ta chỉ muốn khởi tạo giá trị cho trường thông tin “resolution” (không thể khởi tạo theo cách này trong C++): computer com = { .resolution = { 1366, 768 }, }; Cách 2 (hợp lệ trong C++): computer com = { "ASUS", { 1366, 768 }, }; Sinh viên có thể thử bằng cách dùng trình biên dịch online như CodeChef để thử các trường hợp: C (Gcc-4.9.2) C++ 4.9.2 (Gcc-4.9.2) C++ 14 (G++-4.9.2) Cách gán cấu trúc tương tự như gán giá trị vào biến thông thường: com2 = com; com_array[10] = com; 2
- TRƯỜNG ĐẠI HỌC BÁCH KHOA – ĐHQG TPHCM Khoa Khoa học và Kỹ thuật Máy tính Tính và in ra: Chiều dài của mỗi vector. Ví dụ: vetor a = [a1 a2 a3 a4] trong không gian 4 chiều có chiều dài là: sqrt(a1*a1 + a2*a2 + a3*a3 + a4*a4) Tính và in ra tích vô hướng và tích hữu hướng (chỉ tính tích hữu hướng cho trường hợp 3 chiều) giữa hai vector. T T Cho biết: Nếu có 2 vector a và b: a=[a1, a2, a3] và b=[b1, b2, b3] , tích vô hướng và hữu hướng của a và b được tính như sau. ab a1 b 1 a 2 b 2 a 3 b 3 a a a a aa a b 2 3 i 1 3 j 12 k b2 b 3 b 1 b 3 bb12 Tính và in ra góc tạo bởi hai vector. Tính và in ra độ dài của hình chiếu vector a trên vector b và ngược lại Hai câu cuối sử dụng công thức a.b = |a| * |b| * cos(alpha). alpha là góc tạo bởi hai vector a và b. alpha = acos(a.b)/( |a| |b|). Độ dài hình chiếu a trên b là: a.b/|b| Yêu cầu cụ thể: Sinh viên phải sử dụng macro cho hằng số 50 nói trên Sinh viên phải định nghĩa một cấu trúc vector. Hãy tự xác định cần phải lưu trữ gì cho một vector. Hướng dẫn: a) Dữ liệu: - Có thể định nghĩa một struc VECTOR có các phần tử như sau: value, dimension. Sinh viên xác định kiểu các phần tử cho phù hợp và thực hiện việc đặt tên biến sao cho gợi nhớ. - Define các hằng số MAX_DIMENSION phục vụ cho việc nhập các phần tử từ input và PI, DEG dùng cho việc chuyển đổi góc từ radian sang độ. - Khai báo các biến sử dụng cho đọc file input: o string str; o istringstream iss; - Khai báo các biến liên quan đến tính toán vector: o double sum_square, scalar_p, angle b) Giải thuật: 4
- TRƯỜNG ĐẠI HỌC BÁCH KHOA – ĐHQG TPHCM Khoa Khoa học và Kỹ thuật Máy tính Tính tổng các số trong mảng, sau đó tính trung bình bằng cách chia cho số phần tử hợp lệ có trong mảng (N right. Câu 4: a) Khai báo một cấu trúc có thể lưu giữ một điểm trong không gian 2 chiều. b) Khai báo một mảng có thể lưu giữ danh sách toạ độ các đỉnh của một đa giác có tối đa MAX_VERT đỉnh. MAX_VERT là hằng số định nghĩa bởi #define c) Viết chương trình cho phép người dùng nhập vào N là số đỉnh. 2 < N <= MAX_VERT. Nếu nhập không đúng thì yêu cầu nhập lại cho đến khi nhập đúng d) Sinh ra ngẫu nhiên toạ độ của N đỉnh nói trên. Các toạ độ phải nằm trong khoảng -100 đến 100. e) Giả sử, các toạ độ sinh ngẫu nhiên ở trên đã hình thành một đa giác. Tính và in ra chu vi của đa giác. 6
- TRƯỜNG ĐẠI HỌC BÁCH KHOA – ĐHQG TPHCM Khoa Khoa học và Kỹ thuật Máy tính Có N hàng dữ liệu. N từ 3 đến 100. Mỗi hàng có chứa M con số. M từ 2 đến 100 a. Viết chương trình nhập vector X và ma trận W từ tập tin đầu vào. Ở đó, X là cột dữ liệu đầu tiên của ma trận trong tập tin đầu vào. W là ma trận từ chứa M hàng mà (M-1) cột dữ liệu còn lại. b. Tính tích của X*W và in ra kết quả. Lưu ý: sử dụng macro cho các hằng số nói trên. Tự nhập tập in và kiểm tra kết quả. Hướng dẫn: a) Dữ liệu: Chúng ta cần dùng cấu trúc phù hợp để lưu các thông tin về Vector X, ma trận W. Chú ý về kích thước dữ liệu cần tạo sao cho có thể chứa được ma trận cũng như vector trong trường hợp M, N ở mức cao nhất. b) Giải thuật: - Để đọc file ta sẽ sử dụng kỹ thuật chuyển hướng nhập xuất để định hướng nội dùng file nào std::stdin và đọc bình thường như khi nhập từ màn hình. Ta nên đọc dòng đầu tiên trước để xác định được số cột của mỗi dòng. Đối với các hàng tiếp theo dùng hàm getline kết hợp vòng lặp để đọc từng dòng của file input. Trong mỗi vòng lặp ta sử dụng stringstream và một vòng lặp để bắt đầu đọc từng số trong một dòng và gán vào cấu trúc đã tạo trước đó, vòng lặp sẽ kết thúc khi dòng đã hết (dùng stringstream::eof để kiểm tra). Trong lúc đọc, kiểm tra số cột dữ liệu của mỗi dòng có khớp với hàng đầu tiên không, nếu không thì báo lỗi và thoát chương trình. - Sau khi dữ liệu đã được đọc lên và lưu lại, ta sẽ biết được chính xác kích thước của vector và ma trận. từ đây ta sẽ biết được kích thước của kết quả phép nhân vector-ma trận X*W. Tích của vector và ma trận sẽ cho ra một vector K, trong đó giá trị của một phần tử ở vị trí i (K[i]) sẽ được tính bằng công thức sau - 퐾[푖] = ∑푗=1 [푗] ∗ 푊[푖][푗]. Để tính giá trị này ta có thể dùng vòng lặp để cộng dồn các giá trị với nhau. Sinh viên có thể nhìn ví dụ sau cho dễ hình dung. 1 4 7 1 ∗ 1 + 2 ∗ 2 + 3 ∗ 3 14 (1 2 3) × (2 5 8) = (1 ∗ 4 + 2 ∗ 5 + 3 ∗ 6) = (32) 3 6 9 1 ∗ 7 + 2 ∗ 8 + 3 ∗ 9 50 8
- TRƯỜNG ĐẠI HỌC BÁCH KHOA – ĐHQG TPHCM Khoa Khoa học và Kỹ thuật Máy tính - Lặp lại bước 3 và 4 cho đến khi kết thúc chuỗi. Ví dụ: “ Lap trinh C++ “ -> “Lap trinh C++ “ -> “Lap trinh C++ “ -> “Lap trinh C++ “ -> “Lap trinh C++“ Câu 8: Viết chương trình nhập vào một chuỗi. Đảo các từ trong chuỗi. In ra chuỗi ban đầu và chuỗi đã thay đổi. Hướng dẫn: a) Dữ liệu: Chương trình phải có các biến (ô nhớ) để chứa các kiểu dữ liệu: - Biến chứa chuỗi nhập vào từ bàn phím: khai báo mảng kí tự b) Giải thuật: - Dùng macro tiền xử lý #define để chỉ rõ kích thước bộ đệm lưu chuỗi kí tự nhập vào từ bàn phím. - Dùng hàm cin.getline để lấy chuỗi kí tự nhập từ bàn phím (không dùng hàm cin vì cin không lấy được kí tự khoảng trắng từ bàn phím). - Đảo ngược toàn bộ kí tự trong chuỗi Ví dụ: “diep thanh dang” -> “gnad hnaht peid” - Đảo ngược các kí tự trong từng từ trong chuỗi Ví dụ: “gnad hnaht peid” -> “dang thanh diep” 10