LẬP TRÌNH CĂN BẢN
Chia sẻ bởi Nguyễn Việt Vương |
Ngày 29/04/2019 |
135
Chia sẻ tài liệu: LẬP TRÌNH CĂN BẢN thuộc Bài giảng khác
Nội dung tài liệu:
Giáo trình
LẬP TRÌNH CĂN BẢN
Dành cho sinh viên chính quy
chuyên ngành Công Nghệ Thông Tin
ThS. Nguyễn Cao Trí
[email protected]
www.dit.hcmut.edu.vn/~caotri
Giới thiệu
Mục tiêu môn học
Giới thiệu các khái niệm cơ bản về lập trình trên máy tính.
Cung cấp cơ sở lý thuyết và kỹ năng cơ bản về lập trình cho các môn học sau.
Nội dung
Một số thuật ngữ liên quan đến máy tính và lập trình.
Sơ lược về ngôn ngữ lập trình
Ngôn ngữ minh họa Pseudo code và Pascal
Các giải thuật cơ bản
Kỹ năng tư duy và thực hành trên ngôn ngữ cụ thể.
Phương thức
Phương thức học
Giờ lý thuyết: giảng và báo cáo
Giờ thực hành tại phòng máy
Kiểm tra và thi
Kiểm tra thực hành: kỹ năng lập trình
Thi lý thuyết : Thi viết
Được tham khảo tài liệu
Tài liệu tham khảo
Slide bài giảng Lập Trình Căn Bản
Giáo trình Lập trình căn bản – Khoa CNTT
Tài liệu khác
CDROM bài tập PASCAL và thực hành
www.dit.hcmut.edu.vn/~caotri
Chương 1
Khái niệm cơ bản
Một số khái niệm cơ bản về
Máy tính & chương trình máy tính
Ngôn ngữ lập trình ,translator,..
Giải thuật và flow chart
Giải thuật & biểu diễn giải thuật
Flowchart
Công cụ phát triển
Công cụ IDE, Compiler
Error & debug
Máy tính - Computer
Máy tính Analog
Máy tính số
Hệ nhị phân
Máy tính lập trình được
Mô hình máy Turing và Von Newman
Các thế hệ máy tính
Đặc tính chung
Khả năng tính toán
Khả năng thực hiện các phép toán logic
Tốc độ tính toán cao
Làm theo chỉ thị
Kiến trúc máy tính
Máy tính (Computer system)
Bao gồm nhiều thiết bị phần cứng (hardware devices)
Keyboard
Screen (monitor)
Disks
Memory
Processing Units
Hệ điều hành (Operating System – OS)
Phần mềm (software)
Công dụng: êệ thống, ứng dụng, cơ sở dữ liệu
Môi trường hoạt động: OS, Network, WEB, Server,..
Chương trình máy tính
Chương trình
Danh mục các trang thiết bị, tài nguyên sử dụng
Tiến trình sử dụng các tài nguyên và thực hiện các công việc định trước
Kết quả thực hiện
Chương trình máy tính
Tập hợp các lệnh được liệt kê theo một trình tự nhất định
Các dữ liệu sẽ được nhận
Các tài nguyên cần sử dụng
Các kết quả sẽ có được
Mục tiêu: xử lý dữ liệu theo yêu cầu định trước
Lập trình: viết chương trình cho máy tính
Ngôn ngữ lập trình
Ngôn ngữ lập trình
Phương tiện để viết chương trình cho máy tính
Hàng trăm ngôn ngữ lập trình khác nhau
Những quy định về cú pháp (syntax) & ngữ nghĩa (semantic)
Máy tính có thể hiểu được
Phân chia làm 3 nhóm chính
Ngôn ngữ máy - Machine languages
Ngôn ngữ duy nhất của máy tính - CPU
Hợp ngữ - Assembly languages
Ngôn ngữ cấp cao - High-level languages
Ngôn ngữ máy - Machine languages
Ngôn ngữ duy nhất được máy tính (CPU) hiểu trực tiếp.
Được xác định bởi tập lệnh của CPU
Phụ thuộc vào máy tính cụ thể
Dạng nhị phân {0,1}*
Rất khó đọc hiểu
Khó có khả năng viết chương trình trực tiếp
Khó nhớ hàng chục ngàn lệnh dạng {0,1}*
Rất khó xác định & sửa lỗi
Không được sử dụng trong thực tế để viết chương trình
Nền tảng xây dựng hợp ngữ
Hợp ngữ - Assembly Languages
Sử dụng các từ khóa tiếng Anh cho các lệnh hay nhóm lệnh của mã máy.
Được dịch sang mã máy khi thực hiện
Chuyển đỗi nhanh chóng
Dễ đọc và dễ hiểu hơn
Vẫn tương đối khó sử dụng do
Các lệnh còn đơn giản nên phải dùng nhiều lệnh.
Chưa có những cấu trúc điều khiển thuận tiện
Khả năng tìm và sửa lỗi cũng chưa thuận tiện.
Nền tảng xây dựng các ngôn ngữ cấp cao
Ngôn ngữ cấp cao
Một câu lệnh diễn tả nhiều động thái
Có cấu trúc ngày càng giống ngôn ngữ tự nhiên (tiếng Anh)
Được dịch sang assembly hay mã máy bằng các chương trình dịch trước khi thực thi.
Source code & Executed code
Được phân làm nhiều lớp
Lập trình goto
Lập trình cấu trúc – Structured
Lập trình hướng đối tượng – Object Oriented
Các dạng khác
Học ngôn ngữ lập trình
Học ngữ pháp
Quy tắc ngữ pháp
Từ vựng
Cấu trúc câu
Ngữ nghĩa của các lệnh
Các “thành ngữ”
Học ngôn ngữ lập trình VS. Học ngôn ngữ tự nhiên
Quy tắc ngữ pháp đơn giản
Từ vựng ít, tự quy định
Cấu trúc câu đơn giản
Hạn chế và khó khăn của sử dụng ngôn ngữ lập trình.
Chương trình dịch
Dùng để dịch từ một ngôn ngữ lập trình này sang ngôn ngữ lập trình khác
Mục tiêu cuối cùng là dịch sang mã máy để có được executed code –> chương trình thực thi
Phân loại:
Intepreter – thông dịch
Compiler – biên dịch
Intepreter vs. Compiler
Công cụ phát triển – Integrated Development Environment (IDE)
Soạn thảo
Dịch và sửa lỗi chương trình
Chạy thử và sửa lỗi
Một số khái niệm khác
Lỗi và sửa lỗi
Syntax error – lỗi ngữ pháp
Semantic error- lỗi ngữ nghĩa
Runtime error - Lỗi thực thi
Debug – Tìm và sửa lỗi
Dữ liệu, kiểu dữ liệu
Các kiểu dữ liệu cơ bản
integer, long, character, byte, ….
Real (double, float)
Kiểu khác: string
Kiểu dữ liệu có cấu trúc: array, string, record,..
Biến (Variable) & Hằng (Constant)
Giải thuật: khái niệm, công cụ biểu diễn
Flow chart – lưu đồ
Flow chart
Start
Start /Begin bắt đầu giải thuật. Chỉ có 1 và chỉ 1 điểm START.
Input / Output dữ liệu xuất/nhập
Dòng xử lý
Đặc tả thao tác xử lý hay tính toán dữ liệu
Điều khiển rẽ nhánh
Điều kiện
Yes
No
Phát biểu rẽ nhánh khác
Giá trị xét phân nhánh
Trường hợp 1
Trường hợp i
Khác
Stop
Stop/End kết thúc của giải thuật. Có thể có một hoặc nhiều điểm STOP.
Flow chart
Ưu điểm
Trình bày trực quan giải thuật
Độc lập với ngôn ngữ tự nhiên
Độc lập với ngôn ngữ lập trình
Bảo đảm khả năng lập trình
Cho phép dễ dàng kiểm tra giải thuật
Nguyên tắc kiểm tra
Đi từ START theo bất cứ đường nào cũng phải đến một điểm dừng STOP
Không có sự quay vòng vĩnh viễn
Không có sự kết thúc lưng chừng
Flow chart
Start
Nhập a, b
a=0 ?
Yes
No
b=0 ?
Yes
No
X=-b/a
Không có nghiệm
Vô số nghiệm
Stop
Algorithms
Giải phương trình ax + b = 0
Cấu trúc điều khiển cơ bản
If then Statement;
If then Statement 1
else Statement 2;
Case of
value 1 : Statement 1;
………..
value n : Statement n;
else : Statement 0
end;
While do Statement;
Repeat Statement until;
For counter=start value to end value do Statement;
For counter=start value downto end value do Statement
Chu kỳ sống của phần mềm
Thu thập yêu cầu
Phân tích thiết kế
Phát triển chương trình - codeing
Xác định giải thuật
Viết code và dịch thử , hiệu chỉnh các lỗi syntax
Thử nghiệm - Testing
Chạy thử với các dữ liệu mẫu để kiểm tra lỗi semantic và runtime
Vận hành và bảo trì
Phát triển theo yêu cầu
Một số ngôn ngữ lập trình
Lập trình goto
Assembly
Basic
Lập trình cấu trúc
Pascal, C
Foxpro
Lập trình hướng đối tượng
Java, C++, Object Pascal,…
Khác
Prolog, LISP, Visual basic (VB), VC++, J++, Delphi, ASP, PHP,..
Visual studio .NET: VB.NET, ASP.NET, C++.NET, C#
Bài tập chương 1
Viết chương trình nhập các trị a,b,c,x rồi in ra trị của tam thức ax2+bx+c
Viết chương trình nhập vào một số thực, in ra trị tuyệt đối của nó
Viết chương trình đọc vào 5 số thực rồi in ra số lớn nhất, bé nhất, tổng của 5 số này
Viết chương trình làm nhiều lần công việc sau: đọc một số thực vào, in ra căn bậc 2 của nó. Chương trình sẽ kết thúc khi số đọc vào là 0
Chương 2
Dữ liệu & cấu trúc chương trình
Các khái niệm cơ bản về dữ liệu và biểu diễn dữ liệu trong máy tính
Khai báo dữ liệu trong chương trình
Một số phép toán cơ bản
Cấu trúc cơ bản một chương trình PASCAL
Danh hiệu
Khái niệm “Danh hiệu”
Là tên của các đối tượng khác nhau trong lập trình, dùng để phân biệt giữa đối tượng này với đối tượng khác.
Các đối tượng thường được đặt tên bằng danh hiệu: biến, hằng, chương trình con, ……
Qui tắc ngữ pháp của danh hiệu:
Bắt đầu bằng chữ cái (A-Z, a-z) hay dấu gạch dưới ( _ )
Theo sau là chữ cái, dấu gạch dưới hay chữ số.
Với Pascal không phân biệt CHỮ HOA hay chữ thường
Một số ngôn ngữ có phân biệt như Java,…
Ví dụ: X , BienDem, Bien_dem, X1 , X2 , X3 , x1,x2,x3
Ví dụ sai: 101X3, (X1), Bien Dem
Danh hiệu (tt)
Danh hiệu gồm 2 loại:
Danh hiệu thuộc ngôn ngữ (Pre-defined)
Do ngôn ngữ quy định trước ý nghĩa của nó.
Được dùng cho các đối tượng có sẵn trong ngôn ngữ
Ví dụ: Integer, Readln,sqrt, real,…
Danh hiệu do người sử dụng đặt ra (user defined)
Do người sử dụng tự qui ước và qui định ý nghĩa của nó trong chương trình nguồn (source code)
Ví dụ: abc, xyz1, xyz2, delta, namsinh, tinh_giai_thua
Từ dành riêng: Là những từ do ngôn ngữ quy định sẵn như là một bộ phận cấu thành ngôn ngữ đó.
Ví dụ: begin, if, then, program, array, procedure (trang 22)
Ký hiệu đặc biệt: là những ký tự có ý nghĩa được quy định trước trong ngôn ngữ.
Ví dụ: + - * / > >= := <> ; , ( ) @ [ ] (trang 23)
Qui ước đặt tên danh hiệu
Qui tắc đặt tên danh hiệu
Tuân thủ quy tắc ngữ pháp của danh hiệu
Không được trùng lắp với danh hiệu thuộc ngôn ngữ hoặc đã được định nghĩa.
Nên sử dụng các tên gợi nhớ
Tên gợi nhớ?
Tên mà khi đọc đến sẽ giúp ta biết được ý nghĩa của đối tượng mang tên đó.
Lợi ích của tên gợi nhớ: giúp chương trình dễ đọc, dễ hiểu & dể kiểm tra.
If ABC < 0 then write(‘Phuong trinh vo nghiem’) ABC không gợi nhớ
If Delta < 0 then write(‘Phuong trinh vo nghiem’) Delta là tên gợi nhớ
Kiểu dữ liệu (data type)
Kiểu dữ liệu là gì?
Một kiểu dữ liệu là một qui định về hình dạng, cấu trúc, miền giá trị, cách biểu diễn và cách xử lý một loại dữ liệu thực tế nào đó trong máy tính.
Kiểm INTEGER biểu diễn số nguyên từ -32767 đến 32768 và thực hiện được các phép toán cộng, trừ, nhân, chia, div, mod
Kiểm CHAR biểu diễn các ký tự và biểu diễn giữa cắp dấu nháy đơn. ‘A’
Có thể thực hiện phép so sánh, không thể cộng, trừ, nhân, chia
Mọi dữ liệu muốn được xử lý bằng máy tính thì phải quy về một kiểu dự liệu nào đó mà ngôn ngữ lập trình đó hiểu được.
Số kiểu dữ liệu là một yếu tố so sánh ngôn ngữ lập trình. Càng nhiều kiểu thì càng thuận lợi cho xử lý.
Bao nhiêu kiểu dữ liệu thì đủ?
Các kiểu dữ liệu
Các kiểu dữ liệu đơn giản
Kiểu liên tục: Real (một số tên ở ngôn ngữ khác float, double)
Kiểu rời rạc: Integer, char, boolean, byte, word, liệt kê, miền con.
Các kiểu dữ liệu có cấu trúc/Kiểu do người dùng định nghĩa
Array (dãy, mãng)
Record (bản ghi, mẫu tin, mục tin)
Set (tập hợp)
File (tập tin, tệp)
String (chuỗi, xâu)
Kiểu pointer (con trỏ, chỉ điểm)
Các kiểu dữ liệu căn bản: kiểu đơn giản + string
Kiểu dữ liệu căn bản
Kiểu Integer: biểu diễn các số nguyên dạng thập phân. Chiếm 2 byte trong bộ nhớ, miền giá trị -32767 đến 32768
Kiểu Real: biểu diễn các số thực dạng thập phân hay dạng lũy thừa 10 bằng ký tự E. (3.2E8) Chiếm 6 byte trong bộ nhớ.Miền giá trị nhỏ nhất đến (1.9E-39) và lớn nhất đến (1.7E38)
Kiểu Char: biểu diễn cho dữ liệu ký tự. Chiếm 1 byte trong bộ nhớ . Miền giá trị theo bảng mã ASCCI. Biểu diễn bằng ký tự nằm giữa hai dấu nháy đơn `A’, `a’,..
Bảng mã ASSCI chuẩn và mở rộng.
Bảng mã và fonts
Các vấn đề bản mã tiếng Việt 1 byte, 2 byte, Unicode
Một số phép toán: so sánh, Ord (`F’) = 70 , Chr(65) = `A’
Kiểu Boolean: biểu diễn cho giá trị luận lý FALSE và TRUE. Qui ước FALSE < TRUE. Chiếm 1 byte trong bộ nhớ.
Kiểu dữ liệu căn bản
Kiểu Byte: biểu diễn các số nguyên dạng thập phân. Chiếm 1 byte trong bộ nhớ, miền giá trị -127 đến 128
Kiểu Word: biểu diễn các số nguyên dương dạng thập phân. Chiếm 2 byte trong bộ nhớ.Miền giá trị từ 0 đến 65535.
Kiểu String: biểu diễn cho chuỗi ký tự. Chiếm n+1 byte trong bộ nhớ với n là số ký tự có trong string. Các ký tự có chỉ số từ 1. Vị trí chỉ số 0 chứa một ký tự có giá trị có mã ASCCI là số ký tự n của string. Ví dụ chuỗi ‘Truong Dai Hoc …. Rat noi tieng’ được lưu trong bộ nhớ là
9Truong Dai Hoc …… rat noi tieng
Chuỗi trên có 57 ký tự và chiếm 58 byte với byte 0 chứa ký tự `9’
String rỗng ` ` chứa không ký tự. String có thể so sánh theo từng ký tự từ trái sang phải đến khi có sự khác biệt. Ví dụ ‘ABCDEFG’ < ‘ABcD’
Phép ghép string + : ‘Truong Dai Hoc’ + ‘Bach Khoa’ => ‘Truong Dai HocBach Khoa’
Kiểu Boolean: biểu diễn cho giá trị luận lý FALSE và TRUE. Qui ước FALSE < TRUE. Chiếm 1 byte trong bộ nhớ.
Cấu trúc chương trình Pascal
Phần Khai báo
Chứa các khai báo tài nguyên sẽ sử dụng
Các khai báo nào không cần thiết có thể bỏ đi.
Program
Label
Const
Type
Var
Khai báo chương trình con
Begin
các phát biểu, câu lệnh;
End.
Phần Thân Chương trình
Nội dung các câu lệnh mô tả công việc sẽ được thực hiện.
Các Khai báo trong PASCAL
Program tenchuongtrinh;
Program Chuongtrinhhinhtron;
Const tênhằng=giátrịhằng;
Const pi=3.14159; tentruong=‘Dai Hoc Bach Khoa’
Hằng và ý nghĩa sử dụng hằng trong chương trình.
Type tênkiểudữliệu= mô tả xây dựng kiểu
Type diemso=1..10; chucai=‘a’..’A’
Biến và khai báo biến
Biến: là ô nhớ lưu trữ dữ liệu và thay đỗi được. Có kiểu dữ liệu tương ứng.
var tên biến: kiểu dữ liệu;
Biểu thức
Các phép toán quan hệ:
= , <>, < , > , <=, >= cho kết quả kiểu boolean
a > B true hay false?
Các phép toán logic NOT, AND, OR
Các phép toán số học:
+, - , * , /
Div và Mod dùng cho số nguyên kiểu trả về là số nguyên.
Phép gọi hàm: gọi một chương trình con loại hàm số tương đương với một phép toán
Biểu thức: là một công thức tính toán tạo từ các biến, hằng, các giá trị cụ thể, các phép toán và dấu (, ) . Kiểu dữ liệu trả về cũng là kiểu dữ liệu của biểu thức.
A+2*b(c-d) Biến là một biểu thức
Phát biểu gán và thủ tục xuất nhập
Phát biểu gán :=
Gán một giá trị của một biểu thức cho một biến
TenBien := Bieuthuc;
Các thao tác xuất nhập:
Read(B1,B2,…..)
Write(BT1,BT2,….)
Readln(B1,B2,…..)
Writeln(BT1,BT2,….)
Readln(a,b) 12 15
Bài tập chương 2
Viết biểu thức Pascal cho:
b)
Viết chương trình đọc 2 số x,y; Kiểm tra xem y có là ước số của x hay không? Hay x là ước số của y không?
Viết chương trình làm việc như một máy tính bỏ túi đơn giản với các phép tính +,-,*,/. Kết thúc khi nhập ký tự ‘!’
Viết chương trình nhập vào một số tự nhiên và in ra ước số của nó
Chương 3
Các phát biểu điều khiển
Các phát biểu điều khiển
Phát biểu điều khiển và flowchart
So sánh và đánh giá
Tổng quan
Phát biểu điều khiển: là những dòng lệnh dùng để điều khiển hoạt động của chương trình.
Các phát biểu điều khiển cơ bản
Phát biểu gán (assignment statement)
Các phát biểu điều khiển (control statements)
Phát biểu ghép BEGIN END;
Phát biểu điều kiện IF
Phát biểu điều kiện CASE
Phát biểu lặp WHILE
Phát biểu lặp REPEAT
Phát biểu lặp FOR
Phát biểu GOTO
Phát biểu gọi thủ tục (procedure call): gọi các chương trình con loại procedure
Phát biểu WITH : dùng với kiểu dữ liệu record.
Phát biểu ghép BEGIN END;
Dùng để ghép nhiều phát biểu thành một phát biểu.
Cú pháp : BEGIN các phát biểu; END;
Ví dụ
Begin
t:=x;
x:=y;
y:=t;
writeln(‘đã đổi xong’);
End;
S1
S2
Sn
N phát biểu
1 phát biểu
BEGIN
END;
Phát biểu IF
Dùng để thực hiện hay không một phát biểu theo một điều kiện.
Cú pháp
if then statement;
Ví dụ
If Delta > 0 then
begin
X1:= (-b + sqrt(Delta))/2/a
X2:= (-b - sqrt(Delta))/2/a
end;
Condition
Statements
Yes
Chỉ có 1 phát biểu trong thân của IF
No
Phát biểu IF Then Else
Dùng để chọn lựa phát biểu nào sẽ được thực hiện giữa 2 phát biểu.
Cú pháp
if then statement1 else statement2 ;
Ví dụ
If Delta > 0 then
begin
X1:= (-b + sqrt(Delta))/2/a
X2:= (-b - sqrt(Delta))/2/a
end
else Writeln(‘Còn xét tiếp’);
Condition
Statement1
Yes
No
Statement2
Trường hợp đặc biệt
Xét phát biểu sau:
If ĐK1 then if ĐK2 then S1 else S2;
ELSE sẽ thuộc về IF nào gần 1 chưa có ELSE
else
else
?
ĐK2
S1
Yes
No
S2
ĐK2
Yes
No
Phát biểu CASE
Dùng để chọn một trong số những phát biểu để thực hiện tùy theo giá trị của biểu thức chọn.
Các nhãn case: chỉ ra các trường hợp phân nhánh.
Các nhãn case là một hay nhiều giá trị rời rạc theo sau là dấu : và một phát biểu tương ứng.
Case BiểuThứcChọn of
nhãn1: S1;
nhãn2: S2;
nhãnN: Sn;
else S0;
End;
BiểuThứcChọn
S1
S2
S0
SN
Nhãn1
Nhãn2
NhãnN
Else
Phát biểu While
Dùng để lặp đi lặp lại nhiều lần một công việc nào đó.
Cú pháp
While <ĐK> Do statement;
While kiểm tra điều kiện trước rồi mới thực hiện phát biểu.
Số lầp lặp là không biết trước.
Số lần lặp tối thiểu là 0 và tối đa là không xác định.
Chú ý: Trong thân của while phải có ít nhất một phát biểu có khả năng thay đổi giá trị của điều kiện. Nếu không sẽ lặp vô tận (infinite loop)
Ví dụ:
gt:=1; i:=1
While i begin
i:=i+1;
gt:=gt*I;
end;
ĐK
S1
Yes
No
Phát biểu Repeat
Dùng để lặp đi lặp lại nhiều lần một công việc nào đó.
Cú pháp
Repeat statements until <ĐK>;
Repeat thực hiện xong các phát biểu rồi mới kiểm tra điều kiện.
Số lầp lặp là không biết trước.
Số lần lặp tối thiểu là 1 và tối đa là không xác định.
Chú ý: Trong thân của repeat phải có ít nhất một phát biểu có khả năng thay đổi giá trị của điều kiện. Nếu không sẽ lặp vô tận (infinite loop)
Ví dụ:
gt:=1; i:=1
repeat
i:=i+1;
gt:=gt*I;
until i>n;
ĐK
S1
Yes
No
While vs. Repeat
While và Repeat là hai phát biểu có thể chuyển đổi cho nhau.
White <ĐK> do statement;
=> If <ĐK> then repeat statement until NOT(<ĐK>);
Repeat statements until <ĐK>;
=> Begin
statements;
while NOT(<ĐK>) do begin
statements;
end;
End;
Chú ý khả năng bị lặp vô tận.
Một phát biểu
Phát biểu FOR
Dùng để lặp lại một công việc nào đó với số lần lặp là xác định được.
Sử dụng biến đếm và biểu thức cận để xác định số lần lặp lại.
For biendem:=BT1 to BT2 do statement;
Số lần lặp là BT2-BT1+1;
Sau mỗi lần lặp biendem tăng đến giá trị kế tiếp;
For biendem:=BT1 downto BT2 do statement;
Số lần lặp là BT1-BT2+1;
Sau mỗi lần lặp biendem giảm đến giá trị kế tiếp;
Một số chú ý với phát biểu FOR
Biến đếm và các biểu thức cận phải thuộc cùng một kiểu rời rạc.
Trong thân của FOR, dù cho các thành phần của biểu thức cận thay đổi vẫn không ảnh hưởng đến số lần lặp. Ví dụ đoạn code sau:
a:=5;
For i:=1 to a do a:=a+1;
vẫn chỉ lặp đúng 5 lần dù a bị thay đổi.
Giá trị của biến đếm sau vòng lặp FOR là KHÔNG XÁC ĐỊNH. Phụ thuộc vào từng compiler. Do đó không được sử dụng tiếp giá trị này cho các tính toàn tiếp theo mà phải gán lại giá trị cụ thể mới.
Không được thay đổi giá trị biến đếm trong thân vòng lặp FOR.
Bài tập chương 3
Viết chương trình làm nhiều lần công việc sau: Đọc vào số tự nhiên N và in ra N!
Viết chương trình máy tính bỏ túi dùng phát biểu case
Viết chương trình nhập vào một số nguyên dương và in ra ước số lẻ lớn nhất của nó
Viết chương trình nhập vào một số tự nhiên và kiểm tra xem nó có là số nguyên tố hay không
Viết chương trình nhập vào một số nguyên dương N và tính S = 12 + 22+ 32 +…+ N2
Chương 4
Các kiểu dữ liệu do người dùng định nghĩa
Các kiểu dữ liệu rời rạc
Các kiểu dữ liệu có cấu trúc
Một số giải thuật trên aray.
Khái niệm cơ bản về cấu trúc dữ liệu
Bài tập
Các bài tập trong sách giáo trình
Bài tập nhân 2 ma trận.
Bài tập xác định ma trận đối xứng
Bài tập quản lý điểm sinh viên dùng array và record
Các bài tập khác bằng chương trình Pascal
Kiểu do người dùng định nghĩa
Kiểu do người dùng định nghĩa:
Được xây dựng từ những kiểu cơ bản.
Do ngôn ngữ lập trình quy định sẳn cấu trúc và phương thức truy cập
Người dùng sẽ định nghĩa bằng cách xác định cụ thể các giá trị của các thông số.
Bao gồm
Các kiểu rời rạc: liệt kê, miền con.
Các kiểu có cấu trúc: Array, Record, String
Kiểu miền con
Định nghĩa: Kiểu miền con của một kiểu rời rạc là một miền trị của kiểu rời rạc đó (kiểu chủ) được xác định bằng 2 cận là 2 giá trị của kiểu chủ.
Một giá trị thuộc kiểu miền con nằm trong phạm vi giữa 2 cận.
Mục tiêu sử dụng:
Đối với một số compiler cho phép sinh mã tự động kiểm tra tính hợp lý của dự liệu thay vì phải tự kiểm tra bằng dòng lệnh. ( chỉ thị là {$R+} vối Turbo Pascal).
Tiết kiệm bộ nhớ trong một số trường hợp.
Dùng trong khia báo các kiểu dữ liệu có cấu trúc khác như Array.
Áp dụng được các phép toán của kiểu chủ cho kiểu miền con. Cần chú ý đến vùng giá trị kết quả để tránh runtime error
Cú pháp : Tenkieu = canduoi . . Cantrên;
diem = 1 . . 10;
chu = ‘a’ .. ‘z’
Kiểu liệt kê
Kiểu liệt kê được định nghĩa bằng các liệt kê ra các giá trị của kiểu. Các giá trị đó là danh hiệu.
Ví dụ: ngay = (sun, mon, tue, wed, thu, fri, sat)
Var homqua, homnay, ngaymai : ngay
Các phép toán:
Có thể gán các biễu thức liệt kê cùng kiễu cho biến tương ứng. Ví dụ: homqua := mon;
Thực hiện phép so sánh dự trên thứ tự index chính là thứ tự liệt kê bằt đầu từ 0 và tằng dần. Ví dụ tue < wed
Hàm ORD (), hàm SUCC() , hàm PRED()
Không được dùng thao tác xuất nhập với kiểm liệt kê.
Kiểu dữ liệu ARRAY
Định nghĩa: Array là một dãy gồm nhiều phần tử cùng một kiểu. Hay nói cách khác một dữ liệu kiểu array là một dãy của nhiều dữ liệu thuộc cùng một kiểu.
Các phần tử của một dãy phải có cùng kiểu gọi là kiểu cơ sở. Kiểu cơ sở có thể là một kiểu bất kỳ của Pascal.
Các phần tử có mối quan hệ về vị trí trong dãy được xác định bằng chỉ số (index). Chính là thứ tự về vị trí của nó trong dãy
Khai báo dãy: tenkieuday = array[kieuchiso] of kieucoso
Số phần tử của dãy chính là số giá trị có thể có của kiểu chỉ số.
Index có giá trị từ giá trị nhỏ nhất đến giá trị lớn nhất của kiểu chỉ số
Vi dụ : daynguyen = array [1..100] of integer;
dayreal = array [char] of real;
Dãy nguyên có 100 phần tử kiểu integer;index từ 1 đến 100.
Dãy dayreal có 256 phần tử kiểu real; index từ ký tự có chr(0) đến chr(255).
Các phép toán trên ARRAY
Có thể thực hiện phép gán giá trị của các biến của cùng một kiểu array cho nhau. Ví dụ
var a ,b : daynguyen; ta có thể gán a:= b;
Phát biểu này gán giá trị của từng phần tử trong dãy b sang phần tử tương ứng của dãy a.
Có thể truy xuất đến từng phần tử của dãy trực tiếp bằng cách dùng tenbien[index]. Ví dụ: a[5] := b[8]
Có thể sử dụng từng phần tử của dãy như là một biến của kiểu dữ liệu cơ sở. Ví dụ
for i:= 1 to 100 do readln(a[i])
Một số đặc tính của kiểu array
Số phần tử của kiểu array là cố định ngay từ khi khai báo. Dù là ta dùng bao nhiêu phần tử thì cũng chiếm đúng số bộ nhớ mà dãy đã khai báo.
Do đó thông thường phải khai báo dư hơn số thường dùng để tránh bị thiếu => lãng phí bộ nhớ.
Các phần tử của dãy được xếp liên tục trong bộ nhớ do đó:
Cho phép khả năng truy xuất ngẫu nhiên => nhanh
Cần có vùng nhớ trống liên tục đủ lớn khi cấp phát bộ nhớ cho dãy. => khó cấp phát.
Một số giải thuật trên array
Khi tổ chức lưu trữ trên array của nhiều phần tử, thao tác thường phải thực hiện là tìm kiếm (search) và sắp xếp (sort) các phần tử trong dãy
Việc tìm kiếm (search) dùng để truy vấn thông tin.
Việc sắp xếp (sort) dùng để trình bày thông tin và giúp cho thao tác search hiệu quả hơn.
Một số giải thuật:
Linear search có và chưa sort, Binary search
Buble sort, quick sort
Linear search
Xem xét từng phần tử xem có phải giá trị cần tìm hay không cho đến khi tìm thấy hoặc hết số phần tử của array thì kết luận có không có.
Timthay := 0;
For i:= 1 to n do if a[i]=giatricantim then timthay:= i;
if timthay= 0 then writeln(‘Không có’)
else writeln(‘Có tại ‘, timthay);
i:=1
while (i<=n)and(a[i]<>giatricantim) do i:= i + 1;
Số phần tử tổng quát cần duyệt tối đa là N. Có thể áp dụng cho dãy bất kỳ, tuy nhiên nếu dãy có thứ tự thì có thể duyệt nhanh hơn “một ít”.
Binary search
Áp dụng cho dãy đã có thứ tự. Nguyên tắc chính là dựa vào tính thứ tự của dãy để thực hiện số phép so sánh tối thiểu bằng cách lấy phần tử giữa so sánh với giá trị cần tìm:
nếu bằng có nghĩa là tìm thấy tại vị trí đó.
nếu không bằng thì phân nữa số phần tử sẽ được loại bỏ không cần xét vì chắc chắn không thể bằng.
Giải thuật này cho tốc độ tìm kiếm rất cao. Ví dụ dãy có 1 triệu phần tử chỉ tốn không đến 20 phép so sánh là đã xác định được trong khi với linear search là 1 triệu phép so sánh.
Binary search – giải thuật
Dãy A có n phần tử từ 1..n . Giá trị cần tìm là X.
i:=1; j:=n; co:=false;
While (i begin
m:=(i+j) div 2;
If a[m] = X then co:=true
else if a[m] > X then j:=m
else i:=m;
end;
If co then “writeln(‘Tim co phan tu’, X)
else writeln(‘Khong co phan tu’, X);
Bubble Sort
Dùng để sắp thứ tự một dãy.
Nguyên tắc :
Tìm phần tử lớn nhất đặt vào vị trí cuối cùng A[n] bằng cách so sánh lần lượt các cặp từ a[j], a[j+1] với j từ 1=> n-1. Nếu phần tử a[i] >a[j] thì hoán đỗi 2 phần tử này
Lặp lại bước trên với số phần tử của dãy còn lại giảm dần từ n -> 2 .
Khi hoàn tất dãy sẽ có thứ tự tăng dần.
Ưu điểm của giải thuật là đơn giản. Tuy nhiên tốc độ sắp thứ tự không cao.
Có một giải thuật khác khá mạnh là QuickSort
Bubble Sort – giải thuật
Giải thuật bubble Sort cho dãy có n phần tử và tăng dần.
For i:= 1 to n do
For j:= 1 to n-i do
if A[j]>A[j+1] then
Begin
t:= a[i];
a[j]:=a[j+1];
a[j+1]:=t;
End;
So sánh và hoán đổi giá trị 2 phần tử.
Biến t có dùng kiểu dữ liệu với kiểu cơ sở của array
Array nhiều chiều
Kiểu cơ sở của array có thể là một array khác, hình thành nên cấu trúc array of array. Trong Pascal hổ trợ sẵn kiển trúc này với kiểu dữ liệu array nhiều chiều (multi-dimension array).
Khai báo
tenkieu= array [index1, index2,.., indexN] of kieucoso;
Ví dụ: matran = array[1..10, 1..20] of real;
table = array [1..100, ‘a’..’z’] of integer;
Từng phần tử của array nhiều chiều có thể được truy cập trực tiếp bằng cách chỉ rõ index trên từng chiều.
Ví dụ : a[3,5] hay b[11,’h’]
Các phần tử này cũng có thể được sử dụng như là một biến kiểu cơ sở.
Kiểu RECORD
Record là một kiểu dữ liệu gồm nhiều thành phần, các thành phần có thể thuộc về những kiểu dữ liệu khác nhau.
Khai báo
tênkieu = Record
tênfield:kieudulieu_cua_field;
……..
tênfield:kieudulieu_cua_field;
end;
Kiểu Record (tt)
Các phép toán
Có thể gán giá trị các biến record thuộc cùng một kiểu cho nhau. Khi đó sẽ gán từng field tương ứng.
Có thể truy cập đến từng thành phần (field) của record bằng cách dùng cấu trúc biênrecord.tênfield.
Mỗi field có thể dùng như một biến thuộc kiểu dữ liệu tương ứng.
Record của record
Trong cấu trúc field của record có thể là một record khác.
Khi đó dield record tương ứng là một record đề có thể truy cập đến field bên trong dạng recordname.fieldrecord.field
Phát biểu WITH
WITH là một phát biểu dùng với kiểu dữ liệu record
Phát biểu WITH có dạng
WITH recordname do Statement;
trong đó record name là một biến record, Statement là một phát biểu.
Ý nghĩa phát biểu WITH. Trong phần thân của phát biểu WITH, khi muôn truy cập đến các field của record tương ứng ta chỉ cần dùng tên filed mà không cần dùng Tênrecord.tênfield như thông thường.
Kiểu tập hợp
Định nghĩa: Dữ liệu kiểu tập hợp là một tập hợp của nhiều dữ liệu thuộc cùng một kiều rời rạc.
Khai báo:
Tênkieu = set of kiểu cơ sở
Ví dụ: tapnguyen = setof integer;
Một dữ liệu kiểu tập hợp là một tập hợp được biểu diễn dạng [phantu, phantu,..]
Có thể gán tập hợp này cho tập hợp kia nếu chúng có cùng kiểu cơ sở.
Ví dụ: t1 := [1,3,5,8] hay t2:=t1
Các phép toán trên tập hợp
Với các biến kiểu tập hợp ta có các phép toán
Phép toán = : cho giá trị TRUE nếu hai tập hợp bằng nhau
Phép toán <>: cho giá trị TRUE nếu hai tập hợp khác nhau
Phép toán <= : A<=B là TRUE nếu A bao hàm trong B
Phép toán >= : A>=B là TRUE nếu A chứa B
Phép toán IN : X IN A cho giá trị TRUE nếu trong A chứ phần tử X
Phép hợp + : A+B là hợp của hai tập A, B
Phép giao *: A*B là giao của hai tập A, B
Phép hiệu - : A-B là hiệu của hai tập A,B
Chương 5
Chương trình con
Chương trình con
Phân loại và khai báo
Thông số: phân loại và ý nghĩa
Biến cục bộ và toàn cục
Tầm vực chương trình con – biến
Đệ quy
Chương trình con
Khái niệm: Chương trình con là một đoạn chương trình có tên và được gọi thực hiện ở nhiều nơi trong chương trình chính.
Tại sao phải dùng chương trình con:
Có công việc cần phải được thực hiện tại nhiều nơi trong chương trình => tách công việc đó thành chương trình con
Phân đoạn, module chương trình để thuận tiện trong quản lý, trình bày và phát triển.
Các lợi ích của việc sử dụng chương trình con
Các loại chương trình con: Procedure & Function
Phương thức thực hiện của chương trình con
Thông số: là những giá trị có thể thay đổi cho mỗi lần thực hiện chương trình con, thông thường là những dữ liệu cụ thể cần cho tháo tác sử lý của từng trường hợp gọi chương trình con
Danh sách thông số
Phương thức dịch và chuyển điều khiển khi gọi chương trình con
Một số điểm chú ý trong việc sử dụng chương trình con
Khai báo chương trình con trong chương trình chính của PASCAL.
Chương trình con Procedure
Procedure TenChuongTrinhCon(danhsachthongso);
Cont
Type
Var
Khai báo chương trình con
Begin
Phần thân chương trình con
End;
** Chương trình con có thể có chương trình con bên trong
Chương trình con Function
Function TenChuongTrinhCon(danhsachthongso):KieuDuLieuCuaTriTraVe;
Cont
Type
Var
Khai báo chương trình con
Begin
Phần thân chương trình con
TenChuongTrinhCon:=GiaTriTraVe;**
End;
** Trong thân chương trình con phải có lệnh gán giá trị trả về cho tên chương trình con.
Tên chương trình con function có thể dùng như một biến có kiểu dữ liệu chính là kiểu của chương trình con function
Thông số
Thông số hình thức: là những thông số được khai báo trong danh sách thông số. Khi chương trình con được gọi thực hiện thì các thông số này sẽ được truyền những giá trị cụ thể cho chương trình con thực hiện.
Thông số thực: những giá trị cụ thể (biến, hằng, giá trị) truyền cho các thông số hình thức khi chương trình con được gọi là các thông số thực.
Thông số hình thức có 2 loại:
Thông số hình thức trị
Thông số hình thức biến
Thông số thực hợp lệ cho các thông số hình thức phụ thuộc vào loại của thông số hình thức
Thông số hình thức trị
Định nghĩa: Những thông số hình thức không đi sau từ khoá var trong khai báo danh sách thông số là thôgn số hình thức trị
Ví dụ: procedure ABC (A: integer, var B: real, C:string);
Thông số hình thức trị là A và C
Khi truyền thông số, thông số thực sẽ truyền TRỊ của mình cho thông số hình thức trị.
Mọi sự thay đổi của thông số hình thức trị trong chương trình con KHÔNG ảnh hưởng gì đến trị của thông số thực truyền cho nó.
Thông số thực cho thông số hình thức trị là một biểu thức cùng kiểu.
Thông số hình thức biến
Định nghĩa: Những thông số hình thức đi sau từ khoá var trong khai báo danh sách thông số là thông số hình thức biến.
Ví dụ: procedure ABC (A: integer, var B: real, C:string);
Thông số hình thức trị là A và C
Khi truyền thông số, thông số thực sẽ truyền địa chỉ của mình cho thông số hình thức trị.
Mọi sự thay đổi của thông số hình thức trị trong chương trình con SẼ ảnh hưởng trực tiếp và tức thời lên chính ô nhớ của thông số thực, tức là ảnh hưởng ngay đến chính thông số thực tương ứng.
Thông số thực cho thông số hình thức trị phải là một biến cùng kiểu.
Thông số hình thức biến còn được dùng để trả về các giá trị cần thiết cho chương trình gọi sau khi chương trình con kết thúc.
Cấu trúc khối trong chương trinh Pascal
Định nghĩa Khối: Một khối (block) gồm 2 phần:
Phần khai báo với các khia báo: const, type, var, chương trình con.
Phần thân: bắt đầu bằng BEGIN, ở giữa là các phát biểu và kết thúc bằng END
Như vậy:
Một chương trình là một Block
Một chương trình con là một Block
Trong chương trình có chương trình con và trong chương trình con có chương trình con khác -> trong block có block
Một chương trình là một Block với các Block con lồng vào nhau.
ChuongTrinhChinh
A
B
A1
A2
B1
B2
B2
B21
C
Vấn đề tầm vực
Định nghĩa : Tầm vực (Scope) của một đối tượng trong chương trình là vùng má nó được biết đến và có thể được sử dụng.
Tầm vực áp dụng trên các đối tương như: biến, hằng, kiểu dữ liệu, chương trình con.
Qui tắc xác định tầm vực: Tầm vực của một đối tượng được xác định từ vị trí mà nó được khai báo cho đến hết Block chứa khai báo đó, kể cả những Block bên trong của nó. Ngoại trừ trường hợp có sự khai báo lại trong một khối con.
Khai báo lại: Nếu khối A chứa khối B và trong cả 2 khối đều khai báo một đối tượng tênX thì Khối B chỉ có thể truy xuất đối tượng X của chính nó và không thể truy xuất đối tượng X của khối A.
X
X
Tầm vực của chương trình con
Một chương trình có nhiều chương trình con, chương trình con lại có thể có nhiều chương trình con khác. Như vậy đối với một chương trình con, những nơi nào có thể gọi nó thực hiện. Những nơi đó thuộc tầm vực của chương trình con.
B2 có thể được gọi từ: B1, B2, B3
B2 không gọi được từ : A0, C1
Tầm vực của chương trình con là toàn bộ CHA của nó
B1 có thể gọi được từ: A0, B1, C1, B2, B3
C1 có thể gọi từ A0, còn trong B1, B2, B3 thì có gọi C1 được không?
A0
B1
C1
B2
B3
Một cách khác để xác định tầm vực của chương trình con
Tại một điểm X nào đó trong chương trình, điểm đó sẽ thuộc về tầm vực của chương trình con Y nếu nó NHÌN THẤY chương trình con Y.
Nguyên tắc NHÌN như sau:
Nhìn từ trong khối ra ngoài thì thấy xuyên qua đường bao khối.
Nhìn từ ngoài vào thì không xuyên được đường bao khối.
A0
B1
C1
B2
B3
Tầm vực của Biến
Một biến X trong B1 được biết đến trong toàn bộ B1.Nghĩa là trong B2, B3 có thể sử dụng biến này. Như vậy biến X là không cục bộ với B2 và B3.
Biến X không được biết đến trong C1 và A0 như vậy đối với C1 và A0 thì X là biến cục bộ của B1.
Biến Y khia báo trong A0 (chương trình chính) là biến toàn cục.
Tầm vực của Biến là toàn bộ Block mà nó được khai báo. Trừ trường hợp khai báo lại.
Biến X trong B1 có tầm vực là B1, B2 và B3. Tuy nhiên nếu trong B2 ta lại khai báo một biến X khác (Khai báo lại) thì biến X của B1 không được hiểu trong B2. Nói cách khác tầm vực của nó đã bị loại B2 ra. (khi đó thuộc về biến X khai báo trong B2)
A0
B1
C1
B2
B3
Sự đệ quy (recursion)
Khái niệm đệ quy: Một khái niệm X được gọi là định nghĩa đệ quy nếu trong định nghĩa của X có sử dụng ngay chính khái niệm X.
Ví dụ:
N! = 1*2*3…..* n là định nghĩa không đệ quy
N! = N * (N-1)! Là định nghĩa đệ quy
Người giàu là người có nhiều tiền hoặc có cha mẹ là người giàu
Con người là con của con người
Chương trình con đệ quy
Chương trình con là một định nghĩa về công việc nào đó, nếu trong quá trình định nghĩa đó ta có dùng chính chương trình con đó thì ta nói chương trình con đó được viết đệ quy.
Nói cách khác: một chương trình con mà trong phần thân của nó có lệnh gọi chính nó là chương trình con đệ quy.
Có chương trình chính đệ quy không? Tại sao?
Không phải tất cả các ngôn ngữ lập trình đều cho phép gọi đệ quy.
Ưu khuyết điểm của đệ qui
Đệ quy là cách thức đơn giản để mô tả những quá trình lặp đi lặp lại.
Các chương trình viết đệ quy thường chạy tốn nhiều bộ nhớ và tốc độ chậm so với viết bằng các vòng lặp. Do đó người ta thường tìm cách gỡ đệ quy.
Chương trình viết đệ quy thường ngắn gọn, dễ kiểm tra, dễ viết. Lới giải bằng đệ quy dễ tiếp cận hơn.
Một số bài toán chỉ có thể giải bằng đệ quy mà thôi, do đó nếu ngôn ngữ không hổ trợ gọi đệ quy thì không thể giải những bài toán này.
Đệ qui hổ tương và tham khảo trước
Đệ quy hổ tương: Chương trình con A gọi chương trình con B, trong chương trình con B lại có lệnh gọi chương trình con A.
Vậy khia báo A và B như thế nào?
Khai báo A trước thì trong A không thể gọi B vì B chưa được khia báo
Khai báo B trước thì ngược lại.
Phải khai báo chương trình con trước khi viết nó => Khai báo trước.
Procedure TênCTC(Thôngsố);forward;
Khi viết Procedure TênCTC;
A
……
Gọi B
…..
B
……
Gọi A
………
Một số hàm và thủ tục có sẳn
Các hàm và thủ tục có sẵn
Unit trong pascal: là một bộ các hàm và thủ tục được viết sẳn của pascal
Một số Unit: System, graph, graph3, dos, printer, crt, … các unit có tên file với phần ext là .tpl, .tpu
Ngoại trừ System unit là tự động nạp còn các unit khác nếu muốn dùng thì trong phần khia báo ngay sau khai báo program ta dùng khai báo USES
uses graph;
LẬP TRÌNH CĂN BẢN
Dành cho sinh viên chính quy
chuyên ngành Công Nghệ Thông Tin
ThS. Nguyễn Cao Trí
[email protected]
www.dit.hcmut.edu.vn/~caotri
Giới thiệu
Mục tiêu môn học
Giới thiệu các khái niệm cơ bản về lập trình trên máy tính.
Cung cấp cơ sở lý thuyết và kỹ năng cơ bản về lập trình cho các môn học sau.
Nội dung
Một số thuật ngữ liên quan đến máy tính và lập trình.
Sơ lược về ngôn ngữ lập trình
Ngôn ngữ minh họa Pseudo code và Pascal
Các giải thuật cơ bản
Kỹ năng tư duy và thực hành trên ngôn ngữ cụ thể.
Phương thức
Phương thức học
Giờ lý thuyết: giảng và báo cáo
Giờ thực hành tại phòng máy
Kiểm tra và thi
Kiểm tra thực hành: kỹ năng lập trình
Thi lý thuyết : Thi viết
Được tham khảo tài liệu
Tài liệu tham khảo
Slide bài giảng Lập Trình Căn Bản
Giáo trình Lập trình căn bản – Khoa CNTT
Tài liệu khác
CDROM bài tập PASCAL và thực hành
www.dit.hcmut.edu.vn/~caotri
Chương 1
Khái niệm cơ bản
Một số khái niệm cơ bản về
Máy tính & chương trình máy tính
Ngôn ngữ lập trình ,translator,..
Giải thuật và flow chart
Giải thuật & biểu diễn giải thuật
Flowchart
Công cụ phát triển
Công cụ IDE, Compiler
Error & debug
Máy tính - Computer
Máy tính Analog
Máy tính số
Hệ nhị phân
Máy tính lập trình được
Mô hình máy Turing và Von Newman
Các thế hệ máy tính
Đặc tính chung
Khả năng tính toán
Khả năng thực hiện các phép toán logic
Tốc độ tính toán cao
Làm theo chỉ thị
Kiến trúc máy tính
Máy tính (Computer system)
Bao gồm nhiều thiết bị phần cứng (hardware devices)
Keyboard
Screen (monitor)
Disks
Memory
Processing Units
Hệ điều hành (Operating System – OS)
Phần mềm (software)
Công dụng: êệ thống, ứng dụng, cơ sở dữ liệu
Môi trường hoạt động: OS, Network, WEB, Server,..
Chương trình máy tính
Chương trình
Danh mục các trang thiết bị, tài nguyên sử dụng
Tiến trình sử dụng các tài nguyên và thực hiện các công việc định trước
Kết quả thực hiện
Chương trình máy tính
Tập hợp các lệnh được liệt kê theo một trình tự nhất định
Các dữ liệu sẽ được nhận
Các tài nguyên cần sử dụng
Các kết quả sẽ có được
Mục tiêu: xử lý dữ liệu theo yêu cầu định trước
Lập trình: viết chương trình cho máy tính
Ngôn ngữ lập trình
Ngôn ngữ lập trình
Phương tiện để viết chương trình cho máy tính
Hàng trăm ngôn ngữ lập trình khác nhau
Những quy định về cú pháp (syntax) & ngữ nghĩa (semantic)
Máy tính có thể hiểu được
Phân chia làm 3 nhóm chính
Ngôn ngữ máy - Machine languages
Ngôn ngữ duy nhất của máy tính - CPU
Hợp ngữ - Assembly languages
Ngôn ngữ cấp cao - High-level languages
Ngôn ngữ máy - Machine languages
Ngôn ngữ duy nhất được máy tính (CPU) hiểu trực tiếp.
Được xác định bởi tập lệnh của CPU
Phụ thuộc vào máy tính cụ thể
Dạng nhị phân {0,1}*
Rất khó đọc hiểu
Khó có khả năng viết chương trình trực tiếp
Khó nhớ hàng chục ngàn lệnh dạng {0,1}*
Rất khó xác định & sửa lỗi
Không được sử dụng trong thực tế để viết chương trình
Nền tảng xây dựng hợp ngữ
Hợp ngữ - Assembly Languages
Sử dụng các từ khóa tiếng Anh cho các lệnh hay nhóm lệnh của mã máy.
Được dịch sang mã máy khi thực hiện
Chuyển đỗi nhanh chóng
Dễ đọc và dễ hiểu hơn
Vẫn tương đối khó sử dụng do
Các lệnh còn đơn giản nên phải dùng nhiều lệnh.
Chưa có những cấu trúc điều khiển thuận tiện
Khả năng tìm và sửa lỗi cũng chưa thuận tiện.
Nền tảng xây dựng các ngôn ngữ cấp cao
Ngôn ngữ cấp cao
Một câu lệnh diễn tả nhiều động thái
Có cấu trúc ngày càng giống ngôn ngữ tự nhiên (tiếng Anh)
Được dịch sang assembly hay mã máy bằng các chương trình dịch trước khi thực thi.
Source code & Executed code
Được phân làm nhiều lớp
Lập trình goto
Lập trình cấu trúc – Structured
Lập trình hướng đối tượng – Object Oriented
Các dạng khác
Học ngôn ngữ lập trình
Học ngữ pháp
Quy tắc ngữ pháp
Từ vựng
Cấu trúc câu
Ngữ nghĩa của các lệnh
Các “thành ngữ”
Học ngôn ngữ lập trình VS. Học ngôn ngữ tự nhiên
Quy tắc ngữ pháp đơn giản
Từ vựng ít, tự quy định
Cấu trúc câu đơn giản
Hạn chế và khó khăn của sử dụng ngôn ngữ lập trình.
Chương trình dịch
Dùng để dịch từ một ngôn ngữ lập trình này sang ngôn ngữ lập trình khác
Mục tiêu cuối cùng là dịch sang mã máy để có được executed code –> chương trình thực thi
Phân loại:
Intepreter – thông dịch
Compiler – biên dịch
Intepreter vs. Compiler
Công cụ phát triển – Integrated Development Environment (IDE)
Soạn thảo
Dịch và sửa lỗi chương trình
Chạy thử và sửa lỗi
Một số khái niệm khác
Lỗi và sửa lỗi
Syntax error – lỗi ngữ pháp
Semantic error- lỗi ngữ nghĩa
Runtime error - Lỗi thực thi
Debug – Tìm và sửa lỗi
Dữ liệu, kiểu dữ liệu
Các kiểu dữ liệu cơ bản
integer, long, character, byte, ….
Real (double, float)
Kiểu khác: string
Kiểu dữ liệu có cấu trúc: array, string, record,..
Biến (Variable) & Hằng (Constant)
Giải thuật: khái niệm, công cụ biểu diễn
Flow chart – lưu đồ
Flow chart
Start
Start /Begin bắt đầu giải thuật. Chỉ có 1 và chỉ 1 điểm START.
Input / Output dữ liệu xuất/nhập
Dòng xử lý
Đặc tả thao tác xử lý hay tính toán dữ liệu
Điều khiển rẽ nhánh
Điều kiện
Yes
No
Phát biểu rẽ nhánh khác
Giá trị xét phân nhánh
Trường hợp 1
Trường hợp i
Khác
Stop
Stop/End kết thúc của giải thuật. Có thể có một hoặc nhiều điểm STOP.
Flow chart
Ưu điểm
Trình bày trực quan giải thuật
Độc lập với ngôn ngữ tự nhiên
Độc lập với ngôn ngữ lập trình
Bảo đảm khả năng lập trình
Cho phép dễ dàng kiểm tra giải thuật
Nguyên tắc kiểm tra
Đi từ START theo bất cứ đường nào cũng phải đến một điểm dừng STOP
Không có sự quay vòng vĩnh viễn
Không có sự kết thúc lưng chừng
Flow chart
Start
Nhập a, b
a=0 ?
Yes
No
b=0 ?
Yes
No
X=-b/a
Không có nghiệm
Vô số nghiệm
Stop
Algorithms
Giải phương trình ax + b = 0
Cấu trúc điều khiển cơ bản
If
If
else Statement 2;
Case
value 1 : Statement 1;
………..
value n : Statement n;
else : Statement 0
end;
While
Repeat Statement until
For counter=start value to end value do Statement;
For counter=start value downto end value do Statement
Chu kỳ sống của phần mềm
Thu thập yêu cầu
Phân tích thiết kế
Phát triển chương trình - codeing
Xác định giải thuật
Viết code và dịch thử , hiệu chỉnh các lỗi syntax
Thử nghiệm - Testing
Chạy thử với các dữ liệu mẫu để kiểm tra lỗi semantic và runtime
Vận hành và bảo trì
Phát triển theo yêu cầu
Một số ngôn ngữ lập trình
Lập trình goto
Assembly
Basic
Lập trình cấu trúc
Pascal, C
Foxpro
Lập trình hướng đối tượng
Java, C++, Object Pascal,…
Khác
Prolog, LISP, Visual basic (VB), VC++, J++, Delphi, ASP, PHP,..
Visual studio .NET: VB.NET, ASP.NET, C++.NET, C#
Bài tập chương 1
Viết chương trình nhập các trị a,b,c,x rồi in ra trị của tam thức ax2+bx+c
Viết chương trình nhập vào một số thực, in ra trị tuyệt đối của nó
Viết chương trình đọc vào 5 số thực rồi in ra số lớn nhất, bé nhất, tổng của 5 số này
Viết chương trình làm nhiều lần công việc sau: đọc một số thực vào, in ra căn bậc 2 của nó. Chương trình sẽ kết thúc khi số đọc vào là 0
Chương 2
Dữ liệu & cấu trúc chương trình
Các khái niệm cơ bản về dữ liệu và biểu diễn dữ liệu trong máy tính
Khai báo dữ liệu trong chương trình
Một số phép toán cơ bản
Cấu trúc cơ bản một chương trình PASCAL
Danh hiệu
Khái niệm “Danh hiệu”
Là tên của các đối tượng khác nhau trong lập trình, dùng để phân biệt giữa đối tượng này với đối tượng khác.
Các đối tượng thường được đặt tên bằng danh hiệu: biến, hằng, chương trình con, ……
Qui tắc ngữ pháp của danh hiệu:
Bắt đầu bằng chữ cái (A-Z, a-z) hay dấu gạch dưới ( _ )
Theo sau là chữ cái, dấu gạch dưới hay chữ số.
Với Pascal không phân biệt CHỮ HOA hay chữ thường
Một số ngôn ngữ có phân biệt như Java,…
Ví dụ: X , BienDem, Bien_dem, X1 , X2 , X3 , x1,x2,x3
Ví dụ sai: 101X3, (X1), Bien Dem
Danh hiệu (tt)
Danh hiệu gồm 2 loại:
Danh hiệu thuộc ngôn ngữ (Pre-defined)
Do ngôn ngữ quy định trước ý nghĩa của nó.
Được dùng cho các đối tượng có sẵn trong ngôn ngữ
Ví dụ: Integer, Readln,sqrt, real,…
Danh hiệu do người sử dụng đặt ra (user defined)
Do người sử dụng tự qui ước và qui định ý nghĩa của nó trong chương trình nguồn (source code)
Ví dụ: abc, xyz1, xyz2, delta, namsinh, tinh_giai_thua
Từ dành riêng: Là những từ do ngôn ngữ quy định sẵn như là một bộ phận cấu thành ngôn ngữ đó.
Ví dụ: begin, if, then, program, array, procedure (trang 22)
Ký hiệu đặc biệt: là những ký tự có ý nghĩa được quy định trước trong ngôn ngữ.
Ví dụ: + - * / > >= := <> ; , ( ) @ [ ] (trang 23)
Qui ước đặt tên danh hiệu
Qui tắc đặt tên danh hiệu
Tuân thủ quy tắc ngữ pháp của danh hiệu
Không được trùng lắp với danh hiệu thuộc ngôn ngữ hoặc đã được định nghĩa.
Nên sử dụng các tên gợi nhớ
Tên gợi nhớ?
Tên mà khi đọc đến sẽ giúp ta biết được ý nghĩa của đối tượng mang tên đó.
Lợi ích của tên gợi nhớ: giúp chương trình dễ đọc, dễ hiểu & dể kiểm tra.
If ABC < 0 then write(‘Phuong trinh vo nghiem’) ABC không gợi nhớ
If Delta < 0 then write(‘Phuong trinh vo nghiem’) Delta là tên gợi nhớ
Kiểu dữ liệu (data type)
Kiểu dữ liệu là gì?
Một kiểu dữ liệu là một qui định về hình dạng, cấu trúc, miền giá trị, cách biểu diễn và cách xử lý một loại dữ liệu thực tế nào đó trong máy tính.
Kiểm INTEGER biểu diễn số nguyên từ -32767 đến 32768 và thực hiện được các phép toán cộng, trừ, nhân, chia, div, mod
Kiểm CHAR biểu diễn các ký tự và biểu diễn giữa cắp dấu nháy đơn. ‘A’
Có thể thực hiện phép so sánh, không thể cộng, trừ, nhân, chia
Mọi dữ liệu muốn được xử lý bằng máy tính thì phải quy về một kiểu dự liệu nào đó mà ngôn ngữ lập trình đó hiểu được.
Số kiểu dữ liệu là một yếu tố so sánh ngôn ngữ lập trình. Càng nhiều kiểu thì càng thuận lợi cho xử lý.
Bao nhiêu kiểu dữ liệu thì đủ?
Các kiểu dữ liệu
Các kiểu dữ liệu đơn giản
Kiểu liên tục: Real (một số tên ở ngôn ngữ khác float, double)
Kiểu rời rạc: Integer, char, boolean, byte, word, liệt kê, miền con.
Các kiểu dữ liệu có cấu trúc/Kiểu do người dùng định nghĩa
Array (dãy, mãng)
Record (bản ghi, mẫu tin, mục tin)
Set (tập hợp)
File (tập tin, tệp)
String (chuỗi, xâu)
Kiểu pointer (con trỏ, chỉ điểm)
Các kiểu dữ liệu căn bản: kiểu đơn giản + string
Kiểu dữ liệu căn bản
Kiểu Integer: biểu diễn các số nguyên dạng thập phân. Chiếm 2 byte trong bộ nhớ, miền giá trị -32767 đến 32768
Kiểu Real: biểu diễn các số thực dạng thập phân hay dạng lũy thừa 10 bằng ký tự E. (3.2E8) Chiếm 6 byte trong bộ nhớ.Miền giá trị nhỏ nhất đến (1.9E-39) và lớn nhất đến (1.7E38)
Kiểu Char: biểu diễn cho dữ liệu ký tự. Chiếm 1 byte trong bộ nhớ . Miền giá trị theo bảng mã ASCCI. Biểu diễn bằng ký tự nằm giữa hai dấu nháy đơn `A’, `a’,..
Bảng mã ASSCI chuẩn và mở rộng.
Bảng mã và fonts
Các vấn đề bản mã tiếng Việt 1 byte, 2 byte, Unicode
Một số phép toán: so sánh, Ord (`F’) = 70 , Chr(65) = `A’
Kiểu Boolean: biểu diễn cho giá trị luận lý FALSE và TRUE. Qui ước FALSE < TRUE. Chiếm 1 byte trong bộ nhớ.
Kiểu dữ liệu căn bản
Kiểu Byte: biểu diễn các số nguyên dạng thập phân. Chiếm 1 byte trong bộ nhớ, miền giá trị -127 đến 128
Kiểu Word: biểu diễn các số nguyên dương dạng thập phân. Chiếm 2 byte trong bộ nhớ.Miền giá trị từ 0 đến 65535.
Kiểu String: biểu diễn cho chuỗi ký tự. Chiếm n+1 byte trong bộ nhớ với n là số ký tự có trong string. Các ký tự có chỉ số từ 1. Vị trí chỉ số 0 chứa một ký tự có giá trị có mã ASCCI là số ký tự n của string. Ví dụ chuỗi ‘Truong Dai Hoc …. Rat noi tieng’ được lưu trong bộ nhớ là
9Truong Dai Hoc …… rat noi tieng
Chuỗi trên có 57 ký tự và chiếm 58 byte với byte 0 chứa ký tự `9’
String rỗng ` ` chứa không ký tự. String có thể so sánh theo từng ký tự từ trái sang phải đến khi có sự khác biệt. Ví dụ ‘ABCDEFG’ < ‘ABcD’
Phép ghép string + : ‘Truong Dai Hoc’ + ‘Bach Khoa’ => ‘Truong Dai HocBach Khoa’
Kiểu Boolean: biểu diễn cho giá trị luận lý FALSE và TRUE. Qui ước FALSE < TRUE. Chiếm 1 byte trong bộ nhớ.
Cấu trúc chương trình Pascal
Phần Khai báo
Chứa các khai báo tài nguyên sẽ sử dụng
Các khai báo nào không cần thiết có thể bỏ đi.
Program
Label
Const
Type
Var
Khai báo chương trình con
Begin
các phát biểu, câu lệnh;
End.
Phần Thân Chương trình
Nội dung các câu lệnh mô tả công việc sẽ được thực hiện.
Các Khai báo trong PASCAL
Program tenchuongtrinh;
Program Chuongtrinhhinhtron;
Const tênhằng=giátrịhằng;
Const pi=3.14159; tentruong=‘Dai Hoc Bach Khoa’
Hằng và ý nghĩa sử dụng hằng trong chương trình.
Type tênkiểudữliệu= mô tả xây dựng kiểu
Type diemso=1..10; chucai=‘a’..’A’
Biến và khai báo biến
Biến: là ô nhớ lưu trữ dữ liệu và thay đỗi được. Có kiểu dữ liệu tương ứng.
var tên biến: kiểu dữ liệu;
Biểu thức
Các phép toán quan hệ:
= , <>, < , > , <=, >= cho kết quả kiểu boolean
a > B true hay false?
Các phép toán logic NOT, AND, OR
Các phép toán số học:
+, - , * , /
Div và Mod dùng cho số nguyên kiểu trả về là số nguyên.
Phép gọi hàm: gọi một chương trình con loại hàm số tương đương với một phép toán
Biểu thức: là một công thức tính toán tạo từ các biến, hằng, các giá trị cụ thể, các phép toán và dấu (, ) . Kiểu dữ liệu trả về cũng là kiểu dữ liệu của biểu thức.
A+2*b(c-d) Biến là một biểu thức
Phát biểu gán và thủ tục xuất nhập
Phát biểu gán :=
Gán một giá trị của một biểu thức cho một biến
TenBien := Bieuthuc;
Các thao tác xuất nhập:
Read(B1,B2,…..)
Write(BT1,BT2,….)
Readln(B1,B2,…..)
Writeln(BT1,BT2,….)
Readln(a,b) 12 15
Bài tập chương 2
Viết biểu thức Pascal cho:
b)
Viết chương trình đọc 2 số x,y; Kiểm tra xem y có là ước số của x hay không? Hay x là ước số của y không?
Viết chương trình làm việc như một máy tính bỏ túi đơn giản với các phép tính +,-,*,/. Kết thúc khi nhập ký tự ‘!’
Viết chương trình nhập vào một số tự nhiên và in ra ước số của nó
Chương 3
Các phát biểu điều khiển
Các phát biểu điều khiển
Phát biểu điều khiển và flowchart
So sánh và đánh giá
Tổng quan
Phát biểu điều khiển: là những dòng lệnh dùng để điều khiển hoạt động của chương trình.
Các phát biểu điều khiển cơ bản
Phát biểu gán (assignment statement)
Các phát biểu điều khiển (control statements)
Phát biểu ghép BEGIN END;
Phát biểu điều kiện IF
Phát biểu điều kiện CASE
Phát biểu lặp WHILE
Phát biểu lặp REPEAT
Phát biểu lặp FOR
Phát biểu GOTO
Phát biểu gọi thủ tục (procedure call): gọi các chương trình con loại procedure
Phát biểu WITH : dùng với kiểu dữ liệu record.
Phát biểu ghép BEGIN END;
Dùng để ghép nhiều phát biểu thành một phát biểu.
Cú pháp : BEGIN các phát biểu; END;
Ví dụ
Begin
t:=x;
x:=y;
y:=t;
writeln(‘đã đổi xong’);
End;
S1
S2
Sn
N phát biểu
1 phát biểu
BEGIN
END;
Phát biểu IF
Dùng để thực hiện hay không một phát biểu theo một điều kiện.
Cú pháp
if
Ví dụ
If Delta > 0 then
begin
X1:= (-b + sqrt(Delta))/2/a
X2:= (-b - sqrt(Delta))/2/a
end;
Condition
Statements
Yes
Chỉ có 1 phát biểu trong thân của IF
No
Phát biểu IF Then Else
Dùng để chọn lựa phát biểu nào sẽ được thực hiện giữa 2 phát biểu.
Cú pháp
if
Ví dụ
If Delta > 0 then
begin
X1:= (-b + sqrt(Delta))/2/a
X2:= (-b - sqrt(Delta))/2/a
end
else Writeln(‘Còn xét tiếp’);
Condition
Statement1
Yes
No
Statement2
Trường hợp đặc biệt
Xét phát biểu sau:
If ĐK1 then if ĐK2 then S1 else S2;
ELSE sẽ thuộc về IF nào gần 1 chưa có ELSE
else
else
?
ĐK2
S1
Yes
No
S2
ĐK2
Yes
No
Phát biểu CASE
Dùng để chọn một trong số những phát biểu để thực hiện tùy theo giá trị của biểu thức chọn.
Các nhãn case: chỉ ra các trường hợp phân nhánh.
Các nhãn case là một hay nhiều giá trị rời rạc theo sau là dấu : và một phát biểu tương ứng.
Case BiểuThứcChọn of
nhãn1: S1;
nhãn2: S2;
nhãnN: Sn;
else S0;
End;
BiểuThứcChọn
S1
S2
S0
SN
Nhãn1
Nhãn2
NhãnN
Else
Phát biểu While
Dùng để lặp đi lặp lại nhiều lần một công việc nào đó.
Cú pháp
While <ĐK> Do statement;
While kiểm tra điều kiện trước rồi mới thực hiện phát biểu.
Số lầp lặp là không biết trước.
Số lần lặp tối thiểu là 0 và tối đa là không xác định.
Chú ý: Trong thân của while phải có ít nhất một phát biểu có khả năng thay đổi giá trị của điều kiện. Nếu không sẽ lặp vô tận (infinite loop)
Ví dụ:
gt:=1; i:=1
While i
i:=i+1;
gt:=gt*I;
end;
ĐK
S1
Yes
No
Phát biểu Repeat
Dùng để lặp đi lặp lại nhiều lần một công việc nào đó.
Cú pháp
Repeat statements until <ĐK>;
Repeat thực hiện xong các phát biểu rồi mới kiểm tra điều kiện.
Số lầp lặp là không biết trước.
Số lần lặp tối thiểu là 1 và tối đa là không xác định.
Chú ý: Trong thân của repeat phải có ít nhất một phát biểu có khả năng thay đổi giá trị của điều kiện. Nếu không sẽ lặp vô tận (infinite loop)
Ví dụ:
gt:=1; i:=1
repeat
i:=i+1;
gt:=gt*I;
until i>n;
ĐK
S1
Yes
No
While vs. Repeat
While và Repeat là hai phát biểu có thể chuyển đổi cho nhau.
White <ĐK> do statement;
=> If <ĐK> then repeat statement until NOT(<ĐK>);
Repeat statements until <ĐK>;
=> Begin
statements;
while NOT(<ĐK>) do begin
statements;
end;
End;
Chú ý khả năng bị lặp vô tận.
Một phát biểu
Phát biểu FOR
Dùng để lặp lại một công việc nào đó với số lần lặp là xác định được.
Sử dụng biến đếm và biểu thức cận để xác định số lần lặp lại.
For biendem:=BT1 to BT2 do statement;
Số lần lặp là BT2-BT1+1;
Sau mỗi lần lặp biendem tăng đến giá trị kế tiếp;
For biendem:=BT1 downto BT2 do statement;
Số lần lặp là BT1-BT2+1;
Sau mỗi lần lặp biendem giảm đến giá trị kế tiếp;
Một số chú ý với phát biểu FOR
Biến đếm và các biểu thức cận phải thuộc cùng một kiểu rời rạc.
Trong thân của FOR, dù cho các thành phần của biểu thức cận thay đổi vẫn không ảnh hưởng đến số lần lặp. Ví dụ đoạn code sau:
a:=5;
For i:=1 to a do a:=a+1;
vẫn chỉ lặp đúng 5 lần dù a bị thay đổi.
Giá trị của biến đếm sau vòng lặp FOR là KHÔNG XÁC ĐỊNH. Phụ thuộc vào từng compiler. Do đó không được sử dụng tiếp giá trị này cho các tính toàn tiếp theo mà phải gán lại giá trị cụ thể mới.
Không được thay đổi giá trị biến đếm trong thân vòng lặp FOR.
Bài tập chương 3
Viết chương trình làm nhiều lần công việc sau: Đọc vào số tự nhiên N và in ra N!
Viết chương trình máy tính bỏ túi dùng phát biểu case
Viết chương trình nhập vào một số nguyên dương và in ra ước số lẻ lớn nhất của nó
Viết chương trình nhập vào một số tự nhiên và kiểm tra xem nó có là số nguyên tố hay không
Viết chương trình nhập vào một số nguyên dương N và tính S = 12 + 22+ 32 +…+ N2
Chương 4
Các kiểu dữ liệu do người dùng định nghĩa
Các kiểu dữ liệu rời rạc
Các kiểu dữ liệu có cấu trúc
Một số giải thuật trên aray.
Khái niệm cơ bản về cấu trúc dữ liệu
Bài tập
Các bài tập trong sách giáo trình
Bài tập nhân 2 ma trận.
Bài tập xác định ma trận đối xứng
Bài tập quản lý điểm sinh viên dùng array và record
Các bài tập khác bằng chương trình Pascal
Kiểu do người dùng định nghĩa
Kiểu do người dùng định nghĩa:
Được xây dựng từ những kiểu cơ bản.
Do ngôn ngữ lập trình quy định sẳn cấu trúc và phương thức truy cập
Người dùng sẽ định nghĩa bằng cách xác định cụ thể các giá trị của các thông số.
Bao gồm
Các kiểu rời rạc: liệt kê, miền con.
Các kiểu có cấu trúc: Array, Record, String
Kiểu miền con
Định nghĩa: Kiểu miền con của một kiểu rời rạc là một miền trị của kiểu rời rạc đó (kiểu chủ) được xác định bằng 2 cận là 2 giá trị của kiểu chủ.
Một giá trị thuộc kiểu miền con nằm trong phạm vi giữa 2 cận.
Mục tiêu sử dụng:
Đối với một số compiler cho phép sinh mã tự động kiểm tra tính hợp lý của dự liệu thay vì phải tự kiểm tra bằng dòng lệnh. ( chỉ thị là {$R+} vối Turbo Pascal).
Tiết kiệm bộ nhớ trong một số trường hợp.
Dùng trong khia báo các kiểu dữ liệu có cấu trúc khác như Array.
Áp dụng được các phép toán của kiểu chủ cho kiểu miền con. Cần chú ý đến vùng giá trị kết quả để tránh runtime error
Cú pháp : Tenkieu = canduoi . . Cantrên;
diem = 1 . . 10;
chu = ‘a’ .. ‘z’
Kiểu liệt kê
Kiểu liệt kê được định nghĩa bằng các liệt kê ra các giá trị của kiểu. Các giá trị đó là danh hiệu.
Ví dụ: ngay = (sun, mon, tue, wed, thu, fri, sat)
Var homqua, homnay, ngaymai : ngay
Các phép toán:
Có thể gán các biễu thức liệt kê cùng kiễu cho biến tương ứng. Ví dụ: homqua := mon;
Thực hiện phép so sánh dự trên thứ tự index chính là thứ tự liệt kê bằt đầu từ 0 và tằng dần. Ví dụ tue < wed
Hàm ORD (), hàm SUCC() , hàm PRED()
Không được dùng thao tác xuất nhập với kiểm liệt kê.
Kiểu dữ liệu ARRAY
Định nghĩa: Array là một dãy gồm nhiều phần tử cùng một kiểu. Hay nói cách khác một dữ liệu kiểu array là một dãy của nhiều dữ liệu thuộc cùng một kiểu.
Các phần tử của một dãy phải có cùng kiểu gọi là kiểu cơ sở. Kiểu cơ sở có thể là một kiểu bất kỳ của Pascal.
Các phần tử có mối quan hệ về vị trí trong dãy được xác định bằng chỉ số (index). Chính là thứ tự về vị trí của nó trong dãy
Khai báo dãy: tenkieuday = array[kieuchiso] of kieucoso
Số phần tử của dãy chính là số giá trị có thể có của kiểu chỉ số.
Index có giá trị từ giá trị nhỏ nhất đến giá trị lớn nhất của kiểu chỉ số
Vi dụ : daynguyen = array [1..100] of integer;
dayreal = array [char] of real;
Dãy nguyên có 100 phần tử kiểu integer;index từ 1 đến 100.
Dãy dayreal có 256 phần tử kiểu real; index từ ký tự có chr(0) đến chr(255).
Các phép toán trên ARRAY
Có thể thực hiện phép gán giá trị của các biến của cùng một kiểu array cho nhau. Ví dụ
var a ,b : daynguyen; ta có thể gán a:= b;
Phát biểu này gán giá trị của từng phần tử trong dãy b sang phần tử tương ứng của dãy a.
Có thể truy xuất đến từng phần tử của dãy trực tiếp bằng cách dùng tenbien[index]. Ví dụ: a[5] := b[8]
Có thể sử dụng từng phần tử của dãy như là một biến của kiểu dữ liệu cơ sở. Ví dụ
for i:= 1 to 100 do readln(a[i])
Một số đặc tính của kiểu array
Số phần tử của kiểu array là cố định ngay từ khi khai báo. Dù là ta dùng bao nhiêu phần tử thì cũng chiếm đúng số bộ nhớ mà dãy đã khai báo.
Do đó thông thường phải khai báo dư hơn số thường dùng để tránh bị thiếu => lãng phí bộ nhớ.
Các phần tử của dãy được xếp liên tục trong bộ nhớ do đó:
Cho phép khả năng truy xuất ngẫu nhiên => nhanh
Cần có vùng nhớ trống liên tục đủ lớn khi cấp phát bộ nhớ cho dãy. => khó cấp phát.
Một số giải thuật trên array
Khi tổ chức lưu trữ trên array của nhiều phần tử, thao tác thường phải thực hiện là tìm kiếm (search) và sắp xếp (sort) các phần tử trong dãy
Việc tìm kiếm (search) dùng để truy vấn thông tin.
Việc sắp xếp (sort) dùng để trình bày thông tin và giúp cho thao tác search hiệu quả hơn.
Một số giải thuật:
Linear search có và chưa sort, Binary search
Buble sort, quick sort
Linear search
Xem xét từng phần tử xem có phải giá trị cần tìm hay không cho đến khi tìm thấy hoặc hết số phần tử của array thì kết luận có không có.
Timthay := 0;
For i:= 1 to n do if a[i]=giatricantim then timthay:= i;
if timthay= 0 then writeln(‘Không có’)
else writeln(‘Có tại ‘, timthay);
i:=1
while (i<=n)and(a[i]<>giatricantim) do i:= i + 1;
Số phần tử tổng quát cần duyệt tối đa là N. Có thể áp dụng cho dãy bất kỳ, tuy nhiên nếu dãy có thứ tự thì có thể duyệt nhanh hơn “một ít”.
Binary search
Áp dụng cho dãy đã có thứ tự. Nguyên tắc chính là dựa vào tính thứ tự của dãy để thực hiện số phép so sánh tối thiểu bằng cách lấy phần tử giữa so sánh với giá trị cần tìm:
nếu bằng có nghĩa là tìm thấy tại vị trí đó.
nếu không bằng thì phân nữa số phần tử sẽ được loại bỏ không cần xét vì chắc chắn không thể bằng.
Giải thuật này cho tốc độ tìm kiếm rất cao. Ví dụ dãy có 1 triệu phần tử chỉ tốn không đến 20 phép so sánh là đã xác định được trong khi với linear search là 1 triệu phép so sánh.
Binary search – giải thuật
Dãy A có n phần tử từ 1..n . Giá trị cần tìm là X.
i:=1; j:=n; co:=false;
While (i
m:=(i+j) div 2;
If a[m] = X then co:=true
else if a[m] > X then j:=m
else i:=m;
end;
If co then “writeln(‘Tim co phan tu’, X)
else writeln(‘Khong co phan tu’, X);
Bubble Sort
Dùng để sắp thứ tự một dãy.
Nguyên tắc :
Tìm phần tử lớn nhất đặt vào vị trí cuối cùng A[n] bằng cách so sánh lần lượt các cặp từ a[j], a[j+1] với j từ 1=> n-1. Nếu phần tử a[i] >a[j] thì hoán đỗi 2 phần tử này
Lặp lại bước trên với số phần tử của dãy còn lại giảm dần từ n -> 2 .
Khi hoàn tất dãy sẽ có thứ tự tăng dần.
Ưu điểm của giải thuật là đơn giản. Tuy nhiên tốc độ sắp thứ tự không cao.
Có một giải thuật khác khá mạnh là QuickSort
Bubble Sort – giải thuật
Giải thuật bubble Sort cho dãy có n phần tử và tăng dần.
For i:= 1 to n do
For j:= 1 to n-i do
if A[j]>A[j+1] then
Begin
t:= a[i];
a[j]:=a[j+1];
a[j+1]:=t;
End;
So sánh và hoán đổi giá trị 2 phần tử.
Biến t có dùng kiểu dữ liệu với kiểu cơ sở của array
Array nhiều chiều
Kiểu cơ sở của array có thể là một array khác, hình thành nên cấu trúc array of array. Trong Pascal hổ trợ sẵn kiển trúc này với kiểu dữ liệu array nhiều chiều (multi-dimension array).
Khai báo
tenkieu= array [index1, index2,.., indexN] of kieucoso;
Ví dụ: matran = array[1..10, 1..20] of real;
table = array [1..100, ‘a’..’z’] of integer;
Từng phần tử của array nhiều chiều có thể được truy cập trực tiếp bằng cách chỉ rõ index trên từng chiều.
Ví dụ : a[3,5] hay b[11,’h’]
Các phần tử này cũng có thể được sử dụng như là một biến kiểu cơ sở.
Kiểu RECORD
Record là một kiểu dữ liệu gồm nhiều thành phần, các thành phần có thể thuộc về những kiểu dữ liệu khác nhau.
Khai báo
tênkieu = Record
tênfield:kieudulieu_cua_field;
……..
tênfield:kieudulieu_cua_field;
end;
Kiểu Record (tt)
Các phép toán
Có thể gán giá trị các biến record thuộc cùng một kiểu cho nhau. Khi đó sẽ gán từng field tương ứng.
Có thể truy cập đến từng thành phần (field) của record bằng cách dùng cấu trúc biênrecord.tênfield.
Mỗi field có thể dùng như một biến thuộc kiểu dữ liệu tương ứng.
Record của record
Trong cấu trúc field của record có thể là một record khác.
Khi đó dield record tương ứng là một record đề có thể truy cập đến field bên trong dạng recordname.fieldrecord.field
Phát biểu WITH
WITH là một phát biểu dùng với kiểu dữ liệu record
Phát biểu WITH có dạng
WITH recordname do Statement;
trong đó record name là một biến record, Statement là một phát biểu.
Ý nghĩa phát biểu WITH. Trong phần thân của phát biểu WITH, khi muôn truy cập đến các field của record tương ứng ta chỉ cần dùng tên filed mà không cần dùng Tênrecord.tênfield như thông thường.
Kiểu tập hợp
Định nghĩa: Dữ liệu kiểu tập hợp là một tập hợp của nhiều dữ liệu thuộc cùng một kiều rời rạc.
Khai báo:
Tênkieu = set of kiểu cơ sở
Ví dụ: tapnguyen = setof integer;
Một dữ liệu kiểu tập hợp là một tập hợp được biểu diễn dạng [phantu, phantu,..]
Có thể gán tập hợp này cho tập hợp kia nếu chúng có cùng kiểu cơ sở.
Ví dụ: t1 := [1,3,5,8] hay t2:=t1
Các phép toán trên tập hợp
Với các biến kiểu tập hợp ta có các phép toán
Phép toán = : cho giá trị TRUE nếu hai tập hợp bằng nhau
Phép toán <>: cho giá trị TRUE nếu hai tập hợp khác nhau
Phép toán <= : A<=B là TRUE nếu A bao hàm trong B
Phép toán >= : A>=B là TRUE nếu A chứa B
Phép toán IN : X IN A cho giá trị TRUE nếu trong A chứ phần tử X
Phép hợp + : A+B là hợp của hai tập A, B
Phép giao *: A*B là giao của hai tập A, B
Phép hiệu - : A-B là hiệu của hai tập A,B
Chương 5
Chương trình con
Chương trình con
Phân loại và khai báo
Thông số: phân loại và ý nghĩa
Biến cục bộ và toàn cục
Tầm vực chương trình con – biến
Đệ quy
Chương trình con
Khái niệm: Chương trình con là một đoạn chương trình có tên và được gọi thực hiện ở nhiều nơi trong chương trình chính.
Tại sao phải dùng chương trình con:
Có công việc cần phải được thực hiện tại nhiều nơi trong chương trình => tách công việc đó thành chương trình con
Phân đoạn, module chương trình để thuận tiện trong quản lý, trình bày và phát triển.
Các lợi ích của việc sử dụng chương trình con
Các loại chương trình con: Procedure & Function
Phương thức thực hiện của chương trình con
Thông số: là những giá trị có thể thay đổi cho mỗi lần thực hiện chương trình con, thông thường là những dữ liệu cụ thể cần cho tháo tác sử lý của từng trường hợp gọi chương trình con
Danh sách thông số
Phương thức dịch và chuyển điều khiển khi gọi chương trình con
Một số điểm chú ý trong việc sử dụng chương trình con
Khai báo chương trình con trong chương trình chính của PASCAL.
Chương trình con Procedure
Procedure TenChuongTrinhCon(danhsachthongso);
Cont
Type
Var
Khai báo chương trình con
Begin
Phần thân chương trình con
End;
** Chương trình con có thể có chương trình con bên trong
Chương trình con Function
Function TenChuongTrinhCon(danhsachthongso):KieuDuLieuCuaTriTraVe;
Cont
Type
Var
Khai báo chương trình con
Begin
Phần thân chương trình con
TenChuongTrinhCon:=GiaTriTraVe;**
End;
** Trong thân chương trình con phải có lệnh gán giá trị trả về cho tên chương trình con.
Tên chương trình con function có thể dùng như một biến có kiểu dữ liệu chính là kiểu của chương trình con function
Thông số
Thông số hình thức: là những thông số được khai báo trong danh sách thông số. Khi chương trình con được gọi thực hiện thì các thông số này sẽ được truyền những giá trị cụ thể cho chương trình con thực hiện.
Thông số thực: những giá trị cụ thể (biến, hằng, giá trị) truyền cho các thông số hình thức khi chương trình con được gọi là các thông số thực.
Thông số hình thức có 2 loại:
Thông số hình thức trị
Thông số hình thức biến
Thông số thực hợp lệ cho các thông số hình thức phụ thuộc vào loại của thông số hình thức
Thông số hình thức trị
Định nghĩa: Những thông số hình thức không đi sau từ khoá var trong khai báo danh sách thông số là thôgn số hình thức trị
Ví dụ: procedure ABC (A: integer, var B: real, C:string);
Thông số hình thức trị là A và C
Khi truyền thông số, thông số thực sẽ truyền TRỊ của mình cho thông số hình thức trị.
Mọi sự thay đổi của thông số hình thức trị trong chương trình con KHÔNG ảnh hưởng gì đến trị của thông số thực truyền cho nó.
Thông số thực cho thông số hình thức trị là một biểu thức cùng kiểu.
Thông số hình thức biến
Định nghĩa: Những thông số hình thức đi sau từ khoá var trong khai báo danh sách thông số là thông số hình thức biến.
Ví dụ: procedure ABC (A: integer, var B: real, C:string);
Thông số hình thức trị là A và C
Khi truyền thông số, thông số thực sẽ truyền địa chỉ của mình cho thông số hình thức trị.
Mọi sự thay đổi của thông số hình thức trị trong chương trình con SẼ ảnh hưởng trực tiếp và tức thời lên chính ô nhớ của thông số thực, tức là ảnh hưởng ngay đến chính thông số thực tương ứng.
Thông số thực cho thông số hình thức trị phải là một biến cùng kiểu.
Thông số hình thức biến còn được dùng để trả về các giá trị cần thiết cho chương trình gọi sau khi chương trình con kết thúc.
Cấu trúc khối trong chương trinh Pascal
Định nghĩa Khối: Một khối (block) gồm 2 phần:
Phần khai báo với các khia báo: const, type, var, chương trình con.
Phần thân: bắt đầu bằng BEGIN, ở giữa là các phát biểu và kết thúc bằng END
Như vậy:
Một chương trình là một Block
Một chương trình con là một Block
Trong chương trình có chương trình con và trong chương trình con có chương trình con khác -> trong block có block
Một chương trình là một Block với các Block con lồng vào nhau.
ChuongTrinhChinh
A
B
A1
A2
B1
B2
B2
B21
C
Vấn đề tầm vực
Định nghĩa : Tầm vực (Scope) của một đối tượng trong chương trình là vùng má nó được biết đến và có thể được sử dụng.
Tầm vực áp dụng trên các đối tương như: biến, hằng, kiểu dữ liệu, chương trình con.
Qui tắc xác định tầm vực: Tầm vực của một đối tượng được xác định từ vị trí mà nó được khai báo cho đến hết Block chứa khai báo đó, kể cả những Block bên trong của nó. Ngoại trừ trường hợp có sự khai báo lại trong một khối con.
Khai báo lại: Nếu khối A chứa khối B và trong cả 2 khối đều khai báo một đối tượng tênX thì Khối B chỉ có thể truy xuất đối tượng X của chính nó và không thể truy xuất đối tượng X của khối A.
X
X
Tầm vực của chương trình con
Một chương trình có nhiều chương trình con, chương trình con lại có thể có nhiều chương trình con khác. Như vậy đối với một chương trình con, những nơi nào có thể gọi nó thực hiện. Những nơi đó thuộc tầm vực của chương trình con.
B2 có thể được gọi từ: B1, B2, B3
B2 không gọi được từ : A0, C1
Tầm vực của chương trình con là toàn bộ CHA của nó
B1 có thể gọi được từ: A0, B1, C1, B2, B3
C1 có thể gọi từ A0, còn trong B1, B2, B3 thì có gọi C1 được không?
A0
B1
C1
B2
B3
Một cách khác để xác định tầm vực của chương trình con
Tại một điểm X nào đó trong chương trình, điểm đó sẽ thuộc về tầm vực của chương trình con Y nếu nó NHÌN THẤY chương trình con Y.
Nguyên tắc NHÌN như sau:
Nhìn từ trong khối ra ngoài thì thấy xuyên qua đường bao khối.
Nhìn từ ngoài vào thì không xuyên được đường bao khối.
A0
B1
C1
B2
B3
Tầm vực của Biến
Một biến X trong B1 được biết đến trong toàn bộ B1.Nghĩa là trong B2, B3 có thể sử dụng biến này. Như vậy biến X là không cục bộ với B2 và B3.
Biến X không được biết đến trong C1 và A0 như vậy đối với C1 và A0 thì X là biến cục bộ của B1.
Biến Y khia báo trong A0 (chương trình chính) là biến toàn cục.
Tầm vực của Biến là toàn bộ Block mà nó được khai báo. Trừ trường hợp khai báo lại.
Biến X trong B1 có tầm vực là B1, B2 và B3. Tuy nhiên nếu trong B2 ta lại khai báo một biến X khác (Khai báo lại) thì biến X của B1 không được hiểu trong B2. Nói cách khác tầm vực của nó đã bị loại B2 ra. (khi đó thuộc về biến X khai báo trong B2)
A0
B1
C1
B2
B3
Sự đệ quy (recursion)
Khái niệm đệ quy: Một khái niệm X được gọi là định nghĩa đệ quy nếu trong định nghĩa của X có sử dụng ngay chính khái niệm X.
Ví dụ:
N! = 1*2*3…..* n là định nghĩa không đệ quy
N! = N * (N-1)! Là định nghĩa đệ quy
Người giàu là người có nhiều tiền hoặc có cha mẹ là người giàu
Con người là con của con người
Chương trình con đệ quy
Chương trình con là một định nghĩa về công việc nào đó, nếu trong quá trình định nghĩa đó ta có dùng chính chương trình con đó thì ta nói chương trình con đó được viết đệ quy.
Nói cách khác: một chương trình con mà trong phần thân của nó có lệnh gọi chính nó là chương trình con đệ quy.
Có chương trình chính đệ quy không? Tại sao?
Không phải tất cả các ngôn ngữ lập trình đều cho phép gọi đệ quy.
Ưu khuyết điểm của đệ qui
Đệ quy là cách thức đơn giản để mô tả những quá trình lặp đi lặp lại.
Các chương trình viết đệ quy thường chạy tốn nhiều bộ nhớ và tốc độ chậm so với viết bằng các vòng lặp. Do đó người ta thường tìm cách gỡ đệ quy.
Chương trình viết đệ quy thường ngắn gọn, dễ kiểm tra, dễ viết. Lới giải bằng đệ quy dễ tiếp cận hơn.
Một số bài toán chỉ có thể giải bằng đệ quy mà thôi, do đó nếu ngôn ngữ không hổ trợ gọi đệ quy thì không thể giải những bài toán này.
Đệ qui hổ tương và tham khảo trước
Đệ quy hổ tương: Chương trình con A gọi chương trình con B, trong chương trình con B lại có lệnh gọi chương trình con A.
Vậy khia báo A và B như thế nào?
Khai báo A trước thì trong A không thể gọi B vì B chưa được khia báo
Khai báo B trước thì ngược lại.
Phải khai báo chương trình con trước khi viết nó => Khai báo trước.
Procedure TênCTC(Thôngsố);forward;
Khi viết Procedure TênCTC;
A
……
Gọi B
…..
B
……
Gọi A
………
Một số hàm và thủ tục có sẳn
Các hàm và thủ tục có sẵn
Unit trong pascal: là một bộ các hàm và thủ tục được viết sẳn của pascal
Một số Unit: System, graph, graph3, dos, printer, crt, … các unit có tên file với phần ext là .tpl, .tpu
Ngoại trừ System unit là tự động nạp còn các unit khác nếu muốn dùng thì trong phần khia báo ngay sau khai báo program ta dùng khai báo USES
uses graph;
* Một số tài liệu cũ có thể bị lỗi font khi hiển thị do dùng bộ mã không phải Unikey ...
Người chia sẻ: Nguyễn Việt Vương
Dung lượng: |
Lượt tài: 5
Loại file:
Nguồn : Chưa rõ
(Tài liệu chưa được thẩm định)