Bài tập phần II Các cấu trúc dữ liệu cơ bản- Mảng, Danh sách liên kết, danh sách | Trường Đại học Bách khoa Hà Nộituyến tính

Cho một dãy số nguyên bất kỳ có số lượng phần tử lớn hơn 2. Hãy viết hàm find để tìm và in ra màn hình hai cặp phần tử có độ chênh lệch lớn nhất và nhỏ nhất trong dãy đã cho. Độ chệnh lệch giữa 2 số 𝑎, 𝑏 được định nghĩa. Tài liệu được sưu tầm, giúp bạn ôn tập và đạt kết quả cao. Mời bạn đọc đón xem!

Thông tin:
7 trang 4 tháng trước

Bình luận

Vui lòng đăng nhập hoặc đăng ký để gửi bình luận.

Bài tập phần II Các cấu trúc dữ liệu cơ bản- Mảng, Danh sách liên kết, danh sách | Trường Đại học Bách khoa Hà Nộituyến tính

Cho một dãy số nguyên bất kỳ có số lượng phần tử lớn hơn 2. Hãy viết hàm find để tìm và in ra màn hình hai cặp phần tử có độ chênh lệch lớn nhất và nhỏ nhất trong dãy đã cho. Độ chệnh lệch giữa 2 số 𝑎, 𝑏 được định nghĩa. Tài liệu được sưu tầm, giúp bạn ôn tập và đạt kết quả cao. Mời bạn đọc đón xem!

Bài tp phn II
Phn: Các cu trúc d liu cơ bn- Mng, Danh sách
liên kết, danh sách tuyến tính
Bài 1. Kiu d liu là gì ? cho ví d minh ha.
Bài 2. Kiu d liu tru tưng là gì? Nó khác gì so vi đnh nghĩa kiu d liu?
Bài 3. Cu trúc d liu là gì ?
Bài 4. Phân loi cu trúc d liu? So sánh đc đim ca các phân loi đó.
Bài 5. Trình bày ưu nhưc đim ca mng (bao gm c mng cp phát tĩnh và mng cp phát
động).
Bài 6. Viết hàm đ thc hin thêm phn t vào v trí sau phn t th k trong hai trưng hp :
mng, và danh sách liên kết đơn.
Bài 7. Viết hàm reverse để in ra các phn t trong danh sách liên kết đơn theo th t đảo ngưc
typedef struct Node
{
int data;
struct Node *pNext;
} NODE;
//pHead là con tr đến đu danh sách cn đo ngược
void reverse(NODE *pHead)
{
//Thân hàm
}
Ví d: vi danh sách ban đu cha các phn t {2, 27, 5, 14, 9}, thì kết qu s là 9, 14, 5, 27, 2
Hãy đánh giá thi gian thc hin thut toán ca bn theo O-ln.
Bài 8.
Hoàn hin phn thân hàm reverse để đảo ngưc danh sách liên kết đơn
typedef struct Node
{
int data;
struct Node *pNext;
} NODE;
//pHead là con tr đến đu danh sách cn đo ngưc
void reverse(NODE *&pHead)
{
//Thân hàm
}
Ví d vi danh sách ban đu cha các phn t {2, 27, 5, 14, 9}, thì kết qu s là danh sách {9, 14, 5, 27, 2}
i
Hãy đánh giá thi gian thc hin thut toán ca bn theo O-ln.
Bài 9. Viết li các hàm thc hin các thao tác chèn, tìm kiếm và xóa phn t trên danh sách liên kết
đơn dùng vòng lp thay vì dùng đ quy.
Bài 10. Viết li hàm xóa phn t trong danh sách liên kết đơn mà không cn dùng thêm các hàm
search_list, predecessor_list.
Bài 11. Cho mt dãy s nguyên bt k có s ng phn t ln hơn 2. Hãy viết hàm find để tìm và
in ra màn hình hai cp phn t có đ chênh lch ln nht và nh nht trong dãy đã cho.
Độ chnh lch gia 2 s , đưc đnh nghĩa =
|
|
//A là tên mng cha các phn t
//n là s ng phn t trong mng, n>2
void find(int A[], int n)
{
//thân hàm
}
Ví d vi dãy {1,5,3,2,7,4} thì cp phn t có chêch lch ln nht là (1, 7), cp phn t có đ
chêch lch nh nht là (2,3). Trong trưng hp có nhiu cp ch cn đưa ra 1 cp bt k tha
mãn.
Hãy đưa ra đánh giá thi gian thc hin ca thut toán ca bn theo O-ln
Bài 12. Cho mt dãy các s nguyên khác nhau đã đưc sp theo th t tăng dn. Viết chương trình
kim tra xem có tn ti phn t nào mà giá tr ca nó đúng bng v trí ca nó.
Ví d. trong dãy {−10,−3, 3, 5, 7}, ta tìm đưc a3 = 3.
Trong dãy {2, 3, 4, 5, 6, 7}, thì không tn ti phn t nào như vy
Chú ý: V trí ca phn t đưc tính bt đu t 1
Bài 13. Để biu din kiu d liu ADT xâu ký t trong máy tính ngưi ta có th làm theo nhng cách
sau
1. Lưu tr bng mng, dùng mt ký t đăc bit đ báo hiu kết thúc xâu (ký t ‘\0’). Mng phi
đưc khai báo có s phn t ti đa là ln hơn bng s ng ký t ca xâu.
2. Lưu tr bng mng, phn t đầu tiên trong mng ta dùng đ cha s ký t hin thi ca xâu
ký t, còn các phn t tiếp theo s là các ký t.
3. Dùng danh sách liên kết đ cha các ký t, kết thúc xâu khi phn t cui cùng là NULL.
Hãy nhn xét v hiu qu ca mi phương pháp theo các tiêu chí
a) Kích thưc b nh cn dùng đ lưu tr xâu ký t
b) Các ký t mà xâu có th biu din
c) Thi gian đ truy cp vào ký t th trong xâu
d) Thi gian thc hin phép chèn, xóa ký t trong xâu
Bài 14. Gi s chúng ta có con tr tr đến phn t cn xóa trong danh sách, có cách nào khác đ
xóa phn t đó khi danh sách mà không cn phi duyt danh sách đ tìm phn t đứng trưc
nó không ? Nếu có hãy mô t phương pháp ca bn.
Bài 15. Viết chương trình tìm phn t có giá tr ln nht, nh nht trong danh sách móc ni đơn.
Bài 16. Xây dng chương trình biu din đa thc
(
)
=
+


+. . +
+
vi các
thao tác cơ bn như hin th, cng, tr, nhân hai đa thc.
Bài 17. So sánh ưu nhưc đim ca mng và cu trúc liên kết khi dùng đ lưu tr kiu d liu tru
ng danh sách tuyến tính.
Bài 18. Cn phi lưu tr mt danh sách tuyến tính thông tin v khách hàng trong các ngày trong
tháng siêu th. Ta s chn cu trúc d liu nào đ lưu tr sao cho thao tác tìm kiếm là nhanh
nht và tiết kim b nh nht nếu chúng ta biết:
a) Không biết trưc s ng khách hàng ti đa
b) Biết trưc s ng khách hàng ti đa nhưng s ng khách hàng gia các ngày khác nhau biến
động rt ln
c) Biết trưc s ng khách hàng ti đa, s ng khách hàng trong các ngày chênh lch nhau
không nhiu
Các cu trúc có th đưc la chn là : Mng tĩnh, mng đng, cu trúc móc ni.
Hãy gii thích la chn ca bn trong tng trưng hp.
Bài 19. Cài đt chương trình mô phng bài toán Josephus trong slide.
Bài 20. Cho mt dãy s gm s, hãy viết chương trình in ra các phn t trong dãy theo chiu tăng
dn tn s xut hin
Ví d : dãy 1, 3, 4, 5, 7, 2, 3, 5 thì ta s in ra 1, 2, 4, 7, 3, 5
Bài 21. Cài đt các hàm thc hin thao tác thêm, xóa và tìm kiếm đi vi danh sách liên kết đôi.
Bài 22. Cài đặt các hàm thc hin thao tác thêm, xóa và tìm kiếm đi vi danh sách liên kết đôi ni
vòng (danh sách ni đôi s dng nút đu gi).
Bài 23. Viết chương trình cài đt mng đng đ lưu tr danh sách các phn t theo cách sau:
Ban đu ta cp phát b nh động là 10 phn t
Nếu mà ta phi thêm mt phn t mi khi mng đã đy thì ta gp đôi kích thưc mng
và copy toàn b các phn t ca mng cũ vào na đu mng mi, sau đó thêm phn t
mi vào mng mi.
Nếu mà xóa mt phn t mà sau khi xóa thì s phn t ca mng nh hơn 1/2 kích
thưc ca mng thì ta tiến hành to mng mi vi kích thưc bng ½ kích thưc mng
cũ. Sau đó copy toàn b các phn t mng cũ sang mng mi.
Hãy đánh giá thi gian thc hin trong trưng hp tt nht, ti nht c các thao tác thêm và
xóa phn t.
Ch ra mt trưng hp mà cách làm như vy cho kết qu rt ti. Bn có cách nào đ ci thin
hiu qu ?
Bài 24. Cho hai xâu ký t s1 và s2. Hãy viết hàm stringmatch để kim tra xem xâu ký t s2 có xut
hin trong s1 hay không. Nếu có thì tr v v trí xut hin đu tiên ca nó, ngưc li thì tr v
giá tr -1.
Ví d: s1=”AbbAbbbabbb”, s2=”ab” thì hàm stringmatch(s1,s2) s tr v giá tr 7
Hãy đánh giá hiu qu ca thut toán ca bn.
Bài 25. Trò chơi dò mìn
Gi s chúng ta mô t bãi mìn bng mt ma trn vi kích thưc × ( hàng và ct).
Nhng v trí có mìn đưc đánh du bng ký t ‘*’, còn nhng v trí không có mìn là ký t ‘.’. Hãy
xây dng mt ma trn tương đương đ t các cnh báo có mìn ca các ô xung quanh. Vi
mi ô có mìn thì ta vn biu din bng ký t ‘*’, còn nhng ô xung quanh ta biu din bng các
ch s mô t s ô có mìn mà lân cn vi nó.
đây 1 ô s lân cn vi 8 ô xung quanh
Ví d
Bãi mìn kích thưc 4 × 5 đưc biu din li như sau
Hãy xây dng hàm
Calculate(char MineField[10][10], char Output[10][10], int N, int M)
Để tính toán các giá tr cho mng Output vi đu vào là mng mô t bãi mìn MineField
1 , 10 là kích thưc thc s ca bãi mìn hin ti
Bài 26. Cho kiu d liu tru tưng tp hp vi
Các phn t ca tp hp là các s nguyên
Các phép toán ca tp hp gm :
o Member(x,S): Kim tra xem phn t x có thuc tp hp S hay không
o Union(A,B): Hp ca hai tp hp A, B, tr v mt tp hp thông qua tp
hp A, hoc B, hoc hàm
o Intersection(A,B): Giao ca hai tp hp, tr v thông qua tp hp A, hoc
B, hoc hàm
o Substract(A,B): Hiu ca hai tp hơp, tr v thông qua tp hp A, hoc B,
hoc hàm
o Insert(x,S): thêm phn t x vào tp hp S
o Delete(x,S) : loi b phn t x khi tp S (nếu x có trong S)
Hãy cài đt ADT trên s dng các phương pháp biu din
a) Mảng
b) Danh sách liên kết
c) Xâu bit (bit 1 biu din phn t có trong tp hp và bit 0 biu din phn t không có)
Chú ý: Đi vi cách biu din th 3 các phn t phi đưc biu din theo mt th t xác đnh.
Các phn t trong tp hp không trùng nhau.
Bài 27. Cho mt dãy s nguyên dương gm n s, khong cách gia hai v trí chính là đ chênh lch
v giá tr ca hai s ti v trí đó.
Ví d cho dãy gm 5 s 1, 3, 4, 3, 7. Chêch lch gia s th 1 và 4 là 3 1 = 2.
Chn mt v trí k bt trong dãy n s, tng đ chnh lch ca v trí k vi tt c 1 v trí còn li
đưc tính bng tng đ chênh lch ca s v trí ti 1 v trí còn li.
Ví d vi k=2 (s giá tr 3) thì tng đ chêch lch ng vi 2 s là 2+1+0+4=7
Hãy viết chương trình tìm v trí k sao cho có tng đ chênh lch là nh nht.
Bài 28. Viết chương trình đo nc th t các t trong mt câu đưc nhp vào t bàn phím.
Ví d. Câu đu vào là “ the quick brown fox jumps over the lazy dog
Thì kết qu hin th ra màn hình s là câu “dog lazy the over jumps fox brown quick the”
Bài 29. Nhp vào t bàn phím mt dãy s thc gm n s (0<n<100). Thc hin các công vic sau:
In ra màn hình dãy s va nhp.
Tìm và in ra màn hình các s âm trong dãy, nếu không có s nào thì in ra thông báo “Dãy
không có s âm”.
Tìm và in ra màn hình giá tr phn t dương ln nht, nh nht trong dãy.
Nhp vào mt giá tr k, xóa tt c các phàn t có giá tr ln hơn k trong dãy. In ra màn
hình dãy sau khi xóa.
Bài 30. Giáo viên ch nhim mun qun lý thông tin v tình hình hc tp ca tt c các thành viên
trong lp. Thông tin v mi thành viên gm:
H tên
Gii tính
Ngày sinh (lưu bng xâu ký t)
Địa ch
Đim trung bình c năm
Hãy xây dng mt cu trúc d liu phù hp đ lưu thông tin v các thành viên ca lp. S dng
cu trúc do bn t định nghĩa đ nhp vào 10 thành viên ca lp. Sau đó thc hin các công
vic sau:
In ra thông tin v 10 thành viên va nhp
Tìm và in ra thông tin v nhng thành viên có đim trung bình c năm nh n 4.0
In ra thông tin v thành viên có đim trung bình c năm cao nht ca lp.
Bài 31. Một ca hàng cho thuê băng đĩa mun qun lý thông tin v các băng đĩa mà ca hàng đó
cho thuê (gi s vi mi phim thì ca hàng ch có mt b đĩa duy nht). Mi mt đĩa có các
thông tin sau:
Mã s : là mt xâu ký t, mi đĩa đưc biu din bi mt xâu duy nht
Tiêu đ : thông tin v tên đĩa
Loi đĩa: là loi CD hay VCD hay DVD (gi ý: s dng s nguyên đ biu din 1-CD, 2-
VCD, 3-DVD)
Do s ng đĩa cho thuê trong tng ngày là biến đi rt nhiu, nên các ti ưu là lưu các đĩa cho
thuê bng cu trúc danh sách móc ni. Bn hãy định nghĩa cu trúc danh sách móc ni đ lưu
thông tin v các đĩa cho thuê. Thêm vào danh sách các thông tin v các đĩa đưc thuê, ví d
1. “D001”, “Kungfu panda”, “VCD”
2. “D003”, “WALL-E”,”DVD”
3. “D005”,”Earth”,”VCD”
Bây gi khác hàng thuê đĩa có mã “D003” tr, y cp nht li danh sách cho thuê, xóa nút có
thông tin v đĩa D003 đó đi (gi ý: thc hin tìm kiếm trên danh sách móc ni đ tìm D003). In
ra màn hình các đĩa đã đưc thuê trong ngày.
Bài 32. Cho các con tr sau
int *p, *q, a,b;
float *f,x;
a=5;
b=7;
x=9;
Chuyn gì s xy ra khi ta thc hin các câu lnh sau, gii thích
1. p=&a;
*p=45;
2. p=&a; q=&b;
q=p;
*q=5;
3. x=a;
f=&x;
*f=4.5;
4. f=&a;
p=f;
Bài 33. Cho các d liu ban đu như sau
int a[] = { 3, 8, -4, 6, 2, 6 };
int *p1 = a;
int *p3 = &a[5];
int *p2 =a+2;
Thc hin tun t các lnh sau, hãy cho biết ni dung ca mng a sau khi thc hin mi lnh
1. *p1=5;
2. *p2=7;
3. *p3 = *p1+*p2;
4. p1=p2-1;
5. *p1=55;
6. *(p1+3)=99;
| 1/7

Preview text:

Bài tập phần II
Phần: Các cấu trúc dữ liệu cơ bản- Mảng, Danh sách
liên kết, danh sách tuyến tính
Bài 1. Kiểu dữ liệu là gì ? cho ví dụ minh họa.
Bài 2. Kiểu dữ liệu trừu tượng là gì? Nó khác gì so với định nghĩa kiểu dữ liệu?
Bài 3. Cấu trúc dữ liệu là gì ?
Bài 4. Phân loại cấu trúc dữ liệu? So sánh đặc điểm của các phân loại đó.
Bài 5. Trình bày ưu nhược điểm của mảng (bao gồm cả mảng cấp phát tĩnh và mảng cấp phát động).
Bài 6. Viết hàm để thực hiện thêm phần tử vào vị trí sau phần tử thứ k trong hai trường hợp :
mảng, và danh sách liên kết đơn.
Bài 7. Viết hàm reverse để in ra các phần tử trong danh sách liên kết đơn theo thứ tự đảo ngược typedef struct Node { int data; struct Node *pNext; } NODE;
//pHead là con trỏ đến đầu danh sách cần đảo ngược void reverse(NODE *pHead) { //Thân hàm }
Ví dụ: với danh sách ban đầu chứa các phần tử {2, 27, 5, 14, 9}, thì kết quả sẽ là 9, 14, 5, 27, 2
Hãy đánh giá thời gian thực hiện thuật toán của bạn theo O-lớn.
Bài 8. Hoàn hiện phần thân hàm reverse để đảo ngược danh sách liên kết đơn typedef struct Node { int data; struct Node *pNext; } NODE;
//pHead là con trỏ đến đầu danh sách cần đảo ngược
void reverse(NODE *&pHead) { //Thân hàm }
Ví dụ với danh sách ban đầu chứa các phần tử {2, 27, 5, 14, 9}, thì kết quả sẽ là danh sách {9, 14, 5, 27, 2} ở dưới
Hãy đánh giá thời gian thực hiện thuật toán của bạn theo O-lớn.
Bài 9. Viết lại các hàm thực hiện các thao tác chèn, tìm kiếm và xóa phần tử trên danh sách liên kết
đơn dùng vòng lặp thay vì dùng đệ quy.
Bài 10. Viết lại hàm xóa phần tử trong danh sách liên kết đơn mà không cần dùng thêm các hàm
search_list, predecessor_list.
Bài 11. Cho một dãy số nguyên bất kỳ có số lượng phần tử lớn hơn 2. Hãy viết hàm find để tìm và
in ra màn hình hai cặp phần tử có độ chênh lệch lớn nhất và nhỏ nhất trong dãy đã cho.
Độ chệnh lệch giữa 2 số 𝑎, 𝑏 được định nghĩa là 𝑑 = |𝑎 − 𝑏|
//A là tên mảng chứa các phần tử
//n là số lượng phần tử trong mảng, n>2 void find(int A[], int n) { //thân hàm }
Ví dụ với dãy {1,5,3,2,7,4} thì cặp phần tử có chêch lệch lớn nhất là (1, 7), cặp phần tử có độ
chêch lệch nhỏ nhất là (2,3). Trong trường hợp có nhiều cặp chỉ cần đưa ra 1 cặp bất kỳ thỏa mãn.
Hãy đưa ra đánh giá thời gian thực hiện của thuật toán của bạn theo O-lớn
Bài 12. Cho một dãy các số nguyên khác nhau đã được sắp theo thứ tự tăng dần. Viết chương trình
kiểm tra xem có tồn tại phần tử nào mà giá trị của nó đúng bằng vị trí của nó.
Ví dụ. trong dãy {−10,−3, 3, 5, 7}, ta tìm được a3 = 3.
Trong dãy {2, 3, 4, 5, 6, 7}, thì không tồn tại phần tử nào như vậy
Chú ý: Vị trí của phần tử được tính bắt đầu từ 1
Bài 13. Để biểu diễn kiểu dữ liệu ADT xâu ký tự trong máy tính người ta có thể làm theo những cách sau
1. Lưu trữ bằng mảng, dùng một ký tự đăc biệt để báo hiệu kết thúc xâu (ký tự ‘\0’). Mảng phải
được khai báo có số phần tử tối đa là lớn hơn bằng số lượng ký tự của xâu.
2. Lưu trữ bằng mảng, phần tử đầu tiên trong mảng ta dùng để chứa số ký tự hiện thời của xâu
ký tự, còn các phần tử tiếp theo sẽ là các ký tự.
3. Dùng danh sách liên kết để chứa các ký tự, kết thúc xâu khi phần tử cuối cùng là NULL.
Hãy nhận xét về hiệu quả của mỗi phương pháp theo các tiêu chí
a) Kích thước bộ nhớ cần dùng để lưu trữ xâu ký tự
b) Các ký tự mà xâu có thể biểu diễn
c) Thời gian để truy cập vào ký tự thứ 𝑖 trong xâu
d) Thời gian thực hiện phép chèn, xóa ký tự trong xâu
Bài 14. Giả sử chúng ta có con trỏ trỏ đến phần tử cần xóa trong danh sách, có cách nào khác để
xóa phần tử đó khỏi danh sách mà không cần phải duyệt danh sách để tìm phần tử đứng trước
nó không ? Nếu có hãy mô tả phương pháp của bạn.
Bài 15. Viết chương trình tìm phần tử có giá trị lớn nhất, nhỏ nhất trong danh sách móc nối đơn.
Bài 16. Xây dựng chương trình biểu diễn đa thức 𝑃𝑛(𝑥) = 𝑎𝑛𝑥𝑛 + 𝑎𝑛−1𝑥𝑛−1+. . +𝑎1𝑥 + 𝑎0 với các
thao tác cơ bản như hiển thị, cộng, trừ, nhân hai đa thức.
Bài 17. So sánh ưu nhược điểm của mảng và cấu trúc liên kết khi dùng để lưu trữ kiểu dữ liệu trừu
tượng danh sách tuyến tính.
Bài 18. Cần phải lưu trữ một danh sách tuyến tính là thông tin về khách hàng trong các ngày trong
tháng ở siêu thị. Ta sẽ chọn cấu trúc dữ liệu nào để lưu trữ sao cho thao tác tìm kiếm là nhanh
nhất và tiết kiệm bộ nhớ nhất nếu chúng ta biết:
a) Không biết trước số lượng khách hàng tối đa
b) Biết trước số lượng khách hàng tối đa nhưng số lượng khách hàng giữa các ngày khác nhau biến động rất lớn
c) Biết trước số lượng khách hàng tối đa, và số lượng khách hàng trong các ngày chênh lệch nhau không nhiều
Các cấu trúc có thể được lựa chọn là : Mảng tĩnh, mảng động, cấu trúc móc nối.
Hãy giải thích lựa chọn của bạn trong từng trường hợp.
Bài 19. Cài đặt chương trình mô phỏng bài toán Josephus trong slide.
Bài 20. Cho một dãy số gồm 𝑛 số, hãy viết chương trình in ra các phần tử trong dãy theo chiều tăng
dần tần số xuất hiện
Ví dụ : dãy 1, 3, 4, 5, 7, 2, 3, 5 thì ta sẽ in ra 1, 2, 4, 7, 3, 5
Bài 21. Cài đặt các hàm thực hiện thao tác thêm, xóa và tìm kiếm đối với danh sách liên kết đôi.
Bài 22. Cài đặt các hàm thực hiện thao tác thêm, xóa và tìm kiếm đối với danh sách liên kết đôi nối
vòng (danh sách nối đôi sử dụng nút đầu giả).
Bài 23. Viết chương trình cài đặt mảng động để lưu trữ danh sách các phần tử theo cách sau:
• Ban đầu ta cấp phát bộ nhớ động là 10 phần tử
• Nếu mà ta phải thêm một phần tử mới khi mảng đã đầy thì ta gấp đôi kích thước mảng
và copy toàn bộ các phần tử của mảng cũ vào nửa đầu mảng mới, sau đó thêm phần tử mới vào mảng mới.
• Nếu mà xóa một phần tử mà sau khi xóa thì số phần tử của mảng nhỏ hơn 1/2 kích
thước của mảng thì ta tiến hành tạo mảng mới với kích thước bằng ½ kích thước mảng
cũ. Sau đó copy toàn bộ các phần tử mảng cũ sang mảng mới.
Hãy đánh giá thời gian thực hiện trong trường hợp tốt nhất, tồi nhất cả các thao tác thêm và xóa phần tử.
Chỉ ra một trường hợp mà cách làm như vậy cho kết quả rất tồi. Bạn có cách nào để cải thiện hiệu quả ?
Bài 24. Cho hai xâu ký tự s1 và s2. Hãy viết hàm stringmatch để kiểm tra xem xâu ký tự s2 có xuất
hiện trong s1 hay không. Nếu có thì trả về vị trí xuất hiện đầu tiên của nó, ngược lại thì trả về giá trị là -1.
Ví dụ: s1=”AbbAbbbabbb”, s2=”ab” thì hàm stringmatch(s1,s2) sẽ trả về giá trị 7
Hãy đánh giá hiệu quả của thuật toán của bạn.
Bài 25. Trò chơi dò mìn
Giả sử chúng ta mô tả bãi mìn bằng một ma trận với kích thước 𝑁 × 𝑀 (𝑁 hàng và 𝑀 cột).
Những vị trí có mìn được đánh dấu bằng ký tự ‘*’, còn những vị trí không có mìn là ký tự ‘.’. Hãy
xây dựng một ma trận tương đương để mô tả các cảnh báo có mìn của các ô xung quanh. Với
mỗi ô có mìn thì ta vẫn biểu diễn bằng ký tự ‘*’, còn những ô xung quanh ta biểu diễn bằng các
chữ số mô tả số ô có mìn mà lân cận với nó.
Ở đây 1 ô sẽ lân cận với 8 ô xung quanh Ví dụ
Bãi mìn kích thước 4 × 5 được biểu diễn lại như sau Hãy xây dựng hàm
Calculate(char MineField[10][10], char Output[10][10], int N, int M)
Để tính toán các giá trị cho mảng Output với đầu vào là mảng mô tả bãi mìn MineField
1 ≤ 𝑁, 𝑀 ≤ 10 là kích thước thực sự của bãi mìn hiện tại
Bài 26. Cho kiểu dữ liệu trừu tượng tập hợp với
• Các phần tử của tập hợp là các số nguyên
• Các phép toán của tập hợp gồm :
o Member(x,S): Kiểm tra xem phần tử x có thuộc tập hợp S hay không
o Union(A,B): Hợp của hai tập hợp A, B, trả về một tập hợp 𝐴 ∪ 𝐵 thông qua tập
hợp A, hoặc B, hoặc hàm
o Intersection(A,B): Giao của hai tập hợp, trả về 𝐴 ∩ 𝐵 thông qua tập hợp A, hoặc B, hoặc hàm
o Substract(A,B): Hiệu của hai tập hơp, trả về 𝐴 − 𝐵 thông qua tập hợp A, hoặc B, hoặc hàm
o Insert(x,S): thêm phần tử x vào tập hợp S
o Delete(x,S) : loại bỏ phần tử x khỏi tập S (nếu x có trong S)
Hãy cài đặt ADT trên sử dụng các phương pháp biểu diễn a) Mảng b) Danh sách liên kết
c) Xâu bit (bit 1 biểu diễn phần tử có trong tập hợp và bit 0 biểu diễn phần tử không có)
Chú ý: Đối với cách biểu diễn thứ 3 các phần tử phải được biểu diễn theo một thứ tự xác định.
Các phần tử trong tập hợp không trùng nhau.
Bài 27. Cho một dãy số nguyên dương gồm n số, khoảng cách giữa hai vị trí chính là độ chênh lệch
về giá trị của hai số tại vị trí đó.
Ví dụ cho dãy gồm 5 số 1, 3, 4, 3, 7. Chêch lệch giữa số thứ 1 và 4 là 3 − 1 = 2.
Chọn một vị trí k bất trong dãy n số, tổng độ chệnh lệch của vị trí k với tất cả 𝑛 − 1 vị trí còn lại
được tính bằng tổng độ chênh lệch của số ở vị trí 𝑘 tới 𝑛 − 1 vị trí còn lại.
Ví dụ với k=2 (số giá trị 3) thì tổng độ chêch lệch ứng với 2 sẽ là 2+1+0+4=7
Hãy viết chương trình tìm vị trí k sao cho có tổng độ chênh lệch là nhỏ nhất.
Bài 28. Viết chương trình đảo ngược thứ tự các từ trong một câu được nhập vào từ bàn phím.
Ví dụ. Câu đầu vào là “ the quick brown fox jumps over the lazy dog”
Thì kết quả hiển thị ra màn hình sẽ là câu “dog lazy the over jumps fox brown quick the”
Bài 29. Nhập vào từ bàn phím một dãy số thực gồm n số (0• In ra màn hình dãy số vừa nhập.
• Tìm và in ra màn hình các số âm trong dãy, nếu không có số nào thì in ra thông báo “Dãy không có số âm”.
• Tìm và in ra màn hình giá trị phần tử dương lớn nhất, nhỏ nhất trong dãy.
• Nhập vào một giá trị k, xóa tất cả các phàn tử có giá trị lớn hơn k trong dãy. In ra màn hình dãy sau khi xóa.
Bài 30. Giáo viên chủ nhiệm muốn quản lý thông tin về tình hình học tập của tất cả các thành viên
trong lớp. Thông tin về mỗi thành viên gồm: • Họ tên • Giới tính
• Ngày sinh (lưu bằng xâu ký tự) • Địa chỉ
• Điểm trung bình cả năm
Hãy xây dựng một cấu trúc dữ liệu phù hợp để lưu thông tin về các thành viên của lớp. Sử dụng
cấu trúc do bạn tự định nghĩa để nhập vào 10 thành viên của lớp. Sau đó thực hiện các công việc sau:
• In ra thông tin về 10 thành viên vừa nhập
• Tìm và in ra thông tin về những thành viên có điểm trung bình cả năm nhỏ hơn 4.0
In ra thông tin về thành viên có điểm trung bình cả năm cao nhất của lớp.
Bài 31. Một cửa hàng cho thuê băng đĩa muốn quản lý thông tin về các băng đĩa mà cửa hàng đó
cho thuê (giả sử với mỗi phim thì của hàng chỉ có một bộ đĩa duy nhất). Mỗi một đĩa có các thông tin sau:
• Mã số : là một xâu ký tự, mỗi đĩa được biểu diễn bởi một xâu duy nhất
• Tiêu đề : thông tin về tên đĩa
• Loại đĩa: là loại CD hay VCD hay DVD (gợi ý: sử dụng số nguyên để biểu diễn 1-CD, 2- VCD, 3-DVD)
Do số lượng đĩa cho thuê trong từng ngày là biến đổi rất nhiều, nên các tối ưu là lưu các đĩa cho
thuê bằng cấu trúc danh sách móc nối. Bạn hãy định nghĩa cấu trúc danh sách móc nối để lưu
thông tin về các đĩa cho thuê. Thêm vào danh sách các thông tin về các đĩa được thuê, ví dụ
1. “D001”, “Kungfu panda”, “VCD”
2. “D003”, “WALL-E”,”DVD”
3. “D005”,”Earth”,”VCD”
Bây giờ khác hàng thuê đĩa có mã “D003” trả, hãy cập nhật lại danh sách cho thuê, xóa nút có
thông tin về đĩa D003 đó đi (gợi ý: thực hiện tìm kiếm trên danh sách móc nối để tìm D003). In
ra màn hình các đĩa đã được thuê trong ngày.
Bài 32. Cho các con trỏ sau int *p, *q, a,b; float *f,x; a=5; b=7; x=9;
Chuyện gì sẽ xảy ra khi ta thực hiện các câu lệnh sau, giải thích 1. p=&a; *p=45; 2. p=&a; q=&b; q=p; *q=5; 3. x=a; f=&x; *f=4.5; 4. f=&a; p=f;
Bài 33. Cho các dữ liệu ban đầu như sau
int a[] = { 3, 8, -4, 6, 2, 6 }; int *p1 = a; int *p3 = &a[5]; int *p2 =a+2;
Thực hiện tuần tự các lệnh sau, hãy cho biết nội dung của mảng a sau khi thực hiện mỗi lệnh 1. *p1=5; 2. *p2=7; 3. *p3 = *p1+*p2; 4. p1=p2-1; 5. *p1=55; 6. *(p1+3)=99;