Cho đoạn chương trình dưới đây 2 điểm struct date { int day, month, year; int compareint d, int m, int y { int d1 = year... Giá trị lớn nhất của biễn kiểu unsigned char là: Câu 2.. Đâu l
Trang 1KIỂM TRA GIỮA KỲ
NGÔN NGỮ LẬP TRÌNH C++
Thời gian: 90 phút
(Được sử dụng tài liệu)
Lớp: ………
Mã SV: ………
Họ tên: ………
ĐỀ SỐ
1
Câu 1 Những mệnh đề nào dưới đây là đúng: (1,5 điểm)
Ngôn ngữ C++ có thể sử dụng các hàm của C như memcpy, strlen, …
Cùng một tên biến có thể khai báo trong cácđoạn khác nhau của một khối {…}
Từ long không thể dùng làm tên biến
Toán tử & cho giá trị 0 hoặc 1
Nếu khai báo int *p = (int *)1090 thì cout << (p + 1) đưa ra màn hình giá trị 0x0000044A
Toán tử return ((char *)p) trả giá trị p về cho hàm kiểu char *
Tham số mặc định của hàm phải đặt ở cuối danh sách tham số
Định nghĩa struct So{double a}; không có ý nghĩa thực tiễn
Độ phức tạp trung bình của thuật toán sắp xếp nổi bọt (BubbleSort) là O(n2)
Một hàm đệ quy không bao giờ dẫn đến lỗi tràn stack
Câu 2 Cho các biến sau: (2 điểm)
char c; int i; unsigned u; double d; int &ri = i; double *pd = &d;
Cho biết giá trị của các biến bị thay đổi sau khi thực hiện lần lượt từng dòng lệnh
c = 'A'; i = 5; u = 1; d = 1.5; ri = 2; *pd = 5;
if (++u || ++i || ++c) d /= 4;
for (; i > 0; i ) {u += (i << 1); u ;}
switch(c){case 'A':d++;case 'B':d+=2;default:d+=5;}
Câu 3 Cho đoạn khai báo sau: (1,5 điểm)
char s[]="1234567890"; unsigned *p = (unsigned *)&s[2];
a) Mảng s có 10 phần tử: đúng sai
b) (char)(*(p + 1)) bằng '5': đúng sai
c) Nếu gán *p=0x4163 thì cout << s cho hiện lên màn hình:
Câu 4 Hàm nào dưới đây tính x n : (1 điểm)
double f1(double x, int n)
{
double res = 1.0;
while (n) {res *= x; n;}
return (res);
}
double f2(double x, int n) {
if (n < 1) return 1.0;
return (x * f2(x, n – 1));
}
Hàm f1
Hàm f2
Cả hai hàm
Câu 5 Điền biểu thức vào những chỗ còn thiếu trong các hàm dưới đây (2 điểm)
// Hàm tìm độ dài của xâu ký tự
int len(char *s) {int k = 0; while ( ) k++; return (k);}
// Hàm so sánh hai xâu ký tự
int cmp(char *s1, char *s2) {
for (int i = 0; ; i++) {
if (s1[i] < s2[i]) return (-1);
} return 0; // hai xâu bằng nhau }
// Hàm nối hai xâu ký tự
char* concat(char* s1, char* s2) {
int l1 = len(s1), l2 = len(s2);
char* s = new char[ ], *p = s, *q;
for (q = s1; *q; q++, p++) *p = *q;
*p = 0;
return (s);
Trang 2Câu 6 Cho đoạn chương trình dưới đây (2 điểm)
struct date {
int day, month, year;
int compare(int d, int m, int y) {
int d1 = (year << 9) + (month << 5) + day;
int d2 = (y << 9) + (m << 5) + d;
if (d1 < d2)
return -1;
return (d1 > d2);
}
void set(int d, int m, int y) { day = d; month = m; year = y; } };
struct student {
int id; char name[50]; date dob; // mã, họ tên và ngày sinh
student *prev, *next;
void Create(int i, char *n, int d, int m, int y) {
next = prev = NULL;
id = i;
memcpy(name, n, len(n)+1);
dob.set(d, m, y);
}
void Print() { cout << id << '\t' << name << '\t' <<
dob.day << '/' << dob.month << '/' << dob.year << endl; } };
struct list {
student *head, *tail;
void Init() { head = tail = NULL; }
void Insert(int id, char *name, int d, int m, int y);
void Print();
};
a) Hoàn thành hàm Insert của struct list để thêm một sinh viên vào đầu danh sách
b) Hoàn thành hàm Print của struct list để in ra danh sách những sinh viên sinh sau ngày 01/01/1980
Trang 3ĐỀ THI LẦN 1 Môn Lập trình
Thời gian 60 phút
Câu 1 Giá trị lớn nhất của biễn kiểu unsigned char là:
Câu 2 Dòng nào không đúng trong C:
a) class aClass{public:int x;}; b) /* A comment */ c) char x=12;
Câu 3 Dòng lệnh: int c = 0; cout << c++ << c; cho in ra màn hình:
Câu 4 Biểu thức trong vòng lặp for(x = 0; x = 3; x++) được thực hiện bao nhiêu lần:
Câu 5 Cho hàm
int fn(int x) { if (x == 0 || x == 1) return 1;
if (x % 2 == 0) return (fn(x / 2) + 2);
return (fn(x – 1) + 3); } fn(7) trả về giá trị:
Câu 6 Cho đoạn khai báo: int A[10], *p = A + 4; Khi sử dụng biến p trong biểu thức thì *(p + 1) là:
a) Giá trị của p b) Giá trị của A[5] c) Địa chỉ của A[5]
Câu 7 Cho đoạn chương trình:
struct stack {struct node { char c; node *next; } *top;};
void Push(char c, stack *s){
stack::node *p = new stack::node;
p->c = c; .}
Đoạn lệnh ở là:
a) p->next = top; top = p;
b) p->next = s->top; s->top = p;
Câu 8 Nếu char s[] = “0123456789”; thì chỉ số cuối cùng của mảng s là:
Câu 9 Hàm nào là hàm tạo mặc định của lớp Aclass:
a) Aclass(Aclass& a) b) Aclass() c) ~Aclass()
Câu 10 Đâu là lệnh cấp phát mảng:
a) char *p=new char[20]; b) char p=new char[20]; c) char p=new char(20);
Câu 11 Trường hợp nào lớp D có thể truy cập vào vùng protected của lớp B:
a) class D {…}; b) class B {…}}; c) class D: public B {…};
Câu 12 Để tìm vị trí của giá trị 7 trong mảng 1 2 3 4 5 6 7 8 bằng thuật toán chia đôi, cần tìm chỉ số trung bình
bao nhiêu lần:
Câu 13 Đâu là lệnh giải phóng mảng p đã cấp phát:
Câu 14 Biểu thức 1/9*9 cho giá trị:
Câu 15 Thuật toán sắp xếp nào là tối ưu đối với mảng: 1 2 3 5 4
Câu 16 Cây nhị phân chứa các chữ cái được biểu diễn bằng mảng (0 – nút rỗng): A B C D E F G 0 0 H Khi
duyệt cây theo thứ tự trước sẽ cho:
a) A B C D E F G H b) A B D E C F G H c) A B D E H C F G
Trang 4Câu 17 Toán tử [] của class có mấy tham số:
Câu 18 Biểu thức 1 & 4 cho giá trị:
Câu 19 strcat(aString, “abc”) thực hiện:
a) copy “abc” vào aString b) Thêm “abc” vào sau aString c) so sánh “abc” và aString Câu 20 Cho char A[10] = {1, 2, 3, 4, 5, 6}; short *p = (short *)&A[2]; *p = 256; Bốn phần tử đầu tiên của A sẽ
là:
Câu 21 Cho chương trình sau:
1
2
3
4
5
6
7
8
9
class Vect {
protected:
int size;
double *data;
public:
Vect(): size(0), data(NULL) {}
Vect(int sz): size(sz) { data = new double[size]; } Vect(double *v, int sz): size(sz), data(*v) {}
Vect(int sz, const double *v)
{
size = sz;
data = new double[size];
for (int i = 0; i < size; i++)
data[i] = v[i];
}
~Vect() { if (data) delete[] data; } public:
int GetSize() { return size; } double& operator[](int index) { return data[index]; } };
class Sort: public Vect {
public:
Sort(int sz, const double *v): Vect(sz, v) {}
protected:
void Swap(int i, int j) { double t = data[i]; data[i] = data[j]; data[j] = t; }
virtual Sort& DoSort() = 0;
void Print(ostream& out)
{
for (int i = 0; i < size; i++)
out << ' ' << data[i];
} friend ostream& operator<<(ostream& out, Sort & v)
{
out << "original:";
v.Print(out);
out << "\nsorted:";
v.DoSort().Print(out);
return (out);
} };
class SelectionSort: public Sort {
public:
SelectionSort(int sz, const double *v): Sort(sz, v) private:
Sort& DoSort() {
Trang 511
return (*this);
} };
void main() {
double a[] = {1, 3, 5, 2, 4};
cout << new SelectionSort(4, A) << endl;
}
a) Những dòng lệnh nào sai? Sửa lại cho đúng
b) Thứ tự thực hiện các lệnh
c) Viết lại hàm DoSort của lớp SelectionSort để sắp xếp mảng theo thứ tự giảm dần
d) Cho biết kết quả hiện trên màn hình
Hướng dẫn:
1 Từ câu 1 đến câu 20: Kẻ bảng theo mẫu dưới đây:
Với mỗi câu, chọn 1 câu trả lời đúng bằng cách đánh dấu √ vào ô A, B hoặc C ở dòng tương ứng.
2 Câu 21, thực hiện như đã hướng dẫn ôn tập.