Bài tập Kỹ thuật lập trình - Lab 7: Con trỏ - 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
 Hiểu được bản chất hai ô nhớ độc lập của con trỏ
 Khai báo được biến con trỏ đến kiểu dữ liệu cơ bản, đến struct và đến con
trỏ khác.
 Truy xuất vùng nhớ qua con trỏ
 Hiểu và sử dụng được toán tử: *, & và ->
 Sử dụng bộ nhớ cấp phát động 
pdf 10 trang xuanthi 27/12/2022 4700
Bạn đang xem tài liệu "Bài tập Kỹ thuật lập trình - Lab 7: Con trỏ - 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:

  • pdfbai_tap_ky_thuat_lap_trinh_lab_7_con_tro_khoa_khoa_hoc_va_ky.pdf

Nội dung text: Bài tập Kỹ thuật lập trình - Lab 7: Con trỏ - Khoa Khoa học và Kỹ thuật máy tính - Đại học BK - ĐHQG TP Hồ Chí Minh

  1. TRƯỜNG ĐẠI HỌC BÁCH KHOA – ĐHQG TPHCM Khoa Khoa học và Kỹ thuật Máy tính Câu 3: Viết chương trình theo các bước a) Khai báo biến n khởi động bằng 100. b) Khai báo ba biến con trỏ ptr1, ptr2, ptr3 có kiểu là con trỏ đến số nguyên: int* c) Thực hiện 3 phép gán:  Địa chỉ biến n gán cho ptr1  Địa chỉ biến n gán cho ptr2  ptr1 gán vào ptr3 d) In ra giá trị sau trên các hàng  n, dùng “%d”  *ptr1, dùng “%d”  *ptr2, dùng “%d”  *ptr3, dùng “%d”  &n, dùng “%p”  &ptr1, dùng “%p”  &ptr2, dùng “%p”  &ptr3, dùng “%p” e) Biên dịch, chạy và thảo luận kết quả Câu 4: Viết chương trình theo các bước a) Khai báo một mảng số nguyên có 10 phần tử tối đa và khởi động 5 phần tử đầu tiên là: 10, 20, 30, 40, 50. Tên mảng là arr. b) Khai báo một con trỏ đến số nguyên: int*; tên con trỏ là ptr. c) Thực hiện một trong các phép gán: (thử nghiệm lần lượt)  ptr = arr;  ptr = &arr[0];  ptr = &arr[2]; d) In ra các giá trị sau trên màn hình, các dòng khác nhau:  ptr[0]  ptr[1]  ptr[2] Câu 5: Viết chương trình theo các bước 2
  2. TRƯỜNG ĐẠI HỌC BÁCH KHOA – ĐHQG TPHCM Khoa Khoa học và Kỹ thuật Máy tính ptr1 = vector_1; ptr1 = &vector_1[0]; Tương tự với con trỏ ptr2. Để sử dụng một con trỏ đã được gán đến địa chỉ của một mảng để truy xuất các phần tử trong mảng có 2 cách: Xem biến con trỏ như biến array, truy cập các phần tử thông phép lấy chỉ mục: ptr1[0], ptr1[1], Di chuyển con trỏ từ phần tử thứ nhất sang phần tử thứ hai, và tương tự với phần còn lại của mảng, với mỗi lần như vậy dùng phép dereference (*) để lấy giá trị của mảng. ptr1 = vector_1 => *ptr1 == vector_1[0]; ptr1++ => *ptr1 == vector_1[1]; Sử dụng biến con trỏ như địa chỉ nền, dùng phép toán cộng và chỉ mục i để tính ra địa chỉ thật của phần tử i trong mảng cần truy xuất. *(ptr1+0) == vector_1[0], *(ptr1+1) == vector_1[1], *(ptr1+i) == vector_1[i]; Sau khi đã truy cập được mảng đối với các vấn đề tính chiều dài và tích vô hướng, sử dụng kĩ thuật lặp cộng dồn giá trị để giải quyết. Câu 2: a) Khai báo một biến N nguyên dương. N cho biết chiều dài vector b) Nhập giá trị N c) Tạo mới hai mảng động, theo hướng dẫn: double *vector_1 = (double*) malloc(N*sizeof(double)); double *vector_2 = (double*) malloc(N*sizeof(double)); hoặc double *vector_1 = new double[N]; double *vector_2 = new double[N]; d) Sinh ngẫu nhiên các giá trị cho các vector, phạm vi dữ liệu: -10, đến 10 e) Tính chiều dài của hai vector và tích vô hướng giữa chúng  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ích vô hướng giữa hai vector. Ví dụ: vector a = [a1 a2 a3 a4] và b=[ b1 b2 b3 b4]. Tích vô hướng là: a1*b1 + a2*b2 + a3*b3 + a4*b4 4
  3. TRƯỜNG ĐẠI HỌC BÁCH KHOA – ĐHQG TPHCM Khoa Khoa học và Kỹ thuật Máy tính b) Cách 2: Không sử dụng mảng tĩnh. Sử dụng con trỏ. Xin cấp bộ nhớ động. Truy xuất dữ liệu qua con trỏ thay cho sử dụng mảng tĩnh. Hướng dẫn: Như đã biết một con trỏ thông thường có thể dùng để trỏ đến một mảng một chiều. Vậy để xin cấp phát động một ma trận vuông, ta có thể sử dụng con trỏ 2 chiều, tức là con trỏ trỏ đến một mảng các con trỏ thông thường (con trỏ 1 chiều), và mỗi con trỏ 1 chiều đó sẽ biểu diễn một hàng của ma trận. Ví dụ cấp phát ma trận 2x3: int a = new int*[2]; a[0] = new int[3]; a[1] = new int[3]; Khi thu xóa vùng nhớ, chú ý thứ tự xóa sẽ ngược lại so với thứ tự tạo. Ví dụ xóa vùng nhớ cấp phát ở trên: delete[] a[0]; delete[] a[1]; delete[] a; Chú ý nhớ gán các biến con trỏ trỏ đến vùng nhớ đã xóa bằng giá trị NULL sau khi xóa xong. Câu 4: Viết chương trình cho phép: a) Nhập vào một dãy số thực không âm và lưu các số này vào mảng 1 chiều. Việc nhập chỉ kết thúc khi người dùng nhập bất kỳ số âm nào hoặc số lượng phần tử đọc vào đã là MAX_SIZE. Với MAX_SIZE là số nguyên dương được định nghĩa bởi chỉ thị #define b) Tính và in ra: trung bình cộng và độ lệch chuẩn của dãy số đã nhập ở trên. Giả sử, mảng đã nhập có N phần tử, độ lệch chuẩn được tính theo công thức sau: c) Đảo (không dùng mảng tạm) và in ra dãy số nói trên: Hướng dẫn:  Câu a) và b) áp dụng kỹ thuật điểm danh như Câu 1.  Câu c) o Gọi l và r là hai chỉ số, chỉ vào phần tử đầu và cuối của mảng. 6
  4. TRƯỜNG ĐẠI HỌC BÁCH KHOA – ĐHQG TPHCM Khoa Khoa học và Kỹ thuật Máy tính Câu 6: a) Khai báo một ma trận vuông có kích thước tối đa là 100x100. Định nghĩa một hằng có giá trị bằng 100 và sử dụng nó thay cho trực tiếp dùng 100 trong dòng khai báo b) Nhập N là chiều kích thước thực tiễn của ma trận, phải kiểm tra khi nhập quan hệ: 1 <= N <= 100 c) Sinh ngẫu nhiên các số cho ma trận, phạm vi các số là -40 đến 50 d) Đảo các phần tử trên đường chéo chính của ma trận. e) In ra ma trận trước và sau khi đảo phần tử 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 số hàng (cột) của ma trận vuông (kiểu short) - Biến chứa địa chỉ của ma trận (kiểu con trỏ 2 chiều) b) Giải thuật: - Dùng macro tiền xử lý #define để chỉ rõ kích thước tối đa của ma trận hợp lệ. - Nhập kích thước của ma trận từ bàn phím, kiểm tra xem nó có hợp lệ không. Nếu không hợp lệ yêu cầu nhập lại - Dùng cơ chế cấp phát động bộ nhớ để khởi tạo ma trận - Dùng các hàm thư viện srand, rand, time để tạo số ngẫu nhiên và gán giá trị cho từng phần tử của ma trận - In ma trận - Đảo giá trị các phần tử trên đường chéo chính của ma trận - In ma trận kết quả Câu 7: Viết chương trình cho phép: a) Nhập vào một ma trận vuông có kích thước N. N là hằng số định nghĩa bởi #define. Nhập vào vector N chiều b) Tính vector kết quả của phép nhân R = M x V. M và V là ma trận và vector nói trên c) In ra M, V, và R Hướng dẫn: 8
  5. TRƯỜNG ĐẠI HỌC BÁCH KHOA – ĐHQG TPHCM Khoa Khoa học và Kỹ thuật Máy tính Khai báo và cấp phát động cho các ma trận A, B và ma trận kết quả C sử dụng con trỏ 2 chiều như hướng dẫn ở các bài tập trước Tiến hành nhân ma trận như đã thực hành ở lab trước Giải phóng bộ nhớ con trỏ lưu ma trận A, B và C trước khi kết thúc chương trình 10