Hàm trong C++

Choose a study mode

Play Quiz
Study Flashcards
Spaced Repetition
Chat to Lesson

Podcast

Play an AI-generated podcast conversation about this lesson
Download our mobile app to listen on the go
Get App

Questions and Answers

Mục đích chính của việc sử dụng hàm trong lập trình là gì?

  • Tăng độ phức tạp của chương trình.
  • Giảm hiệu suất của chương trình.
  • Chia bài toán lớn thành các bài toán nhỏ hơn, dễ quản lý và tái sử dụng. (correct)
  • Làm cho code khó đọc hơn.

Sự khác biệt giữa hàm internal và external là gì?

  • Hàm internal được định nghĩa bởi người dùng, còn hàm external là các hàm có sẵn trong các thư viện. (correct)
  • Hàm internal chỉ có thể sử dụng trong một file, còn hàm external có thể sử dụng ở mọi file.
  • Hàm internal được cung cấp bởi thư viện hệ thống, còn hàm external do người dùng định nghĩa.
  • Hàm internal có hiệu suất cao hơn hàm external.

Trong cú pháp định nghĩa hàm, phần nào chỉ định kiểu dữ liệu mà hàm sẽ trả về sau khi thực hiện?

  • `<parameter list>`
  • `<function name>`
  • `<return type>` (correct)
  • `<sequence of statements>`

Khi nào cần khai báo function prototype trong C++?

<p>Khi hàm được định nghĩa sau hàm <code>main()</code> (C)</p> Signup and view all the answers

Trong cơ chế truyền tham số pass-by-value, điều gì xảy ra với các tham số?

<p>Tham số là một bản sao của đối số, thay đổi trên tham số không ảnh hưởng đến đối số. (A)</p> Signup and view all the answers

Điều gì xảy ra khi bạn cố gắng sửa đổi một tham số được truyền theo kiểu pass-by-value?

<p>Giá trị gốc của biến không bị thay đổi. (A)</p> Signup and view all the answers

Trong pass-by-reference, điều gì thực sự được truyền vào hàm?

<p>Địa chỉ bộ nhớ của biến. (A)</p> Signup and view all the answers

Lợi ích chính của việc sử dụng pass-by-reference so với pass-by-value là gì?

<p>Tiết kiệm bộ nhớ và cho phép hàm thay đổi giá trị của biến gốc. (A)</p> Signup and view all the answers

Biến địa phương là gì?

<p>Biến được định nghĩa bên trong một hàm hoặc một khối lệnh. (D)</p> Signup and view all the answers

Phạm vi hiệu lực của một biến địa phương được xác định như thế nào?

<p>Chỉ trong khối lệnh nơi nó được khai báo. (A)</p> Signup and view all the answers

CPU tương tác với bộ nhớ như thế nào?

<p>CPU truy xuất và tính toán dữ liệu từ thanh ghi, dữ liệu được chuyển qua lại giữa bộ nhớ và thanh ghi. (C)</p> Signup and view all the answers

Kích thước của mỗi ô nhớ trong bộ nhớ thường là bao nhiêu?

<p>8 bits (1 byte) (B)</p> Signup and view all the answers

Trong kiến trúc bộ nhớ, Big-endian là gì?

<p>Địa chỉ các byte tăng dần từ trái sang phải. (D)</p> Signup and view all the answers

Bộ nhớ ảo (virtual memory) cung cấp lợi ích gì?

<p>Cung cấp cho mỗi tiến trình một không gian bộ nhớ riêng biệt và độc lập. (B)</p> Signup and view all the answers

Stack frame trong bộ nhớ được sử dụng để làm gì?

<p>Lưu trữ dữ liệu cho một lời gọi hàm, bao gồm tham số, địa chỉ trả về và biến địa phương. (B)</p> Signup and view all the answers

Điều gì xảy ra với stack frame khi một hàm trả về (return)?

<p>Stack frame được xóa (pop) khỏi stack. (B)</p> Signup and view all the answers

Cho đoạn code sau:

void swap(int x, int y) {
 int t = x; x = y; y = t;
}
int main() {
 int a = 2, b = 3;
 swap(a, b);
 cout << a << "," << b;
}

Kết quả in ra màn hình là gì?

<p>2,3 (A)</p> Signup and view all the answers

Để hàm swap có thể tráo đổi giá trị của hai biến, cơ chế truyền tham số nào cần được sử dụng?

<p><code>pass-by-reference</code> (C)</p> Signup and view all the answers

Trong đoạn code sau, xy được gọi là gì:

int f(int x, int y) { ... }
int main() {
 int a = 2, b = 3;
 f(a, b);
}

<p><code>x</code>, <code>y</code> là tham số, <code>a</code>, <code>b</code> là đối số (A)</p> Signup and view all the answers

Khi nào nên sử dụng const cho tham số của hàm?

<p>Khi không muốn hàm sửa đổi giá trị của tham số. (B)</p> Signup and view all the answers

Lợi ích của việc sử dụng hằng tham biến (ví dụ: const string& y) thay vì tham trị (ví dụ: string x) với kiểu dữ liệu lớn là gì?

<p>Tăng hiệu năng do không cần sao chép giá trị đối số. (A)</p> Signup and view all the answers

Cho đoạn code sau:

int a = 1;
int& b = a;
b++;
cout << a << " " << b;

Kết quả in ra màn hình là gì?

<p>2 2 (C)</p> Signup and view all the answers

Giá trị mặc định của tham số trong hàm có tác dụng gì?

<p>Cho phép bỏ qua tham số đó khi gọi hàm, giá trị mặc định sẽ được sử dụng. (C)</p> Signup and view all the answers

Ưu điểm của việc sử dụng hàm đệ quy là gì?

<p>Hàm đệ quy giúp giải quyết các bài toán có cấu trúc đệ quy một cách tự nhiên và dễ hiểu. (D)</p> Signup and view all the answers

Trong một hàm đệ quy, điều kiện dừng để làm gì?

<p>Để ngăn chặn hàm gọi chính nó mãi mãi, gây ra tràn stack. (A)</p> Signup and view all the answers

Trong hàm đệ quy tính giai thừa, trường hợp cơ bản thường là gì?

<p>Khi số đầu vào bằng 0 hoặc 1. (A)</p> Signup and view all the answers

Thứ tự thực hiện các lời gọi hàm trong stack frame của một chương trình như thế nào?

<p>Lời gọi hàm đầu tiên được thực hiện cuối cùng. (A)</p> Signup and view all the answers

Trong tìm kiếm nhị phân đệ quy, điều kiện nào xác định việc tiếp tục tìm kiếm trong nửa bên trái của mảng?

<p>Giá trị cần tìm nhỏ hơn giá trị ở giữa. (D)</p> Signup and view all the answers

Công thức đệ quy nào sau đây được sử dụng trong thuật toán tìm kiếm nhị phân đệ quy khi giá trị tại vị trí giữa (mid) lớn hơn giá trị cần tìm (key)?

<p><code>search(low, mid-1)</code> (C)</p> Signup and view all the answers

Trong bài toán Tháp Hà Nội, công thức đệ quy nào mô tả số bước di chuyển cần thiết để chuyển n đĩa?

<p>$f(n) = 2 * f(n-1) + 1$ (B)</p> Signup and view all the answers

Cho đoạn code sau về duyệt hoán vị:

permutation(s, lo+1, hi) // đệ quy phần còn lại
swap(s, lo, i); // quay lui về như cũ để thử cách khác

Mục đích của dòng code swap(s, lo, i); là gì?

<p>Để quay lui và thử một hoán vị khác. (D)</p> Signup and view all the answers

Cho đoạn code sau:

void combination(k) {
 if (k<1) {
 output();
 return;
 }
 member[k] = true;
 combination(k-1);
 member[k] = false;
 combination(k-1);
}

Đoạn code này dùng để làm gì?

<p>Duyệt tổ hợp (C)</p> Signup and view all the answers

Trong quá trình duyệt tổ hợp bằng đệ quy, điều gì xảy ra khi member[k] = true?

<p>Phần tử thứ <code>k</code> được đưa vào tổ hợp. (C)</p> Signup and view all the answers

Chọn phát biểu đúng về kiểu dữ liệu và bộ nhớ?

<p>Kiểu dữ liệu xác định cách bộ nhớ được sử dụng để lưu trữ giá trị của biến. (A)</p> Signup and view all the answers

Trong một hàm đệ quy để giải bài toán tháp Hà Nội, các tham số thường bao gồm những gì?

<p>Số lượng đĩa, cọc nguồn, cọc đích, cọc tạm. (D)</p> Signup and view all the answers

Biến tham chiếu (reference) trong C++ có đặc điểm gì?

<p>Là một bí danh (nickname) của một biến đã tồn tại. (D)</p> Signup and view all the answers

Hàm nào sau đây là một ví dụ về một hàm external?

<p>Hàm <code>sqrt()</code> trong thư viện <code>math</code>. (A)</p> Signup and view all the answers

Khi sử dụng bộ nhớ ảo, địa chỉ bộ nhớ mà chương trình sử dụng là địa chỉ gì?

<p>Địa chỉ logic. (B)</p> Signup and view all the answers

Cách tổ chức dữ liệu trong bộ nhớ theo kiểu Little-endian là như thế nào?

<p>Byte có nghĩa nhỏ nhất (LSB) được lưu trữ ở địa chỉ thấp nhất. (B)</p> Signup and view all the answers

Khi nào một frame được thêm vào function call stack?

<p>Khi một hàm bắt đầu thực thi. (B)</p> Signup and view all the answers

Flashcards

Mục đích của Hàm

Chia bài toán lớn thành các bài toán nhỏ hơn, tách khái niệm khỏi cài đặt, tránh lặp code.

Hàm Internal là gì?

Hàm do người dùng tự định nghĩa.

Hàm External là gì?

Hàm có sẵn trong thư viện (ví dụ: abs, sqrt).

Input/Output của hàm

Các tham số được truyền vào hàm, hàm xử lý và trả về giá trị.

Signup and view all the flashcards

Function Prototype là gì?

Khai báo trước khi sử dụng để trình biên dịch biết về hàm.

Signup and view all the flashcards

Cú pháp khai báo prototype hàm

Trả về kiểu dữ liệu, tên hàm, danh sách tham số.

Signup and view all the flashcards

Truyền tham số theo giá trị (Pass-by-value)

Truyền bản sao giá trị của biến vào hàm. Thay đổi trong hàm không ảnh hưởng biến gốc.

Signup and view all the flashcards

Truyền tham số theo tham chiếu (Pass-by-reference)

Truyền địa chỉ của biến vào hàm. Thay đổi trong hàm ảnh hưởng trực tiếp biến gốc.

Signup and view all the flashcards

CPU và Bộ nhớ

CPU tính toán, dữ liệu chuyển giữa bộ nhớ và thanh ghi.

Signup and view all the flashcards

Lưu dữ liệu trong bộ nhớ

Mỗi ô nhớ 8 bit, dữ liệu lớn hơn cần chuỗi byte liên tiếp.

Signup and view all the flashcards

Big-endian là gì?

Thứ tự byte mã hóa và giải mã từ trái sang phải, địa chỉ byte tăng dần.

Signup and view all the flashcards

Little-endian là gì?

Thứ tự byte mã hóa và giải mã từ trái sang phải, địa chỉ byte giảm dần.

Signup and view all the flashcards

Bộ nhớ ảo (Virtual memory)

Mỗi tiến trình có không gian bộ nhớ riêng, địa chỉ độc lập.

Signup and view all the flashcards

Biến là gì?

Tên gọi của vùng bộ nhớ, đọc/ghi nội dung.

Signup and view all the flashcards

Biến địa phương

Được khai báo trong khối lệnh, phạm vi hiệu lực tương ứng.

Signup and view all the flashcards

Tham số trong stack

Các đối số được đẩy vào stack khi gọi hàm.

Signup and view all the flashcards

Khi một lời gọi hàm được chạy

Lưu giá trị trả về, đẩy địa chỉ trở về, các biến địa phương.

Signup and view all the flashcards

Khi hàm trả về (return)

Lưu giá trị trả về và đẩy toàn bộ frame của hàm ra khỏi stack.

Signup and view all the flashcards

Pass-by-value (tham trị)

Pass-by-value: tham số là bản sao, thay đổi không ảnh hưởng biến gốc.

Signup and view all the flashcards

Pass-by-reference (tham biến)

Pass-by-reference: tham số là nickname, thay đổi ảnh hưởng biến gốc.

Signup and view all the flashcards

Đối số và Tham số

Đối số là a, b. Tham số là x, y.

Signup and view all the flashcards

Hằng tham số

Hàm f không được sửa x, g không được sửa y.

Signup and view all the flashcards

Hằng tham biến

Hằng tham biến cho hiệu năng tốt hơn vì không cần sao chép.

Signup and view all the flashcards

Biến tham chiếu

b là tham chiếu tới a, chỉ là một nick khác của a.

Signup and view all the flashcards

Giá trị mặc định của tham số

Chỉ áp dụng cho tham số cuối. Ví dụ divide(12) thực chất là divide(12,2).

Signup and view all the flashcards

Hàm đệ quy là gì?

Hàm gọi chính nó.

Signup and view all the flashcards

Hàm đệ quy

Một hàm function gọi lại chính nó.

Signup and view all the flashcards

Tìm kiếm nhị phân đệ quy

Tìm kiếm bằng cách chia đôi khoảng tìm kiếm.

Signup and view all the flashcards

Công thức đệ quy

if a[mid] < key : search(mid+1, high), if a[mid] > key : search (low, mid-1)

Signup and view all the flashcards

Trường hợp cơ bản của tìm kiếm nhị phân

a[mid] == key: tìm thấy, low>high: không tìm thấy.

Signup and view all the flashcards

Study Notes

Hàm

  • Hàm giúp chia bài toán phức tạp thành các bài toán nhỏ hơn, dễ quản lý hơn.
  • Hàm tách khái niệm khỏi cài đặt, giúp chương trình dễ hiểu và tái sử dụng code.
  • Lập trình có cấu trúc sử dụng hàm để tránh lặp code.

Phân Loại Hàm

  • Internal: Hàm do người dùng tự định nghĩa
  • External: Hàm được nhóm thành các thư viện (ví dụ: abs, sqrt, exp trong math, iostream, stdlib).

Input/output

  • Hàm nhận tham số đầu vào và trả về một giá trị.

Định Nghĩa và Khai Báo Hàm

  • Hàm đặt sau main() cần khai báo prototype trước.
  • Hàm đặt trước main() không cần prototype.
  • Cú pháp định nghĩa hàm: <return type> <function name>(<parameter list>) { <local declarations> <sequence of statements> }.
  • Cú pháp khai báo prototype hàm: <return type> <function name>(<parameter list>);.

Truyền Tham Số

  • Pass-by-value: Giá trị của tham số được sao chép vào hàm
  • Pass-by-reference: Tham số là một tham chiếu đến biến gốc

CPU và Bộ Nhớ

  • CPU tính toán trên dữ liệu được lưu trữ trong các thanh ghi.
  • Dữ liệu được chuyển giữa bộ nhớ và các thanh ghi.
  • Kích thước mỗi ô nhớ là 8 bit, tương đương với 1 byte.
  • Dữ liệu lớn hơn cần một chuỗi byte liên tiếp, xác định bởi địa chỉ byte đầu tiên và kích thước.

Bit và Giá Trị Dữ Liệu

  • Big-endian: Thứ tự byte từ trái sang phải, địa chỉ byte tăng dần (ví dụ: mainframe, IPv4).
  • Little-endian: Thứ tự byte từ trái sang phải, địa chỉ byte giảm dần (ví dụ: Intel x86, x86-64).
  • Thứ tự byte mã hóa và giải mã cần nhất quán.

Bộ Nhớ Ảo

  • Mỗi tiến trình được cấp một không gian bộ nhớ riêng.
  • Hệ điều hành ánh xạ bộ nhớ logic với bộ nhớ vật lý.
  • Địa chỉ trong các không gian khác nhau là độc lập.

Biến

  • Biến là tên của một vùng bộ nhớ cụ thể.
  • Biến lưu trữ nội dung có thể đọc/ghi.
  • Kiểu dữ liệu xác định cách đọc giá trị của biến (số ô nhớ và cách tính giá trị).
  • Biến địa phương được khai báo trong một khối lệnh và có phạm vi hiệu lực tương ứng.

Stack Frame

  • Biến trong vùng bộ nhớ của lời gọi hàm được gọi là stack frame.
  • Khi hàm được gọi, bản sao của đối số được đẩy vào stack, lưu trữ địa chỉ trả về.
  • Các biến địa phương được cấp phát trong stack.
  • Khi hàm trả về, giá trị trả về được lưu vào thanh ghi hoặc stack.
  • Frame của hàm bị đẩy ra khỏi stack, bao gồm biến địa phương, địa chỉ trả về, và tham số.

Function Call Stack

  • Stack memory là khu vực bộ nhớ dùng để quản lý các lời gọi hàm.
  • Mỗi lời gọi hàm tạo ra một "frame" trên stack để lưu trữ thông tin của hàm đó.

Tại Sao swap(int x, int y) Không Hoạt Động?

  • Trong pass-by-value, xy chỉ là bản sao của ab.
  • Các thay đổi trong hàm swap không ảnh hưởng đến ab trong main().
  • Khi hàm swap kết thúc, frame của nó bị loại bỏ khỏi stack.

Cơ Chế Truyền Tham Số

  • Pass-by-value: Tham số là bản sao của đối số. Thay đổi tham số không ảnh hưởng đối số gốc.
  • Pass-by-reference: Tham số là "nickname" của đối số. Thay đổi tham số sẽ thay đổi đối số.
  • Với pass-by-value, x và y còn gọi là tham trị
  • Với pass-by-reference, x và y còn gọi là tham biến
  • Hằng tham số (ví dụ: const string x) không được sửa đổi trong hàm.
  • Nên sử dụng const cho tất cả tham số không cần sửa đổi để tránh lỗi.
  • Hằng tham biến (ví dụ: const string& y) tương đương tham trị về hiệu ứng phụ, nhưng hiệu năng tốt hơn khi làm việc với kiểu dữ liệu lớn do tránh được việc sao chép giá trị.

Biến Tham Chiếu

  • Biến tham chiếu là một "nick" khác của một biến đã tồn tại.

Giá Trị Mặc Định của Tham Số

  • Tham số có thể có giá trị mặc định (ví dụ: int divide(int a, int b = 2)).
  • Khi gọi hàm mà không truyền giá trị cho tham số này, giá trị mặc định sẽ được sử dụng.
  • Chỉ các tham số cuối cùng mới được phép có giá trị mặc định.

Hàm Đệ Quy:

  • Hàm đệ quy là hàm gọi chính nó.
  • Cần có trường hợp cơ bản để dừng đệ quy.

Dưới đây là cách hàm đệ quy hoạt động và ví dụ về hàm tính giai thừa:

  • Trường hợp cơ bản: Khi x <= 1, hàm trả về 1.
  • Trường hợp đệ quy: Khi x > 1, hàm trả về x * factorial(x-1).
  • Hàm đệ quy đưa bài toán về các bài toán con nhỏ hơn, hội tụ về trường hợp cơ bản.

Ví dụ:

long factorial(long x) {
    if (x > 1)
        return (x * factorial(x-1));
    else
        return 1;
}

Tìm Kiếm Nhị Phân Đệ Quy:

  • Tìm kiếm nhị phân (binary search) là một thuật toán tìm kiếm hiệu quả trên mảng đã sắp xếp.
  • Thuật toán này có thể được thực hiện đệ quy.

Công thức đệ quy:

  • Nếu a[mid] < key: Tìm kiếm trong nửa phải của mảng: search(mid+1, high)
  • Nếu a[mid] > key: Tìm kiếm trong nửa trái của mảng: search(low, mid-1)

Các trường hợp cơ bản:

  • a[mid] == key: Tìm thấy phần tử.
  • low > high: Không tìm thấy phần tử.

Studying That Suits You

Use AI to generate personalized quizzes and flashcards to suit your learning preferences.

Quiz Team

Related Documents

Function Lecture Notes PDF

More Like This

C++ Functions and Recursion Test: Chapter 6
5 questions
C++ Functions
3 questions

C++ Functions

ThrivingRadiance avatar
ThrivingRadiance
C++ Functions and Variable Passing
18 questions
Use Quizgecko on...
Browser
Browser