1. Trang chủ
  2. » Công Nghệ Thông Tin

Giáo trình thực hàn Lập trình nâng cao pdf

72 339 0

Đ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

Định dạng
Số trang 72
Dung lượng 13,48 MB

Nội dung

Nội dung của giáo trình gồm 4 chương thể hiện cơ bản các kỹ thuật lập trình thường gặp đối với sinh viên.. Chương 1 thể hiện một số kỹ thuật lập trình làm nền tảng cho các chương sau.. K

Trang 1

LỜI MỞ ĐẦU

Giáo trình thực hành này được viết theo giáo trình Lập trình nâng cao nhằm mục đích làm tài liệu cho sinh viên năm thứ 2 thực hành môn học này Nội dung của giáo trình gồm 4 chương thể hiện cơ bản các kỹ thuật lập trình thường gặp đối với sinh viên

 Chương 1 Kỹ thuật lập trình đệ quy

 Chương 2 Sắp xếp

 Chương 3 Đại số ma trận

 Chương 4 Một số thuật giải trên đồ thị

Chương 1 thể hiện một số kỹ thuật lập trình làm nền tảng cho các chương sau Đối với

đệ quy phi tuyến chủ yếu ta sử dụng kỹ thuật tìm kiếm theo chiều sâu Kỹ thuật này được áp dụng trong chương 4 để tìm đường đi trên đồ thị Tuy nhiên, ở đây ta chưa trình bài kỹ thuật duyệt theo chiều sâu bằng cách khử đệ quy Kỹ thuật này sẽ được trình bài trong giáo trình Lý thuyết đồ thị và thuật giải

Chương 2 thể hiện một số thuật toán sắp xếp nhằm giúp sinh viên so sánh và đánh giá thuật toán sắp xếp nào sẽ tốt hơn

Chương 3 thể hiện phương pháp giải hệ phương trình tuyến tính bằng phương pháp phân rã ma trận bằng thuật toán Crout

Chương 4 thể hiện một số thuật giải tìm đường đi cơ bản trên đồ thị áp dụng kỹ thuật đánh dấu đỉnh, đánh dấu cạnh và kỹ thuật tham ăn

Vì thời gian phân bố giảng dạy theo chương trình khung và nội dung của môn học này nên giáo trình không tránh khỏi những khiếm khuyết Rất mong nhận được sự góp ý của tất cả các bạn quan tâm đến giáo trình này

Ngày 24 tháng 04 năm 2010

Tác giả

Trang 2

MỤC LỤC

Bài tập 1 Tìm phần tử Fibonacci thứ n 1

Bài tập 3 Thuật toán Euclide tìm ước chung lớn nhất 2 Bài tập 4 Tìm ước chung lớn nhất của n số nguyên 3

Bài tập 6 Tổ hợp chập k của n phần tử 4 Bài tập 7 Tính tổng n phần tử trong danh sách 5

Bài tập 9 Tích n phần tử trong danh sách 7 Bài tập 10 Đếm số lần xuất hiện của phần tử x trong danh sách 8

Bài tập 12 Liệt kê tất cả dãy nhị phân độ dài k 10 Bài tập 13 Chỉnh hợp không lặp chập k của n phần tử 12 Bài tập 14 Hoán vị mảng số nguyên có n phần tử 14 Bài tập 15 Đặt n quân hậu trên bàn cờ vua 16

Bài tập 2 Một số phép toán trên ma trận 37 Bài tập 3 Hệ phương trình tuyến tính dạng tam giác trên 39 Bài tập 4 Hệ phương trình tuyến tính dạng tam giác dưới 41 Bài tập 5 Thuật toán phân rã ma trận A = LU 44 Bài tập 6 Giải hệ phương trình tuyến tính dựa vào phân rã LU 46

Bài tập 1 Xét tính liên thông của đồ thị 51 Bài tập 2 Đếm số thành phần liên thông 53 Bài tập 3 Tìm mọi đường đi từ giữa hai đỉnh 56

Bài tập 6 Thuật toán Dijkstra tìm đường đi ngắn nhất 63 Bài tập 7 Thuật toán Prim tìm cây bao trùm tối tiểu 65 Bài tập 8 Thuật toán Kruskal tìm cây bao trùm tối tiểu 67

Trang 3

CHƯƠNG 1 KỸ THUẬT LẬP TRÌNH ĐỆ QUY

10,1

)(

n n

F n

F

n n

n F

*

0,1

1

n X

/*Ham tra ve so thuc tinh gia tri X^n*/

float Power(float X, int n) {

if(n==0)

return 1;

else

Trang 4

Bài tập 3 Thuật toán Euclide tìm ước chung lớn nhất

Viết chương trình tìm ước chung lớn nhất của 2 số nguyên dương a, b bằng thuật toán Euclide được định nghĩa đệ quy như sau:

a b a b a UCLN

b a a

b a UCLN

),,(

,),(

,)

,(

Trang 5

Bài tập 4 Tìm ước chung lớn nhất của n số nguyên

Viết chương trình tìm ước chung lớn nhất của n số nguyên dương a0, ,a 1 được định nghĩa đệ quy như sau:

1,,

, ,

2 0 1

0 1

0

n n

a a UC a UCLN

n a

n a a UC

n n

n

Cài đặt:

#include <conio.h>

#include <iostream.h>

/*Ham tra ve uoc chung lon nhat cua a va b*/

int UCLN(int a, int b) {

/*Ham tra ve uoc chung lon nhat cua n phan tu duoc luu tru trong mang 1 chieu a*/

int UC(int a[], int n) {

cout<<"Nhap vao "<<n<<" phan tu\n";

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

Trang 6

Bài tập 5 Tính n giai thừa

Viết chương trình tính n! được định nghĩa đệ quy như sau:

!1

*

0,1

!

n n

n

n n

Cài đặt:

#include <conio.h>

#include <iostream.h>

/*Ham tra ve so nguyen tinh n! (Factorial)*/

long int Fac(int n) {

k n

C C

k n k

C

1 1 1

0,1

Trang 7

Bài tập 7 Tính tổng n phần tử trong danh sách

Viết chương trình tính tổng n phần tử a0, ,a 1 được định nghĩa đệ quy như sau:

1,,

, ,

2 0

1

0 1

0

n n a a S a

n a

n a a S

n n

n

Cài đặt:

#include <conio.h>

#include <iostream.h>

/*Ham tra ve so nguyen tinh tong n phan tu trong mang a*/

long int S(int a[], int n) {

cout<<"Nhap vao "<<n<<" phan tu\n";

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

Trang 8

Bài tập 8 Đệ quy hỗ tương

Viết chương trình tính X nY n được xác định như sau:

1 1 0

0

2

11

n n n

n n n

Y X Y

Y X X Y X

Cài đặt:

#include <conio.h>

#include <iostream.h>

long int Y(int n);

long int X(int n) {

Trang 9

Bài tập 9 Tích n phần tử trong danh sách

Viết chương trình tính tích n phần tử a0, ,a 1 được định nghĩa đệ quy như sau:

1,,

, ,

2 0

1

0 1

0

n n a a S a

n a

n a a S

n n

n

Cài đặt:

#include <conio.h>

#include <iostream.h>

/*Ham tra ve so nguyen tinh tich n phan tu trong mang a*/

long int S(int a[], int n) {

cout<<"Nhap vao "<<n<<" phan tu\n";

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

Trang 10

Bài tập 10 Đếm số lần xuất hiện của phần tử x trong danh sách

Viết chương trình đếm số lần xuất hiện của số nguyên x trong danh sách

x n A Find

x a n

x n A Find

n x

n A Find

n

n

0,,1,

0,,1,1

0,0

,,

Cài đặt:

#include <conio.h>

#include <iostream.h>

/*Ham tra ve so lan xuat hien cua x trong danh sach A*/

int Find(int a[], int n, int x) {

cout<<"Nhap vao danh sach "<<n<<" phan tu\n";

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

Trang 11

Bài tập 11 Tháp Hà Nội

Mô tả bài toán: chuyển n đĩa từ cột 1 sang cột 2 lấy cột 3 làm trung gian Thứ tự các

đĩa được sắp xếp từ nhỏ đến lớn (đĩa lớn nắm phía dưới)

Trang 12

Bài tập 12 Liệt kê tất cả dãy nhị phân độ dài k

Chỉnh hợp lặp chập k của n phần tử là một nhóm có thứ tự gồm k phần tử lấy từ n phần tử đã cho, trong đó mỗi phần tử có thể có mặt 1, 2, …, k lần trong nhóm tạo thành

Phương pháp: ta liệt kê tất cả chỉnh hợp có lặp chập k của hai phần tử 0 và 1 Khi đó

ta sẽ có tất cả dãy nhị phân có độ dài k

Ví dụ: minh họa dạng cây với k = 3

Trang 14

Bài tập 13 Chỉnh hợp không lặp chập k của n phần tử

Chỉnh hợp chập k của n phần tử (k  n) là một nhóm có thứ tự gồm k phần tử khác nhau được chọn từ n phần tử đã cho

Phương pháp: liệt kê dãy có độ dài k và các phần tử trong dãy được lấy từ tập hợp {0,

1, … , n-1} các phần tử được đưa vào dãy không được phép trùng nhau

//khoi tao tat ca cac dinh chua duoc chon

for(int i = 0; i<k; i++)

DanhDau[j] = 1; //chon dinh j Luu[i] = j; //luu lai gia tri j

DanhDau[j] = 0; //phuc hoi dinh j

Trang 15

} }

}

Trang 16

Bài tập 14 Hoán vị mảng số nguyên có n phần tử

Phương pháp: tương tự phương pháp làm bài tập 13 nhưng ở đây ta thay tập hợp {0, 1,

… , n-1} là tập hợp giá trị n phần tử của mảng và độ dài của dãy là n

Ví dụ: n = 3 và A = {-1,0,1} ta sẽ có các dãy con tương ứng là {-1,0}, {-1,1}, {0,-1},

char DanhDau[max]; //mang danh dau dinh duoc chon

int Luu[max], A[max], n;

/*Khoi tao cac bien*/

void Init() {

cout<<"Nhap n = ";

cin>>n;

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

/*Danh dau vi tri i chua chon*/

if(DanhDau[j] == 0) { //neu dinh j chua duoc chon

DanhDau[j] = 1; //chon dinh j

Luu[i] = A[j]; //luu lai gia tri dinh duoc chon

DanhDau[j] = 0; //phuc hoi dinh j

} }

Trang 17

}

Trang 18

Bài tập 15 Đặt n quân hậu trên bàn cờ vua

Mô tả bài toán: liệt kê tất cả phương án đặt n quân hậu trên bàn cờ vua cấp n  n sao cho n quân hậu không được phép ăn nhau

Ví dụ: cho bàn cờ vua cấp 88 Dưới đây là 1 phương án đặt quân hậu:

Cài đặt:

#include "conio.h"

#include "iostream.h"

#define max 20

char a[max]; //danh dau cot

char b[2*max-1]; //danh dau huong Dong-Bac

char c[2*max-1]; //danh dau huong Tay-Bac

int Luu[max]; //luu ket qua tim duoc

//tat ca cac cot chua duoc chon

for(int i = 0; i<n; i++)

a[i] = 0;

//tat ca cac huong chua duoc chon

for( i = 0; i<2*n-1; i++) {

Trang 19

c[i-j+n] = 1; //danh dau huong tay-Bac thu j-i+n

Luu[i] = j; //luu vi tri dat hau (i,j)

Try(i+1); //tim vi tri dat hau tiep theo

c[i-j+n] = 0; //phuc hoi huong tay-Bac thu j-i+n

} }

Trang 20

Bài tập 16 Mã đi tuần

Mô tả bài toán: đặt quân mã tại ô có vị trí (x,y) trên bàn cờ vua cấp n  n Hãy liệt kê tất cả các phương án quân mã xuất phát tại vị trí (x,y) có thể nhảy đến tất cả các ô khác trên bàn cờ với điều kiện mỗi ô quân mã chỉ được phép đi qua đúng 1 lần

Ví dụ: cho bàn cờ vua cấp 88 Ta có 2 phương án đặt quân mã như sau:

Cài đặt:

#include "iostream.h"

#include "conio.h"

#define max 10

int A[max][max]; //Mang danh dau

int B[max][max]; //Mang luu duong di

A[i][j] = 0; //tat ca cac o chua duoc danh dau

B[x][y] = 1; //duong di dau tien

A[x][y] = 1; //danh dau o duoc chon

}

//Xuat ket qua ra man hinh

Trang 21

if(x1>=0 && x1<n && y1>=0 && y1<n && A[x1][y1]==0){

A[x1][y1] = 1; //danh dau o (i,j)

B[x1][y1] = i; //luu lai duong di

A[x1][y1] = 0; //phuc hoi o (i,j)

B[x1][y1] = 0; //xem nhu o chua di qua

x = x1 - X[j]; //phuc hoi dinh x

y = y1 - Y[j]; //phuc hoi dinh y

} }

Trang 22

CHƯƠNG 2 SẮP XẾP Bài tập 1 Thuật toán Bubble Sort

Ý tưởng thuật toán: xuất phát từ phần tử cuối danh sách ta tiến hành so sánh với phần

tử bên trái của nó Nếu phần tử đang xét có khóa nhỏ hơn phần tử bên trái của nó ta tiến đưa nó về bên trái của dãy bằng cách hoán vị với phần tử bên trái của nó Tiếp tục thực hiện như thế đối với bài toán có n phần tử thì sau n – 1 bước ta thu được danh sách tăng dần

Ví dụ: sử dụng thuật toán Bubble Sort sắp xếp dãy số {3, 10, 4, 6, 2, 6, 15, 3, 9,7} theo

void NhapMang(int A[],int n) {

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

cout<<"nhap Phan tu thu A["<<i<<"] =";

Trang 23

//sap xep cac phan tu

void BubbleSort(int A[],int n) {

void NhapMang(int A[],int n) {

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

cout<<"nhap Phan tu thu A["<<i<<"] =";

Trang 24

void BubbleSort(int A[],int n) {

for(int i=0; i<n-1; i++){

for(int j=n-1; j>i; j ) if(A[j]<A[j-1])

Trang 25

Bài tập 2 Thuật toán Selection Sort

Ý tưởng thuật toán: xét dãy n phần tử a0,a1, ,a1

 Chọn trong dãy a0,a1, ,a 1 ra phần tử có khỏa nhỏ nhất và hoán vị nó với a0

 Chọn trong dãy a1,a2, ,a1 ra phần tử có khỏa nhỏ nhất và hoán vị nó với a1

 Cứ tiếp tục như thế sau n – 1 bước ta thu được danh sách có thứ tự

void NhapMang(int A[],int n) {

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

cout<<"nhap Phan tu thu A["<<i<<"] =";

Trang 26

}

//thuat toan Selection Sort

void SelectionSort(int A[],int n) {

for(int i=0; i<n-1; i++) {

void NhapMang(int A[],int n) {

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

cout<<"nhap Phan tu thu A["<<i<<"] =";

Trang 28

Bài tập 3 Thuật toán Insertion Sort

Ý tưởng thuật toán: xét dãy n phần tử a0,a1, ,a 1

 Xem dãy gồm 1 phần tử a0 là dãy có thứ tự

 Thêm a1 vào dãy có thứ tự a0 sao cho dãy mới a0, a1 là dãy có thứ tự Nếu a1 < a0 ta hoán vị a1 với a0

 Thêm a2 vào dãy có thứ tự a0, a1 sao cho dãy mới a0, a1, a2 là dãy có thứ tự

 Tiếp tục như thế đến n – 1 bước ta sẽ có dãy có thứ tự a0,a1, ,a 1

Ví dụ: sử dụng thuật toán Insertion Sort sắp xếp dãy {3,7,22,3,1,5,8,4,3,9} theo thứ tự

void NhapMang(int A[],int n) {

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

cout<<"nhap Phan tu thu A["<<i<<"] =";

Trang 29

}

//thu tuc Insertion Sort

void InsertionSort(int A[],int n) {

for(int i=1; i<n; i++)

for(int j=i; j>0; j ) if(A[j]<A[j-1])

Chúng ta có thể cài đặt thủ tục Insertion Sort như sau để xem kết quả từng bước chạy:

void InsertionSort(int A[],int n) {

XuatMang(A,1);

for(int i=1; i<n; i++) {

for(int j=i; j>0; j ) if(A[j]<A[j-1])

Swap(A[j],A[j-1]);

XuatMang(A,i+1);

}

}

Trang 30

Bài tập 4 Thuật toán Quick Sort

Ý tưởng thuật toán: xét dãy n phần tử a0,a1, ,a1

Bước 1: chọn khóa pivotaLeftRight/2

Bước 2: Phân vùng Những phần tử nhỏ hơn khóa thì nằm bên trái của khóa, những

phần tử lớn hơn khóa thì nằm bên phải của khóa và những phần tử bằng khóa

có thể nằm bất cứ chỗ nào trên dãy

Bước 3: sắp xếp cho cả hai phân vùng mới bên trái và bên phải

Mô tả hoạt động của thuật toán Quick Sort:

Cài đặt:

#include <iostream.h>

#include <conio.h>

#define max 100

void NhapMang(int A[],int n) {

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

cout<<"nhap Phan tu thu A["<<i<<"] =";

Trang 31

for(int i=0; i<n; i++)

void QuickSort(int A[], int Left, int Right) {

int i = Left, j = Right;

int pivot = A[(Left + Right) / 2];

Trang 32

Bài tập 5 Thuật toán Heap Sort

Ta xem danh sách n phần tử a0,a1, ,a1 là cây nhị phân Cây nhị phân này được xác định như sau: tại nút thứ i tương ứng với chỉ số thứ i của mảng có con trái là nút 2*(i+1)-1 và con phải 2*(i+1) nếu 2*(i+1)-1 và 2*(i+1) nhỏ hơn n Thuật toán được

mô tả như sau:

- Xây dựng Heap sao cho với mọi nút cha đều có giá trị lớn hơn nút con Khi đó nút gốc là nút có giá trị lớn nhất

- Hoán vị nút gốc với nút thứ n – 1 và xây dựng lại Heap mới với n – 2 nút và tiếp tục hoán vị nút gốc với nút lá cuối của cây mới sau n – 2 bước ta sẽ thu được danh sách được sắp xếp theo thứ tự

Ví dụ: xét danh sách trước khi sắp xếp

0 1 2 3 4 5 6 7

11 3 5 4 9 15 19 7 Danh sách trên được thể hiện bằng cây theo thuật toán Heap Sort như sau:

Trang 34

Sau 7 bước ta thu được danh sách đã được sắp xếp

void NhapMang(int A[],int n) {

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

cout<<"nhap Phan tu thu A["<<i<<"] =";

//hoan vi nut cha thu i phai lon hon nut con

void Heapify(int A[],int n, int i) {

int Left = 2*(i+1)-1;

int Right = 2*(i+1);

Trang 35

//xay dung Heap sao cho moi nut cha luon lon hon nut con tren cay

void BuildHeap(int A[], int n) {

for(int i = n/2-1; i>=0; i )

Trang 36

Bài tập 6 Thuật toán Merge Sort

Mô tả bài toán: cho 2 danh sách A và B lần lượt có m và n phần tử đã sắp xếp theo thứ

tự Bài toán đặt ra trộn 2 danh sách A và B với nhau thành danh sách C cũng là một danh sách có thứ tự

Thuật toán:

Bước 1: khởi tạo ba chỉ số chạy trong vòng lặp i = 0, j = 0, k = 0 tương ứng cho ba mảng A, B và C

Bước 2: tại mỗi bước nếu cả hai chỉ số (i<m và j<n) ta chọn min(A[i],B[j]) và lưu nó

vào trong C[k] Chuyển sang Bước 4

Bước 3: tăng giá trị k l ên 1 và quay về Bước 2

Bước 4: sao chép tất cả các giá trị còn lại từ các danh sách mà chỉ số còn vi phạm (tức i<m hoặc j<m) vào trong mảng C

Cài đặt:

#include <iostream.h>

#include <conio.h>

#define max 100

void NhapMang(int A[],int n) {

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

Trang 38

/*Nhap ma tran he so*/

void NhapMaTran(float A[max][max], int m, int n) {

for(int i = 0; i<m; i++)

void XuatMaTran(float A[max][max], int m, int n) {

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

Trang 39

Bài tập 2 Một số phép toán trên ma trận

ik a b c

/*Nhap ma tran he so*/

void NhapMaTran(float A[max][max], int m, int n, char ch) {

for(int i = 0; i<m; i++)

void XuatMaTran(float A[max][max], int m, int n) {

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

void CongMaTran(float A[max][max], float B[max][max], float C[max][max], int m, int n) {

for(int i = 0; i<m; i++)

for(int j = 0; j<n; j++)

C[i][j] = A[i][j]+B[i][j];

}

/*A cap mxn * B cap nxp = C cap mxp*/

void NhanMaTran(float A[max][max],float B[max][max] float C[max][max],int m,int n,int p) {

Ngày đăng: 10/03/2014, 02:20

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
[1] Chu Đức Khánh, Nguyễn Cam, Lý thuyết đồ thị, NXB Đại học Quốc gia TPHCM Sách, tạp chí
Tiêu đề: Lý thuyết đồ thị
Nhà XB: NXB Đại học Quốc gia TPHCM
[2] Dương Thủy Vỹ, Giáo trình Phương pháp tính, NXB KHKT Sách, tạp chí
Tiêu đề: Giáo trình Phương pháp tính
Nhà XB: NXB KHKT
[3] Ngọc Anh Thư, Giáo trình thuật toán, NXB Thống kê Sách, tạp chí
Tiêu đề: Giáo trình thuật toán
Nhà XB: NXB Thống kê
[4] Ngô Đắc Tân, Lý thuyết tổ hợp và đồ thị, NXB ĐH Quốc gia Hà Nội Sách, tạp chí
Tiêu đề: Lý thuyết tổ hợp và đồ thị
Nhà XB: NXB ĐH Quốc gia Hà Nội
[5] Dương Vũ Diệu Trà, Nguyễn Tiến Huy, Trần Đan Thư, Vũ Mạnh Trường, Cẩm nang thuật toán, NXB KHKT Sách, tạp chí
Tiêu đề: Cẩm nang thuật toán
Nhà XB: NXB KHKT
[6] Đỗ Xuân Lôi, Cấu trúc dữ liệu &amp; Giải thuật, 1995 Sách, tạp chí
Tiêu đề: Cấu trúc dữ liệu & Giải thuật
[7] Nguy ễn Đức Nghĩa, Tô Văn Thành, Toán rời rạc, 1997 Sách, tạp chí
Tiêu đề: Toán rời rạc
[8] A.V. Aho, J.E. Hopcroft, J.D. Ullman, Data Structures and Algorithms, Addison – Wesley, 1983 Sách, tạp chí
Tiêu đề: Data Structures and Algorithms
[9] Jeffrey H Kingston, Algorithms and Data Structures, Addison-Wesley, 1998 Sách, tạp chí
Tiêu đề: Algorithms and Data Structures

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w