lOMoARcPSD| 58746900
Trang 1 / 17
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN ĐỀ THI CUỐI KỲ KHOA KHOA HỌC
MÁY TÍNH
HỌC KỲ 1 – NĂM HỌC 2023-2024
Môn thi: Nhp môn lp trnh
môn/lớp: IT001.
Thời gian làm bài: 90 phút
(Sinh viên không được sử dụng tài liệu)
Thang đim
Câu 1: Phép toán số học
0.5
Câu 9: Mảng 1 chiều: kim tra tính
chất mảng
Câu 2: Phép toán khác
1
Câu 10: Chuỗi
Câu 3: Rẽ nhánh
switch…case
0.5
Câu 11: Mảng 2 chiều: duyệt 1 phần
của mảng
Câu 4: Vòng lặp
do.while, continue
0.5
Câu 12: Mảng 2 chiều: kim tra tính
chất mảng
Câu 5: Vòng lặp for
0.5
Câu 13: Con trỏ: nhận diện và giải
thích được các lỗi
(chú trọng kỹ năng diễn đạt)
Câu 6: Hàm: truyền tham
số cho hàm
0.5
Câu 14: Con trỏ và mảng 1 chiều:
hiu ý nghĩa của từng câu lệnh (chú
trọng kỹ năng diễn đạt)
Câu 7: Hàm: biến tham
chiếu
0.5
Câu 15: Cấu trúc (kết hợp con trỏ, tổ
chức các hàm)
Câu 8: Hàm đệ quy
0.5
Câu 16: Phân tích bài toán, sinh
testcase
Câu 1: (0.5 đim) Cho mt chương trình như sau:
#include <iostream>
using namespace std;
int main()
{ cout<<9.0/5-27%3<<",";
cout<<(int)2.15*(-
17/3)+(float)(12/5); return 0; }
Sau khi thực hiện xong chương trình, kết quả in ra màn hình là: 1.8,-8
Đáp án: có 2 số
Thang đim
Ghi chú
ĐỀ 4
MÃ ĐỀ: Tôi thành thật
lOMoARcPSD| 58746900
Câu
Trang 2 / 17
1.8
-8
Đúng 1 số đạt
0.25đ
-Không có dấu , ngăn cách cũng không
trừ đim, chỉ xét giá trị
-Nhiều SV ghi nhầm (hoặc khó phân
biệt) giữa dấu , và .
2: (1 đim) Cho mt chương trình như sau:
#include <iostream> using namespace std;
int main() { int a=7, b=3;
cout<<(a*b%2!=0 && (a<b || b<=3))<<",";
cout<<(a>b?-a:2*b)<<",";
cout<<(12<10<5)<<","; cout<< (!(a<b) &&
!5); return 0; }
Sau khi thực hiện xong chương trình, kết quả in ra màn hình là: 1,-7,1,0
Đáp án: có 4 số
Thang đim
Ghi chú
1
-7
1
0
Đúng 1 số
đạt 0.25đ
- Nhiều SV ghi đáp án là “ , -7, ,0 ”, hoặc
“1,-7,,”vẫn chấm theo vị trí của các số -
Nhiều SV chỉ ghi 2-3 số mà không đủ 3
dấu , phân cách (VD “1,-7” ) thì 0đ
Câu 3: (0.5 đim) Cho mt chương trình như sau:
#include <iostream>
using namespace
std; int main() {
int x,y; cin >>
x; y=2*x;
switch (x) {
case 1:
case 3:
y +=
y*x; case 4:
y--; case 5:
y = x-10; break;
case 6:
y = y/3;
break; default:
y--; } cout<<y;
return 0;
}
Nếu nhập giá trị của biến x là 1 thì kết quả in ra màn hình là: -9
Nếu nhập giá trị của biến x là 2 thì kết quả in ra màn hình là: 3
lOMoARcPSD| 58746900
Trang 3 / 17
Đáp án: có 2 số
Thang đim
-9
3
Mỗi số đúng đạt 0.25đ
Câu 4: (0.5 đim) Cho mt chương trình như sau:
#include <iostream>
using namespace
std; int main() {
int sum,num;
cin>>sum; do
{ cin>>num;
if(num%3!=0) continue;
sum+=num;
} while(sum <
110);
cout<<"sum="<<sum;
return 0;
}
Giả s user muốn nhập lần lượt các số sau 20 5 12 30 29 24 -24 -10 45 100 27 24 (có
th không th nhập hết được dãy số này)
Sau khi thực hiện xong chương trình, kết quả in ra màn hình là: sum=134
Đáp án: có 2 trường hợp đạt đim
Thang đim
sum=134
0.5đ
134(Chỉ ghi duy nhất số 134)
0.25đ
Câu 5: (0.5 đim) Cho mt chương trình như sau:
#include <iostream> using
namespace std; int main (){
int n=295,S=0; for(int
i=n; i>0; i=i/10)
S += i; cout<<S;
return 0; }
Sau khi thực hiện xong chương trình, kết quả in ra màn hình là: 326
Đáp án:
Thang đim
Ghi chú
326
0.5đ
326 là 1 số. Bất kỳ 1 số nào khác đều là sai, 0đ.
VD, nhiều SV trả lời là 325, 32 thì sai, tức 0đ
6: (0.5 đim) Cho mt chương trình như sau:
#include <iostream> using
namespace std; void fun(int
&a, int &b, int c)
lOMoARcPSD| 58746900
Câu
Trang 4 / 17
{ a*= b*c; b =
3*c; c = 2; }
int main() { int
x=1, y=5, z=4;
fun(y, x, z);
cout<<x<<y<<z;
return 0; }
Sau khi thực hiện xong chương trình, kết quả in ra màn hình là: 12204
Đáp án: có 3 số
Thang đim
Ghi chú
12
20
4
-Chỉ sai 1 số: 0.25đ
-Sai 2 số: 0đ
Chỉ có 3 mức đim:0, 0.25, 0.5,
không chia nhỏ hơn nữa SV
ghi 12,20,4 cũng không sao,
không trừ đim
Câu 7: (0.5 đim) Cho mt chương trình như sau:
#include <iostream>
using namespace std;
int test(int
a) { a=a-7;
return a;
} int main() { int
a=4; int &b=a;
cout<<test(a)<<",";
b=20; a=b-a-1;
b++;
cout<<a<<","<<b;
return 0; }
Sau khi thực hiện xong chương trình, kết quả in ra màn hình là: -3,0,0
Đáp án: có 3 số
Thang đim
Ghi chú
-3
0
0
-Chỉ sai 1 số: 0.25đ
-Sai 2 số: 0đ
-Chỉ có 3 mức đim:0, 0.25, 0.5,
không chia nhỏ hơn nữa
-Nhiều SV phân tách các số bằng
khoảng trắng, không dùng dấu , thì
cũng không trừ đim
lOMoARcPSD| 58746900
Câu
Trang 5 / 17
8: (0.5 đim) Cho mt chương trình như sau:
#include <iostream>
using namespace std; int
fun(int x)
{ if(x<2) return 5;
return (x-1)*fun(x-1);
} int main (){
cout<<fun(2)+fun(4);
return 0; }
Sau khi thực hiện xong chương trình, kết quả in ra màn hình là: 35
Đáp án:
Thang đim
Ghi chú
35
0.5đ
Bất kỳ 1 số nào khác đều là sai, 0đ
Câu 9: (0.5 đim) Cho mt chương trình như sau:
#include <iostream> using namespace std; bool KiemTra
(int *a, int n){ for (int i=0; i<n-2; i++)
if (a[i] <a[i+1]&& a[i+1]> a[i+2]) return true;
return false;
} int main() { int n,
a[100]; cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
cout<<KiemTra(a,n);
}
Với các trường hợp nhập dữ liệu đầu vào như ở ct Input dưới đây, hãy điền kết quả in
ra màn hình ở ct Output.
Input
Output: có 2 cá
ghi
ch
Thang đim
Ghi chú
1
3
0
false
0.25đ
Chấm theo cặp. Ở mỗi cặp, phải
đúng hết cả 2 mới đạt 0.25
đim, sai 1 số là 0đ
2
3 4
0
false
5
3 3 4 4 5
0
false
0.25đ
VD, ở cặp thứ 2, nếu SV ghi (0
1) là 0đ, không chia đim nhỏ
hơn nữa
10
3 3 4 4 5 5 1 2 6 6
0
false
lOMoARcPSD| 58746900
Câu
Trang 6 / 17
10: (0.75 đim) Hãy hoàn thành chương trình bên dưới đ thực hiện việc đếm số
lượng ký tự chữ cái Latinh trong mt chuỗi.
#include <iostream> using namespace std;
int count_Alpha(char *s) { int i=0,
dem=0; while(s[i]!='\0')
{
if
(('A'<=s[i]&&s[i]<='Z') | | ('a'<=s[i]&&s[i]<='z'))
dem++;
i++;
} return dem;
} int main() { char
str[35];
cin.getline(str, 30);
cout<<count_Alpha(str);
}
Vị
trí
Đáp án
Đáp án khác
Thang
đim
Ghi chú:
Những trường hợp sau là
sai, 0đ
(1)
s[i]!='\0'
*(s+i)!= '\0'
s[i]!=NULL
0.25đ
SAI: KHÔNG CÓ
n(s)
y cập
= 'null'
ĐIỂM
n,
n(s) i<=strle
g có thư
viện) n(s)
<=30 (sẽ tru
rác)
0'
NULL', s[i]!
i<strle
i<strle
(khôn
i>strle
i<30, i
giá trị
s[i] '\
i! ='\0'
s[i]!= '
(2)
('A'<=s[i]&&s[i]<='Z')
('A'<=s[i] and s[i]<='Z' ) or
0.25đ
SAI: KHÔNG CÓ
ĐIỂM
(1)
(2)
(3)
lOMoARcPSD| 58746900
Trang 7 / 17
| |
('a'<=s[i]&&s[i]<='z')
('a'<=s[i] and s[i]<='z')
(65<=s[i]&&s[i]<=90) | |
97<=s[i]&&s[i]<=122
('A'<=*(s+i)&&*(s+i)<='Z')
| |
('a'<=*(s+i)&&*(s+i)<='z')
'A'<=s[i] (chỉ so với A
hoặc chỉ so với Z)
('A'<=s[i]&&s[i]<='Z')
(chỉ xét chữ hoa, thiếu chữ
thường hoặc ngược lại)
'A'<=s[i]&&s[i]<='z' (xét
từ A viết hoa đến z viết
thường hoặc ngược lại từ a
thường đến Z hoa)
('A'<=s[i]<='Z') ||
('a'<=s[i]<='z') (không có
&&)
"A"<=s[i]&&s[i]<="Z"
(dùng nháy kép, không
phải ký tự)
A<=s[i]&&s[i]<=Z (thiếu
dấu nháy đơn, không phải
ký tự)
'A'<=s[i] || s[i]<='Z' (sai
dấu ||)
'A'<s[i]&&s[i]<'Z' (thiếu
=)
(s[i]==toupper(s[i])) ||
(s[i]==tolower(s[i])) (đề
không gọi thư viện
cstring)
s[i]=strupr(s[i]) (đề không
gọi thư viện)
(3)
i++; return
dem;
0.25đ
Đúng hết cả 2 mới đạt
0.25đ, sai/thiếu 1 trong 2
là 0đ
Nhiều SV dùng sai tên chuỗi, thay v s[i] th lại gọi a[i], str[i] th
TRỪ 0.25đ
lOMoARcPSD| 58746900
Câu
Trang 8 / 17
Câu 11: (0.5 đim) Cho mt chương trình như sau:
#include <iostream>
using namespace std; int
main()
{ int a[5][5]={ {1,0,3,2,1},
{1,8,2,0,5},
lOMoARcPSD| 58746900
Trang 9 / 17
{7,2,3,1,4},
{4,3,0,1,3},
{1,2,3,4,5}}; int S=0;
for(int i=0; i<3;i++)
for(int j=1;j<4;j++)
if(i!=j)
S+=a[i][j]; cout<<S;
return 0; }
Sau khi thực hiện xong chương trình, kết quả in ra màn hình là: 10
Đáp án:
Thang đim
Ghi chú
10
0.5đ
Bất kỳ 1 số nào khác đều là sai, 0đ
Câu 12: (0.5 đim) Cho mt chương trình như sau:
#include <iostream> using
namespace std; int fun(int
arr[][6], int n)
{ int i,j; for (i = 0; i
< n; i++) { for
(j=0;j<n;j++)
if(arr[i][j] < 0)
break; if (j==n)
return i; for
(j=0;j<n;j++)
if(arr[i][j] >= 0)
break; if (j==n)
return i;
}
return -1;
} int
main()
{ int a[6][6]={ {0,1,0,1,0,1},
{0,-1,2,-3,4,-5},
{-1,0,-1,0,-1,0},
{-6,-5,-4,-3,-2,-1},
{1,-1,1,-1,1,-1},
{1,2,3,4,5,6}
};
cout<<fun(a,6);
return 0; }
Sau khi thực hiện xong chương trình, kết quả in ra màn hình là: 0
Đáp án:
Thang đim
Ghi chú
0
0.5đ
Bất kỳ 1 số nào khác đều là sai, 0đ
lOMoARcPSD| 58746900
Trang 10 / 17
Câu 13: (1 đim) Cho mt chương trình như sau. Hãy cho biết dòng lệnh nào sai (sai
về cú pháp hoặc logic), và cho biết tại sao sai?
STT
Chương trình
Gii thch ti sao cc dng lnh b sai
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#include <iostream>
using namespace std;
int main()
{ float
*pa,*pb=NULL; int
a=2,b=4;
pa=&a;
pb = &(b-a);
int p[]={1,2,3};
*(p+2)=0;
p=p+2; cout<<p;
&pb=p; return
0;
}
Dòng 7: pa=&a;
-Không tương thích về kiu dữ liệu
Dòng 8: pb = &(b-a);
-Không th tham chiếu một con trỏ đến một hằng
số hay một biu thức
-Hoặc, không th lấy địa chỉ của một hằng số hay
một biu thức
Dòng 11: p=p+2;
-Tên mảng p là một hằng con trỏ nên không th
thay đổi giá trị của hằng này
Dòng 13: &pb=p;
-Không th thay đổi địa chỉ của một biến trong bộ
nhớ (không được quyết định bởi người sử dụng)
- Hoặc, sai cú pháp của phép gán, vế phải của
phép gán phải là biến.
Đáp án:
Thang đim
Ghi chú
Có 4
dòng
lệnh sai
(báo lỗi)
Chỉ ra đúng 1 dòn
g
-Chỉ khi nào giải thích thuyết phục mới có đim,
dù xác định được dòng lệnh sai nhưng giải thích
không đạt vẫn không có phần đim nào
-Câu lệnh không sai/lỗi nhưng SV cho rằng sai thì
“BỊ ĐÁNH DẤU TRỪ 0.125”
-Nếu chỉ có 1 lần “BỊ ĐÁNH DẤU TRỪ 0.125”
thì bỏ qua KHÔNG TRỪ
- Nếu nhiều hơn 1 lần “BỊ ĐÁNH DẤU TRỪ
0.125” thì PHẢI TRỪ theo đúng số lần bị đánh
dấu
- Câu cout<<p; không bị lỗi vì chương trình
có th hiu là xuất địa chỉ của mảng d, nhưng nếu
SV cho rằng “lỗi xuất mảng, phải dùng vòng lặp
đ xuất từng phần t mảng” thì KHÔNG tính đim
cũng không trừ đim.
lệnh bị sai/lỗi và g
iải
thích “chấp nhn
được” sẽ đạt 0.25đ
lOMoARcPSD| 58746900
Trang 11 / 17
Ví dụ (mt số câu trả lời của
SV đã được đánh giá như sau)
ĐẠT 0.25đ
KHÔNG THUYẾT
PHỤC, KHÔNG CÓ
ĐIỂM
Dòng 7: pa=&a;
-“Không cùng kiu dữ
liệu giữa con trỏ pa và a” -
“a kiu int còn pa kiu
float”
-“sai do con trỏ kiu float
không th trỏ đến biến kiu
int”
-“sai cú pháp, sa lại là
&pa=a mới đúng” (SV còn
sai nghiêm trọng hơn)
Dòng 8: pb = &(b-a);
-“(b-a) không phải là 1
biến nên không có địa chỉ”
-“không th lấy địa chỉ của
b-a”
-“sai cú pháp, pb = &b mới
đúng”
-“sai vì b không phải con
trỏ”
-“thiếu int*, đúng phải
int* pb=&(b-a)”
-“địa chỉ không chứa biu
thức” (đọc không hiu)
Dòng 11: p=p+2;
(châm chước những câu trả
lời sau)
-“p là mảng, không th
thực hiện phép toán” -
“Không th cng mảng” -
“p là mảng, không phải giá
trị”
-“thiếu xác định vị trí do
giá trị của p là con trỏ,
không phải số”
-“chưa cấp phát b nhớ
cho p”(SAI)
-“sai vì không chỉ rõ tăng
giá trị ở phần t nào”
(không thuyết phục)
Dòng 13: &pb=p;
-“không th thay đổi được
địa chỉ của pb”
-“sai vì không th tự cấp
địa chỉ của 1 biến” -“hệ
thống tự cấp phát địa chỉ,
không gán được” -“do địa
chỉ là duy nhất và do
chương trình cấp khi khai
báo float*pb=NULL;
ở dòng 5”
-“pb là con trỏ, không th
gán giá trị cho pb bằng
lệnh này” (không thuyết
phục)
-“pb đã trỏ tới địa chỉ của
biến nên không th thêm &
nữa” (không thuyết phục)
lOMoARcPSD| 58746900
Trang 12 / 17
Dòng 5: float *pa,*pb=NULL;
KHÔNG SAI nhưng SV trả lời là: “lỗi do không cung
cấp địa chỉ cho con trỏ pa”, “sai do chưa khởi tạo giá trị
cho con trỏ pa”, “sai do con trỏ pa chưa trỏ vào đâu”,
“sai do con trỏ không phải là kiu số thực ĐÁNH
DẤU TRỪ 0.125
Dòng 9: int p[]={1,2,3};
KHÔNG SAI nhưng SV trả lời là: “sai vì phải khai báo
kích thước mảng”, “cú pháp đúng phải là int
p[3]={1,2,3};
ĐÁNH DẤU TRỪ 0.125
Dòng 10: *(p+2)=0;
KHÔNG SAI nhưng SV trả lời là: “sai vì giá trị trong
mảng p không th thay đổi được”, “mảng là con trỏ nên
không th thay đổi địa chỉ được”, “*(p+2) sai cú pháp”,
“p là mảng chứ không phải là biến”,”chưa khai báo con
trỏ
ĐÁNH DẤU TRỪ 0.125
Dòng 12: cout<<p;
KHÔNG SAI nhưng SV trả lời là “p là mảng, không th
xuất mảng như vậy, chỉ có th xuất từng phần t của
mảng dùng for() cout<<p[i]”, “sai logic vì khi đó sẽ in ra
địa chỉ”
KHÔNG tính đim cũng không trừ đim.
Câu 14: (0.75 đim) Cho mt đoạn chương trình như sau, hãy giải thích ý nghĩa của
từng câu lệnh trong hàm main từ dòng số 5 đến dòng số 8 và cho biết kết quả in ra màn
hình sau khi thực hiện xong chương trình.
Dng
lnh
số
Chương trình
Gii thch  ngha ca tng câu lnh
trong hm main t dng s5 đn dng s
8
lOMoARcPSD| 58746900
Trang 13 / 17
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#include <iostream> using
namespace std; int
main(){ int
a[5]={0,1,2,3,4};
int *p=new int(10);
p=&a[3]; p[-2]=4;
p++;
*p=7;
*(p-3)=10;
for (int i=0;i<5;i++)
cout<<a[i]<<" ";
return 0;
}
Dòng 5: tạo mt biến đng kiu int, cho
con trp qun lý (hay trỏ tới) biến
động mi, khi to giá trị của biến là
10
Dòng 6: P trỏ tới a[3], hoc p cha địa
chỉ của a[3]
Dòng 7: a[1]=4
Dòng 8: P trỏ tới a[4], hoc p cha địa
chỉ của a[4]
//Lưu ý: còn 1 câu hi khác bên dưới
Đáp án:
Thang đim
Ghi chú
Yêu cầu
SV giải
thích 4
dòng
lệnh như
trên
Chỉ cần giải thích thuyết phục 1
dòng lệnh nào đó là đạt 0.2
Nên chỉ cần 2 dòng chấp nhn
được là đạt trọn 0.5đ và chỉ tối
đa 0.5đ cho phần giải thích này
Vì đã chấm rng rãi như vậy nên đòi
hỏi SV phải giải thích chính xác, dùng
từ ngữ đúng, không mơ hồ, không rối
ren gây khó hiu cho người đọc Nếu
người đọc phải tốn công sức và thời
gian đ hiu câu trả lời của SV thì
xem như không đạt.
Ví dụ (mt số câu trả lời của
SV đã được đánh giá như sau)
ĐẠT 0.25đ
KHÔNG THUYẾT
PHỤC, KHÔNG CÓ
ĐIỂM
lOMoARcPSD| 58746900
Trang 14 / 17
Dòng 5: int *p=new int(10);
-“tạo 1 vùng nhớ, cho con
trỏ p trỏ tới vùng nhớ
mang giá trị 10”
“cấp phát đng vùng nhớ
kiu int mang giá trị 10
cho p”
“tạo con trỏ p, trỏ tới mt
vùng nhớ mới có giá trị
10”
-“tạo con trỏ p kiu int
giá trị 10” (SAI)
-“tạo mảng kiu int có 10
phần t”(SAI)
-“khởi tạo mảng đng gồm
10 giá trị” (SAI)
-“khởi tạo vùng nhớ int với
giá trị 10 cho con trỏ p
(GV đọc thấy khó hiu) -
“khởi tạo con trỏ p trỏ tới
vùng có giá trị 10” (thiếu
tạo biến đng nên chưa
thuyết phục lắm)
-“cấp phát đng cho con
trỏ p” (chưa đủ thông tin) -
“cấp phát đng cho con trỏ
p và con trỏ p có giá trị
10”
-“gán giá trị cho *p là 10”
(chưa đủ thông tin)
-“cấp phát b nhớ đng với
kiu số nguyên bằng 10
cho con trỏ p”
Dòng 6: p=&a[3];
-“con trỏ p trỏ tới địa chỉ
vùng nhớ của a[3], nơi lưu
giá trị của a[3]”
-“p lấy bằng địa chỉ của
phần t thứ a[3] trong
mảng a”
-“p trỏ đến vị trí thứ 4 của
mảng a” (châm chước
được)
- “p trỏ đến phần t thứ 4
của mảng a”
-“p trỏ tới địa chỉ của ô thứ
4 trong mảng a” (châm
chước được)
-“gán cho p địa chỉ của
phần t có index là 3 trong
mảng”
-“thay đổi vùng trỏ p
thành vị trí thứ 3 trong
mảng a” (SAI vì vị trí thứ
4 hoặc index 3 mới đúng)
-“gán con trỏ p vào vị trí
phần t số 3 của mảng a”
(người đọc không hiu) -
“p bằng với địa chỉ a[3]
nên p=a[3]” (câu trả lời
không chấp nhận được)
-“gán giá trị a[3] vào p”
(gán địa chỉ chứ sao là giá
trị)
-“gán giá trị con trỏ p (tức
địa chỉ) vào địa chỉ của
a[3]” (GV đọc ko hiu) -
“a[3] là tham số chiếu lên p,
a[3] thay đổi thì p thay đổi
theo”
lOMoARcPSD| 58746900
Trang 15 / 17
-“gán địa chỉ của con trỏ p
vào địa chỉ của a[3]” (dùng
từ sai)
Dòng 7: p[-2]=4;
-“phần t thứ 2 của mảng a
có giá trị là 4”
-“gán giá trị của phần t
trước phần t p trỏ tới 2 vị trí
bằng 4”
“gán 4 vào con trỏ p[-2]”
(GV đọc ko hiu)
-“cho phần t thứ p[-2] =4”
(không có thông tin gì mới)
-“con trỏ p lùi về 2 vị trí và
gán giá trị được lưu ở vị trí
đó bằng 4” (SAI vì p không
thay đổi)
-“gán a[-2]=4” (SAI vì a[0]
mới đúng, a[-2] truy cập
index âm)
-“p lùi xuống 2 đơn vị nên p
=a[0] và cho nó giá trị là 4”
(câu trả lời không chấp nhận
được)
-“con trỏ p[-2] trỏ tới a[0] và
gán cho a[0] giá trị mới là 4”
(con trỏ p[-2] là con trỏ gì, ở
đâu mà có)
lOMoARcPSD| 58746900
Trang 16 / 17
Dòng 8: p++;
-“dời con trỏ đến vị trí thứ
5 của mảng a”
-“p trỏ tới vị trí đứng sau vị
trí hiện tại đang trỏ” -“cho p
trỏ vào phần t kế tiếp của
mảng a”
-“p trỏ tới vị trí a[2]” (SAI
vì a[4] mới đúng) -“p tăng
lên 1 giá trị tức p=p+1”
(không có thông tin gì mới)
-“cng thêm cho con trỏ p 1
giá trị” (người đọc không
hiu)
-“đổi giá trị của vùng p+0
thành giá trị của vùng p+1,
tức a[3]=a[4]” (SAI)
-“tăng giá trị cho p”
(không rõ)
- “tăng giá trị của a[3] lên 1
đơn vị” (SAI vì câu lệnh
cập nhật con trỏ) - “tăng
địa chỉ a[3] lên a[4]” (GV
không hiu) -“tăng p lên 1
đơn vị tức *p từ 3 thành 4”
(SAI)
Sau khi thực hiện xong chương trình, kết quả in ra màn hình là: 0 10 2 3 7
Đáp án:
Thang đim
Ghi chú
0 10 2 3 7
0.25đ
Đúng hết dãy số mới có đim, sai 1 chữ số
ng
cũng không có đim nào
h nhau bởi khoảng trắ
Viết các số không các
cũng không trừ đim
Câu 15: (0.75 đim) Điền vào các vị trí trống đ hoàn chỉnh mt chương trình cho phép
nhập mt đa giác (DAGIAC) có n đim (DIEM), với 3 ≤ n ≤ 10. Chương trình yêu cầu
người dùng nhập số đim của đa giác, sau đó nhập tọa đ của từng đim. dụ, khi
nhập đa giác ABCD, cần phải nhập tọa đ của 4 đim (A, B, C, D) tạo thành đa giác.
Chú ý, không cần kim tra tính hợp lệ của đa giác và phải tận dụng được hàm nhập mt
đim (NhapMotDiem) trong hàm nhập mt đa giác (NhapMotDaGiac).
#include<iostream>
using namespace std;
#define MAXN 10
struct DIEM {
int x, y;
lOMoARcPSD| 58746900
Trang 17 / 17
}; struct
DAGIAC{
int n;
(1)
(2)
DAGIAC NhapMotDaGiac(-------------){
DAGIAC d;
cin>>d.n;
d.p = new DIEM[d.n];
for(int i=0;i<d.n;i++)
NhapMotDiem(d.p[i]);
return d;
}
Đáp án
Thang đim
Ghi chú:
Đúng (1,2,3,4,5)
0.25đ
Nếu đúng 5 vị trí này thì đã đạt
0.25đ, tức SV sẽ đạt tối thiu 0.25đ
cho phần NhapMotDaGiac
(3)
(4)
(5)
(6)
(
7
)
lOMoARcPSD| 58746900
Trang 18 / 17
Đúng (6,7)
0.25đ
Mt số trường hợp đặc biệt:
1. Nếu thiếu (hoặc sai) vị trí (6)
, tức không cấp phát vùng nhớ (hoặc cấp phát sai, VD
, DAGIAC *a = new DIEM[a->n] là SAI) cho mảng các DIEM thì ĐÃ
chỉ sai tm 1 lỗi khác (các vị trí còn lại đúng) thì bỏ qua, có th đạt 0.25đ cho
phần
cho phần NhapMotDaGiac
chỉ sai 1 hoặc 2 lỗi những vị trí còn lại thì châm chước được, có th đạt 0.5đ
cho
NhapMotDaGiac
d.p = new int[d.n]
MẤT 0.25đ
+
NhapMotDaGiac
+ sai nhiều hơn 1 lỗi khác thì 0đ
2. Nếu (6) đúng,
+ phần
NhapMotDaGiac
+ sai nhiều hơn 2 lỗi thì 0đ cho
phần
3. Nếu hàm NhapMotDiem định nghĩa như sau:
void NhapMotDiem(DIEM *a){ cin>>a->x>>a->y; }
thì lời gọi hàm phải truyền địa chỉ mới đúng, tức NhapMotDiem(&d.p[i]), thiếu & là
sai, MẤT 0.25đ dù (6) đúng
4. Nếu hàm NhapMotDiem định nghĩa như sau:
void NhapMotDiem(int a, int b){ cin>>a>>b; }, không có đim, tức 0đ cho hàm
NhapMotDiem
int main() {
DAGIAC B;
B = NhapMotDaGiac();
//Xử l đa gic return
0;}
Câu 16: (0.75 đim) Cho mt bài toán như sau:
Input: Mt số nguyên dương n với 1 ≤ n ≤ 1 tỷ.
Output: Số lượng hình chữ nhật diện tích nhỏ hơn n cả chiều dài, chiều rng
đường chéo đều số nguyên dương? (Mt hình chữ nhật th xoay ngang hay dọc
tùy ý, tức là hình chữ nhật với kích thước 4x3 cũng chính hình chữ nhật với kích
thước 3x4, chúng ta chỉ đếm mt hình)
lOMoARcPSD| 58746900
Trang 19 / 17
a. Cho mt ví dụ với bài toán trên. Giải thích vì sao có kết quả như vậy? (tức cho biết
chiều dài, chiều rng, đường chéo và diện tích của các hình chữ nhật thỏa điều kiện)
Giải thích: Hình chữ nhật (3, 4) với chiều rng là 3, chiều dài 4, đường
chéo
, đều là các số nguyên dương. Diện tích 3*4=12 < n =13
b. Tìm mt input mà có output là 3 và giải thích vì sao có kết quả như vậy?
Input: Ghi chú
1 số n bất kỳ thuộc khoảng 60<n<109 n SAI th không chấm phần
Ví dụ 61
Output: 3
3 hình chữ nhật bao gồm: (3,4)/(4,3)
(6,8)/(8,6)
(5,12)/(12,5)
Giải thích:
giải thích, 0đ.
Tuy nhiên, sẽ châm chước cho
tình huống như bên dưới
STT
Chiều dài
Chiều rng
Đường chéo
Diện tích
1
3
4
5
12
2
6
8
10
48
3
5
12
13
60
Nhiều SV chọn n = 109 hay n = 110 khi giải thích chỉ ra HCN thứ 3 (9, 12)
chứ không phải là (5, 12) như đáp án th là SAI, nhưng sẽ châm chước, đạt
0.25đ cho câu b
duy nhất 1 trường hợp châm chước đạt 0.25đ, đó khi SV liệt 3
HCN {(3,4),(6,8), (9,12)}
3 HCN nào khác đều 0đ: dụ {(3,4), (6,8), (12, 16)} , {(3,4), ,12),
(9, 12)}, {(3,4), (5,12), (12, 16)}, ....-->
1. Chỉ có
2. Bất kỳ b
(5
lOMoARcPSD| 58746900
Trang 20 / 17
3.
N
ế
u c
câu a và b SV đ
u ch
n {(3,4),(6,8), (9,12)} thì đ
t 0.5đ cho câu 16
9
12
1
5
108 (
Đây là đáp án SAI
, vì
output
khi đó là 4 ch
không
ph
i 3
)
H
T

Preview text:

lOMoAR cPSD| 58746900
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN ĐỀ THI CUỐI KỲ KHOA KHOA HỌC
MÁY TÍNH HỌC KỲ 1 – NĂM HỌC 2023-2024
Môn thi: Nhập môn lập trình Mã môn/lớp: IT001.
Thời gian làm bài: 90 phút ĐỀ 4
(Sinh viên không được sử dụng tài liệu)
MÃ ĐỀ: Tôi thành thật Thang điểm
Câu 1: Phép toán số học 0.5
Câu 9: Mảng 1 chiều: kiểm tra tính 0.5 chất mảng Câu 2: Phép toán khác 1 Câu 10: Chuỗi 0.75 Câu 3: Rẽ nhánh 0.5
Câu 11: Mảng 2 chiều: duyệt 1 phần 0.5 switch…case của mảng Câu 4: Vòng lặp 0.5
Câu 12: Mảng 2 chiều: kiểm tra tính 0.5 do.while, continue chất mảng Câu 5: Vòng lặp for 0.5
Câu 13: Con trỏ: nhận diện và giải 1 thích được các lỗi
(chú trọng kỹ năng diễn đạt) Câu 6: Hàm: truyền tham 0.5
Câu 14: Con trỏ và mảng 1 chiều: 0.75 số cho hàm
hiểu ý nghĩa của từng câu lệnh (chú
trọng kỹ năng diễn đạt) Câu 7: Hàm: biến tham 0.5
Câu 15: Cấu trúc (kết hợp con trỏ, tổ 0.75 chiếu chức các hàm) Câu 8: Hàm đệ quy 0.5
Câu 16: Phân tích bài toán, sinh 0.75 testcase
Câu 1: (0.5 điểm) Cho một chương trình như sau: #include using namespace std; int main()
{ cout<<9.0/5-27%3<<","; cout<<(int)2.15*(-
17/3)+(float)(12/5); return 0; }
Sau khi thực hiện xong chương trình, kết quả in ra màn hình là: 1.8,-8 Đáp án: có 2 số Thang điểm Ghi chú Trang 1 / 17 lOMoAR cPSD| 58746900 Câu 1.8 -8
Đúng 1 số đạt -Không có dấu , ngăn cách cũng không 0.25đ
trừ điểm, chỉ xét giá trị
-Nhiều SV ghi nhầm (hoặc khó phân biệt) giữa dấu , và .
2: (1 điểm) Cho một chương trình như sau: #include using namespace std; int main() { int a=7, b=3;
cout<<(a*b%2!=0 && (acout<<(a>b?-a:2*b)<<",";
cout<<(12<10<5)<<","; cout<< (!(a!5); return 0; }
Sau khi thực hiện xong chương trình, kết quả in ra màn hình là: 1,-7,1,0 Đáp án: có 4 số Thang điểm Ghi chú 1 -7 1 0
Đúng 1 số - Nhiều SV ghi đáp án là “ , -7, ,0 ”, hoặc đạt 0.25đ
“1,-7,,”vẫn chấm theo vị trí của các số -
Nhiều SV chỉ ghi 2-3 số mà không đủ 3
dấu , phân cách (VD “1,-7” ) thì 0đ
Câu 3: (0.5 điểm) Cho một chương trình như sau: #include using namespace std; int main() { int x,y; cin >> x; y=2*x; switch (x) { case 1: case 3: y += y*x; case 4: y--; case 5: y = x-10; break; case 6: y = y/3; break; default: y--; } cout<return 0; }
Nếu nhập giá trị của biến x là 1 thì kết quả in ra màn hình là: -9
Nếu nhập giá trị của biến x là 2 thì kết quả in ra màn hình là: 3 Trang 2 / 17 lOMoAR cPSD| 58746900 Đáp án: có 2 số Thang điểm -9 3
Mỗi số đúng đạt 0.25đ
Câu 4: (0.5 điểm) Cho một chương trình như sau: #include using namespace std; int main() { int sum,num; cin>>sum; do { cin>>num; if(num%3!=0) continue; sum+=num; } while(sum < 110);
cout<<"sum="<return 0; }
Giả sử user muốn nhập lần lượt các số sau 20 5 12 30 29 24 -24 -10 45 100 27 24 (có
thể không thể nhập hết được dãy số này)
Sau khi thực hiện xong chương trình, kết quả in ra màn hình là: sum=134
Đáp án: có 2 trường hợp đạt điểm Thang điểm sum=134 0.5đ
134(Chỉ ghi duy nhất số 134) 0.25đ
Câu 5: (0.5 điểm) Cho một chương trình như sau: #include using namespace std; int main (){ int n=295,S=0; for(int i=n; i>0; i=i/10) S += i; cout<return 0; }
Sau khi thực hiện xong chương trình, kết quả in ra màn hình là: 326 Đáp án: Thang điểm Ghi chú 326 0.5đ
326 là 1 số. Bất kỳ 1 số nào khác đều là sai, 0đ.
VD, nhiều SV trả lời là 325, 32 thì sai, tức 0đ
6: (0.5 điểm) Cho một chương trình như sau: #include using namespace std; void fun(int &a, int &b, int c) Trang 3 / 17 lOMoAR cPSD| 58746900 Câu { a*= b*c; b = 3*c; c = 2; } int main() { int x=1, y=5, z=4; fun(y, x, z); cout<return 0; }
Sau khi thực hiện xong chương trình, kết quả in ra màn hình là: 12204 Đáp án: có 3 số Thang điểm Ghi chú 12 20
4 -Chỉ sai 1 số: 0.25đ
Chỉ có 3 mức điểm:0, 0.25, 0.5, -Sai 2 số: 0đ
không chia nhỏ hơn nữa SV ghi 12,20,4 cũng không sao, không trừ điểm
Câu 7: (0.5 điểm) Cho một chương trình như sau: #include using namespace std; int test(int a) { a=a-7; return a; } int main() { int a=4; int &b=a; cout<b=20; a=b-a-1; b++; cout<return 0; }
Sau khi thực hiện xong chương trình, kết quả in ra màn hình là: -3,0,0 Đáp án: có 3 số Thang điểm Ghi chú -3 0
0 -Chỉ sai 1 số: 0.25đ -Chỉ có 3 mức điểm:0, 0.25, 0.5, -Sai 2 số: 0đ không chia nhỏ hơn nữa
-Nhiều SV phân tách các số bằng
khoảng trắng, không dùng dấu , thì cũng không trừ điểm Trang 4 / 17 lOMoAR cPSD| 58746900 Câu
8: (0.5 điểm) Cho một chương trình như sau: #include using namespace std; int fun(int x) { if(x<2) return 5; return (x-1)*fun(x-1); } int main (){ cout<return 0; }
Sau khi thực hiện xong chương trình, kết quả in ra màn hình là: 35 Đáp án: Thang điểm Ghi chú 35 0.5đ
Bất kỳ 1 số nào khác đều là sai, 0đ
Câu 9: (0.5 điểm) Cho một chương trình như sau:
#include using namespace std; bool KiemTra
(int *a, int n){ for (int i=0; iif (a[i] a[i+2]) return true; return false; } int main() { int n, a[100]; cin>>n; for(int i=0;icin>>a[i]; cout<}
Với các trường hợp nhập dữ liệu đầu vào như ở cột Input dưới đây, hãy điền kết quả in
ra màn hình ở cột Output.
Output: có 2 cá ch Thang điểm Ghi chú Input ghi 1 false
Chấm theo cặp. Ở mỗi cặp, phải 3
đúng hết cả 2 mới đạt 0.25 0 0.25đ điểm, sai 1 số là 0đ 2 false 3 4 0 5 false
VD, ở cặp thứ 2, nếu SV ghi (0 3 3 4 4 5 0 0.25đ
1) là 0đ, không chia điểm nhỏ hơn nữa 10 false 3 3 4 4 5 5 1 2 6 6 0 Trang 5 / 17 lOMoAR cPSD| 58746900 Câu
10: (0.75 điểm) Hãy hoàn thành chương trình bên dưới để thực hiện việc đếm số
lượng ký tự chữ cái Latinh trong một chuỗi. #include using namespace std;
int count_Alpha(char *s) { int i=0,
dem=0; while(s[i]!='\0') { (1) (2)
if(('A'<=s[i]&&s[i]<='Z') | | ('a'<=s[i]&&s[i]<='z')) dem++; i++; (3) } return dem; } int main() { char str[35]; cin.getline(str, 30); cout<} Vị Đáp án Đáp án khác Thang Ghi chú: trí điểm
Những trường hợp sau là sai, 0đ (1) s[i]!='\0' *(s+i)!= '\0'
0.25đ SAI: KHÔNG CÓ ĐIỂM s[i]!=NULL n, i n(s) i<=strlen(s) i (khôn viện) n(s) i>strle <=30 (sẽ t y c ru ập i<30, i rác) giá trị 0' s[i] '\ i! ='\0' = 'null' NULL', s[i]! s[i]!= '
(2) ('A'<=s[i]&&s[i]<='Z') ('A'<=s[i] and s[i]<='Z' ) or 0.25đ SAI: KHÔNG CÓ ĐIỂM Trang 6 / 17 lOMoAR cPSD| 58746900 | |
('a'<=s[i] and s[i]<='z')
('a'<=s[i]&&s[i]<='z')
(65<=s[i]&&s[i]<=90) | |
'A'<=s[i] (chỉ so với A
97<=s[i]&&s[i]<=122 hoặc chỉ so với Z)
('A'<=*(s+i)&&*(s+i)<='Z')
('A'<=s[i]&&s[i]<='Z') | |
(chỉ xét chữ hoa, thiếu chữ
('a'<=*(s+i)&&*(s+i)<='z')
thường hoặc ngược lại)
'A'<=s[i]&&s[i]<='z' (xét
từ A viết hoa đến z viết
thường hoặc ngược lại từ a thường đến Z hoa) ('A'<=s[i]<='Z') ||
('a'<=s[i]<='z') (không có &&)
"A"<=s[i]&&s[i]<="Z" (dùng nháy kép, không phải ký tự)
A<=s[i]&&s[i]<=Z (thiếu
dấu nháy đơn, không phải ký tự)
'A'<=s[i] || s[i]<='Z' (sai dấu ||) 'A'=) (s[i]==toupper(s[i])) || (s[i]==tolower(s[i])) (đề không gọi thư viện cstring)
s[i]=strupr(s[i]) (đề không gọi thư viện) (3) i++; return
0.25đ Đúng hết cả 2 mới đạt dem; 0.25đ, sai/thiếu 1 trong 2 là 0đ
Nhiều SV dùng sai tên chuỗi, thay vì s[i] thì lại gọi a[i], str[i] thì TRỪ 0.25đ Trang 7 / 17 lOMoAR cPSD| 58746900 Câu
Câu 11: (0.5 điểm) Cho một chương trình như sau: #include using namespace std; int main() { int a[5][5]={ {1,0,3,2,1}, {1,8,2,0,5}, Trang 8 / 17 lOMoAR cPSD| 58746900 {7,2,3,1,4}, {4,3,0,1,3}, {1,2,3,4,5}}; int S=0; for(int i=0; i<3;i++) for(int j=1;j<4;j++) if(i!=j)
S+=a[i][j]; cout<return 0; }
Sau khi thực hiện xong chương trình, kết quả in ra màn hình là: 10 Đáp án: Thang điểm Ghi chú 10 0.5đ
Bất kỳ 1 số nào khác đều là sai, 0đ
Câu 12: (0.5 điểm) Cho một chương trình như sau: #include using namespace std; int fun(int arr[][6], int n) { int i,j; for (i = 0; i < n; i++) { for (j=0;jif(arr[i][j] < 0) break; if (j==n) return i; for (j=0;jif(arr[i][j] >= 0) break; if (j==n) return i; } return -1; } int main()
{ int a[6][6]={ {0,1,0,1,0,1}, {0,-1,2,-3,4,-5}, {-1,0,-1,0,-1,0}, {-6,-5,-4,-3,-2,-1}, {1,-1,1,-1,1,-1}, {1,2,3,4,5,6} }; cout<return 0; }
Sau khi thực hiện xong chương trình, kết quả in ra màn hình là: 0 Đáp án: Thang điểm Ghi chú 0 0.5đ
Bất kỳ 1 số nào khác đều là sai, 0đ Trang 9 / 17 lOMoAR cPSD| 58746900
Câu 13: (1 điểm) Cho một chương trình như sau. Hãy cho biết dòng lệnh nào sai (sai
về cú pháp hoặc logic), và cho biết tại sao sai? STT Chương trình
Giải thích tại sao các dòng lệnh bị sai 1. #include Dòng 7: pa=&a; 2. using namespace std;
-Không tương thích về kiểu dữ liệu 3. int main() 4. { float
Dòng 8: pb = &(b-a); *pa,*pb=NULL; int 5. a=2,b=4;
-Không thể tham chiếu một con trỏ đến một hằng pa=&a; 6. pb = &(b-a);
số hay một biểu thức 7. int p[]={1,2,3};
-Hoặc, không thể lấy địa chỉ của một hằng số hay 8. *(p+2)=0; một biểu thức
9. p=p+2; cout<

Dòng 11: p=p+2; 10. &pb=p; return 11.
-Tên mảng p là một hằng con trỏ nên không thể 0; 12.
thay đổi giá trị của hằng này } 13. Dòng 13: &pb=p; 14.
-Không thể thay đổi địa chỉ của một biến trong bộ 15.
nhớ (không được quyết định bởi người sử dụng)
- Hoặc, sai cú pháp của phép gán, vế phải của
phép gán phải là biến.
Đáp án: Thang điểm Ghi chú Có 4
Chỉ ra đúng 1 dòn g
-Chỉ khi nào giải thích thuyết phục mới có điểm, dòng
dù xác định được dòng lệnh sai nhưng giải thích
lệnh bị sai/lỗi và g iải lệnh sai
không đạt vẫn không có phần điểm nào
thích “chấp nhận (báo lỗi)
-Câu lệnh không sai/lỗi nhưng SV cho rằng sai thì
được” sẽ đạt 0.25đ
“BỊ ĐÁNH DẤU TRỪ 0.125”
-Nếu chỉ có 1 lần “BỊ ĐÁNH DẤU TRỪ 0.125” thì bỏ qua KHÔNG TRỪ -
Nếu nhiều hơn 1 lần “BỊ ĐÁNH DẤU TRỪ
0.125” thì PHẢI TRỪ theo đúng số lần bị đánh dấu -
Câu cout<

có thể hiểu là xuất địa chỉ của mảng d, nhưng nếu
SV cho rằng “lỗi xuất mảng, phải dùng vòng lặp
để xuất từng phần tử mảng” thì KHÔNG tính điểm cũng không trừ điểm. Trang 10 / 17 lOMoAR cPSD| 58746900
Ví dụ (một số câu trả lời của
ĐẠT 0.25đ KHÔNG THUYẾT
SV đã được đánh giá như sau)
PHỤC, KHÔNG CÓ ĐIỂM Dòng 7: pa=&a; -“Không cùng kiểu dữ
-“sai cú pháp, sửa lại là
liệu giữa con trỏ pa và a” -
&pa=a mới đúng” (SV còn
“a kiểu int còn pa kiểu sai nghiêm trọng hơn) float”
-“sai do con trỏ kiểu float
không thể trỏ đến biến kiểu int” Dòng 8: pb = &(b-a); -“(b-a) không phải là 1
-“sai cú pháp, pb = &b mới
biến nên không có địa chỉ” đúng”
-“không thể lấy địa chỉ của -“sai vì b không phải con b-a” trỏ”
-“thiếu int*, đúng phải là int* pb=&(b-a)”
-“địa chỉ không chứa biểu
thức” (đọc không hiểu) Dòng 11: p=p+2;
(châm chước những câu trả -“chưa cấp phát bộ nhớ lời sau) cho p”(SAI)
-“p là mảng, không thể
-“sai vì không chỉ rõ tăng thực hiện phép toán” -
giá trị ở phần tử nào”
“Không thể cộng mảng” - (không thuyết phục)
“p là mảng, không phải giá trị”
-“thiếu xác định vị trí do
giá trị của p là con trỏ, không phải số” Dòng 13: &pb=p;
-“không thể thay đổi được
-“pb là con trỏ, không thể địa chỉ của pb” gán giá trị cho pb bằng
-“sai vì không thể tự cấp
lệnh này” (không thuyết
địa chỉ của 1 biến” -“hệ phục)
thống tự cấp phát địa chỉ,
-“pb đã trỏ tới địa chỉ của
không gán được” -“do địa
biến nên không thể thêm & chỉ là duy nhất và do
nữa” (không thuyết phục)
chương trình cấp khi khai báo float*pb=NULL; ở dòng 5” Trang 11 / 17 lOMoAR cPSD| 58746900
Dòng 5: float *pa,*pb=NULL; KHÔNG SAI nhưng SV trả lời là: “lỗi do không cung
cấp địa chỉ cho con trỏ pa”, “sai do chưa khởi tạo giá trị
cho con trỏ pa”, “sai do con trỏ pa chưa trỏ vào đâu”,
“sai do con trỏ không phải là kiểu số thực ĐÁNH DẤU TRỪ 0.125 Dòng 9: int p[]={1,2,3};
KHÔNG SAI nhưng SV trả lời là: “sai vì phải khai báo
kích thước mảng”, “cú pháp đúng phải là int
p[3]={1,2,3}; ĐÁNH DẤU TRỪ 0.125 Dòng 10: *(p+2)=0;
KHÔNG SAI nhưng SV trả lời là: “sai vì giá trị trong
mảng p không thể thay đổi được”, “mảng là con trỏ nên
không thể thay đổi địa chỉ được”, “*(p+2) sai cú pháp”,
“p là mảng chứ không phải là biến”,”chưa khai báo con
trỏ ĐÁNH DẤU TRỪ 0.125
Dòng 12: cout<

KHÔNG SAI nhưng SV trả lời là “p là mảng, không thể
xuất mảng như vậy, chỉ có thể xuất từng phần tử của
mảng dùng for() cout<

địa chỉ”  KHÔNG tính điểm cũng không trừ điểm.
Câu 14: (0.75 điểm) Cho một đoạn chương trình như sau, hãy giải thích ý nghĩa của
từng câu lệnh trong hàm main từ dòng số 5 đến dòng số 8 và cho biết kết quả in ra màn
hình sau khi thực hiện xong chương trình. Dòng Chương trình
Giải thích ý nghĩa của từng câu lệnh lệnh
trong hàm main từ dòng số 5 đến dòng số số 8 Trang 12 / 17 lOMoAR cPSD| 58746900 1. #include using
Dòng 5: tạo một biến động kiểu int, cho 2. namespace std; int
con trỏ p quản lý (hay trỏ tới) biến 3.
động mới, khởi tạo giá trị của biến là main(){ int 4. 10 a[5]={0,1,2,3,4}; 5.
Dòng 6: P trỏ tới a[3], hoặc p chứa địa int *p=new int(10); chỉ của a[3] 6.
p=&a[3]; p[-2]=4; Dòng 7: a[1]=4 7. p++; 8. *p=7; 9.
Dòng 8: P trỏ tới a[4], hoặc p chứa địa *(p-3)=10; chỉ của a[4] 10. for (int i=0;i<5;i++)
//Lưu ý: còn 1 câu hỏi khác ở bên dưới 11. cout<12. return 0; 13. } 14. Đáp án: Thang điểm Ghi chú Yêu cầu
Vì đã chấm rộng rãi như vậy nên đòi SV giải
Chỉ cần giải thích thuyết phục 1 hỏi SV phải giải thích chính xác, dùng thích 4
dòng lệnh nào đó là đạt 0.25đ
từ ngữ đúng, không mơ hồ, không rối dòng
Nên chỉ cần 2 dòng chấp nhận ren gây khó hiểu cho người đọc Nếu
lệnh như được là đạt trọn 0.5đ và chỉ tối người đọc phải tốn công sức và thời trên
đa 0.5đ cho phần giải thích này gian để hiểu câu trả lời của SV thì xem như không đạt.
Ví dụ (một số câu trả lời của
ĐẠT 0.25đ KHÔNG THUYẾT
SV đã được đánh giá như sau)
PHỤC, KHÔNG CÓ ĐIỂM Trang 13 / 17 lOMoAR cPSD| 58746900 Dòng 5: int *p=new int(10);
-“tạo 1 vùng nhớ, cho con
-“tạo con trỏ p kiểu int có
trỏ p trỏ tới vùng nhớ giá trị 10” (SAI) mang giá trị 10”
-“tạo mảng kiểu int có 10
“cấp phát động vùng nhớ phần tử”(SAI)
kiểu int mang giá trị 10
-“khởi tạo mảng động gồm cho p” 10 giá trị” (SAI)
“tạo con trỏ p, trỏ tới một
-“khởi tạo vùng nhớ int với
vùng nhớ mới có giá trị là giá trị 10 cho con trỏ p” 10”
(GV đọc thấy khó hiểu) -
“khởi tạo con trỏ p trỏ tới
vùng có giá trị 10” (thiếu
tạo biến động nên chưa thuyết phục lắm)
-“cấp phát động cho con
trỏ p” (chưa đủ thông tin) -
“cấp phát động cho con trỏ
p và con trỏ p có giá trị là 10”
-“gán giá trị cho *p là 10” (chưa đủ thông tin)
-“cấp phát bộ nhớ động với
kiểu số nguyên bằng 10 cho con trỏ p” Dòng 6: p=&a[3];
-“con trỏ p trỏ tới địa chỉ -“thay đổi vùng trỏ p
vùng nhớ của a[3], nơi lưu thành vị trí thứ 3 trong giá trị của a[3]”
mảng a” (SAI vì vị trí thứ
-“p lấy bằng địa chỉ của
4 hoặc index 3 mới đúng) phần tử thứ a[3] trong
-“gán con trỏ p vào vị trí mảng a”
phần tử số 3 của mảng a”
-“p trỏ đến vị trí thứ 4 của
(người đọc không hiểu) - mảng a” (châm chước
“p bằng với địa chỉ a[3] được)
nên p=a[3]” (câu trả lời
- “p trỏ đến phần tử thứ 4
không chấp nhận được) của mảng a”
-“p trỏ tới địa chỉ của ô thứ -“gán giá trị a[3] vào p” 4 trong mảng a” (châm
(gán địa chỉ chứ sao là giá chước được) trị)
-“gán cho p địa chỉ của
-“gán giá trị con trỏ p (tức
phần tử có index là 3 trong địa chỉ) vào địa chỉ của mảng”
a[3]” (GV đọc ko hiểu) -
“a[3] là tham số chiếu lên p,
a[3] thay đổi thì p thay đổi theo” Trang 14 / 17 lOMoAR cPSD| 58746900
-“gán địa chỉ của con trỏ p
vào địa chỉ của a[3]” (dùng từ sai) Dòng 7: p[-2]=4;
-“phần tử thứ 2 của mảng a “gán 4 vào con trỏ p[-2]” có giá trị là 4” (GV đọc ko hiểu)
-“cho phần tử thứ p[-2] =4”
-“gán giá trị của phần tử
(không có thông tin gì mới)
trước phần tử p trỏ tới 2 vị trí -“con trỏ p lùi về 2 vị trí và bằng 4”
gán giá trị được lưu ở vị trí
đó bằng 4” (SAI vì p không thay đổi)
-“gán a[-2]=4” (SAI vì a[0]
mới đúng, a[-2] truy cập index âm)
-“p lùi xuống 2 đơn vị nên p
=a[0] và cho nó giá trị là 4”
(câu trả lời không chấp nhận được)
-“con trỏ p[-2] trỏ tới a[0] và
gán cho a[0] giá trị mới là 4”
(con trỏ p[-2] là con trỏ gì, ở đâu mà có) Trang 15 / 17 lOMoAR cPSD| 58746900 Dòng 8: p++;
-“dời con trỏ đến vị trí thứ -“p trỏ tới vị trí a[2]” (SAI 5 của mảng a”
vì a[4] mới đúng) -“p tăng
-“p trỏ tới vị trí đứng sau vị lên 1 giá trị tức p=p+1”
trí hiện tại đang trỏ” -“cho p (không có thông tin gì mới)
trỏ vào phần tử kế tiếp của -“cộng thêm cho con trỏ p 1 mảng a”
giá trị” (người đọc không hiểu)
-“đổi giá trị của vùng p+0
thành giá trị của vùng p+1, tức a[3]=a[4]” (SAI) -“tăng giá trị cho p” (không rõ)
- “tăng giá trị của a[3] lên 1
đơn vị” (SAI vì câu lệnh
cập nhật con trỏ) - “tăng
địa chỉ a[3] lên a[4]” (GV
không hiểu) -“tăng p lên 1
đơn vị tức *p từ 3 thành 4” (SAI)
Sau khi thực hiện xong chương trình, kết quả in ra màn hình là: 0 10 2 3 7 Đáp án: Thang điểm Ghi chú 0 10 2 3 7 0.25đ
Đúng hết dãy số mới có điểm, sai 1 chữ số
cũng không có điểm nào ng Viết các số khô h nhau bở ng các i khoảng trắ cũng không trừ điểm
Câu 15: (0.75 điểm) Điền vào các vị trí trống để hoàn chỉnh một chương trình cho phép
nhập một đa giác (DAGIAC) có n điểm (DIEM), với 3 ≤ n ≤ 10. Chương trình yêu cầu
người dùng nhập số điểm của đa giác, sau đó nhập tọa độ của từng điểm. Ví dụ, khi
nhập đa giác ABCD, cần phải nhập tọa độ của 4 điểm (A, B, C, D) tạo thành đa giác.
Chú ý, không cần kiểm tra tính hợp lệ của đa giác và phải tận dụng được hàm nhập một
điểm (NhapMotDiem) trong hàm nhập một đa giác (NhapMotDaGiac). #include using namespace std; #define MAXN 10 struct DIEM { int x, y; Trang 16 / 17 lOMoAR cPSD| 58746900 }; struct DAGIAC{ int n; (1) (2)
DAGIAC NhapMotDaGiac(-------------){ DAGIAC d; (3) cin>>d.n; (4) d.p = new DIEM[d.n]; (6) for(int i=0;i NhapMotDiem(d.p[i]); ( 7 ) return d; (5) } Đáp án Thang điểm Ghi chú: Đúng (1,2,3,4,5) 0.25đ
Nếu đúng 5 vị trí này thì đã đạt
0.25đ, tức SV sẽ đạt tối thiểu 0.25đ cho phần NhapMotDaGiac Trang 17 / 17 lOMoAR cPSD| 58746900 Đúng (6,7) 0.25đ
Một số trường hợp đặc biệt:
1. Nếu thiếu (hoặc sai) vị trí (6) , tức không cấp phát vùng nhớ (hoặc cấp phát sai, VD d.p = new int[d.n] , DA
GIAC *a = new DIEM[a->n] là SAI) cho mảng các DIEM thì ĐÃ MẤT 0.25đ
chỉ sai thêm 1 lỗi khác (các vị trí còn lại đúng) thì bỏ qua, có thể đạt 0.25đ cho + phần NhapMotDaGiac
+ sai nhiều hơn 1 lỗi khác thì 0đ cho phần NhapMotDaGiac 2. Nếu (6) đúng, + phần
chỉ sai 1 hoặc 2 lỗi ở những vị trí còn lại thì châm chước được, có thể đạt 0.5đ NhapMotDaGiac cho
+ sai nhiều hơn 2 lỗi thì 0đ cho phần NhapMotDaGiac
3. Nếu hàm NhapMotDiem định nghĩa như sau:
void NhapMotDiem(DIEM *a){ cin>>a->x>>a->y; }
thì lời gọi hàm phải truyền địa chỉ mới đúng, tức NhapMotDiem(&d.p[i]), thiếu & là
sai, MẤT 0.25đ dù (6) đúng
4. Nếu hàm NhapMotDiem định nghĩa như sau:
void NhapMotDiem(int a, int b){ cin>>a>>b; }, không có điểm, tức 0đ cho hàm NhapMotDiem int main() { DAGIAC B; B = NhapMotDaGiac(); //Xử lý đa giác return 0;}
Câu 16: (0.75 điểm) Cho một bài toán như sau:
Input: Một số nguyên dương n với 1 ≤ n ≤ 1 tỷ.
Output: Số lượng hình chữ nhật có diện tích nhỏ hơn n mà cả chiều dài, chiều rộng và
đường chéo đều là số nguyên dương? (Một hình chữ nhật có thể xoay ngang hay dọc
tùy ý, tức là hình chữ nhật với kích thước 4x3 cũng chính là hình chữ nhật với kích
thước 3x4, chúng ta chỉ đếm một hình) Trang 18 / 17 lOMoAR cPSD| 58746900
a. Cho một ví dụ với bài toán trên. Giải thích vì sao có kết quả như vậy? (tức là cho biết
chiều dài, chiều rộng, đường chéo và diện tích của các hình chữ nhật thỏa điều kiện)
Giải thích: Hình chữ nhật (3, 4) với chiều rộng là 3, chiều dài là 4, đường chéo
, đều là các số nguyên dương. Diện tích 3*4=12 < n =13
b. Tìm một input mà có output là 3 và giải thích vì sao có kết quả như vậy? Input: Ghi chú
1 số n bất kỳ thuộc khoảng 60
n SAI thì không chấm phần Ví dụ 61 giải thích, 0đ. Output: 3
3 hình chữ nhật bao gồm: (3,4)/(4,3)
Tuy nhiên, sẽ có châm chước cho (6,8)/(8,6)
tình huống như bên dưới (5,12)/(12,5) Giải thích: STT Chiều dài
Chiều rộng Đường chéo Diện tích 1 3 4 5 12 2 6 8 10 48 3 5 12 13 60
Nhiều SV chọn n = 109 hay n = 110 và khi giải thích chỉ ra HCN thứ 3 là (9, 12)
chứ không phải là (5, 12) như đáp án thì là SAI, nhưng sẽ châm chước, đạt
0.25đ cho câu b
1. Chỉ có duy nhất 1 trường hợp châm chước đạt 0.25đ, đó là khi SV liệt kê 3 HCN {(3,4),(6,8), (9,12)}
2. Bất kỳ bộ 3 HCN nào khác đều 0đ: Ví dụ {(3,4), (6,8), (12, 16)} , {(3,4), ,12), (9, 12)}, {(3, (5
4), (5,12), (12, 16)}, ....--> 0đ Trang 19 / 17 lOMoAR cPSD| 58746900 3. N
ế u c ả câu a và b SV đ ề u ch ọ n {(3,4),(6,8), (9,12)} thì đ ạ t 0.5đ cho câu 16 9 12 1 5 108 ( Đây là đáp án SAI , vì output khi đó là 4 ch ứ không ph ả i 3 )
H T Trang 20 / 17