1. Trang chủ
  2. » Luận Văn - Báo Cáo

báo cáo lập trình hướng đối tượng đề tài thuật toán quay lui

27 1 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Thuật toán quay lui
Tác giả Nguyễn Phạm Duy Thái, Bùi Đức Hoàng, Hác Hải Dương, Trần Đức Duy, Nguyễn Phúc An
Người hướng dẫn ThS. Nguyễn Danh Tú
Trường học Trường Đại học Bách Khoa Hà Nội
Chuyên ngành Lập trình hướng đối tượng
Thể loại Báo cáo học phần
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 27
Dung lượng 3,07 MB

Nội dung

Tổng quan về lập trình hướng đối tượngLập trình hướng đối tượng tiếng Anh: Object-oriented programming, viết tắt: OOP là một mẫu hình lập trình dựa trên khái niệm "công nghệ đối tượng",

Trang 1

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘIKHOA TOÁN ỨNG DỤNG VÀ TIN HỌC



BÁO CÁOHỌC PHẦN:LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Đề tài: Thuật toán quay lui

Giảng viên hướng dẫn: ThS Nguyễn Danh TúNhóm: 20

Khóa: 65

Hà Nội, ngày 20 tháng 2 năm 2023

Trang 2

Bảng đánh giá thành viênMôn học: Lập trình hướng đối tượng

Họ tên: Lớp:Nhóm:

ST

phầnviệcđượcgiao

Liên hệđượckhi cần

Khảnăngđónggóp ýkiến,sángkiếnchohoạtđộng

Sẵngsànggiúp đỡ

Đónggópchungvào kếtquả củanhóm

Trang 3

Mục lục

I Tổng quan về lập trình hướng đối tượng 2

II Coding convention 5

Trang 4

I Tổng quan về lập trình hướng đối tượngLập trình hướng đối tượng (tiếng Anh: Object-oriented programming, viết tắt: OOP) là một mẫu hình lập trình dựa trên khái niệm "công nghệ đối tượng", mà trong đó, đối tượng chứa đựng các dữ liệu, trên các trường, thường được gọi là các thuộc tính; và mã nguồn, được

chỉnh các trường dữ liệu của đối tượng khác, mà đối tượng hiện tại có tương tác (đối tượng được hỗ trợ các phương thức "this" hoặc "self") Trong lập trình hướng đối tượng, chương trình máy tính được thiết kế bằng cách tách nó ra khỏi phạm vi các đối tượng tương tác với

theo lớp, nghĩa là các đối tượng trong các ngôn ngữ này được xem như thực thể của một lớp, được dùng để định nghĩa một kiểu dữ liệu

OOP được xem là giúp tăng năng suất, đơn giản hóa độ phức tạp khi bảo trì cũng như mở

bậc cao hơn Ngoài ra, nhiều người còn cho rằng OOP dễ tiếp thu hơn cho những người mới học về lập trình hơn là các phương pháp trước đó Một cách giản lược, đây là khái niệm và là một nỗ lực nhằm giảm nhẹ các thao tác viết mã cho người lập trình, cho phép họ tạo ra các ứng dụng mà các yếu tố bên ngoài có thể tương tác với các chương trình đó giống như là tương tác với các đối tượng vật lý

Những đối tượng trong một ngôn ngữ OOP là các kết hợp giữa mã và dữ liệu mà chúng được nhìn nhận như là một đơn vị duy nhất Mỗi đối tượng có một tên riêng biệt và tất cả các tham chiếu đến đối tượng đó được tiến hành qua tên của nó Như vậy, mỗi đối tượng có khả năng nhận vào các thông báo, xử lý dữ liệu (bên trong của nó), và gửi ra hay trả lời đến các đối tượng khác hay đến môi trường

Đa phần các ngôn ngữ lập trình thông dụng nhất hiện nay (như C++, Delphi, Java, Python etc.) là các ngôn ngữ lập trình đa mẫu hình và đều hỗ trợ lập trình hướng đối tượng ở nhiều mức độ khác nhau, thường được kết hợp với lập trình mệnh lệnh lập trình thủ tục, Các ngôn

+ C# Python PHP Ruby Perl, , , , , , Object Pascal, Objective-C Dart Swift Scala, , , , Common Lisp, và Smalltalk

Hiện nay các ngôn ngữ OOP phổ biến nhất đều tập trung theo phương pháp phân lớp trongđó có C++, Java, C# và Visual Basic.NET Ngôn ngữ OOP hay còn gọi là ngôn ngữ lập trình hướng đối tượng, là một phương pháp thiết kế và phát triển phần mềm dựa trên kiến trúc lớp và đối tượng Sau đây là một số khái niệm mà các ngôn ngữ này thường dùng tới:

 Lớp (class):

Trang 5

Một lớp có thể được hiểu là khuôn mẫu để tạo ra các đối tượng Trong một lớp,

các phương thức của đối tượng Khi đã định nghĩa được lớp, ta có thể tạo ra các đối tượng từ lớp này Để việc sử dụng được dễ dàng, thông qua hệ thống hàm tạo (constructor), người ta dùng lớp như một kiểu dữ liệu để tạo ra các đối tượng

 Lớp con (subclass): Lớp con là một lớp thông thường nhưng có thêm tính chất kế

là lớp cha (parent class/superclass)

 Lớp trừu tượng (abstract class): Lớp trừu tượng là một lớp mà nó không thể thực

thể hóa thành một đối tượng thực dụng được Lớp này được thiết kế nhằm tạo ra mộtlớp có các đặc tính tổng quát nhưng bản thân lớp đó chưa có ý nghĩa (hay không đủ ýnghĩa) để có thể tiến hành viết mã cho việc thực thể hóa (xem Ví dụ)

Ví dụ: Lớp "hình" được định nghĩa không có dữ liệu nội tại và chỉ có các phương thức (hàm nội tại) "tinh_chu_vi", "tinh_dien_tich" Nhưng vì lớp hình này chưa xác định được đầy đủ các đặc tính của nó (cụ thể các biến nội tại là tọa độ các đỉnh nếu là đa giác, là đường bán kính và toạ độ tâm nếu là hình tròn, ) nên nó chỉ có thể được viết thành một lớp trừu tượng Sau đó, người lập trình có thể tạo ra các lớp con chẳng hạn như là lớp "tam_giac", lớp "hinh_tron", lớp "tu_giac", Và trong các lớp con nàyngười viết mã sẽ cung cấp các dữ liệu nội tại (như là biến nội tại r làm bán kính và hằng số nội tại Pi cho lớp "hinh_tron" và sau đó viết mã cụ thể cho các phương thức "tinh_chu_vi" và "tinh_dien_tich")

 Phương thức (method): Phương thức của một lớp thường được dùng để mô tả các hành vi của đối tượng

(hoặc của lớp) Ví dụ như đối tượng thuộc lớp điện thoại có các hành vi sau: Đổ chuông, chuyển tín hiệu từ sóng sang dạng nghe được, chuyển tín hiệu giọng nói sang dạng chuẩn, chuyển tín hiệu lên tổng đài.v.v Khi thiết kế, người ta có thể dùng các phương thức để mô tả và thực hiện các hành vi của đối tượng Mỗi phương thức thường được định nghĩa là một hàm, các thao tác để thực hiện hành vi đó được viết tại nội dung của hàm Khi thực hiện hành vi này, đối tượng có thể phải thực hiện các hànhvi khác Ví dụ như điện thoại phải chuyển tín hiệu giọng nói sang dạng chuẩn trước khi chuyển lên tổng đài Cho nên một phương thức trong một lớp có thể sử dụng phương thức khác trong quá trình thực hiện hành vi của mình

Người ta còn định nghĩa thêm vài loại phương thức đặc biệt:

 Hàm tạo (constructor): là hàm được dùng để tạo ra một đối tượng, cài đặt các giá trị

ban đầu cho các thuộc tính của đối tượng đó

 Hàm hủy (destructor) là hàm dùng vào việc làm sạch bộ nhớ đã dùng để lưu đối

tượng và hủy bỏ tên của một đối tượng sau khi đã dùng xong, trong đó có thể bao gồmcả việc xóa các con trỏ nội tại và trả về các phần bộ nhớ mà đối tượng đã dùng

Trang 6

Nhiều lớp thư viện có sẵn hàm tạo mặc định (thông thường không có tham số) và hàm huỷ.

 Thuộc tính (attribute) : Thuộc tính của một lớp bao gồm các biến, các hằng, hay

tham số nội tại của lớp đó Ở đây, vai trò quan trọng nhất của các thuộc tính là cácbiến vì chúng sẽ có thể bị thay đổi trong suốt quá trình hoạt động của một đối tượng.Các thuộc tính có thể được xác định kiểu và kiểu của chúng có thể là các kiểu dữ liệucổ điển hay đó là một lớp đã định nghĩa từ trước Như đã ghi, khi một lớp đã đượcthực thể hoá thành đối tượng cụ thể thì tập hợp các giá trị của các biến nội tại làmthành trạng thái của đối tượng Giống như trường hợp của phương thức, tùy theongười viết mã, biến nội tại có thể chỉ được dùng bên trong các phương thức của chínhlớp đó, có thể cho phép các câu lệnh bên ngoài lớp, hay chỉ cho phép các lớp có quan

dùng tới nó (hay thay đổi giá trị của nó) Mỗi thuộc tính của một lớp còn được gọilà thành viên dữ liệu của lớp đó

 Quan hệ giữa lớp và đối tượng: Lớp trong quan niệm thông thường là cách phân loại

các thực thể dựa trên những đặc điểm chung của các thực thể đó Do đó lớp là kháiniệm mang tính trừu tượng hóa rất cao Ví dụ như lớp "người" dùng để chỉ những thựcthể sống trên Trái Đất có những thuộc tính: có hai chân, hai bàn tay khéo léo, có tưduy, ngôn ngữ v.v và có phương thức: giao tiếp bằng ngôn ngữ, tư duy, đi, đứng bằnghai chân Khi đó hai người cụ thể ông A, ông B là các đối tượng thuộc lớp người.Trong ngôn ngữ lập trình, ta cũng hiểu khái niệm lớp tương tự, cho nên ta có quá trình"Thực thể hóa" sau, tạo một đối tượng thuộc một lớp đã được ta định nghĩa (phânloại)

 Thực thể (instance): Thực thể hóa (instantiate) là quá trình khai báo để có một tên (có

thể được xem như là một biến) trở thành một đối tượng từ một lớp nào đó.Một lớp sau khi được tiến hành thực thể hóa để có một đối tượng cụ thể gọi là một thực thể Hay nói ngược lại một thực thể là một đối tượng riêng lẻ của một lớp đã định trước Như các biến thông thường, hai thực thể của cùng một lớp có thể có trạng thái nội tại khác nhau (xác định bởi các giá trị hiện có của các biến nội tại) và do đó hoàn toàn độc lập nhau nếu không có yêu cầu gì đặc biệt từ người lập trình " Thực thểhóa: gần giống như cá nhân hóa Một lớp khi được " cá nhân hóa" sẽ thành một đối tượng cụ thể

 Công cộng (public): Công cộng là một tính chất được dùng để gán cho các phương

thức, các biến nội tại, hay các lớp mà khi khai báo thì người lập trình đã cho phép cáccâu lệnh bên ngoài cũng như các đối tượng khác được phép dùng đến nó

Ví dụ: Trong C++ khai báo public: int my_var; thì biến my_var có hai tính chất là tính công cộng và là một integer cả hai tính chất này hợp thành đặc tính của biến my_var khiến nó có thể được sử dụng hay thay đổi giá trị của nó (bởi các câu lệnh) ở mọi nơi bên ngoài lẫn bên trong của lớp

Trang 7

 Riêng tư (private): Riêng tư là sự thể hiện tính chất đóng mạnh nhất (của một đặc

tính hay một lớp) Khi dùng tính chất này gán cho một biến, một phương thức thì biếnhay phương thức đó chỉ có thể được sử dụng bên trong của lớp mà chúng được địnhnghĩa Mọi nỗ lực dùng trực tiếp đến chúng từ bên ngoài qua các câu lệnh hay từ cáclớp con sẽ bị phủ nhận hay bị lỗi

 Bảo tồn (protected): Tùy theo ngôn ngữ, sẽ có vài điểm nhỏ khác nhau về cách hiểu

tính chất này Nhìn chung đây là tính chất mà khi dùng để áp dụng cho các phươngthức, các biến nội tại, hay các lớp thì chỉ có trong nội bộ của lớp đó hay các lớp concủa nó (hay trong nội bộ một gói như trong Java) được phép gọi đến hay dùng đến cácphương pháp, biến hay lớp đó

So với tính chất riêng tư thì tính bảo tồn rộng rãi hơn về nghĩa chia sẻ dữ liệu hay chức năng Nó cho phép một số trường hợp được dùng tới các đặc tính của một lớp (từ một lớp con chẳnghạn)

II Coding convention

Commenting convention

Trang 8

- Viết hoa chữ cái đầu của câu, kết câu bằng dấu chấm.

III Chương trình1 Bài toán quân hậu

a) Nội dung chương trình- Thuật giải

Trang 9

- Mã nguồnnamespace WinFormsApp1{

public abstract classChessProblem

{ public int [,] board = {{ 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0 }}; n;int

public abstract int N { get set; ; } public int count_save = 0; public int Size = 8; public void printSolution( [,] board)int {

for int ( i = 0; i < Size; i++) {

for int ( j = 0; j < Size; j++) Console.Write( + board[i, j]" "

+ );" "

Console.WriteLine(); }

}

Trang 10

public abstract bool isSafe( [,] board, row, int int intcol);

public bool solveUtil( [,] board, row, col)int int int {

(count_save == N)if return true; (isSafe(board, row, col))if {

//Console.WriteLine($"Tinh {row} {col}");

board[row, col] = 1; //this.printSolution(board);

count_save++; for int ( j = col; j < Size; j++) {

for int ( i = 0; i < Size; i++) {

(solveUtil(board, i, j) == if true) return true;

} } // BACKTRACK

board[row, col] = 0; count_save ; }

return false; }

public bool solve() {

for int ( j = 0; j < Size; j++) {

for int ( i = 0; i < Size; i++) {

(solveUtil(board, i, j) == if true) {

printSolution(board); return true; }

} } Console.Write("Solution does not exist"); return false;

} } public classQueenProblem : ChessProblem {

n;int public override int N { get return { 8; } set { n = value; } }

public override bool isSafe( [,] board, row, int int intcol)

Trang 11

{ i, j;int for (i = 0; i < Size; i++) {

(board[row, i] == 1) if return false; }

for (i = 0; i < Size; i++) {

(board[i, col] == 1) if return false; }

for (i = row, j = col; i >= 0 && j >= 0; i , j ) {

(board[i, j] == 1)if return false; }

for (i = row, j = col; i < Size && j < N; i++, j++)

{ (board[i, j] == 1)if return false; }

for (i = row, j = col; j >= 0 && i < Size; i++, j )

{ (board[i, j] == 1)if return false; }

for (i = row, j = col; j < Size && i >= 0; i , j++)

{ (board[i, j] == 1)if return false; }

return true; }

} public classBishopProlem : ChessProblem {

n;int public override int N { get return { 14; } set { n = value; } }

public override bool isSafe( [,] board, row, int int intcol)

{ i, j;int for (i = row, j = col; i >= 0 && j >= 0; i , j ) {

Trang 12

(board[i, j] == 1)if return false; }

for (i = row, j = col; i < Size && j < Size; i++, j++)

{ (board[i, j] == 1)if return false; }

for (i = row, j = col; j >= 0 && i < Size; i++, j ) {

(board[i, j] == 1)if return false; }

for (i = row, j = col; j < Size && i >= 0; i , j++) {

(board[i, j] == 1)if return false; }

return true; }

} internal static classProgram

{ ///<summary> /// The main entry point for the application

///</summary> [STAThread] static void Main() {

// To customize application configuration such as set high DPI settings or default font,

// see https://aka.ms/applicationconfiguration

ApplicationConfiguration.Initialize(); Application.Run(new Form1()); }

}}b) Đánh giá coding convention cho chương trình

2 Rat in a maze

a) Nội dung chương trình- Chức năng/Thuật giải

1 Tạo ra 1 hàm đề quy Input: Ma trận, vị trí ô (i, j)

Trang 13

 Output: true hoặc false2 Nếu vị trí (i, j) không hợp lệ thì return false3 Nếu (i, j) là đích đến return true

Nếu (i, j) là ô đã duyệt return false.4 Đánh dấu (i, j) là đã duyệt5 Gọi hàm đệ quy cho các vị trí (i+1, j); (i-1, j); (i, j+1); (i, j-1)6 Đánh dấu (i, j) thành chưa duyệt

- Thiết kế lớp

- Giao diện chương trình

Maze 1

Trang 14

- Mã nguồnusing System.Diagnostics;

{ enumMazeThings

{ space = 0, brick = 1, start = 2, goal = 3, step = 4 } enumArrow

{ step = 0, left = 2, right = 3, up = 5, down = 7, } enumTypeMaze

{ normalMaze = 1, arrowMaze = 2, exit = 3 } enumUserChoice

{ mazePic1 = 1,

Trang 15

mazePic2 = 2, }

public abstract classMaze

{ public int [,] Walls; public int Height; public int Width; public int [] Start = new int [2]; public int [] Goal = new int [2]; // In mê cung ra dưới dạng số

public void PrintMaze() {

for int ( i = 0; i < Height; i++) {

for int ( j = 0; j < Width; j++) {

Console.Write($"{this.Walls[i, j]} ); "

} Console.WriteLine(); }

} public void Solve() {

(if this.SolveUntil(Start[0], Start[1]) == false) {

Console.WriteLine("Solution do not exist"); }

} public abstract bool SolveUntil( aRow, aCol);int int }

public classNormalMaze : Maze {

publicNormalMaze(string aFilePath) {

string[] contents; contents = File.ReadAllLines(aFilePath); height = contents.Length;int

width = contents[0].Length;int this.Walls = new int [height, width]; for int ( i = 0; i < height; i++) {

for int ( j = 0; j < width; j++) {

(contents[i][j] == )if 'A'

{ this.Walls[i, j] = ( )MazeThings.start;int this.Start[0] = i; this.Start[1] = j; }

else if (contents[i][j] == )'B'

Ngày đăng: 29/08/2024, 16:09

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w