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
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] và 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