Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 47

I.

Các thành phần cơ bản


1.Cách đặt tên nào sau đây là đúng cú pháp?

A. struct. Đây là một từ khóa trong C++, không thể sử dụng làm tên biến2
B. _flag
C. Count-1. Đây là một biểu thức toán học, không phải là một tên biến hợp lệ. Tên biến không được chứa ký
tự đặc biệt ngoại trừ dấu gạch dưới
D. 5th_Element. Tên biến không được bắt đầu bằng số1.

2.Cách đặt tên nào sau đây là sai cú pháp?

A. 5th_Element
B. struct
C. _flag
D. Count-1

3.Những hằng nào sau đây đúng quy cách?

A. '0x4F'.
B. 049. Đây là một số nguyên bát phân, nhưng số 9 không hợp lệ trong hệ bát phân1.
C. "04F" Đây là một chuỗi ký tự, không phải là một hằng số1.
D. 0x44

4.Hằng nào sau đây không đúng quy cách?

A. '0x4F'
B. "04F"
C. 0x44
D. 044

5.Những hằng nào sau đây đúng quy cách?

A. '0x49'
B. "049"
C. 0x49
D. 049

6.Cho biết kết quả trên màn hình sau khi thực hiện đoạn code sau:
enum { Delete = -1, Update, Insert, None };
cout << Update;

A. -1
B. 0
C. 1
D. 2

II. Biểu thức và toán tử


1.Cho đoạn khao báo sau:
int a; char c;
Những biểu thức nào có kiểu int?

A. (char)(c + 32) Biểu thức c + 32 có kiểu int, nhưng khi ép kiểu về char, kết quả sẽ có kiểu char.
B. c + a Cả hai toán hạng đều có kiểu int, nên kết quả cũng có kiểu int.
C. a + 1.0 Toán hạng 1.0 có kiểu double, nên khi cộng với a, a sẽ được chuyển đổi thành kiểu double, nên kết
quả cũng có kiểu double.
D. c + 1 Toán hạng c có kiểu char, nhưng khi cộng với số nguyên 1, nó sẽ được chuyển đổi thành kiểu int, nên
kết quả cũng có kiểu int.

2. Giá trị của biểu thức nào không phải là kiểu số nguyên nếu khai báo
int a; char c;

A. (char)(c + 32)
B. c + a
C. a + 1.0
D. c + 1

3.Cho đoạn khai báo sau:


int x = 4, y = 2, z;
Những biểu thức nào cho z bằng 4?

A. z = (x > y) << 2; vì (x > y) trả về giá trị 1, và 1 << 2 là phép dịch trái 2 bit, tương đương với 4.
B. z = x++ - y--;
C. z = (x + y) > 5? x : y; vì (x + y) > 5 trả về giá trị 1, và toán tử ba ngôi ?: sẽ chọn giá trị của x, tức là 4, làm
kết quả. Do đó, z = (x + y) > 5? x : y tương đương với z = 4.
D. Không biểu thức nào

4.Nếu a = 0x76 thì biểu thức ((a & 2) == 0) cho kết quả là bao nhiêu?

A. 0 0 1 1 1 0 1 1 0 (118)
B. 1 & 0 0 0 0 0 0 1 0 (2)
C. 0x77 0 0 0 0 0 0 1 0 (2)
D. 0x74

5.Nếu a = 0x76 thì biểu thức (a ^ 2) cho kết quả là bao nhiêu?

A. 0 0 1 1 1 0 1 1 0 (118)
B. 1 ^ 0 0 0 0 0 0 1 0 (2)
C. 0x77 0 1 1 1 0 1 0 0 (116)
D. 0x74

6.Nếu a = 0x76 thì biểu thức (a | 1) cho kết quả là bao nhiêu?

A. 0 0 1 1 1 0 1 1 0 (118)
B. 1 | 0 0 0 0 0 0 0 1 (1)
C. 0x77 0 1 1 1 0 1 1 1 (119)
D. 0x74
0 1 1 1 0 1 1 1 (119)
7.Cho biểu thức:
int x = 4, y = 2, z;
Những biểu thức nào cho z bằng 4?

A. z = (y % x) << 1; Vì y là 2 và x là 4, khi thực hiện phép chia lấy dư 2 % 4, kết quả là 2. Sau đó,
phép dịch bit sang trái << 1 sẽ tạo ra giá trị là 4. Vì vậy, biểu thức này sẽ cho z bằng 4.
B. z = x++ - y--;
C. z = x > y? x : y;
D. Cả 3 biểu thức

8. Cho biết kết quả kết quả của biểu thức !!5 ?

A. 0
B. 1 !5=0, !!5=1
C. 5
D. -5

9. Để nhân đôi một số nguyên dương a, biểu thức nào có tốc độ nhanh nhất?

A. a << 1 dịch chuyển bit


B. a *= 2
C. a += a
D. Bằng nhau

III. Cấu trúc rẽ nhánh


1.Cho biết kết quả trên màn hình khi chạy đoạn chương trình sau:
int a = 10, b = 5;
if (a == 0)
cout << "a = 0";
else
cout << b / a;

A. 0 (kiểm tra điều kiện)


B. a = 0
C. 0.5
D. Báo lỗi chia cho 0

2.Cho biết kết quả trên màn hình khi chạy đoạn chương trình sau:
int a = 10, b = 5;
if (a = 0)
cout << "a = 0";
else
cout << b / a;

A. 0
B. a = 0
C. 0.5
D. Báo lỗi chia cho 0 (gán)
3.Cho biết giá trị của T sau khi thực hiện đoạn biểu thức dưới đây:
int T = 17;
switch (T * T % 7) {
case 1: T = 7; break;
case 2: T = 14; break;
case 4: T = 28; break;
}

A. 14
B. 28
C. 7
D. 17

4. Cho biết giá trị của T sau khi thực hiện đoạn biểu thức dưới đây:

int T = 17;
switch (T * T % 5) {
case 1: T = 7; break;
case 2: T = 14; break;
case 4: T = 28; break;
}

A. 14
B. 28
C. 17
D. 7

5. Cho biết giá trị của T sau khi thực hiện đoạn biểu thức dưới đây:

int T = 17;
switch (T * T % 14) {
case 1: T = 7; break;
case 2: T = 14; break;
case 4: T = 28; break;
}

A. 14
B. 17. Dư 9 nên ko có case nào cả T giữ nguyên
C. 28
D. 7

IV. Các vòng lặp


1.Cho biết kết quả trên màn hình sau khi thực hiện đoạn chương trình sau:
int g = 1;
for (int i = 0; i < 3; i++) g *= 2;
cout << g;

A. 1
B. 4
C. 8
D. 27

2. Cho biết kết quả trên màn hình sau khi thực hiện đoạn chương trình sau:

int g = 1, n = 1;
for (int i = 0; i < 4; i++, n = n * 2 + 1) g += n;
cout << g;

A. 5
B. 12
C. 27
D. 58

3. Cho biết kết quả trên màn hình sau khi thực hiện đoạn chương trình sau:

int g = 1, n = 1;
for (int i = 0; i < 5; i++, n = n * 2 + 1) g += n;
cout << g;

A. 5
B. 12
C. 27
D. 58

4. Cho biết kết quả trên màn hình sau khi thực hiện đoạn chương trình sau:

int i, j, k;
for (i = 0, k = 0; i < 2; i++)
for (j = 0; j < 3; j++, k++)
cout << k;

A. 123456
B. 012345
C. 0123456
D. 6

5. Cho biết kết quả trên màn hình sau khi thực hiện đoạn chương trình sau:

int i, j, k;
for (i = 0, k = 0; i < 2; i++)
for (j = 0; j < 3; j++, k++) ;
cout << k;

A. 123456
B. 012345
C. 0123456
D. 6
6.Cho biết kết quả trên màn hình sau khi thực hiện đoạn chương trình sau:
int i, j, k;
for (i = 0, k = 1; i < 2; i++)
for (j = 0; j < 3; j++, k++)
cout << k;

A. 123456
B. 012345
C. 0123456
D. 6

7. Cho biết kết quả trên màn hình sau khi thực hiện đoạn chương trình sau:

int i, j, k;
for (i = 0, k = 0; i < 2; i++)
for (j = 0; j < 3; j++, k++)
cout << k;
cout << k;

A. 123456
B. 012345
C. 0123456
D. 6

V. Mảng
1.Những biểu thức khai báo nào sau đây là đúng?

A. short s[]; Đây là biểu thức khai báo không hợp lệ vì không có kích thước mảng được chỉ định. Một
mảng phải có kích thước xác định.
B. int n = 3, A[n];
C. int *p = (int *)1000; Đây là biểu thức khai báo đúng. Biến con trỏ p được khởi tạo với giá trị là
con trỏ tới địa chỉ 1000. Tuy nhiên, lưu ý rằng việc sử dụng một giá trị con trỏ cố định như 1000 có
thể không an toàn và không khả thi trên mọi hệ thống.
D. double d = 1e-10; Đây là biểu thức khai báo đúng. Biến d được khởi tạo với giá trị là 1e-10,
tức là 1 nhân 10 mũ âm 10, tương đương với 0.0000000001.

2.Cho mảng int A[]={4,5,0,8,9,2,7,3,1}; nếu &A[2] = 1096 thì (A + 4) là giá trị nào?

A. 8
B. 7
C. 1102
D. 1104

3.Cho mảng short A[] = { 4, 5, 0, 3, 9, 2, 8, 7, 1 } ; nếu &A[2] = 1096 thì (A + 5) là giá trị nào?

A. 8
B. 7
C. 1102
D. 1104

4. Biểu thức nào sau đây là đúng?

A. int M[] = { 1, 2, 3 }; Mảng M được khai báo là một mảng kiểu int và được khởi tạo với giá trị { 1,
2, 3 }.
B. char s[]; Khi khai báo một mảng kiểu char, bạn cần xác định kích thước của mảng hoặc cung cấp một
chuỗi khởi tạo.
C. double D[2] = { 1, 2, 3 }; Khi khai báo một mảng kiểu double với kích thước là 2, bạn chỉ có thể khởi tạo
mảng với 2 giá trị. Trong trường hợp này, bạn cần chỉ định { 1, 2 } thay vì { 1, 2, 3 }.
D. int n = 10, A[n]; sai vì nó khai báo một mảng A kiểu int có kích thước là n nhưng n là một biến, không
phải là một hằng số. Khi khai báo một mảng, ta phải chỉ rõ số phần tử của mảng bằng một hằng số hoặc
một biểu thức hằng2.

5. Cho mảng int A[] = { 4, 5, 0, 8, 9, 2, 7, 3, 1 }; Tính giá trị của A[A[2] + A[8]] .

A. 5 A[2] = 0 (phần tử thứ 2 trong mảng A)


B. 7 A[8] = 1 (phần tử thứ 8 trong mảng A)
C. 9 Do đó, A[A[2] + A[8]] sẽ trở thành A[0 + 1], tương đương với A[1].
D. 0 Giá trị của A[1] là 5.

6. Biểu thức nào sau đây là đúng?

A. int M[]; Khi khai báo một mảng kiểu int, bạn cần xác định kích thước của mảng hoặc cung cấp một giá
trị khởi tạo.
B. char s[5]="12345"; sai vì nó khai báo một mảng s kiểu char có 5 phần tử nhưng lại gán cho nó 6 ký tự là
“12345”. Khi gán một chuỗi cho một mảng char, ta phải nhớ rằng chuỗi luôn kết thúc bằng ký tự NULL ('\
0'), nên kích thước của mảng phải lớn hơn hoặc bằng số ký tự trong chuỗi.
C. double D[] = { 1, 2, 3 }; Mảng D được khai báo là một mảng kiểu double và được khởi tạo với giá
trị { 1, 2, 3 }.
D. Cả 3 biểu thức

7. Cho biết chỉ số của phần tử cuối cùng của mảng s nếu khai báo

char s[] = "0123456789";

A. 8
B. 9
C. 10
D. 11

8. Cho biết chỉ số của phần tử cuối cùng cả mảng s nếu khai báo

char s[] = "123456789";

A. 8
B. 9
C. 10
D. 11

9. Biểu thức nào khai báo mảng A chứa được n phần tử?
A. int A[n];
B. int A = new int[n];
C. int* A = new int[n];
D. Cả 3 biểu thức

10. Những biểu thức nào khai báo mảng A chứa được 10 phần tử?

A. int A[10];
B. int A = new int[10];
C. int* A = new int[10];
D. Cả 3 biểu thức

11. Vì sao đoạn chương trình dưới đây sinh ra lỗi?

int *p = new int;


p = new int[10];
delete[] p;
delete p;

A. Sai cú pháp
B. Xóa con trỏ khi chưa cấp phát
C. Cấp phát mảng khi chưa xóa
D. Cấp phát động không dùng cho biến đơn

12. Chọn kết quả hiện trên màn hình sau khi thực hiện đoạn chương trình sau:

char s[] = "NgON ngu LAP trinh C++";


for (int i = 0; s[i]; i++) {
if (s[i] >= 'a' && s[i] <= 'z') s[i] -= 32;
}
cout << s;

A. ngon ngu lap trinh c++


B. Ngon Ngu Lap Trinh C++
C. NGON NGU LAP TRINH C++
D. Không có đáp án đúng

13. Chọn kết quả hiện trên màn hình sau khi thực hiện đoạn chương trình sau:

char s[] = "NgON ngu LAP trinh C++";


for (int i = 0; s[i]; i++) {
if (s[i] >= 'A' && s[i] <= 'Z') s[i] += 32;
}
cout << s;

A. NGON NGU LAP TRINH C++


B. ngon ngu lap trinh c++
C. Ngon Ngu Lap Trinh C++
D. Không có đáp án đúng
14. Chọn kết quả hiện trên màn hình sau khi thực hiện đoạn chương trình sau

char s[] = "NgON ngu LAP trinh C++", last = 32, ch;
for (int i = 0; ch = s[i]; i++) {
if (ch >= 'a' && ch <= 'z' && last == 32) s[i] -= 32;
if (ch >= 'A' && ch <= 'Z' && last != 32) s[i] += 32;
last = ch;
}
cout << s;

A. Ngon Ngu Lap Trinh C++


B. NGON NGU LAP TRINH C++
C. ngon ngu lap trinh c++
D. Không có đáp án đúng

15. Chọn kết quả hiện trên màn hình sau khi thực hiện đoạn chương trình sau:

char s[] = "NgON ngu LAP trinh C++", last = 32;


for (int i = 0; s[i]; i++) {
char ch = s[i];
if (ch >= 'a' && ch <= 'z' && last == 32) s[i] = ch - 32;
if (ch >= 'A' && ch <= 'Z' && last != 32) s[i] = ch + 32;
}
cout << s;

A. NGON NGU LAP TRINH C++


B. ngon ngu lap trinh c++
C. Ngon Ngu Lap Trinh C++
D. Không có đáp án đúng

VI. Con trỏ


1.Những biểu thức nào khai báo mảng A chứa được 10 phần tử?

A. int A[10];
B. int A = new int[10];
C. int* A = new int[10];
D. Cả 3 biểu thức

2. Vì sao đoạn chương trình dưới đây sinh ra lỗi?

int *p = new int;


p = new int[10];
delete[] p;
delete p;

A. Sai cú pháp
B. Xóa con trỏ khi chưa cấp phát
C. Cấp phát mảng khi chưa xóa
D. Cấp phát động không dùng cho biến đơn
3. Chọn biểu thức thay cho /**/ trong đoạn biểu thức sau để khi gọi Function(), độ dài của mảng p giảm
đi 1:

int *p, n; // n - độ dài của mảng p


void Function() {
int *q = new int[/**/];
for (int i = 0; i < n; i++) q[i] = p[i];
delete[] p;
p = q;
}

A. --n
B. n - 1
C. n--
D. 1 trong 3 biểu thức

4. Chọn biểu thức thay cho /**/ trong đoạn biểu thức sau để khi gọi Function(), độ dài của mảng p tăng
lên 1:

int *p, n; // n - độ dài của mảng p


void Function() {
int *q = new int[++n];
for (int i = 0; i < /**/; i++)
q[i] = p[i];
delete[] p;
p = q;
}

A. n - 1
B. n
C. n + 1
D. Biểu thức khác

5.Chọn biểu thức thay cho /**/ trong đoạn biểu thức sau để khi gọi Function(int), độ dài của
mảng p bằng len:
int *p, n; // n - độ dài của mảng p
void Function(int len) {
int L = /**/, *q = new int[n = len];
for (int i = 0; i < L; i++) q[i] = p[i];
delete[] p;
p = q;
}

A. n > len? n: len


B. n < len? n: len
C. n
D. len

6. Tìm kết quả của đoạn chương trình sau:


int A[10] = {1, 2, 3, 4};
int i = A[0];
int *p = &A[1];
p++; (*p)--; *(p + 2) = 3;
int k = A[0] + A[2] + A[4];
int j = A[2];
cout << i << j << k;

A. 124
B. 126
C. 137
D. 135

7. Trong biểu thức nào, toán tử & là toán tử tham chiếu?

A. int Find(int *, int &);


B. int *p = &a;
C. flag & 2
D. a == b && b == c

VII. Hàm
1.Lập trình hàm có những ưu điểm nào?

A. Giảm dung lượng chương trình


B. Tăng tốc độ chương trình
C. Dễ quản lý và chỉnh sửa
D. Tất cả các điểm trên

2,Hàm inline có ưu điểm nào?

A. Giảm dung lượng chương trình


B. Tăng tốc độ chương trình
C. Dễ quản lý và chỉnh sửa
D. Tất cả các điểm trên

3. Bao nhiêu hàm Count được sinh ra trong đoạn chương trình sau:

template<class T> T Count(T v) { return v; }


void main() {
cout << Count(1.0) + Count(0x01) + Count(1);
}

A. 1
B. 2
C. 3
D. 4

4. Cho biết kiểu của biểu thức Count(2.0) + Count(3) + Count('4') nếu khai báo hàm sau:

template<class T> T Count(T) { return v; }


A. double
B. int
C. char
D. T

5. Biểu thức Count(2.0) + Count(3) + Count('4') sinh ra những hàm nào nếu khai báo:
template<class T> T Count(T);

A. double Count(double)
B. int Count(int)
C. char Count(char)
D. Cả 3 hàm trên

6.Cho biết kết quả của chương trình dưới đây:


template<class T> T Count(T v) { return v; }
void main() {
cout << sizeof(Count(2.0) + Count(3) + Count('4'));
}

A. 1
B. 2
C. 4
D. 8

7.Những biểu thức nào đúng cú pháp nếu khai báo:


void Analyze(int *, int *);
int A[], *p, N, &r = N;

A. Analyze(A, p)
B. Analyze(*A, *p)
C. cout << Analyze(A, &N)
D. Analyze(A, &r)

8,Biểu thức nào sai cú pháp nếu khai báo:


int Analyze(int *, int *);
int A[], *p, N, &r = N;

A. Analyze(*A, *p)
B. Analyze(A, &r)
C. Analyze(A, p)
D. cout << Analyze(A, &N)

9. Những biểu thức gọi hàm nào sau đây là sai nếu khai báo các hàm:

double Power(double, int);


void ToScreen(int);
A. Power(5, 3);
B. Power(5.0, 3.0);
C. ToScreen(5, 3);
D. ToScreen((int)5.25);

10. Cho các hàm sau:

double Power(double, int);


void ToScreen(int);

Biểu thức gọi hàm nào sau đây là đúng ?

A. ToScreen((int)5.25);
B. Power(5.0, 3.0);
C. ToScreen(5, 3);
D. Cả 3 biểu thức

11. Giá trị của biểu thức Calculate(9) là bao nhiêu nếu định nghĩa:

int Calculate(int v) {
if (v == 1) return v;
return 1 + (v & 1? Calculate(v - 1): Calculate(v / 2));
}

A. 7
B. 5
C. 8
D. 4
Bước 1: Calculate(9) = 1 + (9 & 1? Calculate(9 - 1): Calculate(9 / 2)). Vì 9 là số lẻ, nên 9 & 1 bằng 1, và hàm
sẽ gọi lại chính nó với tham số là 9 - 1, tức là 8.
Bước 2: Calculate(8) = 1 + (8 & 1? Calculate(8 - 1): Calculate(8 / 2)). Vì 8 là số chẵn, nên 8 & 1 bằng 0, và
hàm sẽ gọi lại chính nó với tham số là 8 / 2, tức là 4.
Bước 3: Calculate(4) = 1 + (4 & 1? Calculate(4 - 1): Calculate(4 / 2)). Vì 4 là số chẵn, nên 4 & 1 bằng 0, và
hàm sẽ gọi lại chính nó với tham số là 4 / 2, tức là 2.
Bước 4: Calculate(2) = 1 + (2 & 1? Calculate(2 - 1): Calculate(2 / 2)). Vì 2 là số chẵn, nên 2 & 1 bằng 0, và
hàm sẽ gọi lại chính nó với tham số là 2 / 2, tức là 1.
Bước 5: Calculate(1) = 1. Đây là điểm dừng của hàm đệ quy, nên ta không cần gọi lại hàm nữa.
Bước 6: Quay ngược lại các bước trước, ta được:
Calculate(2) = 1 + Calculate(1) = 1 + 1 = 2
Calculate(4) = 1 + Calculate(2) = 1 + 2 = 3
Calculate(8) = 1 + Calculate(4) = 1 + 3 = 4
Calculate(9) = 1 + Calculate(8) = 1 + 4 = 5

12.Giá trị của biểu thức Calculate(6) là bao nhiêu nếu định nghĩa:
int Calculate(int v) {
if (v == 1) return v;
return 1 + (v & 1? Calculate(v - 1): Calculate(v / 2));
}

A. 7
B. 8
C. 4
D. 5
Bước 1: Calculate(6) = 1 + (6 & 1? Calculate(6 - 1): Calculate(6 / 2)). Vì 6 là số chẵn, nên 6 & 1 bằng 0, và
hàm sẽ gọi lại chính nó với tham số là 6 / 2, tức là 3.
Bước 2: Calculate(3) = 1 + (3 & 1? Calculate(3 - 1): Calculate(3 / 2)). Vì 3 là số lẻ, nên 3 & 1 bằng 1, và hàm
sẽ gọi lại chính nó với tham số là 3 - 1, tức là 2.
Bước 3: Calculate(2) = 1 + (2 & 1? Calculate(2 - 1): Calculate(2 / 2)). Vì 2 là số chẵn, nên 2 & 1 bằng 0, và
hàm sẽ gọi lại chính nó với tham số là 2 / 2, tức là 1.
Bước 4: Calculate(1) = 1. Đây là điểm dừng của hàm đệ quy, nên ta không cần gọi lại hàm nữa.
Bước 5: Quay ngược lại các bước trước, ta được:
Calculate(2) = 1 + Calculate(1) = 1 + 1 = 2
Calculate(3) = 1 + Calculate(2) = 1 + 2 = 3
Calculate(6) = 1 + Calculate(3) = 1 + 3 = 4

13. Giá trị của biểu thức Calculate(22) là bao nhiêu nếu định nghĩa:

int Calculate(int v) {
if (v == 1 || v == 2) return v;
return 1 + (v & 1? Calculate(v - 1): Calculate(v / 2));
}

A. 4
B. 8
C. 5
D. 7

14. Giá trị của biểu thức Calculate(28) là bao nhiêu nếu định nghĩa:

int Calculate(int v) {
if (v == 1) return v;
return 1 + (v &amp; 1? Calculate(v - 1): Calculate(v / 2));
}

A. 4
B. 7
C. 8
D. 5

15. Cho biết kết quả của đoạn chương trình sau:

void Convert(int &a, int b) { a = ++b; }


void main() {
int x = 3, y = 1;
Convert(x, y);
cout << x << y;
}

A. 31
B. 32
C. 21
D. 22
Trong câu hỏi của bạn, bạn đã định nghĩa một hàm Convert như sau:

void Convert(int &a, int b) {


a = ++b;
}

Hàm này nhận hai tham số: a là tham chiếu đến một biến kiểu int, b là một biến kiểu int. Hàm này không
trả về giá trị, nhưng nó sẽ thay đổi giá trị của biến mà a tham chiếu đến. Hàm này sẽ gán cho a giá trị của
b sau khi tăng lên một đơn vị bằng toán tử tiền tố.

Bạn cũng đã định nghĩa hàm main như sau:

void main() {
int x = 3, y = 1;
Convert(x, y);
cout << x << y;
}

Hàm này khai báo hai biến kiểu int: x và y, với giá trị ban đầu là 3 và 1. Sau đó, hàm này gọi hàm Convert
với tham số là x và y. Khi đó, hàm Convert sẽ thực hiện như sau:

Tham chiếu a sẽ tham chiếu đến biến x, nên bất kỳ thay đổi nào đối với a sẽ ảnh hưởng đến x.
Biến b sẽ nhận giá trị của y, tức là 1.
Lệnh a = ++b; sẽ tăng giá trị của b lên một đơn vị, tức là 2, rồi gán cho a. Do đó, giá trị của x cũng sẽ bị
thay đổi thành 2.
Sau khi gọi hàm Convert, hàm main sẽ in ra giá trị của x và y bằng lệnh cout << x << y;. Lúc này, giá trị
của x là 2, giá trị của y là 1, nên kết quả in ra màn hình là 21.
16. Cho biết kết quả của đoạn chương trình sau:

void Convert(int a, int b) { a = ++b; }


void main() {
int x = 3, y = 1;
Convert(x, y);
cout << x << y;
}

A. 31
B. 32
C. 21
D. 22

17. Cho biết kết quả của đoạn chương trình sau:

void Convert(int &a, int b) { a = b++; }


void main() {
int x = 3, y = 1;
Convert(x, y);
cout << x << y;
}

A. 31
B. 32
C. 11
D. 12
void main() {
int x = 3, y = 1;
Convert(x, y);
cout << x << y;
}
Hàm này khai báo hai biến kiểu int: x và y, với giá trị ban đầu là 3 và 1. Sau đó, hàm này gọi
hàm Convert với tham số là x và y. Khi đó, hàm Convert sẽ thực hiện như sau:

 Tham chiếu a sẽ tham chiếu đến biến x, nên bất kỳ thay đổi nào đối với a sẽ ảnh hưởng đến x.
 Biến b sẽ nhận giá trị của y, tức là 1.
 Lệnh a = b++; sẽ gán cho a giá trị của b trước khi tăng lên một đơn vị, tức là 1, rồi mới tăng giá trị
của b lên một đơn vị, tức là 2. Do đó, giá trị của x cũng sẽ bị thay đổi thành 1.

Sau khi gọi hàm Convert, hàm main sẽ in ra giá trị của x và y bằng lệnh cout << x << y;. Lúc này, giá
trị của x là 1, giá trị của y là 1, nên kết quả in ra màn hình là 11.

18. Cho biết kết quả của đoạn chương trình sau:

void Convert(int &a, int &b) { a = b++; }


void main() {
int x = 3, y = 1;
Convert(x, y);
cout << x << y;
}

A. 31
B. 32
C. 11
D. 12

19.Cho biết kết quả của đoạn chương trình sau:


void Convert(int a, int &b) { a = ++b; }
void main() {
int x = 3, y = 1;
Convert(x, y);
cout << x << y;
}

A. 31
B. 32
C. 21
D. 22
20. Cho biết kết quả của chương trình sau:

int Get(int a, int b) {


if (a == 2) return (b % 4 == 0? 29: 28);
switch (a) {
case 4: case 6:
case 9: case 11: return 30;
}
return 31;
}
void main() { cout << Get(2000, 2); }

A. 28
B. 29
C. 30
D. 31

21. Cho biết kết quả của chương trình sau:

int Get(double a, double b, double c, double x[]) {


double d = b * b - 4*a*c;
if (d < 0) return 0;
a *= 2;
if (d == 0) {
x[0] = x[1] = -b / a;
return 1;
}
d = sqrt(d);
x[0] = (-b - d) / a; x[1] = (-b + d) / a;
return 2;
}
void main()
{
double a = 1, b = 3, c = 2;
double x[2];
cout << Get(a, b, c, x); cout << x[1];
}

A. 2-1
B. 2-2
C. 1-1
D. -2-1

VII. Hướng đối tượng


1.Đoạn chương trình dưới đây cho kết quả nào?
class Value { int _v;
public:
Value(int v = 0) : _v(v) { }
~Value() { cout << _v; }
};
void main() { Value a(5), b; }

A. 55
B. 00
C. 50
D. 05

2.Đoạn chương trình dưới đây gọi những hàm nào?


class Value { int _v;
public:
Value(int v = 0) { _v = v; }
Value operator+(Value v) { return Value(_v + v._v); }
};
void main() { Value a, b = a + 1; }

A. Value(int)
B. Value operator+(Value)
C. Value operator=(Value)
D. Báo lỗi vì không có toán tử cộng với tham số kiểu int

3.Đoạn biểu thức sau xuất hiện lỗi ở dòng nào?


class Value { int _v;
public:
static int GetFactor(int a) { return _v * a; } //1
Value(int value) { _v = value; } //2
};
void main() {
Value a(5), b(10); //3
Value::GetFactor(2); //4
}

A. //1
B. //2
C. //3
D. //4

4. Đoạn chương trình dưới đây cho kết quả nào?

class Value { int _v;


public:
Value(int v = 0) : _v(v) { }
~Value() { cout << _v; }
};
void main() { Value a, b(5); }

A. 05
B. 00
C. 50
D. 55

5.Đoạn chương trình dưới đây cho kết quả nào?


class Value { int _v;
public:
Value(int v = 0) : _v(v) { }
Value(Value &a) : _v(a._v) { }
~Value() { cout << _v; }
};
void main() { Value a(5), b(a); }

A. 50
B. 00
C. 55
D. 05

6.Đoạn chương trình dưới đây gọi hàm nào?


class Complex { double re, im;
public:
Complex() { re = im = 0; }
Complex(double r, double i = 0) : re(r), im(i) { }
};
void main() { Complex Z(10); }

A. Complex()
B. Complex(double)
C. Complex(double, double)
D. Sai cú pháp

7. Cho class sau:

class String { char * data;


public:
String() { data = new char[1]; }
String(char c, int n) {
for (int i = 0; i < n; i++) data[i] = c;
}
static void Copy(char *dst, char *src) {
int i = 0; while (src[i]) dst[i] = src[i++];
dst[i] = 0;
}
};
void main() {
char s1[100], s2[]="Test";
// Các biểu thức
}
Chương trình sẽ sinh ra lỗi khi chạy đến biểu thức nào?

A. String a;
B. String b('0', 8);
C. String::Copy(s1, s2);
D. Cả 3 biểu thức trên

8. Những dòng nào sinh ra lỗi khi dịch đoạn chương trình dưới đây?

template <class _T, int n> class BaseItem { };


class NumberItem : public BaseItem<int, 5> { }; // 1
void main() {
BaseItem<int, int> i; // 2
BaseItem<double, 1.0> d; // 3
}

A. // 1
B. // 2
C. // 3
D. Cả 3 phương án trên

9. Cho class sau:

class String { char * data;


public:
String() { data = new char[1]; }
String(char c, int n) {
data = new char[n+1];
for (int i = 0; i < n; i++) data[i] = c;
}
static void Copy(char *dst, char *src) {
int i = 0; while (src[i]) dst[i] = src[i++];
dst[i] = 0; }
};
void main() {
char s1[10], s2[]="Kiem tra \"Ngon ngu lap trinh\"";
// Các biểu thức
}
Chương trình sẽ sinh ra lỗi khi chạy đến biểu thức nào?

A. String a;
B. String b('0', 8);
C. String::Copy(s1, s2);
D. Cả 3 biểu thức trên

10. Cho Đoạn chương trình dưới đây gọi những hàm nào?

class Complex { double re, im;


public:
Complex(double r = 0, double i = 0) : re(r), im(i) { }
friend Complex operator+(const Complex &a, const Complex &b);
};
void main() { Complex Z(10, 5), Z1 = Z + 5; }

A. Complex operator+(const Complex&, const Complex&)


B. Complex Complex::operator+(const Complex&, const Complex&)
C. Complex::Complex(double, double)
D. Không có toán tử cộng với số nguyên

11. Cho các class sau:

class LogicElement { protected: int input;


public:
LogicElement() : input(0) { }
virtual int Output() = 0;
};
class LogicAnd : public LogicElement {
public:
int Output();
};
Những biểu thức nào có thể dùng trong hàm int LogicAnd::Output()?

A. LogicElement *pElem = new LogicAnd();


B. LogicElement *pElem = new LogicElement();
C. LogicElement *pElem;
D. LogicElement element;

12. Cho biết kết quả của đoạn chương trình dưới đây?

class Value { int _v;


public:
Value(int a): _v(a) { }
virtual void Print() { cout << _v; }
};
class ExtValue : public Value { int _u;
public:
ExtValue(int a, int b) : Value(a), _u(b * b) { }
void Print() { Value::Print(); cout << _u; }
};
void main() { ExtValue v(1, 2); v.Print(); }

A. 41
B. 12
C. 21
D. 14

13.Cho biết kết quả của đoạn chương trình dưới đây?

class Value { int _v;


public:
Value(int a): _v(a) { }
virtual void Print() { cout << _v; }
};
class ExtValue : public Value { int _u;
public:
ExtValue(int a, int b) : Value(a), _u(b * b) { }
void Print() { cout << _u; Value::Print(); }
};
void main() { ExtValue v(1, 2); v.Print(); }

A. 14
B. 21
C. 41
D. 12
Chương 5
1. ViếtmộtlớpString đểđónggóikiểuchuỗichar* vàcácphươngthứccầnthiết:
khởitạoString, khởitạosaochépString, thayđổinộidung đốitượngString
hiệntạibằngnộidung củamộtđốitượngString khác, ghépnộidung mộtđốitượngString
khácvàosauđốitượngString hiệntại.
2. ViếtlớpFraction (phânsố) vớinhữngphươngthức: khởitạo, khởitạosaochép,
cácphươngthứcthựchiệnphépcộng/ trừ/ nhân/ chia với1 phânsốkhác.
3. ViếtlớpSquare vàlớpRectangular (làlớpbạncủalớpSquare).
Viếtphươngthứckhởitạo, khởitạosaochép, phươngthứctínhdiệntích, tínhchuvi của2
lớp.
4. ViếtlớpVector 3 thànhphầnvớinhữngphươngthứccầnthiết: khởitạo,
khởitạosaochép, cộng/trừvector, nhânvới1 hằngsố, nhânvôhướng2 vector,
đếmsốVector hiệncó.

Câu 1:
#include <cstring>

class String {
private:
char* content;
int length;

public:

String(const char* str) {


length = strlen(str);
content = new char[length + 1];
strcpy(content, str);
}

String(const String& other) {


length = other.length;
content = new char[length + 1];
strcpy(content, other.content);
}

// Destructor để giải phóng bộ nhớ


~String() {
delete[] content;
}

void replace(const String& other) {


delete[] content;
length = other.length;
content = new char[length + 1];
strcpy(content, other.content);
}

void concatenate(const String& other) {


int newLength = length + other.length;
char* newContent = new char[newLength + 1];
strcpy(newContent, content);
strcat(newContent, other.content);
delete[] content;
length = newLength;
content = newContent;
}

int getLength() const {


return length;
}

const char* getContent() const {


return content;
}
};

Câu 2
class Fraction {
private:
int numerator;
int denominator;

public:
Fraction(int num = 0, int den = 1) : numerator(num), denominator(den) {}

Fraction(const Fraction& other) : numerator(other.numerator),


denominator(other.denominator) {}

Fraction add(const Fraction& other) const {


int newNumerator = (numerator * other.denominator) + (other.numerator *
denominator);
int newDenominator = denominator * other.denominator;
return Fraction(newNumerator, newDenominator);
}

Fraction subtract(const Fraction& other) const {


int newNumerator = (numerator * other.denominator) - (other.numerator *
denominator);
int newDenominator = denominator * other.denominator;
return Fraction(newNumerator, newDenominator);
}

Fraction multiply(const Fraction& other) const {


int newNumerator = numerator * other.numerator;
int newDenominator = denominator * other.denominator;
return Fraction(newNumerator, newDenominator);
}

Fraction divide(const Fraction& other) const {


int newNumerator = numerator * other.denominator;
int newDenominator = denominator * other.numerator;
return Fraction(newNumerator, newDenominator);
}
};

Câu 3:
#include <iostream>

class Square {
private:
double side;

public:
Square(double s) : side(s) {}

Square(const Square& other) : side(other.side) {}

double getArea() const {


return side * side;
}

double getPerimeter() const {


return 4 * side;
}
};

class Rectangular {
private:
double width;
double height;
public:
Rectangular(double w, double h) : width(w), height(h) {}

Rectangular(const Rectangular& other) : width(other.width),


height(other.height) {}

double getArea() const {


return width * height;
}

double getPerimeter() const {


return 2 * (width + height);
}
};

int main() {
Square square(5);
std::cout << "Area of square: " << square.getArea() << std::endl;
std::cout << "Perimeter of square: " << square.getPerimeter() << std::endl;

Rectangular rectangular(4, 6);


std::cout << "Area of rectangular: " << rectangular.getArea() << std::endl;
std::cout << "Perimeter of rectangular: " << rectangular.getPerimeter() <<
std::endl;

return 0;
}

Câu 4:
#include <iostream>

class Vector3 {
private:
double x;
double y;
double z;

public:
Vector3(double xVal = 0.0, double yVal = 0.0, double zVal = 0.0) : x(xVal),
y(yVal), z(zVal) {}

Vector3(const Vector3& other) : x(other.x), y(other.y), z(other.z) {}

Vector3 add(const Vector3& other) const {


return Vector3(x + other.x, y + other.y, z + other.z);
}

Vector3 subtract(const Vector3& other) const {


return Vector3(x - other.x, y - other.y, z - other.z);
}

Vector3 multiply(double scalar) const {


return Vector3(x * scalar, y * scalar, z * scalar);
}

double dotProduct(const Vector3& other) const {


return x * other.x + y * other.y + z * other.z;
}

int count() const {


return 3;
}
};

int main() {
Vector3 v1(1.0, 2.0, 3.0);
Vector3 v2(4.0, 5.0, 6.0);

Vector3 v3 = v1.add(v2);
std::cout << "Result of addition: (" << v3.getX() << ", " << v3.getY() << ",
" << v3.getZ() << ")" << std::endl;

Vector3 v4 = v2.subtract(v1);
std::cout << "Result of subtraction: (" << v4.getX() << ", " << v4.getY() <<
", " << v4.getZ() << ")" << std::endl;

Vector3 v5 = v1.multiply(2.5);
std::cout << "Result of scalar multiplication: (" << v5.getX() << ", " <<
v5.getY() << ", " << v5.getZ() << ")" << std::endl;

double dotProduct = v1.dotProduct(v2);


std::cout << "Dot product of v1 and v2: " << dotProduct << std::endl;

int count = v1.count();


std::cout << "Number of elements in vector: " << count << std::endl;

return 0;
}
Chương 6
1.ViếtcáclớpShape (lớptrừutượng) vàcáclớpcon Circle, Square, Rectangle, Ellipse, Sphere.
Hãythiếtkếviệckếthừasaochohợplý. Viếtcáchàmảotínhdiệntíchhình.
2. MộtCompany cónhânviêngồmDirector, Manager, vàWorker. Mỗinhânviêncótên,
mứclươngkhácnhau. Viếtchươngtrìnhthựchiệnviệcthêmnhânviên, in thôngtin nhânviên,
xóatoànbộnhânviên.

#include <iostream>

class Shape {
public:
virtual double getArea() const = 0;
};

class Circle : public Shape {


private:
double radius;

public:
Circle(double r) : radius(r) {}

double getArea() const override {


return 3.14159 * radius * radius;
}
};

class Square : public Shape {


private:
double side;

public:
Square(double s) : side(s) {}

double getArea() const override {


return side * side;
}
};

class Rectangle : public Shape {


private:
double width;
double height;
public:
Rectangle(double w, double h) : width(w), height(h) {}

double getArea() const override {


return width * height;
}
};

class Ellipse : public Shape {


private:
double majorAxis;
double minorAxis;

public:
Ellipse(double major, double minor) : majorAxis(major), minorAxis(minor) {}

double getArea() const override {


return 3.14159 * majorAxis * minorAxis;
}
};

class Sphere : public Shape {


private:
double radius;

public:
Sphere(double r) : radius(r) {}

double getArea() const override {


return 4.0 * 3.14159 * radius * radius;
}
};

int main() {
Circle circle(5);
std::cout << "Area of circle: " << circle.getArea() << std::endl;

Square square(4);
std::cout << "Area of square: " << square.getArea() << std::endl;

Rectangle rectangle(3, 6);


std::cout << "Area of rectangle: " << rectangle.getArea() << std::endl;

Ellipse ellipse(4, 2);


std::cout << "Area of ellipse: " << ellipse.getArea() << std::endl;
Sphere sphere(3);
std::cout << "Surface area of sphere: " << sphere.getArea() << std::endl;

return 0;
}

Câu 2:
#include <iostream>
#include <vector>

class Employee {
protected:
std::string name;
double salary;

public:
Employee(const std::string& n, double s) : name(n), salary(s) {}

virtual void displayInfo() const = 0;

virtual ~Employee() {}
};

class Director : public Employee {


public:
Director(const std::string& n, double s) : Employee(n, s) {}

void displayInfo() const override {


std::cout << "Name: " << name << ", Salary: " << salary << ", Position:
Director" << std::endl;
}
};

class Manager : public Employee {


public:
Manager(const std::string& n, double s) : Employee(n, s) {}

void displayInfo() const override {


std::cout << "Name: " << name << ", Salary: " << salary << ", Position:
Manager" << std::endl;
}
};

class Worker : public Employee {


public:
Worker(const std::string& n, double s) : Employee(n, s) {}

void displayInfo() const override {


std::cout << "Name: " << name << ", Salary: " << salary << ", Position:
Worker" << std::endl;
}
};

class Company {
private:
std::vector<Employee*> employees;

public:
void addEmployee(Employee* employee) {
employees.push_back(employee);
}

void displayAllEmployees() const {


for (const auto& employee : employees) {
employee->displayInfo();
}
}

void removeAllEmployees() {
for (auto& employee : employees) {
delete employee;
}
employees.clear();
}

~Company() {
removeAllEmployees();
}
};

int main() {
Company company;

company.addEmployee(new Director("John Doe", 10000.0));


company.addEmployee(new Manager("Jane Smith", 8000.0));
company.addEmployee(new Worker("Mike Johnson", 5000.0));
company.addEmployee(new Worker("Emily Davis", 4500.0));
company.displayAllEmployees();

company.removeAllEmployees();

return 0;
}
Đề 2022-1
int find_first(char* s, char c) {
for (int i = 0; char cur = s[i]; i++)
if (cur == c) return i;
return -1;
}
int find_last(char* s, char c) {
int pos = -1;
for (int i = 0; char cur = s[i]; i++)
if (cur == c) pos = i;
return pos;
}

char* to_lower(char* s) {
for (int i = 0; char c = s[i]; i++)
if (c >= 'A' && 'Z' >= c) s[i] = c + 32;
return s;
}
char* to_upper(char* s) {
for (int i = 0; char c = s[i]; i++)
if (c >= 'a' && 'z' >= c) s[i] = c - 32;
return s;
}
char* replace(char* s, char old_char, char new_char) {
for (int i = 0; char c = s[i]; i++)
if (c == old_char) s[i] = new_char;
return s;
}
char* remove(char* s, char c) {
char* p = s;
for (int i = 0; char cur = s[i]; i++)
if (cur != c) *p++ = cur;

*p = 0;
return s;
}

class Pixel {
public:
int R, G, B;
public:
Pixel(int r = 0, int g = 0, int b = 0) : R(r), G(g), B(b) {}

int get_gray_scale() const {


return double(30 * R + 59 * G + 11 * B) / 100;
}
};

class Image {
public:
Pixel Data[32][32];

public:
void Range(int& minScale, int& maxScale) {
maxScale = 0;
minScale = 255;

for (int i = 0; i < 32; i++) {


for (int j = 0; j < 32; j++) {
int g = Data[i][j].get_gray_scale();
if (maxScale < g) maxScale = g;
if (minScale > g) minScale = g;
}
}
}

Image& ToGray() {
for (int i = 0; i < 32; i++) {
for (int j = 0; j < 32; j++) {
int g = Data[i][j].get_gray_scale();
Data[i][j] = Pixel(g, g, g);
}
}
return *this;
}
};

class Point {
public:
double X, Y;

public:
Point(double x = 0, double y = 0) : X(x), Y(y) { }

Point Offset(double dx, double dy) { return Point(X + dx, Y + dy); }


};

class Move {
public:
Point Data[100];
public:
void Bound(double& minX, double& minY, double& maxX, double& maxY) {
minX = maxX = Data[0].X;
minY = maxY = Data[0].Y;

for (int i = 1; i < 100; i++) {


double x = Data[i].X, y = Data[i].Y;

if (minX > x) minX = x;


if (minY > y) minY = y;
if (maxX < x) maxX = x;
if (maxY < y) maxY = y;
}
}

void Zigzag(Point p, double dx, double dy, bool horizontal = true) {


for (int i = 0; i < 100; i++) {
Data[i] = p;
if (horizontal) {
dy = -dy;
}
else {
dx = -dx;
}
p = p.Offset(dx, dy)
}
}
};
20231
#include <Windows.h>
void TextColor(int color) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
}
void GotoXY(int x, int y) {
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void ShowCursor(bool visible = true) {
CONSOLE_CURSOR_INFO info;
info.dwSize = 100; // 100%
info.bVisible = visible;
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);
}
int main() {
GotoXY(30, 10);
TextColor(0x1e);
cout << "Hello";
ShowCursor(false);
while (true) { }
}

LEDDEMO
// LedDemo.cpp : This file contains the 'main' function. Program execution begins and ends
there.
//
#include "../OOP/Screen.h"
#include "../OOP/Array.h"
Screen screen;
class Process {
protected:
static int value;
static int length;
virtual void init() = 0;
virtual void next() = 0;
virtual bool eop() = 0;
virtual void show_one(bool on) {
screen.SetColor(on ? 10 : 8) << char(254) << ' ';
}
public:
void Play();
};
void Process::Play() {
init();
while (!eop()) {
screen.SetCursor(1, 1);
for (int i = 0; i < length; i++) {
show_one(value & (1 << i));
}
Sleep(200); // hàm tạm dừng trong Windows.h
next();
}
}
int Process::value = 0; // bắt buộc phải khai báo lại biến static
int Process::length = 8; // 8 LED
class SingleL2R : public Process {
protected:
void init() override { value = 1; }
void next() override { value <<= 1; }
bool eop() override { return value >= (1 << length); }
};
class SingleR2L : public Process {
protected:
void init() override { value = 1 << (length - 1); }
void next() override { value >>= 1; }
bool eop() override { return value == 0; }
};
class TurnOnL2R : public SingleL2R {
protected:
void next() override {
SingleL2R::next();
value |= 1;
}
};
class TurnOffR2L : public SingleR2L {
protected:
void init() override { value = (1 << length) - 1; }
};

class TurnIn : public Process {


int left;
int right;

void merge() { value = (left |= 1) | (right |= 1 << (length - 1)); }


protected:
void init() override {
left = right = 0;
merge();
}
void next() override {
left <<= 1;
right >>= 1;
merge();
}
bool eop() override { return left >= (1 << (length >> 1)); }
};
class Blink : public Process {
protected:
int count, times;
void init() override {
value = 0;
count = times;
for (int i = 0; i < (length >> 3); i++) {
value <<= 8;
value |= 0xAA;
}
}
void next() override {
--count;
value = ~value;
}
bool eop() override { return count == 0; }
public:
Blink(int times = 10) : count(0), times(times) {}
};
int main()
{
screen.ShowCursor(false);
Process* ps[] = {
new SingleL2R(),
new SingleR2L(),
new TurnOnL2R(),
new TurnOffR2L(),
new TurnIn(),
new Blink(),
0
};
Process** p = ps;
while (true) {
(**p).Play();
if (*(++p) == 0) p = ps;
}
}

OOP
Bài 1:OOP về quản lý sinh viên, yêu cầu gồm 2 class, 1 class sv chưa tên, lớp, id sv, hàm gồm
nhập tên, lớ, id dv. 1 class về lớp, chứa tên lớp, hàm gồm thêm sửa xoá và hiển thị mọi thông tin
sinh viên đã nhập của lớp
#include <iostream>
#include <string>
#include <vector>
using namespace std;

class SV
{
private:
string id;
string name;
string inClass;

public:
SV(){}
SV(string msv, string ten, string lop) : id(msv), name(ten), inClass(lop) {}
void addStudent();
void delStudent(string msv);
void editStudent(string msv);
void showStudent();
void setName(string ten)
{
name = ten;
}

void setInclass(string lop)


{
inClass = lop;
}

};

vector<SV> listSV;

int main()
{
int input;
string id;
SV st;
while (true)
{
cout << "CHUONG TRINH QUAN LY SINH VIEN\n";
cout << "CHUC NANG : \n";
cout << "1. Them thong tin sinh vien.\n";
cout << "2. Sua thong tin sinh vien.\n";
cout << "3. Xoa thong tinh sinh vien.\n";
cout << "4. Dua ra thong tin sinh vien.\n";
cout << "0. Thoat.\n";
cout << "Ban chon : " ;
cin >> input;

switch (input)
{
case 1:
cout << "Ban da chon them thong tin sinh vien!\n";
st.addStudent();
break;
case 2:
cin.ignore(); // ignore roi xuong duoi khong ignore nua
cout << "Ban da chon sua thong tin sinh vien!\n";
cout << "Nhap id sinh vien : "; getline(cin, id);
st.editStudent(id);
break;
case 3:
cout << "Ban da chon xoa thong tin sinh vien!\n";
cout << "Nhap id sinh vien : "; cin >> id;
st.delStudent(id);
break;
case 4:
cout << "Ban da chon dua ra thong tin sinh vien!\n";
st.showStudent();
break;
case 0:
return 0;
}
}
}

void SV::addStudent()
{
string msv, hoTen, lop;
cin.ignore(32767, '\n');
cout << "Nhap ma sinh vien: " ; getline(cin, msv);
cout << "Nhap ten sinh vien: "; getline(cin, hoTen);
cout << "Nhap lop : "; getline(cin, lop);
listSV.push_back(SV(msv, hoTen, lop));

void SV::showStudent()
{
for (int i=0; i<listSV.size(); i++)
{
cout << "MSV : " << listSV[i].id << " ";
cout << "Ten SV: " << listSV[i].name << " ";
cout << "Lop : " << listSV[i].inClass << endl;
}
}

void SV::delStudent(string msv)


{
for (int i=0; i<listSV.size(); i++)
{
if (listSV[i].id == msv)
{
listSV.erase(listSV.begin() + i);
}
}
}

void SV::editStudent(string msv)


{
for (int i=0; i<listSV.size(); i++)
{
if (listSV[i].id == msv)
{
string ten, lop;
//cin.ignore();
cout << "Nhap lai ten SV: "; getline(cin, ten);
cout << "Nhap lai lop SV: "; getline(cin, lop);
listSV[i].setName(ten);
listSV[i].setInclass(lop);
}
else
cout << "MSSV khong ton tai!" << endl;
}
}
Đề bài:
Viết một lớp sinhvien gồm các thuộc tính: ten, tuoi, masinhvien. Và các phương thức
nhập xuất.

#include <bits/stdc++.h>
using namespace std;

class sinhvien
{
private:
string ten, masinhvien;
int tuoi;
public:
void set()
{
cin.ignore();
cout << "Nhap Ma Sinh Vien"; getline(cin, this-
>masinhvien);
cout << "Nhap Ten: "; getline(cin, this->ten);
cout << "Nhap Tuoi: "; cin >> this->tuoi;
}

void get()
{
cout << "Ma Sinh Vien: " << this->masinhvien << endl;
cout << "Ten: " << this->ten << endl;
cout << "Tuoi: " << this->tuoi << endl;
}
};

int main()
{
sinhvien obj;
obj.set();
obj.get();
}

Tạo class có hàm khởi tạo và hàm huỷ

Trong phần này, thay vì tạo class chỉ có 2 phương thức nhập xuất là set và get. Mình
sẽ tạo class sinhvien với hàm khởi tạo không tham số, hàm huỷ, và phương thức nhập
xuất
#include <bits/stdc++.h>
using namespace std;

class sinhvien
{
private:
string ten, masinhvien;
int tuoi;
public:
sinhvien()
{
this->masinhvien = "";
this->ten = "";
this->tuoi = 0;
}
~sinhvien()
{
this->masinhvien = "";
this->ten = "";
this->tuoi = 0;
}

void set()
{
cout << "Nhap Ma Sinh Vien"; getline(cin, this-
>masinhvien);
cout << "Nhap Ten: "; getline(cin, this->ten);
cout << "Nhap Tuoi: "; cin >> this->tuoi;
}

void get()
{
cout << "Ma Sinh Vien: " << this->masinhvien << endl;
cout << "Ten: " << this->ten << endl;
cout << "Tuoi: " << this->tuoi << endl;
}
};

int main()
{
sinhvien obj;

cout << "Before Set" << endl;


obj.get();
cout << "After Set" << endl;
obj.get();
}
Tạo class với hàm tính toán
Nâng cao thêm một chút nhé, tại lớp sinhvien mình sẽ cho thêm 3 thuộc tính
là: diemtoan diemvan và diemanh. Thêm một yêu cầu là tính điểm trung bình của
sinhvien đó.

#include <bits/stdc++.h>
using namespace std;

class sinhvien
{
private:
string ten, masinhvien;
int tuoi;
float diemtoan, diemvan, diemanh;
public:
sinhvien()
{
this->masinhvien = "";
this->ten = "";
this->tuoi = 0;
this->diemtoan = this->diemvan = this->diemanh = 0;
}
~sinhvien()
{
this->masinhvien = "";
this->ten = "";
this->tuoi = 0;
this->diemtoan = this->diemvan = this->diemanh = 0;
}

void set()
{
cout << "Nhap Ma Sinh Vien"; getline(cin, this-
>masinhvien);
cout << "Nhap Ten: "; getline(cin, this->ten);
cout << "Nhap Tuoi: "; cin >> this->tuoi;
cout << "Nhap Diem Toan - Van - Anh"; cin >> this-
>diemtoan >> this->diemvan >> this->diemanh;
}

void get()
{
cout << "Ma Sinh Vien: " << this->masinhvien << endl;
cout << "Ten: " << this->ten << endl;
cout << "Tuoi: " << this->tuoi << endl;
cout << "Diem Trung Bình: " << TB() << endl;
}

float TB()
{
return (this->diemtoan + this->diemvan +
this->diemanh)/3;
}
};

int main()
{
sinhvien obj;

obj.set();
obj.get();
}

Viết chương trình C++ để hiển thị chi tiết bảng lương của nhân viên. Chương
trình của bạn sẽ nhắc người dùng nhập số thứ tự nhân viên, id, tên, chức danh,
lương cơ bản, phụ cấp thu hút, phụ cấp chức vụ, phụ cấp trách nhiệm, sau đó
tính tổng lương và hiển thị kết quả.

#include<iostream>
#include<conio.h>
using namespace std;
class nhanvien
{
public:
int idnhanvien;
char tennhanvien[20],chucdanh[20];
void get()
{
cout<<"Nhap id cua nhan vien: ";
cin>>idnhanvien;
cout<<"Nhap ten nhan vien: ";
cin>>tennhanvien;
cout<<"Nhap chuc danh cua nhan vien: ";
cin>>chucdanh;
}
};
class luong:public nhanvien
{
float lcoban,pthuhut,pchucvu,ptrachnhiem,lrong;
public:
void get1()
{
cout<<"Nhap luong co ban: ";
cin>>lcoban;
cout<<"Nhap phu cap thu hut: ";
cin>>pthuhut;
cout<<"Nhap phu cap chuc vu: ";
cin>>pchucvu;
cout<<"Nhap phu cap trach nhiem: ";
cin>>ptrachnhiem;
}
void calculate()
{
lrong=lcoban+pthuhut+pchucvu+ptrachnhiem;
}
void display()
{
cout<<idnhanvien<<"\t"<<tennhanvien<<"\t"<<chucdanh<<"\t"<<lcoban<<"\
t"<<pthuhut<<"\t"<<pchucvu<<"\t"<<ptrachnhiem<<"\t"<<lrong<<"\n";
}
};
int main()
{
int i,n;
char ch;
luong s[10];
cout<<"Nhap so nhan vien: ";
cin>>n;
for(i=0;i<n;i++)
{
s[i].get();
s[i].get1();
s[i].calculate();
}
cout<<"\nid \tten \tchucdanh \tlcoban \tpthhut \tpchvu \tptnhiem \tlrong \n";
for(i=0;i<n;i++)
{
s[i].display();
}
return 0;
}

You might also like