Bài giảng Tin học ứng dụng trong Hóa học (Bản đẹp)

pdf 105 trang huongle 2310
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Tin học ứng dụng trong Hóa học (Bản đẹp)", để 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:

  • pdfbai_giang_tin_hoc_ung_dung_trong_hoa_hoc_ban_dep.pdf

Nội dung text: Bài giảng Tin học ứng dụng trong Hóa học (Bản đẹp)

  1. đạI học thái nguyên tr−ờng đạI học s− phạm Khoa Hoá học TS Mai Xuân Tr−ờng DĐ : 0912.739.257 CQ : 0280.3856.853 NR 0280.3759.402 Bài giảng Tin học ứng dụng trong hoá học (2 tín chỉ) (TÀI LIỆU LƯU HÀNH NỘI BỘ) Thái nguyên, 2011
  2. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Mở đầu Tin học trong hóa học (chemometric) hay hoá tin (computational chemistry) là danh từ dùng để chỉ một lĩnh vực khoa học kết hợp toán học - mà chủ yếu là ph−ơng pháp tính - với máy tính để giải các bài toán hoá học. Hoá tin bao giờ cũng đ−ợc cấu thành bởi ba yếu tố: thuật toán (algorithm), đoạn ch−ơng trình máy tính (computer code) và nội dung hoá học. Tin học ứng dụng trong hóa học có thể hiểu là các ph−ơng pháp tính toán trên máy tính để giải các bài toán hoá học và không có tính đặc thù đầy đủ. Tức là có thể có những ph−ơng pháp chỉ dùng để giải các bài toán hoá học, th−ờng là những ph−ơng pháp tổ hợp cấu thành bài toán lớn nh− hoá l−ợng tử (quantum chemistry), mô phỏng động lực phân tử l−ợng tử (quantum molecular dynamics simulation), và có những ph−ơng pháp không chỉ đ−ợc dùng trong hoá học mà còn dùng trong các lĩnh vực khác. Các ph−ơng pháp này, đặc biệt là trong việc khai thác dữ liệu (datamining), th−ờng là những ph−ơng pháp đơn, không quá phức tạp và xuất phát từ những bài toán cơ bản trong toán học về ph−ơng pháp tính nh−: ph−ơng pháp hồi quy phi tuyến, giải hệ ph−ơng trình vi phân, lọc Kalman (Kalman filter), mạng nơron, Những năm gần đây, sự phát triển các ngôn ngữ lập trình, thuật toán, các bài toán hoá học, các phần mềm tính toán ứng dụng trong hoá học và số l−ợng ng−ời sử dụng ngày càng nhiều. Để phục vụ công tác giảng dạy và học tập tin học ứng dụng trong hóa học, chúng tôi đã biên soạn bài giảng "Tin học ứng dụng trong hoá học". Hiện nay có rất nhiều thuật toán, phần mềm cũng nh− các bài toán hoá tin ứng dụng đã đ−ợc tải lên mạng INTERNET, bạn có thể tìm thấy trên mạng các thuật toán d−ới dạng mã nguồn mở cho hầu hết các bài toán ứng dụng trong hoá học thì việc thay đổi cách học thực là rất cấp thiết. Tuy nhiên để có thể hiểu đ−ợc các ch−ơng trình đó ta cần phải hiểu các khái niệm cơ bản của tin học dùng trong hoá học nh− các học thuật toán, những lệnh rất cơ bản của ngôn ngữ lập trình đó. Vì vậy giáo trình này chủ yếu cung cấp những khái niệm cơ bản nhất của các ngôn ngữ lập trình để ng−ời học có thể lập trình những ch−ơng trình đơn giản hay có thể sử dụng các ch−ơng trình nguồn mở đã có. 1
  3. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Ch−ơng 1 : mở đầu 1.1. các khái niệm cơ bản 1.1.1. Thông tin Mọi yếu tố có thể mang lại sự hiểu biết đều đ−ợc gọi là thông tin. Thông tin đ−ợc thể hiện d−ới nhiều dạng thức khác nhau. Thông tin về một đối t−ợng chính là các dữ kiện về đối t−ợng đó, càng nhiều thông tin thì độ bất định của đối t−ợng càng giảm xuống. 1.1.2. Đơn vị đo thông tin Đơn vị đo thông tin trong máy tính đ−ợc gọi là bít. 1 bít mang l−ợng thông tin t−ơng ứng với 1 trong 2 khả năng có thể xảy ra: 1 (t−ơng ứng với có điện hay bóng đèn sáng) hoặc 0 (t−ơng ứng với không có điện (bóng điện tắt) ). 1 byte = 8 bít 1KB = 1024 byte 1MB = 1024KB 1GB = 1024MB 1.1.3. Xử lý thông tin bằng máy tính điện tử Thông tin vào Quá trình xử lý Kết quả Quy tắc theo đó quá trình xử lý đ−ợc thực hiện (do con ng−ời đặt ra) Máy tính sẽ không làm gì nếu không có tác động của con ng−ời. Ng−ời sử dụng phải nhập số liệu, bấm các phím thực hiện phép toán cũng nh− yêu cầu hiển thị kết quả hoặc l−u trữ kết quả. 1.2. Cấu trúc hệ xử lý thông tin tự động Thiết bị ra Thiết bị vào CPU Bộ nhớ ROM Bàn phím Màn hình Bộ nhớ RAM Chuột Bộ xử lý trung tâm Máy in ổ đĩa Bộ số học logic Máy Scan Bộ điều khiển ổ đĩa 2
  4. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Các thiết vào và các thiết ra gọi là các thiết bị ngoại vi, tùy theo yêu cầu mà ta có thể thêm, bớt các thiết bị ngoại vi cho phù hợp. Máy tính hoạt động dựa trên nguyên lý cơ bản Von Neumann. Các lệnh và dữ liệu cùng đ−ợc l−u trữ trong bộ nhớ đ−ợc tạo bởi các từ địa chỉ dựa trên 2 yếu tố then chốt : + Điều khiển bằng ch−ơng trình: Máy tính hoạt động theo sự chỉ dẫn, điều khiển của ch−ơng trình đ−ợc l−u trữ trong bộ nhớ của nó. Các b−ớc tác động đ−ợc tiến hành theo các câu lệnh của ch−ơng trình. Ch−ơng trình chỉ dẫn cho máy tính biết phải làm gì và phải làm nh− thế nào. + Truy xuất theo địa chỉ: Dữ liệu theo nghĩa rộng (dữ liệu vào, kết quả trung gian, kết quả cuối cùng, ch−ơng trình, dữ liệu ra, . . ) đ−ợc l−u trữ trong RAM tại một vùng nhớ đ−ợc định vị bằng các số thứ tự đ−ợc gọi là địa chỉ. Dữ liệu đ−ợc chỉ định và đ−ợc truy cập (đọc hay ghi) theo địa chỉ ô nhớ chứa chúng. 1.3. phần mềm Trong tin học, thuật ngữ phần mềm đ−ợc dùng để nói về các ch−ơng trình dùng để điều khiển hoạt động của máy tính, xử lý dữ liệu phục vụ cho một ứng dụng cụ thể trong hoạt động kinh tế, sản xuất, kinh doanh, . . . Ví dụ: các ch−ơng trình nạp sẵn trong ROM, các ch−ơng trình phần mềm do ng−ời lập trình viết. Nếu ta đ−a ra khỏi máy tình toàn bộ các ch−ơng trình nạp sẵn trong nó, kể cả các ch−ơng trình ghi sẵn trong ROM thì những gì còn lại đ−ợc gọi là phần cứng của máy tính. Nh− vậy, thuật ngữ phần cứng đ−ợc dùng để chỉ linh kiện, chi tiết, thiết bị lắp ráp thành máy tính. Các chuyên gia phần cứng tập trung vào việc thu nhỏ kích th−ớc, khối l−ợng các linh kiện điện tử, cơ khí, bộ nhớ nhằm làm giảm năng l−ợng tiêu hao cho máy tính, tăng khả năng l−u trữ và vận tốc tính toán. Các chuyên gia phần mềm tập trung vào việc xây dựng hoạt động chính xác, khoa học và tiện lợi trên cơ sở phần khai thác tối đa khả năng của máy tính phục vụ cho lợi ích của con ng−ời. Sự phối hợp chặt chẽ giữa hai lĩnh vực phần cứng và phần mềm là động lực thúc đẩy sự phát triển của tin học 3
  5. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Ch−ơng 2 : một số ngôn ngữ lập trình 2.1. Mở đầu Các ngôn ngữ lập trình là ph−ơng tiện giao tiếp giữa ng−ời và máy tính. Nh− ta đã biết, muốn yêu cầu máy tính giải một bài toán nào đó, ví dụ tính giá trị của biểu thức a = (b + c).(d + e) hoặc a = b + c.d + e chúng ta phải viết một ch−ơng trình quy định thật rõ trật tự thực hiện các thao tác để đ−ợc kết quả mong muốn. Nh− vậy ch−ơng trình máy tính chính là một thuật giải đ−ợc viết d−ới dạng một quy định bằng một ngôn ngữ. Ngôn ngữ dùng để viết ch−ơng trình máy tính đ−ợc gọi là ngôn ngữ lập trình. Ví dụ: Để tính biểu thức a = (b + c).(d + e) thì quá trình thực hiện việc tính toán bằng ch−ơng trình máy tính nh− sau: B−ớc 1. Đọc giá trị b ở bảng 1. B−ớc 2: Đọc giá trị c ở bảng 2, cộng b với c. B−ớc 3: Ghi giá trị tổng (b + c) vào bảng 5. B−ớc 4: Đọc giá trị d ở bảng 3. B−ớc 5: Đọc giá trị e ở bảng 4, cộng d với e. B−ớc 6: Ghi giá trị tổng (d + e) ra bảng 6. B−ớc 7: lấy giá trị ở bảng 5 nhân với giá trị ở bảng 6. B−ớc 8: ghi giá trị tích (b + c).(d + e) ra bảng 7 và gán cho giá trị a. B−ớc 9: Viết giá trị a ở bảng 7. B−ớc 10. Dừng ch−ơng trình. Các bảng 3, 4, 6, 7 có thể dùng lại bảng 1, 2 bằng cách xóa đi (ghi đè lên) sau khi đã dùng xong. Thuật giải (các b−ớc) ở trên chỉ để con ng−ời thực hiện, muốn cho máy tính có thể “hiểu” và thực hiện đ−ợc đúng ý đồ của chúng ta cần phải diễn đạt thuật giải đã cho d−ới một dạng quy định nào đó. Một trong số các dạng quy định đó là hợp ngữ. Hợp ngữ bao gồm tên các câu lệnh và các quy tắc viết các câu lệnh để máy tính hiểu đ−ợc. Tên các cấu lệnh th−ờng đ−ợc viết d−ới dạng tiếng anh nh−: READ, WRITE, INPUT, ADD, PRINT, . . . 4
  6. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Ngoài ra nh− ta đã biết, khi nạp ch−ơng trình vào bộ nhớ chúng ta phải dành chỗ l−u trữ các giá trị của số liệu. Ví dụ trên là các giá trị: a, b, c, d, e. INPUT b (nhập giá trị b từ bàn phím, ghi vào ô nhớ 1) INPUT c (nhập giá trị c từ bàn phím, ghi vào ô nhớ 2) INPUT d (nhập giá trị d từ bàn phím, ghi vào ô nhớ 3) INPUT e (nhập giá trị e từ bàn phím, ghi vào ô nhớ 4) LOAD b (đọc b ở vào ô nhớ 1) ADD c (cộng c ở ô nhớ 2 vào ô nhớ 1, kết quả giữ ở ô nhớ 1) MOVE a (ghi kết quả ô nhớ 1vào ô nhớ 5) LOAD d (đọc d ở ô nhớ 3) ADD e (cộng e ở ô nhớ 4 vào ô nhớ 3, kết quả giữ ở ô nhớ 3) MULT a (nhân kết quả ô nhớ 3 với ô nhớ 5, kết quả giữ ở ô nhớ 3) MOVE a (ghi kết quả từ ô nhớ 3 vào ô nhớ 5) PRINT a (In ô nhớ 5 ra màn hình hoặc máy in) HALT (Dừng ch−ơng trình) Ch−ơng trình này phải sử dụng các ô nhớ (bảng) để l−u giữ số liệu, cụ thể là: 1 (ô nhớ dành cho a) 2 (ô nhớ dành cho b) 3 (ô nhớ dành cho c) 4 (ô nhớ dành cho d) 5 (ô nhớ dành cho e) Ch−ơng trình hợp ngữ trên nhận các giá trị b, c, d, e do ng−ời sử dụng nhập từ bàn phím của máy tính rồi tính và hiển thị giá trị của biểu thức ra màn hình. Ngôn ngữ máy: Sau khi nạp ch−ơng trình hợp ngữ trên vào máy tính, trong máy sẽ diễn ra hai quá trình sau đây: + Dịch ch−ơng trình hợp ngữ sang một ch−ơng trình viết bằng ngôn ngữ máy. + Thực hiện ch−ơng trình đã dịch. 5
  7. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Tại sao lại phải dịch: Vì máy tính đ−ợc thiết kế và làm việc trên cơ sở của hệ nhị phân. Ch−ơng trình viết bằng ngôn ngữ máy chỉ chứa các ký hiệu 0 (đèn tắt) và 1 (đèn sáng). Việc dịch từ ch−ơng trình hợp ngữ sang ngôn ngữ máy cũng đ−ợc các nhà thiết kế máy tính chuẩn bị tr−ớc và nạp sẵn trong máy. Khi dịch, mỗi câu lệnh của hợp ngữ sẽ đ−ợc chuyển sang dạng đặc biệt gọi là mã máy hay mã nhị phân. Ví dụ câu lệnh LOAD (đọc) sẽ đ−ợc chuyển thành 0000, câu lệnh ADD (cộng) sẽ đ−ợc chuyển thành 0001. Các ô nhớ dành cho các biến a, b, c, d, e sẽ đ−ợc gán địa chỉ của từ ứng với chúng. Ví dụ biến a sẽ chiếm vùng nhớ bắt đầu bằng địa chỉ 00100000, biến b chiếm địa chỉ 00100010, Khi đó dòng câu lệnh hợp ngữ: LOAD a sẽ đ−ợc dịch thành: 0000 00100000. Các ngôn ngữ lập trình bậc cao Có thể viết trực tiếp ch−ơng trình bằng ngôn ngữ máy đ−ợc không? Có thể. Tuy nhiên, nh− ta đã thấy việc làm này rất vất vả và dễ sinh lỗi. Các nhà lập trình dựa trên nguyên lý máy tính đ−ợc điều khiển bằng ch−ơng trình để sáng tạo ra các ngôn ngữ lập trình gần với ngôn ngữ tự nghiên, phù hợp với tâm lý và t− duy của ng−ời lập trình để diễn đạt các thuật toán đ−ợc trong sáng và tự nhiên. Việc đặt ra hợp ngữ là một cố gắng b−ớc đầu giúp cho những ng−ời lập ch−ơng trình đ−ợc thuận tiện hơn. Các câu lệnh của hợp ngữ đ−ợc gán tên khá gần với ngôn ngữ tự nhiên, việc dành vùng nhớ cho các biến đ−ợc thực hiện thông qua tên biến. Vận dụng t− t−ởng dịch từ ngôn ngữ này sang ngôn ngữ khác, các nhà tin học đã sáng tạo ra những ngôn ngữ lập khác nhau thuận tiện hơn nữa với các −u điểm sau: + Các câu lệnh của ngôn ngữ lập trình gần với ngôn ngữ tự nghiên. + Tùy theo lĩnh vực ứng dụng mà các ngôn ngữ lập trình mới này cung cấp các ph−ơng tiện trợ giúp để giải các bài toán khoa học, kỹ thuật hoặc quản lý. Ng−ời ta gọi các ngôn ngữ nói trên là các ngôn ngữ lập trình bậc cao để phân biệt với các ngôn ngữ lập trình bậc thấp là hợp ngữ và ngôn ngữ máy. 6
  8. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Quá trình giải các bài toán nhờ sự giúp đỡ của máy tính bao gồm các giai đoạn sau: Giai đọan 1: Tìm hiểu bài toán bao gồm việc xác định giả thiết, các yêu cầu cần phải thực hiện, mục đích cần phải đạt. Giai đoạn 2: Xác định thuật giải để giải bài toán đã cho. Giai đoạn 3: Lập trình: sử dụng một ngôn ngữ bậc cao để diễn đạt thuật giải. Giai đoạn 4: Sử dụng một hệ trợ giúp, thông qua việc bấm các phím thích hợp trên bàn phím để nhập ch−ơng trình vào máy tính. Giai đoạn 5: Yêu cầu máy dịch ch−ơng trình đã nạp sang ngôn ngữ bậc thấp (ngôn ngữ máy). Giai đoạn 6: Yêu cầu máy thực hiện ch−ơng trình đã dịch. Nếu tại một giai đoạn nào đó ta phát hiện ra sai sót thì cần quay lại giai đoạn tr−ớc đó để sửa lỗi rồi thực hiện lại một số giai đoạn cần thiết cho tới khi thu đ−ợc kết quả mong muốn. Ch−ơng trình dịch Trong các ngôn ngữ bậc thấp thì ngôn ngữ máy có bậc thấp nhất. Cần nhớ là máy tính chỉ làm việc với ngôn ngữ máy. Việc dịch một ch−ơng trình viết bằng ngôn ngữ bậc cao sang ngôn ngữ máy do một ch−ơng trình đặc biệt đảm nhận gọi là ch−ơng trình dịch. Ch−ơng trình dịch thực hiện chức năng sau đây: + Duyệt ch−ơng trình nguồn để phát hiện và thông báo các lối cú pháp tức là những lỗi do ng−ời lập trình viết sai. + Trong tr−ờng hợp ch−ơng trình dịch không phát hiện thấy lỗi trong ch−ơng trình nguồn nó sẽ dịch ch−ơng trình nguồn thành ch−ơng trình viết trên ngôn ngữ máy gọi là ch−ơng trình đích. 2.2. Ngôn ngữ BAssic Ngôn ngữ BASIC (Beginers All purpose Symbolic Instruction đoạn ch−ơng trình - thông dịch) do Kemeny và Kuzt sáng lập ra vào năm 1965. Đ−ợc dùng nh− là một ngôn ngữ khởi đầu cho việc lập trình. Hiện đ−ợc cài đặt và phổ 7
  9. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên biến nhất trên máy tính IBM và t−ơng thích. Xu h−ớng hiện nay là cấu trúc hóa ngôn ngữ này và tiếp cận dần với PASCAL. Một tiêu chuẩn mới đã đ−ợc tác giả soạn ra với tên TRUE BASIC. 2.3. Ngôn ngữ PASCAL Do tính t−ờng minh về cấu trúc nên PASCAL rất thích hợp cho việc giảng dạy cơ sở lập trình, đặc biệt đối với những ng−ời không chuyên tin. Bạn đọc có thể đọc rất nhiều giáo trình khác nhau về PASCAL cơ bản (ví dụ Quách Tuấn Ngọc Ngôn ngữ lập trình PASCAL). T− liệu Đọc thêm Ngôn ngữ PASCAL là ngôn ngữ lập trình bậc cao do giáo s− Niklaus Wirth (tr−ờng đại học kỹ thuật Zurich - Thụy Sĩ) sáng lập và công bố vào đầu những năm 1970, tên PASCAL để kỷ niệm nhà toán học ng−ời Pháp Blaisse PASCAL ở thế ký 17. Lúc đầu, PASCAL đ−ợc sáng tác với mục đích làm ngôn ngữ cho máy tính để dạy học cho sinh viên ở các tr−ờng đại học: nó giúp cho sinh viên cũng nh− ng−ời mới học lập trình có đ−ợc thói quen viết một ch−ơng trình có cấu trúc sáng sủa, rõ ràng, dễ hiểu và dễ đọc cho cả mọi ng−ời khác. Tr−ớc khi có PASCAL, các sinh viên đều đ−ợc học ngôn ngữ lập trình FORTRAN, một ngôn ngữ lâu đời nhất và là ngôn ngữ không có cấu trúc. Giáo s− Wirth thấy rằng có thể tránh đ−ợc rất nhiều lỗi khi lập trình với một ngôn ngữ cấu trúc khối và có sự kiểm tra kỹ l−ỡng sự t−ơng thích giữa các dữ liệu. PASCAL là một ngôn ngữ có định kiểu mạnh mẽ, có nghĩa là mọi biến và hằng của một kiểu dữ liệu không thể tự do đem trộn lẫn với các biến và hằng của một kiểu dữ liệu khác. Ví dụ cả hai vế phép gán phải là cùng một kiểu, ngoại trừ tr−ờng hợp vế trái là một biến số thực (real) còn vế phải có thể là số nguyên (integer). Việc định kiểu một cách chặt chẽ nh− vậy bắt buộc ng−ời lập trình luôn luôn phải có các biểu thức t−ơng thích nhau về kiểu dữ liệu. PASCAL là một ngôn ngữ có cấu trúc. Một ngôn ngữ có cấu trúc khối là ngôn ngữ mà ta có thể tách các thông tin dữ liệu (biến, hằng, . . .) và các lệnh cần dùng cho một nhiệm vụ xác định thành những khối riêng, tách ra khỏi phần còn lại của ch−ơng trình để ng−ời lập trình có thể giải quyết dần từng phần một, từng khối một thậm trí có thể cho nhiều ng−ời cùng tham gia lập trình, mỗi ng−ời phụ trách một vài khối. Thông th−ờng các khối ứng với các nhiệm vụ cụ thể và xác định, đ−ợc thực hiện bằng các ch−ơng trình con với các biến địa ph−ơng là các biến tạm thời của ch−ơng trình con đó. Bằng cách này ta có thể viết các ch−ơng trình con sao cho các sự kiện xảy ra trong đó không làm ảnh h−ởng tới các phần khác của ch−ơng trình nằm ngoài ch−ơng trình con. Có thể nói tính cấu trúc của ch−ơng trình PASCAL đ−ợc thể hiện trên 3 mặt. + Cấu trúc về mặt dữ liệu: từ các dữ liệu đã có (kiểu đơn giản hoặc dữ liệu cấu trúc) ta có thể xây dựng các cấu trúc dữ liệu phức tạp hơn. + Cấu trúc về mặt lệnh: Từ các lệnh đã có (lệnh đơn giản hoặc lệnh có cấu trúc) ta có thể nhóm chúng lại với nhau và đặt giữa hai từ khóa BEGIN và END thành câu lệnh phức tạp hơn, gọi là lệnh hợp thành hay lệnh ghép. 8
  10. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên + Cấu trúc về mặt ch−ơng trình: Một ch−ơng trình có thể chia thành các modun ch−ơng trình độc lập (ch−ơng trình con). Bộ chữ viết của PASCAL Ngôn ngữ PASCAl đ−ợc xây dựng với bộ chữ viết sau: Bộ 26 chữ cái la tinh: 26 chữ cái in hoa A, B, C, . . . ,Z 26 chữ cái th−ờng a, b, c, . . . , z Ký tự gạch nối ”_”. Các chữ số thập phân: 0, 1, 2, . . ., 9 Các ký hiệu toán học thông th−ờng +, -, *, /, =, , (), Các ký hiệu đặc biệt nh− các dấu chấm câu và các dấu khác: .,; :[]?%\⏐!&#$’ Dấu cách (Space) đ−ợc dùng để ngăn cách các từ. Vì khi viết nó không hiện ra chữ gì nên để tiện nhận biết trong một số tr−ờng hợp nh− cần đếm số dấu cách, trong tài liệu th−ờng dùng dấu . Từ vựng của PASCAL gồm một số từ riêng PASCAL đ−ợc gọi là từ khóa (key word). Các từ khóa này ng−ời sử dụng phải dùng đúng với cú pháp, không đ−ợc dùng nó vào việc khác hoặc đặt tên mới trùng với các từ khóa. Đó là các từ: Từ khóa chung: PROGRAM, BEGIN, END, PROCEDURE, FUNCTION Từ khóa để khai báo: CONST, VAR, LABEL, TYPE, ARRAY, STRING, RECORD, SET, FILE, OF Từ khóa của lệnh thử và rẽ nhánh: IF . . . THEN . . . ELSE. . ., CASE . . . OF. . . Từ khóa của lệnh lặp: FOR . . . TO . . DO . . . , FOR. . . DOWNTO . . . DO. . . , WHILE. . . DO. . . , REPEAT. . . UNTIL. . . Từ khóa điều khiển: WITH, GO TO. Từ khóa toán tử: AND, OR, NOT, IN, DIV, MOD Từ khóa NUL: NUL Các từ khóa này có thể viết in hay viết th−ờng, giá trị và ý nghĩa của các từ khóa không thay đổi. Tên hay định danh (identifier) Tên hoặc định danh là một dãy ký tự (không có dấu cách) đ−ợc dùng để chỉ tên hằng số, tên hằng ký tự, tên biến, tên kiểu, tên ch−ơng trình, . . . Tên đ−ợc tạo thành từ các chữ cái và chữ số song bắt buộc chữ đầu phải là chữ cái. Tất nhiên ta phải đặt tên sao cho có ý nghĩa, dễ nhớ. Để làm sáng sủa tên, PASCAL cho phép dùng dấu gạch d−ới "_" khi viết tên. Một số tên nh− tên của ch−ơng trình con (SIN , COS, . . . ) đã đ−ợc PASCAL định nghĩa sẵn đ−ợc gọi là tên chuẩn hay tên đã đ−ợc định nghĩa. Sự khác nhau giữa tên chuẩn và từ khóa là ng−ời sử dụng có thể định nghĩa lại tên chuẩn, dùng tên chuẩn vào việc khác nếu muốn còn từ khóa thì bị nghiêm cấm dùng vào việc khác trái quy định. Một số tên chuẩn của PASCAL: BOOLEAN, CHAR, INTEGER, REAL, BYTE, TEXT, FALSE, TRUE, MAXINT, ABS, ARCTAN, CHR, COS, SIN, EOF, EOLN, EXP, LN, ODD, ORD, ROUND, TRUNC, SQR, PRED, SUCC,DISPOSE, NEW, GET, PUT, READ, READLN, WRITE, WRITELN, RESET, REWRITE. Dấu chấm phẩy “;” dùng để ngăn cách các câu lệnh của PASCAL và không thể thiếu đ−ợc. Không nên hiểu dấu “;” là kết thúc cấu lệnh. 9
  11. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Lời giải thích (Comment) có thể để bất kỳ chỗ nào của ch−ơng trình cho dễ hiểu, dễ đọc hơn mà không làm ảnh h−ởng đến các phần khác. Lời giải thích đ−ợc đặt giữa hai dấu { } hoặc ( ) : { lời giải thích } hoặc giữa cụm dấu (* lời giải thích *). Do có rất nhiều tài liệu về PASCAL và cũng do khuôn khổ của giáo trình này nên chúng tôi chỉ trình bày những khái niệm cơ bản nhất về PASCAL để ng−ời đọc có thể hiểu và lập trình đ−ợc những ch−ơng trình đơn giản. 2.3.1. Cấu trúc ch−ơng trình PASCAL Một tập các câu lệnh tạo thành một ch−ơng trình. Lệnh còn đ−ợc gọi là chỉ thị dùng để h−ớng dẫn máy tính làm việc. Cấu trúc của một ch−ơng trình PASCAL hợp thành bởi các phần sau: đầu ch−ơng trình, mô tả, thân ch−ơng trình và kết thúc. Đầu ch−ơng trình Phần đầu của ch−ơng trình bao gồm: PROGRAM tên ch−ơng trình; Trong đó tên ch−ơng trình không đ−ợc có dấu cách và các ký tự đặc biệt, không đ−ợc dùng các toán tử để đặt tên ch−ơng trình, . . . kết thúc tên ch−ơng trình là dấu “;”. Ví dụ: PROGRAM GIAI_PHUONG_TRINH_BAC_2; Phần mô tả Phần mô tả có thể gồm có 5 phần: mô tả nhãn (địa chỉ), hằng, kiểu, biến, thủ tục và hàm (ch−ơng trình con). Mô tả nhãn (địa chỉ) Nhãn là một số nguyên d−ơng có ≤ 4 chữ số. Mô tả nhãn liệt kê tất cả các nhãn sử dụng trong ch−ơng trình và dùng để định vị các toán tử khi cần điều khiển ch−ơng trình hoạt động ngoài quy tắc thông th−ờng (từ trên xuống d−ới). Cách mô tả : LABEL số nguyên; Ví dụ: LABEL 10, 20, 123; mô tả 3 nhãn dùng trong khối. 10
  12. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Xác định hằng Các hằng có giá trị không đổi trong suốt quá trình thực hiện ch−ơng trình. Bởi vậy không đ−ợc phép dùng 1 lệnh nào để thay đổi giá trị của hằng. Cách xác định: CONST tên hằng 1 = gía trị hằng 1; tên hằng 2 = gía trị hằng 2; Ví dụ: CONST Pi = 3.141598; ch= ' gia tri tich phan'; Xác định kiểu (TYPE) TYPE dùng để xác định các kiểu dữ liệu mới so với 4 kiểu đã có của PASCAL (Integer, Real, Char, Boolean). Cách xác định : TYPE Tên kiểu 1 = ( phổ các giá trị của kiểu 1); Tên kiểu 2 = ( phổ các giá trị của kiểu 2); Ví dụ: TYPE city = (HANOI,TOKYO, MOSCOW, PARIS); color = (xanh, do, trang,tim,vang); Với các kiểu này có thể dùng các hàm chuẩn ORD, PRED, SUCC. Sau khi khai báo kiểu thì khi mô tả biến cần chỉ rõ biến nào thuộc kiểu đã đ−ợc mô tả. Mô tả biến Nguyên tắc rất cơ bản của PASCAL là trong ch−ơng trình dùng biến nào phải mô tả biến đó. Khác với một số ngôn ngữ khác, PASCAL không có các biến mặc định. Cách mô tả: VAR tên biến 1, tên biến 2 : kiểu 1; tên biến 3, tên biến 4 : kiểu 2; Ví dụ: VAR m,n : integer; ch : char; x,y : real; j : boolean; h : city; chỉ ra m, n, ch, x, y, j, h : là các biến, trong đó: m, n là kiểu nguyên, x, y là thực, ch là kí tự, j là logic và h là kiểu city (đã đ−ợc định nghĩa trong TYPE). 11
  13. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Mảng Để có thể truy nhập thông tin và sử dụng các phần tử trong dãy số PASCAL đ−a vào khái niệm mảng. Mảng là một kiểu biến (hoặc hằng) có chỉ số dùng để chỉ thứ tự của phần tử đó trong dãy số. Cách mô tả mảng 1 chiều: tên biến 1, tên biến 2, : ARRAY [1 n] of kiểu biến; tên biến 3, tên biến 4, : ARRAY [1 m] of kiểu biến; hoặc khai báo theo kiểu (TYPE) rồi sau đó mới khai báo biến nh− sau: TYPE Mang1 = array [1 n] of kiểu biến; Mang2 = array [1 m] of kiểu biến; VAR tên biến 1, tên biến 2, : Mang1; tên biến 3, tên biến 4, : Mang2 ; Ví dụ dãy số d−ới đây : x 1234 5 n y1235109 1 Khai báo biến x và y là biến số thực theo kiểu mảng nh− sau: x,y: array[1 n] of real; hoặc khai báo thông qua việc xác định tr−ớc một kiểu biến mới TYPE M1=array[1 10] of real; VAR X,y: M1; Cách thứ hai phổ biến hơn khi chúng ta phải sử dụng các ch−ơng trình con có các biến hình thức là các mảng (xem phần sau). Trong các tính toán, các phần tử của mảng đóng vai trò nh− các biến đơn. Ngoài mảng một chiều còn có các mảng hai và ba chiều: Cách mô tả mảng 2 chiều: tên biến 1, tên biến 2, : ARRAY [1 n, 1 m] of kiểu biến; hoặc khai báo theo kiểu (TYPE) rồi sau đó mới khai báo biến nh− sau: 12
  14. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên TYPE Mang1=array[1 n, 1 m] of kiểu biến; VAR tên biến 1, tên biến 2, : Mang1; T−ơng tự ta có cách mô tả mảng 3 chiều: tên biến 1, tên biến 2, : ARRAY [1 n, 1 m,1 k] of kiểu biến; Phần thân ch−ơng trình Thân ch−ơng trình bao gồm các toán tử (còn gọi là các câu lệnh hoặc chỉ thị) để thực hiện công việc chủ yếu của ch−ơng trình và đ−ợc đặt sau từ khóa: BEGIN Phần kết thúc Phần kết thúc bao gồm tập hợp lệnh READLN; END. Với một số phiên bản của ch−ơng trình dịch PASCAL câu lệnh READLN không nhất thiết phải có. 2.3.2. Các toán tử Toán tử gán Toán tử gán có dạng tổng quát : Tên biến := biểu thức hoặc biến hoặc hằng; Khi gặp lệnh này kết quả tính toán của biểu thức vế phải hoặc giá trị biến, hằng vế phải đ−ợc gán cho biến vế trái. Ví dụ: Sau đây là một đoạn ch−ơng trình có chứa các lệnh gán W1 := a*2; W2 := b*2; y := sin(W1 + W2); W1 := W1 + ln(y); W2 := W2 + y ; y := (W1 + W2)/(W1 + SQRT(W2)); Toán tử chuyển (GOTO) Dạng tổng quát GOTO nhãn; D−ới tác động của toán tử này ch−ơng trình chuyển đến nhãn (đã đ−ợc xác định bằng LABEL). 13
  15. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Ví dụ: LABEL 10; GOTO 10; 10: x2 := x1; Toán tử xuất nhập Có hai cách nhập dữ liệu PASCAL. Nhập qua bàn phím và nhập từ tệp dữ liệu. Việc nhập từ tệp sẽ đ−ợc trình bày kỹ trong học phần dành cho cao học. D−ới đây là cách nhập từ bàn phím. Bao giờ cũng có hai câu lệnh đi kèm. Câu lệnh viết WRITE để thông báo nhu cầu nhập liệu, sau đó là câu lệnh đọc READ. Cách mô tả: WRITE(‘Thông báo’ hoặc biến); READ(biến); Liên quan đến con trỏ trên màn hình, nếu sau khi viết thông báo hoặc biến, nhập dữ liệu, bạn muốn con trỏ xuống hàng thì mô tả nh− sau WRITELN(‘Thông báo’ hoặc biến); READLN(biến); Ví dụ để nhập ba hệ số của ph−ơng trình bậc hai a,b,c ta cần hai câu lệnh sau: Write(‘ nhap a, b, c: ’ ); Read(a,b,c); Nếu sau khi nhập dữ liệu, bạn muốn con trỏ xuống hàng thì viết Write(‘ nhap a, b, c :’ ); Readln(a,b,c); Về cơ bản PASCAL dùng hai kiểu viết: định khuôn và không định khuôn. Theo kiểu không định khuôn thì khi viết ra màn hình, các biến sẽ đ−ợc bố trí theo kiểu mặc định số cột dành cho mỗi biến hoặc hằng và các biến thực sẽ đ−ợc viết d−ới dạng dấu phảy di động. 14
  16. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Ví dụ: Write(a,b,c); sẽ cho ra màn hình 1.2345678+01 3.00000000+02 -7.0001111-03 Trong tr−ờng hợp định khuôn chúng ta dùng các số sau dấu “:” để mô tả số cột trên màn hình dành cho việc viết biến hoặc hằng tr−ớc đó. Riêng với các số thập phân kiểu dấu phảy cố định có thêm số thứ hai sau dấu ‘”:” thứ hai chỉ số số thập phân sau dấu phảy. Ví dụ: Write (a:10, b:10:2, c:10:4); sẽ cho ra màn hình 1.23456+01 300.00 -0.0070 Định khuôn cũng dùng cho các biến nguyên, biến ký tự, biến dòng và các kiểu biến khác theo nguyên tắc trên. Định khuôn liên quan chủ yếu đến cách trình bày màn hình sao cho đẹp, dễ đọc và rõ ràng. Với tất cả các điều vừa trình bày ở trên chúng ta đã có thể viết một ch−ơng trình PASCAL hoàn chỉnh, ví dụ để tính tích của hai số a và b, tức là S = a . b. Ví dụ: Program nhan; Var A,B,S : real; BEGIN Write(‘ nhap A va B : ‘); readln(A, B); S:=A*B; Writeln(‘ Tich S = ‘, S:10:4); Readln; END. Toán tử điều khiển Toán tử điều khiển của PASCAL có 2 vế: IF THEN ELSE ; Nếu điều kiện logic sau IF đ−ợc thoả mãn thì thực hiện câu lệnh 1 sau THEN. Nếu không thì thực hiện câu lệnh 2 sau ELSE. 15
  17. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Ví dụ: If (i=k) then a:=b else a:=d; Trong tr−ờng hợp đơn giản nhất ta chỉ cần đến vế đầu: IF THEN ; Nếu điều kiện logic sau IF thoả mãn thì thực hiện câu lệnh 1 sau THEN. Ví dụ: If (i=k) then a:=b; Trong những tr−ờng hợp phức tạp, sau THEN và ELSE chúng ta có thể phải thực hiện nhiều câu lệnh, khi đó phải dùng các toán tử hợp thành bắt đầu bằng BEGIN và kết thúc bằng END. IF THEN BEGIN Câu lệnh 1;. . .; Câu lệnh n; END ELSE BEGIN Câu lệnh 2; ; Câu lệnh m; END; Chú ý là câu lệnh tr−ớc ELSE không có dấu “;”. D−ới đây là ví dụ đoạn ch−ơng trình sử dụng toán tử IF THEN. Ví dụ 1: Giải ph−ơng trình bậc hai: If (delta>=0) then Begin x1:= (- b + sqrt(delta))/2/a; x2:= (- b - sqrt(delta))/2/a; End Else 16
  18. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Begin AA: = -b/2/a; { phần thực của nghiệm phức } BB:= sqrt(-delta)/2/a; { phần ảo của nghiệm phức } End; Ví dụ2: Tính tổng n số nguyên đầu tiên i:=1; sum:=0; 1: sum:=sum+i; i:=i+1; If (i<n) goto 1; Ví dụ 3: Tính tổng các số chẵn và tổng các số lẻ trong một dãy n số nguyên đầu tiên i:=1; TONGCHAN:=0; TONGLE:=0; 15: if (i mod 2 =0) then TONGCHAN:=TONGCHAN+i else TONGLE:=TONGLE+i; i:=i+1; if i<n goto 15; Trong đó có sử dụng toán tử lấy số d− khi chia số nguyên a cho số nguyên b (câu lệnh là a mod b). Nếu muốn tính tổng các phần tử có chỉ số chẵn và tổng các phần tử có chỉ số lẻ của mảng a[i] ta có: i:=1; sum1:=0; 17
  19. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên sum2:=0; 1: if (i mod 2 =0) then sum1:=sum1+a[i] else sum2:=sum2+a[i]; i:=i+1; if i<n goto 1; 2.4. Ngôn ngữ FORTRAN 2.4.1. Giới thiệu ngôn ngữ FORTRAN FORTRAN là ngôn ngữ lập trình cho máy tính. Nó thuộc loại ngôn ngữ cap cấp thiên về bài toán, còn gọi là ngôn ngữ thuật toán hay ngôn ngữ thủ tục. Đ−ơng nhiên, ngôn ngữ ch−ơng trình nào cũng dùng để thể hiện thuật toán, nh−ng ngôn ngữ thuật toán cho phép chuyển trực tiếp từ mô tả thuật toán sang ch−ơng trình nguồn không cần thay đổi gì mấy. FORTRAN là tên ghép của các chữ cái đầu “FORmula TRANslation” nghĩa là “biên dịch các công thức”, bởi vì lúc đầu ngôn ngữ này dùng để giải các bài toán kỹ thuật. FORTRAN ra đời mới vài chục năm (1954) nh−ng sớm phát triển và có sức sống mạnh mẽ và dẻo dai. Hiện nay, đã có rất nhiều ngôn ngữ phát triển phức tạp, chặt chẽ và tinh tế hơn, đặc biệt là PASCAL nh−ng FORTRAN vẫn đang là ngôn ngữ phổ dụng trên thế giới: hơn 70% các ch−ơng trình đ−ợc viết bằng FORTRAN. Tuy nhiên ở Việt Nam ch−ơng trình FORTRAN chủ yếu đ−ợc áp dụng nhiều trong các ngành khoa học kỹ thuật, Trong giáo dục ch−ơng trình FORTRAN không đ−ợc phổ biến nh− PASCAL. Những −u điểm của FORTRAN: + Dễ học, dễ viết, dễ hiệu chỉnh. + Có hiệu quả khi dịch do cấu trúc ngôn ngữ đơn giản. + Vốn t− liệu phong phú: Có nhiều kho ch−ơng truình mẫu, ch−ơng trình phục vụ. + Khả năng vào ra đơn giản và dồi dào, tiện dụng. 18
  20. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Hiện nay, có nhiều dạng FORTRAN khác nhau dựa trên FORTRAN cơ sở (Basic FORTRAN). FORTRAN chuẩn (standard FORTRAN) Từ phiên bản thứ 7 trở đi ngôn ngữ FORTRAN đ−ợc ký hiệu là “Fortran” (Fortran 90). Hiện nay đã có phiên bản 9 (Fortran 2003) và phiên bản 10 (Fortran 2008). ở đây, chúng tôi chỉ giới thiệu những nét, những khái niệm cơ bản chung nhất để ng−ời học có thể nắm đ−ợc cơ sở của ngôn ngữ và lập đ−ợc những ch−ơng trình không phức tạp (về mặt ngôn ngữ và kỹ thuật lập trình mà không đề cập đến tính phức tạp về mặt chuyên môn) và không dùng bộ nhớ phụ. Muốn lập ch−ơng trình bằng ngôn ngữ FORTRAN, phải đọc tài liệu h−ớng dẫn để biết đặc điểm, những hạn chế hay mở rộng của dạng FORTRAN, thủ tục đ−a dịch và cho thực hiện ch−ơng trình nh− thế nào. Chừng nào càng đi sâu vào giải quyết các bài toán thực tiễn ta mới càng thấy kiến thức đã học là ch−a đầy đủ, mới thấy cần bổ sung những gì, và thấy rõ thêm mặt mạnh và mặt yếu của từng loại ngôn ngữ. Quy mô bài toán tăng lên thì khó khăn cũng gấp bội, bấy giờ mới thấy yêu cầu bức thiết về thuật toán, ngôn ngữ, cấu trúc dữ liệu và cấu trúc ch−ơng trình và mới có h−ớng để tự bổ sung thêm. 2.4.2. Chỉ thị và thông báo Ch−ơng trình FORTRAN là một dãy các câu lệnh thuộc 2 loại: Chỉ thị hay thông báo. Ch−ơng trình là sự kết hợp giữa thuật toán và dữ liệu. Nó gồm một mặt là các thông báo để mô tả dữ liệu và một mặt là các chỉ thị để thực hiện các sự tác động lên dữ liệu đó theo một thuật toán (giải thuật) cho bài toán. Chỉ thị (Statement) là các câu lệnh đ−ợc thực hiện và sẽ đ−ợc ch−ơng trình dịch biến thành dãy lệnh máy trong ch−ơng trình đích. Chỉ thị có thể thực hiện là: - Vào/ ra dữ liệu. - Trao đổi thông tin giữa các phần của ch−ơng trình, giữa bộ nhớ trong và bộ nhớ ngoài, - Tính toán số học, logic. - Kiểm tra và quyết định lựa chọn. - Điều khiển. 19
  21. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Thông báo (Declaration) là các câu lệnh không thực hiện và không cần dịch, chỉ các tác dụng thông báo (khai báo) với ch−ơng trình dịch về: - Mô tả dữ liệu. - Mô tả kích th−ớc mảng dữ liệu. - Mô tả quy cách dữ liệu ngay khi dịch. - Gán tr−ớc dữ liệu ngay khi dịch. - Trao đổi thông tin ở vùng chung. - Chỗ cuối ch−ơng trình cần dịch. . . . 2.4.3. Phiếu mẫu và bìa FORTRAN Trong FORTRAN khái niệm bìa và dòng in có một vai trò đặc biệt. Ch−ơng trình FORTRAN đ−ợc ghi trên phiếu mẫu nh− sau (xem ví dụ cụ thể phiếu mẫu ở bảng 1). Mỗi câu lệnh nói chung ghi ở 1 dòng, dù thừa chỗ cũng phải xuống dòng khác (do đó nên ghi th−a cho dễ đọc). Mỗi dòng của phiếu có đúng 80 vị trí (cột), cho phép ghi 80 ký hiệu cơ sở FORTRAN, kể cả ký hiệu trống là chỗ không ghi gì (để đánh dấu chỗ trống có thể ghi dấu “b” hay “B”) Những ký hiệu của ch−ơng trình viết ở phiếu mẫu phải đ−ợc mã hoá mới đ−a vào máy đ−ợc. Máy thu nhận các thông tin mã hoá từ bìa đục lỗ (loại 80 cột). Mỗi bìa có 80 cột ứng 80 vị trí của dòng phiếu. Nh− vậy mỗi dòng phiếu đ−ợc mã hoá bởi một bìa. Khi đục từng ký hiệu thì xuất hiện các tổ hợp lỗ đục ứng với mã ký hiệu trên cột t−ơng ứng của bìa và phía trên cùng của cột có in bản thân ký hiệu đó. Đục xong bìa thì nội dung của dòng phiếu t−ơng ứng sẽ hiện lên ở mép trên bìa, nh− vậy tiện kiểm tra bìa. Ch−ơng trình và dữ liệu tr−ớc khi đ−a vào máy phải đ−ợc chuẩn bị thành các cỗ bìa: Cỗ bìa ch−ơng trình và cỗ bìa dữ liệu. 20
  22. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Năm cột (vị trí) đầu tiên của phiếu dành ghi nhãn của câu lệnh hoặc để trống. Nhãn (Label) của câu lệnh là một số nguyên không dấu, có giá trị từ 1 đến 99999 – Không nhất thiết ghi từ cột đầu - dùng để đánh dấu câu lệnh đó. Cột thứ sau (6) là cột nối tiếp (Continuation) để ghi dấu hiệu nối: Nếu câu lệnh ghi một dòng ch−a đủ thì xuống dòng, ở các dòng tiếp theo (dòng phụ) phải có dấu nối là một ký hiệu cơ sở nào đó khác số 0 và dấu b, ghi ở cột 6. Tối đa có 19 dòng phụ. Câu lệnh chỉ đ−ợc ghi từ cột thứ 7 tới cột 72 (tối đa 66 ký hiệu). Quãng trống sẽ đ−ợc bỏ qua - Máy không tính - trừ trong FORMAT. Tám cột cuối từ cột 73 đến cột 80 dùng để đánh dẫu cỗ bìa, chẳng hạn ký hiệu cỗ bìa và số thứ tự của bìa để khỏi lẫn lộn, hoặc để ghi tên ch−ơng trình, ng−ời lập. . . Những thông tin này không đ−ợc dịch mà chỉ in để kiểm tra. Riêng cột đầu của phiếu mẫu còn có tác dụng phân biệt dòng thuyết minh. Các dòng có chữ C (Comment: thuyết minh, chú thích) ở đầu dòng (cột 1) đều là các dòng thuyết minh, không có tác dụng với việc dịch và chạy ch−ơng trình, chỉ có tác dụng khi in kiểm tra ch−ơng trình, cho phép ng−ời đọc dễ dàng theo dõi từng đoạn ch−ơng trình. Đặt các dòng thuyết minh thích đáng, đúng chỗ thì ng−ời khác đọc cũng có thể hiểu đ−ợc thuật toán, ch−ơng trình. Các dòng thuyết minh có thể gồm mọi ký hiệu cơ sở và muốn xuống dòng (sang bìa) chỉ cần ghi C ở đầu dòng (chứ không dùng cột 6). 2.4.4. Một số ch−ơng trình Fortran Để có khái niệm ban đầu, bao quát nh−ng thô sơ và để hình dung thế nào là một ch−ơng trình viết bằng FORTRAN, ta sẽ xét một số ch−ơng trình đơn giản, qua đó giới thiệu một số yếu tố của FORTRAN. Ví dụ 1: Viết ch−ơng trình tính thể tích của hình trụ tròn xoay theo công thức V = πR2h. Với R là bán kính đáy hình trụ, h là chiều cao hình trụ (Bảng 1). 21
  23. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Bảng 1: Phiếu mẫu của ch−ơng trình tính thể tích của hình trụ tròn xoay Công thức V = πR2h. Với R là bán kính đáy hình trụ, h là chiều cao hình trụ. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 1 C H U O N G T R I NH TI NH THE T I CH HI NH TRU- TTR U 2 C 3 R E A D ( 5 , 1 0 ) B K I N H , C C A O 4 T T I CH=3, 1416*BKIN H CCAO 5 W R I TE ( 6, 1 1 ) BKI N H , CCAO, TTICH 6 S T O P 7 1 0 F 0 R MAT (2F10,2) 8 1 1 F 0 R MAT ( 9HOBKI NHb = b, F6 . 2 , 9 * 11 HBBBBCC A OB=B, F6 . 2, 10 * 12H TT I CH = , F61. 2) 11 E N D 12 13 14 15 16 17 18 19 20 21 22 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 22
  24. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên ý nghĩa ch−ơng trình là: đọc 1 bìa có ghi giá trị của bán kính (BKINH) và chiều cao (CCAO), tính thể tích hình trụ (TTICH) theo công thức trên, in ra các giá trị t−ơng ứng của bán kính, chiều cao, thể tích rồi dừng máy. ý nghĩa của từng dòng: 1. Đây là dòng thuyết minh: tóm tắt nội dung và tên ch−ơng trình là TTTRU. Chữ C đầu dòng có thể đồng thời là chữ đầu của nội dung thuyết minh (CHUONG) đồng thời cũng cho biết đây là dòng thuyết minh. 2. Dòng thuyết minh trống có chữ C ở đầu nhằm để cách dòng khi in nhằm dễ theo dõi ch−ơng trình. 3. READ là “đọc”: đọc nội dung 1 bìa ghi vào bộ nhớ bao gồm: 5 là số hiệu kênh vào (bàn phím), 10 là nhãn của thông báo FORMAT t−ơng ứng cho biết quy cách đọc. Nhãn ở đây là cần thiết vì có nhiều FORRMAT khác nhau, cần phải đánh số của chúng để gọi cho đúng. Chỉ thị này lệnh cho máy vào đọc bìa ở kênh 5 (bàn phím) theo quy cách 10 và gán giá trị đọc đ−ợc cho 2 biến BKINH và CCAO tức là gửi nội dung đọc đ−ợc vào các biến nhớ có tên (địa chỉ) là BKINH và CCAO. 4. Dòng tiếp theo là một chỉ thị gán, cho phép tính thể tích hình trụ theo bán kính và chiều cao đã xác định (ở trên) và gán kết quả cho biến TTICH. ở đây * là dấu nhân; là dấu lũy thừa bậc 2. 5. WRITE là “viết”, Viết ra theo kênh số 6 (máy in) giá trị của ba biến BKINH, CCAO và TTICH với quy cách thông báo FORMAT mang nhãn 11. 6. STOP là “dừng lại”, chỉ thị cho máy tính xong, kết thúc công việc. 7. 10 là nhãn của FORMAT , 2F10.2 là quy cách đọc: đọc 2 số liền nhau dạng dấu phảy tĩnh (mã F) mỗi số 10 cột và có 2 số ở phân thập phân. FORMAT để đâu cũng đ−ợc miễn là ch−a kết thúc ch−ơng trình. Ví dụ bbbbb10.32bbbbb61.07 thì máy sẽ đọc là giá trị thứ nhất là 10,32 gán cho BKINH và giá trị thứ hai 61,07 gán cho CCAO. ở đây dấu . đóng vai trò nh− dấu phảy và là 1 ô trong bìa, b chỉ chỗ trống không đục gì hoặc đục cách ””. 8. 11 là nhãn của FORMAT cho biết quy cách in ra: vừa in kết quả vừa giải thích. Dùng hằng ký tự (HOLLERITH) để biên tập kết quả. 9HOBKINHb=b chỉ rằng máy sẽ in ra 8 ký tự kể từ chữ B (kể cả ký tự trắng) tức là in ra “BKINH_= _“ chữ b có nghĩa là ký tự trắng. 23
  25. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên số 9 cho biết số l−ợng ký tự sau chữ H là 9. 9H: Chữ H cho biết mã H (hằng ký tự). 9HO: Chữ O là dấu hiệu kiểm tra kéo giấy, không in ra, nó có nghĩa là bỏ cách một dòng (để kéo giấy vào máy in) và in từ dòng thứ 2 các ký tự sau chữ O với số l−ợng ký tự tr−ớc chữ H. F6.2 cho phép in giá trị của BKINH sau hằng ký tự vừa rồi, phạm vi in là 6 ký tự lệch về phải, có 2 số ở phần thập phân. Tức là khi in ra giấy ta sẽ có: “BKINH = 10.32”. T−ơng tự với các phần sau. Dấu * ở cột 6 trong dòng 9 và 10 là dấu hiệu nối tiếp của 2 dòng phụ đó (tuy cho phép ghi 66 ký tự mỗi dòng, nh−ng không nên viết quá dài vì khó đọc và dễ đục sai nên ng−ời ta th−ờng xuống dòng cho dễ theo dõi). Tác động của FORMAT nhãn 11 (chiếm 3 dòng liền) là cho in ra dòng sau: “ BKINH = 10.32 CCAO = 61.07 TTICH = 29120.59” 11. END “hết” là thông báo, báo chỗ chấm hết ch−ơng trình cần dịch. Khi dịch gặp tới END ch−ơng trình dịch biết là đã dịch xong. Qua ví dụ này ta thấy cấu trúc của ch−ơng trình rất đơn giản, rõ ràng, dễ hiểu, nh−ng đủ minh họa cho một ch−ơng trình đầy đủ hoàn chỉnh. Nó cho phép chạy với nhiều dữ liệu khác nhau. Mỗi lần chạy, nó đọc một bìa ghi BKINH, CCAO của một hình trụ và in ra các tham số đó cùng với kết quả là thể tích t−ơng ứng. Cần in cả tham số vào vì nếu không sau khi chạy với một loạt hình trụ sẽ không biết kết quả ứng với dữ liệu đầu vào nào. Ch−ơng trình trên có cấu trúc của một ch−ơng trình tuyến tính, các chỉ thị đ−ợc thực hiện tuần tự nhau theo thứ tự tự nhiên, viết tr−ớc thực hiện tr−ớc, viết sau thực hiện sau. Đây là cấu trúc đơn giản nhất. Muốn tránh phải dừng mày luôn mỗi khi in xong 1 dòng (1 ch−ơng trình). Có thể cho máy đọc tiếp bìa sau để tính với dữ liệu khác, Thay dòng 3 là READ bởi chỉ thị có nhãn là 2 READ và thay dòng 6 là STOP bằng Go To 2 thì mỗi khi in xong gặp chỉ thị này máy sẽ chuyển tới chỉ thị mang nhãn 2 là đọc tiếp dữ liệu ở bìa sau tạo thành chu trình để giải bài toán với nhiều dữ liệu, tới khi hết dữ liệu (dữ liệu không hợp lệ) thì READ sẽ “lỗi” và chấm dứt ch−ơng trình, lúc ấy máy sẽ tự động dừng. 24
  26. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Bảng 2: Tính trung bình cộng của một dãy số. Các số đều là số nguyên, không v−ợt quá 100, mỗi số 3 ký tự. Đục 8 số trên 1 bìa. Bìa đầu có kích th−ớc 80 của dãy (80 ký tự) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 1 C H U O N G T R I NH TI NH TRUNG BI NH CONG 2 C 3 I N T EGER DAY, TONG 4 R E A LTBI NH 5 D I M ENSI ONDAY( 8 0 ) 6 W R I TE( 6 , 49 ) 7 R E A D( 5 , 50) KT 8 R E A D ( 5 , 5 0 ) ( D A Y ( I ) , I = 1 , K T ) 9 W R I T E ( 6 , 5 1 ) ( D A Y ( I ) , I = 1 , K T ) 10 T O N G=0 11 D O 2 0J =1 , ET 12 2 0 T O N G=TONG+DAY( J ) 13 T B I NH=TONG/ KT 14 W R I TE( 6 , 60 ) TBI NH 15 S T O P 16 4 9 F O R MAT( 1H1 DAYb S Ob V AO) 17 5 0 F O R MAT( 8I3 ) 18 5 1 F O R MAT( 8I5 ) 19 6 0 F O R MAT( 15HOTRUNGb B I NHbLAb , 10 . 2) 20 E N D 21 22 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 25
  27. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên 1 N Bảng 3: Tính trung bình cộng của một dãy số theo công thức X = ∑Xi . N i=1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 1 C H U O N G T R I NH TI NH TRUNG BI NH CONG 2 C T H A M S O KI CH THUOC VA LOAI T RUNG BI N 3 C M L T B 4 C K H O I D A U GI A TRI TONG VA CAI DEM 5 D E M X=0 6 T O N GX=0 7 C D O C B I A THAM SO 8 R E A D ( 5 , 1 0 0 ) X N , M L T B 9 C D O C X 10 R E A D( 5 , 100 ) X 11 C T A N G C A I DEM VA TI CH L UY TONG 12 D E M X=DEMX+1 13 T O N GX=TONGX+X 14 C X E M H E T X CHUA 15 I F ( D E M X . L T . X N ) G O T O 1 16 C T I N H T B C CUA X/ LNX 17 X T B =TONGX/ XN 18 C I N R A 19 W R I TE( 6 , 10 0 ) XTN 20 S T O P 21 1 0 0 F O R MAT( F15 . 5, I 2 ) 22 E N D 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 26
  28. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên N 1 2 Bảng 4: Tính độ lệch chuẩn theo công thức S = ∑()Xi − X k i=1 Gọi X(K) là số liệu thứ K, K = 1 đến N và XTB là giá trị trung bình cộng của X(K) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 1 C H U O N G T R I NH TI NH TRUNG BI NH CONG 2 C T H A M S O KI CH THUOC VA LOAI T RUNG BI N 3 C M L T B 4 C K H O I D A U GI A TRI TONG VA CAI DEM 5 D E M X=0 6 T O N GX=0 7 C D O C B I A THAM SO 8 R E A D ( 5 , 1 0 0 ) X N , M L T B 9 C D O C X 10 R E A D( 5 , 100 ) X 11 C T A N G C A I DEM VA TI CH L UY TONG 12 D E M X=DEMX+1 13 T O N GX=TONGX+X 14 C X E M H E T X CHUA 15 I F ( D E M X . L T . X N ) G O T O 1 16 C T I N H T B C CUA X/ LNX 17 X T B =TONGX/ XN 18 C I N R A 19 W R I TE( 6 , 10 0 ) XTN 20 S T O P 21 1 0 0 F O R MAT( F15 . 5, I 2 ) 22 E N D 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 27
  29. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Ví dụ 2: Tính trung bình cộng của một dãy số. Các số đều là số nguyên, không v−ợt quá 100, mỗi số 3 ký tự. Đục 8 số trên 1 bìa. Bìa đầu có kích th−ớc 80 của dãy (80 ký tự) (Bảng 2). 1 N Ví dụ 3: Tính trung bình cộng của một dãy số theo công thức X = ∑Xi . N i=1 (Bảng 3). N 1 2 Ví dụ 4: Tính độ lệch chuẩn theo công thức S = ∑()Xi − X k i=1 Gọi X(K) là số liệu thứ K, K = 1 đến N. XTB là giá trị trung bình cộng của X(K) (Bảng 4). Ví dụ 5: Tìm giá trị bé nhất MIN trong hai số X, Y cho tr−ớc. C CHUONG TRINH TIM GIA TRI CUA HAI SO X, Y C C MO TA LOAI BIEN REAL MIN C DOC DU LIEU VAO READ (5, 100) X, Y C GAN CHO MIN MOT TRONG HAI SO MIN = X C NEU KHONG DUNG THI DOI LAI GIA TRI KIA IF (MIN.GT.Y) MIN = Y C IN RA VA DUNG MAY WITE (6, 101) X, Y, MIN 101 FORMAT (1HO, 3E20.5) STOP END. Real (thực) thông báo MIN là biến thực. MIN.GT.Y là biểu thức logic ở đây “.GT.” là lớn hơn, lấy giá trị TRUE (đúng) nếu MIN > Y, nó là FALSE (sai) nếu MIN không lớn hơn Y. 28
  30. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên IF là chỉ thị kiểm tra điều kiện logic. Nếu biểu thức logic trong ngoặc đúng thì thực hiện chỉ thị đứng sau biểu thức logic rồi chuyển sang thực hiện chỉ thị sau IF, nếu biểu thức logic sai thì bỏ qua chỉ thị sau biểu thức logic và chuyển sang thằng chỉ thị sau IF. T− liệu đọc thêm 1. INTEGER Là số nguyên; DIMENSION DAY (80) là thông báo mô tả kích th−ớc mảng DAY, báo để ch−ơng trình dành cho mảng này 80 ký tự tối đa. DIMENSION (kích th−ớc) 2. WRITE (6, 49) không có danh sách biến vì chỉ in hằng ký tự ở FORMAT nhãn 49. H1 là ký hiệu kiểm tra, không in ra, chỉ nhắc rằng phải in những ký hiệu sau ở đầu trang mới (sang trang). 3. READ (5, 50) KT cho đọc kích th−ớc thực tế của mãng DAY. KT không đ−ợc v−ợt quá kích th−ớc tối đa cho phép ở DIMENSION. Đọc theo mã I3 ở quy cách 50 4. READ (5, 50) (DAY (I), I = 1,KT) cho đọc cả một mảng biến có chỉ số DAY (I). Chỉ số I tự động tăng từ 1 tới KT với b−ớc tăng 1. Quy cách đọc theo nhãn 50. Mỗi bìa ghi 8 số, mỗi số 3 ký tự. 5. WRITE (6, 51). In ra máy in từng dòng, mỗi dòng 8 số, mỗi số 5 ký tự (trừ số đầy có 4 ký tự), thừa để trắng bên tráu tức là canh phải của 5 ký tự. 6. DO 20 J = 1, KT là chỉ thị chu trình cho phép thực hiện KT lần chỉ thị 20 với giá trị của J tăng từ 1 đến KT. 7. Dấu / là dấu chia. Yếu tố của ngôn ngữ 2.4.5.1. Ký hiệu Ch−ơng trình viết bằng ngôn ngữ FORTRAN chỉ đ−ợc viết bằng những ký hiệu cơ sở, không đ−ợc chứa các ký hiệu ngoại lai nào khác. Ký hiệu cơ sở gồm: + Chữ cái: Chữ cái trong FORTRAN là các chữ latinh in hoa (đôi khi mở rộng ra với chữ cái nga in hoa) A B C D E F G H I J K L M N ∅ P Q R S T U V W X Y Z + Chữ số: Chữ số là các chữ số A rập: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 Để tránh nhầm lẫn chữ O phải viết là ∅, chữ I phải viết in để phân biệt với số 1, chữ Z phải viết th−ờng z để phân biệt với số 2. Tuy nhiên do thuận tiện và thói quen ng−ời ta vẫn viết O và Z. + Dấu đặc biệt: + Dấu Cộng * Dấu nhân Dấu lũy thừa . Dấu chấm - Dấu trừ / Dấu chia Dấu trống , Dấu phảy ( Dấu mở ) Dấu đóng = Dấu gán b Dấu trống ngoặc ngoặc Dấu . dùng với 4 nghĩa: - Là dấu thập phân thay cho dấu phảy. 29
  31. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên - Là dấu phân ly trong mã đặc tr−ng F6.2 - Là dấu ở phép logic .GT. là lớn hơn hay .EQ. là bằng - Là dấu chấm câu. Dấu = dùng theo nghĩa gán, muốn diễn tả sự bẳng nhau dùng phép so sánh quan hệ .ED. Tránh dùng ký hiệu ngoại lai nh−: π,∞,↑, Đ, Ơ,. . . Có thể mở rộng dấu đặc biệt nh−: ;, :, &, $ Ký hiệu thứ cấp gồm: Từ các ký hiệu cơ sở (sơ cấp) có thể tạo ra các ký hiệu thứ cấp - Trị logic .TRUE., .FALSE. - Quan hệ logic: .EQ., .NE., .LT., .LE., .GT., .GE. - Phép logic: .NOT., .AND., .OR. - Các từ khóa: CALL Gọi; COMMON Chung; COMPLEX Phức; CONTINUE Tiếp tục; DATA Dữ liệu; DIMENSION Kích th−ớc; DO Làm; DOUBLE PRECISION Chính xác kép; END Hết. Số từ khóa này nhiều hay ít tùy thuộc vào ch−ơng trình dịch. Từ khóa để xây dựng các chỉ thị, thông báo. Ngoài ra còn loại từ tự đặt do ng−ời lập ch−ơng trình đặt riêng cho minh dùng để ghi các tên gọi (biến, hàm, thủ tục, . . .) th−ờng là một dãy không quá 6 ký tự bắt đầu bằng chữ cái. Các từ khóa là từ riêng cho ngôn ngữ, phải viết trong ch−ơng trình theo đung quy tắc chính tả và ngữ pháp. Trong FORTRAN không đ−ợc viết: DIMENTION thay cho DIMENSION SUBPROGRAM thay cho SUBBROUTINE BOOLEN thay cho LOGICAL FUNKTION thay cho FUNCTION Các yếu tố FORTRAN có thể phân loại nh− sau: + Hằng các loại + Biến đơn và mang chỉ số + Biểu thức số học và logic + Chỉ thị gán số học và logic + Chỉ thị điều khiển + Chỉ thị vào ra + Hàm và ch−ơng trình con + Các thông báo Hằng. Mọi đại l−ợng xuất hiện trong ch−ơng trình d−ới dạng tr−ờng và không đổi khi chạy ch−ơng trình (chỉ lấy 1 giá trị) gọi là hằng (constant). Những đại l−ợng xuất hiện trong ch−ơng trình d−ới dạng ẩn (tên gọi) và có thể thay đổi giá trị khi chạy ch−ơng trình (đ−ợc gán giá trị khác) gọi là biến (variable). 30
  32. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Muốn chạy đ−ợc ch−ơng trình linh hoạt, vạn năng thì các tham số cần đ−a vào d−ới dạng biến hơn là hằng. Trong FORTRAN có các hằng sau: + Hằng nguyên (Integer) có mã I là dãy chữ số đi sau dấu + hoặc -. Số chữ số hạn chế, th−ờng không quá 11; tốt nhất để đảm bảo không mắc lỗi nên viết không quá 5, tuy nhiên có máy chấp nhận tới 20 chữ số. + Hằng thực (REAL) : Đ−ợc biểu diễn d−ới 2 dạng. - Dạng dấu chấm tĩnh hay mã F (fixe point) th−ờng không quá 9 chữ số viết giống nh− cách thông th−ờng, bắt buộc phải có dấu chấm (dấu thập phân) thay cho dấu phảy. Số thực nói chung chỉ đ−ợc biểu diễn xấp xỉ và chỉ gồm số hữu tỷ. Số π có thể viết 3.1416 3.0 biểu diễn trong máy tính bởi 2.9999999 hoặc 3.000001. phần nguyên của 3.0 do đó không xác định. - Dạng dấu chấm động hay mã E (floating point) có dạng chuẩn ±0.xxxxxxxE±xx X là chữ số bất kỳ. Phần tr−ớc E là định trị, có dạng mã F, E (Extent) thay cho cơ số 10, phần sau E là bậc; bậc là số mã I th−ờng không quá 2 chữ số. Dấu + ở định trị và ở bậc có thể hiểu ngầm. Nếu định trị có trị số tuyệt đối giữa o.1 và 1. nghĩa là chữ số ngay sau dấu thập phân khác số 0 thì số gọi là đ−ợc chuẩn hóa (phần nguyên bằng không) Có thể biểu diễn số thực theo mã F hay mã E. Mã F đơn giản, quen thuộc nh−ng mã E − việt hơn khi: Số quá lớn hoặc quá bé. Ví dụ 15000000000000000000 không thể biểu diễn bằng mã F, với mã E là 15E18, t−ơng tự 0,0000000000000001 đ−ợc viết là 1.E-16. Khi ch−a biết tr−ớc kết quả tính lớn hay bé nên biểu diễn theo mã E. + Hằng chính xác kép (Double precision) có độ dài gấp đôi hằng thực, chiếm hai đơn vị nhớ. + Hằng phức (Complex) có mã C biểu diễn bởi cặp số thực chỉ phần thực và phần ảo (hai đơn vị nhớ, mỗi phần một theo mã F hay mã E). A + bi biểu diễn bới (a, b). Ví dụ 2.7, 7.25) biểu diễn phức số 2,7 + 7,25i (3.E2, 1E-1) biểu diễn phức số 3.102 + 0,1i. Các phép tính đ−a về phép tính giữa phần thực và phần ảo. + Hằng logic (Logical) có mã L chỉ gồm 2 giá trị .TRUE. (đúng) và .FALSE. (sai). + Hằng ký tự (Holerit) có mã H có dạng:nHxxx xxx hay xxx .xxx X là các ký hiệu cơ sở, có n ký hiệu cơ sở x. các ký tự trống trong mã H vẫn phải tính. Hằng ký tự th−ờng dùng để biên tập các thông báo, thuyết minh, kết quả. Biến. Biến là một đại l−ợng có tên, có thể thay đổi giá trị khi chạy ch−ơng trình. Tên biến đồng thời là địa chỉ của đơn vị nhớ chứa giá trị biến Tên biến là một dạy các chữ cái và chữ số, bắt đầu bằng chữ cái và không quá 6 ký tự viết liền nhau (không có dấu cách). 31
  33. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Biến phải đ−ợc mô tả ví dụ: INTEGER CCAO hay REAL TONG, mỗi biến không thể có mặt ở 2 thông báo mô tả loại. Trong FORTRAN có các loại biến sau: + Biến nguyên và thực. Nếu tên biến đ−ợc bắt đầu bằng một trong các chữ cai I, J, K, L, M, N thì đó là biến nguyên, ngoài ra là biến thực. + Biến chính xác kép (DOUBLE PRECISION). + Biến phức (COMPLEX). + Biến logic (Logical) chỉ gồm 2 giá trị .TRUE. (đúng) và .FALSE. (sai). Mảng. Biến có thể có chỉ số (viết trong dấu ngoặc đơn), tập hợp thành mảng. Mỗi phần tử của mảng ứng với một giá trị của chỉ số. Số giá trị của chỉ số gọi là kích th−ớc của mảng, số chỉ số gọi là chiều của mảng. Mảng A gồm n hàng, m cột đ−ợc viết là (A(n, m) Mảng X là mảng 1 chiều kích th−ớc 3: X(1) X(2) X(3) Mảng A là mảng 2 chiều kích th−ớc 3: A(1,1) A(1,2) A(1,3) A(2,1) A(2,2) A(2,3) Tên biến và tên mảng theo quy cách gọi tên và xác định loại. Mỗi hàng, mỗi cột là mảng 1 chiều. (A(1, J), J=1,3) là hàng 1 gồm A(1,1) A(1,2) và A(1,3). (A(I, 2), I = 1, 2) là cột 2 gồm A(1,2) và A(2,2) Mảng phải đ−ợc thông báo kích th−ớc bởi thông báo DIMENSION (kích th−ớc) để ch−ơng trình dịch biết dành vùng nhớ chứa mảng đó. Ví dụ DIMENSION X(3), A(2,3) Mảng X là mảng 1 chiều kích th−ớc 3 còn mảng A là mảng 2 chiều kích th−ớc 3. Quy cách vào, ra. Các biến có thể đ−ợc gán một giá trị (các hằng) và đ−ợc đọc hay in ra phải dùng các mã đặc tr−ng để giải mã các dữ liệu của biến (hay hằng) đó Iw là mã đặc tr−ng số nguyên có w ký tự. Fw.d là mã đặc tr−ng số thực dấu phảy tĩnh có w ký tự, có d số lẻ. Ew.d là mã đặc tr−ng dấu phảy động có w ký tự có d số lẻ. Hàm mẫu ABS(X) là hàm ⏐X⏐ SQRT(X) là hàm X ALOG(X) là hàm lnX SIN(X) là hàm sinX COS(X) là hàm cosX EXP(X) là hàm eX ATAN(X) là hàm acrtgX 2.4.5.7. Biểu thức logic và các quan hệ .EQ. = .NE. ≠ .GT. > .GE. ≥ .LT. < .LE. ≤ .NOT. Không .AND. Và .OR. Hoặc Chỉ thị gán số học na = b n là nhãn (nếu có) của chỉ thị. a tên biến b biểu thức số học Chuyển điều khiển 32
  34. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Có các chỉ thị GOTO, IF, DO, CONTINUE, PAUSE, STOP, END, CALL, RETURN, READ, WRITE n GO TO m nghĩa là: n là nhãn (nếu có) của bản thân chỉ thị, GO TO là chuyển tới, m là nhãn của chỉ thị sẽ thực hiện ngay sau đó. n GO TO (n1, n2, . . .nk), i nghĩa là: n là nhãn (nếu có) của bản thân chỉ thị, GO TO là chuyển tới, nj(j = 1 . . . k) là nhãn của chỉ thị có trong ch−ơng trình (th−ờng k ≤ 10), i biến nguyên không dấu, không chỉ số. Biến i khi gặp GO TO sẽ tính, có giá trị j thì chuyển tới chỉ thị có nhãn nj. n IF (e) n1, n2, n3 nghĩa là: n là nhãn (nếu có) của bản thân chỉ thị, IF là nếu, e là biểu thức số học hoặc biểu thức logic, n1, n2, n3 là nhãn chỉ thị có trong ch−ơng trình. n DO m i=j, k, l nghĩa là n là nhãn (nếu có) của bản thân chỉ thị, DO là làm. i, j, k, l là các hằng hoặc biến nguyên không dấu, không chỉ số. i là biến chỉ số hay biến điều khiển đóng vai trò đếm vòng lặp, không đ−ợc là hằng. j là cận d−ới hay giá trị ban đầu cuả i (ban đầu i = j). k là cận trên (thực hiện DO đến khi i ≤ k). l là b−ớc lặp hay số gia (i = i + l. nếu l = 1 thì không cần ghi). m là nhãn của chỉ thị cuối phạm vi tác dụng của DO. n CONTINUE là chỉ thị giả (không làm gì cả). Gặp chỉ thị này chỉ việc chuyển sang chỉ thị tiếp theo (th−ờng dùng cuối phạm vi DO). END nghĩa là hết là thông báo cuối cùng của mọi ch−ơng trình nguồn (kể cả ch−ơng trình con) chỉ có tác dụng báo cho ch−ơng trình dịch đó là chỗ cuối ch−ơng trình nguồn. Khi gặp END máy sẽ báo hiệu dịch xong ch−ơng trình t−ơng ứng. STOP nghĩa là đứng, khi gặp chỉ thị này máy sẽ dừng chờ ng−ời thao tác điều khiển và nếu tiếp tục thi bắt đầu lại từ đầu. PAUSE nghĩa là nghỉ t−ơng tự nh− STOP nh−ng khác là ấn nút CHAY thi máy tiếp tục thực hiện ch−ơng trình. READ (m, n) dsb nghĩa là đọc từ thiết bị m (kênh vào), quy cách n (ghi nhãn của thông báo FORMAT t−ơng ứng) và gán cho danh sách biên dsb. WRITE (m, n) dsb nghĩa là viết ra thiết bị m (kênh ra) danh sách biến dsb với quy cách n (ghi nhãn của thông báo FORMAT t−ơng ứng). In ra Mã I thì số đ−ợc in ra dồn về bên phải, thừa thì để trắng, thiếu chõ in thì số bị cắt đầu (mất các số bên trái) hoặc in báo sai. Mã F thì số đ−ợc in dồn về phải dấu, xác định tùy theo d, số lẻ đ−ợc quy tròn, dấu + không in, thừa để trắng bên trái Mã A thì sẽ in dồn về phía phải (nếu w≥ c), thừa để trắng bên trái w – c ký tự. Nếu w < c thì chỉ in ra w ký tự bên trái (đầu số) đuôi bị cắt. Mã H thì in ra các thông báo, tiêu đề, thuyết minh. Mã X dùng để bỏ trắng n vị trí ở dòng in ra 33
  35. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Ch−ơng 3 : các thuật toán cơ bản dùng trong hóa học 3.1. tính lặp 3.1.1. Vòng lặp có số b−ớc xác định FOR. . . TO Một trong những thuật toán quan trọng nhất của máy tính là vòng lặp dùng để lặp đi lặp lại một phép tính hoặc một nhóm các phép tính nào đó. PASCAL có một số toán tử lặp gọn gàng hơn nhiều so với việc dùng IF . . . THEN . . . nh− trên. Cấu trúc lệnh: FOR Biến_điều_khiển:=Giá_trị_đầu TO Giá_trị_cuối Do FOR Biến_điều_khiển:=Giá_trị_đầu DOWTO Giá_trị_cuối Do hoặc FOR Biến_điều_khiển:=Giá_trị_đầu TO Giá_trị_cuối Do BEGIN Câu lệnh 1; . . . . . . Câu lệnh n; END; Ví dụ 1: a:=0; b:=1; c:=2; FOR i:=1 to 5 do Begin a:=a+ i; b=b+i; c=(c+b+a)/i; end; Việc thực hiện lệnh gán các biến a, b, c sẽ đ−ợc lặp lại từ giá trị của i bằng 1 (a = 1; b = 2; c = 5) sau đó tăng i lên 1 đơn vị (i=2) và thực hiện lệnh gán các biến a, b, c (a = 3; b = 4; c = 6) sau đó tiếp tục tăng i lên 1 đơn vị i= 3 và i = 4 và cho đến giá trị của i bằng 5 thì thực hiện xong các lệnh gán thì thoát ra khỏi vòng lặp. 34
  36. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Ví dụ2: Đoạn ch−ơng trình tính tổng n số nguyên đầu tiên . . . Sum:=0; For i:=1 to n do sum:=sum+i; Sum:=0; For i:=1 to n do if (i mod 2 = 0) then sum1:=sum1+i else sum2:=sum2+i; . . . Ví dụ 3: Đoạn ch−ơng trình tìm cực đại của một dãy số . . . Amax:=a[1]; i:=1; imax:=1; Repeat If (a[i]>amax) then Begin amax:=a[i]; imax:=i; end; i:=i+1; Until i>n; . . . Ví dụ 4: Đoạn ch−ơng trình nhập giá trị các phần tử của một dãy số . . . for i:=1 to n do begin write('nhap gia tri cua a[',i,'] '); readln(a[i]); end; . . . Ví dụ 5: Đoạn ch−ơng trình tính trung bình một dãy số . . . Sum:=0; 35
  37. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên for i:=1 to n do sum:=sum+a[i]; atb:= sum/n; . . . Ví dụ 6: Đoạn ch−ơng trình sắp xếp thứ tự các phần tử của một dãy số . . . for k:=1 to n do begin amax:= a[k]; imax := k; for i:= k+1 to n do if a[i]>amax then begin amax:=a[i]; imax:=i; end; tampon:=a[k]; a[k]:=a[imax]; a[imax]:=tampon; end; . . . Ví dụ 7: Đoạn ch−ơng trình viết một ma trận bậc nxn. . . . For k:=1 to n do Begin For j:=1 to n do write(a[k,j]:10:4); Writeln; End; . . . 3.1.2. Vòng lặp có số b−ớc lặp không xác định REPEAT và WHILE Đôi khi FOR không dùng đ−ợc vì ng−ời ta không biết đích xác lúc nào cần ra khỏi vòng lặp tức là ch−a biết n. Lúc đó cần sử dụng các vòng lặp bất định nh− REPEAT . . . UNTIL . . .hoặc WHILE . . . DO. . . Cấu trúc lệnh REPEAT . . . UNTIL. . . REPEAT ; UNTIL ; 36
  38. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Việc thực hiện hoặc nằm giữa REPEAT và UNTILl sẽ đ−ợc lặp lại cho đến khi biểu thức logic thoả mãn. Ví dụ 1: Đoạn ch−ơng trình tính tổng các số chẵn và tổng các số lẻ trong một dãy n số nguyên đầu tiên . . . i:=1; sum1:=0; sum2:=0; Repeat if (i mod 2 =0) then sum1:=sum1+a[i] else sum2:=sum2+a[i]; i:=i+1; Until i>=n; . . . Cấu trúc CASE OF Trong những tr−ờng hợp cần điều khiển ch−ơng trình theo nhiều h−ớng khác nhau thì toán tử IF THEN trở nên không có hiệu quả. PASCAL sử dụng CASE . . . OF . . .Cấu trúc của toán tử CASE . . . OF. . . có dạng: CASE i OF i=1: Begin Các câu lệnh 1 End; i=2: Begin Các câu lệnh 2 End; ELSE Begin Các câu lệnh 3 End; End; 37
  39. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Cấu trúc lệnh WHILE . . . DO WHILE DO BEGIN ; END; Nếu biểu thức logic đúng thì thực hiện ; 3.1.3. Lệnh nhảy vô điều kiện GO TO Dạng tổng quát: GOTO nhãn; D−ới tác động của toán tử này ch−ơng trình chuyển đến nhãn (đã đ−ợc xác định bằng LABEL). Ví dụ 1: LABEL 10; . . . GOTO 10; . . . 10: x2 := x1; 3.2. giải hệ ph−ơng trình tuyến tính 3.2.1. Ph−ơng pháp khử Gauss Khử Gauss là một ph−ơng pháp đơn giản và dễ hiểu về thuật toán để tính định thức của ma trận cũng nh− giải hệ ph−ơng trình tuyến tính. Giả sử có hệ n ph−ơng trình tuyến tính n ẩn số a11x1 + a12x2 + + a1nxn = a1(n+1) (A1) a21x1 + a22x2 + + a2nxn = a2(n+1) (A2) an1x1 + an2x2 + + annxn = an(n+1) (An) sau khi thực hiện phép khử Gauss sẽ chuyển thành dạng x1 + b12x2 + + b1nxn = b1(n+1) (B1) x2 + + b2nxn = b2(n+1) (B2) xn = bn(n+1) (Bn) 38
  40. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Cách biến đổi nh− sau: Thoạt tiên ta khử x1 bằng cách chia cả hai vế của ph−ơng trình thứ nhất cho a11 x1+ a12(1) x2 + + a1n(1)xn = a1(n+1)(1) (3.1) hoặc x1 + b12 x2 + + b1nxn = b1(n+1) (B1) trong đó a1j(1) = a1j / a11 = b1j Thay giá trị của x1 ví dụ vào ph−ơng trình thứ hai ta có: a21(a1(n+1)(1) - a12(1)x2 + + a1n(1)xn) + a22x2 + + a2nxn = a2(n+1) (a22 – a21a12(1))x2 + + (a2n – a21a1n(1)xn = a2(n+1) – a21a1(n+1) D−ới dạng tổng quát khi thay vào ph−ơng trình thứ m ta có: (am2 – am1a12(1))x2 + + (amn – am1a1n(1)xn = am(n+1) – am1a1(n+1)m=2, n (3.2) Đây chính là hệ n-1 ph−ơng trình mới không chứa ẩn x1. Tiếp tục thực hiện việc khử x2 trong hệ n-1 ph−ơng trình mới này theo cách tính toán t−ơng tự ta sẽ đ−ợc hệ n-2 ph−ơng trình không chứa ẩn x1 và x2 v.v đoạn ch−ơng trình máy tính của cách khử này có dạng i:=1; For k:=i to n+1 do a[i,k]:=a[i,k]/a[i,i]; (*chia 2 vế cho aii: pt(3.1)*) For m:=i+1 to n do For k:=i+1 to n+1 do a[m,k]:=a[m,k]-a[m,i]*a[i,k]; (* pt (3.2) *) Đến đây chúng ta chỉ việc thực hiện một vòng lặp theo i, bắt đầu từ i=1 đến i=n-1, tức là for i:=1 to n do begin For k:=i to n+1 do a[i,k]:=a[i,k]/a[i,i]; (* xác dịnh các (Bi) *) If i=n then goto 1; For m:=i+1 to n do For k:=i+1 to n+1 do a[m,k]:=a[m,k]-a[m,i]*a[i,k]; End; 1: x[n]:=a[n,n+1]; (* t−ơng ứng với pt (Bn)*) ta đ−ợc lời giải xn. Dựa vào ph−ơng trình Bn-1 ta sẽ tính đ−ợc xn-1, sau đó dựa vào Bn-2 để tính xn-2 dựa vào B1 để tính x1. Tức là: 39
  41. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên for i:=n-1 down to 1 do begin sum:=0; for k:=i+1 to n do sum:=sum+a[i,k]*x[k]; x[i]:=a[i,n+1]-sum; end; Ch−ơng trình con procedure GHPTTT (xem phụ lục) dựa trên thuật toán đã trình bày ở trên. D−ới đây là phần ch−ơng trình dẫn. Program HePTTT; Type M2 = array [1 10,1 10] of real; M1 = array [1 10] of real; var i , j, k : integer; kk,ak,test : real; f1 : text; B : m2 XX : m1; Procedure GHPTTT(n:integer; A:m2; VAR X:m1); begin end; BEGIN ASSIGN(f1,'matran'); (* mở tệp dữ liệu và đọc*) REWRITE(f1); Read(f1,n); for i := 1 to n do begin for k:= 1 to n +1 do begin read(f1,B[i,k]); AA(i,k):=B(i,k); readln(f1); end; end; 40
  42. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên GHPTTT(n,B,XX); writeln(' Thu lai nghiem cua phuong trinh'); for i:=1 to n do begin test:= 0; for j:=1 to n do test:= AA[i,j]*XX[j]+test; writeln('test:=':15,test:10:4,' AA[',i,'n+1]:=',AA[i,n+1]:10:4); end; END. Bài tập 1: Hoàn chỉnh ch−ơng trình giải hệ ph−ơng trình tuyến tính. Sử dụng ch−ơng trình lập đ−ợc giải hệ ph−ơng trình duới đây + 5x2 - x3 + 2x4 = 14.0 3x1 2x1 - 5x2 - 2x3 - 2x4 = -14.0 5x1 + 2x2 + x3 - x4 = 8.0 5x1 - 5x2 + x3 + x4 = 8.0 Bài tập 2: Trong tr−ờng hợp có những hệ số của hệ ph−ơng trình bằng 0 hoặc qúa nhỏ, nếu không quan tâm đến thì máy sẽ báo lỗi khi gặp phép chia cho aii =0. Hãy lập trình xếp lại thứ tự các ph−ơng trình trong hệ ph−ơng trình để khắc phục sự cố này. 3.2.2. Tính định thức ma trận Ph−ơng pháp khử Gauss cũng dùng để tính định thức của ma trận theo cùng nguyên tắc nh− đã trình bày ở trên. Ma trận A bậc nìn có dạng: ⎡a11 a12 a13 a1n ⎤ ⎢ ⎥ ⎢a21 a22 a23 a2n ⎥ ⎢a31 a32 a33 a3n ⎥ ⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎣an1 an2 an3 ann ⎦ Sau khi thực hiện phép khử Gauss ta đ−ợc ma trận A* 41
  43. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên ⎡a11 a12 a13 a1n ⎤ ⎢ (1) (1) (1) ⎥ ⎢ 0 a22 a23 a2n ⎥ (2) (2) ⎢ 0 0 a a3n ⎥ ⎢ 33 ⎥ ⎢ . ⎥ ⎢ (n −1) ⎥ ⎣ 0 0 0 ann ⎦ Trong đó chỉ số trong dấu ngoặc đơn là số lần thực hiện phép khử. Ví dụ (1) a22 là hệ số của ph−ơng trình 2 sau khi khử biến x1. Vì quá trình biến đổi Gauss không làm thay đổi giá trị của định thức của ma trận nên n (i −1) det(A) = det(A*) = ∏aii i =1 Ch−ơng trình tính định thức của ma trận t−ơng tự ch−ơng trình giải hệ ph−ơng trình tuyến tính. đoạn ch−ơng trình máy tính có dạng Det:=1.0; for i:=1 to n do begin sk:=a[i,i]; det:=det*sk; For k:=i to n do a[i,k]:=a[i,k]/sk; If i=n then goto 1; For m:=i+1 to n do For k:=i+1 to n do a[m,k]:=a[m,k]-a[m,i]*a[i,k]; End; 1: writeln ('detA=',det); Bài tập 3: Hoàn thành procedure tính định thức, viết tệp dẫn và tính định thức của một số ma trận khác nhau đ−ợc ghi trong tệp 'data' 3.2.3. Tính tích hai ma trận Cho hai ma trận A và B có kích th−ớc (n1, n2) và (n3, n4). Các phần tử của ma trận tích C= A.B đ−ợc tính theo công thức: C[]i,j = ∑ A [i,k ]ì B[k,j] i =1, n1 k =1, n2=n3 j=1, n4 k=1 Điều kiện để tính đ−ợc tích hai ma trận là n =n . đoạn ch−ơng trình máy 2 3 tính: for i:=1 to n1 do 42
  44. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên for j:=1 to n4 do begin sum:=0; for k:=1 to n2 do sum:=sum+A[i,k]*B[k,j]; C[i,j]:=sum; end; Bài tập 4: Hoàn chỉnh procedure tính tích hai ma trận không vuông. Lập trình tính tích hai ma trận và dùng để tính hai tích ma trận d−ới đây: ⎡5 2 2⎤ ⎡5 2 2⎤ ⎡1 3 5⎤ ⎢ ⎥ ⎡1 3⎤ ⎢ ⎥ ⎢ ⎥ 4 1 3 A = 4 1 3 ì 4 2 2 B = ⎢ ⎥ ì ⎢4 2⎥ ⎢ ⎥ ⎢ ⎥ ⎢1 2 1⎥ ⎢ ⎥ ⎣⎢1 2 1⎦⎥ ⎣⎢1 1 2⎦⎥ ⎢ ⎥ ⎣⎢1 1⎦⎥ ⎣3 1 2⎦ 3.2.4. Tính ma trận nghịch đảo Theo định nghĩa thì tích một ma trận với ma trận nghịch đảo của nó chính bằng ma trận đơn vị E, tức là: BxB-1 = E (3.3) Nếu gọi ma trận nghịch đảo của B là C thì ta có thể viết lại (3.3) d−ới dạng ⎡b11 b12 b1n ⎤ ⎡c11 c12 c1n ⎤ ⎡ 1 0 0⎤ ⎢ ⎥ ⎢ ⎥ b b b c c c ⎢ 0 1 0⎥ ⎢ 21 22 2n ⎥ ì ⎢ 21 22 2n ⎥ = ⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎣bn1 bnn ⎦ ⎣cn1 cnn ⎦ ⎣ 0 0 1⎦ Dễ dàng nhận thấy rằng chúng ta có thể tách ph−ơng trình (3.3) thành n hệ ph−ơng trình tuyến tính, ví dụ với hệ ph−ơng trình thứ nhất ta có: ⎡b11 b12 b1n ⎤ ⎡c11 ⎤ ⎡1 ⎤ ⎢ ⎥ ⎢ ⎥ b b b c ⎢0 ⎥ ⎢ 21 22 2n ⎥ ì ⎢ 21 ⎥ = ⎢ ⎥ (3.4) ⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎣bn1 bnn ⎦ ⎣cn1 ⎦ ⎣0 ⎦ Các hệ ph−ơng trình còn lại chỉ khác với hệ ph−ơng trình đầu tiên ở vị trí của số 1 trong véc tơ bên phải, t−ơng ứng với số thứ tự cột trong ma trận đơn vị của ph−ơng trình (3.3). Nh− vậy, để xác định các phần tử của ma trận nghịch đảo C chúng ta chỉ việc giải lần l−ợt các hệ ph−ơng trình (3.4). Thuật toán có dạng: For icot:=1 to n (* vòng lặp theo các cột của ma trận đơn vị*) Begin (* xác định véctơ cột của ma trận đơn vị e *) 43
  45. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên For I:=1 to n do For k:=1 to n do B[I,k]:=A[I,k]; For ihang:= 1 to n do if ihang=icot then e[ihang]:=1.0 else e[ihang]:=0; (* đặt A[ihang,n+1] bằng E[ihang] *) for ihang:= 1 to n do A[ihang,n+1]:=E[ihang]; GHPTTT(n,B, X); *( giải hệ ph−ơng trình tuyến tính*) For ihang:=1 to n do C[ihang,icot]:=X[ihang]; End; Chú ý: có thể là procedure GHPTTT sẽ không làm thay đổi ma trận hệ số B. Lúc đó việc gán lại A cho B tr−ớc mỗi lần giải hệ ph−ơng trình tuyến tính trở nên không cần thiết. D−ới đây là ch−ơng trình dẫn tính nghịch đảo ma trận Program tinhmatran_nghichdao; Type M2 = array [1 10,1 10] of real; M1 = array [1 10] of real; var i,k,n,m : integer; f1 : text; A,B,C,E : m2; tentep : string; procedure DMT(tentep: string); begin end; procedure VMT(n,m:integer;A:m2); begin end; 44
  46. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên procedure TMT(n:integer; A,B: m2; VAR C:m2); begin end; procedure GHPTTT2(n: integer;A:m2; VAR XX:m1); begin end; (* het giai he pt tuyen tinh*) Procedure NDMT1(n:integer; B:m2; VAR C:m2); begin end; BEGIN write(' nhap ten tep '); readln(tentep); DMT(tentep); VMT(n,m,A); NDMT1(n,A,C); (* thử lại kết quả *) writeln('ma tran nghich dao '); VMT(n,n,C); TMT(n,A,C,E); writeln(' ma tran bxc='); VMT(n,n,E); readln; END. Bài tập 5: Hoàn thiện procedure NDMT1 và program tinhmatran_nghichdao . Sử dụng ch−ơng trình lập đ−ợc để tính ma trận nghịch đảo của ma trận sau: ⎡3 2 2 4⎤ ⎢4 1 2 5⎥ A = ⎢ ⎥ ⎢3 2 1 3⎥ ⎢ ⎥ ⎣5 1 2 4⎦ 45
  47. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên 3.2.5. Chéo hoá ma trận écmit Ma trận écmit Ma trận A đ−ợc gọi là écmit nếu nó là đối xứng A = AT (AT là ma trận chuyển vị của A) và các phần tử đều thực. Ma trận écmit có n số thực λ1, λ2, λ3, .λn và n vectơ thực t−ơng ứng với chúng X1, X2, X3, Xn đ−ợc gọi là các véctơ riêng. Nh− vậy A Xi = λi Xi Ma trận chéo Ma trận D đ−ợc gọi là ma trận chéo nếu : Dij = 0, i≠j . Trị riêng của ma trận chéo là các phần tử chéo của nó λi= Dii. Ví dụ: Có ma trận ⎡1.23 0 0 ⎤ ⎢ ⎥ D = ⎢ 0 4.56 0 ⎥ λ1=1.23 λ2=4.56 λ3=7.89 ⎣⎢ 0 0 7.89⎦⎥ Ph−ơng trình đặc tr−ng có dạng: (1.23-λ) (4.56-λ) (7.89-λ) = 0 Ma trận trực giao Ma trận nìn đ−ợc gọi ma trận trực giao nếu ma trận nghịch đảo của nó trùng với ma trận chuyển vị MT = M-1 . Ví dụ: ⎡1 0 0 ⎤ ⎢ ⎥ ⎢0 cosθ sin θ⎥ ⎣⎢0 − sin θ cosθ⎦⎥ là ma trận trực giao, bởi vì: MT M = E ⎡1 0 0 ⎤ ⎡1 0 0 ⎤ ⎡1 0 0⎤ ⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢0 cosθ − sin θ⎥ ì ⎢0 cosθ sin θ⎥ = ⎢0 1 0⎥ ⎣⎢0 sin θ cosθ ⎦⎥ ⎣⎢0 − sin θ cosθ⎦⎥ ⎣⎢0 0 1⎦⎥ Chéo hoá ma trận Chéo hoá ma trận là quá trình biến đổi trực giao một ma trận A thành ma trận chéo B B = RTA R 46
  48. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên ⎡0 1⎤ Ví dụ, để chéo hoá ma trận A , ⎢ ⎥ chúng ta dùng ma trận R2 ⎣1 0⎦ ⎡cosθ sin θ ⎤ 0 = ⎢ ⎥ với θ = 45 . Quá trình chéo hoá xảy ra nh− sau: ⎣sin θ − cosθ⎦ ⎡cosθ sin θ ⎤ ⎡0 1⎤ ⎡sin θ cosθ ⎤ ⎢ ⎥ ì ⎢ ⎥ ì ⎢ ⎥ = ⎣sin θ − cosθ⎦ ⎣1 0⎦ ⎣cosθ − sin θ⎦ ⎡⎤⎡⎤sinθθ cos cos θθ sin⎡⎤2sinθθ cos sin22 θ− cos θ ⎡⎤ 1 0 ìì = ⎢⎥⎢⎥⎢⎥22 ⎢⎥ ⎣⎦⎣⎦−−cosθθ sin sin θ cos θ⎣⎦sinθθ−− cos 2sin θθ cos ⎣⎦ 0 − 1 Ma trận R th−ờng đ−ợc gọi là ma trận quay. Biến đổi trực giao - ph−ơng pháp Jacobi Trừ truờng hợp chéo hoá ma trận écmit 2x2 đã trình bày ở trên, việc biến đổi trực giao ma trận A có bậc ≥3 để thu đ−ợc một ma trận chéo theo ph−ơng pháp Jacobi đ−ợc thực hiện bởi hàng loạt toán tử B = MT A M trong đó ma trận M là ma trận trực giao. Thuật toán sử dụng cách tính lặp bằng các ma trận M t−ơng ứng lần l−ợt đ−a về 0 phần tử nào không nằm trên đ−ờng chéo chính có giá trị tuyệt đối lớn nhất cho đến khi hội tụ; tức là không còn phần tử nào không nằm trên đ−ờng chéo chính có giá trị tuyệt đối lớn hơn một số epsilon nào đó. Do kết quả của toán tử, một trong các phần tử không nằm trên đ−ờng chéo của A sẽ trở về 0. Sau đó chọn một ma trận M thứ hai, lại đ−a thêm một phần tử nữa về 0 và cứ thế tiếp tục cho đến khi nhận đ−ợc ma trận chéo D T T T T Mr M3 M2 M1 A M1 M2 M3 Mr = D hay ST A S = D T T Kí hiệu S và S biểu diễn tích các ma trận Mi và Mi trong quá trình lặp nói trên. Các phần tử nằm trên đ−ờng chéo chính của D xác định trị riêng của ma trận. Các véc tơ cột của ma trận S xác định véc tơ riêng t−ơng ứng. Có thể minh hoạ thuật toán nh− sau: Giả sử cần chéo hoá ma trận A bậc ba đối xứng: 47
  49. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên ⎡0 1 0⎤ ⎢ ⎥ A= ⎢1 0 1⎥ ⎣⎢0 1 0⎦⎥ Ta sử dụng ma trận quay, ví dụ để đ−a phần tử a12 về 0. Muốn vậy, cần xác lập một ma trận quay bậc 3 (R3) dựa trên ma trận quay bậc 2 (R2) nêu trên ⎡cosθ sin θ 0⎤ ⎢ ⎥ ⎢sin θ − cosθ 0⎥ ⎣⎢ 0 0 1⎦⎥ tác dụng lên các phần tử a12, a21 và a11, a22. Góc quay θ đ−ợc xác định từ hệ thức: tan2θ = 2aij/(aii-ajj ) trong đó aij là phần tử không nằm trên đ−ờng chéo chính ta muốn đ−a về 0, aii và ajj là các phần tử nằm trên đ−ờng chéo chính t−ơng ứng. Với tr−ờng hợp đang xét, tan2θ = 2.1/0 = ∝ và θ = 450 , sinθ= cosθ = 0.7071. Quá trình đ−a phần tử a12 về 0 nh− sau: ⎡cosθ sin θ 0⎤ ⎡0 1 0⎤ ⎡cosθ sin θ 0⎤ ⎡ 1 0 0.707⎤ ⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢sin θ − cosθ 0⎥ ì ⎢1 0 1⎥ ì ⎢sin θ − cosθ 0⎥ = ⎢ 0 −1 − .707⎥ ⎣⎢ 0 0 1⎦⎥ ⎣⎢0 1 0⎦⎥ ⎣⎢ 0 0 1⎦⎥ ⎣⎢0.707 − 0.707 0 ⎦⎥ Bây giờ phần tử có giá trị tuyệt đối lớn nhất sẽ là a13, a31 hoặc a23 và a32. Nếu chọn a13 và a31 để đ−a về 0 thì ma trận quay R3 mới sẽ có dạng ⎡cosθ 0 sin θ ⎤ ⎢ ⎥ ⎢ 0 1 0 ⎥ ⎣⎢sin θ 0 − cosθ⎦⎥ tang2θ = 2. 0.7071/(1-0) = 1.4142; cosθ = 0.888074; sin θ = 0.4597008. Qúa trình đ−a a31 và a13 về 0 diễn ra nh− sau: ⎡cosθ 0 sin θ ⎤ ⎡ 1 0 0.707⎤ ⎡cosθ 0 sin θ ⎤ ⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢ 0 1 0 ⎥ ì ⎢ 0 −1 − .707⎥ ì ⎢ 0 1 0 ⎥ ⎢sin θ 0 − cosθ⎥ ⎢0.707 − 0.707 0 ⎥ ⎢sin θ 0 − cosθ⎥ ⎣ ⎦ ⎣ ⎦ ⎣ ⎦ ⎡ 1.366 − 0.32506 0 ⎤ ⎢ ⎥ ⎢− 0.32506 −1 0.627963⎥ ⎣⎢ 0 0.627963 − 0.366 ⎦⎥ Nh− vậy, mặc dù các phần tử đ−ợc đ−a về 0 ở b−ớc 1 thì sau b−ớc 2 lại có giá trị khác 0 nh−ng giá trị tuyệt đối của phần tử lớn nhất không nằm trên đ−ờng 48
  50. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên chéo chính đã giảm đi rõ rệt. Nếu tiếp tục lặp lại quá trình này, chúng ta sẽ thu đ−ợc ma trận chéo. Trong thuật toán trên cần một số procedure để xác định phần tử lớn nhất không nằm trên đ−ờng chéo chính, ma trận quay Rn, tích ma trận và tích ma trận hàng với ma trận cột. D−ới đây là đoạn ch−ơng trình máy tính. Tìm phần tử có giá trị tuyệt đối lớn nhất không nằm trên đ−ờng chéo chính Amax:=abs(a[1,2]); imax:= 1; kmax:=2; For i:=1 to n do For k:=I+1 to n do if abs(a[i,k])>amax then Begin Amax:=a[i,k]; imax:=i; kmax:=k; End; Xác lập ma trận quay Rn For I:=1 to n do { tr−ớc hết là xác lập một ma trận đơn vị } For k:=1 to n do if I=k then R[I,k]:=1.0 else R[I,k]:=0.0; (* chọn phần tử có giá trị tuyệt đối lớn nhất không nằm trên đ−ờng chéo chính *) FMAX(n,A, imax,kmax); (* xác định góc quay teta *) da:=A[imax,imax] - A[kmax,kmax]; if da <>0 then begin tan2teta:= 2*A[imax,kmax]/da; teta:= arctan(tan2teta)/2; sinteta:=sin(teta); costeta:=cos(teta); end else begin sinteta :=1/sqrt(2); costeta:=sinteta; end; 49
  51. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên (* xác định ma trận R *) R[imax,kmax]:=sinteta; R[kmax,imax]:=sinteta; R[imax,imax]:=costeta; R[kmax,kmax]:=-costeta; Tích ma trận hàng với ma trận cột để kiểm chứng quá trình chéo hoá : ASi = λiSi trong đó S là ma trận quay tích luỹ ( tức là tích của các ma trận quay trong quá trình lặp) và λ là các phần tử nằm trên đ−ờng chéo chính của ma trận chéo nhận đ−ợc. for j:=1 to n do begin for i:=1 to n do begin sum:=0; for k:=1 to n do sum:=sum+a[i,k]*s[k,j]; lamdax:=lamda[j]*s[i,j]; writeln(sum:15:4,lamdax:15:4,'':5,sum-lamdax:10); end; writeln; end; 3.3. các bμi toán hồi quy Trong thực nghiệm hoá học, để có thể đánh giá độ tin cậy, cũng nh− cung cấp dữ liệu cho các quá trình tính toán công nghệ, việc biểu diễn hệ dữ liệu d−ới dạng hàm xấp xỉ là rất cần thiết. Trên thực tế, có rất nhiều phần mềm có thể sử dụng cho công việc này. Tuy vậy, trong khuôn khổ của một giáo trình hoá tin cơ sở, việc tìm hiểu thuật toán và đoạn ch−ơng trình máy tính của các procedure cơ bản và thông dụng cũng là rất cần thiết đối với sinh viên. Chúng ta sẽ nghiên cứu một số bài toán hồi quy cơ bản sau đây: +) Đa thức 1 biến (bao gồm tuyến tính khi đa thức bậc 1) 50
  52. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên +) Tuyến tính nhiều biến +) Phi tuyến nhiều biến. Nguyên tắc chung của các ph−ơng pháp này là tìm cực tiểu hàm số liên hệ giữa các tham số aj j=1, n của mô hình y=F(a1, a2, am; x1, x2 , xn) với giá trị n 2 quan sát đ−ợc Y, tức là Q = ∑(Yi − yi ) → min (3.5) i=1 Q đ−ợc gọi là tổng bình ph−ơng sai số. Hồi quy đa thức 1 biến Hàm xấp xỉ có dạng đa thức một biến (x) và có thể viết: m i f(x) = Pm(x) = ∑ aix (3.6) i=0 n m k 2 Thay thế vào (3.5) ta có: Q = ∑∑(yi − akxi ) → min i==1 k 0 Tại điểm cực tiểu đạo hàm riêng của Q theo các tham số cần tìm phải bằng 0, tức là n m n m m ∂Q ∂ j 2 j ∂ j = ∑∑(yi − a jxi ) = 2∑∑(yi − a jxi ) ∑ a jxi = 0 k = 0, m (3.7) ∂ak ∂ak i==1 j 0 i==1 j 0 ∂ak j=0 (3.7) có thể đ−ợc viết d−ới dạng khác n m n k j k = ∑∑xi a jxi +∑ yixi = 0 k = 0, m (3.8) i==1 j 0 i=1 Hoặc: 2m 2m−1 m m am ∑∑xi + am−1 xi + + a0 ∑ xi = ∑ yi .xi (3.9) m m−1 0 0 am ∑∑xi + am−1 xi + + a0 ∑ xi = ∑ yi .xi Hệ (m+1) ph−ơng trình tuyến tính (3.9) đ−ợc giải theo ph−ơng pháp loại Gauss. Độ lệch chuẩn của hàm hồi quy đ−ợc tính theo công thức sau: (y − P (x ))2 S = ∑ i m i npont − m Chú ý: Trong hệ ph−ơng trình (3.9) các hệ số của hàm hồi quy đa thức bậc m đóng vai trò các ẩn số của hệ (m+1) ph−ơng trình tuyến tính 51
  53. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên am = x(1), am-1 = x(2), a0 = x (m+1). Ch−ơng trình PROGRAM HOI_QUY_DT_1_BIEN; uses crt; TYPE m1 = ARRAY [0 100] of real; m2 = ARRAY [1 10,1 11] of real; VAR x, y,sum,sum2,B : m1; a , aa : m2; npont,m,bm,i,j,k,tampon : integer; tamp,bpss,delta : real; function ymux(a,b:real):real; begin end; procedure GHPTTT2(n: integer;A:m2; VAR XX:m1); begin end; (* het giai he pt tuyen tinh*) BEGIN clrscr; write ('So diem thuc nghiem'); readln(npont); write ('Bac cua da thuc'); readln(m); BM:= 2 * m; for i:=1 to npont do begin write ('x[',i,'] =?'); readln(x[i]); write ('y[',i,'] =?'); readln(y[i]); end; for k := 1 to bm do begin 52
  54. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên sum[k]:= 0; for i:=1 to npont do sum[k] := sum[k] + ymux(x[i],k); end; sum[0]:= npont; for i:= 0 to bm do write(' sum[',i,']:=',sum[i]:10:4); for k := 0 to m do begin sum2[k]:= 0; for i:=1 to npont do sum2[k] := sum2[k] + y[i]*ymux(x[i],k); end; writeln; for i:=0 to m+1 do write(' sum2[',i,']:=',sum2[i]:9:4); writeln('*cac he so cua he phuong trinh tuyen tinh*'); for i:=1 to m+1 do begin for j:=1 to m+1 do Begin tampon:=bm-i-j+2; a[i,j]:= sum[tampon]; write ('a[',i,',',j,']:=',a[i,j]:10:4); aa[i,j]:=a[i,j]; end; end; for j:= 1 to m+1 do begin tampon:=m-j+1; a[j,M+2]:= sum2 [tampon]; writeln(' a[',j,',',m+2,']=',a[j,m+2]); aa[j,M+2]:=a[j,M+2]; end; 53
  55. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên writeln(' giai he pt tuyen tinh'); GHPTTT2 (m+1,A,B); (*thu lai nghiem - so sanh gia tri tinh toan va thuc nghiem*) writeln(' stt tamp y delta '); bpss:=0; for i:=1 to npont do begin tamp:=0; for k:=1 to m+1 do tamp:=tamp+ymux(x[i],m-k+1)*B[k]; delta:= tamp - y[i]; bpss:=bpss+delta*delta; writeln(i:5, tamp:10:4,y[i]:10:4,delta:10:6); end; writeln('tong bpss= ',bpss); READLN; END. Bài tập 6: Hoàn thiện ch−ơng trình hồi quy đa thức dựa trên procedure HQDT(npont,m: integer; Y,X:m1; VAR A:m1); (xem phụ lục) và xử lý hệ số liệu thực nghiệm d−ới đây (giây), 60, 120, 200, 600, 900, 1200, 1800, 2000, 4800 Q%, 172, 199, 219, 216, 228, 264, 298, 422, 464 (y − P (x ))2 Tính độ lệch chuẩn của hàm hồi quy S= ∑ i m i và của các tham số npont − m 2j Sa j = S ∑ xi . So sánh các kết quả thu đ−ợc khi thay đổi bậc của đa thức từ 1 đến 5. Hồi quy tuyến tính nhiều biến. (k) Với hệ n số liệu thực nghiệm của yk (k=1,2, n) t−ơng ứng với xi (k=1,n; i=1,m) và dạng hàm hồi quy đ−ợc chọn là tuyến tính nhiều biến tức là: y = ax1 + bx2 + cx3 (3.10) Hoặc có thể viết d−ới dạng tổng quát 54
  56. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên m f(x) = ∑ aixi (3.11) i=1 Tổng bình ph−ơng sai số đ−ợc xác định bởi công thức: n m (k) 2 Q = ∑(yk −∑ aixi ) → min (3.12) k=1 i=1 Theo cùng một cách nh− đã thực hiện với hồi quy đa thức, đạo hàm riêng của Q theo các tham số al có dạng: n m n m m ∂ ∂ (k) 2 (k) ∂ (k) Q = ∑(yk −∑aixi ) = 2∑(yk −∑aixi ) ∑aixi =0 (3.13) ∂al ∂al k=1 i=1 k=1 i=1 ∂al i=1 Từ đó thu đ−ợc hệ ph−ơng trình tuyến tính: n m n (k) (l) (l) ∑∑aixi xi − ∑ ykxi = 0 l = 1, m (3.14) k==1i 1 k=1 (3.14) đ−ợc giải theo cách khử Gauss đã trình bày ở trên. Hồi quy phi tuyến nhiều biến Trong những tr−ờng hợp mà xấp xỉ đa thức nhiều biến không thể biểu diễn tốt hệ dữ liệu, chúng ta phải sử dụng hàm phi tuyến nhiều biến. Cũng có nhiều cách khác nhau để giải bài toán hồi quy trong tr−ờng hợp này. Trong khuôn khổ giáo trình hoá tin ứng dụng, chúng tôi sẽ trình bày hai cách: cách gần đúng tuyến tính đ−ợc trình bày trong mục này và cách đơn hình đ−ợc trình bày trong phần dành cho cao học. Giả sử rằng hệ thực nghiệm y – x đ−ợc biểu diễn bằng một hàm phi tuyến nhiều biến f(x1i, x2i, xni, a1, a2, a3, ak) = 0 i=1,m (3.15) trong đó x1i xni là các dữ liệu thực nghiệm thu đ−ợc tại m điểm thực nghiệm t−ơng ứng. Ph−ơng trình (3.15) là không thể giải chính xác. Theo cách gần đúng, chúng ta phải tìm tập giá trị của {ai , i=1, k} sao cho m 2 S= ∑f(x1i , x 2i , x ni ,a 1 , ,a k ) (3.16) i1= có giá trị cực tiểu. Để giải bài toán này, chúng ta khai triển Taylo của S xung quanh giá trị ban đầu f0 và chỉ lấy đến các số hạng bậc 1, ta có : 55
  57. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên 2 m ⎛⎞⎛⎞∂∂ff ⎛⎞ ⎛ ∂ f ⎞ S = ⎜⎟fdada da012++⎜⎟ ⎜⎟ ++ ⎜ ⎟ k (3.17) ∑⎜⎟∂∂aa ∂ a i1= ⎝⎠⎝⎠1200 ⎝⎠ ⎝ k ⎠ 0i ⎛⎞∂f Đặt ⎜⎟= f j (3.18) ⎜⎟∂a 0 ⎝⎠j 0 2 mk⎛⎞ ta có S = ⎜⎟ffda+ (j) (3.19) ∑∑⎜⎟0 0 j i1==⎝⎠ j1 i ∂S Để S cực tiểu = 0 với mọi l, lấy đạo hàm (3.19) theo al ta có: ∂a l m ⎛ k ⎞ ⎛ k ⎞ ⎜ ( j) ⎟ ∂ ⎜ ( j) ⎟ ∑∑2 f0 + f0 daj f0 + ∑f0 daj = 0 l=1, k (3.20) ⎜ ⎟ ∂al ⎜ ⎟ i==1 ⎝ j 1 ⎠i ⎝ j=1 ⎠i Vì đạo hàm của tổng theo al bằng 0 nên mmk⎛⎞ (l)(j) (l) = 0 l=1, k (3.21) f.f0 000+ ⎜⎟ f f daj ∑∑∑()i ⎜⎟ i1=== i1⎝⎠ j1 i (3.21) tạo nên một hệ k ph−ơng trình tuyến tính xác định các biến thiên tham số daj , j = 1, k của hàm hồi quy. Các giá trị mới của tham số aj đ−ợc tính bởi aj = aj0 + daj (3.22) Để xác định đ−ợc hệ ph−ơng trình (3.21) cần tính các đạo hàm riêng của f theo các tham số aj (ph−ơng trình (3.18)). Giải hệ (3.21) bằng ph−ơng pháp khử Gauss thu đ−ợc các biến thiên tham số daj và tính đ−ợc tham số mới theo (3.22). Quá trình đ−ợc lặp lại cho đến khi hội tụ nghiệm. D−ới đây là một ví dụ sử dụng thuật toán hồi quy phi tuyến để xác định đồng thời các thông số nhiệt động của cân bằng ion trong dung dịch khi dựa vào tập {pH} đo đ−ợc từ thực nghiệm ở các lực ion khác nhau bao gồm pK, hệ số hoạt độ của các ion và của các phân tử trung hoà trong dung dịch điện ly1. Hàm xấp xỉ có dạng: ∗ 0.5115 I 2 pK = pK a − k1 I − k2I I − − bI − cI (3.23) 1 + 0.3291a I 56
  58. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Trong đó pK* là giá trị pK biểu kiến xác định từ thực nghiệm do pH t−ơng ứng với lực ion I. pKa là hằng số cân bằng phân ly, k1, k2 là các tham số xác định hoạt độ chất không điện ly và 3 số hạng cuối cùng biểu diễn hệ số hoạt độ của ion trong dung dịch đang xét. Các ch−ơng trình con cần thiết cho bài toán nêu trên gồm có: FUNCTION tính hàm và các đạo hàm riêng của (3.23): FUNCTION F(ii:integer;x:m1):DOUBLE; const aa=0.5115; bb=0.3291; var lgphia,lgfha,tamp,a1,a2,b1,b2 : double; exsi,a3,b3,a4,si,pka,sqrti,yy : double; begin yy:=x[1]; si:=x[2]; a1:=a[1]; a2:=a[2]; b1:=a[3]; b2:=a[4]; b3:=a[5]; pka:=a[6]; sqrti:=sqrt(si); LGFHA:=a1*sqrti+a2*si*sqrti; tamp:=1.0+bb*b1*sqrti; lgphia:=aa*sqrti/tamp-b2*si-b3*si*si; case (ii) of 0: f:=-pka+lgphia+lgfha+yy; (*yy la pkc do duoc*) 1: f:= sqrti;(* dao ham rieng f theo tham so 1*) 2: f:= si*sqrti; (* 2*) 3: f:= -aa*sqrti/tamp/tamp*bb*sqrti; (* 3*) 4: f:= -si; (* 4*) 5: f:=-si*si; (* 5*) 6: f:= -1.0; (* 6*) end; END; (* het function *) trong đó ii là biến điều khiển để tính hoặc hàm (nếu ii=0) hoặc các đạo hàm riêng theo các biến aii t−ơng ứng. 57
  59. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Procedure INIT xác lập ma trận giá trị ban đầu của các tham số b[i,j] Procedure INIT (v:real;sz:integer;a:m1;VAR b:m22); VAR i, j : integer; BEGIN for i:=1 to (2*sz+1) do begin for j:=1 to nconst do begin if (i=1) then b[i,j]:=a[j] else begin if i<(sz+2) then b[i,j]:= a[j]* exp((i-1)*ln(v)) else b[i,j]:= a[j]/exp((i-1-sz)*ln(v)); end; end; end; END; Procedure XL_KETQUA dùng để xử lý các kết quả nhận đ−ợc sau khi thu đ−ợc giá trị các tham số thoả mãn điều kiện hội tụ. Cũng nh− các ch−ơng trình khác, ở đây có thể là các câu lệnh ghi tệp, in ra màn hình, tính so sánh giữa thực nghiệm và tính toán tuỳ ý định của ng−ời lập trình và mục đích của bài toán. Procedure GHPTTT2 giải hệ ph−ơng trình tuyến tính (xem phụ lục) program Tinh_pKa; label 1,2,3; 58
  60. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên type m1=array[1 70{50}] of double; m1i=array[1 70{50}] of integer; m2=array[0 100,0 3] of double; m22=array[0 10,0 100] of double; var i,j,k,l,sz,nconst,m,nvar : integer; a,x,d,lfia,lfha : m1; c : m1i; meres : m2; b,functi,s,t : m22; v,s0,eps,sum,tt,xx,yy,u,uu,test,si,sqrti : double; sum1,sum2,lgphia,lgfha,pkc,tamp,aa,bb: double; ch : char; f1,f3,f2 : text; FUNCTION F(ii:integer;x:m1):DOUBLE; begin end; (* hết function *) procedure GHPTTT2(n: integer;A:m22; VAR XX:m1); begin end; (* hết giải hệ pt tuyến tính*) 59
  61. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Procedure INIT (v:real;sz:integer;a:m1;VAR b:m22); begin end; (* hết procedure xác định ma trận giá trị ban đầu của các tham số*) procedure XL_KETQUA; begin writeln('pKa tinh pKa thuc nghiem'); writeln(a[6]:10:4); end; BEGIN (* main program*) nconst:=6; (* số tham số *) nvar:=2; (* với bài toán pH nvar luôn bằng 2. 1 là pK* và 2 là lực ion*) eps:=1.e-10; (* độ hội tụ*) (*giá trị ban đầu của các tham số*) a[1]:=1.0; a[2]:=1.0; a[3]:=1.0; a[4]:=1.0; a[5]:=1.0; a[6]:=1.0; assign(f1,'PH_Dly.txt'); reset(f1); (*tệp dữ liệu*) readln(f1,m); (* số điểm thực nghiệm*) for i:=1 to m do begin (* đọc dữ liệu thực nghiệm *) readln(f1,meres[i,2],meres[i,1]); writeln(meres[i,2],meres[i,1]); end; writeln(' tim bo gia tri ban dau B cua nghiem'); readln; sz:=10; v:=1.5; INIT (v,sz,a,b); for i:=1 to nconst do c[i]:=1; (* chọn các giá trị ban đầu*) l:= nconst; 1: s0:=exp(100*ln(10.0)); for i:=1 to nconst do a[i]:=b[c[i],i]; 60
  62. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên repeat for i:=0 to nconst do begin for j:=1 to m do begin (* cấp phát các giá trị thực nghiệm cho x*) for k:=1 to nvar do x[k]:=meres[j,k]; (*tính hàm và các đạo hàm riêng*) functi[i,j]:=f(i,x); end; end; for i:= 0 to nconst do begin (* tính các tổng ij trong pt (3.21)*) for j:= i+1 to nconst do begin s[i,j]:=0; for k:=1 to m do s[i,j]:=s[i,j]+functi[i,k]*functi[j,k]; end; end; for i:=0 to nconst do begin (* tính các tổng ii trong pt (3.21)*) s[i,i]:=0; for k:=1 to m do s[i,i]:= s[i,i]+ functi[i,k]*functi[i,k]; end; if s[0,0]>s0 then (* nếu S[0,0] quá lớn lựa chọn các*) begin (*giá trị ban đầu khác cho các tham số*) 3: j:= c[l]+1; if j=(2*sz+1) then 61
  63. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên begin if l=1 then begin WRITELN(' ERROR'); readln; halt; end; l:=l-1; goto 3; end; c[l]:=j; if l<nconst then begin for i:=l+1 to nconst do c[i]:=1; l:= nconst; end; goto 1; end; s0:=s[0,0]; (* xác lập đầy đủ ma trận tham số *) for i:=0 to nconst do for j:=0 to i-1 do s[i,j]:=s[j,i]; for i:=1 to nconst do for j:=1 to nconst do t[i,j]:=s[i,j]; (* gán S cho T*) for i:=1 to nconst do t[i,nconst+1]:=-s[i,0]; GHPTTT2(nconst,T,d); (* giải hệ PTTT theo T*) for i:=1 to nconst do a[i]:=a[i]+d[i]; (*tính nghiệm mới*) sum:=0.0; for i:=1 to nconst do (* điều kiện hội tụ nghiệm*) sum:=sum+abs(d[i]/a[i]); writeln(' sum=',sum); until sum<eps; (* kết thúc vòng lặp *) writeln('values of constants'); for i:=1 to nconst do write(i:5,a[i]:14); writeln; XL_KETQUA; (* xử lý kết quả*) 62
  64. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên close(f1);readln; END. Bảng 4 trình bày kết quả xác định đồng thời các tham số cân bằng ion trong dung dịch từ dữ liệu đo pH ở các lực ion khác nhau của hệ axit axetic trong môi tr−ờng NaCl. Dữ liệu vào gồm có lực ion và pK* biểu kiến thực nghiệm đã qua xử lý thống kê và làm nhẵn. Số tham số tuỳ biến cần xác định trong tr−ờng hợp này là 6 bao gồm: pKa hằng số phân ly của axit axetic, k1, k2 là các tham số xác định lgfHA và a,b,c là các tham số xác định lgϕA- . Giá trị các tham số thu đ−ợc gồm có : k1 6.75195E-0002 k2 2.71146E-0002 a 3.25717E+0000 b -2.46469E-0002 c -3.32994E-0003 pKa 4.75962E+0000 (tài liệu tham khảo pKa = 4.741) Sử dụng các hệ số k1 và k2 cũng nh− a, b và c ta tính đ−ợc lần l−ợt các giá trị lgfHA và lgϕA theo ph−ơng trình (3.23). Kết quả tính toán đ−ợc trình bày trong bảng 3.1 Bảng 4: Kết quả xác định đồng thời các tham số cân bằng ion I pK* (TT) pK* [TK]lgfHA[TK} lgfHA (TT) lgϕA-[TK] lgϕA- (TT) 0.05 4.65320 4.648±0,002 0.01540 0.118 0.09102 0.10 4.61910 4.612±0,006 0.013 0.02221 0.11830 0.15 4.59570 4.587±0,006 0.02773 0.13620 0.20 4.57740 4.568±0,006 0.024 0.03262 0.149 0.14960 0.25 4.56230 4.555±0,008 0.03715 0.16010 0.30 4.54940 4.500±0,006 0.04144 0.16880 0.40 4.52770 4.526±0,012 0.043 0.04956 0.181 0.18240 0.50 4.50970 4.502±0,012 0.05733 0.19260 0.60 4.49420 4.492±0,006 0.061 0.06490 0.199 0.20050 0.70 4.48050 4.479±0,014 0.07237 0.20670 0.80 4.46810 4.464±0,014 0.079 0.07979 0.210 0.21170 63
  65. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên 0.90 4.45670 4.460±0,014 0.08721 0.21570 1.00 4.44610 4.448±0,014 0.096 0.09463 0.218 0.21890 1.20 4.42670 4.422±0,006 0.113 0.10960 0.223 0.22330 1.50 4.40070 4.408±0,016 0.138 0.13250 0.226 0.22640 1.70 4.38490 4.388±0,018 0.154 0.14810 0.226 0.22660 2.00 4.36250 4.364±0,010 0.177 0.17220 0.225 0.22490 2.20 4.34840 4.360±0,012 0.193 0.18860 0.228 0.22260 2.50 4.32800 4.351±0,012 0.215 0.21390 0.220 0.21770 2.70 4.31480 4.341±0,014 0.23120 0.21350 3.00 4.29560 4.333±0,014 0.252 0.25780 0.211 0.20620 3.50 4.26440 4.329±0,014 0.287 0.30390 0.199 0.19130 Sự phù hợp giữa tính toán và thực nghiệm là rõ ràng. Thành công cơ bản của việc sử dụng thuật toán hồi quy phi tuyến chính là ở chỗ xác định đ−ợc đồng thời nhiều tham số chỉ từ một tập số liệu pH của dung dịch ở các lực ion khác nhau. 3.4. Ph−ơng pháp mô phỏng monte – carlo tính toán hệ động hóa học Thuật toán k Xét phản ứng bậc một: A → B có ph−ơng trình vi phân bậc một dA/dt = - kA -kt và lời giải At = A0 e . Hãy chọn k là đơn vị của hằng số tốc độ và A0 nồng độ ban đầu của chất A. Phản ứng xảy ra đ−ợc (1 b−ớc phản ứng) nếu một số ngẫu nhiên ξ trong khoảng (0,1) thoả mãn điều kiện: ξ ≤ kA Trong tr−ờng hợp này nồng độ của A và B sau mỗi b−ớc phản ứng đ−ợc xác định 1 1 nh− sau: A = A − và B = B + V V 64
  66. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên V là thể tích của bình phản ứng. Rõ ràng khi A giảm thì xác suất xảy ra phản ứng giảm đi. Khi tăng V và số điểm ngẫu nhiên N đến ∞ thì cách giải trên cho kết quả chính xác. Sơ đồ khối và đoạn ch−ơng trình máy tính Thuật toán đ−ợc thể hiện thành sơ đồ khối trình bày trên hình 3.1. đoạn ch−ơng trình máy tính đ−ợc biểu diễn trong procedure MC_REAC Procedure MC_REAC(n:integer; sk: real; VAR a: real); VAR r,v,aa : real; i,itime,N,nint,j : longint; Begin Randomize; writeln('T':10,'A':16,'A0.exp(-kt)':24); v:=n; nint:=round(n/20); for j:=1 to 20 do begin for i:=1 to nint do begin r:=random; if r<(k*a) then a:=a - 1/v; end; itime:=j*nint; aa:=exp(-0.0002*itime); writeln(itime:10,a:16:4,'':14,aa:10); end; end; Khi áp dụng cho hệ phản ứng ví dụ: k1 A + B C + D k2 k3 B + C D + E đ−ợc mô tả bởi 3 ph−ơng trình động học: v = k A B k = 1 1 1 1 65
  67. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên v2 = k2 C D k2 = 0.25 v3 = k3 B C k3 = 0.5 START Doc k, Ao, i, N, V nint= N/20 j=1 i=1 no random nint? yes itime=j*nint j=j+1 no j>20? yes END Hình 1: Sơ đồ thuật toán tính Monte-Carlo hệ động hóa học Thuật toán cần có một thay đổi nhỏ cho phù hợp. Vì có tới 3 phản ứng song song nên số ngẫu nhiên cũng đ−ợc chia làm 3 phần: 0 0.3333 thuộc về phản ứng 2 0.3334 0.6666 thuộc về phản ứng 3 0.6667 1.0000 thuộc về phản ứng 1 Cách chia này không ảnh h−ởng đến tính ngẫu nhiên của thuật toán, vì số ngẫu nhiên RANDOM có phân bố đều. Để tính toán động học phản ứng của hệ, ch−ơng trình cần có một ch−ơng trình con tính nồng độ các chất phản ứng sau mỗi b−ớc phản ứng theo vận tốc v. 66
  68. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên procedure RP (v:real; var r1,r2,p1,p2:real); begin r1 :=r1 - 1/v; r2 :=r2 - 1/v; p1:=p1 + 1/v; p2:=p2 + 1/v; end; trong đó: r1, r2 kí hiệu nồng độ các chất giảm đi sau phản ứng (r là reaction), p1, p2 kí hiệu nồng độ các chất tăng lên sau phản ứng (p là product). Thay cho MC_REAC chúng ta có MC_REACSYS biểu diễn đoạn ch−ơng trình máy tính cho hệ 03 phản ứng procedure MC_REACSYS(v: real; K:m1; VAR C: m1); VAR ir , : integer; r, temp : real; BEGIN ir:=random(10000); r:=ir/9999; ir:=3; if r 0.3333) and (r<0.6666)) then ir:=2; case ir of 1: begin (* k2*) (* C+D → A+B *) temp:=k[2]*c[3]*c[4]; if r<=temp then RP(v,c[3],c[4],c[1],c[2]); end; 2: begin (* k3 *) (* B+C → D+E*) temp:=k[3]*c[2]*c[3]; r:=r-0.3333; if r<=temp then RP(v,c[2],c[3],c[4],c[5]); end; 3: begin (* k1 *) (* A+B → C+D *) 67
  69. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên temp:=k[1]*c[1]*c[2]; r:=r-0.6666; if r<=temp then RP(v,c[1],c[2],c[3],c[4]); end; end; END; trong đó c[i] với i=1 5 t−ơng ứng với nồng độ của các chất A, B, C, D, E; k[i] : hằng số tốc độ phản ứng 1, 2, 3. Sử dụng các ch−ơng trình con nêu trên ta có thể thiết lập ch−ơng trình tính động học phản ứng bằng ph−ơng pháp Monte – Carlo. PROGRAM REACTION3; (* cc[i] i=1 5 là nồng độ của các chất A,B,C,D,E sau khi đã qui về đơn vị c[i]max; kk[i] : hằng số tốc độ của phản ứng 1,2,3 sau khi đã qui về đơn vị k[i] max Nồng độ ban đầu của A và B là 1, của C,D,E là 0. Các tham số của hệ bao gồm: Số lần thử ngẫu nhiên N = 250000; Thể tích V = 25000*) TYPE m1=array[1 5] of real; VAR kmax,cmax, r,v,temp : real; k,kk,c: m1; nint,i,itime,n,ir,j,ki: longint; procedure RP (v:real; var r1,r2,p1,p2:real); begin end; procedure MC_REACSYS(v: real; K:m1; VAR C: m1); begin end; 68
  70. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên BEGIN RANDOMIZE; writeln('Nhap du lieu'); (* writeln('Nong do ban dau cua cac chat'); for i:=1 to 5 do begin write('c',i:5,'=?');readln(c[i]); end; writeln('Hang so toc do phan ung'); for i:=1 to 3 do begin write('k',i:5,' =?');readln(k[i]); end; write('n,v');readln(n,v); So lieu dung de test *) c[1]:=1.0; c[2]:=1.0; c[3]:=0.0; c[4]:=0.0; c[5]:=0.0; k[1]:=1.0; k[2]:=0.25; k[3]:=0.5; n:=250000; v:=25000; itime:=0; nint:=round(N/20); (*Qui nong do ban dau va hang so toc do ve don vi cmax,kmax*) cmax:=c[1]; for i:=2 to 5 do if c[i]>cmax then cmax:=c[i]; kmax:=k[1]; for i:=2 to 3 do if k[i]>kmax then kmax:=k[i]; for i:=1 to 3 do k[i]:=k[i]/kmax; for i:=1 to 5 do c[i]:=c[i]/cmax; writeln('itime':10,'A':10,'B':10,'C':10,'D':10,'E':10); for i:=2 to 21 do begin for j:=1 to nint do MC_REACSYS(v,K,C); 69
  71. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên itime:=(i-1)*nint; write(itime:10); for ki:=1 to 5 do write(c[ki]:10); writeln; end; readln; END. Ch−ơng 4 : Một số ch−ơng trình tính cho hóa học 4.1. Sự tính Ab – Initio cho hệ HeH+ Giới thiệu phần mềm và cách sử dụng 4.2. Sự tính bán kính kinh nghiệm Giới thiệu phần mềm và cách sử dụng 4.3. Thiết kế phân tử vμ tính hoá l−ợng tử Giới thiệu phần mềm và cách thiết kế Ch−ơng 5 : phần mềm dạy học 5.1. phần mềm tra cứu: bảng tuần hoμn các nguyên tố Ngoài phần mềm Bảng tuần hoàn các nguyên tố mỗi sinh viên s−u tầm một số phần mềm hóa học để lồng ghép vào các bài dạy thực tế (ít nhất 2 phần mềm). 5.2. giới thiệu một số bμi dạy cơ bản Mỗi sinh viên sử dụng các phần mềm hóa học đã s−u tầm đ−ợc và lồng ghép vào các bài dạy thực tế. 70
  72. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên Ch−ơng 6 : thực hμnh 6.1. vận hμnh máy Khởi động mỏy tớnh, copy, cài đặt và khởi động chương trỡnh PASCAL, thoỏt ra khỏi chương trỡnh PASCAL, tắt mỏy tớnh. 6.2. Nhập ch−ơng trình vμo máy tính Nhập cỏc chương trỡnh ở cỏc vớ dụ cú trong tài liệu và chạy thử. Lưu tất cả cỏc file của mỡnh vào thư mục họ và tờn của sinh viờn; tất cả cỏc thư mục họ và tờn của sinh sinh viờn được lưu trong thư mục lớp mỡnh. Vớ dụ thư mục: C:\Hoa43A\Nguyễn Văn A\ . (Nộp kết quả bài thực hành cho giỏo viờn sau khi thực hành xong là 1 thư mục lớp\cỏc sinh viờn\cỏc file) 6.3. thủ tục vμo ra các dữ liệu 1. Viết chương trỡnh in ra màn hỡnh dũng chữ: CONG HOA XA HOI CHU NGHIA VIET NAM DOC LAP – TU DO – HANH PHUC HO VA TEN: NGUYEN VAN A LOP: HOA 43 A NAM HOC 2010 - 2011 Rồi dừng màn hỡnh. Khi nhấn phớm bất kỳ thỡ thoỏt ra khỏi chương trỡnh. 2. Viết chương trỡnh nhập số liệu từ bàn phớm với tất cả cỏc kiểu số liệu đó học rồi viết cỏc giỏ trị đú ra màn hỡnh, Viết ra màn hỡnh: họ và tờn của mỡnh, lớp, năm học rồi dừng lại chờ ấn phớm bất kỳ mới thoỏt ra. 3. Viết chương trỡnh theo yờu cầu sau: + Tờn chương trỡnh là họ và tờn của mỡnh. + Chương trỡnh nhập số liệu a, b, c, d, e từ bàn phớm với a, b, c, d, e cú cỏc kiểu số liệu khỏc nhau. + Viết cỏc giỏ trị a, b, c, d, e ra màn hỡnh rồi dừng lại chờ ấn phớm bất kỳ mới tiếp tục. + Tớnh toỏn KETQUA theo cỏc biến a, b, c, d, e đó nhập. + Viết KETQUA, họ và tờn của mỡnh, lớp, năm học ra màn hỡnh rồi dừng lại chờ ấn phớm bất kỳ mới tiếp tục. 71
  73. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên 6.4. Dùng các toán tử FOR ; REPEAT ; WHILE DO ; IF THEN. 1. Viết chương trỡnh PASCAL thực hiện cụng việc sau: - Tờn chương trỡnh: Tỡm tổng hai số bộ nhất. - Viết ra màn hỡnh thụng bỏo: Nhap gia tri cua a (kieu so nguyen): - Nhập số a là số nguyờn từ bàn phớm. - Viết ra màn hỡnh thụng bỏo: Nhap gia tri cua b (kieu so thuc): - Nhập số b là số thực từ bàn phớm. - Cho giỏ trị của c = giỏ trị bất kỳ. - Cho TONG1 = a + b, TONG2 = a + c, TONG3 = b + c. - Cho MIN = TONG1. - Nếu MIN > TONG2 thỡ MIN = TONG2. - Nếu MIN > TONG3 thỡ MIN = TONG3. - Viết ra màn hỡnh giỏ trị của a, b c (mỗi giỏ trị dành 15 chỗ để viết, mỗi số cú 4 chữ số phần thập phõn). Xuống dũng. - Viết ra màn hỡnh thụng bỏo: Gia tri tong nho nhat la: - Viết ra màn hỡnh giỏ trị MIN với 5 chữ số ở phần nguyờn, 2 chữ số ở phần thập phõn. - Viết ra màn hỡnh: họ và tờn của mỡnh, lớp, năm học 2. Viết chương trỡnh PASCAL thực hiện cụng việc sau: - Tờn chương trỡnh: Tỡm tớch hai số lớn nhất. - Viết ra màn hỡnh thụng bỏo: Nhap gia tri cua a (kieu so nguyen): - Nhập số a là số nguyờn từ bàn phớm. - Viết ra màn hỡnh thụng bỏo: Nhap gia tri cua b (kieu so thuc): - Nhập số b là số thực từ bàn phớm. - Cho giỏ trị của c = giỏ trị bất kỳ - Cho TICH1 = a x b, TICH2 = a x c, TICH3 = b x c. - Cho TICH = TICH1. - Nếu TICH < TICH2 thỡ TICH = TICH2. - Nếu TICH < TICH3 thỡ TICH = TICH3. 72
  74. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên - Viết ra màn hỡnh giỏ trị của a, b c (mỗi giỏ trị dành 10 chỗ để viết, mỗi số cú 3 chữ số phần thập phõn). Xuống dũng. - Viết ra màn hỡnh thụng bỏo: Gia tri tich hai so lon nhat la: - Viết ra màn hỡnh giỏ trị TICH với 10 chữ số ở phần nguyờn, 4 chữ số ở phần thập phõn. Viết ra màn hỡnh: họ và tờn của mỡnh, lớp, năm học 6.5. FUNCTION vμ PROCEDURE Viết chương trỡnh sử dụng 1 chương trỡnh con đó học 6.6. Lập trình tính nồng độ cân bằng của hệ. Ví dụ 1: Cân bằng tạo phức trong dung dịch Cu++ và EDA có dạng sau: 2+ 2+ Cu + EDTA ⇌ CuEDTA K1 2+ 2+ CuEDTA + EDTA ⇌ Cu(EDTA)2 K2 2+ Cho biết nồng độ mol ban đầu của Cu là C1 và của EDTA là C2. Tính nồng độ cân bằng của các ion và phân tử trung hoà trong quá trình chuẩn độ Cu2+ bằng EDTA. Bài giải: Cân bằng (1) và (2) đ−ợc viết lại d−ới dạng sau: 2+ 2+ 2+ Cu + EDTA ⇌ Cu EDTA + Cu (EDTA)2 (6.1) ở thời điểm ban đầu t=0 ta có: 2+ [Cu ] = C1 [EDTA] = C2 2+ 2+ [CuEDTA ] = [Cu(EDA)2 ] = 0 Tại thời điểm cân bằng nồng độ CuEDTA2+ đ−ợc ký hiệu là x và của 2+ Cu(EDTA)2 là y. Lúc đó 2+ [Cu ] = C1 - x - y [EDTA] = C2 - x - 2y [CuEDTA2+] = x 2+ [Cu(EDTA)2 ] = y Ta có các ph−ơng trình liên hệ sau: 73
  75. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên 2+ ⎡⎤Cu ì[ EDTA] (C -x-y)(C -x-2y) K=⎣⎦ = 12 1 2+ (6.2) ⎣⎦⎡⎤CuEDTA x 2+ ⎡⎤CuEDTA ì[ EDTA] x(C -x-2y) K=⎣⎦ = 2 (6.3) 2 ⎡⎤2+ y ⎣⎦Cu(EDTA)2 Từ (6.3) ta rút ra: (C -x)x y= 2 (6.4) K+2x2 2 (C22 -2x)(K +2x)-2(C 2 x-x ) y'= 2 (6.5) (K2 +2x) Sử dụng (6.3) ta có thể quy (6.2) về ph−ơng trình 1 ẩn. F(x) = K1x − (C1 − x − y)(C2 − x − 2y) (6.6) F'(x) = K1 + (C1 − x − y)(1 + 2y') + (1 + y')(C2 − x − 2y) (6.7) PROGRAM can_bang_ion; LABEL 10; VAR X,FX,FFX,K1,K2,Cl,C2,epsilon,GAM : real; delta,Y,CC1,CC2 : real; PROCEDURE FUNC(X: real; VAR FX,FFX: real); VAR AA,AB,AC,AD,YF,Y : real; BEGIN AA:= C2 * X - X*X; AB:= K2 + 2 * X; Y:= AA/AB; AC:= Cl - X - Y; AD:= C2 - X - 2 * Y; YF:= (C2 - 2 * X) * AB - 2 * AA; YF:= YF/AB /AB; FX:= K1 *X-AC*AD; FFX:=K1 +AC*(1 +2*YF)+(1 +YF)*AD; 74
  76. TS Mai Xuân Tr−ờng - Tr−ờng Đại học S− phạm - Đại học Thái Nguyên END; BEGIN WRITE ('Do chinh xac cua loi giai :=?'); READLN (epsilon); WRITE (' nhap hscb kl, k2, '); READLN (K1, K2); WRITE(' nhap Nong Do Cu2+'); READLN (Cl); WRITE (' nhap Nong Do EDTA va bien thien ND'); READLN (C2, GAM); WRITELN ('GIA TRI ND CAC ION CAN BANG'); WRITELN ('Cu':10,'EDTA ':10,'CUEDTA':10,'Cu(EDTA)2':12); WRITELN ('nhap x dau') ; READLN (x); (* sau lan tinh dau, cac x dau duoc chon la x cua phep tinh truoc *) 10: FUNC (x,FX,FFX); delta := FX / FFX; X:= X - delta; IF abs(delta)> epsilon THEN GOTO 10; Y:= (C2 - X) * X/(K2 + 2 * X); CC1 := Cl - X - Y; CC2:= C2 - X - 2*Y; WRITELN (CC1:10:4, CC2:10:4, X:10:4,Y:10:4); C2:= C2 + GAM; IF (C2/2)<=Cl THEN GOTO 10; READLN; END. Ví dụ 2:. Cân bằng tạo phức trong dung dịch Fe3+ và SCN- đ−ợc xác định bởi các ph−ơng trình sau: 3+ - 2+ Fe + SCN ⇌ Fe(SCN) K1 2+ - + Fe(SCN) + SCN ⇌ Fe(SCN)2 K2 + - Fe(SCN)2 + SCN ⇌ Fe(SCN)3 K3 - - Fe(SCN)3 + SCN ⇌ Fe(SCN)4 K4 - - 2- Fe(SCN)4 + SCN ⇌ Fe(SCN)5 K5 75