Please enable JavaScript.
Coggle requires JavaScript to display documents.
Lộ trình học ngôn ngữ lập trình C cơ bản, Ngôn ngữ lặp trình C - Coggle…
Lộ trình học ngôn ngữ lập trình C cơ bản
Ngôn ngữ lặp trình C
Lộ trình học lập trình ngôn ngữ C
Bài 1: Cài đặt môi trường lập trình C với VS Code
Cài đặt phần mềm học lập trình C
Cài đặt VS code lập trình C
Cài Extension lập trình C/C++
Cài trình biên dịch và thiết lập môi trường
Thiết lập môi trường lập trình C
Tại sao lại học lập trình C trên VS code
Cách biên dịch với G++ và viết chương trình đầu tiên Hello World
Bài 2: Cấu trúc và cách biên dịch chương trình C
Cách biên dịch mã nguồn trong lập trình C/C++
Biên dịch nội dung đã viết sang dạng 1, 0 cho máy tính hiểu. Công việc này được gọi là biên dịch chương trình, hay còn gọi là compile chương trình
công cụ sử dụng để biên dịch chương trình C được gọi là trình biên dịch.
Quá trình được chia ra làm 4 giai đoạn chính
Giai đoàn tiền xử lý (Pre-processor)
Một số xử lý ở Preprocessing (tiền xử lý) trong biên dịch C như sau:
Mở rộng các marcro được định nghĩa sau từ khóa define
Xử lý trước các lệnh bắt đầu sau ký tự #
Load và đọc các library cần thiết sử dụng trong chương trình
Xóa comment trong mã nguồn, và biên dịch trước một số bộ phận trong mã nguồn.
Thực hiện các công đoạn chuẩn bị trước khi chúng ta bắt đầu xử lý chính trong chương trình C
Giai đoạn dịch NNBC sang Asembly (Compiler)
Mã nguồn được viết trong file C từ ngôn ngữ bậc cao mà con người hiểu được sẽ được biên dịch sang ngôn ngữ assembly ở dạng các mã assembly code
Ngôn ngữ assembly ở đây là ngôn ngữ bậc thấp, là ngôn ngữ trung gian giữa ngôn ngữ bậc cao và ngôn ngữ máy tính, có tác dụng chuyển ngôn ngữ bậc cao sang dạng các chỉ thị 1 đối 1 cho máy tính
Giai đoạn dịch assembly sang ngôn ngữ máy (Assembler)
trình tập hợp Assembler sẽ chuyển đổi các mã assembly code đã dịch ở Compiler ở trên thành các mã máy tính
Giai đoạn liên kết (Linker)
Tại đây, chúng ta sử dụng trình liên kết Linker để liên kết các thông tin còn thiếu như các thư viện (library) chẳng hạn vào file máy tính đã tạo ở Assembler.
Cấu trúc chương trình C
Các hàm (Function)
Là cách chương trình hoạt động, có hàm main() là hàm bắt buộc phải có trong chương trình C, ngoài ra còn có các hàm tự tạo khác.
Các biến (Variable)
Là giá trị có thể thay đổi được trong code bằng các phép toán hoặc gán giá trị.
Các lệnh và biểu thức
Các lệnh này có thể là việc sử dụng các hàm khác hoặc các lệnh gán, rẽ nhánh, lặp, tính toán …
Lệnh tiền xử lý
1_#define
1_#define PI 3.14159
2_#include
2_#include <stdio.h> or #include "user.h"
Bộ tiền xử lý (Preprocessor) là các directive (chỉ thị), cung cấp chỉ lệnh tới bộ biên dịch để tiền xử lý thông tin trước khi bắt đầu biên dịch thực sự.
Biên dịch có điều kiện #ifndef và #endif
Chú Thích (Comment)
Đây là những phần viết ra cho lập trình viên hiểu, không có giá trị trong chương trình, sẽ bị trình biên dịch bỏ khi chạy.
Bài 3: Cú pháp lập trình C cơ bản
Khoảng trắng trong C
Comment trong C
Cú pháp lệnh trong lập trình C
Lệnh gán
Là lệnh sao chép dữ liệu từ biến này vào biến kia hoặc gán giá trị vào biến
Khi sử dụng lệnh gán, chúng ta lưu ý tới kiểu dữ liệu mà biến đó sử dụng. Nếu 2 biến khác kiểu dữ liệu có thể xảy ra lỗi. Khi đó các bạn cần ép kiểu dữ liệu
Lệnh khai báo
Với tiền xử lý
Với khai báo biến và hằng
Chúng ta có thể vừa khai báo và gán giá trị đầu tiên cho biến hoặc hằng
Lệnh thực thi
Lệnh thực thi thực chất là sử dụng các hàm và truyền các tham số vào. Máy tính sẽ thực thi và trả về kết quả.
Lệnh so sánh và rẽ nhánh
if, else và cấu trúc rẽ mánh
Lệnh lặp
for, while và cấu trúc vòng lặp
Định danh (Identifier) trong C
Một định danh trong C là một tên được sử dụng như một biến, hàm và một thành phần được người dùng định nghĩa
Một định danh có thể bắt đầu bởi các ký tự A đến Z, a đến z và dấu gạch dưới (_) và số 0 đến 9.
C không cho phép các dấu như
,
$, và % trong tên định danh. C là ngôn ngữ phân biệt chữ thường – chữ hoa.
Dấu chấm phẩy ; trong C
Chương trình C, dấu chấm phảy là một phần kết thúc lệnh. Thực tế mỗi lệnh trong C phải kết thúc bởi một dấu chấm phẩy. Nó thông báo phần kết thúc của một thuộc tính logic.
Các từ khóa trong C
Dưới đây là danh sách các từ khóa được dành riêng trong ngôn ngữ C. Các định danh hay biến, hằng số không thể đặt tên giống các từ khóa dưới đây, nếu không chương trình sẽ báo lỗi.
từ khóa
auto, else, long, switch
break, enum, register, typedef
case, extern, return, union
char, float, short, unsigned
const, for, signed, void
continue, goto, sizeof, volatile
default, if, static, while
do, int, struct, _Packed
double
Cú pháp lập trình C
Cú pháp là cách bố trí các Token hay từ khóa một cách có ý nghĩa, giúp lập trình viên và máy móc đều có thể hiểu được.
Bài 4: Các kiểu dữ liệu trong lập trình C
Nhóm dữ liệu người dùng định nghĩa
Nhóm kiểu dữ liệu nâng cấp (đặc biệt)
Ví dụ:
Pointer: con trỏ, là địa chỉ của ô nhớ
Struct: tạo ra cấu trúc dữ liệu riêng
Union: Tập hợp, là hợp của nhiều kiểu dữ liệu với nhau
Array:mảng, là chuỗi các kiểu dữ liệu
Đây là các kiểu dữ liệu có chức năng đặc biệt, tạo ra bởi các kiểu dữ liệu cơ bản, để sử dụng trong các trường hợp đặc biệt:
Nhóm kiểu dữ liệu cơ bản
Kiểu số nguyên (kiểu int) trong C
Kiểu dữ liệu số nguyên chia thành 2 kiểu có dấu (signal) và không âm (unsigned).
Dựa vào giá trị cực đại (giới hạn) của kiểu giá trị sẽ chia thành các kiểu nhỏ
Kiểu số thực dấu chấm động (Floating-Point) trong C
Kiểu kí tự Char
Kiểu char thường được sử dụng để lưu giữ các kí tự, các chữ và số. Theo bảng kí tự ASCII
Kiểu kí tự char có 1 kiểu đặc biệt là String, bao gồm chuỗi nhiều char liên tiếp.
Kiểu void: xác định không có giá trị nào. Nó được sử dụng trong 4 trường hợp sau đây:
Hàm không có tham số truyền vào. VD: int Turn_off_all(void);
Hàm không có giá trị và không có tham số truyền vào. VD: void Ham(void);
Hàm trả về không có giá trị. VD: void Turn_on_led(led1);
Con trỏ kiểu void
. VD: void
malloc (size_t size);
Hàm sizeof
Hàm sizeof(tham số truyền vào) để kiểm tra xem biến, hoặc kiểu dữ liệu đó chiếm bao nhiêu byte trong bộ nhớ.
Các kiểu dữ liệu trong lập trình C
Derived: Kiểu dữ liệu nâng cấp từ dữ liệu cơ bản, phục vụ cho các mục đích khác nhau
Arrays
Structures
Pointers
Union
user defined: Kiểu dữ liệu người lập trình tự định nghĩa
Enum
Typedef
Primary: Kiểu dữ liệu cơ bản của ngôn ngữ C
Int
Unsigned long int
long long int
long int
Unsigned long long int
int
Short int
Unsigned short int
Float
Double
Float
long double
Char
Signed
Unsigned
Void
Bài 5: Cách khai báo biến cục bộ và biến toàn cục trong C
Khai báo biến cục bộ và tính chất của chúng
Biến cục bộ, là các biến được khai báo trong một hàm. Biến đó sẽ chỉ có thể tồn tại và sử dụng bên trong hàm. Biến cục bộ sẽ được cấp phát khi hàm đó được gọi và sẽ được giải phóng khi hàm kết thúc thực thi.
Các biến cục bộ trong các hàm có tên giống nhau nhưng khai báo trong các hàm khác nhau vẫn có thể sử dụng bình thường.
Khai báo biến toàn cục tính chất của chúng
Các biến toàn cục chỉ có thể sử dụng trong file.c đó, nếu muốn sử dụng trong file.c khác chúng ta phải sử dụng từ khóa extern khi khai báo biến toàn cục
rong 1 chương trình C, ta có thể khai báo biến toàn cục và biến cục bộ có tên giống nhau. Nhưng khi ở trong hàm, hàm sẽ ưu tiên sử dụng biến cục bộ được khai báo.
Với biến toàn cục, là biến được khai báo bên ngoài hàm, có thể được truy xuất và sử dụng ở mọi hàm trong chương trình. Biến toàn cục được cấp phát bộ nhớ khi chương trình hoạt động và giải phóng khi chương trình kết thúc.
Biến là gì?
Có 3 loại biến cơ bản:
Biến cục bộ
Biến toàn cục
Các biến đặc biệt static, volatite, register …
Cú pháp khai báo biến: <kiểu dữ liệu><dấu cách><tên biến>;
Giá trị của biến có thể thay đổi bất cứ lúc nào trong suốt quá trình mà chương trình chạy. Biến được dùng để lưu trữ dữ liệu mà cần được thay đổi trong quá trình chương trình thực hiện.
Bài 6: Biến Static, Biến Extern, Biến Register và Biến Volatile
Biến Extern
Nó là tham chiếu của một biến,hàm cùng tên nào đó, đã được định nghĩa bên ngoài. Nó chỉ khai báo chứ không định nghĩa ( cấp phát bộ nhớ cho biến ).
Biến được tham chiếu phải được khai báo ở cấp độ cao nhất (toàn cục), và có thể nằm trong một file khác
Để sử dụng được biến toàn cục ở một file khác, chúng ta phải khai báo lại biến và thêm từ khóa extern phía trước, để báo rằng biến này đã được khi báo ở file khác.
Lưu ý: khi sử dụng extern, các bạn không được khai báo giá trị ban đầu cho biến
Tóm lại: Muốn sử dụng lại biến toàn cục ở file khác ta thêm extern trước (kiểu dữ liệu và tên biến) đó ở file này.
Biến Register
Khi thêm từ khóa register để khai báo biến, thì tức là ta đã yêu cầu trình biên dịch ưu tiên đặc biệt dành luôn vùng register để chứa biến đó. Và hiển nhiên khi thực hiện tính toán trên biến đó thì giảm được bước 1 và 3, giảm bớt thủ tục vậy nên hiệu năng tăng lên.
khai báo biến thông thường, để thực hiện một phép tính thì cần có 3 bước.
Nạp giá trị từ vùng nhớ chứa biến vào register
Yêu cầu ALU xử lý register vừa được nạp giá trị.
Đưa kết quả vừa xử lý của ALU ra ngoài vùng nhớ chứa biến.
Tác dụng của từ khóa register, nói một cách ngắn gọn là làm tăng hiệu năng(performance) của chương trình.
Biến Static
Biến static hay biến tĩnh, được tạo ra bên trong một khối lệnh có khả năng lưu giữ giá trị của nó cho dù chương trình đã chạy ra bên ngoài khối lệnh chứa nó.
Khi 1 biến cục bộ được khai báo với từ khóa static. Biến sẽ chỉ được khởi tạo 1 lần duy nhất và tồn tại suốt thời gian chạy chương trình. Giá trị của nó không bị mất đi ngay cả khi kết thúc hàm.
Biến cục bộ sẽ khởi tạo lại khi hàm chứa nó được gọi. Còn biến tĩnh thì chỉ khởi tạo lần đầu tiên, khi hàm được gọi lại sẽ bỏ qua nó và không khởi tạo lại nó.
Tuy nhiên khác với biến toàn cục có thể gọi trong tất cả mọi nơi trong chương trình, thì biến cục bộ static chỉ có thể được gọi trong nội bộ hàm khởi tạo ra nó. Mỗi lần hàm được gọi, giá trị của biến chính bằng giá trị tại lần gần nhất hàm được gọi.
Biến Volatile
Trong thực tế, có 3 loại biến mà giá trị có thể bị thay đổi như vậy:
Memory-mapped peripheral registers (thanh ghi ngoại vi có ánh xạ đến ô nhớ)
Biến toàn cục được truy xuất từ các tiến trình con xử lý ngắt (interrupt service routine)
Biến toàn cục được truy xuất từ nhiều tác vụ trong một ứng dụng đa luồng.
Biến Volatile rất cần thiết trong lập trình nhúng, vì khi đó có các tác vụ như ngắt ảnh hưởng tới giá trị của biến. Trong lập trình C cơ bản thì rất ít gặp.
Một biến cần được khai báo dưới dạng biến volatile khi nào? Khi mà giá trị của nó có thể thay đổi một cách không báo trước. Việc khai báo biến volatile là rất cần thiết để tránh những lỗi sai khó phát hiện do tính năng optimization của compiler.
Volatile có nghĩa là không dự đoán được. Một biến sử dụng với volatile qualifier có nghĩa là nói với compiler là biến này có thể sẽ được thay đổi ở bất kì chỗ nào
Bài 8: Cách sử dụng toán tử trong lập trình C
Toán tử gán (Assignment Operators)
Toán tử gán dùng để gán 1 giá trị cho 1 biến.
Ngoài ra toán tử gán còn sử dụng khi sử dụng chính nó để tính toán với một biến khác.
Toán tử quan hệ (Relational Operators) hay toán tử so sánh
Toán tử quan hệ hay so sánh sử dụng các phép toán so sánh giữa các số, biến và hằng. Giá trị trả về là logic (true hoặc false tương ứng với 1 hoặc 0)
Các toán tử này sử dụng làm điều kiện trong các lệnh so sánh như if, case hoặc while, for sẽ học trong các bài sau.
Toán tử Logic (Logic Operators) hay so sánh logic
Toán tử logic là toán tử sử dụng các mệnh đề logic để so sánh 2 phần tử logic, giá trị trả về là logic (true hoặc false tương ứng với 1 hoặc 0)
Các toán tử này thường được sử dụng để nối các điều kiện trong các lệnh so sánh như if, case hoặc while, for.
Toán tử &&: là toán tử AND, trả về true khi và chỉ khi tất cả các toán hạng đều đúng.
Toán tử ||: là toán tử OR, trả về true khi có ít nhất 1 toán hạng đúng.
Toán tử !: là toán tử NOT, phủ định giá trị của toán hạng.
Toán tử thao tác bit ( Bitwise Operators )
Toán tử thao tác bit làm việc trên đơn vị bit, tính toán biểu thức theo từng bit
Phép toán logic
Phép đảo và dịch
Toán tử số học (Arithmetic Operators)
Toán tử số học 2 thành phần
Đây là các toán tử cần sự tham gia của 2 giá trị số nên được phân loại là các toán tử 2 ngôi.
Toán tử tăng giảm
Toán tử tăng, giảm là 1 loại toán tử 1 ngôi
Các toán tử hỗn hợp (Miscellaneous Operators)
&a; sẽ cho địa chỉ thực sự của biến a.
*a; sẽ trỏ tới biến a.
Nếu điều kiện là true ? thì giá trị X : Nếu không thì giá trị Y
Toán tử là một biểu tượng mà nói với trình biên dịch thực hiện một phép toán học nhất định hoặc thao tác hợp lý
Bài 9: Cấu trúc rẽ nhánh bằng if else và switch case trong lập trình C
Lệnh if else if
Nói đơn giản lệnh này sẽ kiểm tra lần lượt các điều kiện, nếu từ trên xuống dưới, nếu điều kiện nào đúng sẽ thực thi lệnh rồi thoát khỏi chương trình.
Lệnh if lồng nhau
Lệnh If và If else
if sẽ kiểm tra nếu đúng điều kiện thì thực hiện. Con if else sẽ kiểm tra 2 trường hợp đúng và không đúng điều kiện thì thực thi 2 lệnh khác nhau.
Lệnh này có thể hiểu là kiểm tra nhiều điều kiện phải được đáp ứng.
Cấu trúc rẽ nhánh if, else là gì
if (điều kiện) thì thực thi gì đó, hoặc nếu không else (điều kiện) thì thực thi một cái gì đó.
Switch case là gì?
Switch case thực ra tương tự như if else if đó là nếu điều kiện đó đáp ứng 1 trong các tiêu chí là được.
Lưu ý khi sử dụng
expression phải bắt buộc là giá trị hằng, có thể là biểu thức nhưng kết quả cần là hằng số.
Nếu có 1 case nào đó khớp giá trị, các khối lệnh tương ứng sau case đó sẽ được thực hiện cho tới khi gặp lệnh break. Do đó, nếu chúng ta không sử dụng break thì tất cả các case kể từ case khớp giá trị đều được thực hiện.
Case default sẽ được thực hiện nếu không có case nào khớp giá trị với expression.
Sử dụng switch case
Kiểm tra điểm số và in ra học lực
Bài 7: Hằng số và cách khai báo hằng số trong lập trình C
Hằng chuỗi trong C
Hằng số thực trong C
Hằng số nguyên trong C
Hằng số là gì?
Hằng số (constant) hướng đến những giá trị cố định mà chương trình không thể thay đổi trong quá trình thực thi.
Bài 10: Điều khiển vòng lặp while và for trong lập trình C
Vòng lặp While và Do while
Phát biểu như sau: Lặp nếu điều kiện đúng – Thoát khi điều kiện sai. Đơn giản vậy thôi.
Với vòng lặp while (hay while do) chương trình sẽ kiểm tra câu lệnh trước, sau đó thực hiện khối lệnh nếu đúng, nếu sai sẽ thoát ra. Điều này sẽ khác với do While là thực hiện lệnh trước và kiểm tra sau.
Vòng lặp for (hay for do)
For dùng trong trường hợp muốn lặp số lần nhất định.
Bài 11: Hàm là gì? Cách sử dụng hàm trong lập trình C
Cú pháp khai báo hàm
Function name: là tên Hàm
parameter: là tham số truyền vào, nếu không có tham số sẽ để là void
Return type: là kiểu dữ liệu trả về
Body: phần chương trình của hàm
Hàm hoạt động ra sao
Nói đơn giản, khi chương trình gọi tới hàm, nó sẽ nhảy tới câu lệnh đầu tiên trong hàm đó, rồi xử lý đến hết hàm rồi thoát ra.
Chương trình của bạn sẽ nhảy tới nơi định nghĩa hàm đó và thực thi các lệnh từ trên xuống dưới ở trong hàm đó.
Khi hàm thực hiện xong, chương trình tiếp tục quay về thực hiện các lệnh phía sau lời gọi hàm.
Hàm là gì?
Hàm (function) hay chương trình con là một thuật ngữ chỉ một cụm câu lệnh được đặt tên để chương trình có thể gọi bất cứ lúc nào.
Vậy những động tác đó trong lập trình người ta gọi là Hàm. Một hàm có thể chứa câu lệnh và các hàm khác, có thể cần tham số truyền vào như (số bước chân, góc bước, tốc độ bước) và có thể có giá trị trả về (return) như gặp vật cản, leo dốc, ….
Các kiểu sử dụng hàm
Hàm có trả về giá trị trả về và có tham số truyền vào
Hàm không giá trị trả về và không tham số truyền vào
Hàm không giá trị trả về và có tham số truyền vào
Hàm có giá trị trả về và không có tham số truyền vào
Bài 12: Mảng là gì? Cách sử dụng mảng trong lập trình C
Truy cập các phần tử mảng 1 chiều trong C
Ngoài ra chúng ta cũng có thể truy cập mảng bằng con trỏ
Một mảng được truy cập bởi cách đánh chỉ số trong tên của mảng
Bài tập nhập, tìm kiếm và in ra phần tử của mảng
Cú pháp khai báo mảng 1 chiều
Trong đó:
Array vriable: là tên mảng
index là trị số của mảng, chính là vị trí trong mảng
VD
Khai báo mảng không có giá trị: int sohangban[10];
Khai báo mảng có giá trị: int sohangban[5] = {34, 56, 23, 124, 67};
Khai báo mảng đa chiều trong lập trình C
Mảng đa chiều (multi-dimensional array) là một biến thể của mảng, trong đó mảng 3 chiều được sử dụng nhiều nhất, rất phù hợp để truy cập như một bảng dữ liệu. Thực chất mảng đa chiều cũng là mảng một chiều nhưng khai báo khác nhau 1 chút mà thôi
Mảng là gì?
Tất cả mảng đều bao gồm các vị trí nhớ liền kề nhau. Địa chỉ thấp nhất tương ứng với thành phần đầu tiền và địa chỉ cao nhất tương ứng với thành phần cuối cùng của mảng.
Mảng (Array) là một tập hợp tuần tự các phần tử có cùng kiểu dữ liệu và các phần tử được lưu trữ trong một dãy các ô nhớ liên tục trên bộ nhớ. Các phần tử của mảng được truy cập bằng cách sử dụng “chỉ số”. Mảng có kích thước N sẽ có chỉ số từ 0 tới N – 1.
Bài tập nhập, tìm kiếm và xuất giá trị mảng 2 chiều
Bài 13: Con trỏ là gì? Cách sử dụng con trỏ trong lập trình C
Cách khai báo con trỏ
VD: int *addr = &nha_anh_a; //khai báo trỏ tới địa chỉ của biến nhà anh A
Dấu * trước tên biến là ký hiệu báo cho trình biên dịch biết ta đang khai báo con trỏ.
Cách sử dụng con trỏ
Thay đổi giá trị biến bằng con trỏ
Để thay đổi giá trị này có 2 cách:
Dùng lệnh gán: var = 20;
Hoặc dùng con trỏ: *ptr = 20;
Dấu * t trong trường hợp này ý nghĩa đó là: Gán giá trị vào địa chỉ mà con trỏ ptr đang trỏ tới.
Con trỏ của con trỏ hay con trỏ cấp 2
a khai báo 1 con trỏ bậc 2 với dấu ** , lưu giữ giá trị của biến con trỏ address_A.
Sau đó tiến hành thay đổi giá trị của biến mà con trỏ address_A trỏ tới một cách gián tiếp bằng con trỏ cấp 2 quan_ly
Con trỏ là gì?
Một con trỏ – pointer là một biến mà trong đó giá trị của nó là địa chỉ của biến khác.
Thực chất con trỏ cũng là 1 biến. nó cũng được cấp phát 1 ô nhớ để lưu giá trị, nhưng điểm khác biệt là: giá trị của biến con trỏ là địa chỉ của biến khác
Con trỏ NULL trong C
Một con trỏ được gán giá trị NULL được gọi là con trỏ null.
Con trỏ null là một hằng số với giá trị 0 được định nghĩa trong một vài thư viện chuẩn.
Địa chỉ của biến
Khi 1 người đến nhà bạn người ta có 2 cách để tìm
Tìm theo tên biến: Nhà anh A
Tìm theo địa chỉ: Địa chỉ Số XX Đường YY Quận ZZ
Địa chỉ là bất biến, nhưng nó có thể cho Anh B, Anh C, Anh D thuê lại địa chỉ đó. Và để truy cập địa chỉ của biến chúng ta sử dụng con trỏ.
Để xem địa chỉ của biến chúng ta sử dụng toán tử &, ví dụ: address = &nha_anh_a;
Bài 14: Cấu trúc dữ liệu Struct và cách dùng Typedef trong C
Khởi tạo giá trị ban đầu cho biến Struct
Truy cập tới từng thành viên của Struct
Truy vấn từng thành viên trong biến bằng toán tử ” . “
Để truy vấn chúng là sử dụng : s1.a; s1.b
Khai báo dữ liệu cấu trúc Struct
Cú pháp khai báo
Con trỏ Struct
Một con trỏ trỏ đến cấu trúc hay biến con trỏ có kiểu cấu trúc (struct) chỉ đơn thuần là con trỏ đó trỏ đến địa chỉ của cấu trúc đó. Lưu ý con trỏ có kiểu struct không thể tự biến đổi biến con trỏ đó thành struct được.
Cấu trúc dữ liệu là gì
Cấu trúc dữ liệu là một nhóm các phần tử dữ liệu được nhóm lại với nhau trong một tên. Các phần tử dữ liệu này còn được gọi là các thành viên, có thể là các kiểu dữ liệu khác nhau và độ dài khác nhau.
Copy và so sánh Struct
Một biến được khai báo có kiểu struct có thể gán cho một biến khác có cùng kiểu struct.
Từ khóa typedef
Từ khóa typedef cho phép lập trình viên định nghĩa kiểu dữ liệu mới từ kiểu dữ liệu đã có trong chương trình.
existing data type : Kiểu dữ liệu đã tồn tại trong chương
new data type : Kiểu dữ liệu mới
Trong lập trình, nhiều khi các bạn sẽ thấy người ta sử dụng kiểu dữ liệu uint8_t, uint16_t, uint32_1, …. đó là kiểu dữ liệu được định nghĩa là từ unsigned int, unsigned long, ….
Bài tập về cấu trúc dữ liệu Struct
Chương trình cộng trừ nhân chia phân số trong C
Quản lý sách
Quản lý sách bằng con trỏ
Bài 15: Ép kiểu dữ liệu trong lập trình C
Ép kiểu là gì?
Khi nào cần ép kiểu?
Đưa dữ liệu về định dạng mà mình mong muốn giúp xử lý cho thuật toán.
Khởi tạo hoặc gán một biến với giá trị của một kiểu dữ liệu khác.
Kiểu dữ liệu của biến trả về kết quả khác với kiểu dữ liệu trả về của hàm đó.
Ép kiểu là hành động thay đổi kiểu dữ liệu của một biến (hoặc biểu thức) bất kỳ sang một kiểu dữ liệu khác.
Các loại ép kiểu dữ liệu
Ép kiểu dữ liệu tường minh
Là việc chuyển 1 dữ liệu sang kiểu dữ liệu khác theo ý muốn của lập trình viên. Kiểu biến đổi này có thể làm mất thông tin.
Khi bắt đầu lập trình, có một lỗi phổ biến thường mắc phải là nhầm lẫn giữa phép chia các số nguyên trong toán học và phép chia các số nguyên trong lập trình, dẫn đến kết quả lập trình không được như mong muốn.
Ép kiểu dữ liệu ngầm định
Trong quá trình biên dịch, nếu phát hiện 1 lệnh gán giá trị khác loại cho 1 biến, trình biên dịch sẽ tự động chuyển kiểu, gọi là cơ chế chuyển kiểu ngầm định.
Trình biên dịch sẽ hiện cảnh báo nếu xuất hiện sự chuyển kiểu không an toàn, gây mất mát giá trị, ví dụ như chuyển 1 dữ liệu có kích thước lớn, mang giá trị lớn về kiểu dữ liệu có kích thước nhỏ, hay dữ liệu số có dấu sang kiểu dữ liệu không dấu đều là chuyển kiểu không an toàn.
Bài 16: Truyền tham chiếu, truyền tham trị và truyền con trỏ trong C
Truyền tham chiếu là gì?
Truyền tham chiếu chính là cách chúng ta truyền cho nó một bản gốc thông qua địa chỉ ‘&‘. Nghĩa là giá trị của biến tham số truyền vào hàm, sẽ là giá trị của biến truyền vao hàm đó.
Nói đơn giản truyền tham chiếu là truyền địa chỉ.
Khi truyền biến a vào &x tức là a và x sẽ dùng chung địa chỉ. Mỗi khi thay đổi giá trị trên a hoặc x, thì giá trị của biến kia cũng thay đổi theo. Điều này giống việc một địa chỉ có 2 người thuê nhà. Bạn có thể truy vấn bằng tên người này hoặc người kia đều được.
Truyền con trỏ
Truyền con trỏ cũng tương tự như truyền tham chiếu, biến truyền vào sẽ thay đổi khi ta thay đổi giá trị con trỏ trỏ về.
Khi truyền địa chỉ &a vào biến con trỏ
contro. Nghĩa là chúng ta gán địa chỉ của biến a cho contro. Mỗi khi thay đổi giá trị con trỏ trỏ tới bằng lệnh
contro = 20. Thì giá trị tại ô nhớ địa chỉ của a sẽ thay đổi, dẫn tới giá trị của a thay đổi.
Truyền tham trị là gì?
Nói đơn giản truyền tham trị là truyền giá trị.
Truyền tham trị là truyền cho đối số một bản sao, nghĩa là giá trị của biến đó sẽ được sao chép sang biến tham số truyền vào hàm. Đây cũng là cách chúng ta sử dụng hàm bình thường.
Khi truyền vào biến a cho hàm incValue, thực chất trình biên dịch sẽ copy giá trị của a cho x ( x = a). Sau đó lấy giá trị đó để tính toán. Thế nên, khi chúng ta thay đổi giá trị của x, giá trị của a không thay đổi
Truyền mảng vào hàm bằng con trỏ
Khi nhắc tới con trỏ, chúng ta sẽ thấy sự tương quan của nó với mảng. Vậy nên để truyền 1 mảng vào hàm, chúng ta sẽ sử dụng kiểu truyền con trỏ.
Giải thích: con trỏ *dayso có thể được tính toán như một mảng, bằng cách truy cập vào từng phần tử bằng lệnh dayso[i]. Chúng ta sẽ lặp lại 5 lần, bằng kích cỡ của mảng truyền vào. Và cộng các số với nhau, sau đó chia cho sô lần lặp là 5.
Bài 17: Cấp phát động bộ nhớ với malloc, calloc và realloc trong C
Sử dụng hàm free
Sử dụng hàm malloc
Cấp phát động và cấp phát tĩnh
Sử dụng hàm calloc
Cấp phát bộ nhớ là gì? Tại sao cần cấp phát động bộ nhớ
Khi cấp phát tĩnh, ô nhớ đó sẽ tồn tại từ khi chương trình hoạt động tới khi chương trình kết thúc
mỗi khi tạo ra một biến nào đó, trình biên dịch sẽ đưa ra 1 địa chỉ để lưu giữ biến đó. Việc cấp phát như vậy gọi là cấp phát tĩnh.
Cấp phát động bộ nhớ chính là việc cấp phát/giải phóng, thay đổi kích thước bộ nhớ một cách linh hoạt. Giúp chúng ta điều khiển được việc sử dụng bộ nhớ của chương trình.
hế nhưng cấp phát động không tốt (không giải phóng ô nhớ) sẽ khiến chương trình gặp lỗi tràn bộ nhớ Memory leak,
Sử dụng hàm realloc
Bài 18: Các hàm xử lý chuỗi trong lập trình C
Các hàm xử lý chuỗi trong c
Xử lý chuỗi là một công việc bắt buộc khi truyền nhận dữ liệu trong lập trình.
Có rất nhiều phương thức xử lý chuỗi quan trọng được định nghĩa trong thư viện <string.h>.
Hàm strcmp()
Dùng để so sánh hai chuỗi với nhau. Hàm sẽ so sánh hai chuỗi với nhau và trả về các giá trị tương ứng.
Hàm Strcat()
Dùng để nối 2 chuỗi. Kết quả được lưu vào chuỗi đầu tiên.
Hàm strstr()
Dùng để tìm kiếm sự xuất hiện đầu tiên của chuỗi s2 trong chuỗi s1.
Hàm strcpy()
Sao chép nội dung của chuỗi source tới chuỗi destination. Đây là một hàm rất quan trọng khi xử lý chuỗi
Hàm strupr()
Dùng để chuyển đổi chuỗi chữ thường thành chuỗi chữ hoa, kết quả trả về của hàm là một con trỏ chỉ đến địa chỉ chuỗi được chuyển đổi.
strlen(string_name)
trả về chiều dài của chuỗi string name, nó không đếm ký tự null ‘\0’.
Hàm strlwr
Muốn chuyển đổi chuỗi chữ hoa thành chuỗi toàn chữ thường, ta sử dụng hàm strlwr(), các tham số của hàm tương tự như hàm strupr().
Hàm strrev()
Hàm strrev(string) trả về một chuỗi được đảo ngược
Bài 19: Tổng hợp bài tập lập trình C cơ bản phần 1-2
Bài tập lập trình C về vòng lặp
In bảng nhân
In bảng cửu chương rút gọn
In bảng số
In các số chẵn
In các số từ 1 – 10 theo thứ tự giảm dần
In các số lẻ
In các số từ 1 – 10 theo thứ tự tăng dần
Vẽ tam giác trong C (lồng vòng lặp)
Vẽ tam giác Floyd
Vẽ tam giác Pascal
Vẽ tam giác sao vuông cân
Vẽ tam giác sao đều
Bài tập lập trình C cơ bản
Chương trình Hello world
Toán tử số học
So sánh hai số nguyên
Tìm giá trị lớn nhất trong ba số nguyên
Kiểm tra số chẵn, số lẻ
Kiểm tra số âm, số dương
Biến
Bài tập lập trình C: Khai báo, gán và in biến có kiểu dữ liệu int)
Bài tập lập trình C: Khai báo, gán và in biến có kiểu dữ liệu float
Bài tập lập trình C: Khai báo, gán và in biến có kiểu dữ liệu char
Bài tập lập trình C: Khai báo, gán và in biến có kiểu dữ liệu double
Bài tập lập trình C: Khai báo, gán và in biến có kiểu dữ liệu void
Kiểm tra năm nhuận
Tráo đổi giá trị bởi sử dụng biến thứ 3
Tráo đổi giá trị không sử dụng biến thứ 3
Giải phương trình bậc 2
Bài tập C về mảng một chiều (1 – D Array)
Tính tổng giá trị các phần tử trong mảng
Tính giá trị trung bình của một mảng
In một mảng theo chiều đảo ngược
Tìm các phần tử lớn nhất của mảng
In một mảng
Tìm các phần tử lớn thứ hai của mảng
Tìm các phần tử nhỏ nhất của mảng
Cách sao chép giá trị từ một mảng này sang một mảng khác
Cách sao chép giá trị một mảng này sang mảng khác với chiều đảo ngược
Chia một mảng thành hai mảng
Trộn hai hay nhiều mảng thành một mảng
Bài tập C về mảng hai chiều (2 – D Array)
Cộng hai ma trận
Tính đường chéo của ma trận
Trừ hai ma trận
Tính tổng tất cả các phần tử của ma trận
Kiểm tra ma phương (Magic Square)
Ma phương (Magic Square) là một dãy gồm n2 số nguyên dương sắp xếp trong một hình vuông kích thước n x n chia thành n2 ô vuông với n hàng và n cột, sao cho tổng số các số trên mỗi hàng, mỗi cột và trên hai đường chéo đều bằng nhau.
Tìm ma trận nghịch đảo
Tìm ma trận chuyển vị
Nhân hai ma trận
Phương pháp học lập trình C
Tập viết, hoàn thành các bài tập
Sửa bài tập và nghĩ ra các bài toán khác hoặc phương thức giải khác
Đọc hiểu các lý thuyết và ví dụ.
Sử dụng công cụ Debug
Lịch sử ra đời của lập trình C
Tại sao nên học lập trình C