lOMoARcPSD| 58605085
CHƯƠNG 2: C/C++ CƠ BẢN
CÂU HỎI TRẮC NGHIỆM
Câu 1: Trong ngôn ngữ C, biến dùng để lưu trữ gì?
a) Hàm b) Toán tử
c) Dữ liệu d) Câu lệnh.
Câu 2: Kiểu dữ liệu int trong C được sử dụng để lưu trữ:
a) Số nguyên b) Số thực
c) Chuỗi kí tự d) Số phức.
Câu 3: Toán tử ++ được sử dụng để thực hiện:
a) Phép cộng b) Phép trừ
c) Phép tăng giá trị biến lên 1 đơn vị d) Phép giảm giá trị biến đi 1 đơn vị Câu
4: Trong C, kiểu dữ liệu nào được sử dụng để lưu trữ các giá trị logic (đúng/sai)?
a) int b) char
c) bool d) float
Câu 5: Trong C, toán tử ++i và i++ hoạt động theo cách nào khác nhau?
a) ++i tăng giá trị của i trước khi sử dụng, i++ tăng giá trị sau khi sử dụng.
b) ++i tăng giá trị sau khi sử dụng, i++ tăng giá trị trước khi sử dụng.
c) Cả hai hoạt động giống nhau.
d) Không có sự khác biệt nào giữa chúng..
Câu 6: Cho 3 biến số nguyên (int) a = 5, b = 4, c = 3,hãy cho biết giá trị của biểu thức: (a*++b)/c
a. 0. b. 1.
c. 2. d. Tất cả đều sai
Câu 7: Cho 3 biến số nguyên a = 5, b = 2, c = 3, kết quả: (a>5)&&(c<2)&&(++b ==2)là:
a. Đúng/True. b. Sai/False
Câu 8: Cho biến a được khai báo như sau: bool a; Trong
các câu lệnh sau, câu lệnh nào là ĐÚNG:
a. a = 0; b. a = true;
c. a = 1; d. Tất cả đều đúng
lOMoARcPSD| 58605085
Câu 9: Cho biến a được khai báo như sau: char a; Trong
các câu lệnh sau, câu lệnh nào là SAI:
a. a = 'b'; b. a = "B";
c. a = 49; d. a = ' ';
Câu 10: Trong các câu lệnh sau, câu lệnh nào là ĐÚNG:
a. int x = y = z = 10; b. int x = 10, y = 10, z = 10;
c. int x = 10,int y = 10, int z = 10; d. Tất cả đều đúng
Câu 11: Hãy chọn câu lệnh đúng để tính giá trị của hàm mũ e^x và lưu vào biến result:
a) result = exp(x); b) result = pow(x, e);
c) result = log(x); d) result = sqrt(x);
Câu 12: Trong ngôn ngữ C, dấu {} được sử dụng để làm gì?
a) Đánh dấu các điều kiện đúng và sai. b) Đánh dấu khối lệnh hoặc nhóm lệnh.
c) Đánh dấu kết thúc một vòng lặp. d) Bắt buộc sử dụng trong mọi câu lệnh if.
Câu 13: Câu lệnh nào trong C được sử dụng để thoát khỏi một vòng lặp sớm hơn dự kiến?
a. return b. next
c. continue d. break
Câu 14: Câu lệnh continue trong một vòng lặp được sử dụng để làm gì? a)
Kết thúc vòng lặp hiện tại và tiếp tục vòng lặp ngoài.
b) Thực hiện một lệnh hoặc khối lệnh nếu điều kiện đúng.
c) Lặp lại vòng lặp hiện tại từ đầu.
d) Tạo một lặp vô hạn.
Đoạn chương trình sau dùng cho 2 câu dưới:
int i=0,x=0,n=0;
for (i = 0;i<3;i++)
{ for (x = 2;
x>=0; x--)
{ n++;
printf("%d",i++);
}
}
Câu 15: Cho biết giá trị của n sau khi kết thúc đoạn chương trình trên:
a. 3. b. 4.
lOMoARcPSD| 58605085
c. 5. d. 6.
Câu 16: Kết quả xuất ra màn hình sau khi chạy đoạn chương trình trên là:
a. 01 b. 12
c. 012 d. 0123
Đoạn chương trình sau dùng cho 2 câu dưới:
int i = 5, n = 0;
do {
n++; if (i%2
== 1)
i--;
else
} while (i>0);
printf("%d", --i);
Câu 17: Cho biết đoạn lệnh trong vòng lặp do-while được lặp lại mấy lần:
a. 3 b. 4
c. 5 d. 6
Câu 18: Kết quả xuất ra màn hình sau khi chạy đoạn chương trình trên là:
a. 135 b. 531
c. 31 d. Tất cả đều SAI.
Đoạn chương trình sau dùng cho 2 câu dưới:
int i=0,x=2,n=0;
while (i<3)
{ while
(x>=0)
{ n = n +
1;
printf("%d_",x);
x = x - 1;
}
i = i + 1;
}
Câu 19: Cho biết giá trị của n sau khi kết thúc đoạn chương trình trên:
a. 3. b. 4.
c. 5. d. Tất cả đều sai.
Câu 20: Kết quả xuất ra màn hình sau khi chạy đoạn chương trình trên là:
a. 0 _1_ b. 1_2_
c. 0 _1_ 2_ d. Tất cả đều sai.
lOMoARcPSD| 58605085
Đoạn chương trình sau dùng cho 2 câu dưới:
int num = 12345,reversed = 0, n = 0,digit;
while (num != 0)
{ n++; digit = num %
10; reversed = reversed +
digit; num /= 10;
}
Câu 21: Cho biết giá trị của reversed sau khi chạy đoạn chương trình trên:
a. 2. b. 3.
c. 4. d. Tất cả đều sai.
Câu 22: Cho biết giá trị của n sau khi chạy đoạn chương trình trên:
a. 2 b. 3
c. 4 d. Tất cả đều sai.
Đoạn chương trình sau dùng cho 2 câu dưới:
int f(int a, int b)
{ if(a>b) return a - b;
else return b - a;
}
void main()
{ int x = 5, y = 3;
x = f(x,y); y = f(y,x);
int n = f(x,y) + f(y,x);
}
Câu 23: Giá trị của x và y sau khi kết thúc đoạn chương trình trên là:
a. x = 5, y = 5 b. x = 2, y = 1
c. x = 1, y = 2 d. Tất cả đều sai.
Câu 24: Giá trị của biến n sau khi kết thúc đoạn chương trình trên là:
a. 0. b. 1.
c. 2. d. Tất cả đều sai.
lOMoARcPSD| 58605085
Đoạn chương trình sau dùng cho 2 câu dưới:
int f(int a)
{ if( a==1) return 1; if(a%2
== 0) return f(a-1)*2; else
return (f(a-1) + 1);
}
void main()
{ int x =
f(3); int y
= f(4);
}
Câu 25: Giá trị của x sau khi kết thúc đoạn chương trình trên là:
a. 3 b. 4
c. 5 d. Tất cả đều sai.
Câu 26: Giá trị của biến y sau khi kết thúc đoạn chương trình trên là:
a. 0. b. 1.
c. 2. d. Tất cả đều sai.
BÀI TẬP THỰC HÀNH
Bài 1:
Viết chương trình cho phép người sử dụng nhập vào giá trị điện dung C, điện cảm L (số thực).
Tính và in ra tần số cộng hưởng F
ch
của mạch L,C nối tiếp. Cho biết:
1
𝐹
𝑐
Bài 2 :
Viết chương trình tính tiền cước taxi với bảng giá như sau :
2 km đầu tiên : 20.000 đ.
8 km tiếp theo : 7.000đ/km.
10 km tiếp theo : 5.000đ/km. Từ km thứ 21 : 3.000đ/km.
Dựa trên các thông số trên, viết chương trình có các chức năng sau :
Cho phép người sử dụng nhập vào số km đi được (số nguyên).
Tính tiền cước taxi dựa vào bảng giá trên, in kết quả sau khi tính toán ra màn hình.
lOMoARcPSD| 58605085
Bài 3:
Viết chương trình cho phép người sử dụng nhập vào 1 giá trị số nguyên a. Tìm in ra tất cả
các giá trị ước số của a.
Bài 4:
Viết chương trình cho phép người sử dụng nhập vào 2 giá trị số nguyên a b. Tìm bội số
chung nhỏ nhất (BSCNN) và ước số chung lớn nhất (USCLN) của a và b và in ra màn hình.
Bài 5:
Viết chương trình cho phép người sử dụng nhập vào một giá trị số nguyên a. Kiểm tra a phải
là số nguyên tố hay không? In kết luận ra màn hình.
Bài 6:
Viết chương trình cho phép người sử dụng nhập vào một giá trị số nguyên N. In ra màn hình
tất cả số nguyên tố nằm trong khoảng [0,N].
Bài 7:
Viết câu lệnh định nghĩa hàm int SumDigit (int x) chức năng tính tổng giá trị các chữ số
của một số nguyên.
Bài 8 :
Viết câu lệnh định nghĩa hàm bool IsPrime (int x) có chức năng kiểm tra một giá trị số nguyên
có phải là một số nguyên tố hay không.
Bài 9:
Viết câu lệnh định nghĩa hàm int Factorial (int x) chức năng tính giai thừa của một số
nguyên theo nguyên lý đệ quy.
Bài 10: Viết câu lệnh định nghĩa hàm void PascalTriangle (int n) chức năng in ra màn hình
hệ số của tam giác pascal bậc từ 0 đến n.
CHƯƠNG 3: CẤU TRÚC DỮ LIỆU CƠ BẢN – MẢNG (ARRAY)
CÂU HỎI TRẮC NGHIỆM
Câu 1: Trong ngôn ngữ lập trình C, mảng là gì?
a. Một tập hợp chứa nhiều giá trị b. Một loại dữ liệu số nguyên
c. Một chuỗi ký tự d. Một hàm số
Câu 2: Trong C, các phần tử của mảng có thể chứa các kiểu dữ liệu khác nhau.
a. Đúng b. Sai
lOMoARcPSD| 58605085
Câu 3: Trong các câu lệnh sau khai báo mảng M sau, câu lệnh nào là ĐÚNG:
a. int [5][3] M; b. int M[][] ;
c. int M[5][3]; d. Không có câu lệnh nào ĐÚNG;
Câu 4: Trong ngôn ngữ lập trình C, vị trí (index) phần tử cuối cùng của mảng là bao nhiêu?
a. -1 b. 0
c. 1 d. N-1 (với N là số phần tử của mảng)
Câu 5: Cách nào sau đây được sử dụng để truy xuất vào phần tử thứ 4 của mảng myArray?
a. myArray[4]; b. myArray(4);
c. get(myArray, 4); d. myArray.get(4);
Câu 6: Câu lệnh nào sau đây để tạo một mảng số nguyên kích thước 10 với phần tử đầu tiên
trong mảng có giá trị bằng 1 trong C?
a. int arr[10] = {0}; b. int arr[10] = {1};
c. int arr[10] = {}; d. Không có câu lệnh nào ĐÚNG;
Câu 7: Con trỏ trong C là gì?
a. Biến chứa một giá trị b. Biến chứa địa chỉ của một biến khác
c. Biến chứa một hàm d. Biến chứa một số nguyên
Câu 8: Để khai báo một con trỏ kiểu integer trong C, bạn sử dụng cú pháp nào sau đây?
a. int pointer; b. integer* pointer;
c. int* pointer; d. pointer int;
Câu 9: Để lấy địa chỉ của một biến trong C và gán cho một con trỏ, bạn sử dụng toán tử nào?
a. * b. &
c. -> d. .
Câu 10: Khi một con trỏ được khai báo, nó sẽ trỏ đến?
a. Giá trị ngẫu nhiên b. Giá trị 0
c. Không trỏ đến đâu cả d. Đến địa chỉ của biến null
Câu 11: Để giải phóng bộ nhớ được cấp phát cho một con trỏ, bạn sử dụng hàm nào?
a. free() b. malloc()
c. allocate() d. deallocate()
Câu 12:
Cho đoạn chương trình như sau:
lOMoARcPSD| 58605085
int x = 5,y = 3;
int *a = &x, *b = &y;
int c = *x + *y;
Cho biết giá trị của c sau khi kết thúc đoạn chương trình trên
a. 3. b. 4.
c. 5. d. Tất cả đều sai.
Câu 13:
Cho đoạn chương trình như sau:
int x = 5,y = 3;
int *a = &x, *b = &y;
*a = *b; int c = x + y;
Cho biết giá trị của c sau khi kết thúc đoạn chương trình trên
a. 4. b. 5.
c. 6. d. Tất cả đều sai.
Đoạn chương trình sau dùng cho 2 câu dưới:
int M[3] = {-1,9,6};
int S = 0;
for (int i = 2;i>=0;i--)
{ if (M[i]%2 == 1) S = S +
M[i]; else S = S -
M[i]; printf("%d ",S);
}
Câu 14: Cho biết giá trị của S sau khi chạy đoạn chương trình trên: :
a. 4. b. 5.
c. 7. d. 9.
Câu 15: Cho biết kết quả in ra màn hình sau khi chạy đoạn chương trình trên:
a. 6 3 4 b. 6 4 3
c. 3 4 6 d. Tất cả đều sai.
Đoạn chương trình sau dùng các câu dưới:
lOMoARcPSD| 58605085
int M[3][3] = {{-1,4,2},{4,2,7},{1,5,4}};
for (int i = 2;i>=0;i--)
{ for (int j =
2;j>=0;j--)
{ if (M[i][j]>M[j][i])
M[i][j] = M[j][i];
} printf("%d
",M[i][i]);
}
Câu 16: Cho biết giá trị của phần tử M[1][1] sau khi chạy đoạn chương trình trên:
a. -1 b. 1
c. 2 d. 4
Câu 17: Cho biết giá trị của phần tử M[2][0] sau khi chạy đoạn chương trình trên:
a. -1 b. 1
c. 4 d. 5
Câu 18: Cho biết kết quả in ra màn hình sau khi chạy đoạn chương trình trên:
a. 4 2 b. 4 2 -1
c. 5 4 2 -1 d. Tất cả đều sai.
Đoạn chương trình sau dùng các câu dưới:
int M[3][3] =
{{2,5,2},{1,6,7},{1,5,4}}; int a =
M[0][0]; for (int i = 0;i<3;i++)
{
for (int j = 0;j<3;j++)
{
if (M[i][j]>a)
{
M[i][j] = a;
a = M[i][j];
}
}
printf("%d ",M[i][i]);
}
Câu 19: Cho biết giá trị của phần tử M[1][2] sau khi chạy đoạn chương trình trên:
a. 6. b. 1.
c. 4. d. 2.
Câu 20: Cho biết giá trị của phần tử M[2][1] sau khi chạy đoạn chương trình trên:
a. 2. b. 1.
c. 4. d. 5.
lOMoARcPSD| 58605085
Câu 21: Cho biết kết quả in ra màn hình sau khi chạy đoạn chương trình trên:
a. 4 2 2. b. 2 2 2.
c. 5 4 2 2. d. Tất cả đều sai
Đoạn chương trình sau dùng các câu dưới:
int M[5] = {-1,3,2,4,7};
for (int i = 0;i<4;i++)
{ if (M[i]>M[i+1]) M[i] =
M[i+1];
else printf("%d",M[i]);
}
Câu 22: Cho biết giá trị của phần tử M[2] sau khi chạy đoạn chương trình trên:
a. -1. b. 3.
c. 2. d. 4.
Câu 23: Cho biết giá trị của phần tử M[4] sau khi chạy đoạn chương trình trên:
a. 2. b. 3.
c. 4. d. 7.
Câu 24: Cho biết kết quả in ra màn hình sau khi chạy đoạn chương trình trên:
a. -124 b. -12
c. -13 d. Tất cả đều sai.
Đoạn chương trình sau dùng các câu dưới:
int tong = 0, tich = 1; int
M[2][2] = {{-1,4},{2,5}};
for (int i = 0;i<2;i++)
{ for (int j =
0;j<2;j++)
{
if (i > j) tong = tong + M[i][j];
else tich = tich * M[i][j];
} printf("%d
", tong);
}
Câu 25: Cho biết giá trị của biến tong sau khi chạy đoạn chương trình trên:
a. 1. b. 2.
c. 3. d. Tất cả đều sai.
Câu 26: Cho biết giá trị của biến tich sau khi chạy đoạn chương trình trên:
a. -4. b. -2.
lOMoARcPSD| 58605085
c. -10. d. Tất cả đều sai.
Câu 27: Cho biết kết quả in ra màn hình sau khi chạy đoạn chương trình trên:
a. 0 2. b. 0 3.
c. 1 6. d. Tất cả đều sai.
BÀI TẬP THỰC HÀNH
Bài 1:
Viết chương trình tạo một mảng số nguyên 1 chiều 10 phần tử, cho phép người sử dụng nhập
vào các giá trị cho mảng. Hiển thị mảng sau khi nhập ra màn hình. Bài 2:
Viết chương trình tạo một mảng số nguyên 2 chiều 3x3 (3 hàng, 3 cột), cho phép người sử dụng
nhập vào các giá trị cho mảng. Hiển thị mảng ra màn hình theo đúng hàng-cột. Bài 3:
Tạo sẵn một dữ liệu (mảng M: 1 chiều số nguyên 20 phần tử) các giá trị ngẫu nhiên. Hiển
thị mảng ban đầu ra màn hình.
Thực hiện lọc trung bình x3 theo công thức sau:
M[i] = (M[i-1] + M[i] + M[i+1])/3
M[0] = (M[0] + M[1])/2
M[20] = (M[20]+ M[19])/2 Xuất giá
trị của dữ liệu sau khi lọc ra màn hình.
Bài 4:
Viết chương trình tạo một mảng số nguyên 1 chiều 10 phần tử với các giá trị cho trước. Cho
phép nhập giá trị x, tìm in vị trí phần tử của mảng giá trị bằng x (Nếu mảng không
phần tử bằng với x thì in giá trị “Not found”).
Bài 5 :
Viết chương trình tạo một mảng số nguyên 1 chiều 100 phần tử với các giá trị ngẫu nhiên. In
ra màn hình tất cả các giá trị phần tử duy nhất trong mảng (phần tử duy nhất phần tử
giá trị không trùng với bất kì phần tử nào khác trong mảng). Bài 6:
Viết chương trình tạo một mảng số nguyên 1 chiều 100 phần tử với các giá trị ngẫu nhiên. Cho
phép nhập giá trị x, in ra màn hình tất cả các tổ hợp 3 giá trị phần tử có tổng bằng x. Bài 7:
lOMoARcPSD| 58605085
Viết câu lệnh định nghĩa hàm int Max (int A[], int size) chức năng tìm giá trị phần tử lớn
nhất trong mảng.
Bài 8 :
Viết câu lệnh định nghĩa hàm int Find (int A[], int size, int x) có chức năng tính tìm vị trí của
phần tử có giá trị bằng x (trả về -1 nếu không thấy giá trị phù hợp).
Bài 9:
Viết câu lệnh định nghĩa hàm void Insert (int A[], int size, int x, int n)chức năng chèn thêm
giá trị x vào vị trí n trong mảng.
Bài 10:
Viết câu lệnh định nghĩa hàm void Delete (int A[], int size, int n)chức năng xóa phần tử tại
vị trí n trong mảng.
CHƯƠNG 3: CẤU TRÚC DỮ LIỆU CƠ BẢN – DANH SÁCH LIÊN
KẾT (LINKED LIST)
CÂU HỎI TRẮC NGHIỆM
Câu 1: Trong linked list đơn (singly-linked list), mỗi node chứa những phần tử gì?
a) Giá trị dữ liệu b) Địa chỉ của node tiếp theo
c) Địa chỉ của node trước đó d) Tất cả đều đúng.
Câu 2: Trong linked list đôi (double-linked list), node cuối cùng thường có con trỏ trỏ đến đâu?
a) NULL b) Node đầu tiên
c) Địa chỉ của chính nó d) Tất cả đều sai
Câu 3: Loại linked list nào trong đó node cuối cùng sẽ trỏ đến node đầu tiên:
a) Singly linked list b) Double linked list
c) Circular linked list d) Tất cả đều sai.
Câu 4: Chèn một phần tử vào giữa một danh sách liên kết yêu cầu sửa đổi bao nhiêu con trỏ?
a) 1. b) 2.
c) 3. d) 4.
Câu 5: Chèn một phần tử vào cuối một danh sách liên kết yêu cầu sửa đổi bao nhiêu con trỏ?
a) 1. b) 2.
c) 3. d) 4.
lOMoARcPSD| 58605085
Câu 6: Trong trường hợp xóa node đầu tiên của linked list, chúng ta cần làm gì?
a) Giải phóng bộ nhớ của node đó. b) Đặt con trỏ của node tiếp theo là NULL
c) Cả a) và b). d) Tất cả đều sai.
Câu 7: Để xóa một node khỏi linked list, cần phải thực hiện?
a) Đặt con trỏ của node sau nó trỏ đến node trước nó
b) Đặt con trỏ của node trước nó trỏ đến node sau nó
c) Cả a) và b)
d) Tất cả đều sai.
Câu 8: Thao tác nào sau đây cần phải xét đến số lượng phần tử của linked list?
a) Xóa phần tử đầu tiên. b) Xóa phần tử cuối cùng.
c) Chèn phần tử mới vào vị trí đầu tiên. d) Tất cả đều sai.
Câu 9: Để chèn thêm node mới vào danh sách liên kết vòng, cần thay đổi giá trị của bao nhiêu
con trỏ (pointer):
a) 1. b) 2.
c) 3. d) 4.
Đoạn chương trình sau dùng cho các câu hỏi tiếp theo:
void display(struct node* start)
{ if(start == NULL) return; else
printf("%d ", start->data); display(start-
>next);
}
Câu 10: Cho biết kết quả in ra màn hình khi chạy đoạn code trên với danh sách liên kết đơn
chứa giá trị lần lượt 1->2->3->4:
a. 1 2 3 4 b. 1 3 1 3
c. 1 3 3 1 d. Tất cả đều sai.
Câu 11: Cho biết kết quả in ra màn hình khi chạy đoạn code trên với danh sách liên kết đơn
chứa giá trị lần lượt 1->2->3->4->5:
a. 1 2 3 4 5 b. 1 3 5 5 3 1
c. 1 3 5 1 3 5 d. Tất cả đều sai.
Đoạn chương trình sau dùng cho các câu hỏi tiếp theo:
lOMoARcPSD| 58605085
void insert(struct node* start,int value)
{ if(start == NULL)
return; if (start->value%2
== 0)
{ struct node* new_node = (struct node*)malloc(sizeof(struct
node)); new_node->value = value; new_node->next = start-
>next; start->next = new_node;
} else insert(start-
>next,value);
}
Câu 12: Cho biết kết quả của danh ch liên kết khi gọi hàm insert(head,10) với danh sách
liên kết đơn chứa giá trị lần lượt 1->2->3->4:
a. 1->2->10->3->4 b. 1->10->2->3->4
c. 1->2->3->10->4 d. Tất cả đều sai.
Câu 13: Cho biết kết quả của danh ch liên kết khi gọi hàm insert(head,10) với danh sách
liên kết đơn chứa giá trị lần lượt 2->4->6:
a. 2->4->6
c. 2->10->4->6
BÀI TẬP
THỰC HÀNH
Bài 1:
Viết chương trình tạo một danh sách liên kết đơn chứa các giá trị số nguyên. Cho phép người
sử dụng nhập vào giá trị (10 giá trị) cho danh sách liên kết. Hiển thị giá trị các phần tử của
danh sách ra màn hình.
Bài 2:
Viết chương trình tạo một danh sách liên kết đơn chứa 10 giá trị số nguyên (SV tự cho các giá
trị phần tử). Cho phép người sử dụng nhập vào 1 số nguyên x. Tìm và in ra vị trí phần tử
trong danh sách có giá trị bằng x. Bài 3:
Viết chương trình tạo một danh sách liên kết đơn chứa 10 giá trị số nguyên (SV tự cho các giá
trị phần tử). Cho phép người sử dụng nhập vào 1 số nguyên x. Tìm a tất cả các phần t
trong danh sách có giá trị bằng x. Bài 4:
lOMoARcPSD| 58605085
Viết câu lệnh định nghĩa hàm Append()chức năng thêm phần tử mới vào cuối 1 danh sách
liên kết đơn.
Bài 5:
Viết câu lệnh định nghĩa hàm Insert() chức năng thêm phần tử mới vào đầu 1 danh sách liên
kết đơn.
Bài 6:
Viết chương trình tạo một danh sách liên kết đơn 10 phần tử với các giá trị tăng dần (danh sách
liên kết sắp xếp tăng dần). Tìm và xóa các phần tử trùng lặp có trong danh sách (phần tử trùng
lặp là phần tử có giá trị bằng với 1 phần tử khác trong danh sách).
Ban đầu: Linked_list = 10 -> 11 -> 11 -> 12 -> 12 -> 21 -> 43
Sau khi xóa: Linked_list = 10 -> 11 -> 12 -> 21 -> 43 Bài
7:
Viết chương trình tạo một danh sách liên kết đơn 10 phần tử với giá trị ngẫu nhiên (danh sách
liên kết sắp xếp không được sắp xếp). Tìm và xóa các phần tử trùng lặp trong danh sách
(phần tử trùng lặp là phần tử có giá trị bằng với 1 phần tử khác trong danh sách).
Ban đầu: Linked_list = 12 -> 11 -> 12 -> 21 -> 41 -> 43 -> 21
Sau khi xóa: Linked_list = 12 -> 11 -> 21 -> 41 -> 43
Bài 8 : Viết câu lệnh định nghĩa hàm Max() chức năng tìm giá trị phần tử lớn nhất trong
một danh sách liên kết đơn.
Bài 9: Viết câu lệnh định nghĩa hàm void Print() chức năng in ra màn hình giá trị n phần
tử đầu tiên trong 1 danh sách liên kết.
Bài 10: Viết câu lệnh định nghĩa hàm void Copy() chức năng sao chép giá trị phần tử từ 1
mảng sang 1 danh sách liên kết.
lOMoARcPSD| 58605085
CHƯƠNG 3: CẤU TRÚC DỮ LIỆU CƠ BẢN – STACK & QUEUE
CÂU HỎI TRẮC NGHIỆM
Câu 1: Stack là các cấu trúc dữ liệu lưu trữ các phần tử theo cơ chế nào?
a) FIFO (First In, First Out) b) LIFO (Last In, First Out)
c) LILO (Last In, Last Out) d) FILO (First In, Last Out).
Câu 2: Trong stack, phần tử cuối cùng được thêm vào được gọi là gì?
a) Top b) Front
c) Rear d) Bottom
Câu 3: Phép toán nào không phải là phép cơ bản trong stack?
a) Push b) Pop
c) Peek d) Remove
Câu 4: Chèn thêm một phần tử vào stack yêu cầu sửa đổi bao nhiêu con trỏ?
a) 1. b) 2.
c) 3. d) 4.
Câu 5: Trong ngăn xếp (stack), phần tử nào được xóa đầu tiên?
a) Phần tử đầu b) Phần tử cuối
c) Phần tử ở giữa d) Tất cả đều sai
Câu 6: Ngăn xếp (stack) thường được sử dụng trong trường hợp nào sau đây? a)
Khi cần thực hiện tìm kiếm phần tử trong danh sách
b) Khi cần thực hiện tính toán toán học phức tạp
c) Khi cần thực hiện các thao tác theo nguyên tắc LIFO
d) Khi cần sắp xếp dữ liệu theo thứ tự tăng dần. Câu 7: Hàng đợi (Queue) hoạt động theo
nguyên tắc nào?
a) LIFO (Last-In, First-Out) b) FIFO (First-In, First-Out)
c) LILO (Last-In, Last-Out) d) FILO (First-In, Last-Out)
Câu 8: Hàng đợi (Queue) có thể được triển khai bằng cấu trúc dữ liệu nào sau đây?
a) Mảng (array) b) Danh sách liên kết đơn (singly linked list)
c) Cả hai d) Tất cả đều sai.
lOMoARcPSD| 58605085
Câu 9: Trong hàng đợi (Queue), phần tử nào được xóa đầu tiên?
a) Phần tử đầu danh sách b) Phần tử cuối danh sách
c) Phần tử ở giữa danh sách d) Phần tử ngẫu nhiên
Cho 1 Stack có 5 phần tử giá trị lần lượt {1,2,3,4,5}. Cho đoạn câu lệnh sau:
Push(1); Pop(); Push(2); Push(3); Pop(); Push(4);
Pop(); Pop(); Push(5);
Câu 10: Số phần tử của Stack sau khi chạy đoạn lệnh trên:
a. 5 b. 4
c. 3 d. Tất cả đều sai.
Câu 11: Giá trị của phần tử trên cùng (Top) của Stack:
a. 3 b. 4
c. 5 d. Tất cả đều sai.
Cho 1 Queue có 5 phần tử giá trị lần lượt {1,2,3,4,5}. Cho đoạn câu lệnh sau:
Push(1); Pop(); Push(2); Push(3); Pop(); Push(4);
Pop(); Pop(); Push(5);
Câu 12: Số phần tử của Queue sau khi chạy đoạn lệnh trên:
a. 5 b. 4
c. 3 d. Tất cả đều sai.
Câu 13: Giá trị của phần tử đầu tiên (First) của Queue:
a. 3 b. 4
c. 5 d. Tất cả đều sai.
BÀI TẬP THỰC HÀNH
Bài 1:
Viết chương trình tạo 1 ngăn xếp A (Stack) 1 hàng đợi B (Queue) chứa các giá trị số nguyên.
Cho phép người sử dụng nhập vào giá trị (10 giá trị), thêm các giá trị này vào A và B. Hiển thị
giá trị các phần tử của A và B ra màn hình.
lOMoARcPSD| 58605085
Bài 2: Viết chương trình tạo một Stack A chứa 10 giá trị số nguyên (SV tự cho các giá trị
phần tử). Cho phép người sử dụng nhập vào 1 số nguyên x. Kiểm tra xem trong Aphần tử
nào có giá trị bằng x hay không. Bài 3:
Viết chương trình tạo một Queue A chứa 10 giá trị số nguyên (SV tự cho các giá trị phần tử).
Cho phép người sử dụng nhập vào 1 số nguyên x. Tìm và đếm số lần xuất hiện của x trong A.
Bài 4:
Viết chương trình cho phép người sử dụng nhập vào 1 giá trị số nguyên x. Chuyển số nguyên
x sang hệ nhị phân (Binary) sử dụng Stack. In kết quả ra màn hình.
Nhập: x = 20
Hiển thị: Binary = 10100
Bài 5:
Viết câu lệnh định nghĩa hàm void Print() chức năng in ra màn hình giá trị n phần tử đầu
tiên trong 1 Queue.
Bài 6:
Viết câu lệnh định nghĩa hàm Max() có chức năng tìm giá trị phần tử lớn nhất trong một hàng
đợi Queue.
Bài 7:
Viết câu lệnh định nghĩa hàm void Copy() chức năng sao chép giá trị phần tử từ 1 mảng sang
1 Stack.
Bài 8:
Viết chương trình cho phép người sử dụng nhập vào 1 phép toán dưới dạng chuỗi tự (string).
Chuyển biểu thức sang dạng Pre-fix và Post-fix sử dụng Stack. In biểu thức sau khi chuyển đổi
ra màn hình (dưới dạng chuỗi kí tự).
Nhập: A + B * (C – D)
Hiển thị: Prefix: ABCD-*+
Postfix: +*DCBA
CHƯƠNG 3: CẤU TRÚC DỮ LIỆU CƠ BẢN – TREE & GRAPH
CÂU HỎI TRẮC NGHIỆM
Câu 1: Cây (Tree) là gì trong cấu trúc dữ liệu và giải thuật?
lOMoARcPSD| 58605085
a) Một tập hợp các nút liên kết với nhau theo một cấu trúc tuyến tính.
b) Một tập hợp các nút không có liên kết với nhau.
c) Một tập hợp các nút liên kết với nhau theo cấu trúc không tuyến tính.
d) Một tập hợp các nút được sắp xếp thành một dãy.
Câu 2: Trong một cây, nút không có nút con nào được gọi là gì?
a) Nút gốc (Root)
b) Nút lá (Leaf)
c) Nút con (Child)
Câu 3: Độ sâu của một nút trong cây là gì?
d) Nút trung gian (Intermediate)
a) Số lượng nút từ nút đó đến nút gốc.
b) Số lượng nút con của nút đó.
c) Số lượng nút con của nút gốc.
Câu 4: Độ cao của một cây là gì?
d) Số lượng nút trong cây.
a) Số lượng nút từ nút gốc đến nút lá xa nhất.
b) Số lượng nút trong cây.
c) Số lượng nút con của nút gốc.
d) Số lượng nút con của nút lá.
Câu 5: Loại cây nào có đặc điểm là mỗi nút có không quá hai nút con?
a) Cây nhị phân (Binary Tree) b) Cây nhị phân tìm kiếm (BST)
c) Cây cân bằng (Balanced Tree) d) Cây hợp nhất (Merge Tree)
Câu 6: Trong cây nhị phân, nút nào là nút nằm trên cùng của một nhánh và không có nút con?
a) Nút lá (Leaf) b) Nút gốc (Root)
c) Nút trung gian (Intermediate) d) Nút cha (Parent)
Câu 7: Đồ thị (Graph) là gì trong cấu trúc dữ liệu và giải thuật?
a) Một tập hợp các đỉnh (vertex) được kết nối bởi các cạnh (edge).
b) Một tập hợp các cạnh không có đỉnh nào.
c) Một tập hợp các đỉnh không có cạnh nào.
d) Một tập hợp các đỉnh và các nút.
Câu 8: Loại đồ thị nào mà mỗi cặp đỉnh đều được kết nối bởi một cạnh không hướng? a)
Đồ thị vô hướng (Undirected Graph) b) Đồ thị có hướng (Directed Graph)
c) Đồ thị trống (Empty Graph) d) Đồ thị đơn (Simple Graph)
Câu 9: Trong đồ thị có hướng, cạnh nào chỉ đi từ đỉnh A đến đỉnh B không thể đi ngược lại từ B
đến A?
a) Cạnh liên kết (Connecting Edge) b) Cạnh kép (Double Edge)
lOMoARcPSD| 58605085
c) Cạnh hướng (Directed Edge) d) Cạnh đồng hướng (Parallel Edge) Câu 10: Trong
đồ thị, một nhóm các đỉnh được kết nối với nhau bởi các cạnh được gọi là gì? a) Đồ thị con
(Subgraph) b) Đồ thị kết nối (Connected Graph)
c) Đồ thị con liên thông (Connected Subgraph) d) Đồ thị con không liên thông Câu
11: Trong cây nhị phân, nút nào là nút cha của nút con được gọi là "trái"?
a) Nút có chỉ số thấp hơn b) Nút có chỉ số cao hơn
c) Nút có chỉ số chẵn d) Nút có chỉ số lẻ
Câu 12: Cây B-Tree là một cấu trúc dữ liệu phân tán được sử dụng chủ yếu để làm gì?
a) Tìm kiếm và sắp xếp dữ liệu b) Lưu trữ và truy xuất dữ liệu từ cơ sở dữ liệu lớn
c) Xử lý dữ liệu dạng cây d) Tạo ra các cấu trúc dữ liệu phức tạp
Câu 13: Trong cây B-Tree, nút nào được gọi là nút gốc?
a) Nút có chỉ số thấp nhất b) Nút có chỉ số cao nhất
c) Nút ở tầng trên cùng d) Nút ở tầng dưới cùng
Câu 14: Trong cây B-Tree, nút nào là nút lá?
a) Nút không có con b) Nút có nhiều hơn một con
c) Nút có một con duy nhất d) Nút gốc
Câu 15: Trong cây B-Tree, khóa được sắp xếp như thế nào trong mỗi nút?
a) Không cần sắp xếp b) Tăng dần
c) Giảm dần d) Ngẫu nhiên
Câu 16: Trong cây nhị phân tìm kiếm, điều đảm bảo rằng mỗi nút trong cây giá trị lớn hơn tất
cả các nút trong cây con bên trái nhỏ hơn tất cả các nút trong cây con bên phải của nó? a) Thuộc
tính BST (Binary Search Tree)
b) Thuộc tính AVL (Adelson-Velsky và Landis)
c) Thuộc tính Red-Black Tree
d) Thuộc tính Heap
Câu 17: Cho Graph sau, phát biểu nào là đúng?

Preview text:

lOMoAR cPSD| 58605085
CHƯƠNG 2: C/C++ CƠ BẢN
CÂU HỎI TRẮC NGHIỆM
Câu 1: Trong ngôn ngữ C, biến dùng để lưu trữ gì? a) Hàm b) Toán tử c) Dữ liệu d) Câu lệnh.
Câu 2: Kiểu dữ liệu int trong C được sử dụng để lưu trữ: a) Số nguyên b) Số thực c) Chuỗi kí tự d) Số phức.
Câu 3: Toán tử ++ được sử dụng để thực hiện: a) Phép cộng b) Phép trừ
c) Phép tăng giá trị biến lên 1 đơn vị
d) Phép giảm giá trị biến đi 1 đơn vị Câu
4: Trong C, kiểu dữ liệu nào được sử dụng để lưu trữ các giá trị logic (đúng/sai)? a) int b) char c) bool d) float
Câu 5: Trong C, toán tử ++i và i++ hoạt động theo cách nào khác nhau?
a) ++i tăng giá trị của i trước khi sử dụng, i++ tăng giá trị sau khi sử dụng.
b) ++i tăng giá trị sau khi sử dụng, i++ tăng giá trị trước khi sử dụng.
c) Cả hai hoạt động giống nhau.
d) Không có sự khác biệt nào giữa chúng..
Câu 6: Cho 3 biến số nguyên (int) a = 5, b = 4, c = 3,hãy cho biết giá trị của biểu thức: (a*++b)/c a. 0. b. 1. c. 2. d. Tất cả đều sai
Câu 7: Cho 3 biến số nguyên a = 5, b = 2, c = 3, kết quả: (a>5)&&(c<2)&&(++b ==2)là: a. Đúng/True. b. Sai/False
Câu 8: Cho biến a được khai báo như sau: bool a; Trong
các câu lệnh sau, câu lệnh nào là ĐÚNG: a. a = 0; b. a = true; c. a = 1; d. Tất cả đều đúng lOMoAR cPSD| 58605085
Câu 9: Cho biến a được khai báo như sau: char a; Trong
các câu lệnh sau, câu lệnh nào là SAI: a. a = 'b'; b. a = "B"; c. a = 49; d. a = ' ';
Câu 10: Trong các câu lệnh sau, câu lệnh nào là ĐÚNG: a. int x = y = z = 10;
b. int x = 10, y = 10, z = 10;
c. int x = 10,int y = 10, int z = 10; d. Tất cả đều đúng
Câu 11: Hãy chọn câu lệnh đúng để tính giá trị của hàm mũ e^x và lưu vào biến result: a) result = exp(x); b) result = pow(x, e); c) result = log(x); d) result = sqrt(x);
Câu 12: Trong ngôn ngữ C, dấu {} được sử dụng để làm gì?
a) Đánh dấu các điều kiện đúng và sai.
b) Đánh dấu khối lệnh hoặc nhóm lệnh.
c) Đánh dấu kết thúc một vòng lặp.
d) Bắt buộc sử dụng trong mọi câu lệnh if.
Câu 13: Câu lệnh nào trong C được sử dụng để thoát khỏi một vòng lặp sớm hơn dự kiến? a. return b. next c. continue d. break
Câu 14: Câu lệnh continue trong một vòng lặp được sử dụng để làm gì? a)
Kết thúc vòng lặp hiện tại và tiếp tục vòng lặp ngoài.
b) Thực hiện một lệnh hoặc khối lệnh nếu điều kiện đúng.
c) Lặp lại vòng lặp hiện tại từ đầu.
d) Tạo một lặp vô hạn.
Đoạn chương trình sau dùng cho 2 câu dưới: int i=0,x=0,n=0; for (i = 0;i<3;i++) { for (x = 2; x>=0; x--) { n++; printf("%d",i++); } }
Câu 15: Cho biết giá trị của n sau khi kết thúc đoạn chương trình trên: a. 3. b. 4. lOMoAR cPSD| 58605085 c. 5. d. 6.
Câu 16: Kết quả xuất ra màn hình sau khi chạy đoạn chương trình trên là: a. 01 b. 12 c. 012 d. 0123
Đoạn chương trình sau dùng cho 2 câu dưới: int i = 5, n = 0; do { n++; if (i%2 == 1) i--; else printf("%d", --i);
} while (i>0);
Câu 17: Cho biết đoạn lệnh trong vòng lặp do-while được lặp lại mấy lần: a. 3 b. 4 c. 5 d. 6
Câu 18: Kết quả xuất ra màn hình sau khi chạy đoạn chương trình trên là: a. 135 b. 531 c. 31 d. Tất cả đều SAI.
Đoạn chương trình sau dùng cho 2 câu dưới: int i=0,x=2,n=0; while (i<3) { while (x>=0) { n = n + 1; printf("%d_",x); x = x - 1; } i = i + 1; }
Câu 19: Cho biết giá trị của n sau khi kết thúc đoạn chương trình trên: a. 3. b. 4. c. 5. d. Tất cả đều sai.
Câu 20: Kết quả xuất ra màn hình sau khi chạy đoạn chương trình trên là: a. 0 _1_ b. 1_2_ c. 0 _1_ 2_ d. Tất cả đều sai. lOMoAR cPSD| 58605085
Đoạn chương trình sau dùng cho 2 câu dưới:
int num = 12345,reversed = 0, n = 0,digit; while (num != 0) { n++; digit = num % 10; reversed = reversed + digit; num /= 10; }
Câu 21: Cho biết giá trị của reversed sau khi chạy đoạn chương trình trên: a. 2. b. 3. c. 4. d. Tất cả đều sai.
Câu 22: Cho biết giá trị của n sau khi chạy đoạn chương trình trên: a. 2 b. 3 c. 4 d. Tất cả đều sai.
Đoạn chương trình sau dùng cho 2 câu dưới: int f(int a, int b) { if(a>b) return a - b; else return b - a; } void main() { int x = 5, y = 3; x = f(x,y); y = f(y,x); int n = f(x,y) + f(y,x); }
Câu 23: Giá trị của x và y sau khi kết thúc đoạn chương trình trên là: a. x = 5, y = 5 b. x = 2, y = 1 c. x = 1, y = 2 d. Tất cả đều sai.
Câu 24: Giá trị của biến n sau khi kết thúc đoạn chương trình trên là: a. 0. b. 1. c. 2. d. Tất cả đều sai. lOMoAR cPSD| 58605085
Đoạn chương trình sau dùng cho 2 câu dưới: int f(int a)
{ if( a==1) return 1; if(a%2 == 0) return f(a-1)*2; else return (f(a-1) + 1); } void main() { int x = f(3); int y = f(4); }
Câu 25: Giá trị của x sau khi kết thúc đoạn chương trình trên là: a. 3 b. 4 c. 5 d. Tất cả đều sai.
Câu 26: Giá trị của biến y sau khi kết thúc đoạn chương trình trên là: a. 0. b. 1. c. 2. d. Tất cả đều sai.
BÀI TẬP THỰC HÀNH Bài 1:
Viết chương trình cho phép người sử dụng nhập vào giá trị điện dung C, điện cảm L (số thực).
Tính và in ra tần số cộng hưởng Fch của mạch L,C nối tiếp. Cho biết: 1 𝐹𝑐 Bài 2 :
Viết chương trình tính tiền cước taxi với bảng giá như sau :
• 2 km đầu tiên : 20.000 đ.
• 8 km tiếp theo : 7.000đ/km.
• 10 km tiếp theo : 5.000đ/km. • Từ km thứ 21 : 3.000đ/km.
Dựa trên các thông số trên, viết chương trình có các chức năng sau :
• Cho phép người sử dụng nhập vào số km đi được (số nguyên).
• Tính tiền cước taxi dựa vào bảng giá trên, in kết quả sau khi tính toán ra màn hình. lOMoAR cPSD| 58605085 Bài 3:
Viết chương trình cho phép người sử dụng nhập vào 1 giá trị số nguyên a. Tìm và in ra tất cả
các giá trị ước số của a. Bài 4:
Viết chương trình cho phép người sử dụng nhập vào 2 giá trị số nguyên a và b. Tìm bội số
chung nhỏ nhất (BSCNN) và ước số chung lớn nhất (USCLN) của a và b và in ra màn hình. Bài 5:
Viết chương trình cho phép người sử dụng nhập vào một giá trị số nguyên a. Kiểm tra a có phải
là số nguyên tố hay không? In kết luận ra màn hình. Bài 6:
Viết chương trình cho phép người sử dụng nhập vào một giá trị số nguyên N. In ra màn hình
tất cả số nguyên tố nằm trong khoảng [0,N]. Bài 7:
Viết câu lệnh định nghĩa hàm int SumDigit (int x) có chức năng tính tổng giá trị các chữ số của một số nguyên. Bài 8 :
Viết câu lệnh định nghĩa hàm bool IsPrime (int x) có chức năng kiểm tra một giá trị số nguyên
có phải là một số nguyên tố hay không. Bài 9:
Viết câu lệnh định nghĩa hàm int Factorial (int x) có chức năng tính giai thừa của một số
nguyên theo nguyên lý đệ quy.
Bài 10: Viết câu lệnh định nghĩa hàm void PascalTriangle (int n) có chức năng in ra màn hình
hệ số của tam giác pascal bậc từ 0 đến n.
CHƯƠNG 3: CẤU TRÚC DỮ LIỆU CƠ BẢN – MẢNG (ARRAY)
CÂU HỎI TRẮC NGHIỆM
Câu 1: Trong ngôn ngữ lập trình C, mảng là gì?
a. Một tập hợp chứa nhiều giá trị
b. Một loại dữ liệu số nguyên c. Một chuỗi ký tự d. Một hàm số
Câu 2: Trong C, các phần tử của mảng có thể chứa các kiểu dữ liệu khác nhau. a. Đúng b. Sai lOMoAR cPSD| 58605085
Câu 3: Trong các câu lệnh sau khai báo mảng M sau, câu lệnh nào là ĐÚNG: a. int [5][3] M; b. int M[][] ; c. int M[5][3];
d. Không có câu lệnh nào ĐÚNG;
Câu 4: Trong ngôn ngữ lập trình C, vị trí (index) phần tử cuối cùng của mảng là bao nhiêu? a. -1 b. 0 c. 1
d. N-1 (với N là số phần tử của mảng)
Câu 5: Cách nào sau đây được sử dụng để truy xuất vào phần tử thứ 4 của mảng myArray? a. myArray[4]; b. myArray(4); c. get(myArray, 4); d. myArray.get(4);
Câu 6: Câu lệnh nào sau đây để tạo một mảng số nguyên có kích thước 10 với phần tử đầu tiên
trong mảng có giá trị bằng 1 trong C? a. int arr[10] = {0}; b. int arr[10] = {1}; c. int arr[10] = {};
d. Không có câu lệnh nào ĐÚNG;
Câu 7: Con trỏ trong C là gì?
a. Biến chứa một giá trị
b. Biến chứa địa chỉ của một biến khác c. Biến chứa một hàm
d. Biến chứa một số nguyên
Câu 8: Để khai báo một con trỏ kiểu integer trong C, bạn sử dụng cú pháp nào sau đây? a. int pointer; b. integer* pointer; c. int* pointer; d. pointer int;
Câu 9: Để lấy địa chỉ của một biến trong C và gán cho một con trỏ, bạn sử dụng toán tử nào? a. * b. & c. -> d. .
Câu 10: Khi một con trỏ được khai báo, nó sẽ trỏ đến? a. Giá trị ngẫu nhiên b. Giá trị 0
c. Không trỏ đến đâu cả
d. Đến địa chỉ của biến null
Câu 11: Để giải phóng bộ nhớ được cấp phát cho một con trỏ, bạn sử dụng hàm nào? a. free() b. malloc() c. allocate() d. deallocate() Câu 12:
Cho đoạn chương trình như sau: lOMoAR cPSD| 58605085 int x = 5,y = 3;
int *a = &x, *b = &y; int c = *x + *y;
Cho biết giá trị của c sau khi kết thúc đoạn chương trình trên a. 3. b. 4. c. 5. d. Tất cả đều sai. Câu 13:
Cho đoạn chương trình như sau: int x = 5,y = 3;
int *a = &x, *b = &y; *a = *b; int c = x + y;
Cho biết giá trị của c sau khi kết thúc đoạn chương trình trên a. 4. b. 5. c. 6. d. Tất cả đều sai.
Đoạn chương trình sau dùng cho 2 câu dưới: int M[3] = {-1,9,6}; int S = 0;
for (int i = 2;i>=0;i--) { if (M[i]%2 == 1) S = S + M[i]; else S = S - M[i]; printf("%d ",S); }
Câu 14: Cho biết giá trị của S sau khi chạy đoạn chương trình trên: : a. 4. b. 5. c. 7. d. 9.
Câu 15: Cho biết kết quả in ra màn hình sau khi chạy đoạn chương trình trên: a. 6 3 4 b. 6 4 3 c. 3 4 6
d. Tất cả đều sai.
Đoạn chương trình sau dùng các câu dưới: lOMoAR cPSD| 58605085
int M[3][3] = {{-1,4,2},{4,2,7},{1,5,4}};
for (int i = 2;i>=0;i--)
{ for (int j = 2;j>=0;j--) { if (M[i][j]>M[j][i]) M[i][j] = M[j][i]; } printf("%d ",M[i][i]); }
Câu 16: Cho biết giá trị của phần tử M[1][1] sau khi chạy đoạn chương trình trên: a. -1 b. 1 c. 2 d. 4
Câu 17: Cho biết giá trị của phần tử M[2][0] sau khi chạy đoạn chương trình trên: a. -1 b. 1 c. 4 d. 5
Câu 18: Cho biết kết quả in ra màn hình sau khi chạy đoạn chương trình trên: a. 4 2 b. 4 2 -1 c. 5 4 2 -1 d. Tất cả đều sai.
Đoạn chương trình sau dùng các câu dưới: int M[3][3] =
{{2,5,2},{1,6,7},{1,5,4}}; int a =
M[0][0]; for (int i = 0;i<3;i++)
{
for (int j = 0;j<3;j++) { if (M[i][j]>a) { M[i][j] = a; a = M[i][j]; } }
printf("%d ",M[i][i]); }
Câu 19: Cho biết giá trị của phần tử M[1][2] sau khi chạy đoạn chương trình trên: a. 6. b. 1. c. 4. d. 2.
Câu 20: Cho biết giá trị của phần tử M[2][1] sau khi chạy đoạn chương trình trên: a. 2. b. 1. c. 4. d. 5. lOMoAR cPSD| 58605085
Câu 21: Cho biết kết quả in ra màn hình sau khi chạy đoạn chương trình trên: a. 4 2 2. b. 2 2 2. c. 5 4 2 2. d. Tất cả đều sai
Đoạn chương trình sau dùng các câu dưới: int M[5] = {-1,3,2,4,7};
for (int i = 0;i<4;i++)
{
if (M[i]>M[i+1]) M[i] = M[i+1];
else printf("%d",M[i]); }
Câu 22: Cho biết giá trị của phần tử M[2] sau khi chạy đoạn chương trình trên: a. -1. b. 3. c. 2. d. 4.
Câu 23: Cho biết giá trị của phần tử M[4] sau khi chạy đoạn chương trình trên: a. 2. b. 3. c. 4. d. 7.
Câu 24: Cho biết kết quả in ra màn hình sau khi chạy đoạn chương trình trên: a. -124 b. -12 c. -13 d. Tất cả đều sai.
Đoạn chương trình sau dùng các câu dưới:
int tong = 0, tich = 1; int M[2][2] = {{-1,4},{2,5}};
for (int i = 0;i<2;i++)
{ for (int j = 0;j<2;j++) {
if (i > j) tong = tong + M[i][j];
else tich = tich * M[i][j]; } printf("%d ", tong); }
Câu 25: Cho biết giá trị của biến tong sau khi chạy đoạn chương trình trên: a. 1. b. 2. c. 3. d. Tất cả đều sai.
Câu 26: Cho biết giá trị của biến tich sau khi chạy đoạn chương trình trên: a. -4. b. -2. lOMoAR cPSD| 58605085 c. -10. d. Tất cả đều sai.
Câu 27: Cho biết kết quả in ra màn hình sau khi chạy đoạn chương trình trên: a. 0 2. b. 0 3. c. 1 6. d. Tất cả đều sai.
BÀI TẬP THỰC HÀNH Bài 1:
Viết chương trình tạo một mảng số nguyên 1 chiều 10 phần tử, cho phép người sử dụng nhập
vào các giá trị cho mảng. Hiển thị mảng sau khi nhập ra màn hình. Bài 2:
Viết chương trình tạo một mảng số nguyên 2 chiều 3x3 (3 hàng, 3 cột), cho phép người sử dụng
nhập vào các giá trị cho mảng. Hiển thị mảng ra màn hình theo đúng hàng-cột. Bài 3:
Tạo sẵn một dữ liệu (mảng M: 1 chiều số nguyên 20 phần tử) có các giá trị ngẫu nhiên. Hiển
thị mảng ban đầu ra màn hình.
Thực hiện lọc trung bình x3 theo công thức sau:
M[i] = (M[i-1] + M[i] + M[i+1])/3 M[0] = (M[0] + M[1])/2
M[20] = (M[20]+ M[19])/2 Xuất giá
trị của dữ liệu sau khi lọc ra màn hình. Bài 4:
Viết chương trình tạo một mảng số nguyên 1 chiều 10 phần tử với các giá trị cho trước. Cho
phép nhập giá trị x, tìm và in vị trí phần tử của mảng có giá trị bằng x (Nếu mảng không có
phần tử bằng với x thì in giá trị “Not found”). Bài 5 :
Viết chương trình tạo một mảng số nguyên 1 chiều 100 phần tử với các giá trị ngẫu nhiên. In
ra màn hình tất cả các giá trị phần tử là duy nhất trong mảng (phần tử duy nhất là phần tử có
giá trị không trùng với bất kì phần tử nào khác trong mảng). Bài 6:
Viết chương trình tạo một mảng số nguyên 1 chiều 100 phần tử với các giá trị ngẫu nhiên. Cho
phép nhập giá trị x, in ra màn hình tất cả các tổ hợp 3 giá trị phần tử có tổng bằng x. Bài 7: lOMoAR cPSD| 58605085
Viết câu lệnh định nghĩa hàm int Max (int A[], int size) có chức năng tìm giá trị phần tử lớn nhất trong mảng. Bài 8 :
Viết câu lệnh định nghĩa hàm int Find (int A[], int size, int x) có chức năng tính tìm vị trí của
phần tử có giá trị bằng x (trả về -1 nếu không thấy giá trị phù hợp). Bài 9:
Viết câu lệnh định nghĩa hàm void Insert (int A[], int size, int x, int n) có chức năng chèn thêm
giá trị x vào vị trí n trong mảng. Bài 10:
Viết câu lệnh định nghĩa hàm void Delete (int A[], int size, int n) có chức năng xóa phần tử tại vị trí n trong mảng.
CHƯƠNG 3: CẤU TRÚC DỮ LIỆU CƠ BẢN – DANH SÁCH LIÊN KẾT (LINKED LIST)
CÂU HỎI TRẮC NGHIỆM
Câu 1: Trong linked list đơn (singly-linked list), mỗi node chứa những phần tử gì? a) Giá trị dữ liệu
b) Địa chỉ của node tiếp theo
c) Địa chỉ của node trước đó d) Tất cả đều đúng.
Câu 2: Trong linked list đôi (double-linked list), node cuối cùng thường có con trỏ trỏ đến đâu? a) NULL b) Node đầu tiên
c) Địa chỉ của chính nó d) Tất cả đều sai
Câu 3: Loại linked list nào trong đó node cuối cùng sẽ trỏ đến node đầu tiên: a) Singly linked list b) Double linked list c) Circular linked list d) Tất cả đều sai.
Câu 4: Chèn một phần tử vào giữa một danh sách liên kết yêu cầu sửa đổi bao nhiêu con trỏ? a) 1. b) 2. c) 3. d) 4.
Câu 5: Chèn một phần tử vào cuối một danh sách liên kết yêu cầu sửa đổi bao nhiêu con trỏ? a) 1. b) 2. c) 3. d) 4. lOMoAR cPSD| 58605085
Câu 6: Trong trường hợp xóa node đầu tiên của linked list, chúng ta cần làm gì?
a) Giải phóng bộ nhớ của node đó.
b) Đặt con trỏ của node tiếp theo là NULL c) Cả a) và b). d) Tất cả đều sai.
Câu 7: Để xóa một node khỏi linked list, cần phải thực hiện?
a) Đặt con trỏ của node sau nó trỏ đến node trước nó
b) Đặt con trỏ của node trước nó trỏ đến node sau nó c) Cả a) và b) d) Tất cả đều sai.
Câu 8: Thao tác nào sau đây cần phải xét đến số lượng phần tử của linked list?
a) Xóa phần tử đầu tiên.
b) Xóa phần tử cuối cùng.
c) Chèn phần tử mới vào vị trí đầu tiên. d) Tất cả đều sai.
Câu 9: Để chèn thêm node mới vào danh sách liên kết vòng, cần thay đổi giá trị của bao nhiêu con trỏ (pointer): a) 1. b) 2. c) 3. d) 4.
Đoạn chương trình sau dùng cho các câu hỏi tiếp theo:
void display(struct node* start)
{ if(start == NULL) return; else
printf("%d ", start->data); display(start- >next); }
Câu 10: Cho biết kết quả in ra màn hình khi chạy đoạn code trên với danh sách liên kết đơn
chứa giá trị lần lượt 1->2->3->4: a. 1 2 3 4 b. 1 3 1 3 c. 1 3 3 1 d. Tất cả đều sai.
Câu 11: Cho biết kết quả in ra màn hình khi chạy đoạn code trên với danh sách liên kết đơn
chứa giá trị lần lượt 1->2->3->4->5: a. 1 2 3 4 5 b. 1 3 5 5 3 1 c. 1 3 5 1 3 5 d. Tất cả đều sai.
Đoạn chương trình sau dùng cho các câu hỏi tiếp theo: lOMoAR cPSD| 58605085
void insert(struct node* start,int value) { if(start == NULL) return; if (start->value%2 == 0)
{ struct node* new_node = (struct node*)malloc(sizeof(struct
node)); new_node->value = value; new_node->next = start-
>next; start->next = new_node;
} else insert(start- >next,value); }
Câu 12: Cho biết kết quả của danh sách liên kết khi gọi hàm insert(head,10) với danh sách
liên kết đơn chứa giá trị lần lượt 1->2->3->4: a. 1->2->10->3->4 b. 1->10->2->3->4 c. 1->2->3->10->4 d. Tất cả đều sai.
Câu 13: Cho biết kết quả của danh sách liên kết khi gọi hàm insert(head,10) với danh sách
liên kết đơn chứa giá trị lần lượt 2->4->6: a. 2->4->6 b. 2->4->6->10 c. 2->10->4->6 d. Tất cả đều sai. BÀI TẬP THỰC HÀNH Bài 1:
Viết chương trình tạo một danh sách liên kết đơn chứa các giá trị số nguyên. Cho phép người
sử dụng nhập vào giá trị (10 giá trị) cho danh sách liên kết. Hiển thị giá trị các phần tử của danh sách ra màn hình. Bài 2:
Viết chương trình tạo một danh sách liên kết đơn chứa 10 giá trị số nguyên (SV tự cho các giá
trị phần tử). Cho phép người sử dụng nhập vào 1 số nguyên x. Tìm và in ra vị trí phần tử
trong danh sách có giá trị bằng x. Bài 3:
Viết chương trình tạo một danh sách liên kết đơn chứa 10 giá trị số nguyên (SV tự cho các giá
trị phần tử). Cho phép người sử dụng nhập vào 1 số nguyên x. Tìm và xóa tất cả các phần tử
trong danh sách có giá trị bằng x. Bài 4: lOMoAR cPSD| 58605085
Viết câu lệnh định nghĩa hàm Append() có chức năng thêm phần tử mới vào cuối 1 danh sách liên kết đơn. Bài 5:
Viết câu lệnh định nghĩa hàm Insert() có chức năng thêm phần tử mới vào đầu 1 danh sách liên kết đơn. Bài 6:
Viết chương trình tạo một danh sách liên kết đơn 10 phần tử với các giá trị tăng dần (danh sách
liên kết sắp xếp tăng dần). Tìm và xóa các phần tử trùng lặp có trong danh sách (phần tử trùng
lặp là phần tử có giá trị bằng với 1 phần tử khác trong danh sách). Ban đầu:
Linked_list = 10 -> 11 -> 11 -> 12 -> 12 -> 21 -> 43 Sau khi xóa:
Linked_list = 10 -> 11 -> 12 -> 21 -> 43 Bài 7:
Viết chương trình tạo một danh sách liên kết đơn 10 phần tử với giá trị ngẫu nhiên (danh sách
liên kết sắp xếp không được sắp xếp). Tìm và xóa các phần tử trùng lặp có trong danh sách
(phần tử trùng lặp là phần tử có giá trị bằng với 1 phần tử khác trong danh sách). Ban đầu:
Linked_list = 12 -> 11 -> 12 -> 21 -> 41 -> 43 -> 21 Sau khi xóa:
Linked_list = 12 -> 11 -> 21 -> 41 -> 43
Bài 8 : Viết câu lệnh định nghĩa hàm Max() có chức năng tìm giá trị phần tử lớn nhất trong
một danh sách liên kết đơn.
Bài 9: Viết câu lệnh định nghĩa hàm void Print() có chức năng in ra màn hình giá trị n phần
tử đầu tiên trong 1 danh sách liên kết.
Bài 10: Viết câu lệnh định nghĩa hàm void Copy() có chức năng sao chép giá trị phần tử từ 1
mảng sang 1 danh sách liên kết. lOMoAR cPSD| 58605085
CHƯƠNG 3: CẤU TRÚC DỮ LIỆU CƠ BẢN – STACK & QUEUE
CÂU HỎI TRẮC NGHIỆM
Câu 1: Stack là các cấu trúc dữ liệu lưu trữ các phần tử theo cơ chế nào? a) FIFO (First In, First Out) b) LIFO (Last In, First Out) c) LILO (Last In, Last Out) d) FILO (First In, Last Out).
Câu 2: Trong stack, phần tử cuối cùng được thêm vào được gọi là gì? a) Top b) Front c) Rear d) Bottom
Câu 3: Phép toán nào không phải là phép cơ bản trong stack? a) Push b) Pop c) Peek d) Remove
Câu 4: Chèn thêm một phần tử vào stack yêu cầu sửa đổi bao nhiêu con trỏ? a) 1. b) 2. c) 3. d) 4.
Câu 5: Trong ngăn xếp (stack), phần tử nào được xóa đầu tiên? a) Phần tử đầu b) Phần tử cuối c) Phần tử ở giữa d) Tất cả đều sai
Câu 6: Ngăn xếp (stack) thường được sử dụng trong trường hợp nào sau đây? a)
Khi cần thực hiện tìm kiếm phần tử trong danh sách
b) Khi cần thực hiện tính toán toán học phức tạp
c) Khi cần thực hiện các thao tác theo nguyên tắc LIFO
d) Khi cần sắp xếp dữ liệu theo thứ tự tăng dần. Câu 7: Hàng đợi (Queue) hoạt động theo nguyên tắc nào? a) LIFO (Last-In, First-Out) b) FIFO (First-In, First-Out) c) LILO (Last-In, Last-Out) d) FILO (First-In, Last-Out)
Câu 8: Hàng đợi (Queue) có thể được triển khai bằng cấu trúc dữ liệu nào sau đây? a) Mảng (array)
b) Danh sách liên kết đơn (singly linked list) c) Cả hai d) Tất cả đều sai. lOMoAR cPSD| 58605085
Câu 9: Trong hàng đợi (Queue), phần tử nào được xóa đầu tiên?
a) Phần tử đầu danh sách
b) Phần tử cuối danh sách
c) Phần tử ở giữa danh sách d) Phần tử ngẫu nhiên
Cho 1 Stack có 5 phần tử giá trị lần lượt {1,2,3,4,5}. Cho đoạn câu lệnh sau:
Push(1); Pop(); Push(2); Push(3); Pop(); Push(4); Pop(); Pop(); Push(5);
Câu 10: Số phần tử của Stack sau khi chạy đoạn lệnh trên: a. 5 b. 4 c. 3 d. Tất cả đều sai.
Câu 11: Giá trị của phần tử trên cùng (Top) của Stack: a. 3 b. 4 c. 5 d. Tất cả đều sai.
Cho 1 Queue có 5 phần tử giá trị lần lượt {1,2,3,4,5}. Cho đoạn câu lệnh sau:
Push(1); Pop(); Push(2); Push(3); Pop(); Push(4); Pop(); Pop(); Push(5);
Câu 12: Số phần tử của Queue sau khi chạy đoạn lệnh trên: a. 5 b. 4 c. 3 d. Tất cả đều sai.
Câu 13: Giá trị của phần tử đầu tiên (First) của Queue: a. 3 b. 4 c. 5 d. Tất cả đều sai.
BÀI TẬP THỰC HÀNH Bài 1:
Viết chương trình tạo 1 ngăn xếp A (Stack) và 1 hàng đợi B (Queue) chứa các giá trị số nguyên.
Cho phép người sử dụng nhập vào giá trị (10 giá trị), thêm các giá trị này vào A và B. Hiển thị
giá trị các phần tử của A và B ra màn hình. lOMoAR cPSD| 58605085
Bài 2: Viết chương trình tạo một Stack A chứa 10 giá trị số nguyên (SV tự cho các giá trị
phần tử). Cho phép người sử dụng nhập vào 1 số nguyên x. Kiểm tra xem trong A có phần tử
nào có giá trị bằng x hay không. Bài 3:
Viết chương trình tạo một Queue A chứa 10 giá trị số nguyên (SV tự cho các giá trị phần tử).
Cho phép người sử dụng nhập vào 1 số nguyên x. Tìm và đếm số lần xuất hiện của x trong A. Bài 4:
Viết chương trình cho phép người sử dụng nhập vào 1 giá trị số nguyên x. Chuyển số nguyên
x sang hệ nhị phân (Binary) sử dụng Stack. In kết quả ra màn hình. Nhập: x = 20 Hiển thị: Binary = 10100 Bài 5:
Viết câu lệnh định nghĩa hàm void Print() có chức năng in ra màn hình giá trị n phần tử đầu
tiên trong 1 Queue. Bài 6:
Viết câu lệnh định nghĩa hàm Max() có chức năng tìm giá trị phần tử lớn nhất trong một hàng đợi Queue. Bài 7:
Viết câu lệnh định nghĩa hàm void Copy() có chức năng sao chép giá trị phần tử từ 1 mảng sang 1 Stack. Bài 8:
Viết chương trình cho phép người sử dụng nhập vào 1 phép toán dưới dạng chuỗi kí tự (string).
Chuyển biểu thức sang dạng Pre-fix và Post-fix sử dụng Stack. In biểu thức sau khi chuyển đổi
ra màn hình (dưới dạng chuỗi kí tự). Nhập: A + B * (C – D) Hiển thị: Prefix: ABCD-*+ Postfix: +*DCBA
CHƯƠNG 3: CẤU TRÚC DỮ LIỆU CƠ BẢN – TREE & GRAPH
CÂU HỎI TRẮC NGHIỆM
Câu 1: Cây (Tree) là gì trong cấu trúc dữ liệu và giải thuật? lOMoAR cPSD| 58605085
a) Một tập hợp các nút liên kết với nhau theo một cấu trúc tuyến tính.
b) Một tập hợp các nút không có liên kết với nhau.
c) Một tập hợp các nút liên kết với nhau theo cấu trúc không tuyến tính.
d) Một tập hợp các nút được sắp xếp thành một dãy.
Câu 2: Trong một cây, nút không có nút con nào được gọi là gì? a) Nút gốc (Root) b) Nút lá (Leaf) c) Nút con (Child)
d) Nút trung gian (Intermediate)
Câu 3: Độ sâu của một nút trong cây là gì?
a) Số lượng nút từ nút đó đến nút gốc.
b) Số lượng nút con của nút đó.
c) Số lượng nút con của nút gốc.
d) Số lượng nút trong cây.
Câu 4: Độ cao của một cây là gì?
a) Số lượng nút từ nút gốc đến nút lá xa nhất. b) Số lượng nút trong cây.
c) Số lượng nút con của nút gốc.
d) Số lượng nút con của nút lá.
Câu 5: Loại cây nào có đặc điểm là mỗi nút có không quá hai nút con?
a) Cây nhị phân (Binary Tree)
b) Cây nhị phân tìm kiếm (BST)
c) Cây cân bằng (Balanced Tree)
d) Cây hợp nhất (Merge Tree)
Câu 6: Trong cây nhị phân, nút nào là nút nằm trên cùng của một nhánh và không có nút con? a) Nút lá (Leaf) b) Nút gốc (Root)
c) Nút trung gian (Intermediate) d) Nút cha (Parent)
Câu 7: Đồ thị (Graph) là gì trong cấu trúc dữ liệu và giải thuật?
a) Một tập hợp các đỉnh (vertex) được kết nối bởi các cạnh (edge).
b) Một tập hợp các cạnh không có đỉnh nào.
c) Một tập hợp các đỉnh không có cạnh nào.
d) Một tập hợp các đỉnh và các nút.
Câu 8: Loại đồ thị nào mà mỗi cặp đỉnh đều được kết nối bởi một cạnh không hướng? a)
Đồ thị vô hướng (Undirected Graph) b) Đồ thị có hướng (Directed Graph)
c) Đồ thị trống (Empty Graph)
d) Đồ thị đơn (Simple Graph)
Câu 9: Trong đồ thị có hướng, cạnh nào chỉ đi từ đỉnh A đến đỉnh B mà không thể đi ngược lại từ B đến A?
a) Cạnh liên kết (Connecting Edge) b) Cạnh kép (Double Edge) lOMoAR cPSD| 58605085
c) Cạnh hướng (Directed Edge)
d) Cạnh đồng hướng (Parallel Edge) Câu 10: Trong
đồ thị, một nhóm các đỉnh được kết nối với nhau bởi các cạnh được gọi là gì? a) Đồ thị con (Subgraph)
b) Đồ thị kết nối (Connected Graph)
c) Đồ thị con liên thông (Connected Subgraph) d) Đồ thị con không liên thông Câu
11: Trong cây nhị phân, nút nào là nút cha của nút con được gọi là "trái"?
a) Nút có chỉ số thấp hơn
b) Nút có chỉ số cao hơn c) Nút có chỉ số chẵn d) Nút có chỉ số lẻ
Câu 12: Cây B-Tree là một cấu trúc dữ liệu phân tán được sử dụng chủ yếu để làm gì?
a) Tìm kiếm và sắp xếp dữ liệu
b) Lưu trữ và truy xuất dữ liệu từ cơ sở dữ liệu lớn
c) Xử lý dữ liệu dạng cây
d) Tạo ra các cấu trúc dữ liệu phức tạp
Câu 13: Trong cây B-Tree, nút nào được gọi là nút gốc?
a) Nút có chỉ số thấp nhất
b) Nút có chỉ số cao nhất
c) Nút ở tầng trên cùng
d) Nút ở tầng dưới cùng
Câu 14: Trong cây B-Tree, nút nào là nút lá? a) Nút không có con
b) Nút có nhiều hơn một con
c) Nút có một con duy nhất d) Nút gốc
Câu 15: Trong cây B-Tree, khóa được sắp xếp như thế nào trong mỗi nút? a) Không cần sắp xếp b) Tăng dần c) Giảm dần d) Ngẫu nhiên
Câu 16: Trong cây nhị phân tìm kiếm, điều gì đảm bảo rằng mỗi nút trong cây có giá trị lớn hơn tất
cả các nút trong cây con bên trái và nhỏ hơn tất cả các nút trong cây con bên phải của nó? a) Thuộc
tính BST (Binary Search Tree)
b) Thuộc tính AVL (Adelson-Velsky và Landis)
c) Thuộc tính Red-Black Tree d) Thuộc tính Heap
Câu 17: Cho Graph sau, phát biểu nào là đúng?