Kĩ thuật lập trình - Các cấu trúc dữ liệu khác
Có hai loại tập tin
• Tập tin nhị phân
• Tập tin văn bản
• Namespace System.IO cung cấp hai lớp StreamWriter và
StreamReader để ghi và đọc các tập tin văn bản
• Cả hai lớp này đều làm việc với ký tự Unicode
• Các bước cần thiết để làm việc với tập tin nhị phân :
• Mở tập tin
• Đọc/ghi tập tin
• Đóng tập tin
23 trang |
Chia sẻ: huyhoang44 | Lượt xem: 724 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Kĩ thuật lập trình - Các cấu trúc dữ liệu khác, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Lê Viết Mẫn - lvman@hce.edu.vn CTDL khác
v 1.0 - 11/2012
Các cấu trúc dữ liệu khác
1
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn CTDL khác
chúng ta đã học...
2
Programs = Data Structure + Algorithms
Tuần tự Rẽ nhánh Lặp Hàm
Cấu trúc chương trình
Tổ chức dữ liệu
bool char short int long float double string
Kiểu dữ liệu
array
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn CTDL khác
và giờ chúng ta học...
3
Programs = Data Structure + Algorithms
Tuần tự Rẽ nhánh Lặp Hàm
Cấu trúc chương trình
Tổ chức dữ liệu
bool char short int long float double string
Kiểu dữ liệu
array struct file
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn CTDL khác
Nội dung
1. Cấu trúc
2. Tập tin
4
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn CTDL khác
Cấu trúc
struct
5
Đây là lý thuyết cấu trúc theo Lập trình Cấu trúc (sử dụng ngôn ngữ C#),
nên sẽ có nhiều khác biệt so với cấu trúc theo Lập trình Hướng đối tượng của C#
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn CTDL khác
Cấu trúc
6
• Tập hợp các biến được tham chiếu bởi cùng một tên
• Khai báo một cấu trúc chỉ như một cái “khuôn” (không được cấp phát bộ
nhớ)
• Các cấu trúc được khai báo trong class Program và ngoài các hàm
• Các khai báo biến (variable declarations) có thể có bất kỳ kiểu gì ngoại
trừ kiểu struct đang được khai báo
• Mỗi biến được gọi là một thành viên hay trường
• Trong C#, khai báo một struct nghĩa là định nghĩa ra một kiểu
trị mới
struct Name
{
! variable declarations;
...
}
struct Point
{
! public int X;
public int Y;
}
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn CTDL khác
Cấu trúc vs bảng dữ liệu
7
modelnumber partnumber cost
1234 687 10.57
9673 108 57.03
4957 892 3.99
re
co
rd
s
(b
ản
g
hi
)
fields (trường)
struct Part
{
! public int modelnumber;
! public int partnumber;
! public float cost;
};
Part p1, p2, p3;
• Trường ⟺ biến/thành phần trong cấu trúc
• Bản ghi ⟺ biến kiểu cấu trúc
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn CTDL khác
Sử dụng
• Bộ nhớ không được cấp phát cho khai báo struct, mà chỉ cấp phát cho các
khai báo biến
• Một biến kiểu struct được cấp phát trên stack
• Khi khai báo biến, các thành phần không được khởi gán giá trị
• Các thành phần chỉ có thể được truy xuất một khi đã được gán dữ liệu
• Toán tử dấu chấm được dùng để truy xuất thành phần của struct
8
static void Main()
{
! Point point;
// khởi gán struct
point.X = 10;
point.Y = 12;
...
}
th
ời
g
ia
n
point un
un
X
Y
point 10
12
X
Y
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn CTDL khác
Một số thao tác
• Khai báo biến, khởi gán
• Gán
• Gán từng thành phần (chỉ sao chép một số thành phần)
• Chỉ có thể so sánh trên từng thành phần
9
struct Date
{
! public int year;
public int month;
public int day;
}
Date today;
today.day = 19;
today.month = 11;
today.year = 2012;
Date when = today;
when.year = today.year;
when.day = today.day;
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn CTDL khác
Một số thao tác
• Mảng kiểu struct
• Danh sách kiểu struct
10
Date[] dates = new Date[10];
dates[0].day = 1;
dates[0].month = 1;
dates[0].year = 2012;
dates[1].day = 2;
...
List dateList = new List();
Date now;
now.year = 2012;
now.month = 11;
now.day = 19;
dateList.Add(now);
...
foreach (Date date in dateList)
...
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn CTDL khác
Truyền struct cho hàm
11
static void PrintDate(Date d)
{
! Console.WriteLine(d.year);
! Console.WriteLine(d.month);
! Console.WriteLine(d.day);
}
static void SetDate(ref Date d,
int year,
int month,
int day)
{
! d.year = year;
d.month = month;
d.day = day;
}
Date newYears;
newYears.day = 1;
newYears.month = 1;
newYears.year = 2012;
PrintDate(newYears);
Date newYears;
SetDate(newYears, 2012, 1, 1);
PrintDate(newYears);M
ai
n(
)
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn CTDL khác
Trả về struct
12
static Date GetDate()
{
! Date d;
!
! Console.Write("Enter a year : ");
! d.year = int.Parse(Console.ReadLine());
! Console.Write("Enter a month : ");
! d.month = int.Parse(Console.ReadLine());
! Console.Write("Enter a day : ");
! d.day = int.Parse(Console.ReadLine());
!
! return d;
}
Date now;
now = GetDate();M
ai
n(
)
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn CTDL khác
Cấu trúc lồng nhau
13
• Cấu trúc có thể chứa cấu trúc
• Cấu trúc không thể chứa chính
nó
struct Range
{
! public Date start;
! public Date end;
};
struct Date
{
! public int year;
public int month;
public int day;
! Date end;! ! // error
};
Range r;
r.start.year = 1776;
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn CTDL khác
Tập tin
File
14
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn CTDL khác
Tập tin văn bản
15
• Có hai loại tập tin
• Tập tin nhị phân
• Tập tin văn bản
• Namespace System.IO cung cấp hai lớp StreamWriter và
StreamReader để ghi và đọc các tập tin văn bản
• Cả hai lớp này đều làm việc với ký tự Unicode
• Các bước cần thiết để làm việc với tập tin nhị phân :
• Mở tập tin
• Đọc/ghi tập tin
• Đóng tập tin
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn CTDL khác
StreamWriter
16
Close() Hàm này đóng tập tin và giải phóng các tài nguyên
Flush() Hàm này thực hiện ghi dữ liệu trong bộ đệm vào tập tin và
xoá sạch bộ đệm ghi
NewLine Thuộc tính chỉ ký tự xuống dòng và về đầu dòng
Write() Hàm này ghi dữ liệu ra tập tin và không xuống dòng
WriteLine() Hàm này ghi dữ liệu ra tâp tin có xuống dòng
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn CTDL khác
Ví dụ
17
static void Main(string[] args)
{
// Mở tập tin
StreamWriter writer = new StreamWriter("reminders.txt");
if (writer == null) return; // error
// Ghi dữ liệu vào tập tin
writer.WriteLine("Don’t forget Mother’s Day this year...");
writer.WriteLine("Don’t forget these numbers:");
for (int i = 0; i < 10; i++)
writer.Write(i + " ");
// Chèn ký tự xuống dòng
writer.Write(writer.NewLine);
// Đóng tập tin
writer.Close();
}
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn CTDL khác
StreamReader
18
Peek() Hàm này trả ra ký tự tiếp theo mà không thay đổi vị trí đầu
đọc. Trả ra giá trị -1 để báo kết thúc tập tin.
Read() Hàm đọc dữ liệu từ tập tin
ReadBlock() Hàm đọc một số lượng ký tự xác định từ tập tin và ghi vào
bộ đệm
ReadLine() Hàm đọc một dòng ký tự và trả ra một chuỗi ký tự string
ReadToEnd() Hàm đọc tất cả ký tự từ vị trí hiện tại đến cuối tập tin và trả
về một chuỗi ký tự duy nhất
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn CTDL khác
Ví dụ
19
static void Main(string[] args)
{
// Mở tập tin
StreamReader reader = new StreamReader("reminders.txt");
if (reader == null) return;
// Đọc từng dòng văn bản trong tập tin
string input = null;
while ((input = reader.ReadLine()) != null)
{
Console.WriteLine(input);
}
// Đóng tập tin
reader.Close();
}
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn CTDL khác
Tổng kết
20
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn CTDL khác
Cơ sở lập trình
21
• Cái cốt lõi là tư duy lập trình chứ không phải là ngôn ngữ
• Cái khác biệt giữa các ngôn ngữ
• Cấu trúc điều khiển
• Từ khoá
• Kiểu dữ liệu
• Thư viện lập trình
• Cái chung mà một tư duy lập trình phải có
• Lập trình tuần tự, rẽ nhánh, lặp
• Biểu thức điều kiện
• Biến, hằng, kiểu dữ liệu
• Hàm (chia nhỏ chương trình lớn)
• Cấu trúc dữ liệu cơ bản
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn CTDL khác
Tư duy lập trình là
tư duy của máy tính
Cách máy tính thực hiện chương trình
22
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn
Cảm ơn sự chú ý
Câu hỏi ?
CTDL khác23
Monday, September 9, 13
Các file đính kèm theo tài liệu này:
- 08_cac_cau_truc_du_lieu_khac_7768.pdf