text:
Trở về Mục lục cuốn sách
1. Sự xung đột về tên
Hãy nhớ rằng tất cả các tập tin lệnh bạn viết đều chạy trong cùng một không gian làm việc, vì vậy nếu một chương trình làm thay đổi giá trị một biến thì tất cả các chương trình khác đều thấy được sự thay đổi đó. Với một ít các chương trình đơn giản, điều này không đáng kể, nhưng rồi sau này những tương tác giữa các chương trình trở nên không thể quản lý được.
Chẳng hạn, chương trình sau tính tổng của
n số đầu tiên trong một dãy hình học, nhưng cũng có hiệu ứng phụ là gán các giá trị cho
A1,
total,
i và
a.
A1 = 1; total = 0; for i=1:10 a = A1 * 0.5^(i-1); total = total + a; end ans = total
Nếu bạn dùng bất cứ tến biến nào nêu trên trước khi gọi mã lệnh này thì bạn có thể sẽ ngạc nhiên khi thấy rằng sau khi chạy đoạn chương trình, các giá trị đó đã thay đổi. Nếu bạn có 2 đoạn chương trình dùng cùng tên biến, bạn có thể thấy rằng chúng hoạt động riêng biệt nhưng đổ vỡ khi bạn cố gắng kết hợp các chương trình lại. Kiểu tương tác này được gọi là xung đột về tên.
Khi số tập tin lệnh của bạn viết tăng lên, đồng thời cũng dài hơn và phức tạp hơn thì sự xung đột về tên càng nghiêm trọng. Để tránh được vấn đề này, cần tạo ra các hàm.
2. Hàm
Một hàm cũng giống như một tập tin lệnh, chỉ khác ở chỗ
- Mỗi hàm có không gian làm việc riêng của nó, vì vậy bất kì biến nào được định nghĩa trong hàm đều chỉ tồn tại khi hàm đang chạy, và không ảnh hưởng đến các biến trong không gian làm việc khác, ngay cả khi các biến đó có cùng tên.
- Các dữ liệu đầu vào và kết quả đầu ra của hàm đều được định nghĩa một cách cẩn thận để tránh sự tương tác không mong muốn.
Để định nghĩa một hàm, bạn cần tạo ra một tập tin M với tên gọi mong muốn, và đặt một lời định nghĩa hàm vào trong đó. Chẳng hạn, để tạo ra một hàm có tên
myfunc, hãy tạo ra tập tin M là
myfunc.m và đặt vào đó định nghĩa hàm sau.
function res = myfunc(x) s = sin(x) c = cos(x) res = abs(s) + abs(c) end
Từ đầu tiên của tập tin phải là
function, vì đó là dấu hiệu đẻ MATLAB nhận biết một tập tin hàm thay vì tập tin lệnh.
Một định nghĩa hàm chính là một câu lệnh phức hợp. Dòng đầu tiên là dấu của hàm; nó chỉ định các số liệu đầu vào và đầu ra của hàm. Trong trường hợp này biến đầu vào có tên là
x. Khi hàm này được gọi, đối số do người dùng cung cấp sẽ được gán cho
x.
Biến đầu ra được gọi là
res, chữ viết tắt của “result” (kết quả). Bạn có thể gọi biến đầu ra bằng tên gì cũng được, nhưng theo thông lệ, tôi thường đặt nó là
res. Thường thì việc cuối cùng mà một hàm thực hiện là gán một giá trị cho biến đầu ra.
Một khi bạn đã định nghĩa một hàm mới, bạn có thể gọi nó theo cách giống như gọi các hàm có sẵn trong MATLAB. Nếu bạn gọi hàm như một câu lệnh, MATLAB sẽ đặt kết quả vào
ans:
>> myfunc(1) s = 0.84147098480790 c = 0.54030230586814 res = 1.38177329067604 ans = 1.38177329067604
Nhưng thường thấy hơn (đồng thời là cách tốt hơn) là nên gán kết quả cho một biến:
>> y = myfunc(1) s = 0.84147098480790 c = 0.54030230586814 res = 1.38177329067604 y = 1.38177329067604
Khi bạn gỡ lỗi một hàm mới, có thể bạn sẽ phải hiển thị các giá trị trung gian như thế này, nhưng một khi hàm đã chạy tốt, bạn sẽ phải thêm vào các dấu chấm phẩy để khiến nó trở thành một hàm lặng. Đa số các hàm có sẵn trong MATLAB đều là hàm lặng, chúng tính ra kết quả, nhưng không hiển thị gì (ngoại trừ những thông báo trong một số trường hợp).
Mỗi hàm có một không gian làm việc riêng của nó, vốn được tạo ra khi hàm bắt đầu chạy và bị xóa đi khi hàm kết thúc. Nếu bạn thử truy cập (đọc hay ghi) biến được định nghĩa bên trong hàm, bạn sẽ thấy nó không tồn tại.
>> clear >> y = myfunc(1); >> who Your variables are: y >> s ??? Undefined function or variable 's'.
Giá trị duy nhất của hàm mà bạn có thể truy cập được là kết quả của nó, ở đây là giá trị gán cho biến
y.
Nếu bạn có các biến tên là
s hoặc
c trong không gian làm việc trước khi gọi
myfunc, chúng sẽ vẫn ở đó ngay cả khi hàm kết thúc.
>> s = 1; >> c = 1; >> y = myfunc(1); >> s, c s = 1 c = 1
Như vậy ở trong hàm bạn có thể dùng bất kì tên biến nào bạn muốn mà không sợ xung đột.
3. Thông tin về hàm
Tại chỗ bắt đầu của mỗi tập tin hàm, bạn nên ghi một lời chú thích nhằm giải thích tác dụng của hàm được viết ra.
% res = myfunc (x) % Compute the Manhattan distance from the origin to the % point on the unit circle with angle (x) in radians. function res = myfunc (x) s = sin(x); c = cos(x); res = abs(s) + abs(c); end
khi bạn yêu cầu trợ giúp bằng
help, MATLAB sẽ in ra lời chú thích mà bạn đã ghi.
>> help myfunc res = myfunc (x) Compute the Manhattan distance from the origin to the point on the unit circle with angle (x) in radians.
Có nhiều điều trong thông lệ viết các lời chú thích này. Một số chi tiết nên đưa vào bao gồm:
- Dấu của hàm, bao gồm tên hàm, (các) biến đầu vào, và (các) biến đầu ra.
- Một lời mô tả rõ ràng, ngắn gọn về công dụng của hàm. Lời mô tả phải khái quát: nên bỏ qua những chi tiết về cách hoạt động của hàm, mà chỉ bao gồm những thông tin mà người dùng hàm muốn biết. Bạn có thể thêm vào các chú thích bên trong hàm để lý giải những chi tiết.
- Một lời giải thích ý nghĩa các biến đầu vào; chẳng hạn, trong trường hợp này cần lưu ý rằng
xđược coi là số đo góc tính theo ra-đian.
- Các điều kiện đầu và điều kiện cuối.
4. Tên hàm
Có ba điều rất phải lưu ý khi bạn mới đặt tên hàm. Thứ nhất là tên “thực sự” của hàm được quyết định bởi tên tập tin chứ không phải tên mà bạn ghi ở dấu của hàm. Theo phong cách, bạn nên chắc rằng hai cái tên này phải luôn giống nhau, nhưng nếu bạn lầm, hoặc đã đổi tên của hàm, thì rất dễ bị rối.
Theo tinh thần cố ý gây lỗi, hãy thử đổi tên hàm từ
myfunc sang
something_else, và chạy lại hàm đó.
Đây là những gì bạn đưa vào trong
myfunc.m:
function res = something_else (x) s = sin(x); c = cos(x); res = abs(s) + abs(c); end
Và đây là những gì bạn nhận được:
>> y = myfunc(1); >> y = something_else(1); ??? Undefined command/function 'something_else'.
Điều thứ hai là tên của tập tin không được phép chứa dấu cách. Chẳng hạn, nếu bạn viết một hàm và đặt tên tập tin là
my func.m, thì mặc dù trình soạn thảo MATLAB vẫn đồng ý, nhưng khi thử chạy, bạn sẽ nhận được:
>> y = my func(1) ??? y = my func(1) | Error: Unexpected MATLAB expression.
Điều thứ ba là tên hàm được viết có thể xung đột với các hàm lập sẵn của MATLAB. Chẳng hạn, nếu bạn tạo ra tập tin M có tên
sum.m, rồi gọi
sum, MATLAB có thể sẽ gọi hàm mới do bạn viết, chứ không phải hàm lập sẵn! Hàm nào được gọi sẽ tùy thuộc vào thứ tự của các thư mục xếp trong đường dẫn tìm kiếm, và (trong một số trường hợp) phụ thuộc vào đối số. Chẳng hạn, hãy đặt các lệnh sau vào tập tin có tên
sum.m:
function res = sum(x) res = 7; end
Rồi thử gõ:
>> sum(1:3) ans = 6 >> sum ans = 7
Trong trường hợp đầu MATLAB đã dùng hàm lập sẵn; ở trường hợp thứ hai nó thực hiện hàm bạn viết! Kiểu tương tác này có thể rất gây lẫn. Trước khi tạo ra hàm mới, bạn cần kiểm tra xem có sẵn hàm nào của MATLAB có cùng tên không. Nếu có, hãy đặt một tên khác!
5. Nhiều biến đầu vào
Các hàm có thể, và thường, nhận nhiều biến đầu vào. Chẳng hạn, hàm sau đây nhận hai biến đầu vào,
a và
b:
function res = hypotenuse(a, b) res = sqrt(a^2 + b^2); end
Nếu bạn còn nhớ Định lý Py-ta-go, bạn có thể đã hình dung ra là hàm này để tính chiều dài cạnh huyền của tam giác vuông nếu các cạnh góc vuông là
a và
b. (Có một hàm MATLAB tên là
hypot thực hiện điều tương tự.)
Nếu ta gọi nó từ Command Window với các đối số 3 và 4, ta có thể chắc rằng chiều dài cạnh thứ ba sẽ bằng 5.
>> c = hypotenuse(3, 4) c = 5
Các đối số mà bạn cấp vào đây được gán cho các biến đầu vào theo đúng thứ tự, vì vậy ở trường hợp này 3 được gán cho
a còn 4 được gán cho
b. MATLAB kiểm tra để đảm bảo rằng bạn cung cấp đủ đối số; nếu cung cấp thiếu, bạn sẽ nhận được:
>> c = hypotenuse(3) ??? Input argument "b" is undefined. Error in ==> hypotenuse at 2 res = sqrt(a^2 + b^2);
Thông báo lỗi này dễ gây nhầm lẫn, vì nó gợi ý rằng trục trặc xảy ra ở
hypotenuse thay vì ở lời gọi hàm. Hãy nhớ điều đó khi bạn gỡ lỗi.
Nếu cung cấp thừa đối số, bạn sẽ nhận được:
>> c = hypotenuse(3, 4, 5) ??? Error using ==> hypotenuse Too many input arguments.
Đây là thông báo lỗi hay hơn.
6. Các hàm logic
Ở Mục toán tử logic ta đã dùng các toán tử logic để so sánh các giá trị. MATLAB cũng cung cấp các hàm logic để kiểm tra những điều kiện nhất định và trả lại những giá trị logic: 1 với nghĩa là “đúng” và 0 với nghĩa là “sai”.
Chẳng hạn,
isprime dùng để kiểm tra xem số đã cho có phải là số nguyên tố hay không.
>> isprime(17) ans = 1 >> isprime(21) ans = 0
Các hàm
isscalar và
isvector là để kiểm tra xem một giá trị là số vô hướng hay véc-tơ; nếu cả hai đều sai, bạn có thể tạm coi đối số là một ma trận.
Để kiểm tra xem một giá trị bạn đã tính có phải là số nguyên không, bạn có thể muốn dùng
isinteger. Nhưng cách làm này sai.
isinteger kiểm tra xem giá trị có thuộc về một trong bốn kiểu số nguyên (một chủ đề mà ta chưa bàn luận đến), chứ nó không kiểm tra xem một số có dấu phẩy động tình cờ nhận giá trị nguyên hay không.
>> c = hypotenuse(3, 4) c = 5 >> isinteger(c) ans = 0
Để làm điều này, ta cần tự viết một hàm logic, và sẽ gọi nó là
isintegral:
function res = isintegral(x) if round(x) == x res = 1; else res = 0; end end
Hàm này dùng được trong phần lớn các trường hợp, nhưng nhớ rằng các giá trị dấu phẩy động chỉ xấp xỉ đúng, trong một số trường hợp giá trị xấp xỉ là số nguyên nhưng giá trị thực lại không phải.
7. Một ví dụ phát triển tăng dần
Giả dụ rẳng ta muốn viết một chương trình tìm các “bộ ba số Py-ta-go”: những tập hợp số nguyên như 3, 4, và 5, là độ dài các cạnh của một tam giác vuông. Nói cách khác, ta muốn tìm các giá trị nguyên a, b và c sao cho a2+b2=c2.
Sau đây là các bước mà ta sẽ làm theo để phát triển chương trình một cách tăng dần.
- Viết một tập tin lệnh có tên
find_triplesvà bắt đầu với một câu lệnh đơn giản như
x=5.
- Viết một vòng lặp để liệt kê các giá trị a từ 1 đến 3, và hiển thị chúng.
- Viết một vòng lặp lồng ghép để liệt kê các giá trị b từ 1 đến 4, và hiển thị chúng.
- Bên trong vòng lặp, gọi
hypotenuseđể tính c và hiển thị nó.
- Dùng
isintegralđể kiểm tra xem c có bằng một số nguyên hay không.
- Dùng một lệnh if để chỉ in ra những cặp giá trị a, b và c nào thỏa mãn điều kiện.
- Chuyển nội dung tập tin lệnh vào trong một hàm.
- Khái quát hóa hàm này để nhận vào các biến chỉ định khoảng các giá trị cần được tìm kiếm.
Như vậy bản nháp đầu tiên của chương trình này là
x=5, trông có vẻ ngốc nghếch, nhưng nếu bạn bắt đầu một cách đơn giản và mỗi lúc chỉ thêm vào ít một, bạn sẽ tránh được gỡ lỗi rất nhiều.
Sau đây là bản nháp thứ hai:
for a=1:3 a end
Ở mỗi bước, chương trình đều có thể chạy thử được: nó có in ra kết quả (hay một hiệu ứng thấy được) mà ta có thể kiểm tra.
8. Vòng lặp lồng ghép
Bản nháp thứ ba chứa một vòng lặp lồng ghép:
for a=1:3 a for b=1:4 b end end
Vòng lặp trong được thực hiện 3 lần, mỗi lần với một giá trị khác nhau của
a, vì vậy sau đây là kết quả (tôi đã chỉnh lại độ dãn cách để làm nổi bật cấu trúc):
>> find_triples a = 1 b = 1 b = 2 b = 3 b = 4 a = 2 b = 1 b = 2 b = 3 b = 4 a = 3 b = 1 b = 2 b = 3 b = 4
Bước tiếp theo là tính c với mỗi cặp giá trị của a và b.
for a=1:3 for b=1:4 c = hypotenuse(a, b); [a, b, c] end end
Để hiển thị các giá trị của
a,
b và
c, tôi dùng đến một đặc điểm của MATLAB mà ta chưa gặp. Toán tử ngoặc vuông tạo ra một ma trận mới mà, khi được hiển thị, sẽ cho thấy các giá trị trên cùng một dòng:
>> find_triples ans = 1.0000 1.0000 1.4142 ans = 1.0000 2.0000 2.2361 ans = 1.0000 3.0000 3.1623 ans = 1.0000 4.0000 4.1231 ans = 2.0000 1.0000 2.2361 ans = 2.0000 2.0000 2.8284 ans = 2.0000 3.0000 3.6056 ans = 2.0000 4.0000 4.4721 ans = 3.0000 1.0000 3.1623 ans = 3.0000 2.0000 3.6056 ans = 3.0000 3.0000 4.2426 ans = 3 4 5
Bạn đọc tinh mắt sẽ phát hiện được rằng chúng ta đang lãng phí một ít công sức lập trình. Sau khi kiểm tra a=1 và b=2, sẽ chẳng cần kiểm tra a=2 và b=1. Ta có thể loại bỏ công việc thừa này bằng cách chỉnh lại khoảng lặp của vòng thứ hai:
for a=1:3 for b=a:4 c = hypotenuse(a, b); [a, b, c] end end
Nếu bạn vẫn theo kịp nội dung, hãy chạy phiên bản mã lệnh này và chắc chắn rằng nó cho kết quả như mong muốn.
9. Điều kiện và cờ
Bước tiếp theo là kiểm tra xem giá trị c có nguyên không. Vòng lặp này gọi
isintegral và in ra giá trị logic thu được.
for a=1:3 for b=a:4 c = hypotenuse(a, b); flag = isintegral(c); [c, flag] end end
Bằng cách không hiển thị
a và
b tôi làm cho việc soát kết quả dễ dàng hơn để đảm bảo rằng các giá trị của
c và
flag trông đúng đắn.
>> find_triples ans = 1.4142 0 ans = 2.2361 0 ans = 3.1623 0 ans = 4.1231 0 ans = 2.8284 0 ans = 3.6056 0 ans = 4.4721 0 ans = 4.2426 0 ans = 5 1
Tôi chọn các khoảng
a và
b đều nhỏ (vì vậy số dòng kết quả đầu ra có thể kiểm soát được), nhưng phải bao gồm ít nhất là một bộ ba số Py-ta-go. Một khó khăn thường gặp khi gỡ lỗi là phải phát sinh đủ kết quả để cho thấy rằng mã lệnh có (hoặc không) hoạt động mà không quá thừa thãi.
Bước tiếp theo là dùng
flag để chỉ hiển thị những bộ ba thỏa mãn yêu cầu:
for a=1:3 for b=a:4 c = hypotenuse(a, b); flag = isintegral(c); if flag [a, b, c] end end end
Bây giờ kết quả đẹp và đơn giản hơn:
>> find_triples ans = 3 4 5
10. Bao bọc và khái quát hóa
Dưới dạng tập tin lệnh, chương trình này có tác dụng phụ là đã gán các giá trị cho
a,
b,
c và
flag, vốn sẽ làm chương trình khó dùng hơn khi các tên biến trên đang được sử dụng. Bằng cách bọc mã lệnh này vào trong một hàm, ta có thể tránh được sự xung đột về tên; quá trình này được gọi là bao bọc vì nó cô lập chương trình khỏi không gian làm việc.
Để đưa mã lệnh đã viết vào trong một hàm, ta phải viết thụt đầu dòng toàn bộ. Trình soạn thảo MATLAB cung cấp một cách làm tắt, lệnh {Increase Indent} dưới trình đơn {Text}.
Bản nháp đầu tiên của hàm trong đó không có biến đầu vào như sau:
function res = find_triples () for a=1:3 for b=a:4 c = hypotenuse(a, b); flag = isintegral(c); if flag [a, b, c] end end end end
Cặp ngoặc tròn trong đó không có gì ở dấu của hàm là không cần thiết, nhưng chúng làm rõ là không có biến đầu vào nào. Tương tự, khi tôi gọi một hàm mới, tôi cũng ưa dùng cặp ngoặc để tự nhủ rằng đó là một hàm chứ không phải nội dung tập tin lệnh:
>> find_triples()
Biến đầu ra cũng không nhất thiết phải có; nó không bao giờ được gán một giá trị. Nhưng tôi vẫn đặt nó ở đây như một thói quen, cũng là nhờ vậy mà các dấu hàm của tôi tất cả đều có chung một dạng.
Bước tiếp theo là khái quát hóa hàm này bằng cách thêm các biến đầu vào. Cách khái quát khá tự nhiên là thay thế các hằng số 3 và 4 bằng một biến để ta có thể tìm kiếm trên một khoảng lớn tùy ý.
function res = find_triples (n) for a=1:n for b=a:n c = hypotenuse(a, b); flag = isintegral(c); if flag [a, b, c] end end end end
Sau đây là các kết quả thu được trong khoảng từ 1 đến 15:
>> find_triples(15) ans = 3 4 5 ans = 5 12 13 ans = 6 8 10 ans = 8 15 17 ans = 9 12 15
Trong các kết quả này có cái hay, có cái không. Các cặp 5,12,13 và 8,15,17 thật sự “mới,” còn các cặp khác chỉ là các bội số của cặp 3,4,5 mà ta đã biết.
11. Một sai sót
Khi bạn thay đổi dấu của hàm, bạn cũng phải thay đổi tất cả mọi chỗ gọi đến hàm đó. Chẳng hạn, nếu tôi định thêm một biến thứ ba vào
hypotenuse:
function res = hypotenuse(a, b, d) res = (a.^d + b.^d) ^ (1/d); end
Khi
d bằng 2, hàm này có tác dụng giống như cũ. Hiện không có lý do nào phù hợp để khái quát hàm này theo cách trên; đây chỉ là ví dụ. Bây giờ khi bạn chạy
find_triples, bạn sẽ nhận được:
>> find_triples(20) ??? Input argument "d" is undefined. Error in ==> hypotenuse at 2 res = (a.^d + b.^d) ^ (1/d); Error in ==> find_triples at 7 c = hypotenuse(a, b);
Như vậy thật khó tìm ra lỗi. Đây là một ví dụ cho kĩ thuật phát triển mà đôi khi có ích: thay vì tìm kiếm mọi chỗ trong chương trình có dùng đến
hypotenuse, bạn có thể chạy chương trình và theo các dòng thông báo để tìm ra lỗi.
Nhưng kĩ thuật này rất mạo hiểm, đặc biệt khi các thông báo lỗi đưa ra gợi ý phải sửa đổi những gì. Nếu bạn làm theo chúng, bạn có thể làm biến mất thông báo lỗi, nhưng điều đó không có nghĩa là chương trình đã làm đúng điều ta muốn. MATLAB không biết rằng chương trình cần phải làm gì, mà bạn phải có trách nhiệm về điều này.
Và từ đó dẫn đến Định lý thứ tám về gỡ lỗi:
Các lời thông báo lỗi đôi khi bảo cho bạn biết điều gì trục trặc, nhưng hiếm khi chúng bảo cho bạn cách làm (và nếu chúng cố gắng giúp đi nữa thì cũng thường nói sai).
12.
continue
Ở khâu cải tiến cuối cùng, ta hãy sửa hàm này sao cho nó chỉ hiểu thị những bộ ba số Py-ta-go “thấp nhất”, chứ không kể tất cả các bội số của chúng.
Cách làm đơn giản nhất để loại bỏ các bội số là kiểm tra xem a và b có thừa số chung hay không. Nếu có, thì việc chia các số này cho thừa số chung sẽ cho ra một bộ ba số nhỏ hơn mà ta đã kiểm tra.
MATLAB có một hàm
gcd để tính ước số chung nhỏ nhất của hai số. Nếu kết quả lớn hơn 1, thì a và b có một ước số chung và ta có thể dùng lệnh
continue để nhảy sang cặp tiếp theo:
function res = find_triples (n) for a=1:n for b=a:n if gcd(a,b) > 1 continue end c = hypotenuse(a, b); if isintegral(c) [a, b, c] end end end end
continue làm cho chương trình dừng vòng lặp hiện tại (tức là không thực hiện phần còn lại của thân lệnh nữa), nhảy đến đầu vòng lặp, và “tiếp tục” với lượt lặp liền sau.
Trong trường hợp này, vì ta có hai vòng lặp nên sẽ không hiển nhiên là vòng lặp nào được nhảy đến, nhưng quy tắc là nhảy đến vòng lặp sâu bên trong nhất (đúng theo ý định của ta ở đây).
Tôi cũng làm đơn giản chương trình một chút bằng cách loại bỏ
flag và dùng
isintegral làm điều kiện cho lệnh
if.
Sau đây là các kết quả với
n=40:
>> find_triples(40) ans = 3 4 5 ans = 5 12 13 ans = 7 24 25 ans = 8 15 17 ans = 9 40 41 ans = 12 35 37 ans = 20 21 29
Có một sự liên hệ thú vị giữa các số Fibonacci và cặp số Py-ta-go. Nếu F là một dãy số Fibonacci, thì
(FnFn+3 , 2Fn+1Fn+2 , Fn+12 + Fn+22)
là một cặp số Py-ta-go với mọi n ≥ 1.
Hãy viết một hàm có tên
fib_tripleđể nhận vào một biến
n, dùng
fibonacci2để tính
nsố Fibonacci đầu tiên, rồi kiểm tra xem công thức nói trên có tạo thành bộ ba số Py-ta-go với mỗi số trong dãy không.
13. Khoa học và niềm tin
Ta hãy xem lại một loạt các bước xảy ra khi bạn gọi một hàm:
- Trước khi hàm bắt đầu chạy, MATLAB tạo ra một không gian làm việc mới cho nó.
- MATLAB lượng giá từng đối số và gán các giá trị tìm được lần lượt cho từng biến đầu vào (vốn tồn tại trong không gian làm việc mới).
- Mã lệnh ở phần thân của hàm được thực thi. Đâu đó trong phần thân (thường là ở dòng cuối cùng) một giá trị sẽ được gán cho biến đầu ra.
- Không gian làm việc của hàm bị xóa bỏ; thứ duy nhất còn lại là giá trị của biến đầu ra và mọi hiệu ứng phụ của hàm (như hiển thị các giá trị hoặc vẽ một hình).
- Chương trình tiếp tục tại điểm mà nó tạm dừng để thực hiện hàm. Giá trị của lời gọi hàm là giá trị của biến đầu ra.
Khi bạn đang đọc chương trình và gặp một lời gọi hàm, có hai cách diễn giải nó:
- Bạn có thể nghĩ cách khoa học như tôi đã trình bày, và theo các bước thực hiện của chương trình, tiến vào trong hàm rồi sau đó trở lại, hoặc
- Bạn có dựa vào “niềm tin”: giả sử rằng hàm hoạt động đúng, và đọc tiếp lệnh sau lời gọi hàm đó.
Khi bạn dùng những hàm lập sẵn, cách tự nhiên là dựa vào niềm tin, một phần là do bạn trông đợi rằng đại đa số các hàm MATLAB đều hoạt động đúng, và một phần là do bạn không xem được mã lệnh bên trong phần thân hàm.
Khi bắt đầu tự viết các hàm, bạn có thể sẽ tự thấy mình trong đi theo “luồng thực hiện” của chương trình. Điều này có thể giúp ích khi bạn đang học, nhưng khi đã có kinh nghiệm, bạn nên quen với ý tưởng viết một hàm, kiểm tra để đảm bảo nó chạy đúng, và sau đó quên đi những chi tiết về cách hoạt động của nó.
Việc quên đi các chi tiết được gọi là trừu tượng hóa; trong ngữ cảnh này, trừu tượng hóa có nghĩa là quên đi cách hoạt động của một hàm, và chỉ giả sử (sau khi kiểm tra hợp lý) rằng hàm chạy được.
14. Thuật ngữ
- hiệu ứng phụ:
- Hiệu ứng như thay đổi không gian làm việc, mà không phải là mục đích của chương trình.
- xung đột về tên:
- Hoàn cảnh trong đó hai tập tin chương trình dùng cùng một tên biến đã can thiệp nhau.
- biến đầu vào:
- Biến trong một hàm, được nhận giá trị từ một trong các đối số, khi ta gọi hàm.
- biến đầu ra:
- Biến trong một hàm, dùng để trả một giá trị từ hàm về chương trình gọi.
- dấu của hàm:
- Dòng đầu tiên của một lời định nghĩa hàm, trong đó có chỉ định tên hàm, các biến đầu vào và biến đầu ra.
- hàm lặng:
- Hàm không làm hiển thị giá trị nào, cũng không vẽ hình hay có bất kì hiệu ứng phụ gì.
- hàm logic:
- Hàm trả lại một giá trị logic (1 đóng vai trò “đúng” và 0 đóng vai trò “sai”).
- bao bọc:
- Quá trình gói một phần của chương trình vào trong một hàm nhằm hạn chế những tương tác (trong đó có xung đột về tên) giữa hàm và phần còn lại của chương trình.
- khái quát hóa:
- Làm cho hàm trở nên linh hoạt hơn bằng cách thay những giá trị cụ thể bằng các biến đầu vào.
- trừu tượng hóa:
- Sự bỏ qua những chi tiết hoạt động của một hàm nhằm tập trung vào một mô hình đơn giản hơn: hàm làm việc gì?
15. Bài tập
Chọn bất kì tập tin lệnh nào bạn đã viết, bao bọc nó vào trong một hàm có tên thích hợp, rồi khái quát hóa hàm này bằng cách bổ sung một hoặc nhiều biến đầu vào.
Làm cho hàm trở nên lặng bằng cách gọi nó từ Command Window và đảm bảo rằng bạn có thể hiển thị giá trị đầu ra.
5 responses to “Chương 5: Hàm”
Pingback: Chương 1. Các biến và giá trị | Blog của Chiến
Pingback: Chương 11: Tối ưu hóa và nội suy | Blog của Chiến
Pingback: Chương 6: Tìm nghiệm | Blog của Chiến
Pingback: Mô hình hóa hiện tượng vật lý bằng MATLAB | Blog của Chiến
Thần tượng anh quá ^^

markdown:
Trở về
[Mục lục](https://quangchien.wordpress.com/2012/03/16/sach-matlab/#toc) cuốn sách
### 1. Sự xung đột về tên
Hãy nhớ rằng tất cả các tập tin lệnh bạn viết đều chạy trong cùng một không gian làm việc, vì vậy nếu một chương trình làm thay đổi giá trị một biến thì tất cả các chương trình khác đều thấy được sự thay đổi đó. Với một ít các chương trình đơn giản, điều này không đáng kể, nhưng rồi sau này những tương tác giữa các chương trình trở nên không thể quản lý được.
Chẳng hạn, chương trình sau tính tổng của
n số đầu tiên trong một dãy hình học, nhưng cũng có
**hiệu ứng phụ** là gán các giá trị cho
A1,
total,
i và
a.
A1 = 1; total = 0; for i=1:10 a = A1 * 0.5^(i-1); total = total + a; end ans = total
Nếu bạn dùng bất cứ tến biến nào nêu trên trước khi gọi mã lệnh này thì bạn có thể sẽ ngạc nhiên khi thấy rằng sau khi chạy đoạn chương trình, các giá trị đó đã thay đổi. Nếu bạn có 2 đoạn chương trình dùng cùng tên biến, bạn có thể thấy rằng chúng hoạt động riêng biệt nhưng đổ vỡ khi bạn cố gắng kết hợp các chương trình lại. Kiểu tương tác này được gọi là
**xung đột về tên**.
Khi số tập tin lệnh của bạn viết tăng lên, đồng thời cũng dài hơn và phức tạp hơn thì sự xung đột về tên càng nghiêm trọng. Để tránh được vấn đề này, cần tạo ra các hàm.
### 2. Hàm
Một
**hàm** cũng giống như một tập tin lệnh, chỉ khác ở chỗ
- Mỗi hàm có không gian làm việc riêng của nó, vì vậy bất kì biến nào được định nghĩa trong hàm đều chỉ tồn tại khi hàm đang chạy, và không ảnh hưởng đến các biến trong không gian làm việc khác, ngay cả khi các biến đó có cùng tên.
- Các dữ liệu đầu vào và kết quả đầu ra của hàm đều được định nghĩa một cách cẩn thận để tránh sự tương tác không mong muốn.
Để định nghĩa một hàm, bạn cần tạo ra một tập tin M với tên gọi mong muốn, và đặt một lời định nghĩa hàm vào trong đó. Chẳng hạn, để tạo ra một hàm có tên
myfunc, hãy tạo ra tập tin M là
myfunc.m và đặt vào đó định nghĩa hàm sau.
function res = myfunc(x) s = sin(x) c = cos(x) res = abs(s) + abs(c) end
Từ đầu tiên của tập tin phải là
function, vì đó là dấu hiệu đẻ MATLAB nhận biết một tập tin hàm thay vì tập tin lệnh.
Một định nghĩa hàm chính là một câu lệnh phức hợp. Dòng đầu tiên là
**dấu** của hàm; nó chỉ định các số liệu đầu vào và đầu ra của hàm. Trong trường hợp này **biến đầu vào** có tên là
x. Khi hàm này được gọi, đối số do người dùng cung cấp sẽ được gán cho
x.
**Biến đầu ra** được gọi là
res, chữ viết tắt của “result” (kết quả). Bạn có thể gọi biến đầu ra bằng tên gì cũng được, nhưng theo thông lệ, tôi thường đặt nó là
res. Thường thì việc cuối cùng mà một hàm thực hiện là gán một giá trị cho biến đầu ra.
Một khi bạn đã định nghĩa một hàm mới, bạn có thể gọi nó theo cách giống như gọi các hàm có sẵn trong MATLAB. Nếu bạn gọi hàm như một câu lệnh, MATLAB sẽ đặt kết quả vào
ans:
>> myfunc(1) s = 0.84147098480790 c = 0.54030230586814 res = 1.38177329067604 ans = 1.38177329067604
Nhưng thường thấy hơn (đồng thời là cách tốt hơn) là nên gán kết quả cho một biến:
>> y = myfunc(1) s = 0.84147098480790 c = 0.54030230586814 res = 1.38177329067604 y = 1.38177329067604
Khi bạn gỡ lỗi một hàm mới, có thể bạn sẽ phải hiển thị các giá trị trung gian như thế này, nhưng một khi hàm đã chạy tốt, bạn sẽ phải thêm vào các dấu chấm phẩy để khiến nó trở thành một
**hàm lặng**. Đa số các hàm có sẵn trong MATLAB đều là hàm lặng, chúng tính ra kết quả, nhưng không hiển thị gì (ngoại trừ những thông báo trong một số trường hợp).
Mỗi hàm có một không gian làm việc riêng của nó, vốn được tạo ra khi hàm bắt đầu chạy và bị xóa đi khi hàm kết thúc. Nếu bạn thử truy cập (đọc hay ghi) biến được định nghĩa bên trong hàm, bạn sẽ thấy nó không tồn tại.
>> clear >> y = myfunc(1); >> who Your variables are: y >> s ??? Undefined function or variable 's'.
Giá trị duy nhất của hàm mà bạn có thể truy cập được là kết quả của nó, ở đây là giá trị gán cho biến
y.
Nếu bạn có các biến tên là
s hoặc
c trong không gian làm việc trước khi gọi
myfunc, chúng sẽ vẫn ở đó ngay cả khi hàm kết thúc.
>> s = 1; >> c = 1; >> y = myfunc(1); >> s, c s = 1 c = 1
Như vậy ở trong hàm bạn có thể dùng bất kì tên biến nào bạn muốn mà không sợ xung đột.
### 3. Thông tin về hàm
Tại chỗ bắt đầu của mỗi tập tin hàm, bạn nên ghi một lời chú thích nhằm giải thích tác dụng của hàm được viết ra.
% res = myfunc (x) % Compute the Manhattan distance from the origin to the % point on the unit circle with angle (x) in radians. function res = myfunc (x) s = sin(x); c = cos(x); res = abs(s) + abs(c); end
khi bạn yêu cầu trợ giúp bằng
help, MATLAB sẽ in ra lời chú thích mà bạn đã ghi.
>> help myfunc res = myfunc (x) Compute the Manhattan distance from the origin to the point on the unit circle with angle (x) in radians.
Có nhiều điều trong thông lệ viết các lời chú thích này. Một số chi tiết nên đưa vào bao gồm:
- Dấu của hàm, bao gồm tên hàm, (các) biến đầu vào, và (các) biến đầu ra.
- Một lời mô tả rõ ràng, ngắn gọn về công dụng của hàm. Lời mô tả phải
**khái quát**: nên bỏ qua những chi tiết về *cách*hoạt động của hàm, mà chỉ bao gồm những thông tin mà người dùng hàm muốn biết. Bạn có thể thêm vào các chú thích bên trong hàm để lý giải những chi tiết.
- Một lời giải thích ý nghĩa các biến đầu vào; chẳng hạn, trong trường hợp này cần lưu ý rằng
xđược coi là số đo góc tính theo ra-đian.
- Các điều kiện đầu và điều kiện cuối.
### 4. Tên hàm
Có ba điều rất phải lưu ý khi bạn mới đặt tên hàm. Thứ nhất là tên “thực sự” của hàm được quyết định bởi tên tập tin chứ
*không* phải tên mà bạn ghi ở dấu của hàm. Theo phong cách, bạn nên chắc rằng hai cái tên này phải luôn giống nhau, nhưng nếu bạn lầm, hoặc đã đổi tên của hàm, thì rất dễ bị rối.
Theo tinh thần cố ý gây lỗi, hãy thử đổi tên hàm từ
myfunc sang
something_else, và chạy lại hàm đó.
Đây là những gì bạn đưa vào trong
myfunc.m:
function res = something_else (x) s = sin(x); c = cos(x); res = abs(s) + abs(c); end
Và đây là những gì bạn nhận được:
>> y = myfunc(1); >> y = something_else(1); ??? Undefined command/function 'something_else'.
Điều thứ hai là tên của tập tin không được phép chứa dấu cách. Chẳng hạn, nếu bạn viết một hàm và đặt tên tập tin là
my func.m, thì mặc dù trình soạn thảo MATLAB vẫn đồng ý, nhưng khi thử chạy, bạn sẽ nhận được:
>> y = my func(1) ??? y = my func(1) | Error: Unexpected MATLAB expression.
Điều thứ ba là tên hàm được viết có thể xung đột với các hàm lập sẵn của MATLAB. Chẳng hạn, nếu bạn tạo ra tập tin M có tên
sum.m, rồi gọi
sum, MATLAB có thể sẽ gọi hàm mới do
*bạn* viết, chứ không phải hàm lập sẵn! Hàm nào được gọi sẽ tùy thuộc vào thứ tự của các thư mục xếp trong đường dẫn tìm kiếm, và (trong một số trường hợp) phụ thuộc vào đối số. Chẳng hạn, hãy đặt các lệnh sau vào tập tin có tên
sum.m:
function res = sum(x) res = 7; end
Rồi thử gõ:
>> sum(1:3) ans = 6 >> sum ans = 7
Trong trường hợp đầu MATLAB đã dùng hàm lập sẵn; ở trường hợp thứ hai nó thực hiện hàm bạn viết! Kiểu tương tác này có thể rất gây lẫn. Trước khi tạo ra hàm mới, bạn cần kiểm tra xem có sẵn hàm nào của MATLAB có cùng tên không. Nếu có, hãy đặt một tên khác!
### 5. Nhiều biến đầu vào
Các hàm có thể, và thường, nhận nhiều biến đầu vào. Chẳng hạn, hàm sau đây nhận hai biến đầu vào,
a và
b:
function res = hypotenuse(a, b) res = sqrt(a^2 + b^2); end
Nếu bạn còn nhớ Định lý Py-ta-go, bạn có thể đã hình dung ra là hàm này để tính chiều dài cạnh huyền của tam giác vuông nếu các cạnh góc vuông là
a và
b. (Có một hàm MATLAB tên là
hypot thực hiện điều tương tự.)
Nếu ta gọi nó từ Command Window với các đối số 3 và 4, ta có thể chắc rằng chiều dài cạnh thứ ba sẽ bằng 5.
>> c = hypotenuse(3, 4) c = 5
Các đối số mà bạn cấp vào đây được gán cho các biến đầu vào theo đúng thứ tự, vì vậy ở trường hợp này 3 được gán cho
a còn 4 được gán cho
b. MATLAB kiểm tra để đảm bảo rằng bạn cung cấp đủ đối số; nếu cung cấp thiếu, bạn sẽ nhận được:
>> c = hypotenuse(3) ??? Input argument "b" is undefined. Error in ==> hypotenuse at 2 res = sqrt(a^2 + b^2);
Thông báo lỗi này dễ gây nhầm lẫn, vì nó gợi ý rằng trục trặc xảy ra ở
hypotenuse thay vì ở lời gọi hàm. Hãy nhớ điều đó khi bạn gỡ lỗi.
Nếu cung cấp thừa đối số, bạn sẽ nhận được:
>> c = hypotenuse(3, 4, 5) ??? Error using ==> hypotenuse Too many input arguments.
Đây là thông báo lỗi hay hơn.
### 6. Các hàm logic
Ở Mục toán tử logic ta đã dùng các toán tử logic để so sánh các giá trị. MATLAB cũng cung cấp các
**hàm logic** để kiểm tra những điều kiện nhất định và trả lại những giá trị logic: 1 với nghĩa là “đúng” và 0 với nghĩa là “sai”.
Chẳng hạn,
isprime dùng để kiểm tra xem số đã cho có phải là số nguyên tố hay không.
>> isprime(17) ans = 1 >> isprime(21) ans = 0
Các hàm
isscalar và
isvector là để kiểm tra xem một giá trị là số vô hướng hay véc-tơ; nếu cả hai đều sai, bạn có thể tạm coi đối số là một ma trận.
Để kiểm tra xem một giá trị bạn đã tính có phải là số nguyên không, bạn có thể muốn dùng
isinteger. Nhưng cách làm này sai.
isinteger kiểm tra xem giá trị có thuộc về một trong bốn kiểu số nguyên (một chủ đề mà ta chưa bàn luận đến), chứ nó không kiểm tra xem một số có dấu phẩy động tình cờ nhận giá trị nguyên hay không.
>> c = hypotenuse(3, 4) c = 5 >> isinteger(c) ans = 0
Để làm điều này, ta cần tự viết một hàm logic, và sẽ gọi nó là
isintegral:
function res = isintegral(x) if round(x) == x res = 1; else res = 0; end end
Hàm này dùng được trong phần lớn các trường hợp, nhưng nhớ rằng các giá trị dấu phẩy động chỉ xấp xỉ đúng, trong một số trường hợp giá trị xấp xỉ là số nguyên nhưng giá trị thực lại không phải.
### 7. Một ví dụ phát triển tăng dần
Giả dụ rẳng ta muốn viết một chương trình tìm các “bộ ba số Py-ta-go”: những tập hợp số nguyên như 3, 4, và 5, là độ dài các cạnh của một tam giác vuông. Nói cách khác, ta muốn tìm các giá trị nguyên
*a*, *b* và *c* sao cho *a* 2+ *b* 2= *c* 2.
Sau đây là các bước mà ta sẽ làm theo để phát triển chương trình một cách tăng dần.
- Viết một tập tin lệnh có tên
find_triplesvà bắt đầu với một câu lệnh đơn giản như
x=5.
- Viết một vòng lặp để liệt kê các giá trị
*a*từ 1 đến 3, và hiển thị chúng.
- Viết một vòng lặp lồng ghép để liệt kê các giá trị
*b*từ 1 đến 4, và hiển thị chúng.
- Bên trong vòng lặp, gọi
hypotenuseđể tính
*c*và hiển thị nó.
- Dùng
isintegralđể kiểm tra xem
*c*có bằng một số nguyên hay không.
- Dùng một lệnh if để chỉ in ra những cặp giá trị
*a*, *b*và *c*nào thỏa mãn điều kiện.
- Chuyển nội dung tập tin lệnh vào trong một hàm.
- Khái quát hóa hàm này để nhận vào các biến chỉ định khoảng các giá trị cần được tìm kiếm.
Như vậy bản nháp đầu tiên của chương trình này là
x=5, trông có vẻ ngốc nghếch, nhưng nếu bạn bắt đầu một cách đơn giản và mỗi lúc chỉ thêm vào ít một, bạn sẽ tránh được gỡ lỗi rất nhiều.
Sau đây là bản nháp thứ hai:
for a=1:3 a end
Ở mỗi bước, chương trình đều có thể chạy thử được: nó có in ra kết quả (hay một hiệu ứng thấy được) mà ta có thể kiểm tra.
### 8. Vòng lặp lồng ghép
Bản nháp thứ ba chứa một vòng lặp lồng ghép:
for a=1:3 a for b=1:4 b end end
Vòng lặp trong được thực hiện 3 lần, mỗi lần với một giá trị khác nhau của
a, vì vậy sau đây là kết quả (tôi đã chỉnh lại độ dãn cách để làm nổi bật cấu trúc):
>> find_triples a = 1 b = 1 b = 2 b = 3 b = 4 a = 2 b = 1 b = 2 b = 3 b = 4 a = 3 b = 1 b = 2 b = 3 b = 4
Bước tiếp theo là tính
*c* với mỗi cặp giá trị của *a* và *b*.
for a=1:3 for b=1:4 c = hypotenuse(a, b); [a, b, c] end end
Để hiển thị các giá trị của
a,
b và
c, tôi dùng đến một đặc điểm của MATLAB mà ta chưa gặp. Toán tử ngoặc vuông tạo ra một ma trận mới mà, khi được hiển thị, sẽ cho thấy các giá trị trên cùng một dòng:
>> find_triples ans = 1.0000 1.0000 1.4142 ans = 1.0000 2.0000 2.2361 ans = 1.0000 3.0000 3.1623 ans = 1.0000 4.0000 4.1231 ans = 2.0000 1.0000 2.2361 ans = 2.0000 2.0000 2.8284 ans = 2.0000 3.0000 3.6056 ans = 2.0000 4.0000 4.4721 ans = 3.0000 1.0000 3.1623 ans = 3.0000 2.0000 3.6056 ans = 3.0000 3.0000 4.2426 ans = 3 4 5
Bạn đọc tinh mắt sẽ phát hiện được rằng chúng ta đang lãng phí một ít công sức lập trình. Sau khi kiểm tra
*a*=1 và *b*=2, sẽ chẳng cần kiểm tra *a*=2 và *b*=1. Ta có thể loại bỏ công việc thừa này bằng cách chỉnh lại khoảng lặp của vòng thứ hai:
for a=1:3 for b=a:4 c = hypotenuse(a, b); [a, b, c] end end
Nếu bạn vẫn theo kịp nội dung, hãy chạy phiên bản mã lệnh này và chắc chắn rằng nó cho kết quả như mong muốn.
### 9. Điều kiện và cờ
Bước tiếp theo là kiểm tra xem giá trị
*c* có nguyên không. Vòng lặp này gọi
isintegral và in ra giá trị logic thu được.
for a=1:3 for b=a:4 c = hypotenuse(a, b); flag = isintegral(c); [c, flag] end end
Bằng cách không hiển thị
a và
b tôi làm cho việc soát kết quả dễ dàng hơn để đảm bảo rằng các giá trị của
c và
flag trông đúng đắn.
>> find_triples ans = 1.4142 0 ans = 2.2361 0 ans = 3.1623 0 ans = 4.1231 0 ans = 2.8284 0 ans = 3.6056 0 ans = 4.4721 0 ans = 4.2426 0 ans = 5 1
Tôi chọn các khoảng
a và
b đều nhỏ (vì vậy số dòng kết quả đầu ra có thể kiểm soát được), nhưng phải bao gồm ít nhất là một bộ ba số Py-ta-go. Một khó khăn thường gặp khi gỡ lỗi là phải phát sinh đủ kết quả để cho thấy rằng mã lệnh có (hoặc không) hoạt động mà không quá thừa thãi.
Bước tiếp theo là dùng
flag để chỉ hiển thị những bộ ba thỏa mãn yêu cầu:
for a=1:3 for b=a:4 c = hypotenuse(a, b); flag = isintegral(c); if flag [a, b, c] end end end
Bây giờ kết quả đẹp và đơn giản hơn:
>> find_triples ans = 3 4 5
### 10. Bao bọc và khái quát hóa
Dưới dạng tập tin lệnh, chương trình này có tác dụng phụ là đã gán các giá trị cho
a,
b,
c và
flag, vốn sẽ làm chương trình khó dùng hơn khi các tên biến trên đang được sử dụng. Bằng cách bọc mã lệnh này vào trong một hàm, ta có thể tránh được sự xung đột về tên; quá trình này được gọi là
**bao bọc** vì nó cô lập chương trình khỏi không gian làm việc.
Để đưa mã lệnh đã viết vào trong một hàm, ta phải viết thụt đầu dòng toàn bộ. Trình soạn thảo MATLAB cung cấp một cách làm tắt, lệnh {Increase Indent} dưới trình đơn {Text}.
Bản nháp đầu tiên của hàm trong đó không có biến đầu vào như sau:
function res = find_triples () for a=1:3 for b=a:4 c = hypotenuse(a, b); flag = isintegral(c); if flag [a, b, c] end end end end
Cặp ngoặc tròn trong đó không có gì ở dấu của hàm là không cần thiết, nhưng chúng làm rõ là không có biến đầu vào nào. Tương tự, khi tôi gọi một hàm mới, tôi cũng ưa dùng cặp ngoặc để tự nhủ rằng đó là một hàm chứ không phải nội dung tập tin lệnh:
>> find_triples()
Biến đầu ra cũng không nhất thiết phải có; nó không bao giờ được gán một giá trị. Nhưng tôi vẫn đặt nó ở đây như một thói quen, cũng là nhờ vậy mà các dấu hàm của tôi tất cả đều có chung một dạng.
Bước tiếp theo là khái quát hóa hàm này bằng cách thêm các biến đầu vào. Cách khái quát khá tự nhiên là thay thế các hằng số 3 và 4 bằng một biến để ta có thể tìm kiếm trên một khoảng lớn tùy ý.
function res = find_triples (n) for a=1:n for b=a:n c = hypotenuse(a, b); flag = isintegral(c); if flag [a, b, c] end end end end
Sau đây là các kết quả thu được trong khoảng từ 1 đến 15:
>> find_triples(15) ans = 3 4 5 ans = 5 12 13 ans = 6 8 10 ans = 8 15 17 ans = 9 12 15
Trong các kết quả này có cái hay, có cái không. Các cặp 5,12,13 và 8,15,17 thật sự “mới,” còn các cặp khác chỉ là các bội số của cặp 3,4,5 mà ta đã biết.
### 11. Một sai sót
Khi bạn thay đổi dấu của hàm, bạn cũng phải thay đổi tất cả mọi chỗ gọi đến hàm đó. Chẳng hạn, nếu tôi định thêm một biến thứ ba vào
hypotenuse:
function res = hypotenuse(a, b, d) res = (a.^d + b.^d) ^ (1/d); end
Khi
d bằng 2, hàm này có tác dụng giống như cũ. Hiện không có lý do nào phù hợp để khái quát hàm này theo cách trên; đây chỉ là ví dụ. Bây giờ khi bạn chạy
find_triples, bạn sẽ nhận được:
>> find_triples(20) ??? Input argument "d" is undefined. Error in ==> hypotenuse at 2 res = (a.^d + b.^d) ^ (1/d); Error in ==> find_triples at 7 c = hypotenuse(a, b);
Như vậy thật khó tìm ra lỗi. Đây là một ví dụ cho kĩ thuật phát triển mà đôi khi có ích: thay vì tìm kiếm mọi chỗ trong chương trình có dùng đến
hypotenuse, bạn có thể chạy chương trình và theo các dòng thông báo để tìm ra lỗi.
Nhưng kĩ thuật này rất mạo hiểm, đặc biệt khi các thông báo lỗi đưa ra gợi ý phải sửa đổi những gì. Nếu bạn làm theo chúng, bạn có thể làm biến mất thông báo lỗi, nhưng điều đó không có nghĩa là chương trình đã làm đúng điều ta muốn. MATLAB không biết rằng chương trình
*cần phải* làm gì, mà bạn phải có trách nhiệm về điều này.
Và từ đó dẫn đến Định lý thứ tám về gỡ lỗi:
Các lời thông báo lỗi đôi khi bảo cho bạn biết điều gì trục trặc, nhưng hiếm khi chúng bảo cho bạn cách làm (và nếu chúng cố gắng giúp đi nữa thì cũng thường nói sai).
### 12.
continue
Ở khâu cải tiến cuối cùng, ta hãy sửa hàm này sao cho nó chỉ hiểu thị những bộ ba số Py-ta-go “thấp nhất”, chứ không kể tất cả các bội số của chúng.
Cách làm đơn giản nhất để loại bỏ các bội số là kiểm tra xem
*a* và *b* có thừa số chung hay không. Nếu có, thì việc chia các số này cho thừa số chung sẽ cho ra một bộ ba số nhỏ hơn mà ta đã kiểm tra.
MATLAB có một hàm
gcd để tính ước số chung nhỏ nhất của hai số. Nếu kết quả lớn hơn 1, thì
*a* và *b* có một ước số chung và ta có thể dùng lệnh
continue để nhảy sang cặp tiếp theo:
function res = find_triples (n) for a=1:n for b=a:n if gcd(a,b) > 1 continue end c = hypotenuse(a, b); if isintegral(c) [a, b, c] end end end end
continue làm cho chương trình dừng vòng lặp hiện tại (tức là không thực hiện phần còn lại của thân lệnh nữa), nhảy đến đầu vòng lặp, và “tiếp tục” với lượt lặp liền sau.
Trong trường hợp này, vì ta có hai vòng lặp nên sẽ không hiển nhiên là vòng lặp nào được nhảy đến, nhưng quy tắc là nhảy đến vòng lặp sâu bên trong nhất (đúng theo ý định của ta ở đây).
Tôi cũng làm đơn giản chương trình một chút bằng cách loại bỏ
flag và dùng
isintegral làm điều kiện cho lệnh
if.
Sau đây là các kết quả với
n=40:
>> find_triples(40) ans = 3 4 5 ans = 5 12 13 ans = 7 24 25 ans = 8 15 17 ans = 9 40 41 ans = 12 35 37 ans = 20 21 29
Có một sự liên hệ thú vị giữa các số Fibonacci và cặp số Py-ta-go. Nếu
*F* là một dãy số Fibonacci, thì
(
*F* n *F* , 2 n+3 *F* *n*+1 *F* , *n*+2 *F* *n*+1 2+ *F* *n*+2 2)
là một cặp số Py-ta-go với mọi
*n* ≥ 1.
Hãy viết một hàm có tên
fib_tripleđể nhận vào một biến
n, dùng
fibonacci2để tính
nsố Fibonacci đầu tiên, rồi kiểm tra xem công thức nói trên có tạo thành bộ ba số Py-ta-go với mỗi số trong dãy không.
### 13. Khoa học và niềm tin
Ta hãy xem lại một loạt các bước xảy ra khi bạn gọi một hàm:
- Trước khi hàm bắt đầu chạy, MATLAB tạo ra một không gian làm việc mới cho nó.
- MATLAB lượng giá từng đối số và gán các giá trị tìm được lần lượt cho từng biến đầu vào (vốn tồn tại trong không gian làm việc
*mới*).
- Mã lệnh ở phần thân của hàm được thực thi. Đâu đó trong phần thân (thường là ở dòng cuối cùng) một giá trị sẽ được gán cho biến đầu ra.
- Không gian làm việc của hàm bị xóa bỏ; thứ duy nhất còn lại là giá trị của biến đầu ra và mọi hiệu ứng phụ của hàm (như hiển thị các giá trị hoặc vẽ một hình).
- Chương trình tiếp tục tại điểm mà nó tạm dừng để thực hiện hàm. Giá trị của lời gọi hàm là giá trị của biến đầu ra.
Khi bạn đang đọc chương trình và gặp một lời gọi hàm, có hai cách diễn giải nó:
- Bạn có thể nghĩ cách khoa học như tôi đã trình bày, và theo các bước thực hiện của chương trình, tiến vào trong hàm rồi sau đó trở lại, hoặc
- Bạn có dựa vào “niềm tin”: giả sử rằng hàm hoạt động đúng, và đọc tiếp lệnh sau lời gọi hàm đó.
Khi bạn dùng những hàm lập sẵn, cách tự nhiên là dựa vào niềm tin, một phần là do bạn trông đợi rằng đại đa số các hàm MATLAB đều hoạt động đúng, và một phần là do bạn không xem được mã lệnh bên trong phần thân hàm.
Khi bắt đầu tự viết các hàm, bạn có thể sẽ tự thấy mình trong đi theo “luồng thực hiện” của chương trình. Điều này có thể giúp ích khi bạn đang học, nhưng khi đã có kinh nghiệm, bạn nên quen với ý tưởng viết một hàm, kiểm tra để đảm bảo nó chạy đúng, và sau đó quên đi những chi tiết về cách hoạt động của nó.
Việc quên đi các chi tiết được gọi là
**trừu tượng hóa**; trong ngữ cảnh này, trừu tượng hóa có nghĩa là quên đi *cách* hoạt động của một hàm, và chỉ giả sử (sau khi kiểm tra hợp lý) rằng hàm chạy được.
### 14. Thuật ngữ
- hiệu ứng phụ:
- Hiệu ứng như thay đổi không gian làm việc, mà không phải là mục đích của chương trình.
- xung đột về tên:
- Hoàn cảnh trong đó hai tập tin chương trình dùng cùng một tên biến đã can thiệp nhau.
- biến đầu vào:
- Biến trong một hàm, được nhận giá trị từ một trong các đối số, khi ta gọi hàm.
- biến đầu ra:
- Biến trong một hàm, dùng để trả một giá trị từ hàm về chương trình gọi.
- dấu của hàm:
- Dòng đầu tiên của một lời định nghĩa hàm, trong đó có chỉ định tên hàm, các biến đầu vào và biến đầu ra.
- hàm lặng:
- Hàm không làm hiển thị giá trị nào, cũng không vẽ hình hay có bất kì hiệu ứng phụ gì.
- hàm logic:
- Hàm trả lại một giá trị logic (1 đóng vai trò “đúng” và 0 đóng vai trò “sai”).
- bao bọc:
- Quá trình gói một phần của chương trình vào trong một hàm nhằm hạn chế những tương tác (trong đó có xung đột về tên) giữa hàm và phần còn lại của chương trình.
- khái quát hóa:
- Làm cho hàm trở nên linh hoạt hơn bằng cách thay những giá trị cụ thể bằng các biến đầu vào.
- trừu tượng hóa:
- Sự bỏ qua những chi tiết hoạt động của một hàm nhằm tập trung vào một mô hình đơn giản hơn: hàm làm việc gì?
### 15. Bài tập
Chọn bất kì tập tin lệnh nào bạn đã viết, bao bọc nó vào trong một hàm có tên thích hợp, rồi khái quát hóa hàm này bằng cách bổ sung một hoặc nhiều biến đầu vào.
Làm cho hàm trở nên lặng bằng cách gọi nó từ Command Window và đảm bảo rằng bạn có thể hiển thị giá trị đầu ra.
## 5 responses to “
Chương 5: Hàm”
Pingback: Chương 1. Các biến và giá trị | Blog của Chiến
Pingback: Chương 11: Tối ưu hóa và nội suy | Blog của Chiến
Pingback: Chương 6: Tìm nghiệm | Blog của Chiến
Pingback: Mô hình hóa hiện tượng vật lý bằng MATLAB | Blog của Chiến
Thần tượng anh quá ^^

X-ac: 1.dca _dca


text:
-
Tủ đông mặt kính cong Sanaky VH-682K
12.400.000₫
-
New
-
- 90%
Tủ đông Inverter Sanaky VH-6899K3
139.990.000₫
-
- 11%
Tủ đông Inverter Sanaky VH-1399HY3
28.490.000₫
-
Tủ đông Inverter Sanaky VH-1199HY3
21.500.000₫
-
Tủ mát Inverter Sanaky VH-408K3
10.990.000₫
-
Tủ mát Sanaky VH-408K
9.690.000₫
-
Tủ mát Sanaky VH-6009HP
18.990.000₫
-
- 8%
Tủ mát Inverter Sanaky VH-408W3
10.990.000₫
-
- 13%
Tủ mát Inverter Sanaky VH-258W3
9.590.000₫
-
Máy lọc nước Sanaky SNK-107NS
5.990.000₫
-
- 8%
Máy lọc nước Sanaky SNK-108NS
6.150.000₫
-
- 4%
Máy lọc nước RO Sanaky SNK-109
4.490.000₫
-
- 17%
Máy lọc nước Sanaky SNK-107N
5.390.000₫
-
- 15%
Máy lọc nước RO Sanaky SNK-S109G
7.750.000₫
-
- 14%
Cây nước nóng lạnh Sanaky VH-339HY1
3.190.000₫
-
- 12%
Cây nước nóng lạnh Sanaky VH-509HY
3.990.000₫
-
- 7%
Cây nước nóng lạnh Sanaky VH-509HP
4.090.000₫
-
Cây nước nóng lạnh Sanaky VH-459HP
3.990.000₫
-
Cây nước nóng lạnh Sanaky VH-329HY
3.370.000₫
-
Lò nướng Sanaky VH-809S2D
3.540.000₫
-
Lò nướng Sanaky VH-129N
3.990.000₫
-
- 11%
Lò nướng Sanaky VH-129S
3.950.000₫
-
- 12%
Lò nướng Sanaky VH-109N 100 lít
3.990.000₫
-
- 16%
Lò nướng Sanaky VH-109S
3.990.000₫

markdown:
![loading loading](https://sanakyvietnam.net/wp-content/plugins/kutetheme-toolkit/js_composer/assets/imgs/loading.gif)
-
[Tủ đông mặt kính cong Sanaky VH-682K](https://sanakyvietnam.net/san-pham/tu-dong-mat-kinh-cong-sanaky-vh-682k/) ~~12.400.000₫~~
-
New
-
- 90%
[Tủ đông Inverter Sanaky VH-6899K3](https://sanakyvietnam.net/san-pham/tu-dong-inverter-sanaky-vh-6899k3/) ~~139.990.000₫~~
-
- 11%
[Tủ đông Inverter Sanaky VH-1399HY3](https://sanakyvietnam.net/san-pham/tu-dong-inverter-sanaky-vh-1399hy3/) ~~28.490.000₫~~
-
[Tủ đông Inverter Sanaky VH-1199HY3](https://sanakyvietnam.net/san-pham/tu-dong-inverter-sanaky-vh-1199hy3/) ~~21.500.000₫~~ ![loading loading](https://sanakyvietnam.net/wp-content/plugins/kutetheme-toolkit/js_composer/assets/imgs/loading.gif)
-
[Tủ mát Inverter Sanaky VH-408K3](https://sanakyvietnam.net/san-pham/tu-mat-inverter-sanaky-vh-408k3/) ~~10.990.000₫~~
-
[Tủ mát Sanaky VH-408K](https://sanakyvietnam.net/san-pham/tu-mat-sanaky-vh-408k/) ~~9.690.000₫~~
-
[Tủ mát Sanaky VH-6009HP](https://sanakyvietnam.net/san-pham/tu-mat-sanaky-vh-6009hp/) ~~18.990.000₫~~
-
- 8%
[Tủ mát Inverter Sanaky VH-408W3](https://sanakyvietnam.net/san-pham/tu-mat-inverter-sanaky-vh-408w3/) ~~10.990.000₫~~
-
- 13%
[Tủ mát Inverter Sanaky VH-258W3](https://sanakyvietnam.net/san-pham/tu-mat-inverter-sanaky-vh-258w3/) ~~9.590.000₫~~ ![loading loading](https://sanakyvietnam.net/wp-content/plugins/kutetheme-toolkit/js_composer/assets/imgs/loading.gif)
-
[Máy lọc nước Sanaky SNK-107NS](https://sanakyvietnam.net/san-pham/may-loc-nuoc-sanaky-snk-107ns/) ~~5.990.000₫~~
-
- 8%
[Máy lọc nước Sanaky SNK-108NS](https://sanakyvietnam.net/san-pham/may-loc-nuoc-sanaky-snk-108ns/) ~~6.150.000₫~~
-
- 4%
[Máy lọc nước RO Sanaky SNK-109](https://sanakyvietnam.net/san-pham/may-loc-nuoc-ro-sanaky-snk-109/) ~~4.490.000₫~~
-
- 17%
[Máy lọc nước Sanaky SNK-107N](https://sanakyvietnam.net/san-pham/may-loc-nuoc-sanaky-snk-107n/) ~~5.390.000₫~~
-
- 15%
[Máy lọc nước RO Sanaky SNK-S109G](https://sanakyvietnam.net/san-pham/may-loc-nuoc-ro-sanaky-snk-s109g/) ~~7.750.000₫~~ ![loading loading](https://sanakyvietnam.net/wp-content/plugins/kutetheme-toolkit/js_composer/assets/imgs/loading.gif)
-
- 14%
[Cây nước nóng lạnh Sanaky VH-339HY1](https://sanakyvietnam.net/san-pham/cay-nuoc-nong-lanh-sanaky-vh-339hy1/) ~~3.190.000₫~~
-
- 12%
[Cây nước nóng lạnh Sanaky VH-509HY](https://sanakyvietnam.net/san-pham/cay-nuoc-nong-lanh-sanaky-vh-509hy/) ~~3.990.000₫~~
-
- 7%
[Cây nước nóng lạnh Sanaky VH-509HP](https://sanakyvietnam.net/san-pham/cay-nuoc-nong-lanh-sanaky-vh-509hp/) ~~4.090.000₫~~
-
[Cây nước nóng lạnh Sanaky VH-459HP](https://sanakyvietnam.net/san-pham/cay-nuoc-nong-lanh-sanaky-vh-459hp/) ~~3.990.000₫~~
-
[Cây nước nóng lạnh Sanaky VH-329HY](https://sanakyvietnam.net/san-pham/cay-nuoc-nong-lanh-sanaky-vh-329hy/) ~~3.370.000₫~~ ![loading loading](https://sanakyvietnam.net/wp-content/plugins/kutetheme-toolkit/js_composer/assets/imgs/loading.gif)
-
[Lò nướng Sanaky VH-809S2D](https://sanakyvietnam.net/san-pham/lo-nuong-sanaky-vh-809s2d/) ~~3.540.000₫~~
-
[Lò nướng Sanaky VH-129N](https://sanakyvietnam.net/san-pham/lo-nuong-sanaky-vh-129n/) ~~3.990.000₫~~
-
- 11%
[Lò nướng Sanaky VH-129S](https://sanakyvietnam.net/san-pham/lo-nuong-sanaky-vh-129s/) ~~3.950.000₫~~
-
- 12%
[Lò nướng Sanaky VH-109N 100 lít](https://sanakyvietnam.net/san-pham/lo-nuong-sanaky-vh-109n/) ~~3.990.000₫~~
-
- 16%
[Lò nướng Sanaky VH-109S](https://sanakyvietnam.net/san-pham/lo-nuong-sanaky-vh-109s/) ~~3.990.000₫~~

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Truncated: length

WARC-Identified-Payload-Type: text/html

Server: LiteSpeed

Connection: close

Pragma: no-cache

Accept-Ranges: bytes

X-Frame-Options: SAMEORIGIN

Cache-Control: private, must-revalidate

Vary: Accept-Encoding

Content-Type: text/html; charset=UTF-8


text:
CÒN MỘT VĨ TUYẾN 17 TRONG TÂM THỨC?
Phạm Tường Vân, theo BBC
Đâu là sự khác nhau khi viết những tác phẩm về chiến tranh ngày hôm qua và những cuộc chiến mới xảy ra hôm nay? Và nhân tố hoà bình sẽ nằm ở đâu trong những tác phẩm ấy? Đến khi nào những câu chuyện hôm qua trở nên chán ngắt?
Chúng tôi vẫn hỏi nhau như vậy, khi bàn chuyện viết.
Lê Quý Dương, đạo diễn sân khấu thế hệ 6x từng chia sẻ một ám ảnh: năm anh 4 tuổi, B52 dội xuống Khâm Thiên, sát nhà anh có bà già câm điếc sống một mình. mỗi khi có còi báo động thì phải chạy qua gọi cụ. Lần ấy Dương bận lo cho mấy đứa em vì bố mẹ đi vắng, không kịp chạy sang, khi còi báo yên anh trồi lên cũng là lúc chứng kiến căn nhà của bà cụ chỉ còn là đống gạch vụn
Món nợ ấy chuyển thành sự câm lặng nơi anh mỗi khi hồi ức chiến tranh trào lên. Anh mang sự câm lặng ấy vào tác phẩm, những vở kịch không lời thời anh du học Úc từng khiến khán giả bản xứ lặng đi giây lát.
Sau Dương vài năm, tôi sinh ra ngay miệng hố bom, giây phút chào đời của tôi đánh dấu bằng tiếng còi báo động. Mẹ tôi vẫn hay nửa đùa nửa thật kể rằng khi ấy, tất cả xuống hầm hết, lũ trẻ sơ sinh, vài đứa chưa được đánh số ở một hầm khác.
Khi lên, họ phát cho mỗi bà mẹ một đứa như phát bánh mì. Mẹ tôi chẳng có thời gian lẫn điều kiện để kiểm tra xem tôi có thực là con ruột của bà không.
Một buổi trưa, mẹ tôi từ nhà máy về, chạy ào vào nhà, làm đổ kềnh cả cái xe đạp vừa dựng. Bà ôm lấy chúng tôi khóc òa: Hòa bình rồi! Đó là ngày 30 tháng 4 năm 1975.
Có hàng ngàn đứa trẻ sinh ra trong năm này mang cái tên Hòa Bình, chúng không còn phải biết đến đạn bom và hầm trú ẩn.
30 tháng 4 màu gì?
Năm 1995, tôi có dịp đến Quảng Trị -Thừa Thiên. Ngay sau chuyến đến thăm nghĩa trang Trường Sơn, tôi gặp một bà mẹ anh hùng trong một ngôi làng bờ bắc sông Bến Hải mà số liệt sĩ gần bằng số hộ dân đang cư trú.
Bà mẹ liệt sĩ đã mất chồng và hai con cho hai cuộc chiến, côi cút trong căn chòi ọp ẹp với một con heo ốm nhom.
Cát trắng không một chút màu mỡ nhưng giấu bên dưới nhiều phế liệu, nguồn thu nhập chính của dân trong vùng. Lâu lâu, một tiếng nổ vang trời lấy đi sinh mạng hay một phần cơ thể, một đứa trẻ ở độ tuổi đi học.
Trong ý thức của tôi, cuộc chiến đã thêm màu trắng, của cát, của hàng trăm ngàn bia mộ trong nghĩa trang Trường Sơn và trên mái đầu bạc, trong ánh mắt đục thủy tinh thể của những người mẹ già không còn xúc cảm kia.
Từ 1996, tôi chuyển vào Sài Gòn. Những người bạn trí thức miền Nam dần dần pha thêm cho cuộc chiến trong tôi một màu sắc khác: màu tối của những nòng súng chúc xuống đất, những bộ quân phục cởi vội vứt bên vệ đường và những đôi mắt khép của bên thất trận. Và tôi biết với họ, nó chưa bao giờ kết thúc.
Công bằng mà nói, đối với nhiều người miền Nam, ngày 30 tháng 4, vừa là nỗi đau nhưng cũng vứa chan chứa niềm vui kết thúc chiến tranh, kết thúc cảnh “đại bác đêm đêm dội về thành phố”, kết thúc cảnh các cô gái đi làm, đi học đều mang vài trái chanh trong túi để đối phó với hơi lựu đạn cay của cảnh sát đi giải tán những cuộc biểu tình phản chiến diễn ra như cơm bữa trên đường phố.
Khi nơi họ sống chính là chiến trường thì chiến tranh là bất đắc dĩ, là phi nhân, rất đáng kinh sợ.
Bà ngoại tôi là Phật tử tại gia, khi cậu tôi bỏ dở đại học Bách khoa Hà Nội để vào chiến trường miền Nam, bà tôi chỉ nhất tâm cầu nguyện không có viên đạn nào từ súng của con mình bắn ra làm phương hại đến một ai. Ông chú ruột có mặt trong đoàn quân giải phóng, sau 30/4 được giữ lại trường sĩ quan Thủ Đức làm công tác đào tạo nhưng ông nội tôi nhất quyết phản đối. Ông bảo: “đã bảo là đánh đuổi đế quốc, Mỹ cút rồi thì về nhà, giao lại cho người dân, thế mới là chính nghĩa!”
Men say chiến thắng của cậu và chú tôi không kéo dài bao lâu vì sau đó họ đều phải tập trung học nốt chương trình đại học và lo toan mưu sinh. 30 tháng 4 hằng năm họ tụ tập bạn bè lại uống vài vại bia với lạc rang, ôn lại mấy lần chết hụt.
30 tháng 4 của 4x, và 5x màu ly bia hơi sủi bọt.
Giới công chức bạn bè 6x, 7x, 8x của tôi nhiều năm nay đều xem 30/4 với 1/5 là chuỗi nghỉ dài, họ tranh thủ về quê, đi picnic, xông xênh hơn thì đi du lịch nước ngoài.
30 tháng 4 của họ mang màu những tấm vé.
Còn một vĩ tuyến 17 trong tâm thức?
Nhưng dường như vẫn có một dòng Bến Hải chảy trong tâm thức chúng ta, giữa công chức miền Nam và miền Bắc, giữa những người làm cho công ty nước ngoài hoặc doanh nghiệp tư nhân so với các công chức nhà nước.
Vừa rồi trên mạng rộ lên một phong trào nhuộm đỏ Facebook được sự hưởng ứng nhiệt tình của nhiều công chức lề phải ở tuổi trung niên, đưa đến những cuộc tranh cãi bất phân thắng bại giữa hai bên, khiến dòng Bến Hải năm xưa lại sôi sùng sục.
Vì sao chiến thắng 30 tháng 4 vẫn khiến những người ở bờ Bắc phấn khích đến thế? Câu hỏi đặt ra là nếu họ có đầy đủ thông tin, họ có ứng xử khác đi không?
Vì sao họ có thể bắt tay làm ăn với người Mỹ mà 38 năm rồi vẫn không quên được “tội ác của Mỹ-Ngụy”? Vì sao họ khao khát “làm bạn với các nước”, mong mỏi xóa bỏ cấm vận, đổ ra đường chào đón Tổng thống Mỹ mà lại ngồi mãi trên yên cương với vòng hoa chiến thắng để khoét sâu thêm nỗi đau và khoảng cách khó xóa với chính đồng bào mình – những kẻ ngã ngựa, dù chiến tranh đã kết thúc lâu lắm rồi?
Trí não con người có một chức năng quái quỷ là hoàn toàn đóng chặt cửa với tất cả những gì nó không muốn. Trong trường hợp này, phải chăng họ cần cảm giác chiến thắng để vực dậy niềm tin cho một cuộc chiến khác, cuộc chiến chống lại sự tụt hậu, suy thoái trong kinh tế – văn hóa – giáo dục – đạo đức mà họ đang dự phần và đang trào dâng dự cảm thua cuộc?
Tôi cũng có một câu chuyện để kể với bên không thắng cuộc:
Có một người lính miền Bắc, sau chiến tranh tiếp quản một căn biệt thự của một sĩ quan VNCH, chiến lợi phẩm của anh là chiếc bàn viết bằng sắt. Không ai biết trong đó đã được gài lại một món quà cho bên thắng cuộc mà chỉ cần mở ngăn kéo ra là phát nổ.
Nhưng người nhận món quà đó không phải người lính giải phóng mà là đứa con gái nhỏ lẫm chẫm biết đi. Vụ nổ không đủ sức cướp đi sinh mạng cô bé nhưng biến em thành người tàn phế, mù hai mắt, cụt hai tay. Tuyết – một nữ sinh giỏi, đầy nghị lực, niềm tự hào của trường khiếm thị Nguyễn Đình Chiểu Sài Gòn đã “quyết toán” món nợ của hai bên như thế.
Đây là câu chuyện có thật về một cô gái hiện sống bên Mỹ với một người chồng Mỹ sau một đám cưới cổ tích tốn không ít giấy mực của cánh báo chí. Nếu bạn muốn biết thực hư cứ đến giở lại hồ sơ của trường này.
Tôi cũng muốn hỏi những người bờ Nam con sông: như vậy đã đủ chưa, để khép lại một mối cừu thù?
Khi một phóng viên Mỹ hỏi về thái độ đối với người Mỹ sau hai quả bom nguyên tử ném xuống Hiroshima và Nagasaki, nhiều người Nhật lớn tuổi đã đáp lại anh ta: “Cám ơn các anh đã buộc chúng tôi dừng lại.”
Thống tướng Douglas MacArthur – người đã cầm quân đánh bại quân Nhật và chỉ huy lực lượng chiếm đóng nước Nhật hậu chiến – chính là một trong những người được nhân dân Nhật ghi ơn cho đến ngày nay vì đã giúp họ cải cách ruộng đất, soạn Hiến pháp, thành lập một nền dân chủ để họ trở thành một quốc gia siêu cường.
Sau Thế chiến II, một số người dân Nhật đã tôn kính treo hình ông – người từng đánh bại họ.
Nghĩa trang Quốc gia Arlington của Hoa Kỳ là nơi an nghỉ của hàng ngàn binh sĩ thuộc cả hai phe Nam Bắc đã tử trận trong cuộc Nội chiến 1865.
Cách đây vài năm, một cuộc khảo sát của Đại học Hebrew Jerusalem cho thấy 61% người Do Thái ‘hài lòng’ (satisfied) với thái độ nhận trách nhiệm của người Đức về cuộc diệt chủng năm xưa, 80% dân Israel cảm thấy quan hệ giữa hai nước là hoàn toàn bình thường.
Người Việt nghĩ gì về thái độ của những dân tộc ấy đối với cựu thù trong chiến tranh của họ?
Cá nhân tôi nhìn nhận: một đại gia đình trải qua 38 năm dằng dặc mà huynh đệ vẫn còn chưa dứt chuyện thắng thua, thì đó là một gia đình có vấn đề về nhận thức.
Một dân tộc đau yếu khiến người ta không khỏi hoài nghi khả năng thích ứng của nó trong kỷ nguyên tiếp theo. Liệu chúng ta có đủ năng lực để cạnh tranh và phát triển trong thời đại mới, sẵn sàng đối đầu với những cuộc chiến của kỷ nguyên số và siêu vi trùng ngàn lần phức tạp hơn?
38 năm đủ để những đứa trẻ mang tên Hòa Bình hay Thống Nhất năm xưa sinh ra những đứa con tuổi teen hôm nay, biết tư duy như một công dân toàn cầu, giỏi công nghệ, chiếm lĩnh các mạng xã hội để đặt cho người lớn những câu hỏi nhức nhối.
Và với chúng, câu chuyện hôm qua nhất thiết phải được kể theo lối mới.
Bài viết phản ánh quan điểm của tác giả, một nhà văn, nhà báo sống tại TP Hồ Chí Minh.
_______
Tiếng Nói Dân Chủ là diễn đàn chia sẻ những quan điểm dân chủ từ nhiều nơi khác nhau. Ban Biên Tập không chịu trách nhiệm nội dung các bài viết đã được đăng tải, cũng như bài viết không nhất thiết phản ánh quan điểm của Tiếng Nói Dân Chủ.
Vấn đề đầu tiên là có quyền kể ra hay không trong một nước CHXHCN Việt Nam độc tôn,độc đảng và độc tài ???!!!
Nguyễn Tường Bá
Bình luận bởi Nguyễn Tường Bá | Tháng Năm 2, 2013 |

markdown:
## CÒN MỘT VĨ TUYẾN 17 TRONG TÂM THỨC?
![ Chuẩn bị kỷ niệm 30/4 tại Hà Nội](https://i2.wp.com/wscdn.bbc.co.uk/worldservice/assets/images/2013/04/30/130430040554_30_april_464x261_afp.jpg)
**Phạm Tường Vân, ** *theo BBC*
Đâu là sự khác nhau khi viết những tác phẩm về chiến tranh ngày hôm qua và những cuộc chiến mới xảy ra hôm nay? Và nhân tố hoà bình sẽ nằm ở đâu trong những tác phẩm ấy? Đến khi nào những câu chuyện hôm qua trở nên chán ngắt?
Chúng tôi vẫn hỏi nhau như vậy, khi bàn chuyện viết.
Lê Quý Dương, đạo diễn sân khấu thế hệ 6x từng chia sẻ một ám ảnh: năm anh 4 tuổi, B52 dội xuống Khâm Thiên, sát nhà anh có bà già câm điếc sống một mình. mỗi khi có còi báo động thì phải chạy qua gọi cụ. Lần ấy Dương bận lo cho mấy đứa em vì bố mẹ đi vắng, không kịp chạy sang, khi còi báo yên anh trồi lên cũng là lúc chứng kiến căn nhà của bà cụ chỉ còn là đống gạch vụn
Món nợ ấy chuyển thành sự câm lặng nơi anh mỗi khi hồi ức chiến tranh trào lên. Anh mang sự câm lặng ấy vào tác phẩm, những vở kịch không lời thời anh du học Úc từng khiến khán giả bản xứ lặng đi giây lát.
Sau Dương vài năm, tôi sinh ra ngay miệng hố bom, giây phút chào đời của tôi đánh dấu bằng tiếng còi báo động. Mẹ tôi vẫn hay nửa đùa nửa thật kể rằng khi ấy, tất cả xuống hầm hết, lũ trẻ sơ sinh, vài đứa chưa được đánh số ở một hầm khác.
Khi lên, họ phát cho mỗi bà mẹ một đứa như phát bánh mì. Mẹ tôi chẳng có thời gian lẫn điều kiện để kiểm tra xem tôi có thực là con ruột của bà không.
Một buổi trưa, mẹ tôi từ nhà máy về, chạy ào vào nhà, làm đổ kềnh cả cái xe đạp vừa dựng. Bà ôm lấy chúng tôi khóc òa: Hòa bình rồi! Đó là ngày 30 tháng 4 năm 1975.
Có hàng ngàn đứa trẻ sinh ra trong năm này mang cái tên Hòa Bình, chúng không còn phải biết đến đạn bom và hầm trú ẩn.
**30 tháng 4 màu gì?**
Năm 1995, tôi có dịp đến Quảng Trị -Thừa Thiên. Ngay sau chuyến đến thăm nghĩa trang Trường Sơn, tôi gặp một bà mẹ anh hùng trong một ngôi làng bờ bắc sông Bến Hải mà số liệt sĩ gần bằng số hộ dân đang cư trú.
Bà mẹ liệt sĩ đã mất chồng và hai con cho hai cuộc chiến, côi cút trong căn chòi ọp ẹp với một con heo ốm nhom.
Cát trắng không một chút màu mỡ nhưng giấu bên dưới nhiều phế liệu, nguồn thu nhập chính của dân trong vùng. Lâu lâu, một tiếng nổ vang trời lấy đi sinh mạng hay một phần cơ thể, một đứa trẻ ở độ tuổi đi học.
Trong ý thức của tôi, cuộc chiến đã thêm màu trắng, của cát, của hàng trăm ngàn bia mộ trong nghĩa trang Trường Sơn và trên mái đầu bạc, trong ánh mắt đục thủy tinh thể của những người mẹ già không còn xúc cảm kia.
Từ 1996, tôi chuyển vào Sài Gòn. Những người bạn trí thức miền Nam dần dần pha thêm cho cuộc chiến trong tôi một màu sắc khác: màu tối của những nòng súng chúc xuống đất, những bộ quân phục cởi vội vứt bên vệ đường và những đôi mắt khép của bên thất trận. Và tôi biết với họ, nó chưa bao giờ kết thúc.
Công bằng mà nói, đối với nhiều người miền Nam, ngày 30 tháng 4, vừa là nỗi đau nhưng cũng vứa chan chứa niềm vui kết thúc chiến tranh, kết thúc cảnh “đại bác đêm đêm dội về thành phố”, kết thúc cảnh các cô gái đi làm, đi học đều mang vài trái chanh trong túi để đối phó với hơi lựu đạn cay của cảnh sát đi giải tán những cuộc biểu tình phản chiến diễn ra như cơm bữa trên đường phố.
Khi nơi họ sống chính là chiến trường thì chiến tranh là bất đắc dĩ, là phi nhân, rất đáng kinh sợ.
Bà ngoại tôi là Phật tử tại gia, khi cậu tôi bỏ dở đại học Bách khoa Hà Nội để vào chiến trường miền Nam, bà tôi chỉ nhất tâm cầu nguyện không có viên đạn nào từ súng của con mình bắn ra làm phương hại đến một ai. Ông chú ruột có mặt trong đoàn quân giải phóng, sau 30/4 được giữ lại trường sĩ quan Thủ Đức làm công tác đào tạo nhưng ông nội tôi nhất quyết phản đối. Ông bảo: “đã bảo là đánh đuổi đế quốc, Mỹ cút rồi thì về nhà, giao lại cho người dân, thế mới là chính nghĩa!”
Men say chiến thắng của cậu và chú tôi không kéo dài bao lâu vì sau đó họ đều phải tập trung học nốt chương trình đại học và lo toan mưu sinh. 30 tháng 4 hằng năm họ tụ tập bạn bè lại uống vài vại bia với lạc rang, ôn lại mấy lần chết hụt.
30 tháng 4 của 4x, và 5x màu ly bia hơi sủi bọt.
Giới công chức bạn bè 6x, 7x, 8x của tôi nhiều năm nay đều xem 30/4 với 1/5 là chuỗi nghỉ dài, họ tranh thủ về quê, đi picnic, xông xênh hơn thì đi du lịch nước ngoài.
30 tháng 4 của họ mang màu những tấm vé.
**Còn một vĩ tuyến 17 trong tâm thức?**
Nhưng dường như vẫn có một dòng Bến Hải chảy trong tâm thức chúng ta, giữa công chức miền Nam và miền Bắc, giữa những người làm cho công ty nước ngoài hoặc doanh nghiệp tư nhân so với các công chức nhà nước.
Vừa rồi trên mạng rộ lên một phong trào nhuộm đỏ Facebook được sự hưởng ứng nhiệt tình của nhiều công chức lề phải ở tuổi trung niên, đưa đến những cuộc tranh cãi bất phân thắng bại giữa hai bên, khiến dòng Bến Hải năm xưa lại sôi sùng sục.
Vì sao chiến thắng 30 tháng 4 vẫn khiến những người ở bờ Bắc phấn khích đến thế? Câu hỏi đặt ra là nếu họ có đầy đủ thông tin, họ có ứng xử khác đi không?
Vì sao họ có thể bắt tay làm ăn với người Mỹ mà 38 năm rồi vẫn không quên được “tội ác của Mỹ-Ngụy”? Vì sao họ khao khát “làm bạn với các nước”, mong mỏi xóa bỏ cấm vận, đổ ra đường chào đón Tổng thống Mỹ mà lại ngồi mãi trên yên cương với vòng hoa chiến thắng để khoét sâu thêm nỗi đau và khoảng cách khó xóa với chính đồng bào mình – những kẻ ngã ngựa, dù chiến tranh đã kết thúc lâu lắm rồi?
Trí não con người có một chức năng quái quỷ là hoàn toàn đóng chặt cửa với tất cả những gì nó không muốn. Trong trường hợp này, phải chăng họ cần cảm giác chiến thắng để vực dậy niềm tin cho một cuộc chiến khác, cuộc chiến chống lại sự tụt hậu, suy thoái trong kinh tế – văn hóa – giáo dục – đạo đức mà họ đang dự phần và đang trào dâng dự cảm thua cuộc?
Tôi cũng có một câu chuyện để kể với bên không thắng cuộc:
Có một người lính miền Bắc, sau chiến tranh tiếp quản một căn biệt thự của một sĩ quan VNCH, chiến lợi phẩm của anh là chiếc bàn viết bằng sắt. Không ai biết trong đó đã được gài lại một món quà cho bên thắng cuộc mà chỉ cần mở ngăn kéo ra là phát nổ.
Nhưng người nhận món quà đó không phải người lính giải phóng mà là đứa con gái nhỏ lẫm chẫm biết đi. Vụ nổ không đủ sức cướp đi sinh mạng cô bé nhưng biến em thành người tàn phế, mù hai mắt, cụt hai tay. Tuyết – một nữ sinh giỏi, đầy nghị lực, niềm tự hào của trường khiếm thị Nguyễn Đình Chiểu Sài Gòn đã “quyết toán” món nợ của hai bên như thế.
Đây là câu chuyện có thật về một cô gái hiện sống bên Mỹ với một người chồng Mỹ sau một đám cưới cổ tích tốn không ít giấy mực của cánh báo chí. Nếu bạn muốn biết thực hư cứ đến giở lại hồ sơ của trường này.
Tôi cũng muốn hỏi những người bờ Nam con sông: như vậy đã đủ chưa, để khép lại một mối cừu thù?
Khi một phóng viên Mỹ hỏi về thái độ đối với người Mỹ sau hai quả bom nguyên tử ném xuống Hiroshima và Nagasaki, nhiều người Nhật lớn tuổi đã đáp lại anh ta: “Cám ơn các anh đã buộc chúng tôi dừng lại.”
Thống tướng Douglas MacArthur – người đã cầm quân đánh bại quân Nhật và chỉ huy lực lượng chiếm đóng nước Nhật hậu chiến – chính là một trong những người được nhân dân Nhật ghi ơn cho đến ngày nay vì đã giúp họ cải cách ruộng đất, soạn Hiến pháp, thành lập một nền dân chủ để họ trở thành một quốc gia siêu cường.
Sau Thế chiến II, một số người dân Nhật đã tôn kính treo hình ông – người từng đánh bại họ.
Nghĩa trang Quốc gia Arlington của Hoa Kỳ là nơi an nghỉ của hàng ngàn binh sĩ thuộc cả hai phe Nam Bắc đã tử trận trong cuộc Nội chiến 1865.
Cách đây vài năm, một cuộc khảo sát của Đại học Hebrew Jerusalem cho thấy 61% người Do Thái ‘hài lòng’ (satisfied) với thái độ nhận trách nhiệm của người Đức về cuộc diệt chủng năm xưa, 80% dân Israel cảm thấy quan hệ giữa hai nước là hoàn toàn bình thường.
Người Việt nghĩ gì về thái độ của những dân tộc ấy đối với cựu thù trong chiến tranh của họ?
Cá nhân tôi nhìn nhận: một đại gia đình trải qua 38 năm dằng dặc mà huynh đệ vẫn còn chưa dứt chuyện thắng thua, thì đó là một gia đình có vấn đề về nhận thức.
Một dân tộc đau yếu khiến người ta không khỏi hoài nghi khả năng thích ứng của nó trong kỷ nguyên tiếp theo. Liệu chúng ta có đủ năng lực để cạnh tranh và phát triển trong thời đại mới, sẵn sàng đối đầu với những cuộc chiến của kỷ nguyên số và siêu vi trùng ngàn lần phức tạp hơn?
38 năm đủ để những đứa trẻ mang tên Hòa Bình hay Thống Nhất năm xưa sinh ra những đứa con tuổi teen hôm nay, biết tư duy như một công dân toàn cầu, giỏi công nghệ, chiếm lĩnh các mạng xã hội để đặt cho người lớn những câu hỏi nhức nhối.
Và với chúng, câu chuyện hôm qua nhất thiết phải được kể theo lối mới.
*Bài viết phản ánh quan điểm của tác giả, một nhà văn, nhà báo sống tại TP Hồ Chí Minh.* *_______* *Tiếng Nói Dân Chủ là diễn đàn chia sẻ những quan điểm dân chủ từ nhiều nơi khác nhau. Ban Biên Tập không chịu trách nhiệm nội dung các bài viết đã được đăng tải, cũng như bài viết không nhất thiết phản ánh quan điểm của Tiếng Nói Dân Chủ.*
Vấn đề đầu tiên là có quyền kể ra hay không trong một nước CHXHCN Việt Nam độc tôn,độc đảng và độc tài ???!!!
Nguyễn Tường Bá

WARC-Identified-Payload-Type: application/xhtml+xml

Server: nginx

Vary: Cookie

X-hacker: If you're reading this, you should visit automattic.com/jobs and apply to join the fun, mention this header.


text:
Tin bán xe
Đăng tin
Đăng nhập
Đăng ký
Tin tức
Đánh giá xe
Kinh nghiệm
Tìm kiếm
Bán xe Hyundai Getz
2007
(35)
2008
(287)
2009
(563)
2010
(557)
2011
(38)
2013
(1)
Từ khóa nổi bật
Bán xe Hyundai Accent
Bán xe Hyundai Avante
Bán xe Hyundai County
Bán xe Hyundai HD
Bán xe Hyundai i10
Bán xe Hyundai i20
Bán xe Hyundai i30
Bán xe Hyundai Santa Fe
Bán xe Hyundai Sonata
Bán xe Hyundai Tucson
Bán xe theo khoảng giá
>100 triệu
100-150 triệu
150-200 triệu
200-250 triệu
250-300 triệu
300-350 triệu
350-400 triệu
400-450 triệu
450-500 triệu
500-550 triệu
550-600 triệu
600-700 triệu
700-900 triệu
900-1 tỷ
1-1,5 tỷ
1,5-2 tỷ
2-2,5 tỷ
2,5-3 tỷ
trên 3 tỷ
Có thể bạn quan tâm
Hyundai Getz 2017
Honda City 2018
Mercedes CLA class
Toyota Camry 2016
Mazda 2 2016
Kia Morning nhập khẩu
Kiểu hiển thị :
Danh sách tin rao
Bán xe ô tô Hyundai Getz tại Hà Nội
Có
854
tin
Tất cả
Tin rao có hình
Tin rao mới đến cũ
Cần bán Hyundai Getz sản xuất 2009, màu xanh lam, nhập khẩu nguyên chiếc chính chủ, giá tốt
205 triệu
17/03/2018
Tình trạng
: Cũ
Số Km
: 70.000 km
Hộp số
: Số tay
Tỉnh/TP
:
Hà Nội
0974 400 999
Chú Hinh
Bán Hyundai Getz 2010, màu bạc, nhập khẩu nguyên chiếc
208 triệu
17/03/2018
Tình trạng
: Cũ
Số Km
: 12.678 km
Hộp số
: Số tay
Tỉnh/TP
:
Hà Nội
0989 261 117
Đỗ Văn Tiến
Bán xe Hyundai Getz MT đời 2009, màu bạc, nhập khẩu nguyên chiếc, 189tr
189 triệu
17/03/2018
Tình trạng
: Cũ
Số Km
: 150.000 km
Hộp số
: Số tay
Tỉnh/TP
:
Hà Nội
0902 107 079
Đinh Đức Quyền
Bán ô tô Hyundai Getz đời 2009, màu bạc, xe nhập chính chủ, giá 230tr
230 triệu
17/03/2018
Tình trạng
: Cũ
Số Km
: 6.000 km
Hộp số
: Số tay
Tỉnh/TP
:
Hà Nội
0966 707 033
Chị Nguyệt
Cần bán Hyundai Getz đời 2009, màu bạc, nhập khẩu Hàn Quốc, 186tr
186 triệu
17/03/2018
Tình trạng
: Cũ
Số Km
: 62.000 km
Hộp số
: Số tay
Tỉnh/TP
:
Hà Nội
01688 720 816
Anh Hùng
Cần bán xe Hyundai Getz sản xuất năm 2009, màu xanh
230 triệu
17/03/2018
Tình trạng
: Cũ
Số Km
: 64.999 km
Hộp số
: Số tự động
Tỉnh/TP
:
Hà Nội
01293818886
01293818886
Cần bán gấp Hyundai Getz năm 2009 chính chủ, giá 198tr
198 triệu
17/03/2018
Tình trạng
: Cũ
Số Km
: Không XĐ
Hộp số
: Số tay
Tỉnh/TP
:
Hà Nội
0986821886
0986821886
Bán Hyundai Getz đời 2010, màu bạc, nhập khẩu
209 triệu
16/03/2018
Tình trạng
: Cũ
Số Km
: 8.150 km
Hộp số
: Số tay
Tỉnh/TP
:
Hà Nội
0915 897 799
0985 067 799
Bán Hyundai Getz 1.1 MT 2009, màu xanh lam, xe nhập
232 triệu
16/03/2018
Tình trạng
: Cũ
Số Km
: Không XĐ
Hộp số
: Số tay
Tỉnh/TP
:
Hà Nội
0963 736 388
Hoàng Nguyên
Chính chủ bán Hyundai Getz năm 2007, màu bạc, nhập khẩu
215 triệu
16/03/2018
Tình trạng
: Cũ
Số Km
: Không XĐ
Hộp số
: Số tự động
Tỉnh/TP
:
Hà Nội
0912 040 627
Trần Đình Bình
Cần bán lại xe Hyundai Getz đời 2009, màu bạc, nhập khẩu
205 triệu
16/03/2018
Tình trạng
: Cũ
Số Km
: 88.000 km
Hộp số
: Số tay
Tỉnh/TP
:
Hà Nội
0912 401 930
Anh Hưng
Bán Hyundai Getz 2009, màu xanh lam, xe nhập
199 triệu
16/03/2018
Tình trạng
: Cũ
Số Km
: 8.158 km
Hộp số
: Số tay
Tỉnh/TP
:
Hà Nội
0985067799
0915 897 799
0985067799
Trang
Site map
Liên hệ
Trang chủ
Công ty TNHH CAROBEN
Tầng 17, DMC Tower, Kim Mã, Ba Đình, Hà Nội
+8435 231014
Hỗ trợ trực tuyến
Yahoo
Skype
Tin đã lưu

Cache-Control: private

Content-Type: text/html; charset=utf-8

X-Content-Type-Options: nosniff


text:
Tác giả:TỔNG HỢP
Thể loại:Cổ tích – Thần thoại , Sách văn học
Nhóm dịch:Đang cập nhật
Trạng thái:Hoàn thành
Lượt xem:1320
Thần Thoại Bắc Âu
Những câu chuyện kinh điển cùng với những minh họa sinh động về những vị thần, những anh hùng và quái vật đã làm sống dậy bức tranh Thần Thoại Bắc Âu đầy ấn tượng, bao gồm thần Sấm Thor, Odin, người Cha chung và cả thần Lừa gạt Loki.
Trong Thần Thoại Bắc Âu, Trái Đất là một dĩa dẹt đặt trên cành của cây thế giới, nơi các vị thần sinh sống, nằm ở trung tâm đĩa. Toàn bộ câu chuyện kể về các thế lực siêu nhiên, sự hình thành và diệt vong của thế giới và ngày tận thế. Với lối kể chuyện nên thơ của tác giả danh tiếng Donna Jo Napoli đã tăng thêm phần kịch tính cho những câu chuyện của người Scandinavia cổ đại.
Bên cạnh những câu chuyện về các vị thần linh, thần thoại Bắc Âu cũng kể về các vị vua và anh hùng người trần thế. Những câu chuyện này phản ánh quá trình hình thành các bộ tộc và quốc gia Bắc Âu. Một số học giả cho rằng những câu chuyện này dựa trên những sự kiện có thật và có thể coi chúng như một nguồn nghiên cứu lịch sử vùng Scandinavia.

markdown:
![ Thần Thoại Bắc Âu](https://trinhdinhlinh.com/sach/wp-content/themes/truyenfull/timthumb.php?src=https://trinhdinhlinh.com/sach/wp-content/uploads/2017/10/002-001.jpg&h=324&w=221&q=80)
### Tác giả:
[TỔNG HỢP](https://trinhdinhlinh.com/sach/mxtacgia/tong-hop/)
### Thể loại:
[Cổ tích – Thần thoại](https://trinhdinhlinh.com/sach/the-loai/co-tich-than-thoai/), [Sách văn học](https://trinhdinhlinh.com/sach/the-loai/sach-van-hoc/)
### Nhóm dịch:
[Đang cập nhật](https://trinhdinhlinh.com/sach/nhom-dich/dang-cap-nhat/)
### Trạng thái:Hoàn thành
### Lượt xem:1320
### Thần Thoại Bắc Âu
Những câu chuyện kinh điển cùng với những minh họa sinh động về những vị thần, những anh hùng và quái vật đã làm sống dậy bức tranh Thần Thoại Bắc Âu đầy ấn tượng, bao gồm thần Sấm Thor, Odin, người Cha chung và cả thần Lừa gạt Loki.
Trong Thần Thoại Bắc Âu, Trái Đất là một dĩa dẹt đặt trên cành của cây thế giới, nơi các vị thần sinh sống, nằm ở trung tâm đĩa. Toàn bộ câu chuyện kể về các thế lực siêu nhiên, sự hình thành và diệt vong của thế giới và ngày tận thế. Với lối kể chuyện nên thơ của tác giả danh tiếng Donna Jo Napoli đã tăng thêm phần kịch tính cho những câu chuyện của người Scandinavia cổ đại.
Bên cạnh những câu chuyện về các vị thần linh, thần thoại Bắc Âu cũng kể về các vị vua và anh hùng người trần thế. Những câu chuyện này phản ánh quá trình hình thành các bộ tộc và quốc gia Bắc Âu. Một số học giả cho rằng những câu chuyện này dựa trên những sự kiện có thật và có thể coi chúng như một nguồn nghiên cứu lịch sử vùng Scandinavia.

Cache-Control: no-store, no-cache, must-revalidate

Vary: Accept-Encoding, Cookie

X-Fastcgi-Cache: MISS


text:
Aleksandr Aleksandrovich Karelin
Aleksandr Aleksandrovich Karelin, hay Alexander Karelin, (tiếng Nga: Александр Александрович Карелин; sinh ngày 19 tháng 9 năm 1967 ở Novosibirsk, Cộng hoà xã hội chủ nghĩa Liên bang Nga, Liên Xô) là một Anh hùng Liên bang Nga và nhà đô vật môn vật Hy-La của Liên Xô và của Nga. Ông đã giành huy chương vàng tại các kỳ Thế vận hội năm 1988, 1992, và 1996. Ông được gọi bằng biệt danh "Gấu Nga," "Alexander Đại đế" và "The Experiment". A. A. Karelin chưa bao giờ thua một trận nào từ năm 1987 đến năm 2000 cho đến khi bị đánh bại bởi nhà đô vật Rulon Gardner người Mỹ trong trận tranh huy chương vàng tại Thế vận hội mùa Hè năm 2000. A. A. Karelin được toàn thế giới xem là đô vật quốc tế môn vật Hy-La vĩ đại nhất mọi thời đại.[1][2]. Ông cũng tham gia giải đô vật chuyên nghiệp và đối đầu với Akira Maeda trong trận đấu thuộc giải đô vật chuyên nghiệp RINGS vào năm năm 1999.[3]
Tham khảo[sửa | sửa mã nguồn]
- ^ “Encyclopedia”. Truy cập 27 tháng 10 năm 2015.
- ^ http://static.espn.go.com/oly/summer00/news/2000/0927/782116.html
- ^ http://www.youtube.com/watch?v=cTv744eMjyM

markdown:
# Aleksandr Aleksandrovich Karelin
**Aleksandr Aleksandrovich Karelin**, hay **Alexander Karelin**, ( [tiếng Nga](/wiki/Ti%E1%BA%BFng_Nga): Александр Александрович Карелин; sinh ngày 19 tháng 9 năm 1967 ở [Novosibirsk](/wiki/Novosibirsk), [Cộng hoà xã hội chủ nghĩa Liên bang Nga](/w/index.php?title=C%E1%BB%99ng_ho%C3%A0_x%C3%A3_h%E1%BB%99i_ch%E1%BB%A7_ngh%C4%A9a_Li%C3%AAn_bang_Nga&action=edit&redlink=1), [Liên Xô](/wiki/Li%C3%AAn_X%C3%B4)) là một [Anh hùng Liên bang Nga](/w/index.php?title=Anh_h%C3%B9ng_Li%C3%AAn_bang_Nga&action=edit&redlink=1) và nhà đô vật [môn vật Hy-La](/w/index.php?title=M%C3%B4n_v%E1%BA%ADt_Hy-La&action=edit&redlink=1) của [Liên Xô](/wiki/Li%C3%AAn_X%C3%B4) và của [Nga](/wiki/Nga). Ông đã giành huy chương vàng tại các kỳ [Thế vận hội](/wiki/Th%E1%BA%BF_v%E1%BA%ADn_h%E1%BB%99i) năm 1988, 1992, và 1996. Ông được gọi bằng biệt danh "Gấu Nga," "Alexander Đại đế" và "The Experiment". A. A. Karelin chưa bao giờ thua một trận nào từ năm 1987 đến năm 2000 cho đến khi bị đánh bại bởi nhà đô vật [Rulon Gardner](/w/index.php?title=Rulon_Gardner&action=edit&redlink=1) người Mỹ trong trận tranh huy chương vàng tại [Thế vận hội mùa Hè năm 2000](/w/index.php?title=Th%E1%BA%BF_v%E1%BA%ADn_h%E1%BB%99i_m%C3%B9a_H%C3%A8_n%C4%83m_2000&action=edit&redlink=1). A. A. Karelin được toàn thế giới xem là đô vật quốc tế môn vật Hy-La vĩ đại nhất mọi thời đại. [[1]](#cite_note-1) . Ông cũng tham gia giải đô vật chuyên nghiệp và đối đầu với Akira Maeda trong trận đấu thuộc giải đô vật chuyên nghiệp RINGS vào năm năm 1999. [2] [[3]](#cite_note-youtube.com-3)
## Tham khảo[
[sửa](/w/index.php?title=Aleksandr_Aleksandrovich_Karelin&veaction=edit§ion=1) | [sửa mã nguồn](/w/index.php?title=Aleksandr_Aleksandrovich_Karelin&action=edit§ion=1)] [^](#cite_ref-1) [“Encyclopedia”](http://original.britannica.com/eb/topic-244145/Greco-Roman-wrestling). Truy cập 27 tháng 10 năm 2015. [^](#cite_ref-2) [http://static.espn.go.com/oly/summer00/news/2000/0927/782116.html](http://static.espn.go.com/oly/summer00/news/2000/0927/782116.html) [^](#cite_ref-youtube.com_3-0) [http://www.youtube.com/watch?v=cTv744eMjyM](http://www.youtube.com/watch?v=cTv744eMjyM)

P3P: CP="This is not a P3P policy! See https://vi.wikipedia.org/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:CentralAutoLogin/P3P for more info."

X-Cache-Status: miss

Set-Cookie: GeoIP=US:VA:Ashburn:39.09:-77.65:v4; Path=/; secure; Domain=.wikipedia.org

X-Cache: cp1068 miss, cp1066 miss

Via: 1.1 varnish (Varnish/5.1), 1.1 varnish (Varnish/5.1)

X-UA-Compatible: IE=Edge

Cache-Control: private, s-maxage=0, max-age=0, must-revalidate

Vary: Accept-Encoding,Cookie,Authorization

Content-Language: vi

Link: </static/images/project-logos/viwiki.png>;rel=preload;as=image;media=not all and (min-resolution: 1.5dppx),</static/images/project-logos/viwiki-1.5x.png>;rel=preload;as=image;media=(min-resolution: 1.5dppx) and (max-resolution: 1.999999dppx),</static/images/project-logos/viwiki-2x.png>;rel=preload;as=image;media=(min-resolution: 2dppx)


text:
iPhone 4S
iPhone 4S là một điện thoại thông minh với màn hình cảm ứng được Apple Inc phát triển, sản xuất và đưa ra thị trường. Là thế hệ thứ năm của iPhone, iPhone 4S giữ lại thiết kế bên ngoài của iPhone 4, nhưng là chủ một loạt các chi tiết kỹ thuật phần cứng được cải thiện và cập nhật phần mềm so với mô hình trước đó. Thay đổi tích hợp phần mềm và phần cứng hỗ trợ việc giới thiệu giao diện người dùng mới và các chức năng của Apple. Điểm nổi bật bao gồm một trợ lý nhận dạng giọng nói được gọi là Siri, máy tính cá nhân độc lập, nguồn dữ liệu điện toán đám mây, và một hệ thống camera được cải thiện.
IPhone 4S chủ yếu là một sự kết hợp của một máy tính cầm tay, điện thoại di động, GPS, camera video kỹ thuật số và máy nghe nhạc vào một thiết bị, được hỗ trợ bởi một pin lithium-ion có thể sạc lại. Nó được hỗ trợ bởi một cơ sở hạ tầng trực tuyến, nơi mà phương tiện truyền thông và các ứng dụng thứ cấp có thể được mua để chạy trên thiết bị, do đó mở rộng khả năng của mình.
Sau khi được công bố vào ngày 4 tháng 10 năm 2011 trong sự kiện của Apple "Hãy của Talk iPhone" sự kiện ở Cupertino, California, Apple có tung ra thị trường iPhone 4S vào ngày 14 tháng 10 năm 2011, tại Hoa Kỳ, Canada, Úc, Vương quốc Anh, Pháp, Đức, và Nhật Bản. Lần đầu tiên, nó cũng sẽ có sẵn cho khách hàng của Sprint.
Đây là thiết bị của Apple cuối cùng được nâng cấp / giới thiệu trước cái chết của cựu CEO của Apple Steve Jobs.
Điện thoại đắt nhất thế giới[sửa | sửa mã nguồn]
Điện thoại iPhone 4S đã được độ bởi nghệ nhân người Liverpool Stuart Hughes sử dụng vàng hoa hồng và kim cương với số lượng hạn chế (2 chiếc), giá thành 6 triệu bảng Anh.[2]

markdown:
# iPhone 4S
|Bài này
|là một bản dịch thô từ ngôn ngữ khác. Đây có thể là kết quả của máy tính hoặc của người chưa thông thạo dịch thuật. Xin hãy giúp
|
|![]()
![ ](//upload.wikimedia.org/wikipedia/commons/thumb/d/d2/IPhone_4S_No_shadow.png/160px-IPhone_4S_No_shadow.png)
![ ](http://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/IPhone_4S_No_shadow.png/160px-IPhone_4S_No_shadow.png)
[Nhà sản xuất](/wiki/Danh_s%C3%A1ch_nh%C3%A0_s%E1%BA%A3n_xu%E1%BA%A5t_%C4%91i%E1%BB%87n_tho%E1%BA%A1i_di_%C4%91%E1%BB%99ng_theo_qu%E1%BB%91c_gia) [Foxconn](/wiki/Foxconn) [Khẩu hiệu](/wiki/Kh%E1%BA%A9u_hi%E1%BB%87u) [[1]](#cite_note-1) [iPhone 4](/wiki/IPhone_4) [iPhone 5](/wiki/IPhone_5) *(h)*
58,66 mm (2,309 in)
*(w)*
9,3 mm (0,37 in)
*(d)* [Hệ điều hành](/wiki/H%E1%BB%87_%C4%91i%E1%BB%81u_h%C3%A0nh) **Ban đầu:** [iOS 5.0](/wiki/IOS_5) **Hiện tại:** [iOS 9.3.5](/wiki/IOS_9), phát hành 25 tháng 8, 2016 [CPU](/wiki/CPU) [Apple A5](/w/index.php?title=Apple_A5&action=edit&redlink=1) [LED backlit](/w/index.php?title=LED_backlit&action=edit&redlink=1) [IPS TFT LCD](/w/index.php?title=TFT_LCD&action=edit&redlink=1) *Retina display*
640×960
[resolution](/w/index.php?title=H%C3%ACnh_resolution&action=edit&redlink=1)at 326 [ppi](/w/index.php?title=Pixel_density&action=edit&redlink=1)(0.61 MP)
800:1
[contrast ratio](/w/index.php?title=Contrast_ratio&action=edit&redlink=1)(typical)
500
[cd/m](/w/index.php?title=Luminance&action=edit&redlink=1)max brightness (typical) 2 [Fingerprint](/w/index.php?title=Fingerprint&action=edit&redlink=1)-resistant [oleophobic](/w/index.php?title=Lipophobicity&action=edit&redlink=1) [coating](/w/index.php?title=Coating&action=edit&redlink=1)on front and back glass [Máy ảnh sau](/w/index.php?title=%C4%90i%E1%BB%87n_tho%E1%BA%A1i_ch%E1%BB%A5p_h%C3%ACnh&action=edit&redlink=1) [MP](/wiki/Megapixel) [back-side illuminated sensor](/w/index.php?title=Backside_illumination&action=edit&redlink=1) [HD video](/w/index.php?title=High-definition_video&action=edit&redlink=1)( [1080p](/wiki/1080p)) at 30 [frame/s](/w/index.php?title=Frame_rate&action=edit&redlink=1) [Aperture](/w/index.php?title=F-number&action=edit&redlink=1)f/2.4
5
[element lens](/w/index.php?title=Photographic_lens_design&action=edit&redlink=1)
Face Detection (Stills only)
Video Stabilization
[Wi-Fi](/wiki/Wi-Fi) ( [802.11](/wiki/IEEE_802.11) [b](/w/index.php?title=IEEE_802.11b-1999&action=edit&redlink=1)/ [g](/w/index.php?title=IEEE_802.11g-2003&action=edit&redlink=1)/ [n](/w/index.php?title=IEEE_802.11n-2009&action=edit&redlink=1)) (2.4 [GHz](/wiki/Hertz) only)
[Bluetooth 4.0](/wiki/Bluetooth#Bluetooth_v4.0) **World Mode:** [Quad-band](/w/index.php?title=Multi-band&action=edit&redlink=1) [GSM](/wiki/H%E1%BB%87_th%E1%BB%91ng_th%C3%B4ng_tin_di_%C4%91%E1%BB%99ng_to%C3%A0n_c%E1%BA%A7u)/ [GPRS](/wiki/D%E1%BB%8Bch_v%E1%BB%A5_v%C3%B4_tuy%E1%BA%BFn_g%C3%B3i_t%E1%BB%95ng_h%E1%BB%A3p)/ [EDGE](/wiki/EDGE)
(
[800 850 900 1800 1900](/w/index.php?title=GSM_frequency_bands&action=edit&redlink=1) [MHz](/wiki/Hertz)) [Quad-band](/w/index.php?title=Multi-band&action=edit&redlink=1) [UMTS](/wiki/H%E1%BB%87_th%E1%BB%91ng_vi%E1%BB%85n_th%C3%B4ng_di_%C4%91%E1%BB%99ng_to%C3%A0n_c%E1%BA%A7u)/ [HSDPA](/wiki/High-Speed_Downlink_Packet_Access)/ [HSUPA](/w/index.php?title=High-Speed_Uplink_Packet_Access&action=edit&redlink=1)
(
[800 850 900 1900 2100](/w/index.php?title=UMTS_frequency_bands&action=edit&redlink=1) [MHz](/wiki/Hertz))
(800 MHz not yet announced as supported by Apple)
[Dual-band](/w/index.php?title=Multi-band&action=edit&redlink=1) [CDMA](/w/index.php?title=Code_division_multiple_access&action=edit&redlink=1)/ [EV-DO Rev. A](/w/index.php?title=EV-DO_Rev._A&action=edit&redlink=1)
(800 1900
[MHz](/wiki/Hertz)) [Apple – iPhone](http://apple.com/iphone)
|Bài viết nói về một loạt sản phẩm|
|
|[Danh sách các đời iPhone](/w/index.php?title=Danh_s%C3%A1ch_c%C3%A1c_thi%E1%BA%BFt_b%E1%BB%8B_iOS&action=edit&redlink=1) **iPhone 4S** là một [điện thoại thông minh](/wiki/%C4%90i%E1%BB%87n_tho%E1%BA%A1i_th%C3%B4ng_minh) với [màn hình cảm ứng](/wiki/M%C3%A0n_h%C3%ACnh_c%E1%BA%A3m_%E1%BB%A9ng) được [Apple Inc](/wiki/Apple_Inc.) phát triển, sản xuất và đưa ra thị trường. Là thế hệ thứ năm của [iPhone](/wiki/IPhone), iPhone 4S giữ lại thiết kế bên ngoài của [iPhone 4](/wiki/IPhone_4), nhưng là chủ một loạt các chi tiết kỹ thuật phần cứng được cải thiện và cập nhật phần mềm so với mô hình trước đó. Thay đổi tích hợp phần mềm và phần cứng hỗ trợ việc giới thiệu giao diện người dùng mới và các chức năng của Apple. Điểm nổi bật bao gồm một trợ lý nhận dạng giọng nói được gọi là Siri, máy tính cá nhân độc lập, nguồn dữ liệu [điện toán đám mây](/wiki/%C4%90i%E1%BB%87n_to%C3%A1n_%C4%91%C3%A1m_m%C3%A2y), và một hệ thống camera được cải thiện.
IPhone 4S chủ yếu là một sự kết hợp của một máy tính cầm tay, điện thoại di động, GPS, camera video kỹ thuật số và máy nghe nhạc vào một thiết bị, được hỗ trợ bởi một pin lithium-ion có thể sạc lại. Nó được hỗ trợ bởi một cơ sở hạ tầng trực tuyến, nơi mà phương tiện truyền thông và các ứng dụng thứ cấp có thể được mua để chạy trên thiết bị, do đó mở rộng khả năng của mình.
Sau khi được công bố vào ngày 4 tháng 10 năm 2011 trong sự kiện của Apple "Hãy của Talk iPhone" sự kiện ở
[Cupertino, California](/wiki/Cupertino,_California), Apple có tung ra thị trường iPhone 4S vào ngày 14 tháng 10 năm 2011, tại Hoa Kỳ, Canada, Úc, Vương quốc Anh, Pháp, Đức, và Nhật Bản. Lần đầu tiên, nó cũng sẽ có sẵn cho khách hàng của Sprint.
Đây là thiết bị của Apple cuối cùng được nâng cấp / giới thiệu trước cái chết của cựu
[CEO](/wiki/T%E1%BB%95ng_gi%C3%A1m_%C4%91%E1%BB%91c_%C4%91i%E1%BB%81u_h%C3%A0nh) của Apple [Steve Jobs](/wiki/Steve_Jobs).
## Điện thoại đắt nhất thế giới[
[sửa](/w/index.php?title=IPhone_4S&veaction=edit§ion=1) | [sửa mã nguồn](/w/index.php?title=IPhone_4S&action=edit§ion=1)]
Điện thoại iPhone 4S đã được
[độ](https://en.wikipedia.org/wiki/Modding) bởi nghệ nhân người [Liverpool](/wiki/Liverpool) Stuart Hughes sử dụng [vàng hoa hồng](https://en.wikipedia.org/wiki/Colored_gold#Rose,_red,_and_pink_gold) và kim cương với [số lượng hạn chế](https://en.wikipedia.org/wiki/Special_edition) (2 chiếc), giá thành 6 triệu [bảng Anh](/wiki/B%E1%BA%A3ng_Anh). [[2]](#cite_note-2)
## Tham khảo[
[sửa](/w/index.php?title=IPhone_4S&veaction=edit§ion=2) | [sửa mã nguồn](/w/index.php?title=IPhone_4S&action=edit§ion=2)]
## Liên kết ngoài[
[sửa](/w/index.php?title=IPhone_4S&veaction=edit§ion=3) | [sửa mã nguồn](/w/index.php?title=IPhone_4S&action=edit§ion=3)]
|
|![]()
|Wikimedia Commons có thư viện hình ảnh và phương tiện truyền tải về
|
|
|
|Phần mềm
||Ứng dụng đi kèm
||Ứng dụng ngoài của Apple
||Dịch vụ
||Khác
|
|
|
xách tay
|
|
|
|
|Đã ngừng|
|Hiện tại|
|Đã ngừng|[Phụ kiện](/w/index.php?title=Th%E1%BB%83_lo%E1%BA%A1i:Ph%E1%BB%A5_ki%E1%BB%87n_Apple_Inc.&action=edit&redlink=1)
|Hiện tại|
|Đã ngừng|[Apple Mobile Processors](/wiki/B%E1%BB%99_x%E1%BB%AD_l%C3%BD_%E1%BB%A9ng_d%E1%BB%A5ng_di_%C4%91%E1%BB%99ng_Apple)
|64-bit|
|32-bit|

X-Cache: cp1054 miss, cp1066 miss