WELCOME
Chào mừng quý vị đến với Blog Tin học PT- CNTT&GD.
Quý vị chưa đăng nhập hoặc chưa đăng ký làm thành viên, vì vậy chưa thể tải được các tư liệu của Thư viện về máy tính của mình.
Nếu chưa đăng ký, hãy đăng ký thành viên tại đây hoặc xem phim hướng dẫn tại đây
Nếu đã đăng ký rồi, quý vị có thể đăng nhập ở ngay ô bên phải.
Pascal -10B8-N01.ppt

- 0 / 0
(Tài liệu chưa được thẩm định)
Nguồn: HS
Người gửi: Nguyễn Thái Đức (trang riêng)
Ngày gửi: 10h:42' 16-05-2009
Dung lượng: 221.0 KB
Số lượt tải: 5
Nguồn: HS
Người gửi: Nguyễn Thái Đức (trang riêng)
Ngày gửi: 10h:42' 16-05-2009
Dung lượng: 221.0 KB
Số lượt tải: 5
Số lượt thích:
0 người
Pascal là một ngôn ngữ lập trình cho máy tính thuộc dạng
mệnh lệnh, được Niklaus Wirth phát triển vào năm 1970 là
ngôn ngữ đặc biệt thích hợp cho kiểu lập trình có cấu trúc.
Pascal dựa trên ngôn ngữ lập trình Algol và được đặt tên
theo nhà toán học và triết học Blaise Pascal. Wirth đồng
thời cũng xây dựng Modula-2 và Oberon, là những ngôn
ngữ tương đồng với Pascal. Oberon cũng hỗ trợ kiểu lập
trình hướng đối tượng.
I.GIỚI THIỆU VỀ NGÔN NGỮ PASCAL
Niklaus Wirth
Ban đầu, Pascal là một ngôn ngữ được hướng để dùng
trong giảng dạy về lập trình có cấu trúc, và nhiều thế hệ
sinh viên đã "vào đời" thông qua việc học Pascal như ngôn
ngữ vỡ lòng trong các chương trình học đạ cương. Nhiềubiến thể của Pascal
ngày nay vẫn còn được sử dụng khá phổ biến, cả trong giảng dạy lẫn trong công
nghiệp phát triển phần mềm.
Phần lớn hệ điều hành Macintosh được viết bằng Pascal. Hệ sắp chữ TeX phổ biến
được viết bằng một ngôn ngữ tên là Weblà ngôn ngữ mà Donald Knuth đã vay mượn
khá nhiều yếu tố từ Pascal.
II.CẤU TRÚC CHƯƠNG TRÌNH PASCAL
PROGRAM Tên_Chương_Trình; ® (*Tiêu đề*)
USES ... ® (*Phần khai báo: đơn vị chương trình
LABEL ... nhãn ...
CONST ... hằng ...
TYPE ... kiểu ...
VAR ... biến ...*)
PROCEDURE ... ® (*Phần mô tả thủ tục/ch. trình con
FUNCTION ... hàm ...*).
BEGIN ® (*Thân chương trình chính*)
... (*Các câu lệnh chương trình*)
END. ® (*Kết thúc chương trình*)
Ví dụ
PROGRAM Hello; { Dòng tiêu đề }
USES Crt; { Lời gọi sử dụng các đơn vị chương trình }
VAR Name : string; { Khai báo biến }
PROCEDURE Input; { Có thể có nhiều Procedure và Function} Begin ClrScr; { Lệnh xóa màn hình }
Write( ‘Hello ! What is your name ?... ‘);Readln(Name);
End;
BEGIN { Thân chương trình chính }
Input;
Writeln ( ‘Welcome to you, ‘, Name) ;
Writeln ( ‘Today, we study PASCAL PROGRAMMING ... ‘);
Readln;
END
III. CÁC KIỂU DỮ LIỆU SƠ CẤP CHUẨN
1. Khái niệm
là Dữ liệu tính tất cả những gì mà máy phải xử lý.
Theo Niklaus Wirth:
CHƯƠNG TRÌNH = THUẬT TOÁN + CẤU TRÚC DỮ LIỆU
Một kiểu dữ liệu (data type) là một qui định về hình dạng, cấu trúc và giá trị (data)của dữ liệu cũng như cách biểu diễn và cách xử lý dữ liệu.
Trong Pascal các kiểu dữ liệu gồm các loại sau:
- Kiểu đơn giản (Simple type): bao gồm kiểu số nguyên (Integer), kiểu số thực (Real), kiểu logic (Boolean), kiểu ký tự (Char).
- Kiểu có cấu trúc (Structure type): bao gồm mảng (Array), chuỗi (String), bản ghi (Record), tập hợp (Set), tập tin (File). -Kiểu con trỏ (pointer):
Trong chương này, chúng ta chỉ xét các kiểu dữ liệu đơn giản
2. Kiểu số nguyên (Integer type)
a. Kiểu số nguyên thuộc Z chứa trong Turbo Pascal
Được định nghĩa với các từ khóa sau:
b13/02/2009. Các phép toán số học đối với số nguyên
3. Kiểu số thực (Real type)
Pascal, kiểu số thực thuộc tập hợp R chứa trong 6 bytes, được định nghĩa với Ở Turbo từ khóa REAL: R =±[2.9 x 10-39 , 1.7 x 1038 ]
Hay viết theo dạng số khoa học: R = ± [2.9E-39, 1.7E38]
Số thực có thể viết theo kiểu có dấu chấm thập phân bình thường hoặc viết theo kiểu thập phân có phần mũ và phần định trị.
Các phép toán số học cơ bản +, -, * , /dĩ nhiên được sử dụng trong kiểu real.
Bảng dưới đây là các hàm số học cho kiểu số thực:
4. Kiểu logic (Boolean)
Một dữ liệu thuộc kiểu BOOLEAN là một đại lượng được chứa trong 1 byte ở Turbo Pascal và chỉ có thể nhận được một trong hai gía trị logic là TRUE (đúng) và FALSE (sai).
Qui ước: TRUE > FALSE
Các phép toán trên kiểu Boolean:
Nhận xét:
· Phép AND (và) chỉ cho kết quả là TRUE khi cả 2 toán hạng là TRUE
· Phép OR (hoặc) chỉ cho kết quả là FALSE khi cả 2 toán hạng là FALSE
· Phép XOR (hoặc triệt tiêu) luôn cho kết quả là TRUE khi cả 2 toán hạng là khác nhau và ngược lại.
Các phép toán quan hệ cho kết quả kiểu Boolean:
5. Kiểu ký tự (Char type)
Tất cả các dữ liệu viết ở dạng chữ ký tự được khai báo bởi từ khóa CHAR.
Một ký tự được viết trong hai dấu nháy đơn ( ‘ ‘ ). Để tiện trao đổi thông tin cần phải sắp xếp, đánh số các ký tự, mỗi cách sắp xếp như vậy gọi là bảng mã. Bảng mã thông dụng hiện nay là bảng mã ASCII (xem lại chương 3).
Để thực hiện các phép toán số học và so sánh, ta dựa vào giá trị số thứ tự mã ASCII của từng ký tự, chẳng hạn: `A` < `a` vì số thứ tự mã ASCII tương ứng là 65 và 97.
Trong Turbo Pascal mỗi ký tự được chứa trong 1 byte.
Các hàm chuẩn liên quan đến kiểu ký tự:
IV.CẤU TRÚC CÂU LỆNH
1. Câu lệnh (statement)
a.dữ liệu đã được mô tả và khai báo.
b. Câu lệnh được chia thành câu lệnh đơn giản và câu lệnh có cấu trúc.
- Câu lệnh đơn giản
+ Vào dữ liệu : Read, Readln
+ Ra dữ liệu : Write, Writeln
+ Lệnh gán : :=
+ Lời gọi chương trình con (gọi trực tiếp tên của chương trình con)
+ Xử lý tập tin : RESET, REWRITE, ASSIGN ...
- Câu lệnh có cấu trúc
+ Lệnh ghép : BEGIN .. END
+ Lệnh chọn : IF .. THEN .. ELSE Trong một chương trình Pascal, sau phần mô tả dữ liệu là phần mô tả các câu lệnh. Các câu lệnh có nhiệm vụ xác định các công việc mà máy tính phải thực hiện để xử lý các CASE .. OF .
+ Lệnh lặp : FOR .. TO .. DO
REPEAT .. UNTIL
WHILE .. DO
c. Các câu lệnh phải được ngăn cách với nhau bởi dấu chấm phẩy ( ; ) và Các câu lệnh có thể viết trên một dòng hay nhiều dòng.
V.lệnh rẽ nhánh
Lệnh IF .. THEN .. và Lệnh IF .. THEN .. ELSE..
Cú pháp:
IF <Điều kiện> THEN;
¨ Nếu điều kiện này đúng, máy thực hiện Công việc còn không thì không làm việc gì cả.
IF < Điều kiện > THEN ELSE ;
¨ Nếu điều kiện này đúng, máy thực hiện Công việc 1 (không thực hiện công việc 2) rồi đến lệnh tiếp theo.
¨ Ngược lại, nếu điều kiện sai, máy sẽ thực hiện Công việc 2 (không thực hiện công việc 1) rồi đến lệnh tiếp theo
b. Lệnh ghép (Compound statement)
Một nhóm câu lệnh đơn được đặt giữa 2 chữ BEGIN và END sẽ tạo thành một câu lệnh gh Trong Pascal ta có thể đặt các lệnh ghép con trong các lệnh ghép lớn hơn bao ngoài của nó và có thể hiểu tương tự như cấu trúc ngoặc đơn trong các biểu thức toán học.
* Sơ đồ:
BEGIN
Công việc 1 ;
Công việc 2 ;
....
Lệnh n ;
END ;
hoặc
BEGIN
Begin
.....
End;
END;
VI. Lệnh FOR DO
Cấu trúc FOR cho phép lặp lại nhiều lần một dãy lệnh. Số lần lặp lại dãy lệnh đã biết trước. Phát biểu FOR có 2 dạng:
FOR .. TO .. DO đếm lên
FOR .. DOWNTO ..DO đếm xuống
* Cú pháp tổng quát là:
FOR := TO/DOWNTO DO ;
* Ý nghĩa :
¨ Đầu tiên kiểm tra trị đầu nhỏ hơn hoặc bằng trị cuối không? Nếu:
+ Sai, kết thúc lệnh.
+ Đúng, thì thực hiện công việc, sau đó kiểm tra biến đếm có còn nhỏ hơn trị cuối không? Nếu đúng, thì tăng biến đếm lên 1 và cứ lặp cho đến khi biến đếm không còn nhỏ
hơn hoặc bằng trị cuối nữa thì thoát khỏi vòng lặp và kết thúc lệnh.
Chú ý: Trị đầu, trị cuối là các biến hoặc hằng và biến đếm phải là kiểu rời rạc.
Ví dụ Chương trình in một dãy số từ 0 đến 9
PROGRAM Day_So ;
VAR
i : Integer ;
BEGIN
FOR i := 0 TO 9 DO Write (i) ;
Readln ;
Lệnh WHILE .. DO
* Cú Ghi chú:
· Điều kiện trong cấu trúc lặp WHILE .. DO là một biểu thức logic kiểu pháp
WHILE <điều kiện> DO
Trong khi mà điều kiện còn đúng thì cứ thực hiện Công việc, rồi quay trở về kiểm tra điều kiện lại. Vòng lặp được tiếp tục, đến khi điều kiện đặt ra không còn đúng nữa thì đi tới thực hiện lệnh tiếp theo.
Boolean chỉ có 2 giá trị là Đúng (True) hoặc Sai (False)
· Nếu điều kiện Đúng thì chương trình sẽ chạy trong cấu trúc WHILE .. DO.
điều kiện là Đúng hay Sai thì chương trình sẽ thực hiện Công việc tương ứng.
· Nếu Sai thì chuyển xuống dưới cấu trúc WHILE .. DO
Ví dụ : Chương trình tính trung bình n số: x1 + x2 + x3 + ... + xn
Program Trung_binh_Day_So ;
VAR
n, count : Integer ;
x, sum, average : real ;
BEGIN
cuont := 1 ;
sum := 0 ; · Sau mỗi lần lặp, chương trình trở lại kiểm tra điều kiện. Tùy theo biểu thức logic của
Write ( ‘Nhap n = ‘) ;
readln ;
WHILE ( count < n+1) DO
BEGIN
Write ( ‘ nhap gia tri thu ‘ , count, ‘ của x = ‘ ) ;
readln (x) ;
sum := sum + x ;
count := count + 1 ;
END ;
average := sum/n ;
Writeln ( ‘ Trung binh là = ‘ , average : 10 : 3 ) ;
Writeln ( ‘ Nhan Enter de thoat ... ‘) ;
Readln ;
END.
Cuối cùng chúng em chúc thầy gặp may mắn nhiều trong cuộc sống ,hạnh phúc và luôn vui vẻ.
Danh sách các bạn:
1.Dương Thị Huyền My
2.Hoàng Thị Kiều Trang
3.Trịnh Ngọc Kiếm
4.Võ Khắc Huy
5.Nguyễn Bảy
6.Lê Hữu Đức
mệnh lệnh, được Niklaus Wirth phát triển vào năm 1970 là
ngôn ngữ đặc biệt thích hợp cho kiểu lập trình có cấu trúc.
Pascal dựa trên ngôn ngữ lập trình Algol và được đặt tên
theo nhà toán học và triết học Blaise Pascal. Wirth đồng
thời cũng xây dựng Modula-2 và Oberon, là những ngôn
ngữ tương đồng với Pascal. Oberon cũng hỗ trợ kiểu lập
trình hướng đối tượng.
I.GIỚI THIỆU VỀ NGÔN NGỮ PASCAL
Niklaus Wirth
Ban đầu, Pascal là một ngôn ngữ được hướng để dùng
trong giảng dạy về lập trình có cấu trúc, và nhiều thế hệ
sinh viên đã "vào đời" thông qua việc học Pascal như ngôn
ngữ vỡ lòng trong các chương trình học đạ cương. Nhiềubiến thể của Pascal
ngày nay vẫn còn được sử dụng khá phổ biến, cả trong giảng dạy lẫn trong công
nghiệp phát triển phần mềm.
Phần lớn hệ điều hành Macintosh được viết bằng Pascal. Hệ sắp chữ TeX phổ biến
được viết bằng một ngôn ngữ tên là Weblà ngôn ngữ mà Donald Knuth đã vay mượn
khá nhiều yếu tố từ Pascal.
II.CẤU TRÚC CHƯƠNG TRÌNH PASCAL
PROGRAM Tên_Chương_Trình; ® (*Tiêu đề*)
USES ... ® (*Phần khai báo: đơn vị chương trình
LABEL ... nhãn ...
CONST ... hằng ...
TYPE ... kiểu ...
VAR ... biến ...*)
PROCEDURE ... ® (*Phần mô tả thủ tục/ch. trình con
FUNCTION ... hàm ...*).
BEGIN ® (*Thân chương trình chính*)
... (*Các câu lệnh chương trình*)
END. ® (*Kết thúc chương trình*)
Ví dụ
PROGRAM Hello; { Dòng tiêu đề }
USES Crt; { Lời gọi sử dụng các đơn vị chương trình }
VAR Name : string; { Khai báo biến }
PROCEDURE Input; { Có thể có nhiều Procedure và Function} Begin ClrScr; { Lệnh xóa màn hình }
Write( ‘Hello ! What is your name ?... ‘);Readln(Name);
End;
BEGIN { Thân chương trình chính }
Input;
Writeln ( ‘Welcome to you, ‘, Name) ;
Writeln ( ‘Today, we study PASCAL PROGRAMMING ... ‘);
Readln;
END
III. CÁC KIỂU DỮ LIỆU SƠ CẤP CHUẨN
1. Khái niệm
là Dữ liệu tính tất cả những gì mà máy phải xử lý.
Theo Niklaus Wirth:
CHƯƠNG TRÌNH = THUẬT TOÁN + CẤU TRÚC DỮ LIỆU
Một kiểu dữ liệu (data type) là một qui định về hình dạng, cấu trúc và giá trị (data)của dữ liệu cũng như cách biểu diễn và cách xử lý dữ liệu.
Trong Pascal các kiểu dữ liệu gồm các loại sau:
- Kiểu đơn giản (Simple type): bao gồm kiểu số nguyên (Integer), kiểu số thực (Real), kiểu logic (Boolean), kiểu ký tự (Char).
- Kiểu có cấu trúc (Structure type): bao gồm mảng (Array), chuỗi (String), bản ghi (Record), tập hợp (Set), tập tin (File). -Kiểu con trỏ (pointer):
Trong chương này, chúng ta chỉ xét các kiểu dữ liệu đơn giản
2. Kiểu số nguyên (Integer type)
a. Kiểu số nguyên thuộc Z chứa trong Turbo Pascal
Được định nghĩa với các từ khóa sau:
b13/02/2009. Các phép toán số học đối với số nguyên
3. Kiểu số thực (Real type)
Pascal, kiểu số thực thuộc tập hợp R chứa trong 6 bytes, được định nghĩa với Ở Turbo từ khóa REAL: R =±[2.9 x 10-39 , 1.7 x 1038 ]
Hay viết theo dạng số khoa học: R = ± [2.9E-39, 1.7E38]
Số thực có thể viết theo kiểu có dấu chấm thập phân bình thường hoặc viết theo kiểu thập phân có phần mũ và phần định trị.
Các phép toán số học cơ bản +, -, * , /dĩ nhiên được sử dụng trong kiểu real.
Bảng dưới đây là các hàm số học cho kiểu số thực:
4. Kiểu logic (Boolean)
Một dữ liệu thuộc kiểu BOOLEAN là một đại lượng được chứa trong 1 byte ở Turbo Pascal và chỉ có thể nhận được một trong hai gía trị logic là TRUE (đúng) và FALSE (sai).
Qui ước: TRUE > FALSE
Các phép toán trên kiểu Boolean:
Nhận xét:
· Phép AND (và) chỉ cho kết quả là TRUE khi cả 2 toán hạng là TRUE
· Phép OR (hoặc) chỉ cho kết quả là FALSE khi cả 2 toán hạng là FALSE
· Phép XOR (hoặc triệt tiêu) luôn cho kết quả là TRUE khi cả 2 toán hạng là khác nhau và ngược lại.
Các phép toán quan hệ cho kết quả kiểu Boolean:
5. Kiểu ký tự (Char type)
Tất cả các dữ liệu viết ở dạng chữ ký tự được khai báo bởi từ khóa CHAR.
Một ký tự được viết trong hai dấu nháy đơn ( ‘ ‘ ). Để tiện trao đổi thông tin cần phải sắp xếp, đánh số các ký tự, mỗi cách sắp xếp như vậy gọi là bảng mã. Bảng mã thông dụng hiện nay là bảng mã ASCII (xem lại chương 3).
Để thực hiện các phép toán số học và so sánh, ta dựa vào giá trị số thứ tự mã ASCII của từng ký tự, chẳng hạn: `A` < `a` vì số thứ tự mã ASCII tương ứng là 65 và 97.
Trong Turbo Pascal mỗi ký tự được chứa trong 1 byte.
Các hàm chuẩn liên quan đến kiểu ký tự:
IV.CẤU TRÚC CÂU LỆNH
1. Câu lệnh (statement)
a.dữ liệu đã được mô tả và khai báo.
b. Câu lệnh được chia thành câu lệnh đơn giản và câu lệnh có cấu trúc.
- Câu lệnh đơn giản
+ Vào dữ liệu : Read, Readln
+ Ra dữ liệu : Write, Writeln
+ Lệnh gán : :=
+ Lời gọi chương trình con (gọi trực tiếp tên của chương trình con)
+ Xử lý tập tin : RESET, REWRITE, ASSIGN ...
- Câu lệnh có cấu trúc
+ Lệnh ghép : BEGIN .. END
+ Lệnh chọn : IF .. THEN .. ELSE Trong một chương trình Pascal, sau phần mô tả dữ liệu là phần mô tả các câu lệnh. Các câu lệnh có nhiệm vụ xác định các công việc mà máy tính phải thực hiện để xử lý các CASE .. OF .
+ Lệnh lặp : FOR .. TO .. DO
REPEAT .. UNTIL
WHILE .. DO
c. Các câu lệnh phải được ngăn cách với nhau bởi dấu chấm phẩy ( ; ) và Các câu lệnh có thể viết trên một dòng hay nhiều dòng.
V.lệnh rẽ nhánh
Lệnh IF .. THEN .. và Lệnh IF .. THEN .. ELSE..
Cú pháp:
IF <Điều kiện> THEN
¨ Nếu điều kiện này đúng, máy thực hiện Công việc còn không thì không làm việc gì cả.
IF < Điều kiện > THEN
¨ Nếu điều kiện này đúng, máy thực hiện Công việc 1 (không thực hiện công việc 2) rồi đến lệnh tiếp theo.
¨ Ngược lại, nếu điều kiện sai, máy sẽ thực hiện Công việc 2 (không thực hiện công việc 1) rồi đến lệnh tiếp theo
b. Lệnh ghép (Compound statement)
Một nhóm câu lệnh đơn được đặt giữa 2 chữ BEGIN và END sẽ tạo thành một câu lệnh gh Trong Pascal ta có thể đặt các lệnh ghép con trong các lệnh ghép lớn hơn bao ngoài của nó và có thể hiểu tương tự như cấu trúc ngoặc đơn trong các biểu thức toán học.
* Sơ đồ:
BEGIN
Công việc 1 ;
Công việc 2 ;
....
Lệnh n ;
END ;
hoặc
BEGIN
Begin
.....
End;
END;
VI. Lệnh FOR DO
Cấu trúc FOR cho phép lặp lại nhiều lần một dãy lệnh. Số lần lặp lại dãy lệnh đã biết trước. Phát biểu FOR có 2 dạng:
FOR .. TO .. DO đếm lên
FOR .. DOWNTO ..DO đếm xuống
* Cú pháp tổng quát là:
FOR
* Ý nghĩa :
¨ Đầu tiên kiểm tra trị đầu nhỏ hơn hoặc bằng trị cuối không? Nếu:
+ Sai, kết thúc lệnh.
+ Đúng, thì thực hiện công việc, sau đó kiểm tra biến đếm có còn nhỏ hơn trị cuối không? Nếu đúng, thì tăng biến đếm lên 1 và cứ lặp cho đến khi biến đếm không còn nhỏ
hơn hoặc bằng trị cuối nữa thì thoát khỏi vòng lặp và kết thúc lệnh.
Chú ý: Trị đầu, trị cuối là các biến hoặc hằng và biến đếm phải là kiểu rời rạc.
Ví dụ Chương trình in một dãy số từ 0 đến 9
PROGRAM Day_So ;
VAR
i : Integer ;
BEGIN
FOR i := 0 TO 9 DO Write (i) ;
Readln ;
Lệnh WHILE .. DO
* Cú Ghi chú:
· Điều kiện trong cấu trúc lặp WHILE .. DO là một biểu thức logic kiểu pháp
WHILE <điều kiện> DO
Trong khi mà điều kiện còn đúng thì cứ thực hiện Công việc, rồi quay trở về kiểm tra điều kiện lại. Vòng lặp được tiếp tục, đến khi điều kiện đặt ra không còn đúng nữa thì đi tới thực hiện lệnh tiếp theo.
Boolean chỉ có 2 giá trị là Đúng (True) hoặc Sai (False)
· Nếu điều kiện Đúng thì chương trình sẽ chạy trong cấu trúc WHILE .. DO.
điều kiện là Đúng hay Sai thì chương trình sẽ thực hiện Công việc tương ứng.
· Nếu Sai thì chuyển xuống dưới cấu trúc WHILE .. DO
Ví dụ : Chương trình tính trung bình n số: x1 + x2 + x3 + ... + xn
Program Trung_binh_Day_So ;
VAR
n, count : Integer ;
x, sum, average : real ;
BEGIN
cuont := 1 ;
sum := 0 ; · Sau mỗi lần lặp, chương trình trở lại kiểm tra điều kiện. Tùy theo biểu thức logic của
Write ( ‘Nhap n = ‘) ;
readln ;
WHILE ( count < n+1) DO
BEGIN
Write ( ‘ nhap gia tri thu ‘ , count, ‘ của x = ‘ ) ;
readln (x) ;
sum := sum + x ;
count := count + 1 ;
END ;
average := sum/n ;
Writeln ( ‘ Trung binh là = ‘ , average : 10 : 3 ) ;
Writeln ( ‘ Nhan Enter de thoat ... ‘) ;
Readln ;
END.
Cuối cùng chúng em chúc thầy gặp may mắn nhiều trong cuộc sống ,hạnh phúc và luôn vui vẻ.
Danh sách các bạn:
1.Dương Thị Huyền My
2.Hoàng Thị Kiều Trang
3.Trịnh Ngọc Kiếm
4.Võ Khắc Huy
5.Nguyễn Bảy
6.Lê Hữu Đức
 





















Các ý kiến mới nhất