Các cấu trúc dữ liệu khác - Cấu trúc struct

pdf 23 trang vanle 2660
Bạn đang xem 20 trang mẫu của tài liệu "Các cấu trúc dữ liệu khác - Cấu trúc struct", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfcac_cau_truc_du_lieu_khac_cau_truc_struct.pdf

Nội dung text: Các cấu trúc dữ liệu khác - Cấu trúc struct

  1. Các cấu trúc dữ liệu khác v 1.0 - 11/2012 Lê Viết Mẫn - lvman@hce.edu.vn 1 CTDL khác Monday, September 9, 13
  2. chúng ta đã học Programs = Data Structure + Algorithms Cấu trúc chương trình Tuần tự Rẽ nhánh Lặp Hàm Tổ chức dữ liệu Kiểu dữ liệu bool char short int long float double string array Lê Viết Mẫn - lvman@hce.edu.vn 2 CTDL khác Monday, September 9, 13
  3. và giờ chúng ta học Programs = Data Structure + Algorithms Cấu trúc chương trình Tuần tự Rẽ nhánh Lặp Hàm Tổ chức dữ liệu Kiểu dữ liệu bool char short int long float double string array struct file Lê Viết Mẫn - lvman@hce.edu.vn 3 CTDL khác Monday, September 9, 13
  4. Nội dung 1. Cấu trúc 2. Tập tin Lê Viết Mẫn - lvman@hce.edu.vn 4 CTDL khác Monday, September 9, 13
  5. Cấu trúc struct Đâ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# Lê Viết Mẫn - lvman@hce.edu.vn 5 CTDL khác Monday, September 9, 13
  6. Cấu trúc • 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 struct Name struct Point { { variable declarations; public int X; public int Y; } } • 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 Lê Viết Mẫn - lvman@hce.edu.vn 6 CTDL khác Monday, September 9, 13
  7. Cấu trúc vs bảng dữ liệu fields (trường) struct Part { modelnumber partnumber cost public int modelnumber; 1234 687 10.57 public int partnumber; public float cost; 9673 108 57.03 }; 4957 892 3.99 Part p1, p2, p3; records(bản ghi) • Trường ⟺ biến/thành phần trong cấu trúc • Bản ghi ⟺ biến kiểu cấu trúc Lê Viết Mẫn - lvman@hce.edu.vn 7 CTDL khác Monday, September 9, 13
  8. 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 point static void Main() X un { Point point; Y un // khởi gán struct point.X = 10; thời gian point point.Y = 12; X 10 } Y 12 Lê Viết Mẫn - lvman@hce.edu.vn 8 CTDL khác Monday, September 9, 13
  9. Một số thao tác struct Date { public int year; public int month; public int day; } • Khai báo biến, khởi gán Date today; today.day = 19; today.month = 11; today.year = 2012; • Gán Date when = today; • Gán từng thành phần (chỉ sao chép một số thành phần) when.year = today.year; when.day = today.day; • Chỉ có thể so sánh trên từng thành phần Lê Viết Mẫn - lvman@hce.edu.vn 9 CTDL khác Monday, September 9, 13
  10. Một số thao tác • Mảng kiểu struct Date[] dates = new Date[10]; dates[0].day = 1; dates[0].month = 1; dates[0].year = 2012; dates[1].day = 2; • Danh sách kiểu struct List dateList = new List (); Date now; now.year = 2012; now.month = 11; now.day = 19; dateList.Add(now); foreach (Date date in dateList) Lê Viết Mẫn - lvman@hce.edu.vn 10 CTDL khác Monday, September 9, 13
  11. Truyền struct cho hàm static void SetDate(ref Date d, int year, static void PrintDate(Date d) int month, { int day) Console.WriteLine(d.year); { Console.WriteLine(d.month); d.year = year; Console.WriteLine(d.day); d.month = month; } d.day = day; } Date newYears; newYears.day = 1; Date newYears; newYears.month = 1; SetDate(newYears, 2012, 1, 1); newYears.year = 2012; Main() PrintDate(newYears); PrintDate(newYears); Lê Viết Mẫn - lvman@hce.edu.vn 11 CTDL khác Monday, September 9, 13
  12. Trả về struct 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; Main() now = GetDate(); Lê Viết Mẫn - lvman@hce.edu.vn 12 CTDL khác Monday, September 9, 13
  13. Cấu trúc lồng nhau • Cấu trúc có thể chứa cấu trúc struct Range { Range r; public Date start; r.start.year = 1776; public Date end; }; • Cấu trúc không thể chứa chính struct Date nó { public int year; public int month; public int day; Date end; // error }; Lê Viết Mẫn - lvman@hce.edu.vn 13 CTDL khác Monday, September 9, 13
  14. Tập tin File Lê Viết Mẫn - lvman@hce.edu.vn 14 CTDL khác Monday, September 9, 13
  15. Tập tin văn bản • 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 Lê Viết Mẫn - lvman@hce.edu.vn 15 CTDL khác Monday, September 9, 13
  16. StreamWriter Close() Hàm này đóng tập tin và giải phóng các tài nguyên Hàm này thực hiện ghi dữ liệu trong bộ đệm vào tập tin và Flush() 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 Lê Viết Mẫn - lvman@hce.edu.vn 16 CTDL khác Monday, September 9, 13
  17. Ví dụ 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(); } Lê Viết Mẫn - lvman@hce.edu.vn 17 CTDL khác Monday, September 9, 13
  18. StreamReader Hàm này trả ra ký tự tiếp theo mà không thay đổi vị trí đầu Peek() đọ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 Hàm đọc một số lượng ký tự xác định từ tập tin và ghi vào ReadBlock() bộ đệm ReadLine() Hàm đọc một dòng ký tự và trả ra một chuỗi ký tự string Hàm đọc tất cả ký tự từ vị trí hiện tại đến cuối tập tin và trả ReadToEnd() về một chuỗi ký tự duy nhất Lê Viết Mẫn - lvman@hce.edu.vn 18 CTDL khác Monday, September 9, 13
  19. Ví dụ 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(); } Lê Viết Mẫn - lvman@hce.edu.vn 19 CTDL khác Monday, September 9, 13
  20. Tổng kết Lê Viết Mẫn - lvman@hce.edu.vn 20 CTDL khác Monday, September 9, 13
  21. Cơ sở lập trình • 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 Lê Viết Mẫn - lvman@hce.edu.vn 21 CTDL khác Monday, September 9, 13
  22. 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 Lê Viết Mẫn - lvman@hce.edu.vn 22 CTDL khác Monday, September 9, 13
  23. Cảm ơn sự chú ý Câu hỏi ? Lê Viết Mẫn - lvman@hce.edu.vn 23 CTDL khác Monday, September 9, 13