1 of 23

Ôn Tập�Thi Cuối Học Kỳ

Trịnh Tấn Đạt

Khoa CNTT - Đại Học Sài Gòn

Email: trinhtandat@sgu.edu.vn

Website: https://sites.google.com/site/ttdat88/

2 of 23

Nội dung

  1. Con Trỏ : con trỏ và mảng, cấp phát động và thu hồi vùng nhớ
  2. FILE và Mảng (1 chiều và 2 chiều) đọc FILE/ ghi FILE (file văn bản)
  3. Chuỗi ký tự: các hàm xử lý chuỗi, con trỏ và chuỗi ; nhập chuỗi từ bàn phím ; File và chuỗi
  4. Đệ Quy/ Khử đệ quy
  5. Chia để trị, quy hoạch động, tham lam, quay lui.

Hình thức thi:

+ Tự luận

+ Thời gian: 90 phút

+ KHÔNG SỬ DỤNG TÀI LIỆU

3 of 23

Con Trỏ

  • Định nghĩa
  • Các toán tử *, &
  • Con trỏ và mảng
  • Cấp phát động : new/delete

4 of 23

FILE

  • FILE văn bản
  • FILE và mảng 1 chiều : đọc file /ghi file (file dạng 1 và dạng 2)
  • FILE và mảng 2 chiều: đọc file/ ghi file (file dạng 1 và dạng 2)

  • Đọc/ ghi FILE và các thao tác trên mảng.

5 of 23

String

  • Các hàm cơ bản trong thư viện string.h (trong C) hoặc string (trong C++)

  • Các ví dụ trong slide: đếm từ, tách từ, từ dài nhất, ……

  • FILE và chuỗi

  • Các ví dụ và bài tập trong slide bài giảng.

6 of 23

Đệ quy

  • Hàm đệ quy
  • Đệ quy và mảng
  • Các dạng đệ quy (phân loại)
  • Đệ quy tuyến tính
  • Đệ quy phi tuyến
  • Đệ quy hỗ tương
  • Đệ quy nhị phân
  • Khử đệ quy (dùng vòng lặp)
  • Xem Các ví dụ và bài tập trong slide bài giảng

7 of 23

Các kỹ thuật nâng cao

  • Chia để trị: tìm kiếm nhị phân, tính lũy thừa nhanh, merge sort, quick sort
  • Quy hoạch động: tính số Fibonacci, bài toán tìm dãy con tăng dài nhất (không liên tiếp), bài toán balô (loại 1 và loại 2)
  • Tham lam: bài toán đổi tiền ATM, bài toán balo loại 2
  • Quay lui: phát sinh hoán vị n phần tử, phát sinh các dãy nhị phân chiều dài n.

8 of 23

Ví dụ: Đệ quy

9 of 23

  • Ví dụ: Cho dãy S(n) được định nghĩa như sau:
  • S(n) = 1*2 + 2*3 + 3*4 + … + n*(n+1)
  • Viết hàm tính giá trị S(n) theo các yêu cầu sau đây:
  • a. Dùng đệ quy
  • b. Không dùng đệ quy

 

10 of 23

  • Ví dụ: Cho mảng 1 chiều n số nguyên dương. Viết hàm đệ quy thực hiện các yêu cầu sau:
  • a) tính tổng các phần tử trong mảng
  • b) tìm giá trị lớn nhất (/nhỏ nhất) trong mảng.
  • c) đếm số lượng các số lẻ (/chẵn, / dương,/ âm) trong mảng
  • d) in mảng 2 màn hình.

11 of 23

Ví dụ: Chuỗi ký tự

Ôn tập các bài tập trong slide bài giảng

12 of 23

  • Nhập vào một chuỗi s chứa các ký tự gồm các chữ cái in thường và ký tự khoảng trắng. Giả sử đầu và cuối chuỗi s không có khoảng trắng, giữa các từ trong chuỗi s chỉ có đúng một khoảng trắng. Hãy viết các hàm thực hiện các yêu cầu sau đây:
  • a. Đếm xem trong chuỗi có bao nhiêu ký tự là nguyên âm? (các ký tự nguyên âm là: a, e, i, o, u)
  • b. Chuyển tất cả các ký tự trong chuỗi s thành ký tự in hoa.
  • c. Đếm xem chuỗi s có bao nhiêu từ và mỗi từ có bao nhiêu ký tự?
  • Ví dụ: chuỗi s được nhập là "lap trinh web"
  • Kết quả câu a: 3 nguyên âm.
  • Kết quả câu b: chuỗi s trở thành "LAP TRINH WEB".
  • Kết quả câu c: chuỗi s có 3 từ. Từ LAP có 3 ký tự, từ TRINH có 5 ký tự, từ WEB có 3 ký tự.

Ví dụ: Chuỗi ký tự

13 of 23

Ví dụ: FILE và mảng 2 chiều

Ôn tập các bài tập về mảng 1 chiều và mảng 2 chiều trong slide bài giảng và cơ sở lập trình

14 of 23

  • Cho file văn bản input.txt có cấu trúc như sau:
  • - Dòng đầu tiên ghi một số nguyên dương n.
  • - Dòng tiếp theo ghi n số nguyên dương, mỗi số cách nhau ít nhất một khoảng trắng.
  • Hãy viết chương trình đọc dữ liệu từ file input.txt lưu vào mảng một chiều và thực hiện các yêu cầu sau đây:
  • a. Tìm giá trị lớn nhất trong mảng.
  • b. Tìm số nguyên tố nhỏ nhất thỏa điều kiện lớn hơn mọi giá trị trong mảng.
  • Ghi các kết quả vào file output.txt gồm hai dòng:
  • - Dòng thứ nhất ghi giá trị lớn nhất
  • - Dòng thứ hai ghi số nguyên tổ thỏa điều kiện tìm được

Ví dụ: file và mảng 1 chiều

15 of 23

Ví dụ: file test.txt

2 3

10 5 21

30 4 11

Cho một file văn bản chứa các số nguyên dương có cấu trúc như sau:

Dòng 1: ghi 2 số nguyên dương m, n

m dòng còn lại, mỗi dòng ghi n số nguyên dương . Các số cách nhau ít nhất một khoảng trắng

a) Đọc dữ liệu từ file, lưu vào mảng 2 chiều A (yêu cầu dùng cấp phát động/mảng động).

b) Tính tổng các phần tử trên mỗi dòng

c) Tạo mảng C từ mảng A sao cho cij = aij * ki với ki là số lớn nhất trong dòng i.

d) Gọi sij là số lượng các số nguyên tố trên dòng i và cột j. Tạo mảng D từ mảng A sao cho

e) Yêu cầu ghi kết quả ra file output.txt.

* Lưu ý: Viết đầy đủ chương trình có hàm main(). Kết thúc chương trình phải thu hồi vùng nhớ.

Ví dụ: file và mảng 2 chiều

16 of 23

FILE và dữ liệu cấu trúc

17 of 23

#include <iostream.h>

using namespace std;

int main()

{

int Arr[]={2,1,9,8,5,4};

int *p;

p = &Arr[0];

cout << *p << endl;

p = p + 1;

cout << *p << endl;

p = &Arr[4];

cout << *p << endl;

*p = *p + *(p+1) + *(p-3);

cout << *p << endl;

return 0;

}

18 of 23

int main()

{ char *s = new char[255];

strcpy(s,"data structure and algorithm");

cout<<strrchr(s,' ')+1<<endl;

cout<<strtok(s," ")<<endl;

s[4] = '\0';

cout<<s<<endl;

cout<<strrev(s)<<endl;

cout<<s+14<<endl;

cout<<strstr(s+5,"and")<<endl;

return 0;

}

19 of 23

#include <iostream>

using namespace std;

void mystery(char* str) {

if (*str) {

mystery(str + 1);

cout << *str;

}

}

int main() {

char str[] = "ABCDE";

mystery(str);

return 0;

}

20 of 23

#include <iostream>

using namespace std;

int findMax(int* arr, int size) {

int maxVal = *arr;

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

if (*(arr + i) > maxVal) {

maxVal = *(arr + i);

}

}

return maxVal;

}

int main() {

int arr[] = {5, 9, 3, 7, 2};

cout << "Max value: " << findMax(arr, 5) << endl;

return 0;

}

21 of 23

#include <iostream>

using namespace std;

void reverseArray(int* arr, int size) {

int* start = arr;

int* end = arr + size - 1;

while (start < end) {

int temp = *start;

*start = *end;

*end = temp;

start++;

end--;

}

}

int main() {

int arr[] = {1, 2, 3, 4, 5};

reverseArray(arr, 5);

cout << "Reversed array: ";

for (int i = 0; i < 5; i++)

cout << arr[i] << " ";

return 0;

}

22 of 23

#include <iostream>

using namespace std;

void modifyArray(int* arr, int size) {

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

*(arr + i) += i;

}

}

void printArray(int* arr, int size) {

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

cout << *(arr + i) << " ";

}

cout << endl;

}

int main() {

int arr[] = {1, 2, 3, 4, 5};

modifyArray(arr, 5);

printArray(arr, 5);

return 0;

}

23 of 23

#include <iostream>

#include <cstring>

using namespace std;

void mystery(char* str) {

while (*str) {

if (*str >= 'a' && *str <= 'z') {

*str = *str - 32; // Chuyển từ chữ thường thành chữ hoa

} else if (*str >= 'A' && *str <= 'Z') {

*str = *str + 32; // Chuyển từ chữ hoa thành chữ thường

}

str++;

}

}

int main() {

char str[] = "HeLLo WoRLD!";

mystery(str);

cout << "Result: " << str << endl;

return 0;

}