Tổng hợp đề thi cuối kỳ 1 môn Kỹ thuật lập trình | Trường Đại học Bách Khoa Hà Nội

Câu 1. (2.0 điểm) Theo em, kỹ thuật Template function có thể kết hợp vào đa năng hóa toán tử (operator overloading) được
không?  nếu được thì có lợi ích ích gì  Hãy minh họa bằng 1 ví dụ cụ thể là đa năng hóa toán tử + cho số phức

Đề thi môn Kĩ thut lp trình CNTT K52 (thày Vũ Đc Vưng) Đề s 1
1
Đề thi s 1
Môn : Kĩ thut lp trình (IT3040)
Thi gian : 90 phút
SV đưc phép s dng i liu, nhưng kng đưc dùng máy tính,
đin thoi DĐ
u 1 : (1,0 đ)
Đon lệnh dưới đây dùng để loi b kí t cui cùng ca mtu str[ ].
y tiến nh kim th hiu chỉnh đoạn code để đoạn lnh sau s luôn
đúng trong mọi tng hp.
int i = 0;
while (str[i] != ‘\0’)
i++;
str[ - -i] = ‘\0’;
Câu 2 : (0,75 đ)
Mt lp trình viên chuyên nghip tiến hành tinh chnh cơng trình
bng cách sa các đon khai báo : char MaTran [80][30]; thành : char
MaTran [80][32]; Em y cho biết ý nghĩa, tác dng ca vic sa đổi đó ?
Câu 3 : (0,75 đ)
Vi a là mt biến int, dòng lnh : scanf( %d”, a) ; y ra li buid_time
hay Run_time, gii tch ti sao ?
Câu 4 : (0,75 đ) Tính giá tr ca các phn t ca mng A sau khi thc hin
đoạn lnh dưi đây :
int A[ ] = {6, 13, 34, 19} ;
int *p = A ;
*p ++ ;
*p += 2 ;
p += 2 ;
*p += 2 ;
Đề thi môn Kĩ thut lp trình CNTT K52 (thày Vũ Đc Vưng) Đề s 1
2
Câu 5 : (1,0 đ)
Hãy tinh chnh đoạn mã lnh sau bng mi k thut và to mi v trí có
th và gii thích lý do ( Biết rng n > 20, x,y,z là các s nguyên các
m trong đon lnh đã ti ưu).
for ( int i = 0 ; i < n ; i++ ) {
if ( x == y *8 ) {
DoOneThing(i);
}
else if ( x == y/4 + z/4 ) {
DoSomeThingElse(i);
}
else {
DoAnotherThing(i);
}
}
Câu 6 : (0,75 đ)
Hãy ci tiến đon mã lnh sau ( a là hng s) :
for ( i = 0; i < 10; i ++ ) {
printf (“%f\n”, i*5*sin(a));
}
u 7 : (1,0 đ)
Hàm sau đây được xóa mt phn t khi mt danh sách ln kết đơn. Hãy
cho biết thc hin đưc hay kng, nếu đưc,y ch ra các c khi
danh sách đã có 4 phn t và ta mun xóa phn t cui cùng. Nếu kng, ch
ra đim gây li.
/*
* remove : Loi b 1 phn t khi danh sách
* a_list là biến tng th.
Đề thi môn Kĩ thut lp trình CNTT K52 (thày Vũ Đc Vưng) Đề s 1
3
* T_node là kiu phn t thuc danh sách
*/
void remove ( T_node *p)
{
T_node **i = &a_list ;
for ( ; (*i) != NULL && (( *i) != p) ; *i = ((*i) -> next) ) ;
if ( *i != NULL)
( *i) = (*i) -> next;
if ( p != NULL)
nodepree (p); //gii phóng node tr bi p
}
u 8 : (2,0 đ)
Cho x y hai mng đưc cấp phát động vi kích tc bng đúng số
phn t ca mng cha haiy các s thc X = [x1, x2, … , xn]
Y = [y1, y2, … , ym]
S dng ngôn ng lp trình C/C++ đ viếtm … DiffSym(…) vi :
Đầu vào : danh sách X danh sách Y (và các tham s khác nếu cn …)
Đầu ra : con tr đến danh sách Z; danh sách y bao gm :
- Tt c các s thuc X kng thuc Y
- Tt c các s thuc Y kng thuc X
n cnh đó, thông qua tham s truyn, gi ra s phn t ca mng kết qu Z
Yêu cu : phong cách lp trình thng nht, ctch đy đ, áp dng các
kĩ thut viết mã ngun hiu qu, by li lp trình phòng nga.
Lit kê các k thut viết mã ngun hiu qu, by li và lp trình phòng
nga đã áp dng.
Đề thi môn Kĩ thut lp trình CNTT K52 (thày Vũ Đc Vưng) Đề s 1
4
Câu 9 : (2 đ)
Cho mt danh sách liên kết đơn vi các nút được khai báo như sau :
struct node
{
int info;
struct node *next;
};
y y dngm (hoc phương thc) Sort đ sp xếp danh sách theo th
t ng dn ca info
Trang 1/4
BỘ MÔN
CÔNG NGHỆ
PHẦN MỀM
ĐỀ THI HỌC KỲ 1 NĂM HỌC 2020-2021
Thời gian: 90 phút Ngày thi: 12/01/2021
Mã học phần: IT3140 Tên học phần: thuật lập trình
zxsfdghkj
Họ và tên sinh viên:……………………………………………………………………….
số sinh viên:…………………… …………………… Mã lớp: ……………………
ĐỀ THI CUỐI KỲ
MÔN: IT3040 - Kỹ thuật lập trình (20201)
(Thời gian: 90 phút. Không sử dụng tài liệu, điện thoại Nộp đề kèm bài làm)
Câu 1. (2.0 điểm)
Theo em, kỹ thuật Template function thể kết hợp vào đa năng hóa toán tử ( operator overloading) được
không ? nếu được thì lợi ích ích ? Hãy minh họa bằng 1 dụ cụ thể là đa năng hóa toán tử + cho số
phức
Câu 2 (2.0đ) Khi định nghĩa phép toán cộng ma trận cho cấu trúc MATRIX được định nghĩa như sau :
typedef struct {
int Row,Col ;
float ** Data ; } MATRIX ;
một sinh viên nhận thấy, nếu thực hiện biểu thức C=A+B ; một vài lần thì kết quả OK, nhưng nếu biểu thức
đó nằm trong 1 vòng lặp lớn ( hàng ngàn lần) thì kết quả không còn đúng, thậm trí khi tăng số lần lặp,
chương trình còn bị lỗi run-time, mặc dù các hàm cấp phát bộ nhớ, định nghĩa toán tử cộng ma trận SV đã
làm rất chuẩn. Em hãy cho biết tại sao và đưa ra giải pháp !
MATRIX operator +( MATRIX A, MATRIX B) {
MATRIX temp; temp.Row=A.Row;
temp.Col=A.col;
AllocMatrix(temp);
/* Phn cng ma trận ……………*/
return temp;
}
Câu 3. (1.0 điểm) Tinh chỉnh để nâng cao hiệu năng của chương trình sau:
void findK(float b, float *a, int n)
{
int i = 0, found = 0;
while ((!found) && (i<n)) {
float x = log(b)/log(2);
if (a[i] == x) found = 1;
else i++;
}
if (found) do_something;
}
Câu 4. (2.0 điểm) mt sv xây dng chức năng sắp xếp sinh viên theo th t kiu vit nam ( theo tên ri mi
đến h và tên lót) t 1 danh sách h và tên sinh viên ca lớp như sau
// #include ….
int i,j,k,n=0;
char ds[500][30], tg[30];
void bosung(); void sapxep(); void inds();
Trang 2/4
int main() {
// hàm main
}
int NamePos(char *ht)
{
i=strlen(ht)-1;
while (ht[i]==' ' && i> -1) i--;
while (ht[i]!=' ' && i> -1) i--;
return i+1;
}
void sapxep() {
for(i=0;i<n-1;i++) {
k=i;
for(j=i+1;j<n;j++)
if (strcmp(ds[k]+NamePos(ds[k]),
ds[j]+NamePos(ds[j])) >0) k=j;
else if (strcmp(ds[k]+NamePos(ds[k]),
ds[j]+NamePos(ds[j])) ==0)
if (strcmp(ds[k],ds[j]) >0) k=j;
if (k!=i) {
strcpy(tg,ds[i]);
strcpy(ds[i],ds[j]);
strcpy(ds[j],tg);
}
}
printf("\n Danh sach da duoc sap xep !!!");
getch();
}
Hãy tìm và sửa lại lỗi của các đoạn code trên !
Câu 5. (2.0 điểm) Cho cấu trúc danh sách liên kết đôi như sau:
struct Node {
int data;
Node *next, *prev;
};
Hãy viết hàm đảo ngược danh sách :
Node* reverse(Node* head) {...}
a) Sử dụng đệ quy (1 điểm)
b) Không sử dụng đệ quy (1 điểm)
Câu 6 (1.0 điểm)
(a) (0.5 điểm) Hãy cho biết sự khác nhau của hai cách khai báo gtrị: 'x' "x". Hãy tả cách biểu diễn
trong bộ nhớ của cả hai giá trị.
(b) Cho đoạn chương trình sau đây, hãy tìm ra ít nhất hai lỗi sai trong chương trình (0.5 điểm cho mỗi lỗi sai)
và sửa lại chương trình cho đúng (0.5 điểm).
int main(void) {
char *s = "abcde"; int len = strlen(s);
for (int i = 0; i <= len; i++)
s[i] += 1;
return printf("'%s' is %d characters long\n", ++s, strlen(s));
}
Trang 3/4
BỘ MÔN
CÔNG NGHỆ
PHẦN MỀM
ĐỀ THI HỌC KỲ 1 NĂM HỌC 2020-2021
Thời gian: 90 phút Ngày thi: 12/01/2021
Mã học phần: IT3140 Tên học phần: thuật lập trình
zxsfdphkj
Họ và tên sinh viên:……………………………………………………………………….
số sinh viên:…………………… …………………… Mã lớp: ……………………
ĐỀ THI CUỐI KỲ
MÔN: IT3040 - Kỹ thuật lập trình (20201)
(Thời gian: 90 phút. Không sử dụng tài liệu, điện thoại – Nộp đề kèm bài làm)
Câu 1. (2.0 điểm) mt sv xây dng chức năng sắp xếp sinh viên theo th t kiu vit nam ( theo tên ri mi
đến h và tên lót) t 1 danh sách h và tên sinh viên ca lớp như sau
// #include ….
int i,j,k,n=0;
char ds[500][30], tg[30];
void bosung(); void sapxep(); void inds();
int main() {
// hàm main
}
char * Name(char *ht)
{
i=strlen(ht)-1;
while (ht[i]==' ') i--;
while (ht[i]!=' ') i--;
return ht+i+1;
}
void sapxep() {
for(i=0;i<n-1;i++) {
k=i;
for(j=i+1;j<n;j++)
if (strcmp(Name(ds[k]),Name(ds[j])) >0) k=j;
else if (strcmp(Name(ds[k]),Name(ds[j])) ==0)
if (strcmp(ds[k],ds[j]) >0) k=j;
if (k!=i) {
strcpy(tg,ds[i]);
strcpy(ds[i],ds[j]);
strcpy(ds[j],tg);
}
}
printf("\n Danh sach da duoc sap xep !!!");
getch();
}
Hãy tìm và sửa lại lỗi của các đoạn code trên !
Câu 2. (2.0đ) Khi định nghĩa phép toán cộng ma trận cho cấu trúc MATRIX được định nghĩa như sau :
typedef struct {
int Row,Col ;
float ** Data ; } MATRIX ;
Trang 4/4
một sinh viên nhận thấy, nếu thực hiện biểu thức C=A+B ; một vài lần thì kết quả OK, nhưng nếu biểu thức
đó nằm trong 1 vòng lặp lớn ( hàng ngàn lần) thì kết quả không còn đúng, thậm trí khi tăng số lần lặp,
chương trình còn bị lỗi run-time, mặc dù các hàm cấp phát bộ nhớ, định nghĩa toán tử cộng ma trận SV đã
làm rất chuẩn. Em hãy cho biết tại sao và đưa ra giải pháp !
MATRIX operator +( MATRIX A, MATRIX B) {
MATRIX temp; temp.Row=A.Row;
temp.Col=A.col;
AllocMatrix(temp);
/* Phn cng ma trận ……………*/
return temp;
}
Câu 3. (1.0 điểm) Tinh chỉnh để nâng cao hiệu năng của đoạn code sau:
void findK(float b, float *a, int n)
{
int i = 0, found = 0;
float x;
for(;i<n;i++) {
x = log(b)/log(2);
if (a[i] == x) found = 1;
i++;
}
if (found) do_something;
}
Câu 4 (2.0 điểm) Theo em, kỹ thuật Template function thể kết hợp vào đa năng hóa toán tử ( operator
overloading) được không ? nếu được thì có lợi ích ích ? Hãy minh họa bằng 1 ví dụ cụ thể là đa năng hóa
toán tử - cho số phức
Câu 5. (2.0 điểm) Cho cấu trúc danh sách liên kết đôi như sau:
struct Node {
int data;
Node *next, *prev;
};
Hãy viết hàm đảo ngược danh sách :
Node* reverse(Node* head) {...}
a) Sử dụng đệ quy (1 điểm)
b) Không sử dụng đệ quy (1 điểm)
Câu 6 (1.0 điểm)
(a) (0.5 điểm) Hãy cho biết sự khác nhau của hai cách khai báo gtrị: 'x' "x". Hãy tả cách biểu diễn
trong bộ nhớ của cả hai giá trị.
(b) Cho đoạn chương trình sau đây, hãy tìm ra ít nhất hai lỗi sai trong chương trình (0.5 điểm cho mỗi lỗi sai)
và sửa lại chương trình cho đúng (0.5 điểm).
int main(void) {
char *s = "abcde"; int len = strlen(s);
for (int i = 0; i <= len; i++)
s[i] += 1;
return printf("'%s' is %d characters long\n", ++s, strlen(s));
}
Trang 1/2
BỘ MÔN
CÔNG NGHỆ
PHẦN MỀM
ĐỀ THI HỌC KỲ 1 NĂM HỌC 2020-2021
Thời gian: 100 phút Ngày thi: 12/01/2021
Mã học phần: IT3140 Tên học phần: thuật lập trình
Họ và tên sinh viên:……………………………………………………………………….
Mã ssinh viên:…………………… …………………… Mã lớp: ……………………
ĐỀ SỐ 1
(Không sử dụng tài liệu, điện thoại Nộp đề kèm bài làm)
Câu 1. (2.0 điểm)
(a) (0.5 điểm) y cho biết sự khác nhau của hai ch khai báo giá trị: 'x' "x". Hãy tả cách biểu diễn
trong bộ nhớ của cả hai giá trị.
(b) (1.5 điểm) Cho đoạn chương trình sau đây, hãy tìm ra ít nhất hai lỗi sai trong chương trình (0.5 điểm cho
mỗi lỗi sai) và sửa lại chương trình cho đúng (0.5 điểm).
int main(void) {
char *s = "abcde"; int len = strlen(s);
for (int i = 0; i <= len; i++)
s[i] += 1;
return printf("'%s' is %d characters long\n", ++s, strlen(s));
}
Câu 2. (2.0 đim)
Mt sinh viên xây dng chc năng sp xếp theo th t kiu vit nam (theo tên ri mi đến h tên lót) t
mt danh sách h và tên sinh viên ca lp như sau:
// #include ….
int i,j,n=0;
char ds[500][30], tg[30];
void bosung(); void sapxep(); void inds();
int main() {
// hàm main
}
int NamePos(char *ht)
{
i=strlen(ht)-1;
while (ht[i]==' ' && i> -1) i--;
while (ht[i]!=' ' && i> -1) i--;
return i+1;
}
void sapxep() {
int i,j,k;
for(i=0;i<n-1;i++) {
k=i;
for(j=i+1;j<n;j++)
if (strcmp(ds[k]+NamePos(ds[k]),
ds[j]+NamePos(ds[j])) >0) k=j;
else if (strcmp(ds[k]+NamePos(ds[k]),
ds[j]+NamePos(ds[j])) ==0)
if (strcmp(ds[k],ds[j]) >0) k=j;
if (k!=i) {
strcpy(tg,ds[i]);
strcpy(ds[i],ds[k]);
strcpy(ds[k],tg);
}
Trang 2/2
}
printf("\n Danh sach da duoc sap xep !!!");
getch();
}
Các hàm khác trong chương trình đều chun nhưng khi in thì kết qu không đưc như ý, danh sách ch thì
sp xếp được, ch thì không. Hãy tìm ra li trong chương trình và ch ra li là loi gì (compiler, runtime).
Câu 3. (1.0 đim)
Tinh chnh để nâng cao hiu năng ca chương trình sau:
void findK(float b, float *a, int n)
{
int i = 0, found = 0;
while ((!found) && (i<n)) {
float x = log(b)/log(2);
if (a[i] == x) found = 1;
else i++;
}
if (found) do_something;
}
Câu 4. (2.0 điểm)
Khi định nghĩa phép toán cng ma trn (s dng operator overloading) cho cu trúc Matrix được định
nghĩa như sau :
typedef struct {
int row, col ;
float ** Data ; } Matrix ;
mt sinh viên nhn thy, nếu thc hin biu thc C=A+B ; mt vài ln thì kết qu OK, nhưng nếu biu thc
đó nằm trong 1 vòng lp ln ( hàng ngàn ln) thì kết qu không còn đúng, thậm trí khi tăng số ln lp,
chương trình n b li run-time, mc các hàm cp phát b nhớ, định nghĩa toán tử cng ma trận SV đã
làm rt chun. Em hãy cho biết ti sao (0.5đ) và đưa ra giải pháp (1.5đ).
Matrix operator +( Matrix a, Matrix b) {
Matrix temp;
temp.row = a.row;
temp.col = a.col;
allocMatrix(temp);
/* Phn cng ma trn ……………*/
return temp;
}
Câu 5. (1.0 điểm)
Cho cấu trúc danh sách liên kết như sau:
struct Node {
int data;
Node *next;};
Hãy viết hàm đảo ngược danh sách :
Node* reverse(Node* head) {...}
a) Sử dụng đệ quy (0.5 điểm)
b) Không sdụng đệ quy (0.5 điểm)
Câu 6. (2.0 đim)
Theo bạn, kthuật Template function có thể kết hợp vào đa năng hoá toán tử (operator overloading) được
không? Nếu được thì lợi ích gì? Hãy minh hoạ bằng 1 dụ cụ thể liên quan đến đa năng hoá toán tử cho
số phức.
struct Complex{
int real, img;
}
----------- HẾT ----------
Trang 1/2
BỘ MÔN
CÔNG NGHỆ
PHẦN MỀM
ĐỀ THI HỌC KỲ 1 NĂM HỌC 2020-2021
Thời gian: 100 phút Ngày thi: 12/01/2021
Mã học phần: IT3140 Tên học phần: thuật lập trình
Họ và tên sinh viên:……………………………………………………………………….
Mã ssinh viên:…………………… …………………… Mã lớp: ……………………
ĐỀ S 2
(Không sử dụng tài liệu, điện thoại Nộp đề kèm bài làm)
Câu 1. (2.0 điểm)
Theo bạn, kthuật Template function thể kết hợp vào đa năng hoá toán tử (operator overloading) được
không? Nếu được thì lợi ích gì? Hãy minh hoạ bằng 1 dụ cụ thể liên quan đến đa năng hoá toán tử cho
số phức.
struct Complex{
int real, img;
}
Câu 2. (2.0 điểm)
(a) (1.0 điểm) Hãy cho biết sự khác nhau giữa con trỏ (pointer) trong C/C++ tham chiếu (refererence)
trong C++ (gợi ý, so sánh về các mặt: định nghĩa, khởi tạo (initialization), gán (assignment/re-assignment),
địa chỉ trong bộ nhớ (memory address), phép toán)
(b) Cho đoạn chương trình sau đây:
void swap(int x, int y) {
int temp = x; x = y; y = temp;
}
int main(int argc, char** argv) {
int x = 0;
int y = 1;
swap(x, y);
assert(x==1);
return 0;
}
(i) Hãy cho biết vai trò ca câu lnh assert và ti sao chương trình khi thc thi s phát sinh failure vi câu
lnh assert. (0.5 điểm)
(ii) Hãy sa li chương trình trên theo hai cách, dùng C và dùng C++ (0.5 đim)
Câu 3. (2.0 đim)
Hãy sa li đoạn chương trình sau đây cho đúng kết hp tinh chnh code: (1.0 điểm)
typedef struct point {double x, y, z;} Point;
int find_max_x_argument(int n, Point *elems){
double max = 0; int max_index = 0;
for (int i = 0; i < n; i++)
if (max < elems[i].x){
max_index = i;
max = elems[i].x;
}
return max_index;
}
b) mt mng các phn t các s nguyên biết rng c phn t trong mng s rơi vào mt trong bn
trường hp dưới đây:
i) Các phn t trong mng sp xếp tăng dn
ii) Các phn t trong mng sp xếp gim dn
iii) Các phn t trong mng tăng dn phn đầu và gim dn phn cui
Trang 2/2
iv) Các phn t trong mng gim dn phn đầu và tăng dn phn cui
Đưa ra mt phương án ti ưu nht để tìm kiếm phn t ln nht trong y (1.0 điểm)
Câu 4. (2.0 điểm)
a) sao trong ngôn ngữ lập trình C, không cho phép gán hai mảng nhưng lại thể gán 2 biến kiểu
struct có phần tử là các mảng? (0.5đ)
b) Một sinh viên cài đặt phép * cho hai mảng như sau:
typedef struct array {int n; float* data} Array;
void newArray(Array &a) {
a.data = new float [n];
}
Array operator * (Array a, Array b) {
Array temp;
temp.n = a.n;
newArray(temp);
for (int i = 0; i < n; i++)
temp.data[i] = a.data[i]*b.data[i];
return temp;
}
void main() {
Array a, b, c;
//Ga s đã có khi to và nhp d liu cho hai mng a, b
for (int i = 0; i < 10000; i++)
c = a * b;
}
Hãy dự đoán vấn đề gì có thxảy ra với đoạn chương trình này? (0.5 điểm)
Cài đặt giải pháp khắc phục vấn đề trên (1.0 điểm)
Câu 5. (1.0 đim)
Cho cấu trúc danh sách liên kết như sau:
struct Node {
int data;
Node *next;
};
Hãy viết hàm đảo ngược danh sách :
Node* reverse(Node* head) {...}
a) Sử dụng đệ quy (0.5 điểm)
b) Không sdụng đệ quy (0.5 điểm)
Câu 6. (1.0 đim)
Tinh chnh để nâng cao hiu năng ca chương trình sau:
void findK(float b, float *a, int n)
{
int i = 0, found = 0;
while ((!found) && (i<n)) {
float x = log(b)/log(2);
if (a[i] == x) found = 1;
else i++;
}
if (found) do_something;
}
----------- HẾT ----------
| 1/12

Preview text:

Đề thi môn Kĩ thuật lập trình – CNTT K52 (thày Vũ Đức Vượng) – Đề số 1 Đề thi số 1
Môn : Kĩ thuật lập trình (IT3040) Thời gian : 90 phút
SV được phép sử dụng tài liệu, nhưng không được dùng máy tính, điện thoại DĐ Câu 1 : (1,0 đ)
Đoạn lệnh dưới đây dùng để loại bỏ kí tự cuối cùng của một xâu str[ ].
Hãy tiến hành kiểm thử và hiệu chỉnh đoạn code để đoạn lệnh sau sẽ luôn
đúng trong mọi trường hợp. int i = 0;
while (str[i] != ‘\0’) i++; str[ - -i] = ‘\0’; Câu 2 : (0,75 đ)
Một lập trình viên chuyên nghiệp tiến hành tinh chỉnh chương trình
bằng cách sửa các đoạn khai báo : char MaTran [80][30]; thành : char
MaTran [80][32];
Em hãy cho biết ý nghĩa, tác dụng của việc sửa đổi đó ? Câu 3 : (0,75 đ)
Với a là một biến int, dòng lệnh : scanf( “%d”, a) ; gây ra lỗi buid_time
hay Run_time, giải thích tại sao ?
Câu 4 : (0,75 đ) Tính giá trị của các phần tử của mảng A sau khi thực hiện
đoạn lệnh dưới đây :
int A[ ] = {6, 13, 34, 19} ; int *p = A ; *p ++ ; *p += 2 ; p += 2 ; *p += 2 ; 1
Đề thi môn Kĩ thuật lập trình – CNTT K52 (thày Vũ Đức Vượng) – Đề số 1 Câu 5 : (1,0 đ)
Hãy tinh chỉnh đoạn mã lệnh sau bằng mọi kỹ thuật và tạo mọi vị trí có
thể và giải thích lý do
( Biết rằng n > 20, x,y,z là các số nguyên và các
hàm trong đoạn lệnh đã tối ưu).
for ( int i = 0 ; i < n ; i++ ) { if ( x == y *8 ) { DoOneThing(i); }
else if ( x == y/4 + z/4 ) { DoSomeThingElse(i); } else { DoAnotherThing(i); } } Câu 6 : (0,75 đ)
Hãy cải tiến đoạn mã lệnh sau ( a là hằng số) :
for ( i = 0; i < 10; i ++ ) {
printf (“%f\n”, i*5*sin(a)); } Câu 7 : (1,0 đ)
Hàm sau đây được xóa một phần tử khỏi một danh sách liên kết đơn. Hãy
cho biết nó thực hiện được hay không, nếu được, hãy chỉ ra các bước khi
danh sách đã có 4 phần tử và ta muốn xóa phần tử cuối cùng. Nếu không, chỉ ra điểm gây lỗi. /*
* remove : Loại bỏ 1 phần tử khỏi danh sách
* a_list là biến tổng thể. 2
Đề thi môn Kĩ thuật lập trình – CNTT K52 (thày Vũ Đức Vượng) – Đề số 1
* T_node là kiểu phần tử thuộc danh sách */
void remove ( T_node *p) {
T_node **i = &a_list ;
for ( ; (*i) != NULL && (( *i) != p) ; *i = ((*i) -> next) ) ; if ( *i != NULL)
( *i) = (*i) -> next; if ( p != NULL)
nodepree (p); //giải phóng node trỏ bởi p } Câu 8 : (2,0 đ)
Cho x và y là hai mảng được cấp phát động với kích thước bằng đúng số
phần tử của mảng và chứa hai dãy các số thực X = [x1, x2, … , xn]Y = [y1, y2, … , ym]
Sử dụng ngôn ngữ lập trình C/C++ để viết hàm … DiffSym(…) với :
Đầu vào : danh sách X và danh sách Y (và các tham số khác nếu cần …)
Đầu ra : con trỏ đến danh sách Z; danh sách này bao gồm :
- Tất cả các số thuộc X và không thuộc Y
- Tất cả các số thuộc Y và không thuộc X
Bên cạnh đó, thông qua tham số truyền, gửi ra số phần tử của mảng kết quả Z
Yêu cầu : phong cách lập trình thống nhất, chú thích đầy đủ, áp dụng các
kĩ thuật viết mã nguồn hiểu quả, bẫy lỗi và lập trình phòng ngừa.
Liệt kê các kỹ thuật viết mã nguồn hiểu quả, bẫy lỗi và lập trình phòng ngừa đã áp dụng. 3
Đề thi môn Kĩ thuật lập trình – CNTT K52 (thày Vũ Đức Vượng) – Đề số 1 Câu 9 : (2 đ)
Cho một danh sách liên kết đơn với các nút được khai báo như sau : struct node { int info; struct node *next; };
Hãy xây dựng hàm (hoặc phương thức) Sort để sắp xếp danh sách theo thứ tự tăng dần của info 4
ĐỀ THI HỌC KỲ 1 NĂM HỌC 2020-2021 BỘ MÔN CÔNG NGHỆ
Thời gian: 90 phút Ngày thi: 12/01/2021 PHẦN MỀM
Mã học phần: IT3140 Tên học phần: Kĩ thuật lập trình
Họ và tên sinh viên:………………………………………………………………………. zxsfdghkj
Mã số sinh viên:…………………… …………………… Mã lớp: …………………… ĐỀ THI CUỐI KỲ
MÔN: IT3040 - Kỹ thuật lập trình (20201)
(Thời gian: 90 phút. Không sử dụng tài liệu, điện thoại – Nộp đề kèm bài làm) Câu 1. (2.0 điểm)
Theo em, kỹ thuật Template function có thể kết hợp vào đa năng hóa toán tử ( operator overloading) được
không ? nếu được thì có lợi ích ích gì ? Hãy minh họa bằng 1 ví dụ cụ thể là đa năng hóa toán tử + cho số phức
Câu 2 (2.0đ) Khi định nghĩa phép toán cộng ma trận cho cấu trúc MATRIX được định nghĩa như sau : typedef struct { int Row,Col ; float ** Data ; } MATRIX ;
một sinh viên nhận thấy, nếu thực hiện biểu thức C=A+B ; một vài lần thì kết quả OK, nhưng nếu biểu thức
đó nằm trong 1 vòng lặp lớn ( hàng ngàn lần) thì kết quả không còn đúng, thậm trí khi tăng số lần lặp,
chương trình còn bị lỗi run-time, mặc dù các hàm cấp phát bộ nhớ, định nghĩa toán tử cộng ma trận SV đã
làm rất chuẩn. Em hãy cho biết tại sao và đưa ra giải pháp !
MATRIX operator +( MATRIX A, MATRIX B) { MATRIX temp; temp.Row=A.Row; temp.Col=A.col; AllocMatrix(temp);
/* Phần cộng ma trận ……………*/ return temp; }
Câu 3. (1.0 điểm) Tinh chỉnh để nâng cao hiệu năng của chương trình sau:
void findK(float b, float *a, int n) { int i = 0, found = 0;
while ((!found) && (i float x = log(b)/log(2); if (a[i] == x) found = 1; else i++; } if (found) do_something; }
Câu 4. (2.0 điểm) một sv xây dựng chức năng sắp xếp sinh viên theo thứ tự kiểu việt nam ( theo tên rồi mới
đến họ và tên lót) từ 1 danh sách họ và tên sinh viên của lớp như sau // #include …. int i,j,k,n=0; char ds[500][30], tg[30];
void bosung(); void sapxep(); void inds(); Trang 1/4 int main() { // hàm main } int NamePos(char *ht) { i=strlen(ht)-1;
while (ht[i]==' ' && i> -1) i--;
while (ht[i]!=' ' && i> -1) i--; return i+1; } void sapxep() { for(i=0;i k=i;
for(j=i+1;j if (strcmp(ds[k]+NamePos(ds[k]),
ds[j]+NamePos(ds[j])) >0) k=j;
else if (strcmp(ds[k]+NamePos(ds[k]), ds[j]+NamePos(ds[j])) ==0)
if (strcmp(ds[k],ds[j]) >0) k=j; if (k!=i) { strcpy(tg,ds[i]); strcpy(ds[i],ds[j]); strcpy(ds[j],tg); } }
printf("\n Danh sach da duoc sap xep !!!"); getch(); }
Hãy tìm và sửa lại lỗi của các đoạn code trên !
Câu 5. (2.0 điểm) Cho cấu trúc danh sách liên kết đôi như sau: struct Node { int data; Node *next, *prev; };
Hãy viết hàm đảo ngược danh sách :
Node* reverse(Node* head) {...}
a) Sử dụng đệ quy (1 điểm)
b) Không sử dụng đệ quy (1 điểm) Câu 6 (1.0 điểm)
(a) (0.5 điểm) Hãy cho biết sự khác nhau của hai cách khai báo giá trị: 'x' và "x". Hãy mô tả cách biểu diễn
trong bộ nhớ của cả hai giá trị.
(b) Cho đoạn chương trình sau đây, hãy tìm ra ít nhất hai lỗi sai trong chương trình (0.5 điểm cho mỗi lỗi sai)
và sửa lại chương trình cho đúng (0.5 điểm). int main(void) {
char *s = "abcde"; int len = strlen(s);
for (int i = 0; i <= len; i++) s[i] += 1;
return printf("'%s' is %d characters long\n", ++s, strlen(s)); } Trang 2/4
ĐỀ THI HỌC KỲ 1 NĂM HỌC 2020-2021 BỘ MÔN CÔNG NGHỆ
Thời gian: 90 phút Ngày thi: 12/01/2021 PHẦN MỀM
Mã học phần: IT3140 Tên học phần: Kĩ thuật lập trình
Họ và tên sinh viên:……………………………………………………………………….
Mã số sinh viên:…………………… …………………… Mã lớp: …………………… zxsfdphkj ĐỀ THI CUỐI KỲ
MÔN: IT3040 - Kỹ thuật lập trình (20201)
(Thời gian: 90 phút. Không sử dụng tài liệu, điện thoại – Nộp đề kèm bài làm)
Câu 1. (2.0 điểm) một sv xây dựng chức năng sắp xếp sinh viên theo thứ tự kiểu việt nam ( theo tên rồi mới
đến họ và tên lót) từ 1 danh sách họ và tên sinh viên của lớp như sau // #include …. int i,j,k,n=0; char ds[500][30], tg[30];
void bosung(); void sapxep(); void inds(); int main() { // hàm main } char * Name(char *ht) { i=strlen(ht)-1; while (ht[i]==' ') i--; while (ht[i]!=' ') i--; return ht+i+1; } void sapxep() { for(i=0;i k=i;
for(j=i+1;j if (strcmp(Name(ds[k]),Name(ds[j])) >0) k=j;
else if (strcmp(Name(ds[k]),Name(ds[j])) ==0)
if (strcmp(ds[k],ds[j]) >0) k=j; if (k!=i) { strcpy(tg,ds[i]); strcpy(ds[i],ds[j]); strcpy(ds[j],tg); } }
printf("\n Danh sach da duoc sap xep !!!"); getch(); }
Hãy tìm và sửa lại lỗi của các đoạn code trên !
Câu 2. (2.0đ) Khi định nghĩa phép toán cộng ma trận cho cấu trúc MATRIX được định nghĩa như sau : typedef struct { int Row,Col ; float ** Data ; } MATRIX ; Trang 3/4
một sinh viên nhận thấy, nếu thực hiện biểu thức C=A+B ; một vài lần thì kết quả OK, nhưng nếu biểu thức
đó nằm trong 1 vòng lặp lớn ( hàng ngàn lần) thì kết quả không còn đúng, thậm trí khi tăng số lần lặp,
chương trình còn bị lỗi run-time, mặc dù các hàm cấp phát bộ nhớ, định nghĩa toán tử cộng ma trận SV đã
làm rất chuẩn. Em hãy cho biết tại sao và đưa ra giải pháp !
MATRIX operator +( MATRIX A, MATRIX B) { MATRIX temp; temp.Row=A.Row; temp.Col=A.col; AllocMatrix(temp);
/* Phần cộng ma trận ……………*/ return temp; }
Câu 3. (1.0 điểm) Tinh chỉnh để nâng cao hiệu năng của đoạn code sau:
void findK(float b, float *a, int n) { int i = 0, found = 0; float x; for(;i x = log(b)/log(2); if (a[i] == x) found = 1; i++; } if (found) do_something; }
Câu 4 (2.0 điểm) Theo em, kỹ thuật Template function có thể kết hợp vào đa năng hóa toán tử ( operator
overloading) được không ? nếu được thì có lợi ích ích gì ? Hãy minh họa bằng 1 ví dụ cụ thể là đa năng hóa toán tử - cho số phức
Câu 5. (2.0 điểm) Cho cấu trúc danh sách liên kết đôi như sau: struct Node { int data; Node *next, *prev; };
Hãy viết hàm đảo ngược danh sách :
Node* reverse(Node* head) {...}
a) Sử dụng đệ quy (1 điểm)
b) Không sử dụng đệ quy (1 điểm) Câu 6 (1.0 điểm)
(a) (0.5 điểm) Hãy cho biết sự khác nhau của hai cách khai báo giá trị: 'x' và "x". Hãy mô tả cách biểu diễn
trong bộ nhớ của cả hai giá trị.
(b) Cho đoạn chương trình sau đây, hãy tìm ra ít nhất hai lỗi sai trong chương trình (0.5 điểm cho mỗi lỗi sai)
và sửa lại chương trình cho đúng (0.5 điểm). int main(void) {
char *s = "abcde"; int len = strlen(s);
for (int i = 0; i <= len; i++) s[i] += 1;
return printf("'%s' is %d characters long\n", ++s, strlen(s)); } Trang 4/4
ĐỀ THI HỌC KỲ 1 NĂM HỌC 2020-2021 BỘ MÔN CÔNG NGHỆ
Thời gian: 100 phút Ngày thi: 12/01/2021 PHẦN MỀM
Mã học phần: IT3140 Tên học phần: Kĩ thuật lập trình
Họ và tên sinh viên:……………………………………………………………………….
Mã số sinh viên:…………………… …………………… Mã lớp: …………………… ĐỀ SỐ 1
(Không sử dụng tài liệu, điện thoại – Nộp đề kèm bài làm) Câu 1. (2.0 điểm)
(a) (0.5 điểm) Hãy cho biết sự khác nhau của hai cách khai báo giá trị: 'x' và "x". Hãy mô tả cách biểu diễn
trong bộ nhớ của cả hai giá trị.
(b) (1.5 điểm) Cho đoạn chương trình sau đây, hãy tìm ra ít nhất hai lỗi sai trong chương trình (0.5 điểm cho
mỗi lỗi sai) và sửa lại chương trình cho đúng (0.5 điểm). int main(void) {
char *s = "abcde"; int len = strlen(s);
for (int i = 0; i <= len; i++) s[i] += 1;
return printf("'%s' is %d characters long\n", ++s, strlen(s)); } Câu 2. (2.0 điểm)
Một sinh viên xây dựng chức năng sắp xếp theo thứ tự kiểu việt nam (theo tên rồi mới đến họ và tên lót) từ
một danh sách họ và tên sinh viên của lớp như sau: // #include …. int i,j,n=0; char ds[500][30], tg[30];
void bosung(); void sapxep(); void inds(); int main() { // hàm main } int NamePos(char *ht) { i=strlen(ht)-1;
while (ht[i]==' ' && i> -1) i--;
while (ht[i]!=' ' && i> -1) i--;
return i+1; } void sapxep() { int i,j,k; for(i=0;i k=i;
for(j=i+1;j if (strcmp(ds[k]+NamePos(ds[k]),
ds[j]+NamePos(ds[j])) >0) k=j;
else if (strcmp(ds[k]+NamePos(ds[k]), ds[j]+NamePos(ds[j])) ==0)

if (strcmp(ds[k],ds[j]) >0) k=j; if (k!=i) { strcpy(tg,ds[i]); strcpy(ds[i],ds[k]); strcpy(ds[k],tg); } Trang 1/2 }
printf("\n Danh sach da duoc sap xep !!!"); getch(); }

Các hàm khác trong chương trình đều chuẩn nhưng khi in thì kết quả không được như ý, danh sách chỗ thì
sắp xếp được, chỗ thì không. Hãy tìm ra lỗi trong chương trình và chỉ ra lỗi là loại gì (compiler, runtime). Câu 3. (1.0 điểm)
Tinh chỉnh để nâng cao hiệu năng của chương trình sau:
void findK(float b, float *a, int n) { int i = 0, found = 0;
while ((!found) && (i

float x = log(b)/log(2);
if (a[i] == x) found = 1; else i++; } if (found) do_something; } Câu 4. (2.0 điểm)
Khi định nghĩa phép toán cộng ma trận (sử dụng operator overloading) cho cấu trúc Matrix được định nghĩa như sau : typedef struct { int row, col ; float ** Data ; } Matrix ;
một sinh viên nhận thấy, nếu thực hiện biểu thức C=A+B ; một vài lần thì kết quả OK, nhưng nếu biểu thức
đó nằm trong 1 vòng lặp lớn ( hàng ngàn lần) thì kết quả không còn đúng, thậm trí khi tăng số lần lặp,
chương trình còn bị lỗi run-time, mặc dù các hàm cấp phát bộ nhớ, định nghĩa toán tử cộng ma trận SV đã
làm rất chuẩn. Em hãy cho biết tại sao (0.5đ) và đưa ra giải pháp (1.5đ).
Matrix operator +( Matrix a, Matrix b) { Matrix temp; temp.row = a.row; temp.col = a.col; allocMatrix(temp);
/* Phần cộng ma trận ……………*/ return temp; } Câu 5.
(1.0 điểm)
Cho cấu trúc danh sách liên kết như sau: struct Node { int data; Node *next;};
Hãy viết hàm đảo ngược danh sách :
Node* reverse(Node* head) {...}
a) Sử dụng đệ quy (0.5 điểm)
b) Không sử dụng đệ quy (0.5 điểm) Câu 6. (2.0 điểm)
Theo bạn, kỹ thuật Template function có thể kết hợp vào đa năng hoá toán tử (operator overloading) được
không? Nếu được thì có lợi ích gì? Hãy minh hoạ bằng 1 ví dụ cụ thể liên quan đến đa năng hoá toán tử cho số phức. struct Complex{ int real, img; } ----------- HẾT ---------- Trang 2/2
ĐỀ THI HỌC KỲ 1 NĂM HỌC 2020-2021 BỘ MÔN CÔNG NGHỆ
Thời gian: 100 phút Ngày thi: 12/01/2021 PHẦN MỀM
Mã học phần: IT3140 Tên học phần: Kĩ thuật lập trình
Họ và tên sinh viên:……………………………………………………………………….
Mã số sinh viên:…………………… …………………… Mã lớp: …………………… ĐỀ SỐ 2
(Không sử dụng tài liệu, điện thoại – Nộp đề kèm bài làm) Câu 1. (2.0 điểm)
Theo bạn, kỹ thuật Template function có thể kết hợp vào đa năng hoá toán tử (operator overloading) được
không? Nếu được thì có lợi ích gì? Hãy minh hoạ bằng 1 ví dụ cụ thể liên quan đến đa năng hoá toán tử cho số phức. struct Complex{ int real, img; } Câu 2. (2.0 điểm)
(a) (1.0 điểm) Hãy cho biết sự khác nhau giữa con trỏ (pointer) trong C/C++ và tham chiếu (refererence)
trong C++ (gợi ý, so sánh về các mặt: định nghĩa, khởi tạo (initialization), gán (assignment/re-assignment),
địa chỉ trong bộ nhớ (memory address), phép toán)
(b) Cho đoạn chương trình sau đây: void swap(int x, int y) {
int temp = x; x = y; y = temp; }
int main(int argc, char** argv) {
int x = 0; int y = 1; swap(x, y); assert(x==1); return 0; }
(i) Hãy cho biết vai trò của câu lệnh assert và tại sao chương trình khi thực thi sẽ phát sinh failure với câu
lệnh assert. (0.5 điểm)
(ii) Hãy sửa lại chương trình trên theo hai cách, dùng C và dùng C++ (0.5 điểm) Câu 3. (2.0 điểm)
Hãy sửa lại đoạn chương trình sau đây cho đúng kết hợp tinh chỉnh code: (1.0 điểm)
typedef struct point {double x, y, z;} Point;
int find_max_x_argument(int n, Point *elems){

double max = 0; int max_index = 0;
for (int i = 0; i < n; i++)
if (max < elems[i].x){ max_index = i; max = elems[i].x; } return max_index; }
b) Có một mảng các phần tử là các số nguyên biết rằng các phần tử trong mảng sẽ rơi vào một trong bốn
trường hợp dưới đây:
i) Các phần tử trong mảng sắp xếp tăng dần
ii) Các phần tử trong mảng sắp xếp giảm dần
iii) Các phần tử trong mảng tăng dần ở phần đầu và giảm dần ở phần cuối Trang 1/2
iv) Các phần tử trong mảng giảm dần ở phần đầu và tăng dần ở phần cuối
Đưa ra một phương án tối ưu nhất để tìm kiếm phần tử lớn nhất trong dãy (1.0 điểm) Câu 4. (2.0 điểm)
a) Vì sao trong ngôn ngữ lập trình C, không cho phép gán hai mảng nhưng lại có thể gán 2 biến kiểu
struct có phần tử là các mảng? (0.5đ)
b) Một sinh viên cài đặt phép * cho hai mảng như sau:
typedef struct array {int n; float* data} Array;
void newArray(Array &a) {
a.data = new float [n]; }
Array operator * (Array a, Array b) { Array temp; temp.n = a.n; newArray(temp);
for (int i = 0; i < n; i++)
temp.data[i] = a.data[i]*b.data[i]; return temp; } void main() { Array a, b, c;
//Gỉa sử đã có khởi tạo và nhập dữ liệu cho hai mảng a, b
for (int i = 0; i < 10000; i++) c = a * b; }
Hãy dự đoán vấn đề gì có thể xảy ra với đoạn chương trình này? (0.5 điểm)
Cài đặt giải pháp khắc phục vấn đề trên (1.0 điểm) Câu 5. (1.0 điểm)
Cho cấu trúc danh sách liên kết như sau: struct Node { int data; Node *next; };
Hãy viết hàm đảo ngược danh sách :
Node* reverse(Node* head) {...}
a) Sử dụng đệ quy (0.5 điểm)
b) Không sử dụng đệ quy (0.5 điểm) Câu 6. (1.0 điểm)
Tinh chỉnh để nâng cao hiệu năng của chương trình sau:
void findK(float b, float *a, int n) { int i = 0, found = 0;
while ((!found) && (i

float x = log(b)/log(2);
if (a[i] == x) found = 1; else i++; } if (found) do_something; } ----------- HẾT ---------- Trang 2/2