Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (477.48 KB, 109 trang )
<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>
Object-Oriented Programming <b>1</b>
Giảng viên
Giảng viên : Phạm DoÃn Tĩnh: Phạm DoÃn Tĩnh
Bộ môn
Bộ môn : §iƯn tư tin häc: §iƯn tư tin häc
Khoa
Khoa : §iƯn tư ViƠn Th«ng: §iƯn tư Viễn Thông<i></i>
Tr ờng
<sub>Ngôn ngữ lập trình C++ và cấu trúc dữ liệu PGS.TS Nguyễn Việt </sub><i><sub></sub></i>
H ơng.
<sub>Kỹ thuật lập trình C GS. Phạm Văn </sub><sub>ấ</sub><sub>t NXB Thống kê</sub>
<sub>The C Programming Language - Ritchie kernighan- Prentice Hall </sub>
Software series.
<sub>Practical C Programming, 3rd Edition</sub><sub> - Steve Oualline - O'Reilly </sub>
<sub>The C++ Programming Language Special 3rd Edition- Bjarne </sub>
Stroustrup – C++ Creator –<b>Addison Wesley</b>
<b>C++ by Dissection</b> - <b>Ira Pohl (University of California </b>
Object-Oriented Programming <b>3</b>
<sub>Với phần cứng và phần mềm trong tay rồi, ng ời lập trình cần làm </sub><b><sub></sub></b> <b><sub></sub></b>
gì?
<sub>Học một ngôn ngữ lập trình.</sub>
<sub>Vn cn gii quyết cần đ ợc xem xét kỹ l ỡng.</sub>
<sub>Ph©n tích bài toán là quá trình làm hoàn tất các møc chi tiÕt cÇn </sub>
thiết khi giải quyết một vấn đề. Nó bao gồm các b ớc chính nh sau:
<sub>Vấn đề cần giải quyết phải đ ợc hiểu một cách thấu đáo. Bởi nếu ng ời </sub>
giải quyết ch a hiểu vấn đề thì tất nhiên máy tính cng khụng th gii
quyt tt c
<sub>Cần phải chọn đ ợc một ph ơng án giải quyết và phát triển ph ơng án.</sub>
<sub>Tiến trình giải cần đ ợc mô tả d ới dạng từng b ớc từng b ớc một. Đôi khi </sub>
chúng ta gọi là ThuËt gi¶i (Solution algorithm).<b>“</b> <b>”</b>
<i><b>5</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>Gi¶i thuật là gì?</sub>
<b><sub>Giải thuật là một danh sách các chỉ dẫn mô tả một cách chính xác các </sub></b>
b ớc của một quá trình mà đảm bảo là quá trình này sẽ phải kết thúc sau
một số b ớc nhất định với câu trả lời đúng cho từng tr ờng hợp cụ thể của
một vấn đề cần giải quyết .<b>”</b>
<sub>Mỗi thuật giải phải đảm bảo 4 đặc tính sau:</sub>
<sub>Sù chÝnh x¸c.</sub>
<sub>Tính hiệu quả- Đ a ra câu trả lời đúng.</sub>
<sub>Đảm bảo sự kết thỳc.</sub>
<sub>Tổng quát hoá.</sub>
<sub>Ví dụ: Giải thuật cho giải ph ơng trình bậc nhất a.x+b=0</sub>
<sub>B c 1: Xột a =0, nếu đúng tiếp tục b ớc 2, nếu sai tiếp tục b ớc 5.</sub>
<sub>B ớc 2: Xét b=0, nếu đúng tiếp tục b ớc 3, nếu sai tiếp tục b ớc 4.</sub>
<sub>B ớc 3: Hiển thị vơ số nghiệm và kết thúc.</sub>
<sub>B íc 4: HiĨn thị vô nghiệm và kết thúc.</sub>
<sub>Xuất phát điểm cho quá trình thiết kế bất kỳ một ch ơng trình máy tính nào cũng </sub>
u phi cú một đặc tả phù hợp về hoạt động của ch ơng trình dự định thực hiện.
<sub>Thơng th ờng đặc t ca ch ng trỡnh bo gm:</sub>
<sub>Mô tả chức năng của ch ơng trình.</sub>
<sub>Các yêu cầu đầu vào và đầu ra.</sub>
<sub>Các biện pháp l u trữ dữ liệu.</sub>
<sub>Các thủ tục quản lý tệp.</sub>
<i><b>7</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>1.3.2 Các kiểu tệp (File types)</sub>
<sub>Tệp chứa các bản ghi một cách lặp đi lặp lại.</sub>
<sub>Tuỳ theo việc tổ chức các bản ghi trong tƯp, ng êi ta chia tƯp </sub>
thµnh 4 loại khác nhau:
<sub>Tệp nối tiếp (Serial file)</sub>
<sub>Các bản ghi đ ợc ghi nối tiếp nhau theo trình tự thời gian </sub>
đ a bản ghi vào. Ví dụ các bản ghi ghi lại các phiên giao
dịch.
<sub>Tệp tuần tự (sequential file)</sub>
<sub>ở đây các bản ghi đ ợc sắp xếp theo trình tự của một </sub>
hoặc nhiều tr ờng khoá.
<sub>1.3.2 Các kiểu tệp (File types)</sub>
<sub>Tệp tuần tự đ ợc chỉ mục (Indexed sequential file)</sub>
<sub>Thay vì sắp xếp lại toàn bộ tệp, ng ời ta tạo ra các tệp chØ môc </sub>
và trong các tệp này chứa các tr ờng khoá đã sắp xếp đi kèm với
địa chỉ các bản ghi trong tệp chính.
<sub>TƯp truy cËp trùc tiÕp (Direct Access file)</sub>
<sub>Để có thể truy cập nhanh, mỗi bản ghi sẽ đ ợc ghi vào địa chỉ </sub>
<i><b>9</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>1.3.3 Bảng quyết định (Decision Table)</sub>
<sub>Bảng quyết định?</sub>
<sub>Bảng quyết định là một bảng chỉ ra các hành động khác nhau đ ợc thực hiện </sub>
dùa theo c¸c sù kết hợp khác nhau của các điều kiện.
Tên điều kiện
(Condition Stub)
Giá trị điều kiện
(Condition Entries)
Tờn hnh ng
(Action Stub)
<sub>Ví dụ: Giả sử một cửa hàng điện tử thực hiện việc giảm giá cho </sub>
khách hàng dựa vào tiêu chí: Khách quen tiêu trên $200 giảm giá
20%, nếu không thì giảm giá 10%. Khách không quen thì tiêu
trên $200 giảm giá 10%, nếu không thì không giảm giá.
1. Khách quen Y Y N N
2. Tiêu trên $200 Y N Y N
Giảm giá 20 % X
Giảm giá 10% X X
Không giảm giá X
<i><b>11</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>Sau khi thiết kế xong, chúng ta phải kiểm tra tính đúng đắn của thiết kế. Có rất nhiều </sub>
ph ơng pháp khác nhau để kiểm tra thiết kế.
<sub>1. Dry-run.</sub>
<sub>Ph ơng pháp này, ng ời kiểm tra dùng giấy bút để tính tốn và ghi lại các b ớc thực </sub>
hiện của ch ơng trình dựa theo một số dữ liƯu thư.
<sub>2. Walk through:</sub>
<sub>Đây là ph ơng pháp mà ng ời thiết kế mô tả thiết kế của mình cho các đồng nghiệp </sub>
và ghi nhận lại tất cả các đóng góp ý kiến.
<sub>Với PP này, cho phép bộc lộ sớm các vấn đề, t ơng tác các thành viên trong nhóm, </sub>
đào tạo lẫn nhau, tiến trình ổn định, tính nhất qn trong thiết kế.
<sub>Catalytic Checking. </sub>
<sub>Ng ời thiết kế mô tả thiết kế, đồng nghiệp luôn hỏi Tại sao? Làm thế nào? và </sub><b><sub>“</sub></b> <b><sub>” “</sub></b> <b><sub>”</sub></b>
sÏ tù béc lé ra ®iĨm sai trong thiÕt kÕ.
<sub>Independent Inspection</sub>
<sub>Đây là ph ơng pháp dùng nhiều ng ời độc lập kiểm tra thiết kế d ới sự chỉ đạo của </sub>
<b>1.3.5 Thiết kế h ớng đối t ợng (Object-Oriented Design OOD)</b>
<sub>Ph ơng pháp thiết kế h ớng đối t ợng OOD là ph ơng pháp thiết k gm </sub>
có 4 b ớc chính sau đây:
<sub>1. Xác định các loại đối t ợng (Các lớp – classes) xuất hiện trong </sub>
giải pháp.
<sub>2. Xác định và mô tả các biến thể hiện trong mỗi loại đối t ợng.</sub>
<sub>3. Xác định các hành động của mỗi một loại đối t ợng.</sub>
<sub>4. Đối với mỗi hành động, mơ tả chức năng của nó, các tham số, </sub>
các điều kiện tiên quyết và các hậu điều kiện.
<sub>Ví dụ: Giả sử chúng ta cần xây dựng một CTrình tính điểm trung bình </sub>
và lấy ra điểm trung bình cho các sinh viên. Mỗi sinh viên trong lớp đ
ợc có các thông tin sau: tên SV, 3 ®iĨm thi, ®iĨm trung b×nh.
<sub>B ớc 1: Xác định các loại đối t ợng, ở đây có 2 loại đối t ợng là </sub>
Sinhvien và Lophoc.
<i><b>13</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<b>1.3.5 Thiết kế h ớng đối t ợng (Object-Oriented Design OOD)</b>
<sub>B ớc 2: Xác định các biến thể hiện của mỗi loại đối t ợng:</sub>
<sub>Sinhvien: TenSV, Diem1, Diem2, Diem3, DiemTB</sub>
<sub>Lophoc: TenLop,SoSV, DSSV</sub>
<sub>B íc 3: </sub>
<sub>Sinhvien:</sub>
<sub>Constructor</sub>
<sub>Destructor</sub>
<sub>GetName: Trả lại tên SV</sub>
<sub>GetData: Nhập số liệu SV từ bàn phím</sub>
<sub>ComputeAverage: Tính điểm TB.</sub>
<sub>DisplayAverage: Hiển thị điểm TB.</sub>
<sub>Lophoc:</sub>
<sub>Constructor</sub>
<sub>Destructor</sub>
<i><b>15</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<b>FUNCTION</b>
<b>FUNCTION</b>
<b>FUNCTION</b>
<b>OBJECT</b>
<b>Operations</b>
<b>OBJECT</b>
<b>Operations</b>
<b> Data</b>
<b>OBJECT</b>
<b>1. Data abstraction (Trừu t ợng hoá dữ liệu)</b>
<b>2. Inheritance of properties (Sù kÕ thõa c¸c thuéc tÝnh)</b>
<b>3. Dynamic binding of operations to objects (Sự ràng buộc </b>
<b>các thao tác với các đối t ợng)</b>
<i><b>17</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>Chy th l quỏ trình xác thực một ch ơng trình tuân theo đúng nhng c t </sub>
mà nó cần thực hiện.
<sub>Testing gồm nh÷ng b íc sau:</sub>
<sub>Chän bé d÷ liƯu thư phï hỵp.</sub>
<sub>Xác định kết quả đầu ra mong muốn.</sub>
<sub>Chạy ch ng trỡnh</sub>
<sub>Phân tích kết quả đầu ra của ch ơng trình.</sub>
<sub>Các ph ơng pháp:</sub>
<sub>Unit testing: Thực hiƯn ë møc module</sub>
<sub>Integration testing (test tÝch hỵp): diƠn ra ë møc cao h¬n</sub>
<sub>Bottom-up testing: Trong ph ¬ng pháp này thì các module mức thấp đ ợc </sub>
tớch hợp và chạy thử tr ớc, nh vậy ta cần một driver để thực hiện.
<sub>Top-down testing: C¸c module mức cao đ ợc tích hợp và chạy thử tr íc, </sub>
lúc đó ta cần các dummy module (module giả) ở mức thấp.
<sub>System testing: Đảm bảo rằng toàn bộ ch ơng trình chạy đúng.</sub>
<sub>Acceptance testing: Kiểm tra nghiệm thu liên quan nhiều đến ng ời sử </sub>
<sub>Test data (D÷ liƯu thư)</sub>
<sub>Dữ liệu thử là thành phần cốt lõi nhằm đảm bảo tính hiệu quả của </sub>
việc chạy thử ch ơng trình. Nó bao gồm 2 nhiệm vụ:
<sub>Chọn bộ dữ liệu thử đầu vào</sub>
<sub>Xỏc nh kt quả mong đợi ở đầu ra.</sub>
<sub>Các loại dữ liệu th:</sub>
<sub>Dữ liệu tự tạo: Tự tạo theo cách thủ công hoặc dùng bộ ngẫu </sub>
nhiên
<sub>Dữ liệu sửa từ d÷ liƯu thËt</sub>
<i><b>19</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>Gỡ lỗi và chạy thử luôn song hành cùng nhau, gỡ lỗi là quá trình phát </sub>
hiện ra nguồn gốc việc gây lỗi trong chạy thử ch ơng trình.
<sub>Các ph ơng pháp gỡ lỗi:</sub>
<sub>G lỗi riêng lẻ: Ng ời lập trình làm việc một mình để tìm ra lỗi.</sub>
<sub>Gỡ lỗi theo nhóm: Một nhóm ng ời lập trình cùng tập trung trong </sub>
rà sốt mã nguồn để tìm ra ngun nhân gây lỗi.
<sub>Gỡ lỗi tổng hợp: Ch ơng trình giao cho nhiều ng ời, kết quả sẽ đ ợc </sub>
tập hợp lại.
<sub>Các công cụ gỡ lỗi:</sub>
<sub>In mà nguồn</sub>
<sub>Da vo đặc tả chi tiết của ch ơng trình</sub>
<sub>Dựa vào flowchart</sub>
<sub>In kết quả đầu ra.</sub>
<sub>D nh ban u</sub>
<sub>Nghiên cứu tính khả thi</sub>
<sub>Phân tích yêu cầu của ng ời sử dụng</sub>
<sub>Phân tích hệ thống</sub>
<sub>Đặc tả hệ thống</sub>
<sub>Thiết kế hệ thống</sub>
<sub>Phát triển hệ thống</sub>
<sub>Chạy thử</sub>
<sub>Triển khai</sub>
<sub>Bảo trì</sub>
<i><b>21</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>TÝnh trõu t ỵng (Abstraction)</sub>
Lọc ra các đặc tính chính trong khi loại bỏ những cỏi khụng cn thit
<sub>S úng gúi (Encapsulation)</sub>
ẩn và bảo vệ các các dữ liệu quan trọng thông qua một giao diện có
điều khiển
<sub>Tính modun hoá (Modularity)</sub>
Chia i t ợng thành các modun nhỏ hơn cho dễ hiểu và dễ thao tác.
<sub>Sù ph©n cÊp (hierachy)</sub>
<sub>Data abstraction:</sub>
<sub>Cho ta một định nghĩa về đối t ợng</sub>
<sub>Ví dụ: </sub>
<sub>Ng êi bu«n xe «t« nhìn xe với: Giá, thời hạn bảo hành, màu </sub>
sắc,...
<sub>Ng ời thợ máy thì nhìn xe với: Kích th ớc lọc dầu,loại bugi,...</sub>
<i><b>23</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>Encapsulation:</sub>
<sub>Phân tích đối t ợng thành các phần</sub>
<sub>GiÊu ®i hoặc bảo vệ các thông tin quan trọng</sub>
<sub>Cung cấp một giao diện cho phép truy cập vào các thuộc tính </sub>
một cách an toàn.
<sub>Cỏc thụng tin ni bộ có thể bị thay đổi mà khơng làm ảnh h ởng đến </sub>
c¸c bé phËn kh¸c.
<sub>VÝ dơ - car radio</sub>
<sub>Giao diện gồm các núm điều khiển, antena, nguồn</sub>
Ch ơng 2
Giảng viên
Giảng viên : Phạm DoÃn Tĩnh: Phạm DoÃn Tĩnh
Bộ môn
Bộ môn : Điện tử tin häc: §iƯn tư tin häc
Khoa
Khoa : §iƯn tư Viễn Thông: Điện tử Viễn Thông<i></i>
Tr ờng
<i><b>25</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>Các công cụ có thể sử dụng trong khoá học này:</sub>
<sub>Turbo C++ 3.0 trở lên</sub>
<sub>Borland C++ 4.5 trë lªn</sub>
<sub>Microsoft Visual C++ 98 (*)</sub>
Nªn sử dụng Microsoft Visual C++ 98 vì nó chạy trên m«i tr êng
windows dễ sử dụng cũng nh tính năng trong soạn thảo tốt và làm cơ
sở để xây dựng các ứng dụng phức tạp (nh lập trình mạng, kết nối
CSDL,...).
-Khi t¹o mét Project míi:
+Chän Win32 console application<b>“</b> <b>”</b>
+ Chän new -> C++ source file<b>“</b> <b>”</b>
<i><b>27</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<i><b>// Program: Display greetings</b></i>
<i><b>// Date: 15-Aug-2004</b></i>
<b>#include <iostream></b>
<b>#include <string></b>
<b>using namespace std;</b>
<b>int main() {</b>
<b> cout << "Hello world!" << endl;</b>
<b> return 0;</b>
<b>}</b>
C¸c chØ dÉn
tiỊn xư lý
Insertion
statement
Kết thúc main() ng
thi kt thỳc ch ng trỡnh
Lời giải thích
Function
hàm
main()
ám chỉ ch
ơng trình
bắt đầu từ
đây
<i><b>29</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<b>#include <iostream></b>
<b>using namespace std;</b>
<b>int main() {</b>
<b> // Extract length and width</b>
<b> cout << "Rectangle dimensions: ";</b>
<b> float Length;</b>
<b> float Width;</b>
<b> cin >> Length >> Width;</b>
<b> // Compute and insert the area</b>
<b> float Area = Length * Width;</b>
<b> </b>
<b>cout << "Area = " << Area << " = Length "</b>
<b> << Length << " * Width " << Width << endl;</b>
<b> return 0;</b>
<b>}</b>
Khai b¸o
NhËp sè liệu
Khai báo kèm
khởi tạo
Object-Oriented Programming <b>31</b>
Ch ơng 3
Giảng viên
Giảng viên : Phạm DoÃn Tĩnh: Phạm DoÃn Tĩnh
Bộ môn
Bộ môn : Điện tử tin học: Điện tử tin học
Khoa
Khoa : Điện tử Viễn Thông: Điện tư ViƠn Th«ng<i>––</i>
Tr êng
<b>Giíi thiƯu vài nét về ngôn ngữ lập trình C</b>
<i><b>33</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<b><sub>Một ch ơng trình C tiêu biểu gồm có các phần sau:</sub></b>
<sub>Các lệnh tiền xử lý (Preprocessor commands)</sub>
<sub>Cỏc nh ngha kiu (Type definition)</sub>
<sub>Các nguyên mẫu hàm (Function prototype)</sub>
<sub>Các biến (variables)</sub>
<sub>Các hàm</sub>
<b><sub>Đặc biệt chú ý là phải có một hàm tên là main()</sub></b>
#include <stdio.h>
void main()
{
printf( Chuong trinh dau tien\n );<b>“</b> <b>”</b>
}
Chỉ dẫn tiền xư lý: sư dơng th viƯn vµo ra chn
Hµm ch ơng trình chính, void ám chỉ không trả lại giá trị<b></b> <b></b>
<b><sub>3.2.1 Định danh và từ khoá (identifier & keyword)</sub></b>
<b><sub>Các ký tự cơ bản đ ợc sử dụng trong ch ơng trình C:</sub></b>
<b><sub>Các chữ in th ờng (Lower case): a b c z</sub></b>
<b><sub>Các chữ in hoa (Upper case)</sub></b> <b><sub>: A B C … Z </sub></b>
<b><sub>Các chữ số (Digits)</sub></b> <b><sub>: 0 1 2 … 9</sub></b>
<b><sub>C¸c ký tù kh¸c:</sub></b>
<b>+ - * / ( ) { } [ ] < > ' " ! # $ % ^ ~ & | \ ; : , . / ?</b>
<b><sub>C¸c tõ kho¸</sub></b>
<i><b>35</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<b><sub>Định danh tên (identifier):</sub></b><i><b><sub></sub></b></i>
<b><sub>ctonờntchuicỏcchcỏi,chsvdugchdi_</sub></b>
<b><sub>Tờnphõnbithoathng</sub></b>
<b><sub>Btubngmtchcỏihocdugchdi_</sub></b>
<b><sub>Tờnphiduynht</sub></b>
<b><sub>Khôngưđượcưsửưdụngưtừưkhoá</sub></b>
<b><sub>ditờnphthuchthng(chophộpnhn31kýt).</sub></b>
<b><sub>Nguyờntcttờnsaochodhiu.</sub></b>
<b><sub>Víưdụ:ưmy_name,ư_your_name,ưfield01</sub></b>
<b><sub>Lờiưgiảiưthíchư(Comment)</sub></b>
<b><sub>TrongC,ligiithớchnhmlmsỏngsahnýnghacacỏccõu</sub></b>
<b>lnhhaymtkhilnhcachngtrỡnh.</b>
<b><sub>Cách khai báo, viết </sub></b>
<b>biểu thức và phép gán.</b>
<b><sub>Các ký tự và kiểu char</sub></b>
<b><sub>Kiểu dữ liệu int </sub></b>
<b><sub>Các kiểu nguyên </sub></b>
<b>short, long và </b>
<b>unsigned</b>
<b><sub>Kiu du phy ng </sub></b>
<b>(float)</b>
<b><sub>Cách khai báo typedef </sub></b>
<b>và sizeof</b>
<b><sub>Các hàm toán học</sub></b>
<b>data type</b> <b>size</b> <b>capacity</b>
<b>char</b> <b>1 byte</b> <b>-128 to +127</b>
<b>unsigned </b>
<b>char</b>
<b>1 byte</b> <b>0 to 255</b>
<b>short</b> <b>2 bytes</b> <b>-32,768 to +32,767</b>
<b>unsigned </b>
<b>short</b>
<b>2 bytes</b> <b>0 to 65,535</b>
<b>int</b> <b>2 or 4 </b>
<b>bytes</b>
<b>long</b> <b>4 bytes</b> <b>-2,147,483,648 to </b>
<b>+2,147,483,647</b>
<b>unsigned </b>
<b>long</b>
<i><b>37</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
#include <stdio.h>
#include <conio.h>
void main()
{
int a,b,c;
char x,y;
...
}
<sub>KiĨu char chiÕm 01 byte trong bé nhí </sub>
máy tính, do đó chúng l u trữ đ ợc tối đa
256 giá trị phân biệt.
<sub>Kiểu char đ ợc dùng để l u trữ các chữ </sub>
cái, các chữ số, các dấu chấm câu cũng
nh các kí tự đặc biệt.
<sub>Kiểu hằng kí tự đ ợc đặt trong dấu nháy </sub>
đơn , ví dụ nh A , 1 , N ,...<b>‘</b> <b> </b>
<sub>Các kí tự điều khiển (bảng bên)</sub>
Meaning uses ASCII
Alert \a 7
Backslash \\ 92
Backspace \b 8
Carriage return \r 13
Double quote \<b>“</b> 34
Form-feed \f 12
Horizontal tab \t 9
New-line \n 10
Null character \0 0
Single quote \<b>‘</b> 39
Vertical tab \v 11
KiĨu Ph¹m vi BDiƠn Sè ký tù KÝch th íc
<i><b>39</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>Để nhập số liệu kiểu char, ta có thể sử dụng các hàm trong th viện </sub>
<conio.h>:
<sub>char getch() trả về 1 ký tự từ bàn phím nh ng kô hiển thị trên màn </sub>
hình.
<sub>char getche() trả vỊ 1 ký tù tõ bµn phÝm nh ng cã hiển thị trên màn </sub>
hình.
<sub> in 1 ký t trên màn hình, ta dùng định dạng %c, để in d ới dạng </sub>
hexa dùng %x, để in d ới dạng số dùng %d
<sub>Mét sè vÝ dơ:</sub>
<sub>printf("%c", '\a'); </sub> <sub>/* cho ra tiÕng bÝp */</sub>
<sub>printf("\"Book on C\" is published"); /* In ra x©u Book on C is published </sub><b><sub>“</sub></b> <b><sub>”</sub></b>
*/
<sub>printf("\'Book on C\' is published"); /* In ra x©u Book on C is published */</sub><b><sub>‘</sub></b> <b><sub>’</sub></b>
<sub>char c='a';</sub>
<sub>printf("%c", c); /*In ra màn hình kÝ tù a */</sub>
<i><b>41</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
Kiểu Phạm vi biểu diễn Kích th íc
int -32768 ~ 32767 2 bytes
unsigned int 0 ~ 65535 2 bytes
long [int] -2147483648 ~ -2147483647 4 bytes
unsigned long [int] 0 ~ 4294967295 4 bytes
Hậu tố cho các số nguyên nh sau:
HËu tè
suffix
KiĨu vÝ dơ
u hc U unsigned 35u
l hc L long 35L
<b>NhËp sè liƯu kiĨu nguyên và hiển thị giá trị nguyên trên màn hình</b>
<b><sub>Để nhập giá trị nguyên ta dùng hàm scanf() trong th viện </sub></b>
<b><stdio.h></b>
<b><sub>cú pháp:</sub></b>
<b>scanf(Định dạng, &bien1, &bien2, );</b>
<b><sub>Nếu muốn nhập số liệu vào từ 1 xâu, ta sử dụng </sub></b>
<b>sscanf(Xau,Định dạng, &bien1, &bien2,)</b>
<b>Ví dụ:</b>
<b>char *s=125;</b>
<b>int i;</b>
<b>sscanf(s,%d,&i);</b>
<b>printf(i=%d \n,i); /* KQ: i=125 */</b>
<i><b>43</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
HËu tè
suffix
KiĨu vÝ dơ
f hc F float 3.5f
l hc L long double 3.5L
<sub>Để nhập số dấu phảy động ta dùng hàm scanf() trong th viện </sub>
<stdio.h>
<sub>cú pháp:</sub>
scanf( Định dạng , &bien1, &bien2, );<b></b> <b></b> <b></b>
<sub>Nếu muốn nhập số liệu vào từ 1 xâu, ta sử dụng </sub>
sscanf(Xau, Định dạng , &bien1, &bien2, )<b></b> <b>”</b> <b>…</b>
VÝ dô:
char *s= 125.788 ;<b>“</b> <b>”</b>
double f;
sscanf(s, %f ,&f);<b>”</b> <b>”</b>
<i><b>45</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub> Hàm sizeof() cho ta biết thông tin về một kiểu dữ liệu nào đó (kích th ớc)</sub>
/* Compute the size of some fundamental types. */
#include <stdio.h>
int main(void) {
printf("The size of some fundamental types is computed.\n\n");
printf(" char:%3d byte \n",sizeof(char));
printf(" short:%3d bytes\n",sizeof(short));
printf("int:%3d bytes\n",sizeof(int));
printf(" long:%3d bytes\n",sizeof(long));
printf(" unsigned:%3d bytes\n",sizeof(unsigned));
printf(" float:%3d bytes\n",sizeof(float));
printf(" double:%3d bytes\n",sizeof(double));
<i><b>47</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
#include <math.h>
#include <stdio.h>
int main(void)
{
double x;
printf("\n%s\n%s\n%s\n\n",
"The square root of x and x
raised",
"to the x power will be
computed.",
"---");
/* do it forever, endless loop */
printf("Input x: ");
if (x >= 0.0)
printf("\n%15s%22.15e\n%15s%22.15e\n%15s
%22 .15e\n\n",
"x = ", x,
"sqrt(x) = ",sqrt(x),
"pow(x, x) = ",pow(x, x));
else
printf("\nSorry, your number must be
nonnegative.\n\n");
}
return 0;
<i><b>49</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>Cho hµm sè:</sub>
<sub>HÃy viết 1 ch ơng trình C nhập vào </sub>
x, n (n nguyên) và tính f(x)?
<i><b>51</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>Hằng ký tự (char) đ ợc biểu diễn trong cặp dấu nháy đơn , ví dụ: </sub><b><sub>‘’</sub></b>
a , G ,...
<b>‘ ’ ’ ’</b>
<sub>Hằng nguyên đ ợc biểu diễn giống trong tốn học, ví dụ 125, -56, 90</sub>
<sub>Các hằng dấu phảy động đ ợc biểu diễn theo hai cỏch:</sub>
<sub>Giống toán học thông th ờng: 12.56, 28.067</sub>
<sub>Theo khoa học: 12.34e+2</sub>
<sub>Các hằng xâu ký tự đ ợc biểu diễn trong cặp dấu nháy kép , khi </sub><b><sub>“ “</sub></b>
hằng quá dài để viết trên nhiều dịng thì dùng dấu \ để nối dịng, ví
dụ:
<b><sub>“</sub></b><sub>Day la mot hang xau ky tu</sub><b><sub>”</sub></b>
<sub>2 dong </sub><b><sub></sub></b>
<sub>Để khai báo hằng chóng ta sư dơng có ph¸p:</sub>
<sub>C¸c to¸n tư to¸n häc nh : </sub>
<sub>+ phÐp céng</sub>
<sub>- phÐp trõ</sub>
<sub>* phÐp nh©n </sub>
<sub>/ phÐp chia</sub>
<sub>% phÐp lÊy phÇn d , vÝ dơ 8 % 3 sÏ cho ta 2.</sub>
<sub>C¸c thao tác theo bit</sub>
<sub>& </sub> <sub>phép và theo bit (AND), VD 0xFF & 0xF1 -> 0xF1</sub>
<sub>| </sub> <sub>Hc theo bit (OR), VD 0x0F | 0xF1 -> 0xFF</sub>
<sub>^</sub> <sub>Hoặc loại trừ (XOR), VD 0xFF ^ 0xF1 -> 0x0E</sub>
<sub>~</sub> <sub>LÊy phÇn bï theo bit, VD ~0 -> 1</sub>
<i><b>53</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>Giá trị logic là đúng true (1) hoặc sai false (0)</sub><i><sub>–</sub></i> <i><sub>–</sub></i>
<sub>C¸c phÐp to¸n so s¸nh (cã thứ tự u tiên thấp hơn các phép toán số học)</sub>
Phép
toán ý nghĩa Ví dụ
> Lớn hơn 10 > 8 cho giá trị 1 (true)
>= lớn hơn hoặc bằng 8 >= 9 cho giá trị 0 (false)
< Nhỏ hơn 10 < 3 cho giá trị 0 (false)
<= Nhỏ hơn hoặc bằng 10 <=20 cho giá trị 1 (true)
== Bằng 10==10 cho giá trị 1 (true)
!= Khác 10 !=10 cho giá trị 0 (false)
<sub>Các phép toán logic</sub>
<sub>Phộp ph nh một ngơi !, ví dụ 3> 7 cho giá trị 0, !(3 >7) cho giá trị 1</sub>
<sub>Phép và (AND) &&, ví dụ (3>7) && (5 > 0) cho giá trị 0</sub>
<sub>PhÐp hc (OR) ||, vÝ dơ (3>7) || (5 > 0) cho giá trị 1</sub>
<sub>Các toán tử tăng giảm (increment and decrement operators)</sub>
<sub>Chúng đ ợc sử dụng để tăng hoặc giảm giá trị của một biến lên hoặc </sub>
xuống 1 đơn vị.
<sub>Chúng có thể đ ợc sử dụng d ới dạng postfix hoặc prefix.</sub>
<sub>Cú pháp: </sub>
<sub>ten_bien++, ++ten_bien</sub>
<sub>ten_bien--, --ten_bien</sub>
<sub>Dù ở tr ớc hay sau thì giá trị của biến đều tăng lên 1 đơn vị.</sub>
<sub>Chúng có mức độ u tiên cao trong một biểu thức.</sub>
<sub>Sù khác nhau cơ bản trong postfix và prefix thể hiện qua vÝ dô sau</sub>
#include <stdio.h>
void main() {
int a,b,c=0;
Cho ta kÕt quả:
<i><b>55</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<b><sub>Trong C, toán tử gán đ ợc sử dụng là = khác với PASCAL là :=</sub></b>
<b><sub>Ten_bien=bieu_thuc;</sub></b>
<b><sub>Ten_bien=gia_tri;</sub></b>
<b><sub>Ngoài ra trong C còn cho phép ta gán cùng một giá trị cho nhiỊu biÕn </sub></b>
<b>cïng mét lóc</b>
<b><sub>VÝ dơ: </sub></b>
<b><sub>int a,b,c,d; a=b=c=d=100;</sub></b>
<b><sub>a=(b+2)+(c=3); /* tuong duong voi b=2; c=3; a=b+c; */</sub></b>
<b><sub>Các ph ơng pháp gán khác:</sub></b>
<b><sub>Cú pháp:</sub></b>
<b><sub> Ten_bien Toan_tu= bieu_thuc; t ơng đ ơng với</sub></b>
<b><sub>Ten_bien= Ten_bien Toan_tu Bieu_thuc;</sub></b>
<b><sub>+=</sub></b> <b><sub>-=</sub></b> <b><sub>*=</sub></b> <b><sub>/=</sub></b> <b><sub>%=</sub></b>
<b><sub>>>=</sub></b> <b><sub><<=</sub></b> <b><sub>&=</sub></b> <b><sub>^=</sub></b> <b><sub>|=</sub></b>
<b><sub>VÝ dô: j +=3; /* tuong duong j=j+3; */</sub></b>
<b><sub>Biểu thức điều kiện (?):</sub></b>
<b><sub>Cú pháp: s=ex1 ? gt1:gt2;</sub></b>
<b><sub>Nếu ex1 nhận giá trị đúng (1- true) thì s nhận gt1 nếu không s </sub></b>
<sub>Trong C dÊu , cịng đ ợc xem nh một toán tử, toán tử này có trình tự u </sub><b><sub> </sub></b>
tiên thấp nhất.
Ví dụ int a,b=0,c;
a=100,b=200;
<sub>Trình tự u tiên của các toán tử nh sau (Từ trên xuống, từ trái qua phải)</sub>
<i><b>57</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>Chuyển đổi kiểu (type casting)</sub>
<sub>Trong C, việc chuyển đổi kiểu </sub>
khá linh hoạt.
<sub>Cú pháp cho chuyển đổi kiểu </sub>
nh sau:
<sub>(type) (bieu_thuc);</sub>
#include <stdio.h>
void main()
{
int a;
double b=10.1,c=20.55;
a=(int)(c-b);
printf( a=%d\n",a);<b>“</b>
}
<i><b>59</b></i>
if ( c == 'Y' )
{
printf( "Yes,\n" );
printf( "we have no bananas!\n" )'
bananas = 0;
}
if ( ( c >= 'a' ) && ( c <= 'z' ))
{
printf( "lower case\n" );
++lowers;
}
else if ( ( c >= 'A' ) && ( c <= 'Z' ))
{
một từ vài nhánh rẽ dựa trên giá trị
một biểu thức nào đó.
<sub>Có ph¸p:</sub>
switch( expression )
{
case constant-expr1:
stmt;
break;
case constant-expr2:
<sub>VÝ dô:</sub>
switch( c )
{
case 'Y':
printf( "Yes" );
break;
case 'N':
printf( "No" );
break;
default:
<i><b>61</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>Viết 1 ch ơng trình C, nhập vào tháng và năm và hiển thị trên màn </sub>
cho cïng mét nh¸nh:
switch( c )
{
case 'Y':
case 'y':
printf( "Yes" );
break;
case 'N': case 'n':
/* 2 ĐK Cùng dòng */
printf( "No" );
break;
default:
printf( "What?\a" );
switch(month)
{
case 1:case 3: case 5: case 7:case 8:case
12:case 10:
printf("Thang 31 ngay!\n");
break;
case 4:case 6:case 9:case 11:
printf("Thang 30 ngay!\n");
break;
case 2:
if ((year % 4) ==0)
printf("Thang 29 ngay!\n");
else
<i><b>63</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>Câu lệnh while đ ợc sử dụng để lặp lại một lệnh hoặc khối </sub>
lệnh khi biểu thức logic đúng.
<sub>Có ph¸p:</sub>
while ( expression )
<i>stmt ; </i>
<sub>VÝ dô</sub>
x = 1;
while ( (x * 5) >= (x * x) )
{
printf( "%d %d %d\n", x, x*5, x*x );
x++;
}
<sub>Víi c©u lệnh này thì lệnh (khối lệnh) chỉ và chỉ đ îc thùc hiÖn </sub>
<sub>Câu lệnh while đ ợc sử dụng để lặp lại một lệnh hoặc khối lệnh </sub>
khi biểu thức logic đúng.
<sub>Có ph¸p</sub>
do
stmt ;
while ( expression );
<sub>VÝ dô:</sub>
lng = 0;
{
c = getchar();
++lng;
}
<i><b>65</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>Có ph¸p:</sub>
for ( init-expr; cont-expr; loop-expr )
stmt;
<sub>Thùc hiƯn:</sub>
<sub>TÝnh to¸n init_expr nÕu cã</sub>
<sub>TÝnh to¸n cont-expr nếu có</sub>
<sub>Nếu cont-expr là true hoặc bỏ qua thì stmt đ ợc thực hiện ít nhất 1 lần, </sub>
ri sau đó loop-expr sẽ đ ợc thực hiện.
<sub>Lặp lại 2 b ớc trên đến khi cont-expr là false.</sub>
9 times 0 is 0
9 times 1 is 9
9 times 2 is 18
9 times 3 is 27
9 times 4 is 36
9 times 5 is 45
9 times 6 is 54
9 times 7 is 63
9 times 8 is 72
9 times 9 is 81
/* B¶ng cưu ch ¬ng */
#define MAX 9
for ( i = 0; i <= MAX; i++ )
{
for ( j = 0; j <= MAX; j++ )
{
printf( "%d times %d is %d\n", i, j, i*j );
}
}
<sub>VÝ dô:</sub>
int c,max=10;
printf( "Enter up to %d chars", max );
for ( i = 0; i < max; i++ )
{
c = getchar();
if ( c == EOF || c == '\n' )
{
break;
}
putchar( 255 - c ); /* encrypt char
*/
<i><b>67</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
#include <stdio.h>
#include <conio.h>
void main()
{
int i,max=10,linelng;
char c;
printf( "Enter %d lines...\n", max );
{
linelng = 0;
while ( ( c = getchar() ) != '\n' )
{
if ( c == EOF )
{
goto SickOfIt;
}
++linelng;
}
printf( "Length of line %d is %d\n",
i, linelng );
}
SickOfIt:
<sub>1. Viết 1 ch ơng trình C, nhập vào N số (N xác định bằng cách nhập </sub>
tõ bµn phím).
<sub> Tính giá trị trung bình của các số d ơng?</sub>
<sub>2. Viết 1 ch ơng trình nhập vào 1 dÃy các ký tự và đ a ra thống kª xem </sub>
có bao nhiêu chữ cái, bao nhiêu chữ số, bao nhiêu ký tự đặc biệt?
<sub>3. Cho:</sub>
<sub>A(n)= 1+2 + 3 + 5 + 8 + ... a</sub>
n-2 +an-1 + an
<sub>Víi a</sub>
0 =1, a1 =2.
<sub>vµ an = an-2 + an-1 </sub>
<i><b>69</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<b><sub>Cú pháp:</sub></b>
<b>data_type array_name[so_phan_tu];</b>
<b>Ví dụ:</b>
<b>int a[10]; /* Khai báo mảng 10 số nguyên */</b>
<b>char my_name[35]; /* Khai mét x©u 35 ký tù */</b>
<b><sub>Khi muèn khởi tạo (initialize) các phần tử mảng ta đ a các giá trị khởi tạo </sub></b>
<b>vào dấu {gt1,gt2,...,gtN }</b>
<b><sub>Với phần tử ch a khởi tạo thì giá trị của nó bằng 0.</sub></b>
<b><sub>Khi đ ợc khởi tạo giá trị ®Çu, cã thĨ bá tham sè chiỊu (compiler sÏ </sub></b>
<b>tự động tính tốn)</b>
<b><sub>VÝ dơ:</sub></b>
<b>char whitesp[5] = {'\n','\t',' ','\r','\f'}; /* Mảng chứa các ký tự trắng */</b>
<b>int prodcod[] = { 16, 60, 75, 101, 17 }; /* Mảng chứa các m· s¶n phÈm */</b>
<b><sub>Ta có thể sử dụng sizeof() để xác định số phần tử mảng:</sub></b>
<i><b>71</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<b>Ví dụ</b>
<b>int Larry[5] = { 5, 10, 15, 20, 25 };</b>
<b>int i, Curly; tot = 0;</b>
<b>Curly = Larry[0]; /* Curly <-- 5 */</b>
<b>Curly = Larry[3]; /* Curly <-- 20 */ </b>
<b>Curly = Larry[4]; /* Curly <-- 25 */ </b>
<b>i = 1;</b>
<b>Curly = Larry[i]; /* Curly <-- 10 */ </b>
<b>Larry[0] = 30; /* Larry=30,10,15,20,25 </b>
<b>*/</b>
<b>/* sum and print all array elements */</b>
<b>for ( i = 0; i < 5; i++ )</b>
<b>{</b>
<b> printf( "%d", Larry[i] );</b>
<b> tot += Larry[i];</b>
<b>}</b>
<b>/* increment each array element */</b>
<b>for ( i = 0; i < 5; i++ )</b>
<b>{</b>
mảng 1 chiều, chỉ có điều ta thêm
chiều bằng các cặp dấu [].
<sub>Để truy cập ta dùng các chỉ số t ơng </sub>
ứng.
<sub>Ví dụ:</sub>
/* Khai báo mảng 4 hàng, 3 cột */
int hah[4][3];
Sự phân bố vị trí trong bộ nhớ nh hình vẽ
bên.
<sub>Để duyệt mảng nhiều chiều dùng vòng </sub>
lặp lồng nhau.
<sub>Để khởi tạo mảng nhiều chiều</sub>
int a[2][3]={{1,2,3},{4,5,6}};
#define NROWS 15 /* symbol for # rows
*/
#define NCOLS 24 /* symbol for # cols */
int i, j;
long mx[NROWS][NCOLS], totmx;
double pct[NROWS][NCOLS];
... /* Nhập mảng */
/* Tổng các PT m¶ng */
for ( i = 0; i < NROWS; i++ )
{
for ( j = 0; j < NCOLS; j++ )
totmx += mx[i][j];
}
}
/* compute pct of total for each */
if ( totmx != 0 )
{
<i><b>73</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>Trong ch ơng trình, mỗi biến chiếm </sub>
mt s bytes nht nh và l u ở một vị
trí cụ thể trong bộ nhớ máy tính.
<sub>Con trỏ thực chất là một loại biến đặc </sub>
biệt đ ợc sử dụng để l u địa chỉ một ơ
nhớ cụ thể nào đó hoặc l u địa chỉ của
một biến khác.
<sub>Khai báo:</sub>
Data_Type *pointer_var_name;
hoặc
Data_Type* pointer_var_name;
<sub>Để khởi tạo giá trị của con trá, ta cã </sub>
thể cho nó trỏ vào một địa chỉ nhớ cụ
thể hoặc lấy địa chỉ của một biến
khác thơng qua tốn tử lấy địa chỉ
& .
<b>“ ”</b>
<sub>Để truy cập vào ô nhớ tại a ch m </sub>
con trỏ đang trỏ tới dùng toán tử tham
chiếu ng ợc *, với cú pháp:
*Ten_contro = gia_tri;
hoặc
ten_bien=*Ten_contro;
<sub>Ví dụ:</sub>
int *int_ptr; /* Khai báo con trá int */
float *float_ptr; /* Con trá float */
int a;
char b;
int *ip=&i;
char *cp=&b;
int i=3, j=5, *p=&i, *q=&j, *r;
double x;
p==&i p==(&i) 1
**&p *(*&p) 3
r=&x r=(&x) illegal
ta cßn cã thĨ dïng con trá
khơng xác định kiểu (void *) để l
u trữ địa chỉ của bất kỳ ô nhớ
nào. Nh ng l u ý với con trỏ này
khi truy cập ô nhớ mà nó trỏ tới
cần chuyển đổi kiểu t ơng ứng!
<sub>Ngoài ra ta còn có thể dùng các </sub>
phộp toỏn số học đối với con trỏ.
int *p1;
char *p2;
++p1; /* p1 tăng lên 4~4 bytes */
++p2; /* p2 tăng lªn 1~1 byte */
#include <stdio.h>
void main()
{
short i=10, *p1=&i;
char c='A',*p2=&c;
float f=100.8,*p3=&f;
printf("p1=%p p2=%p p3=
%p\n",p1,p2,p3);
printf("++p1=%p ++p2=\
%p
--p3=%p\n",++p1,++p2,--p3);
<i><b>75</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<b><sub>Bn thõn tờn mảng là địa chỉ </sub></b>
<b>của phần tử đầu tiên trong </b>
<b>mảng</b>
<b><sub>VÝ dơ:</sub></b>
<b>int a[100],*p;</b>
<b>Khi đó a[i] *(a+i)</b>
<b>p=a+1</b>
<b>p=&a[1];</b>
<b>#define N 100</b>
<b>int a[N], i, *p, sum=0;p=a;</b>
<b>p=&a[0];</b>
for (p=a;p<&a[N]; p++) for (i=0;i<N;i++)
sum+=*p; sum+=a[i];
for (i=0;i<N;i++) p=a;
<sub>Để khai báo cấu trúc ta dùng </sub>
cú ph¸p:
<sub>struct struct_name</sub>
{
type1 field1;
} [bien_co_kieu_struct_name];
<sub>Để truy cập đến các thuộc tính </sub>
cđa struct ta sư dơng to¸n tư
.
<b> </b>
<sub>Ta có thể khởi tạo giá trị cho </sub>
một biến struct giống nh đối
với mảng , đặt các giá trị trong
cặp dấu { } phân cách giá trị
#include <stdio.h>
struct emp
{
int empno;
char ename[35];
};
void main()
{
struct emp e1={100, Nguyen <b>”</b>
X };<b>”</b>
printf( ENo:%d, Ename:\ <b>“</b>
<i><b>77</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>Víi cÊu tróc </sub>
struct, mỗi tr ờng
chiếm một vị trí
nhớ khác nhau,
đối với union
chúng chia sẻ
cùng một vùng
nhớ.
<sub>Có ph¸p khai b¸o:</sub>
<sub>union </sub>
union_name
{
Type1 field1;
Type2 field2;
...
}
* Define a variable to hold an integer or
* a real number (but not both)
union value {
long int i_value; /* The real number */
float f_value; /* The floating-point number */
} data;
int i; /* Random integer */
float f; /* Random floating-point number */
void main()
{
data.f_value = 5.0;
data.i_value = 3; /* data.f_value overwritten */
i = data.i_value; /* legal */
f = data.f_value; /* not legal, will generate unexpected
results */
data.f_value = 5.5; /* put something in f_value/clobber
i_value */
i = data.i_value; /* not legal, will generate unexpected
results */
<i><b>79</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>enum đ ợc dùng cho các biến mà sẽ chỉ nhận một số giá trị nhất định, </sub>
các giá trị đ ợc liên hệ đến thông qua tên.
typedef int week_day;
/* define the type for week_days */
const int SUNDAY = 0;
const int MONDAY = 1;
const int TUESDAY = 2;
const int WEDNESDAY = 3;
const int THURSDAY = 4;
const int FRIDAY = 5;
const int SATURDAY = 6;
/* now to use it */
week_day today = TUESDAY;
enum week_day {SUNDAY, MONDAY,
TUESDAY, WEDNESDAY, THURSDAY,
FRIDAY, SATURDAY};
/* now use it */
struct item {
unsigned int list:1; /* true if item is in the list */
unsigned int seen:1; /* true if this item has been seen */
unsigned int number:14; /* item number */
};
<sub>Ta có thể tạo một mảng gồm 10 phần tử có kiểu là cấu trúc item:</sub>
struct item mang_ct[10];
Trong C, viƯc kÕt hỵp cÊu tróc víi con trá sẽ cho phép ta tạo ra những
cấu trúc dữ liệu rất mạnh trong lập trình:
struct linked_list
{
<i><b>81</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>Trong C, tất cả các ch ơng trình con đều đ ợc coi là hàm.</sub>
<sub>Có 2 loại hàm: trả lại giá trị và không trả lại giá trị (void).</sub>
<sub>Để khai báo 1 hàm trong C, dùng cú pháp sau:</sub>
Kieu_Tra_lai ten_ham(tham_so)
{
/* Neu tra lai gia tri co them return (giatri); */
}
VÝ dô:
int cong_so(int a,int b)
{
return(a+b);
}
<sub>Trong C, các tham số khi truyền vào hàm th ờng là qua giá trị sao chép, </sub>
do vy cho dù trong hàm có làm thay đổi giá trị của nó thì khi kết thúc
hàm, giá trị của nó vẫn khơng thay đổi.
<sub>Trong tr ờng hợp muốn thay đổi giá trị của tham số khi thoát khi hm, </sub>
tăng giá trị tham số thứ nhất lên
1, tham số 2 lên 2 đơn vị khi kết
thúc hàm thì hàm cong_so_1 sẽ
cho ta điều mong muốn.
void main()
{
int a=10,b=20,c;
c=cong_so(a,b);
printf( a=%d,b=%d\n",a,b);<b>“</b>
c=cong_so_1(a,b);
printf("a=%d,b=%d\n",a,b);
c=cong_so_2(&a,&b);
printf("a=%d,b=%d\n",a,b);
}
#include <stdio.h>
a++;b+=2;
return(a+b);
}
int cong_so_1(int &a,int &b)
{
a++;b+=2;
return(a+b);
}
int cong_so_2(int *a,int *b)
<i><b>83</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>Để truyền tham số có kiểu mảng, ta dùng cú pháp</sub>
<sub>Kieu_Tra_Ve Ten_Ham(Kieu_PT_Mang a[] ,...)</sub>
<sub>Ví dụ:</sub>
/* Hàm sắp xếp 1 mảng nguyên a gåm N phÇn tư */
void SX_NoiBot(int a[], int N)
{
int i,j,tmp;
for(i=0;i<N-1;i++)
for(j=0;j<N-i-1;j++)
if(a[j]>a[j+1])
{ tmp=a[j];a[j]=a[j+1];a[j+1]=tmp;}
}
void main()
{ int a[10]={9,2,7,4,3,6,1,12,8,5}, i;
SX_NoiBot(a,10);
for(i=0;i<10;i++) printf( %3d ,a[i]);<b>“</b> <b>”</b>
<sub>Ngoài cách dùng hàm thông th ờng </sub>
ó bit, ta cịn có thể dùng hàm d
ới dạng con tr ti hm.
<sub>Cách này th ờng đ ợc dùng trong tr </sub>
ờng hợp ta cần lập trình gọi hàm
một cách tổng quát.
<sub>Ví dụ:</sub>
#include <stdio.h>
#include <math.h>
double dien_tich_hinh_tron(float bk)
{
return(3.14*bk*bk);
}
typedef double (*fptr)(float);
void main()
<sub>Trong C, hàm cịn có thể có tính đệ </sub>
quy (recursive): Một hàm có thể có
lời gọi đến chính nó.
<sub>VÝ dơ: TÝnh giai thõa cña mét sè N</sub>
#include <stdio.h>
#include <math.h>
long giai_thua(int N)
{
return(N<=1? 1:N *
giai_thua(N-1));
}
void main()
{
<i><b>85</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>C cung cấp cho ta một cỏch </sub>
truyền tham số cho ch ơng trình
khi ta chạy ch ơng trình thông
qua các tham số của hàm
main()
<sub>cú pháp nh sau:</sub>
<i>main( int argc, char *argv[] )</i>
Trong đó:
<b>“</b>argc lµ sè tham sè<b>”</b>
<b>“</b>argv[] là mảng chứa giá trị <b></b>
các tham số.
Nh ng argv[0] là tên của ch ơng trình,
nh vậy giá trị tham số bắt đầu
<sub>Ví dụ:</sub>
#include <stdio.h>
main( int argc, char *argv[] )
{
if( argc == 2 )
printf("The argument supplied is
%s\n", argv[1]);
else if( argc > 2 )
printf("Too many arguments
supplied.\n");
else
printf("One argument
expected.\n");
<i><b>87</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>Trong C, stdio.h lµ th viƯn hµm </sub>
cho vào ra. Trong đó ta sử dụng
một số hàm thông dụng nh :
<sub>printf( format ,args) để kết </sub><b><sub>“</sub></b> <b><sub>”</sub></b>
xt d÷ liƯu.
<sub>scanf( format ,args) để nhập </sub><b><sub>“</sub></b> <b><sub>”</sub></b>
sè liƯu tõ bµn phÝm.
<sub>Ngoµi ra, ta cã thĨ dïng hµm </sub>
gets(char *s) để nhập một xâu
ký tự t bn phớm.
<sub>Chú ý: Vào ra với C, cần l u ý </sub>
đến bộ đệm bàn phím. Khi
cần xố bộ đệm ta dùng hàm:
<sub>fflush(stdin);</sub>
<b>®iỊu khiĨn ý nghÜa</b>
d Đọc vào số nguyên
o Đọc số hệ 8
x Đọc số hƯ 16
h §äc sè short
l §äc sè long
f Đọc số dấu phảy động
e đọc số double
c đọc một ký tự
S đọc một xâu kết thúc khi gặp dấu
trắng, tab, hoặc enter
[...] đọc xâu với các ký tự bắt <sub>buộc trong dấu [ ].</sub>
<sub>để nhập một ký tự từ bàn phím, có </sub>
thể dùng:
<sub>int getch() -> nhận KT không </sub>
phản hồi màn hình.
<sub>int getche() -> nhận KT có </sub>
phản hồi màn hình.
#include <stdio.h>
void main()
{
char name[35];
int a;
float f;
fflush(stdin);
printf("name=");
gets(name);
fflush(stdin);
<i><b>89</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>Trong C, để làm việc với file, ta sử dụng th viện <stdio.h>.</sub>
<sub>Để khai báo một biến là con trỏ file, dùng cú pháp:</sub>
<sub>FILE *my_file;</sub>
<sub>Tr ớc khi làm việc với file, ta cần mở chóng:</sub>
<sub>my_file=fopen( my_file.txt , r );</sub><b><sub>“</sub></b> <b><sub>” ” ”</sub></b>
<sub>Có mấy chế độ mở file: r chỉ đọc, w chỉ ghi, w+ cả đọc và </sub><b><sub>“ ”</sub></b> <b><sub>” ”</sub></b> <b><sub>“</sub></b> <b><sub>”</sub></b>
ghi, b mở chế độ binary.<b>“ ”</b>
<sub>NÕu </sub><sub>my_file==NULL</sub><sub> th× cã nghÜa thao tác với FILE không thành </sub>
<sub>Để vào ra với file, dùng các hàm:</sub>
<sub>In ra file: </sub><sub>int fprintf(FILE *,const char *,....)</sub>
<sub>đọc vào từ file: </sub><sub>fscanf(FILE *,const char *,....)</sub>
<sub>Ghi một ký tự ra file: </sub><sub>putc(int,FILE *)</sub>
<sub>Khi vào ra ở chế độ nhị phân (binary), dùng các hàm sau:</sub>
<sub>fwrite(void*,KT_PT,So_PT,FILE*);</sub>
<sub>fread(void*,KT_PT, So_PT ,FILE*);</sub>
VÝ dô:
struct SV
{
int ma_sv;
char ten_sv[30];
}
...
struct SV s; FILE *f;
...
<i><b>91</b></i>
<sub>Để xác định vị trí hiện thời của con trỏ dùng hàm:</sub>
<sub>long ftell( FILE *stream );</sub>
<sub>Để chuyển con trỏ FILE đến một vị trí xác định, dùng hàm:</sub>
<sub>int fseek( FILE *stream, long offset, int origin );</sub>
<sub>origin:</sub>
SEEK_CUR
Từ vị trí hiện tại
SEEK_END
Từ cuối file.
SEEK_SET
Từ đầu file.
VÝ dơ:
Xác định kích th ớc 1 File:
fseek(f,0L,SEEK_END);
/* Ch ơng trình Xử lý in ra/Đọc vào từ mét file trong C */
#include <stdio.h>
void in_file(char *fn)
{
FILE *f; /* Khai bao bien con tro file */
int i,j;
f=fopen(fn,"w"); /* Mo file ở chế độ ghi */
if (f==NULL) /* Mở không thành công */
printf("Khong the mo file!\n");
else /* Më thành công */
{
for(i=0;i<10;i++)
{
for(j=0;j<5;j++)
fprintf(f,"%10d",j*i+1); /* in số j*i +1 ra file */
fprintf(f,"\n"); /* Xuèng dßng */
<i><b>93</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
void doc_file(char *fn,int a[10][5]) /* Hàm đọc file văn bản đã ghi ra ở phần trên */
{
FILE *f;
int i;
char s[100];
f=fopen(fn,"r"); /* Mở file ở chế độ đọc */
if (f==NULL)
printf("Khong the mo file!\n");
else
{
for(i=0;i<10;i++)
{
fgets(s,100,f);
sscanf(s,"%10d%10d%10d%10d%10d",a[i],a[i]+1,a[i]+2,a[i]+3,a[i]+4);
}
fclose(f); /* §ãng file */
printf("Da doc xong so lieu\n");
}
void main() /* Ch ¬ng tr×nh chÝnh */
{
int a[10][5],i,j;
char fn[20]="output.txt";
in_file(fn); /* In sè liƯu ra file */
doc_file(fn,a); /* §äc sè liƯu vào mảng a */
/* In mảng ra màn hình */
for(i=0;i<10;i++)
{
for(j=0;j<5;j++)
printf("%10d",a[i][j]);
printf("\n");
<i><b>95</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
Địa chỉ (hex)
int, pointer
(4 byte = 32bits)
Địa chỉ
thấp
Địa chỉ
cao
(Với giả thiết máy tính 32-bit)
0 (0x0)
4 (0x4)
8 (0x8)
12 (0xc)
16 (0x10)
20 (0x14)
:
:
thấp
Địa chỉ
cao B nh t động
Bộ nhớ tĩnh
Mã (functions)
Vïng trèng
(Heap)
(Ph¸t triĨn theo h íng này)
Dựng cho cp phỏt ng
<i><b>97</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
int x = 10
int y = 20;
void func() {
...
}
int main()
{
int i = 123;
int *p;
p = new int;
*p = 456;
...
}
(Các địa chỉ ở đây chỉ là ví dụ)
Stack đ ợc dùng để l u các biến cục bộ
void func2() {
int x, y;
}
void func1() {
int p, q;
func2();
int main()
{
int a, b;
func1();
<b>ã</b><sub> Khi bắt đầu vào một </sub>
hàm, một khung stack
sẽ đ ợc khởi tạo.
<b>ã</b><sub> Khi hàm thực hiện </sub>
xong, khung stack của
hàm sẽ đ ợc giải phóng.
q
x
p
y
Stack frame cho
func1
Stack frame cho
<i><b>99</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
void func2(int q1, int q2) {
int e, f;
}
void func1(int p1, int p2) {
int c, d;
func2();
}
int main(int argc, char* argv[])
{
int a, b;
func1();
}
#include <stdio.h>
int sum(int <b>x</b>)
{
if (x == 0) {
return x + sum(x – 1);
}
}
int main()
{
printf(“%d”, sum(5));
4th<sub> x=2</sub>
5th<sub> x=1</sub>
<i><b>101</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
<sub>Trong C, bộ nhớ động có thể đ ợc sử dụng một cách linh hoạt và hiệu </sub>
quả thông qua các hàm cấp phát và giải phóng bộ nhớ động nh
calloc(), sizeof() và free()
<sub>Để dùng calloc() dùng cú pháp:</sub>
(void*) calloc(unsigned int SoPT,unsigned int KTPT)
VÝ dô:
<i> struct date *date_pointer;</i>
<i> date_pointer = (struct date *) calloc( 10,sizeof(struct date) );</i>
<sub>§Ĩ sư dơng free(), dïng cú pháp:</sub>
free(pointer_var);
/* Ví dụ Danh sách liên kết*/
#include <string.h>
#include <malloc.h>
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <conio.h>
/* Định nghĩa 1 Nót */
struct node {
char data[20];
struct node *next;
struct node * initialise( void );
void freenodes( struct node * );
int insert( struct node * );
void del( struct node *, struct
node * );
void list( struct node * );
<i><b>103</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
void readline( char buff[] )
{
int ch, loop = 0;
ch = getche();
while( ch != '\r' ) {
buff[loop] = ch;
loop++;
ch = getche();
}
buff[loop] = 0;
}
struct node * initialise( void )
{
/* free memory allocated for node */
void freenodes( struct node *headptr )
{
struct node *temp;
while( headptr ) {
temp = headptr->next;
free( headptr );
headptr = temp;
}
<i><b>105</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
/* chÌn 1 nút sau nodeptr, return 1 = thành công */
int insert( struct node *nodeptr )
{
char buffer[20];
struct node *newptr;
newptr = initialise(); /* CÊp ph¸t bé nhí cho nót míi */
if( newptr == NULL ) {
return 0;
}
else { /* Điền dữ liệu và thêm vào DSách */
newptr->next = nodeptr->next;
nodeptr->next = newptr;
nodeptr = newptr;
printf("\nEnter data --->");
readline( buffer );
strcpy( nodeptr->data, buffer );
}
/* Xo¸ mét nót khái danh s¸ch */
void del( struct node *headptr, struct node
*nodeptr )
{
struct node *deletepointer,
*previouspointer;
char buffer[20];
deletepointer = headptr->next;
previouspointer = headptr;
/* Tìm nút cần xoá */
printf("\nEnter name to be deleted
--->");
readline( buffer );
if( strcmp( buffer, deletepointer->data
) == 0 ) {
/* Xo¸ nót do deletepointer trá*/
previouspointer->next =
else {
/* Chun sang nót kÕ tiÕp */
deletepointer =
deletepointer->next;
previouspointer =
previouspointer->next;
}
}
/* T×m thÊy? */
if( deletepointer == NULL )
printf("\n\007Error, %s not found
or list empty\n", buffer);
else {
free( deletepointer );
/* Điều chỉnh lại nodeptr*/
nodeptr = headptr;
<i><b>107</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
/* In Danh s¸ch */
void list( struct node *headptr )
{
struct node *listpointer;
listpointer = headptr->next;
if( listpointer == NULL )
printf("\nDanh sách rỗng.\n");
else {
while( listpointer ) {
printf("Name : %20s\n", listpointer->data );
listpointer = listpointer->next;
/* Menu chÝnh */
void menu( struct node *headp, struct node *nodep )
{
int menuchoice = 1;
char buffer[20];
while( menuchoice != 4 ) {
printf("1 insert a node\n");
printf("2 delete a node\n");
printf("3 list nodes\n");
printf("4 quit\n");
printf("Enter choice -->");
readline( buffer );
menuchoice = atoi( buffer );
switch( menuchoice ) {
case 1 : if( insert( nodep ) == 0 )
printf("\n\007Insert failed.\n");
break;
case 2 : del( headp, nodep ); break;
case 3 : list( headp ); break;
<i><b>109</b></i>
<i><b>Object-Oriented Programming (OOP)</b></i>
{
struct node *headptr, *nodeptr;
headptr = initialise();
nodeptr = headptr;
headptr->next = NULL;
menu( headptr, nodeptr );
freenodes( headptr );