Đề và đáp án kỳ thi cao học môn Kỹ thuật lập trình Học viện công nghệ bưu chính viễn thông. Đề và đáp án kỳ thi cao học môn Kỹ thuật lập trình Học viện công nghệ bưu chính viễn thông.Đề và đáp án kỳ thi cao học môn Kỹ thuật lập trình Học viện công nghệ bưu chính viễn thông.Đề và đáp án kỳ thi cao học môn Kỹ thuật lập trình Học viện công nghệ bưu chính viễn thông.
Trang 1HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
CƠ SỞ TP HỒ CHÍ MINH
ĐỀ VÀ ĐÁP ÁN KỲ THI TUYỂN SINH CAO HỌC
Câu 1 Cho trước số tự nhiên N Hãy tìm tất cả các ước số nguyên tố của nó
printf ("n=") ; scanf ("%d", &n);
int j=0; int i=2;
Đáp án:
+ Duyệt dãy và chuyển các phần tử khác không về đầu dãy
+ Điền 0 vào các phần tử còn lại
Trang 2Câu 3 Giả sử ta có 20000 số nguyên phân biệt khác nhau (các số nguyên đó có trị từ
a Hãy trình bày cách lưu trữ và thuật toán sắp xếp dãy trên theo thứ tự tăng dần sao cho ít tốn bộ nhớ trong nhất và sắp xếp nhanh nhất (1đ)
b Cài đặt thuật toán đã trình bày ở câu a (1đ)
c Viết chương trình con liệt kê dãy đã được sắp ra màn hình (1đ)
Đáp án :
a Vì các số nguyên phân biệt khác nhau và có miền giá trị từ 1 đến 30000 nên ta chọnphương án lưu trữ 1 số nguyên trên 1 bit, và số bytes cần thiết để lưu trữ 20000 số nguyên này là 30000/8 = 3750 bytes Do đó, ta đã giảm 40000 bytes xuống còn 3750 bytes Ta quy ước cách lưu trữ số nguyên trên bit như sau : (các bit được đánh số từ 0
1 0 0 0 1 1 1 1 * 1 0 1 0 1 1 1 1* … * ……
Nếu số nguyên = 1 thì ta bật bit thứ 0 của byte 0
Nếu số nguyên = 5 thì ta bật bit thứ 4 của byte 0
………
Nếu số nguyên = 11 thì ta bật bit thứ 2 của byte 1
Với cách quy ước này thì rõ ràng sau khi ta đã lưu 20000 số vào 3750 bytes thì dãy đã có thứ tự tăng dần, nên thời gian sắp xếp dãy là bằng 0
Ghi chú: Dấu * là dấu hiệu cho ta biết qua byte kế tiếp
const int MAX = 32000;
const SO_BYTE = MAX/8;
unsigned char A[SO_BYTE];
void TaoDay(unsigned char A[])
{
int so;
int byte, bit;
unsigned char mask [8] = {0x80,0x40,0x20,0x10,8,4,2,1};
for (int i=0; i<SO_BYTE; i++) A[i]=0 ;
Trang 3if ( (A[byte] & mask[bit]) == 0)
{ unsigned int mask = 0x80;
printf("\n SO DA DUOC SAP :\n");
for (int i=0; i<SO_BYTE; i++)
Trang 4a Bạn hãy đưa ra 1 cách thức lưu trữ 2000 điểm trên sao cho ít tốn bộ nhớ hơn.Viết khai báo và chương trình con để lưu trữ 1 điểm x tại vị trí (i,j) trong bảnđồ (1.5đ)
b Viết chương trình con để xác định điểm nào (trong số 2000 điểm) được lưutrữ tại vị trí (cot i,dong j) theo cách thức lưu trữ mà bạn đề nghị trong câu a.Nếu không có điểm nào được lưu trữ tại vị trí (i,j) thì chương trình con sẽ trả
Đáp án:
int FirstInCol [201] ; // FirstInCol [i+1]- FirstInCol [i] cho biết có bao nhiêu điểm trênbản đồ nằm trên cột i và điểm đầu tiên ở tọa độ (cột, dòng) = (i, Row[FirstInCol[i]])int Value [2000] : chứa giá trị điểm
int Row [2000] : chứa vị trí dòng của điểm có cột thuộc FirstInCol
Đáp án:
Trang 5long Tong_Vecto_con(int A[], int n)
Trang 6HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
CƠ SỞ TP HỒ CHÍ MINH
ĐỀ VÀ ĐÁP ÁN KỲ THI TUYỂN SINH CAO HỌC
Câu 1 Trong mảng A[1:n] (với n khá lớn) chỉ chứa các số 0,1, và 2 Hốn vị các phần tử
của mảng, sao cho đầu mảng chứa các số 1, sau đĩ là các số 2, cuối mảng là các số 0.Lưu ý : Khơng được dùng mảng phụ
Trang 7for ( i=1 ; i<=B[1] ; i++) A[i]=1 ;
for ( i=1 ; i<=B[2] ; i++) A[B[1]+i]=2 ;
for ( i=1 ; i<=B[0] ; i++) A[ B[1]+B[2]+i]=0 ;
}
Câu 2 Một mảng chứa N cặp số thực (ai, bi) tương ứng với N đường thẳng yi = aix+bi.Các đường được sắp xếp theo đoạn [0,1] trên trục x với ý nghĩa sau: yi<yi+1 với mọi giátrị i giữa 0 và N-2, và với mọi giá trị của x trên đoạn [0,1]:
Trình bày thuật toán và viết chương trình con để xác định nhanh 2 đường gần nhất
“bao quanh” điểm P(xP,yP) , với P là điểm cho trước và 0 xP 1
Trang 8tại điểm xP, đường thẳng này sẽ cắt N đường thẳng trong dãy A tại N vị trí Do tínhchất yi<yi+1 với mọi giá trị i giữa 0 và N-2, do đó ta có dãy Y tăng dần
- Aùp dụng thuật toán tìm nhị phân để tìm yP trên dãy Y tăng dần, ta sẽ có kết quảcủa đề bài
- Kết quả : có 4 trường hợp nghiệm :
Nếu P nằm ngay trên 1 đường thẳng Y[i] thì trả về i
Nếu yP < Y0 : trả về 0
Nếu yP < YN-1 : trả về N-1
Nếu P không thỏa 3 trường hợp trên thì trả về i , i+1 với Y[i] < yP < Y[i+1]
Câu 3 Cho trước 1 dãy khĩa A[1:n] thuộc kiểu số nguyên Hãy trình bày cách thức lưu
trữ và thuật tốn để cĩ thể tìm nhanh 1 khĩa k cĩ trong dãy khĩa hay khơng ?
Lưu ý: Dãy chưa được sắp thứ tự
Đáp án: Ta dùng hàm băm A[i] % 101 với phương pháp nối kết trực tiếp để lưu trữ dãy khĩa này
const M = 101 ;
typedef struct node {
int key; // khóaint dc ; // địa chỉ của khóa key trong Astruct node * next ;
Trang 9Bước 2: Chuyển các khóa vào mảng băm:
for (int i=0; i<n ; i++)
Insert_First(A[i], i, A[i] % M]
Bước 3: Tìm kiếm 1 khóa k trong bảng băm: nếu tìm thấy thì hàm sẽ trả về đ/c của
phần tử chứa khóa, nếu không tìm thấy thì trả về -1
int Search (int k, ref heads[]) {
Câu 4 Cho trước mảng 2 chiều A[1:n][1:n], mỗi phần tử của nĩ bằng 0, 1, 5 hoặc 11
Hãy tính số lượng các bộ bốn A[i,j], A[i+1,j], A[i, j+1], A[i+1, j+1] trong đĩ các phần tử đều khác nhau
Trang 10Đáp án: Duyệt mảng 2 chiều, với mỗi i,j ta so sánh
if (A[i ][j]+ A[i+1][j]+ A[i] [j+1]+ A[i+1][ j+1]==17) dem ++;
Câu 5 Cho1 đồ thị G có hướng Đồ thị có tối đa MAX đỉnh Các đỉnh được đánh số từ
0 đến n –1, với n là số đỉnh thực tế của đồ thị (0 < n MAX)
a Viết khai báo để lưu trữ đồ thị G trên theo cấu trúc ma trận kề
b Viết chương trình con để xác định đồ thị có đường đi từ đỉnh u đến đỉnh v hay không?
Đáp án
a) Khai báo để lưu trữ 1 đồ thị G có hướng có trọng số theo cấu trúc ma trận kề
const MAX = 50; // Số đỉnh tối đa của đồ thị
typedef int Dothi[MAX][MAX] ;
Dothi G ;
int n ; // số đỉnh thực tế trong G;
b) Chương trình con xác định đồ thị có đường đi từ đỉnh u đến đỉnh v hay khôngThuật toán:
- Ta dùng thuật toán WarShall để tìm bao đóng BD của của đồ thị G
- Nếu trong mảng 2 chiều BD mà BD [u][v] != 0 nghĩa là sẽ có 1 đường đi từ đỉnh
u đến đỉnh v, và ngược lại
Chương trình:
void WarShall( int G[][MAX], int n, int u, int v)
{
int i,j,k, dem;
int C[MAX][MAX], P[MAX][MAX];
int BD[MAX][MAX]; // bao dong cua ma tran G
for( i=0; i<n;i++) // P1
Trang 11for (k=0; k<n; k++) C[i][j]= C[i][j] || (P[i][k] && G[k][j]); }
cout << “Co duong di tu dinh “ << u << “den dinh “ << v ;
else cout << “Khong co duong di tu dinh “ << u << “den dinh “ << v; }
HẾT
Trang 12-HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
CƠ SỞ TP HỒ CHÍ MINH
ĐỀ VÀ ĐÁP ÁN KỲ THI TUYỂN SINH CAO HỌC
Câu 1: Hãy cho biết kết quả thực hiện của chương trình dưới đây.
#include <stdio.h>
#include <conio.h>
#include <string.h>
char str[255]="AB1 AB2 AB3 AB4 AB5 AB6 AB7 AB8 AB9 AC1 AC2 AC3 AC4 AC5 AC6 \
AC7 AC8 AC9 AD1 AD2 AD3 AD4 AD5 AD6 AD7";
default:
s[k++]=str[i]; break;
} }
}
Câu 2: Cho dãy gồm n số tự nhiên phân biệt a 1 , a 2 , , a n (n 1000); và hai số tự nhiên k (k<n)
và B Hãy liệt kê tất cả các dãy con k phần tử của dãy số {a n } sao cho tổng các phần tử của dãy con đĩ đúng bằng B Dữ liệu vào cho bởi file Data.in theo khuơn dạng như sau:
Dịng đầu tiên ghi lại các số tự nhiên n, k và B Hai số khác nhau được viết cách nhau bởi
một vài ký tự trống
Dịng kế tiếp ghi lại n số nguyên dương a 1 , a 2 , ,a n Hai số khác nhau được viết cách nhau
bởi một vài ký tự trống
Trang 13Các dãy con k phần tử tìm được ghi lại trong file Ketqua.out theo khuôn dạng sau:
Dòng đầu tiên ghi lại một số tự nhiên m là số các dãy con k phần tử của dãy {a n } có tổng các phần tử đúng bằng B.
m dòng tiếp ghi lại trên mỗi dòng là một dãy con k phần tử của dãy {a n } có tổng các phần
tử đúng bằng B Hai phần tử khác nhau của dãy con được viết cách nhau bởi một vàikhoảng trống
Ví dụ : Với file Data.in dưới đây sẽ cho ta file Ketqua.out tương ứng
Câu 3: Ta định nghĩa một từ là dãy các kí tự không chứa khoảng trống (space), dấu tab, dấu
xuống dòng (‘\n’), dấu về đầu dòng (‘\r’) và dấu kết thúc dòng (‘\0’) Cho hai file văn bảnData1.in và Data2.in
Hãy tìm tập các từ xuất hiện trong file Data1.in nhưng không xuất hiện trong file Data2.in.Các từ tìm được ghi lại trong file Ketqua.out theo khuôn dạng sau:
Dòng đầu tiên ghi lại số tự nhiên k là số từ xuất hiện trong file Data1.in nhưng không xuất
hiện trong file Data2.in;
k dòng kế tiếp, mỗi dòng ghi lại một từ xuất hiện trong file Data1.in nhưng không xuất
hiện trong file Data2.in
Ví dụ dưới đây sẽ minh họa cho các file dữ liệu vào và file kết quả của bài toán
Câu 4: Cho một danh sách liên kết với con trỏ đầu là First nhằm quản lý danh sách các
sinh viên trong một trường Mỗi sinh viên có các thông tin sau đây: masv (mã sinh viên tối đa 8 ký tự), ho (họ - tối đa 40 ký tự), ten (tên - tối đa 10 ký tự), gt (giới tính - tối đa
-3 ký tự), malop (mã lớp - tối đa 8 ký tự) và được khai báo theo kiểu cấu trúc:
typedef struct SINHVIEN {
char masv [8]; char ho [40];
char ten[10]; char gt [3] ; char malop [8];
AE AF AG AH
Trang 14a Viết chương trình con tạo một danh sách chứa các phần tử, mỗi phần tử chứathông tin sau: masv (mã sinh viên) của một sinh viên trong danh sách liên kếtFirst, diachi (địa chỉ) chứa địa chỉ vùng nhớ tương ứng với sinh viên có mãmasv trong danh sách sinh viên.
b Viết chương trình con sắp xếp danh sách sinh viên tăng dần theo mã sinh viênmasv sao cho ta có thể đưa danh sách sinh viên mới sắp xếp này quay trở lại trật
tự ban đầu như khi nhập liệu
Câu 5: Cho đồ thị vô hướng G có n đỉnh với các đỉnh được đánh số từ 1 đến n theo cấu trúc ma
trận kề sau đây:
const MAX = 50; // Số đỉnh tối đa của đồ thị
typedef int Dothi[MAX][MAX] ;
Dothi G ;
int n; // số đỉnh của đồ thị G
Hãy viết chương trình con để xác định đồ thị G có đường đi từ đỉnh u đến đỉnh v hay không?
Ghi chú: Cán bộ coi thi không giải thích gì thêm
ĐÁP ÁN
Câu 1 Tách chuỗi thành các từ
2,0
0.5đ0.5đ0.5đ0.5đ
printf("\n Day so:");
for(int i=1; i<=n; i++){
Trang 15int Find_Word( w *tu, int wn, w temp){
for(int i=1; i<=wn; i++){
Trang 16int Tim_Tap_Tu(char *name, w tu[] ){
- Tìm tập hiệu các từ và ghi kết quả đúng khuôn dạng
int Find_Word_File1_In_File2(char *s, w *tu, int n){
for(int i=1; i<=n; i++){
Trang 17for ( p= First, n=0 ; p <> NULL; p=p->next) n++ ;
Index = new PhanTu [n];
for ( int i=0, p=First ; p <> NULL ; p= p->next, i++)
1đ
Câu 5:
typedef int Dothi[MAX][MAX] ;
Ta dùng thuật toán DFS duyệt đồ thị từ đỉnh u, trong quá trình duyệt nếu tìm
thấy đỉnh v thì trả về 1 Nếu kết thúc DFS mà vẫn không thấy v thì trả về 0
int DFS(Dothi G, int n, int u, int v)
{
int *C = new int [n+1] ; // de danh dau cac dinh da di qua
2.0đ
Trang 18int *Stack= new int [n] ; // Stack de chua cac dinh trong khi
duyet
int sp ;
int i,x ;
for (i=1; i<=n; C[i++] =0 );
for (i=1; i <= n; i++) // dua tat ca cac nut chua duyet tu x vao C
if (G[x][i] && C[i]==0)
Trang 19HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
CƠ SỞ TP HỒ CHÍ MINH
ĐỀ VÀ ĐÁP ÁN KỲ THI TUYỂN SINH CAO HỌC
MÔN THI : KỸ THUẬT LẬP TRÌNH
Câu 1: Hãy cho biết kết quả thực hiện của chương trình dưới đây:
else
if (d >= 10 && d <= 36)
s[++n] = 'A' + (d-10);
else s[++n]= 'a' + (d-26);
printf("\n Ket qua buoc %d:%c", ++count, s[n]);
} while(k!=0);
printf("\n Ket qua buoc %d:",++count);
for(int i=n; i >= 1; i )
printf("%3c",s[i]);
}
Câu 2: Cho dãy gồm n số tự nhiên phân biệt a 1 , a 2 , , a n (n 1000) và số tự nhiên B Hãy liệt
kê tất cả các dãy con của dãy số {a n } sao cho tổng các phần tử của dãy con đĩ đúng bằng B Dữ
liệu vào cho bởi file data.in theo khuơn dạng như sau:
Dịng đầu tiên ghi lại hai số tự nhiên n và B Hai số được viết cách nhau bởi một vài
khoảng trống
Dịng kế tiếp ghi lại n số nguyên dương a 1 , a 2 , ,a n Hai số khác nhau được viết cách nhau
bởi một vài ký tự trống
Trang 20Các dãy con tìm được ghi lại trong file Ketqua.out theo khuôn dạng sau:
Dòng đầu tiên ghi lại số tự nhiên k là số các dãy con của dãy {a n } có tổng các phần tử đúng bằng B.
k dòng tiếp theo mỗi dòng ghi lại là một dãy con của dãy {a n } có tổng các phần tử đúng bằng B Hai phần tử khác nhau của dãy con được viết cách nhau bởi một vài khoảng
trống
Ví dụ với file Data.in dưới đây sẽ cho ta file Ketqua.out tương ứng
Câu 3: Một cây nhị phân được gọi là cân bằng hoàn toàn nếu tại tất cả các nút, số nút của
cây con bên trái và số nút của cây con bên phải của nút đó chênh lệch nhau không quá 1
Cho cây nhị phân tìm kiếm có con trỏ đầu tree chỉ đến gốc của cây với khai báo sau:
struct node {
int key;
int info ; struct node *left;
struct node *right;
} ;
typedef struct node *PTR;
PTR tree;
a Hãy viết chương trình con xác định xem cây nhị phân tree có phải là cây nhị phân tìm
kiếm cân bằng hoàn toàn hay không?
b Hãy viết hàm trả về mức của nút có khóa key = X, với X là số nguyên dương và giả sử
rằng nút gốc có mức bằng 1 Ghi chú là trong trường hợp cây tree không có nút với khóa
X thì hàm sẽ trả về 0
Câu 4: Ta định nghĩa một từ là dãy các kí tự không chứa khoảng trống (space), dấu tab, dấu
xuống dòng (‘\n’), dấu về đầu dòng (‘\r’) và dấu kết thúc dòng (‘\0’) Tần xuất xuất hiện của từ
W trong tập văn bản D, ký hiệu là P(W) và được tính theo công thức: ( ) (( ))
D N
W N W
N(W) là số lần xuất hiện từ W trong văn bản D, N(D) là số từ của văn bản D
Cho file văn bản Data.in Hãy tìm tập các từ và tần xuất xuất hiện của mỗi từ trong file văn bảnData.in Kết quả các từ và tần xuất xuất hiện của từ tìm được ghi lại trong file Ketqua.out theokhuôn dạng sau:
Dòng đầu tiên ghi lại số tự nhiên K là số từ xuất hiện trong file Data.in;
K dòng kế tiếp, mỗi dòng ghi lại một từ W và tần xuất xuất hiện của từ đó P(W) trong fileData.in W và P(W) được viết cách nhau bởi một vài khoảng trống
Ví dụ dưới đây sẽ minh họa cho file Data.in và Ketqua.out của bài toán
Trang 21const MAX = 50; // Số đỉnh tối đa của đồ thị
typedef int Dothi[MAX][MAX] ;
Dothi G ;
int n; // số đỉnh của đồ thị G
Hãy viết chương trình con để xác định đồ thị G có liên thông hay không?
Ghi chú: Cán bộ coi thi không giải thích gì thêm
ĐÁP ÁN
Câu 1 Lấy phần dư của phép chia 4
Ket qua buoc 1: 3
Ket qua buoc 2: 2
Ket qua buoc 3: 3
Ket qua buoc 4: 1
Ket qua buoc 5: 1 3 2 3
2,0đ
0.5đ0.5đ0.5đ0.5đ
printf("\n Day so:");
for(int i=1; i<=n; i++){
Trang 22while(i>0 && B[i]) { B[i]=0; i ;};
struct node *right;
} ;
typedef struct node *PTR;
PTR tree;
a Xác định xem cây nhị phân tree có phải là cây nhị phân
tìm kiếm cân bằng hoàn toàn hay không?
int SoNut (PTR tree) // tính số nút của cây nhị phân tree
int CanBangHoanToan (PTR treee)
{
2,0đ
0.25đ0.75đ
Trang 23while (p!=NULL && cont)
{ trai = SoNut (p->left) ;
phai = SoNut (p->right);
if ( abs ( trai-phai) >1) return 0; // không cân bằng hoàn
b int MucNut(PTR tree, int x ) {
PTR p = tree; int muc =1;
while ( p != NULL && p->key !=x)
- Tách từ trong file và tập hợp lại trong mảng w
int Tim_Tap_Tu( w tu[] ){
w temp; char s[20];
2.0đ
0.5đ
0.5đ
Trang 24//Nếu i=wn+1 thi bổ xung từ mới vào vị trí wn+1
int Find_Word( w *tu, int wn, w temp){
for(int i=1; i<=wn; i++){
- Tính tần xuất xuất hiện mỗi từ, ghi kết quả đúng khuôn dạng
void In_Tu(w *tu, int k){
printf("\n Ket qua:");
fp1= fopen("Ketqua.Out","w");
fprintf( fp1, "\n%d",wn);
for(int i=1; i<=k;i++){
tu[i].tanxuat = (float) tu[i].solan /(float) wf;
printf("\n %10s %3d %6.2f", tu[i].word, tu[i].solan,
Trang 25int n; // số đỉnh của đồ thị G
Viết chương trình con để xác định đồ thị G cĩ liên thơng hay
khơng?
Thuật tốn:
Xét 1 đỉnh u (1 n) trong đồ thi G, ta dùng thuật tốn DFS duyệt
đồ thị từ đỉnh u, trong quá trình duyệt nếu phát hiện 1 đỉnh v
khơng xuất hiện trong kết quả duyệt thì trả về 0 để cho biết đồ
thị khơng liên thơng
int LienThong(Dothi G, int n)
{
int *C = new int [n+1] ; // de danh dau cac dinh da di qua
int *Stack= new int [n] ; // Stack de chua cac dinh trong
khi duyet
int sp ; int i,x ;
int u=1;
for (i=1; i<=n; C[i++] = 0 );
sp ; // xoa dinh vua tham ra khoi Stack
for (i=1; i <= n; i++) // dua tat ca cac nut chua duyet tu x
for (i=1; i<=n && C[i] ==1 ; i++ );
- Ta dùng thuật toán WarShall để tìm bao đóng BD
của của đồ thị G
Trang 26- Nếu trong mảng 2 chiều BD mà BD [u][v] != 0 nghĩa
là sẽ có 1 đường đi từ đỉnh u đến đỉnh v, và
ngược lại Do đó, nếu tồn tại u,v sao cho BD[u][v]
==0 nghĩa là đồ thị không liên thông
Chương trình:
int WarShall( Dothi G, int n)
{
int i,j,k, dem;
int C[MAX][MAX], P[MAX][MAX];
int BD[MAX][MAX]; // bao dong cua ma tran G
for( i=0; i<n;i++) // P1
// Kiểm tra đồ thị liên thông ?
for(int u=0; u<n;u++)
for (int v=0;v<n; j++)
if (BD[u][v] ==0)
{ cout << “Do thi khong lien thong “; return ; }
cout << “Do thi lien thong “;
Trang 27HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
CƠ SỞ TP HỒ CHÍ MINH
ĐỀ VÀ ĐÁP ÁN KỲ THI TUYỂN SINH CAO HỌC
Câu 1 Chương trình con sau đây dùng để tạo một số ngẫu nhiên khơng trùng nhau trongkhoảng từ 1 đến n
void nhap_day(int A[]) {
int i,so, dem=0;
Trang 28b Hãy tìm giải thuật tạo m số ngẫu nhiên không trùng nhau trong khoảng từ 1 đến n vớiđiều kiện là chạy nhanh hơn về thời gian thực thi Sau đó cài đặt giải thuật trên.
Câu 2 Cho trước mảng 2 chiều A[1:n][1:n], mỗi phần tử của nó bằng 0, 1, 5 hoặc 11
Hãy tính số lượng các bộ bốn A[i,j], A[i+1,j], A[i, j+1], A[i+1, j+1] trong đó các phần tử đều khác nhau
Câu 3 Cây nhị phân cân bằng hoàn toàn là cây nhị phân mà tương ứng với tất cả các nút
thì số nút của cây con bên trái và số nút của cây con bên phải chênh lệch nhau không quá1
Cho cây nhị phân tìm kiếm có con trỏ đầu tree chỉ đến gốc của cây với khai báo như
sau:
struct node {
int key;
int info ;struct node *left;
struct node *right;
} ;
typedef struct node *PTR;
PTR tree;
c Hãy viết chương trình con xác định xem cây nhị phân tree có phải là cây nhị phân
tìm kiếm cân bằng hoàn toàn hay không?
c Hãy viết hàm trả về mức của nút có khóa key = X, với X là số nguyên dương và
giả sử rằng nút gốc có mức bằng 1 Ghi chú là trong trường hợp cây tree không có
nút với khóa X thì hàm sẽ trả về 0
Câu 4 Cho một danh sách liên kết với con trỏ đầu là First nhằm quản lý danh sách các
sinh viên trong một trường Mỗi sinh viên có các thông tin sau đây: masv (mã sinh viên tối đa 8 ký tự), ho (họ - tối đa 40 ký tự), ten (tên - tối đa 10 ký tự), gt (giới tính - tối đa
-3 ký tự), malop (mã lớp - tối đa 8 ký tự) và được khai báo theo kiểu cấu trúc:
typedef struct SINHVIEN {
char masv [8]; char ho [40];
char ten[10]; char gt [3] ; char malop [8];
Trang 29e Viết chương trình con sắp xếp danh sách sinh viên tăng dần theo mã sinh viênmasv sao cho ta có thể đưa danh sách sinh viên mới sắp xếp này quay trở lại trật
tự ban đầu như khi nhập liệu
Câu 5 Cho đồ thị vô hướng G có n đỉnh với các đỉnh được đánh số từ 1 đến n theo cấu
trúc ma trận kề sau đây:
typedef int Dothi[MAX][MAX] ;
Dothi G ;
int n; // số đỉnh của đồ thị G
Hãy viết chương trình con để xác định đồ thị G có liên thông hay không?
HẾT
Trang 30-HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
CƠ SỞ TP HỒ CHÍ MINH
ĐỀ VÀ ĐÁP ÁN KỲ THI TUYỂN SINH CAO HỌC
Câu 1
a Khơng tăng biến ‘dem’ nên vịng lặp sẽ chạy vơ hạn
Do đĩ chương trình cần sửa lại đoạn A[dem]= so thành A[dem++]=so
b Chương trình cải tiến sau sẽ giảm đi 1 vịng lặp lồng nhau
void nhap_day(int A[]) {
int i,so, dem=0;
Đáp án: Duyệt mảng 2 chiều, với mỗi i,j ta so sánh
if (A[i ][j]+ A[i+1][j]+ A[i] [j+1]+ A[i+1][ j+1]==17) dem ++;
Câu 3.
struct node {
int key;
int info ;struct node *left;
struct node *right;
int SoNut (PTR tree) // tính số nút của cây nhị phân tree
int CanBangHoanToan (PTR treee)
Trang 31while (p!=NULL && cont)
{ trai = SoNut (p->left) ;
phai = SoNut (p->right);
if ( abs ( trai-phai) >1) return 0; // không cân bằng hoàn toàn
b int MucNut(PTR tree, int x ) {
PTR p = tree; int muc =1;
while ( p != NULL && p->key !=x)