You are on page 1of 9

IT003 – Cấu trúc dữ liệu và giải thuật

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN CHUỖI TRAINING GIỮA KÌ
KHOA HỆ THỐNG THÔNG TIN HỌC KỲ II – Năm học 2021 - 2022
KHOA KHOA HỌC VÀ KĨ THUẬT THÔNG TIN Môn thi: Cấu trúc dữ liệu và giải thuật
Thời gian: 75 phút
ĐỀ THI THỬ Mã đề thi: 001
Đề thi có 03 bài tự luận, gồm 02 trang

Câu 1 (2.5 điểm):

a. Hãy trình bày ý tưởng giải thuật tìm kiếm tuyến tính và cho biết độ phức tạp của
giải thuật (1 điểm)
b. Trình bày các bước (vẽ từng bước) giải thuật tìm kiếm tuyến tính thực hiện tìm
kiếm giá trị X = 24 trong mảng số nguyên có 6 phần tử: 1, 90, 23, 50, 16, 2000
(1.5 điểm)

Câu 2 (3.5 điểm):

Trường Đại học A cần quản lí điểm của một lớp sinh viên gồm N thành viên (1<N<100) ,
với các thông tin như: Mã số sinh viên, họ và tên, giới tính (1: nam, 2: nữ), lớp, điểm
trung bình chung (thang điểm 10).

a. Định nghĩa các cấu trúc dữ liệu lưu danh sách các sinh viên với những thông tin
trên, sử dụng cấu trúc danh sách liên kết đơn. (0.5 điểm)
b. Viết hàm nhập vào danh sách điểm tổng kết của M sinh viên từ bàn phím
(0<M<N), sử dụng cấu trúc dữ liệu ở câu 2a. Biết rằng, khi nhập vào thông tin
sinh viên sẽ thêm vào đầu danh sách (1.5 điểm)
c. Viết hàm xuất danh sách thành viên của lớp, mỗi thành viên xuất riêng thành từng
dòng. (0.5 điểm)
d. Viết hàm tìm kiếm số sinh viên có điểm trung bình là X trong danh sách với X
được nhập từ bàn phím. Nếu có thì in ra số học sinh được X điểm, nếu không thì
in ra “None”. (1 điểm)
Câu 3 (4 điểm):
Cho xâu S gồm các ký tự: ‘(’ , ‘{’ , ‘[’ , ‘]’ , ‘}’, ‘)’.
Hãy xây dựng và sử dụng cấu trúc ngăn xếp (stack) với các yêu cầu sau:
a. Định nghĩa cấu trúc ngăn xếp để lưu trữ xâu S (0.5 điểm).
b. Viết các hàm thao tác với cấu trúc ngăn xếp trong câu 3a: push, pop, kiểm tra
stack rỗng, lấy phần tử ở đỉnh của stack, đếm số phần tử trong stack.
(2.5 điểm)
BHT Khoa HTTT
BHT Khoa KH&KTTT Mã đề 001 – Trang 1
IT003 – Cấu trúc dữ liệu và giải thuật
c. Viết hàm nhập vào xâu S gồm có N kí tự. Sử dụng cấu trúc và các hàm đã được
định nghĩa ở câu 3a và 3b để kiểm tra xem S có phải dãy ngoặc đúng hay không?
Kết quả trả về là true nếu đúng và false nếu sai (Biết rằng cặp ngoặc được coi là
phù hợp nếu dấu ngoặc mở xuất hiện ngay bên trái dấu ngoặc đúng). (1 điểm)
Ví dụ mẫu:
(1) ({[)]}: sai
(2) (]: sai
(3) )()[](: sai
(4) ()[]{}: đúng
(5) (){{[(([{(())}]))]}}: đúng

Hết

Họ và tên: …………………………………………… MSSV: ……………………………

(Thí sinh không được phép sử dụng tài liệu. CBCT không giải thích gì thêm)

BHT Khoa HTTT


BHT Khoa KH&KTTT Mã đề 001 – Trang 2
IT003 – Cấu trúc dữ liệu và giải thuật

ĐÁP ÁN THAM KHẢO ĐỀ 1A

Câu 1 (2.5 điểm):

a. Hãy trình bày ý tưởng giải thuật tìm kiếm tuyến tính và cho biết độ phức tạp của
giải thuật (1 điểm)
- Ý tưởng giải thuật (0.5 điểm): Xuất phát từ đầu mảng/danh sách để tìm kiếm
một phần tử X cho trước bằng cách duyệt lần lượt từng phần tử của mảng/danh
sách đó. Tại từng vị trí thực hiện so sánh với giá trị cần tìm. Nếu bằng nhau thì
thông báo có giá trị cần tìm và kết thúc. Nếu không bằng thì tiếp tục so sánh
đến khi nào tìm được giá trị X. Nếu duyệt hết mảng/danh sách không có thì
thông báo không tồn tại X và kết thúc.
- Độ phức tạp thuật toán (0.5 điểm): O(N)
b. Trình bày các bước (vẽ từng bước) giải thuật tìm kiếm tuyến tính thực hiện tìm
kiếm giá trị X = 24 trong mảng số nguyên có 6 phần tử: 1, 90, 23, 50, 16, 2000
(1.5 điểm)
Mỗi bước thực hiện đúng được 0.25 điểm
Mảng A:
1 90 23 50 16 2000

- Bước 1: i = 0, so sánh A[i] với X = 24, A[0] = 1 != X = 24, chuyển qua xét
phần tử tiếp theo trong mảng A, i = i + 1.
- Bước 2: i = 1, so sánh A[i] với X = 90, A[0] = 1 != X = 24, chuyển qua xét
phần tử tiếp theo trong mảng A, i = i + 1.
- Bước 3: i = 2, so sánh A[i] với X = 23, A[0] = 1 != X = 24, chuyển qua xét
phần tử tiếp theo trong mảng A, i = i + 1.
- Bước 4: i = 3, so sánh A[i] với X = 50, A[0] = 1 != X = 24, chuyển qua xét
phần tử tiếp theo trong mảng A, i = i + 1.
- Bước 5: i = 4, so sánh A[i] với X = 16, A[0] = 1 != X = 24, chuyển qua xét
phần tử tiếp theo trong mảng A, i = i + 1.
- Bước 6: i = 5, so sánh A[i] với X = 2000, A[0] = 1 != X = 24. Đã xét phần tử
cuối cùng trong mảng, thông báo không có X trong mảng.

Câu 2 (3.5 điểm):

Trường Đại học A cần quản lí điểm của một lớp sinh viên gồm N thành viên (1<N<100) ,
với các thông tin như: Mã số sinh viên, họ và tên, giới tính (1: nam, 2: nữ), lớp, điểm
trung bình chung (thang điểm 10).

BHT Khoa HTTT


BHT Khoa KH&KTTT Mã đề 001 – Trang 3
IT003 – Cấu trúc dữ liệu và giải thuật
a. Định nghĩa cấu trúc dữ liệu lưu danh sách các thông tin trên, sử dụng cấu trúc
danh sách liên kết. (0.5 điểm)
*Có nhiều cách định nghĩa, miễn đúng đều được trọn điểm.
*Định nghĩa được struct List (+0.25 điểm), định nghĩa được struct chứa thông
tin (+0.25 điểm)
struct ThongTin
{
string MSSV, HoTen, Lop;
int GioiTinh;
double DTB;
};

struct Node
{
ThongTin data;
Node *pNext;
};

struct List
{
Node *pHead = NULL;
Node *pTail = NULL;
};

b. Viết hàm nhập vào danh sách điểm tổng kết của M sinh viên từ bàn phím
(0<M<N), sử dụng cấu trúc dữ liệu ở câu 2a. Biết rằng, khi nhập vào thông tin
sinh viên sẽ thêm vào đầu danh sách (1.5 điểm)
*Viết được hàm thêm vào đầu danh sách (+0.75 điểm)
*Viết được hàm nhập (+0.75 điểm, viết hàm CreateNode trong hàm nhập nếu
đúng vẫn tính trọn điểm)
Node *Create_node(ThongTin x)
{
Node *p = new Node;
if (p == NULL)
return NULL;
p->data = x;
p->pNext = NULL;
return p;
}
BHT Khoa HTTT
BHT Khoa KH&KTTT Mã đề 001 – Trang 4
IT003 – Cấu trúc dữ liệu và giải thuật

void add_first_node(List &list, Node *p)


{
if(list.pHead == NULL)
list.pHead = list.pTail = p;
else
{
p->pNext = list.pHead;
list.pHead = p;
}
}

void Nhap(List &list)


{
int n;
do {
cout << "So luong hoc sinh: ";
cin >> n;
} while (n < 0 || n > 100);

cout << "Nhap thong tin n hoc sinh: ";


for (int i = 0; i < n; i++)
{
ThongTin x;
cout << "Nhap MSSV: ";
cin.ignore();
getline(cin, x.MSSV);
cout << "Nhap ho ten: ";
getline(cin, x.HoTen);
cout << "Nhap gioi tinh (1: nam, 2: nu): ";
cin >> x.GioiTinh;
cin.ignore();
cout << "Nhap lop: ";
getline(cin, x.Lop);
cout << "Nhap DTB: ";
cin >> x.DTB;
Node *p = Create_node(x);
add_first_node(list, p);
}
}

BHT Khoa HTTT


BHT Khoa KH&KTTT Mã đề 001 – Trang 5
IT003 – Cấu trúc dữ liệu và giải thuật
c. Viết hàm xuất danh sách thành viên của lớp, mỗi thành viên xuất riêng thành từng
dòng. (0.5 điểm)
void Xuat(List list)
{
for(Node* p = list.pHead; p!=NULL; p=p->pNext)
cout << p->data.MSSV << "\t"
<< p->data.HoTen << "\t"
<< p->data.GioiTinh << "\t"
<< p->data.Lop << "\t"
<< p->data.DTB << endl;
}

d. Viết hàm tìm kiếm số sinh viên có điểm trung bình là X trong danh sách với X
được nhập từ bàn phím. Nếu có thì in ra số học sinh được X điểm, nếu không thì
in ra “None”. (1 điểm)
void tim_diem_tong_ket(List list)
{
double diem, Count;
cout << "Nhap diem can tim: ";
cin >> diem;

for (Node* p = list.pHead; p!=NULL; p=p->pNext)


if (p->data.DTB == diem)
Count++;

if(Count == 0)
cout << "None";
else
cout << "Co " << Count << "sinh vien duoc " << diem;
}

Câu 3 (4 điểm):
Cho xâu S gồm các ký tự: ‘(’ , ‘{’ , ‘[’ , ‘]’ , ‘}’, ‘)’.
Hãy xây dựng và sử dụng cấu trúc ngăn xếp (stack) với các yêu cầu sau:

BHT Khoa HTTT


BHT Khoa KH&KTTT Mã đề 001 – Trang 6
IT003 – Cấu trúc dữ liệu và giải thuật

a. Định nghĩa cấu trúc ngăn xếp để lưu trữ xâu S (0.5 điểm).
*Có thể dùng mảng / danh sách liên kết để lưu trữ xâu S
Mảng DSLK
struct Stack struct Node
{ {
char a[1000]; char info;
int n; Node* pNext;
}; };
struct List{
Node* pHead;
};

b. Viết các hàm thao tác với cấu trúc ngăn xếp trong câu 3a: khởi tạo, push, pop,
kiểm tra stack rỗng, lấy phần tử ở đỉnh của stack, đếm số phần tử trong stack.
(2.5 điểm)
*Với mỗi hàm đúng: +0,5 điểm
*Tham số truyền vào sai giữa tham trị / tham chiếu trong khởi tạo, push, pop
=> -0.5 điểm
Mảng DSLK
void Init(Stack &s) void createStack(List& l)
{ {
s.n = 0; l.pHead = NULL;
} }
Node* CreateNode(char x)
bool empty(Stack s) {
{ Node* p = new Node();
return (s.n==0); //(hoặc s.n==-1) if (p == NULL)
} return NULL;
p->info = x;
char top(Stack s) p->pNext = NULL;
{ return p;
return s.a[s.n-1]; }
}
bool isEmpty(List l)
void push(Stack &s, char data) {
{ return (l.pHead == NULL)
s.a[s.n++] = data; }
}
void Push(List &l , char x)
char pop(Stack &s) {
{ Node* p = CreateNode(x);

BHT Khoa HTTT


BHT Khoa KH&KTTT Mã đề 001 – Trang 7
IT003 – Cấu trúc dữ liệu và giải thuật

return s.a[--s.n]; if (isEmpty(l))


} l.pHead = p;
else
int SoLuong(Stack s) {
{ p->pNext = l.pHead;
return s.n; //(hoặc s.n-1); l.pHead = p;
} }
}

char Pop(List& l)
{
char x;
Node* p;
p = l.pHead;
x = p->info;
l.pHead = l.pHead->pNext;
delete p;
return x;
}

char top(List& l)
{
return l.pHead->info;
}

int SoLuong(List l)
{
int sl = 0;
for(Node*p = l.pHead; p != NULL;
p = p -> pNext)
sl++;
return sl;
}

c. Viết hàm nhập vào xâu S gồm N phần tử. Sử dụng cấu trúc và các hàm đã được
định nghĩa ở câu 3a và 3b để kiểm tra xem S có phải dãy ngoặc đúng hay không?
Kết quả trả về là true nếu đúng và false nếu sai (Biết rằng cặp ngoặc được coi là
phù hợp nếu dấu ngoặc mở xuất hiện ngay bên trái dấu ngoặc đúng). (1 điểm)
Ví dụ:
(1) ({[)]}: sai
(2) (]: sai
(3) )()[](: sai
BHT Khoa HTTT
BHT Khoa KH&KTTT Mã đề 001 – Trang 8
IT003 – Cấu trúc dữ liệu và giải thuật

(4) ()[]{}: đúng ()[]{}


(5) (){{[(([{(())}]))]}}: đúng
*Có thể dùng char* thay thế string.
*Nếu hướng giải quyết khác vẫn đúng thì vẫn cho trọn điểm.
*Chú ý: Phải xét đến trường hợp size lẻ => không thoả điều kiện. (-0.25 điểm
nếu thiếu)
Mảng DSLK
bool isBalanced(Stack &st, string s) { bool isBalanced(string x, List l)
if(s.size() % 2 != 0) {
return 0; if (x.length() % 2 == 0)
for (int i = 0; i < s.size(); i++) { {
if (s[i] == '(' || s[i] == '[' || s[i] == for (int i=0; i<x.length(); i++) {
'{') if (x[i] == '(' || x[i] == '[' || x[i]
push(st, s[i]); == '{')
else if (s[i] == ')' && pop(st) != '(') Push(l, x[i]);
return 0;
else if (s[i] == ']' && pop(st) != '[') else if (x[i] == ')' && Pop(l) !=
return 0; '(')
else if (s[i] == '}' && pop(st) != return 0;
'{') else if (x[i] == ']' && Pop(l) !=
return 0; '[')
} return 0;
return 1; else if (x[i] == '}' && Pop(l) !=
} '{')
return 0;
}
return 1;
}
return 0;
}

**Lưu ý: Nếu viết thiếu dấu “;” hoặc cặp dấu “{}” dẫn đến sai lỗi cú pháp => -0.25
điểm / trường hợp.

HẾT

BHT Khoa HTTT


BHT Khoa KH&KTTT Mã đề 001 – Trang 9

You might also like