Màn hình và hệ toạ độ:
Trong chế độ đồ hoạ, màn hình được coi như một ma trận các pixel riêng lẻ, tuỳ theo mode đồ hoạ và adapter màn hình
Turbo C có rất nhiều trình điều khiển màn hình cho các bộ ghép nối (adaptor) khác nhau như CGA, EGA. Các tệp tin này có phần mở rộng là .BGI
Tệp tin header graphics.h chứa các nguyên mẫu của các hàm đồ hoạ. Khi sử dụng các hàm đồ hoạ phải có dòng :
#include “graphics.h”
Khởi động chế độ đồ hoạ
Dùng hàm initgraph():
void far initgraph (int far *driver, int far *mode, char far*path); trong đó:
- int far * driver là địa chỉ của số hiệu trình điều khiển đồ hoạ có thể chọn các trình điều khiển đồ hoạ như:
Giá trị Tên hằng Ghi chú
0 DETECT Hệ thống tự phát hiện kiểu đồ hoạ cao nhất có
thể được
1 CGA Sử dụng trình điều khiển của màn hình CGA
2 MCGA Như CGA
3 EGA 256K bộ nhớ trên board EGA
4 EGA64 64K bộ nhớ trên board EGA
5 EGAMONO
- int far *mode là địa chỉ của số hiệu kiểu điều khiển đồ hoạ
- char fả* path mô tả đường dẫn tới nơi chứa tệp có chương trình điều khiển đồ hoạ
Ví dụ: Chương trình khởi tạo đồ hoạ và vẽ một đường thằng và một đường tròn #include<stdio.h>
#include<conio.h> #include<graphics.h> main()
{
int driver, mode; int x1=0, y1=0; int x2 = 199, y2=199; int xc=100, yc=100; int bk = 90; driver=CGA; mode = CGAC0; initgraph(&driver, &mode, ""); line(x1,y1,x2,y2); circle(xc,yc,bk); getch(); closegraph(); } Lỗi đồ hoạ: Dùng hàm graphresult():
int far graphresult (void);
hàm này trả về mã lỗi xảy ra khi ta cố gắng khởi tạo chế độ đồ hoạ
Sau khi biết được mã lỗi, muốn biết các thông báo lỗi tương ứng hãy chuyển mã lỗi sang hàm grapherrormsg()
Hàm này trả về xâu kí tự mô tả lỗi đồ hoạ vừa xảy ra
Khởi động tự động
Gán hằng DETECT cho đối số driver của hàm inỉtgaph() sẽ khởi tạo tự động kiểu đồ hoạ ở chế độ “mịn” nhất cho phép Ví dụ: #include<stdio.h> #include<conio.h> #include<graphics.h> main() {
int mode, driver=DETECT; int error,maxx, maxy;
initgraph(&driver, &mode, "c:\\tc\\bgi"); error = graphresult();
if (error) /*co loi*/
{ printf("ma loi = %d",error);
puts(grapherrormsg(error));/*dua ra thong bao loi tuong ung*/ }
else
{ maxx = getmaxx(); maxy= getmaxy(); rectangle (0,0,maxx, maxy);
getche(); closegraph(); }
}
PHẦN II. NGÔN NGỮ LẬP TRÌNH C++
CHƯƠNG 1. LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
1.1. Phương pháp lập trình:
- Phương pháp lập trình theo cấu trúc (LTCT): đây là phương pháp lập trình theo hướng thủ tục (Procudure – Oriented Programming). Với phương pháp này người lập trình phân tích một nhiệm vụ lớn thành nhiều công việc nhỏ hơn, sau đó dần dần chi tiết, cụ thể hoá được các vấn đề đơn giản, để tìm ra cách giải quyết vấn đề dưới dạng những thuật giải. Cách thức phân tích như thế gọi là nguyên lý lập trình từ trên xuống (up – down), để thể hiện quá trình suy diễn từ cái chung nhất đến cái cụ thể.
- Phương pháp lập trình hướng đối tượng (LTHĐT): Khi phân tích để thiết kế một hệ thống, không nhất thiết phải luôn suy nghĩ theo hướng “làm thế nào để giải quyết công việc”, chúng ta có thể định hướng tư duy theo phong cách “với một số đối tượng đã có, làm thế nào để giải quyết công việc đặt ra” hoặc “làm cái gì với một đối tượng đã có”, từ đó cũng có thể giải quyết được những công việc cụ thể. Với phương pháp phân tích trong đó đối tượng đóng vai trò trung tâm của
việc lập trình như vậy, người ta gọi là nguyên lý lập trình từ dưới lên (bottom – up).
1.2. Lập trình hướng đối tượng
Lập trình hướng đối tượng đặt trọng tâm vào đối tượng. Dữ liệu được gắn chặt với các hàm thành các vùng riêng mà chỉ có các hàm đó tác động lên và cấm các hàm bên ngoài truy nhập tới một cách tuỳ tiện. LTHĐT cho phép chúng ta phân tích bài toán thành các thực thể được gọi là các đối tượng và sau đó xây dựng các dữ liệu cùng các hàm xung quanh các đối tượng đó. Các đối tượng có thể tác động, trao đổi thông tin với nhau thông qua cơ chế thông báo (message). Tổ chức một chương trình hướng đối tượng có thể mô tả như sau:
message
LTHĐT có các đặc tính chủ yếu sau:
1. Tập trung vào dữ liệu thay cho các hàm 2. Chương trình được chia thành các đối tượng
3. Các cấu trúc dữ liệu được thiết kế sao cho đặc tả được đối tượng
4. Các hàm thao tác trên các vùng dữ liệu của các đối tượng được gắn chặt với cấu trúc dữ liệu đó.
5. Dữ liệu được đóng gói lại, được che dấu và không cho phép các hàm ngoại lai truy nhập tự do.
6. Các đối tượng tác động và trao đổi thông tin với nhau qua các hàm
7. Có thể dễ dàng bổ sung dữ liệu và các hàm mới vào đối tượng nào đó khi cần thiết
8. Chương trình được thiết kế theo cách tiếp cận từ dưới lên (bottom – up)
1.3. Một số khái niệm trong lập trình hướng đối tượng
- Đối tượng (object):
Đối tượng A Dữ liệu Đối tượng B Dữ liệu Đối tượng C Dữ liệu
Đối tượng là sự kết hợp giữa dữ liệu và thủ tục (hay còn gọi là các phương thức – method) thao tác trên dữ liệu đó.
Đối tượng = Dữ liệu + Phương thức
- Lớp (class):
Lớp là một tập hợp các đối tượng có cấu trúc dữ liệu và các phương thức giống nhau (hay là một tập hợp các đối tượng cùng loại). Như vậy khi có một lớp thì chúng ta sẽ biết được một mô tả cấu trúc dữ liệu và phương thức của các đối tượng thuộc lớp đó. Mỗi đối tượng sẽ là một thể hiện cụ thể (instance) của lớp đó. Trong lập trình, chúng ta có thể coi một lớp như là một kiểu, còn các đối tượng sẽ là các biến có kiểu của lớp đó.
Sự khác biệt giữa lớp và đối tượng cũng giống như sự khác biệt giữa twpj hợp các phần tử và một phần tử trong tập hợp
Ví dụ:
Chúng ta tạo một lớp DIEM có hai thành phần là toạ độ của một điểm trong mặt phẳng và các thao tác gán giá trị cho toạ độ, hiện thị toạ độ của điểm. trong C++, lớp này được định nghĩa như sau:
class DIEM
{ int x; // Toa do cua diem int y;
void KhoitaoXY(int a, int b) // Thủ tục gán giá trị cho toạ độ { x = a;
y = b; }
void Hienthi(void) // Xuất hoành và tung độ ra màn hình { printf(“Hoanh do: %d\x”,x);
printf(“Tung do: %d \n”,y); }
}
- Thực thể (instance) là một vật thể có thực bên trong bộ nhớ, thực chất đó là một đối tượng, nói cách khác thực thể là một biến được khai báo thuộc kiểu lớp. Một thực thể là một đối tượng được tạo ra từ một lớp. Lớp mô tả cấu trúc (hành vi và thông tin) của thực thể được xác định bởi những thao tác động lên thực thể.
Ví dụ: Với lớp DIEM đã được định nghĩa trong ví dụ trên, chúng ta có thể gán giá trị cho thực thể D bằng cách viết như sau
#include<stdio.h> #include<conio.h> class DIEM { int x; int y;
void KhoitaoXY(int a, int b) { x=a;
y=b; }
void Hienthi(void)
{ printf("Hoanh do: %d\n",x); printf("Tung do: %d\n",y); }
};
void main(void)
{ printf("Gan cho D hai toa do (0,1) vaf (4,5)\n"); DIEM D; D.KhoitaoXY(0,1); D.Hienthi(); D. KhoitaoXY(4,5); D.Hienthi(); getch(); }
- Nguyên tắc đóng gói dữ liệu:
Trong LTCT các hàm hay thủ tục được sử dụng mà không cần biết đến nội dung cụ thể của nó. Người sử dụng chỉ cần biết đến chức năng của hàm cũng như các tham số cần truyền vaò để gọi hàm chạy mà không cần quan tâm đến những lệnh cụ thể bên trong nó. Đó là sự đóng gói về chức năng.
Trong LTHĐT, không những các chức năng được đóng gói mà cả dữ liệu cũng như vậy. Với mỗi đối tượng, người ta không thể truy nhập trực tiếp vào các thành phần dữ liệu của nó mà phải thông qua các thành phần chức năng (các phương thức) để làm việc đó.
Tất cả các thông tin của một hệ thống định hướng đối tượng được lưu trữ bên trong các đối tượng cuả nó và chỉ có thể hành động khi các đối tượng đó được ra lệnh thực hiện các thao tác (All information in an object – oriented
system is stored within its objects and can only be manipulated when the objects are ordered to perform operations)
Sự đóng gói thực sự về dữ liệu chỉ có trong ngôn ngữ LTHĐT “thuần khiết” (pure). Còn đối với các ngôn ngữ “lai” (hybrid) (ban đầu chưa phải hướng đối tượng) như ngôn ngữ C++ vẫn có những vi phạm nguyên tắc đóng gói dữ liệu.
- Tính kế thừa (inheritance):
Sự thừa kế cho phép định nghĩa một lớp mới trên cơ sở các lớp đã tồn tại, có bổ sung những phương thức hay những thành phần dữ liệu mới. Khả năng thừa kế cho phép chúng ta sử dụng lại một cách dễ dàng các module chương trình mà không cần thay đổi các module đó.
- Tính đa hình (polymorphime)
Tính đa hình xuất hiện khi có khái niệm kế thừa. Giả sử chúng ta có một kế thừa lớp hình tứ giác và lớp hình tam giác từ lớp hình đa giác (hình tam giác và tứ giác sẽ có đầy đủ các thuộc tính và tính chất của lớp hình đa giác).
Đa hình là khả năng cho phép gửi cùng một thông điệp đến những đối tượng khác nhau cùng có một đặc điểm. Chẳng hạn, thông điệp “vẽ hình” sẽ được gởi đến đối tượng hình hộp và hình tròn, tuỳ theo thời điểm hình tương ứng sẽ được vẽ lên.
- Phương thức ảo (virtual method): Việc có thể gửi cùng một thông điệp đến những đối tượng có kiểu khác nhau mà không cần những cấu trúc điều khiển rườm rà, đói tượng sẽ nhận được chỉ thị cần thiết ngay khi “chạy” chương trình. Kỹ thuật này gọi là sự nối kết động. Đây là phương thức sẽ mang nội dung cụ thể vào lúc thực hiện chương trình. Khi chương trình dịch biên dịch chương trình nguồn ra mã máy, các đoạn chương trình của các phương thức ảo sẽ được đưa vào bảng các phương thức ảo (virtual method table – VMT). Vào thời điểm chương trình thực hiện, các phương thức ảo sẽ được gọi từ bảng phương thức ảo này. Chính vì vậy, kỹ thuật kết nối động còn được gọi là kỹ thuật kết nối trễ (late binding) hay kết nói vào lúc chạy (run-time binding)
Ví dụ: thao tác của người thợ sơn để sơn các loại nhà khác nhau, vì vậy trong lớp nhà (House) có một hành động chung phải làm là sơn nhà (Paint). Tuy nhiên, mỗi nhà đòi hỏi một kỹ thuật sơn riêng biệt, sơn nhà gỗ (WoodFrame) khác với kỹ thuật sơn nhà có trát vữa bên ngoài (Stucco) hoặc nhà đất (Land). Lớp House có lớp Paint là phương thức ảo
CHƯƠNG 2. CÁC MỞ RỘNG CỦA C++
2.1. Sự khác biệt giữa C++ và C
Tên gọi ngôn ngữ lập trình C++, có thể phân tích ý nghĩa rằng nó là ngôn ngữ C có thêm 2 đặc điểm mới tướng ứng với hai đấu cộng. Đặc điểm thứ nhất là một số khả năng mở rộng so với C như tham chiếu, chồng hàm, tham số mặc định... Đặc điểm thứ hai là khả năng lập trình hướng đối tượng.
- Các đặc điểm mở rộng trong C++: + Khả năng viết các dòng chú thích mới + Khả năng khai báo linh hoạt
+ Khả năng định nghĩa lại các hàm: các hàm cùng tên có thể thực hiện theo những thao tác khác nhau. Các lời gọi hàm sẽ dùng kiểu và số tham số để xác định hàm nào cần thực hiện.
+ Có thêm các toán tử định nghĩa bộ nhớ động mới: new và delete
+ Khả năng định nghĩa các hàm inline để tăng tốc độ thực hiện chương trình
+ Tạo các biến tham chiếu đến các biến khác - Lập trình hướng đối tượng trong C++:
+ C++ chứa đựng khái niệm lớp. Một lớp bao gồm các thành phần dữ liệu hay là thuộc tính và các phương thức hay các hàm thành phần. Từ một lớp ta có thể tạo ra các đối tượng hoặc bằng cách khai báo thông thường một biến có kiểu lớp đó hoặc bằng cách cấp phát bộ nhớ động nhờ sử dụng toán tử new.
+ C++ cho phép ta định nghĩa các hàm thiết lập (constructor) cho một lớp. Hàm thiết lập là một phương thức đặc biệt được gọi đến tại thời điểm một đối tượng của lớp được tạo ra, hàm thiết lập có nhiệm vụ khởi tạo đối tượng.
2.2. Những mở rộng của C++
2.2.1. Các điểm không tương thích giữa C++ và ANSI C
2..2.1.1. Định nghĩa hàm
- Trong định nghĩa hàm, ANSI C cho phép hai kiểu khai báo dòng tiêu đề của hàm, trong khi đó C++ chỉ chấp nhận một cách.
Ví dụ:
2.1.1.2. Khai báo hàm nguyên mẫu
Trong ANSI C, khi sử dụng một hàm chưa được định nghĩa trước đó trong cùng một tệp, các cách sau đều cho phép:
+ Không cần khai báo (khi đó ngầm định giá trị trả về của hàm là int)
+ Chỉ cần khai báo tên hàm và giá trị trả về, không cần danh sách kiểu của các tham số.
+ khai báo hàm nguyên mẫu
Với C++, chỉ chấp nhận cách thứ 3. Nói cách khác, một lời gọi hàm chỉ được chấp nhận khi trình biên dịch biết được kiểu của tham số và kiểu của giá trị trả về. Mỗi khi gặp một lời gọi hàm, nó sẽ so sánh các kiểu của tham số thực sự (đối số) được truyền với các tham số hình thức tương ứng. Nếu có sự khác nhau, sẽ thực hiện một số chuyển đổi kiểu tự động theo nguyên tắc:
char int longint float double
Đối với trường hợp, hàm không có giá trị trả về, trong khai báo bắt buộc phải có từ khóa void trước tên hàm. Trong trường hợp không có, trình biên dịch sẽ ngầm hiểu kiểu của giá trị trả về là int và như thế trong thân hàm bắt buộc phải có câu lệnh return. Đối với C, điều này hoàn toàn không cần thiết.
//C++ không có khai báo kiểu n y:à
float max3s(a,b,c) float a,b,c;
//C v C++ à đều phù hợp:
2.1.1.3. Sự tương thích giữa con trỏ void và các con trỏ khác
Trong ANSI C, kiểu *void tương thích với các con trỏ khác cả hai chiều. Ví dụ, với các khai báo sau:
void *p0; int *pn;
Các phép gán sau đây đều hợp lệ: p0 = pn; /* int* void* */ pn = p0; /* void* int* */
Trong C++, chỉ có sự chuyển đổi một chiều, từ một kiểu con trỏ tuỳ ý thành void* là hợp lệ, nghĩa là các phép gán trên được viết thành:
p0 = pn; pn = (int*)p0;
2.2. Các khả năng vào/ra mới của C++
Các tiện ích vào/ra của thư viện C chuẩn đều có thể sử dụng trong C++. Bên cạnh đó, C++ còn cài đặt thêm các khả năng vào/ra mới dựa trên hai toán tử “<<” (xuất) và “>>” (nhập) đơn giản hơn và có khả năng mở rộng đối với các kiểu mới.
Trong tệp tiêu đề iostream.h, định nghĩa hai đối tượng cout và cin tương ứng với hai thiết bị chuẩn vào/ra, được sử dụng cùng với hai toán tử “<<” và “>>”.
2.2.1. Ghi dữ liệu lên thiết bị ra chuẩn (màn hình) cout
+ Cú pháp: cout << biểu thức;
Ví dụ 1: In ra màn hình xâu ký tự “Trường CĐSP Kỹ thuật I Khoa Tin học” trên hai dòng
#include <iostream.h> void main()
{
cout << ”Trường CĐSP Kỹ thuật I\n”; cout <<”Khoa Tin học”;
}
Ví dụ 2: Đưa ra màn hình giá trị của biến
Trang 57 //Cách 1: #include <iostream.h> void main() { int n = 25; cout <<” giá trị của n l :”à //Cách 2: #include <iostream.h> void main() { int n = 25; cout <<” giá trị của n l :”<<n;à }
3.2.2. 2. Các khả năng viết ra trên out
Giá trị của biểu thức trong cú pháp của cout có các kiểu sau: + Kiểu dữ liệu cơ sở ( char, int, float, double)
+ xâu ký tự (char *)
+ con trỏ (trừ con trỏ char*)
( trong trường hợp muốn đưa địa chỉ biến xâu ký tự, phải thông qua con trỏ void: (char*) (void*))
2.2.3. Đọc dữ liệu từ thiết bị vào chuẩn (bàn phím) cin
+ Cú pháp: cin >> ds các biến;
+ Ví dụ1: nhập vào một giá trị số nguyên từ bàn phím và gán cho biến int n;
cin >> n;
Ví dụ 2: nhập nhiều giá trị cùng kiểu hoặc khác kiểu cho nhiều biến int n;
float a; char c;
cin >> n >>c >>a;
+ Có thể sử dụng toán tử “>>” để nhập dữ liệu cho các biến kiểu char, int, float,