• Giải thích được các bước để giải một bài toán bằng máy tính... 1.5.Chương trình- Program • Chương trình: Tập các lệnh máy mà CPU phải thực thi nhằm giải một bài toán.. • Cách giải 1
Trang 1Chương 1 GiỚI THIỆU VỀ THUẬT TOÁN
Mục tiêu
• Hiểu được Thuật toán là gì ?
• Mô tả những thuật toán cơ bản
• Giải thích được các bước để giải một bài toán bằng máy tính
Nội dung
• Giới thiệu tổng quan
• Khái niệm về thuật toán
• Các phương pháp biểu diễn thuật toán
1.1- Giới thiệu tổng quan
• Thông tin (information)
– Cho biết giá trị của 2 số nguyên – Thông báo kết quả tính tổng
• Dữ liệu (data)
– Chứa số nguyên thứ 1 – Chứa số nguyên thứ 2 – Chứa số nguyên tổng kết quả
Ví dụ : Thực hiện phép tính cộng 2 số nguyên
1.2.Lưu trữ dữ liệu
• Một dữ liệu phải có vùng nhớ chứa nó
• Nhiều dữ liệu cần vùng nhớ lớn
• Hai loại lưu trữ dữ liệu thường dùng:
số
số nguyên nhỏ số nguyên lớn số thực
ký tự
chuỗi ký tự
1.3.Dạng biểu diễn dữ liệu và toán
tử
Dạng biểu diễn số nhị phân
+
00000011 00000010 00000101
00000011
00000010
00000101
Đúng
Cộng hai biểu diễn số nhị phân cho kết qủa là một biểu diễn nhị phân đúng kết qủa đang mong đợi
Trang 21.4.Lệnh máy- Machine Instruction
• Một dữ liệu quy định cách CPU thực thi 1 tác vụ
cơ bản
• Dạng 1 lệnh máy:
110111 1000100101101 1010011001011
Tác vụ Toán hạng 1 Toán hạng 2
(cộng) (address 1) ( address 2)
• Có thể có toán hạng 3 (dữ liệu chứa kết qủa)
• Dạng lệnh máy phụ thuộc kiến trúc CPU
• Lệnh máy là lệnh nhị phân
1.5.Chương trình- Program
• Chương trình: Tập các lệnh máy
mà CPU phải thực thi nhằm giải một bài toán
• Một chương trình là 1 tập tin có phần mở rộng tùy thuộc vào hệ điều hành
• Thông thường 1 chương trình
có tên mở rộng: exe, com
• CPU chạy 1 chương trình theo cách tuần tự từng lệnh
1001001000101
1100110011000
0101001100110
1010110100001
1.6.Thuật toán - Algorithm
• Cách diễn giải một bài toán
• Cách tiếp cận để giải bài toán
• Muốn giải thì phải biết cách giải
• Cách giải 1 bài toán cụ thể là 1 thuật toán
cụ thể
• Mô tả 1 thuật toán là diễn đạt các bước
thực thi của thuật toán đó
• Dùng ngôn ngữ tự nhiên
• Dùng lưu đồ (flowchart)
• Mã giả
1.7.Biểu diễn thuật toán
Ví dụ : Thực hiện phép tính cộng 2 số nguyên
Thuật toán - Mô tả bằng ngôn ngữ
tự nhiên
3 5
năm
Yếu điểm của cách diễn đạt
bằng NNTN
• NNTN có nhiều cách diễn đạt khác nhau cho 1 thuật toán
• Dùng NNTN để diễn đạt thuật toán có khả
năng gây “hiểu sai ”
Trang 3• Dùng hình vẽ (graphic) để mô tả một thuật toán
• Trong lưu đồ chỉ rõ tiến trình thực thi thuật toán
• Không thể hiểu lầm vì có quy tắc để vẽ
Thuật toán - Mô tả bằng lưu đồ
(Flowchart)
• Điểm bắt đầu và kết thúc
• Hướng tính toán
• Nhập/xuất
• Tính toán
• Lựa chọn ½
• Lựa chọn 1/n
• Điểm ráp nối khi lưu đồ lớn
Begin End
Nhập a c=a+b
2
9
7
5 d
X X yes
no a>0
Xuất c B1: Nhập số nguyên a
B2: Nhập số nguyên b B3: c = a+b;
B4: Xuất số nguyên c
Begin Nhập a Nhập b c=a+b
End Xuất c
Thuật toán - Mô tả bằng mã giả
(Pseudo code)
• Mã giả thực chất là ngôn ngữ tự nhiên có pha lẫn một số cách viết của ngôn ngữ lập trình
Minh họa: Thực hiện phép tính cộng 2 số nguyên
1.8.Minh họa: Giải thuật tìm trị lớn nhất
trong 3 số
B1: t = a;
B2: if (t<b) t=b;
B3: if (t<c) t=c;
B4: Xuất t;
5
7
2
7
a
b
c
Bảy
Nếu muốn nhập 3 số a, b, c thì thêm những gì vào giải thuật và thêm vào đâu?
no
Begin
End
t=a t<b
t<c
yes
no yes
t=b
t=c
Xuất t
5
Chương 2 NGÔN NGỮ LẬP TRÌNH
2.1.KHÁI NIỆM VỀ NGÔN NGỮ LẬP
TRÌNH
1001001000101
1100110011000
0101001100110
1010110100001
Bótay.com?
• Lập trình: tạo ra 1 chương trình
trình bằng tiếng Anh( ngôn ngữ con người) rồi giúp chuyển sang ngôn ngữ máy
Ngôn ngữ lập trình : Tập quy định về cách diễn đạt 1 chương trình ( văn phạm của ngôn ngữ)
Phần mềm ngôn ngữ : Một chương trình máy tính cho phép: soạn thảo, biên dịch, kiểm lỗi cú pháp, thực thi chương trình
2.1.KHÁI NIỆM VỀ NGÔN NGỮ LẬP
TRÌNH
Trang 42.2.Dịch chương trình- Translating
Chương trình
theo ngôn ngữ
lập trình
Biên dịch Compile (dịch toàn bộ) Chương trình
Chương trình
theo ngôn ngữ
lập trình
Thông dịch Interpreting (dịch từng câu) 1 lệnh
CPU thực thi
2.3.Các loại ngôn ngữ lập trình thông
dụng
• Ngôn ngữ lập trình Hợp ngữ
• Ngôn ngữ lập trình Basic
• Ngôn ngữ lập trình Pascal
• Ngôn ngữ lập trình C / C++
• Ngôn ngữ lập trình Java
• …
2.4.Lập trình tuần tự - tuyến tính
• Ngôn ngữ lập trình Hợp ngữ thuộc loại
ngôn ngữ lập trình tuyến tính
• Các phần của chương trình nối nhau theo
dãy dài, làm khó hiểu về mặt logic
• Việc điều khiển chương trình được thực
hiện bằng cách nhảy lung tung, khó kiểm
soát
• Mọi dữ liệu đều toàn cục, nên các thành
phần của chương trình có thể làm thay đổi
nó
2.5.Lập trình cấu trúc
• Ngôn ngữ lập trình Pascal hay C thuộc loại ngôn ngữ lập trình cấu trúc.
• Chương trình được chia nhỏ thành các hàm (function) thực hiện một chức năng chuyên biệt
• Có thể coi hàm là các chương trình thu nhỏ, liên kết lại với nhau để xây dựng nên ứng dụng
• Dễ bảo trì, tăng độ tin cậy, chính xác
• Biến toàn cục giảm, biến cục bộ tăng lên
• Khi thay đổi cấu trúc dữ liệu dùng chung thì nhóm lập trình cùng viết chung chương trình bị ảnh hưởng
2.6.Lập trình Hướng đối tượng
• Ngày nay, C++ hay C#, java… thuộc loại ngôn
ngữ lập trình hướng đối tượng.
• Trừu tượng dữ liệu, không bận tâm chi tiết cài
đặt cụ thể
• Có thể sử dụng lại một cách dễ dàng hay nâng
cấp các đối tượng
• Càng dễ bảo trì, tăng độ tin cậy, chính xác
• Bước 1: Hiểu kỹ và biết cách giải bài toán
– Xác định dữ liệu liên quan đến bài toán – Hiểu các thao tác lên dữ liệu
• Bước 2: Tìm một giải thuật để giải
– Sắp xếp các thao tác sao cho có thứ tự hợp lý
• Bước 3: Viết chương trình theo ngôn ngữ
– Mở trình soạn thảo
– Viết chương trình theo ngôn ngữ đã chọn
– Biên dịch chương trình và sửa lỗi cú pháp
– Chạy chương trình, kiểm tra kết qủa
2.7.Các bước xây dựng chương trình
Trang 52.7.Các bước xây dựng chương trình
Bài toán Phân tích
Dữ liệu Giải thuật
Dùng Editor NNLT
Chương trình ngôn ngữ Start
Yes Lỗi cú pháp
No
Kq đúng
?
End
Chương trình
mã máy
Xin cám ơn
Tài liệu tham khảo
• “Lập trình C”, Quách Tuấn Ngọc, Nhà Xuất Bản Giáo dục
2004
• “Kỹ thuật lập trình C cơ sở và nâng cao”, Phạm Văn Ất,
Nhà Xuất Bản Khoa Học Kỹ Thuật – 1996
• “Giáo trình ngôn ngữ C”, Lê Hoài Bắc – Lê Hoàng Thái –
Nguyễn Tấn Trần Minh Khang – Nguyễn Phương Thảo, Nhà
Xuất Bản Đại Học Quốc Gia Tp Hồ Chí Minh – 2003
• “Giáo trình lý thuyết & Bài tập ngôn ngữ C”, Nguyễn
Đình Tê – Hoàng Đức Hải, Nhà Xuất Bản Mũi Cà Mau
• “Bài tập ngôn ngữ C từ A đến Z”, Huỳnh Tấn Dũng –
Hoàng Đức Hải, Nhà Xuất Bản Lao Động – Xã Hội
Chương 3
MỞ ĐẦU VỀ NGÔN NGỮ C
Nội dung
• Nhận biết tập ký tự dùng trong C
• Nhận biết một số từ khóa của C
• Nhận biết tổ hợp ESCAPE của C
• Dạng thức của một chương trình C
• Chỉ thị tiền xử lý
• Nhận biết các kiểu dữ liệu cơ bản của C
• Tự định nghĩa được kiểu dữ liệu
• Định nghĩa và phân biệt được hằng và biến
• Nhận diện và sử dụng được các toán tử của C
• Biết sử dụng các cấu trúc điều khiển của C
3.1 Tập ký tự của C –
Character set
• Digits: 0 9
• Letters- alphabet characters: a z, A Z
• Special characters: + - * / % & ! # ^ & …
Các ký tự in được của bàn phím chuẩn
Trang 63.2 Từ khóa – Keywords
• Là những từ ngôn ngữ C đã định nghĩa sẵn cho người lập
trình sử dụng để thiết kế chương trình
• Là thành phần cơ bản để tạo câu lệnh trong C
• Bao gồm các nhóm:
– Kiểu số nguyên : char , int , short , unsigned , long
– Kiểu số thực: float , double
– Kiểu rời rạc : enum
– Kiểu cấu trúc : struct , union
– Kiểu rỗng: void
– Tự định kiểu: typedef
– Khai báo hằng: const , define
– Khai báo biến: static , extern , auto, register, volatile
– cấu trúc chọn : if , else , switch , case , default
– cấu trúc lăp: for , while , do
– Từ khóa điều khiển: break , continue , return , goto
– …
• Do người lập trình tự định nghĩa, dùng đặt tên cho
• Tên là 1 từ, chiều dài 1 từ : Có thể tự ấn định bằng Menu Options / Compiler / Source / Identifier Length
• Các từ trong C phân biệt chữ hoa chữ thường (case-sensitive)
Hãy cho biết các tên sau tên nào là hợp lệ?
m _12 _m12 12m 6L
Hãy cho biết các tên sau có cùng ngữ nghĩa hay không?
delta Delta dElta DELTA
„a‟ ‟z‟, „A‟ ‟Z‟
„_‟ (gạch nối)
„0‟ ‟9‟
„a‟ ‟z‟, „A‟ ‟Z‟
„_‟ (gạch nối)
3.4 Chuỗi
ESCAPE
• Escape: thoát, bỏ qua
• Chuỗi escape bắt đầu
bằng ký tự „\‟ mang ý
nghĩa bỏ qua ý nghĩa
thông thường của ký
tự đứng sau ký tự
này
• Do đó chuỗi escape
mang một ý nghĩa đặc
biệt
Cách viết Tên gọi Ý nghĩa
'\'' Single quote Ký tự '
'\"' Double quote Ký tự "
'\\' Backslash Ký tự \
‘\?’ Question mark Ký tự ?
‘\a’ Alert Phát tiếng Beep ra loa
'\n' New line Xuống dòng mới
'\0' NULL Rỗng
'\t' Horizontal tab Di chuyển con nhấp nháy
tới vị trí tab kế tiếp
'\b' Backspace Lùi con nhấp nháy 1 vị trí
'\r' Carriage return Đưa con nhấp nháy về
đầu dòng
'\f' Form feed Sang trang kế tiếp
3.5.Các kiểu dữ liệu cơ bản của C
– Data types
• Kích thước và phạm vi của kiểu dữ liệu phụ thuộc
vào trình biên dịch ( xem file Định dạng limit.h và float.h ) Nhập/Xuất Kiểu
Số
%c unsigned c har 1 0 255
%c c har 1 -128 127
%u u nsigned int 2 0 65,535
%d, %i i nt 2 - 32,768 32,767
%lu u nsigned l ong <int> 4 0 4,294,967,295
%ld, %li l ong < i nt> 4 -2,147,483,648 2,147,483,647
%f f loat 4 3.4 * (10 -38 ) 3.4 * (10 +38 )
%lf double ( l ong f loat) 8 1.7 * (10 -308 ) 1.7 * (10 +308 )
%lf long double 10 3.4 * (10 -4932 ) 1.1 * (10 +4932 )
• Cách 1:Dùng macro Ví dụ:
• Cách 2: Dùng từ khóa const Ví dụ:
Hay là:
• Đặt một tên gọi cho một nội dung
• Còn gọi là macro
#include <stdio.h>
#include <conio.h>
#define PI 3.141592
void main() { printf("%lf", 3.141592 *3.2*3.2);
getch();
}
Thay thế trị trước khi biên dịch
Trang 7Hiệu ứng lề – Side effect
#include <stdio.h>
#include <conio.h>
#define PI =3.141592;
void main() { printf("%lf", =3.141592; *3.2*3.2);
getch();
}
Error!
#include <stdio.h>
#include <conio.h>
#define Area(x) x*x void main() { printf("%lf", 3+2*3+2);
getch();
}
Không được mong đợi
#define Area(x) (x)*(x)
(3+2)*(3+2) OK
Thí dụ:
-Hằng không kiểu: trình biên dịch dùng bộ nhớ ít nhất để chứa, tối thiểu là 2 bytes
-Hằng có kiểu sẽ buộc trình biên dịch phải dùng đúng kiểu đã chỉ định để lưu trữ trị hằng
-Hằng chuỗi ký tự được để
trong cặp nháy đôi
-Hằng ký tự được để trong cặp nháy đơn
Toán tử sizeof(data) cho biết số byte
mà data này chiếm chỗ
• Biến phải thuộc 1 kiểu dữ liệu
• Khai báo biến:
• 2 biến cùng kiểu cách nhau dấu phẩy
• C chuẩn chỉ cho phép khai báo biến ở đầu
chương trình Còn C++, cho phép khai báo biến
bất kỳ chỗ nào nếu thấy cần Ví dụ:
int m=3 ; long t1=23 , t2=3*t1;
double z1 , z2 , z3 ; char c1 , c2 = „A‟ ;
<Kiểu dữ liệu> tênbiến;
Ví dụ
Lỗi “khai báo kết thúc không đúng cách” vì khai báo xong biến t,
sang biến kiểu khác mà để dấu “phẩy”
Đáng lẽ phải là dấu “chấm phẩy”
Đúng về Syntax,
nhưng Sai về Lý luận
3.8 Cấu trúc một chương trình
C
/* CHAO.CPP Chuong trinh minh hoa don gian */
// Xuat chuoi “ Chao cac ban ” ra man hinh
#include <stdio.h>
#include <conio.h>
void main()
{ clrscr();
printf(“ Chao cac ban ");
getch();
}
/*…*/ Khối chú thích // Chú thích đến cuối dòng
Khai báo sử dụng thư viện
Chương trình chính , bắt buộc là main()
; kết thúc 1 câu lệnh đơn
Trang 8Ví dụ: Cấu trúc một chương
trình C
Từ nay về sau, chúng
ta nên thêm phần chú thích để gợi nhớ
• Dùng để giải thích chương trình
• Chú thích 1 dòng: chỉ dùng trong C++
// Chú thích
• Chú thích nhiều dòng: C/C++
/* Các dòng chú thích ……
*/
• Dòng chú thích được bỏ qua khi biên dịch
Chỉ thị tiền xử lý – Preprocessor
indicators
• Còn được gọi là chỉ thị tiền biên dịch vì
đây là những chỉ thị mà trình biên dịch
phải làm trước khi chuyển chương trình C
thành chương trình mã máy
Cách làm việc của chỉ thị
#include
nội dung file stdio.h nội dung file conio.h code chương trình
Compile
Chỉ thị #include : Chèn 1 file
• Lưu ý: Không nên có khoảng trống giữa < , > và tên
file vì trong cặp ký tự này được hiểu là tên file
Lưu ý chỉ thị
#include
Không có khoảng trắng
có khoảng trắng (Error)
Trang 9Chương 4 NHẬP XUẤT DỮ LIỆU TRONG C
Nội dung
• Macro:
• Functions:
– int getch(); // tương tự như getchar()
– char* gets(char *s); // nhận chuỗi ký tự
– int scanf(char *format, [, address,…]);
4.2 Xuất – Output
– int putchar(int c); // xuất ký tự c ra màn hình
• Functions:
– int putch(int c); // tương tự như putchar() – int puts(const char *s); // xuất chuỗi ký tự ra // màn hình
– int printf(const char *format [, argument,…]);
– int cprintf(const char *format [, argument,…]);
Ví dụ:
Chương 5 BIỂU THỨC VÀ CÁC PHÉP
TOÁN
Trang 105.1 Toán tử - Operators
• Toán tử: Ký hiệu mô tả 1 phép toán cho
kết qủa 1 trị duy nhất
• Toán hạng (operand): Dữ liệu để phép
toán tác động
• Kết qủa (result): Dữ liệu mới được sinh ra
sau khi thực thi xong phép toán
• C hỗ trợ các phép toán có 1/2/3 toán hạng
1/2/3 ngôi
Các loại toán tử của C
• Các toán tử khác
Arithmetic operators
Ví dụ:
int k = 3, t = 6;
int u = k- -;
int v = - - t;
Hỏi k, t, u, v có trị bao nhiêu?
Lưu ý về Toán tử chia
Nguyên % Nguyên Kết quả Phần dư
Nguyên / Nguyên Kết quả Phần nguyên Nguyên / Thực Kết quả Thực Thực / Nguyên Kết quả Thực Thực / Thực Kết quả Thực
Phép chia
trong C
%
/
Ví dụ:
Toán tử % chỉ dùng cho số nguyên
Trang 115.1.2 Toán tử so sánh –
Relational operators
Ví dụ:
Toán tử so sánh
5.1.2 Toán tử luận lý – Logical
operators
Toán tử Luận lý
operators
• Khi gán trị mới cho 1 biến, trị cũ bị ghi đè 0000000000000001
x=1;
s = s / a; s /= a;
0000000000001011 x=11;
0000111
<< Left shift Right shift >>
00001110
00011100
00000011
00000001
1 bit
2 bit
14 d
28 d
7 d
3 d
1 d
Bạn có nhận xét gì ?
Trang 12Ví dụ:
0000 0000 0000 0011
0000 0000 0000 0111
0000 0000 0000 0100 7*4 28 7/4 1
5.1.5 Các toán tử khác
• Ép kiểu (type casting) : – (kiểuT) x
– kiểuT ( x
• Quản lý bộ nhớ:
– sizeof( biến ) : Lấy kích thước byte của „biến‟
– sizeof( kiểu dữ liệu ) : Lấy kích thước byte của „kiểu dữ liệu‟
– new : Cấp phát động một vùng nhớ
– delete : Trả một nhớ đã được cấp phát động
– & biến : Lấy địa chỉ bộ nhớ của „biến‟ (địa chỉ chiếm 4 byte ở DOS)
Ví dụ về ép kiểu lớn sang kiểu nhỏ
0000 0001
0000 0000
m=256
0000 0000
c
Ép kiểu lớn sang kiểu nhỏ
thức là kiểu lớn nhất của toán hạng tham gia biểu thức
int n=3; long t=123; double x=5.3;
3*n + 620*t – 3*x ( int*int ) + ( int*long ) - ( int*double )
int + long - double
long - double
double
Hãy giải thích vì sao chương trình sau cho kết qủa sai?
Theo bạn, một hộ sử dụng
155 kwh điện một tháng và tính tiền theo công thức sau sẽ cho kết qủa đúng hay sai?
t = 100 *650+ 50 *850+ 5 *1150;
0111 1111 1111 1111
0000 0000 0000 0001
1000 0000 0000 0000 +
5.2 Độ ưu tiên của toán tử –
Operator Precedence
• Thứ tự mà một toán tử được thực hiện khi
biểu thức có nhiều toán tử
Độ ưu tiên của toán tử
• Nhìn chung độ ưu tiên:
– Cặp ngoặc từ trong ra ngoài
– Toán tử số học, nhân chia trước cộng trừ sau
– Toán tử so sánh – Toán tử luận lý – Toán tử gán
1 () [] Trái qua phải
2 ! ~ & – (dấu trừ) ++ (type ) sizeof Phải qua trái
3 * ( phép nhân ) / % Trái qua phải
4 + – (phép trừ) Trái qua phải
5 << >> Trái qua phải
6 < <= > >= Trái qua phải
7 == != Trái qua phải
8 & Trái qua phải
9 ^ Trái qua phải
10 | Trái qua phải
11 && Trái qua phải
12 || Trái qua phải
13 ?: Phải qua trái
14 = += -= *= /= %= <<=
>>= &= ^= |= Phải qua trái
15 , Trái qua phải