Tải bản đầy đủ (.ppt) (27 trang)

Tài liệu Tin học đại cương - bài 11: đệ quy tập tin docx

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 (307.07 KB, 27 trang )


1
TIN HỌC ĐẠI CƯƠNG
www.uit.edu.vn
BÀI 11
BÀI 11
ĐỆ QUY
ĐỆ QUY
TẬP TIN
TẬP TIN
Tin học đại cương
2
ĐỆ QUY
11
NỘI DUNG
NỘI DUNG
Tin học đại cương
3

Khái niệm

Phân loại các hàm đệ qui:

Đệ qui tuyến tính

Đệ qui nhị phân

Đệ qui hỗ tương

Đệ qui phi tuyến
NỘI DUNG BÀI ĐỆ QUY


NỘI DUNG BÀI ĐỆ QUY
Tin học đại cương
4

Trong bất cứ hàm đệ qui nào cũng phải có điều
kiện dừng, điều kiện này sẽ kết thúc quá trình
đệ qui bằng một đoạn mã chương trình được
viết theo lối thông thường.
Ví dụ:
if (N==1)
return 1;
ĐIỀU KIỆN DỪNG
ĐIỀU KIỆN DỪNG
Tin học đại cương
5
Đệ qui Lặp
Sử dụng cấu trúc lựa chọn Sử dụng cấu trúc lặp
Sử dụng liên tục các lời gọi hàm Sử dụng vòng lặp tường minh
Kết thúc khi đến trường hợp cơ sở Kết thúc khi điều kiện để tiếp
tục vòng lặp sai
Làm cho các lời gọi hàm đơn giản dần cho
đến khi tới trường hợp cơ sở
Thay đổi biến đếm trong vòng
lặp cho đến khi nó làm cho
điều kiện lặp sai
Không thoát ra được khi các bước đệ qui
không làm cho bài toán đơn giản hơn và
cuối cùng hội tụ về trường hợp cơ sở
Lặp sẽ không thoát ra được
khi điều kiện lặp không bao

giờ sai
Đệ qui tồi hơn, nó liên tục đưa ra các lời gọi
hàm làm tốn thời gian xử lý và không gian
nhớ. Mỗi lần gọi hàm, lại cần thêm một bản
sao của hàm, tốn thêm bộ nhớ (lưu các biến
của hàm, địa chỉ trở về của hàm ).
Phương pháp lặp được
chuộng hơn
Tuy nhiên, có nhiều bài toán có thể giải bằng
đệ qui lại tốt hơn (các bài toán cổ điển: tháp
Hà Nội, mã đi tuần, 8 hậu, sắp xếp
QuickSort…)
SO SÁNH ĐỆ QUY VÀ LẶP
SO SÁNH ĐỆ QUY VÀ LẶP
Tin học đại cương
6

Đệ qui tuyến tính

Đệ qui nhị phân

Đệ qui hỗ tương

Đệ qui phi tuyến
PHÂN LOẠI CÁC DẠNG ĐỆ QUY
PHÂN LOẠI CÁC DẠNG ĐỆ QUY
Tin học đại cương
7

Một hàm được gọi là đệ qui tuyến tính khi nó có

dạng:
<KDL> < tên hàm>
{
if < điều kiện dừng >
{
/*Trả về giá trị
hay kết thúc công việc */
}
else
{
/*Làm một số công việc */
/*Gọi đệ qui đến hàm <tên hàm> */
}
}
ĐỆ QUY TUYẾN TÍNH
ĐỆ QUY TUYẾN TÍNH
Tin học đại cương
8

Viết hàm đệ qui tính x
n
, n nguyên dương.

Điều kiện dừng: nếu n=0 thì x
0
=1.

Tổng quát: x
n
=x

n-1
*x.
float xn(float x, int n)
{
if (n==0)
return 1;
else
return xn(x,n-1)*x;
}
VÍ DỤ VỀ ĐỆ QUY TUYẾN TÍNH
VÍ DỤ VỀ ĐỆ QUY TUYẾN TÍNH
Tin học đại cương
9

Một hàm được gọi là đệ qui nhị phân khi nó có dạng:
<KDL> < tênhàm>
{
if < điều kiện dừng >
/*Trả về gtrị hay kthúc công việc */
else
{
/*Làm một số công việc */
/*Gọi đqui đến <tên> để
giải quyết vấn đề nhỏ hơn */
/*Gọi đqui đến <tên> để
giải quyết vấn đề còn lại */
}
}
ĐỆ QUY NHỊ PHÂN
ĐỆ QUY NHỊ PHÂN

Tin học đại cương
10

Viết hàm đệ qui tính số hạng thứ n của dãy fibo.
F0=F1=1
Fn=Fn-1+Fn-2

Điều kiện dừng: nếu n=0 hay n=1 thì Fn=1.
long fibo(int n)
{
if ((n==0)||(n==1))
return 1;
else
return (fibo(n-1)+fibo(n-2));
}
VÍ DỤ VỀ ĐỆ QUY NHỊ PHÂN
VÍ DỤ VỀ ĐỆ QUY NHỊ PHÂN
Tin học đại cương
11

Một hàm được gọi là đệ qui phi tuyến khi nó có
dạng:
<KiểuDL> <tênhàm>
{
if (điềukiệndừngđúng)
return <giátrị>;
else
{
for…
<gọi đệ qui>;

return <giátrị>;
}
}
ĐỆ QUY PHI TUYẾN
ĐỆ QUY PHI TUYẾN
Tin học đại cương
12

Tính: x(0)=1 với n=0;
x(n)=n
2
x(0)+(n-1)
2
x(1)+…+1
2
x(n-1) với n>0;

Xây dựng:
int x(int n)
{
if (n==0) return 1;
else
{ int t=0;
for (int i=0; i<n;i++)
t=t+(n-i)*(n-i)*x(i);
return t;
}
}
VÍ DỤ VỀ ĐỆ QUY PHI TUYẾN
VÍ DỤ VỀ ĐỆ QUY PHI TUYẾN

Tin học đại cương
13

Hai hàm được gọi là đệ qui hỗ tương khi chúng
có dạng:
<KDL> <Tênhàm1>(<tham so>)
{

Gọi hàm <Tênhàm2>

}
<KDL> <Tênhàm2>(<tham so>)
{

Gọi hàm <Tênhàm1>

}
ĐỆ QUY HỖ TƯƠNG
ĐỆ QUY HỖ TƯƠNG
Tin học đại cương
14

Xét hai dãy {Xn}, {Yn} được định nghĩa như sau:

X
o
=Y
o
=1


X
n
= X
n-1
+ Y
n-1

Y
n
= n
2
X
n-1
+ Y
n-1

Viết hai hàm đệ qui tính số hạng thứ N của hai
dãy trên
VÍ DỤ VỀ ĐỆ QUY HỖ TƯƠNG
VÍ DỤ VỀ ĐỆ QUY HỖ TƯƠNG
Tin học đại cương
15
/* Prototype */
unsigned long TinhY(int n);
unsigned long TinhX(int n);
/* Implementation */
unsigned long TinhY(int n)
{
if (n==0) return 1;
return TinhX(n-1) + TinhY(n-1);

}
unsigned long TinhY(int n)
{
if (n==0) return 1;
return n*n*TinhX(n-1) + TinhY(n-1);
}
VÍ DỤ VỀ ĐỆ QUY HỖ TƯƠNG
VÍ DỤ VỀ ĐỆ QUY HỖ TƯƠNG
Tin học đại cương
16
TẬP TIN
12
NỘI DUNG
NỘI DUNG
Tin học đại cương
17

Khái niệm

Các thao tác trên Tập Tin

Các hàm Nhập Xuất

Các hàm di chuyển Con Trỏ tập tin

Các hàm quản lý Thư Mục
NỘI DUNG BÀI TẬP TIN
NỘI DUNG BÀI TẬP TIN
Tin học đại cương
18


Tập tin là một loại dữ liệu có thể ghi lên đĩa để
dùng nhiều lần.

Có 2 loại tập tin:

Tập tin văn bản (text file, ASCII file): *.PAS, *.C,
… (các tập tin mã nguồn chương trình). Mỗi tập
tin văn bản gồm nhiều dòng. Mã ngăn cách
dòng (chuyển dòng khác) là mã 10 ($OA), được
tách ra thành mã 13 ($OD) và mã 10 ($OA). Mã
kết thúc tập tin là mã 26 ($O1A). Các ký tự trên
mỗi dòng đều phải có mã ASCII từ khoảng trắng
(#32 hay $O20) trở lên, nếu nhỏ hơn $O20 thì
phải là các ký tự điều khiển hợp lệ.

Tập tin nhị phân (binary file): *.COM, *.EXE,
*.DOC, *.XLS, *BMP, *PCX, *.GIF,…

Dữ liệu ghi lên tập tin không bị thay đổi và khi ta
đóng tập tin thì mã kết thúc tập tin sẽ được ghi
lên đĩa là -1.
KHÁI NIỆM TẬP TIN
KHÁI NIỆM TẬP TIN
Tin học đại cương
19

Việc sử dụng file được thực hiện qua 3 bước cơ bản:

Mở file (fopen)


Đọc hay ghi thông tin lên file (fread, fscanf, fwrite,
fprintf)

Đóng file (fclose)

Có các hàm làm việc với tập tin thông qua con trỏ tập
tin FILE *pf; Con trỏ này được xác định khi ta mở tập
tin.

Mỗi biến file đại diện trong RAM luôn có một con trỏ
file. Lúc đầu, con trỏ file trỏ vào phần tử đầu tiên, sau
mỗi lần đọc hay ghi dữ liệu vào biến file con trỏ tự
động trỏ tới mẫu tin kế tiếp.

Chỉ thao tác được trên file khi file đang được mở.

Sau khi thao tác xong, phải đóng file.
CÁC THAO TÁC TRÊN FILE
CÁC THAO TÁC TRÊN FILE
Tin học đại cương
20
r Mở tập tin để đọc
w Mở tập tin để ghi
a Mở để ghi thêm thông tin vào đó. Vị trí đầu tiên để
truy xuất tập tin là cuối tập tin vừa mở.
r+ Mở một tập tin ở cả hai chế độ ghi đọc. Vị trí đầu
tiên để truy xuất tập tin là đầu tập tin vừa mở.
w+ Mở một tập tin ở cả hai chế độ ghi đọc.
a+ Tập tin được mở để ghi và đọc. Vị trí đầu tiên để

truy xuất tập tin là cuối tập tin vừa mở.
t Mở tập tập tin kiểu văn bản.
b Mở tập tập tin kiểu nhị phân (binary data)
CÁC CHẾ ĐỘ LÀM VIỆC TRÊN FILE
CÁC CHẾ ĐỘ LÀM VIỆC TRÊN FILE
Tin học đại cương
21

int putc (int ch, FILE *f);
int fputc(int ch, FILE *f);
int getc (FILE *f);
int fgetc(FILE *f);

int fputs (const char *s, FILE *f);
char *fgets(const char *s, int n, FILE
*f);

int fprintf(FILE *f, const char
*dac_ta, );
fscanf (FILE *f, const char
*dac_ta, );

int putw(int n, FILE *f);
int getw(FILE *f);

int fwrite(void *ptr, int size, int n,
FILE *f);
int fread (void *ptr, int size, int n,
FILE *f);
CÁC HÀM NHẬP XUẤT

CÁC HÀM NHẬP XUẤT
Tin học đại cương
22

void rewind(FILE *f);

int fseek(FILE *f, long so_byte,
int vi_tri_bat_dau);

long ftell(FILE *f);
CÁC HÀM THAO TÁC CON TRỎ FILE
CÁC HÀM THAO TÁC CON TRỎ FILE
Tin học đại cương
23

int chdir(char *s);

char *getcwd(char *s, int n);

int mkdir(char *s);

int rmdir(char *s);

int findfirst(char *path, struct
ffblk *fd, int attrib);

int findnext(struct ffblk *fd);
CÁC HÀM THAO TÁC THƯ MỤC
CÁC HÀM THAO TÁC THƯ MỤC
Tin học đại cương

24
#include <stdio.h>
void main() /* FCOPY.C */
{
char in_name[25], out_name[25];
FILE *in_file, *out_file;
int c;
printf("File to be copied:\n");
gets("%s", in_name);
printf("Output filename:\n");
gets("%s", out_name);
VÍ DỤ MINH HỌA
VÍ DỤ MINH HỌA
Tin học đại cương
25
in_file = fopen ( in_name, "r");
if( in_file == NULL )
printf(“Cannot open”);
else
{
out_file = fopen (out_name, "w");
if( out_file == NULL )
printf(“Can't open”);
else
{
VÍ DỤ MINH HỌA
VÍ DỤ MINH HỌA

×