Học tập‎ > ‎C++‎ > ‎

Lập trình cấu trúc và lập trình hướng đối tượng

1. Phương pháp lập trình cấu trúc (Lập trình hướng thủ tục):

- Tư tưởng chính là tổ chức chương trình thành các chương trình con.Trong pascal có 2 kiểu chương trình con đó là thủ tục và hàm.Trong C chi có 1 loại chương trình con đó là hàm.
Hàm là một chương trình độc lập dung để thực hiện một phần việc nào đó như: nhập số liệu,in kết quả hay thực hiện một số tính toán. Hàm cần có đối và các biến,mảng cục bộ dung riêng cho hàm.
Việc trao đổi dữ liệu giữa các hàm được thực hiện thông qua các đối và các biến toàn cục.
Các ngôn ngữ như C,PASCAL,FOXPRO là các ngôn ngữ cho phép khai triển phương pháp lập trình cấu trúc.
Một chương trình cấu trúc gồm cấu trúc dữ liệu( biến,mảng,bản ghi) và các hàm ,thủ tục.
Nhiệm vụ chính của việc tổ chức,thiết kế chương trình cấu trúc là tổ chức chương trình thành các hàm, thủ tục. Chương trình sẽ bao gồm các hàm, thủ tục nào.

Ví dụ: Viết chương trình nhập toạ độ (x,y) của một dãy các điểm,sau đó tìm một cặp điểm cách xa nhau nhất.
Theo tư tưởng của lập trình cấu trúc có thể tổ chức chương trình như sau:

-Sử dụng
2 mảng số thực toàn bộ x và y để chứa tọa bộ dãy điểm
-Xây dựng
2 hàm:
+) Hàm nhapsl để nhập toạ đô n điểm, hàm này có 1 đối là biến nguyên n điểm và được khai báo như sau:
void nhapsl(int n);
+) Hàm do_dai dung để tính độ dài đoạn thẳng đi qua 2 điểm có toạ độ là i và j và đươc khai báo như sau:
void do_dai(int i,int j);


Tư tưởng thuật toán:
- Gán giá trị của dmax cho do_dai(điểm thứ nhất, điểm thứ 2)
- Tính độ dài từng cặp điểm
- Nếu độ dài nào lớn hơn thì gán giá trị đó cho dmax đồng thời đọc vị trí của cặp điểm đó.

Chương trình thực hiện bài toán trên được viết như sau:

Hướng cấu trúc

#include<stdio.h>
#include<conio.h>
#include<math.h>
float x[100],y[100];
float do_dai(int i,int j);
{
      return 
sqrt(pow(x-x[j],2)+pow(y-y[j],2));
}
void nhapsl(int n)
{
      
int i;
      for(
i=1;i<=n;i++)
      {
            
printf(n Nhap toa do cua diem thu %d”,i);
            
scanf(%%f”,&x&y);
      }
}
void main()
{
      
int n,i,j,imax,jmax;
      
float d,dmax;
      
printf(“n So diem); scanf(%d”,&n);
      
nhapsl(n);
      
dmax=do_dai(1,2); imax=1;jmax=2;
      for(
i=1;i<=n;i++)
              for(
j=i+1;j<=n;j++)
              {
                      
d=do_dai(i,j);
                      if(
d>dmax)
                      {
                                
dmax=d;
                                
imax=i;
                                
jmax=j;
                      }
              }
      
printf(“nn doan thang lon nhat co do dai bang:%0.2f”,dmax);
      
printf(“nn di qua 2 diem co chi so la %d va %d “,imax,jmax);
      
getch();

}  


2. Phương pháp lập trình hướng đối tượng:

- Khái niệm trung tâm của lập trình hướng đối tượng là lớp(class). Có thể xem lớp là sự kết hợp giữa các thành phần dữ liệu và các hàm. Cũng có thể xem lớp là sự mở rộng cấu trúc trong C (struct) bằng cách đưa thêm vào các phương thức (method) hay còn gọi là các hàm thành viên (member function). Một lớp được định nghĩa như sau:

Định nghĩa 1 lớp

Class Ten_lop
{
      
//khai báo các thành phần dữ liệu
      //khai báo các phương thức
};  


- Các phương thức có thể được viết (xây dựng) bên trong hoặc bên ngoài (phía dưới) phần định nghĩa lớp. Cấu trúc (cách viết) phương thức tương tự như hàm ngoại trừ quy tắc sau: Khi xây dựng một phương thúc bên ngoài định nghĩa lớp thì trong dòng đầu tiên cần dung tên lớp và 2 dấu : đặt trước tên phương thức để chỉ rõ phương thức thuộc lớp nào (xem ví dụ bên dưới).
- Sử dụng các thành phần dữ liệu trong phương thức: Vì phương thức và các thành phần dữ liệu thuộc cùng 1 lớp và vì phương thức được lập lên cốt đẻ xử lí các thành phần dữ liệu,nên trong than của phương thức có quyền truy cập đến các thành phần dữ liệu thuộc cùng 1 lớp.
- Biến lớp: Sauk hi định nghĩa 1 lớp,có thể dung tên lớp đẻ khai báo các biến kiểu lớp hay còn gọi là các đối tượng. Mỗi đối tượng sẽ có các thành phần dữ liệu và các phương thức. Lời gọi phương thức cần chứa tên đối tượng để xác định phương thức thực hiện đối tượng nào.
- Một chương trình hướng đối tượng sẽ bao gồm các lớp quan hệ với nhau.
- Việc phân tích,thiết kế chương trình theo phương pháp hướng đối tượng nhằm thiết kế, xây dựng các lớp.
- Từ khái niệm lớp đã nảy sinh hang loạt các khái niệm khác như: Thành phần dữ liệu,phương thức,phạm vi,sự đóng gói,hàm tạo,hàm huỷ,sự thừa kế,lớp cơ sở,lớp dẫn xuất, tương ứng bội,phương thức ảo…
- Ưu điểm của việc thiết kế hướng đối tượng là tập trung xác định các lớp để mô tả các thực thể của bài toán. Mỗi lớp đưa vào các thành phần của thực thểvà xây dựng luôn các phương thức để xử lí dữ liệu. Như vậy việc thiết kế chương trnhf xuất phát từ các nội dung, các vấn đề của bài toán.
- Các ngôn ngữ thuần tuý hướng đối tượng (Smalltalk) chỉ hỗ trợ thuần tuý các khái niệm về lớp, không hỗ trợ các khái niệm về hàm.
- C++ là ngôn ngữ lai, nó cho phép sử dụng các khái niệm về lớp cũng như về hàm.

- Vẫn ví dụ về bài toán tìm độ dài lớn nhất đi qua 2 điểm
Trong bài toán này ta gặp 1 thực thể là dãy điểm. Các thành phần của lớp dãy điểm bao gồm:
+) Biến nguyên n là số điểm của dãy
+) Con trỏ x kiểu thực trỏ đến vùng nhớ chứa dãy hoành độ
+) Con trỏ y kiểu thực trỏ đến vùng nhứ chứa dãy tung độ

Các phương thức cần đưa vào theo yêu cầu bài toán bao gồm
- Nhập toạ độ một điểm
- Tính độ dài đoạn thẳng đi qua 2 điểm.

Dưới đây là chương trình viết theo thiết kế hướng đối tượng. Để thưc hiện chương trình này nhớ đặt tên tệp là CPP, khi viết trong Turbo C++ 3.0 thì đuôi của tệp được ghi mặc định là CPP. Trong chương trình ta thấy thêm một điều mới là: Các khai báo biến,mảng có thể viét bất kì chỗ nào trong chương trình miễn là khai báo trước khi sử dụng.
Làm lại bài toán ở trên:

hướng đối tượng

#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<alloc.h>
class daydiem
{
      public:
      
int n;
      
float *x,*y;
      
float do_dai(int iint j);
      {
            return 
sqrt(pow(x-x[j],2)+pow(y-y[j],2));
      }
      
void nhapsl(void);
};
void daydiem::nhapsl(void)
{
      
int i;
      
printf(“n So diem N);scanf(%d”,&n);
      
x=(float*)malloc((n+1)*sizeof(float));
      
y=(float*)malloc((n+1)*sixeof(float));
      for(
i=1;i<=n;i++)
      {
            
printf(“nn nhap toa do x,y cua diem thu %d,i);
            
scanf(%%f”,&x,&y);
      }
}
void main()
{
      
daydiem p;
      
p.nhapsl();
      
int n,i,j,imax,jmax;
      
float d,dmax;
      
n=p.n;
      
dmax=p.do_dai(1,2);imax=1;jmax=2;
      for(
i=i;i<=n-1;i++)
      for(
j=i+1;j<=n;j++)
      {
            
d=p.do_dai(i,j);
            if(
d>dmax)
            {
            
dmax=d;
            
imax=i;
            
jmax=j;
      }
      
printf(“n Doan thang lon nhat co do dai bang: %0.2f”,dmax);
      
printf(“n di qua 2 diem co chi so la %d va %d”,imax,jmax);
      
getch();
}

Comments