Bao gồm 5 tính chất sau: Tính chính xác: quá trình tính toán hay các thao tác máy tính thực hiện là chính xác.. Tính phổ dụng: có thể áp dụng cho một lớp các bài toán có đầu vào tương t
Trang 1Bộ môn Khoa học Máy tính
guyễn Thủy Đoan Trang Email: trangdhnt@gmail.com Web: nguyenthuydoantrang.tk
GIỚI THIỆU MÔN HỌCLẬP TRÌNH C++
Trang 2BB Phân b Phân bổ gi gi giờ gi gi giảng ng
Nghe giảng lý thuyết: 30 tiết
Trang 3BB
Đặng Bình Phương, Bài giảng Tin học cơ
sở A, Đại học Khoa học Tự nhiên,
Trang 6Lập trình máy tính
Gọi tắt là lập trình (programming)
Nghệ thuật cài đặt một hoặc nhiều thuật toán
trừu tượng có liên quan với nhau bằng một
ngôn ngữ lập trình để tạo ra một chương trìnhmáy tính
Thuật toán
Là tập hợp (dãy) hữu hạn các chỉ thị (hành
động) được định nghĩa rõ ràng nhằm giảiquyết một bài toán cụ thể nào đó
Trang 7• Phương trình có nghiệm duy nhất x = -b/a
ðầu vào: a, b thuộc R
ðầu ra: nghiệm phương trình ax + b = 0
Trang 8Bao gồm 5 tính chất sau:
Tính chính xác: quá trình tính toán hay các
thao tác máy tính thực hiện là chính xác
Tính rõ ràng: các câu lệnh minh bạch được sắp xếp theo thứ tự nhất định
Tính khách quan: được viết bởi nhiều người trên máy tính nhưng kết quả phải như nhau
Tính phổ dụng: có thể áp dụng cho một lớp
các bài toán có đầu vào tương tự nhau
Tính kết thúc: hữu hạn các bước tính toán
Trang 9Lựa chọn phương pháp giải
Cài đặt chương trình
Cài đặt chương trình
Hiệu chỉnh chương trình
Hiệu chỉnh chương trình
Xây dựng thuật toán/ thuật giải
Trang 10ðầu vào: a, b thuộc R
ðầu ra: nghiệm phương trình ax + b = 0
Trang 13Vay mượn ngôn ngữ nào đó (ví dụ Pascal) để
biểu diễn thuật toán
Xuất “Phương trình có nghiệm x = -b/a”
ðầu vào: a, b thuộc R
ðầu ra: nghiệm phương trình ax + b = 0
Trang 14printf(“x = %d”, float(-b)/a);
}
Trang 16VC
Trang 20BB Chương 2 Giới thiệu NNLT C
Các kiểu dữ liệu cơ sở
Trang 21Turbo C có 4 kiểu cơ sở như sau:
Kiểu số nguyên: giá trị của nó là các số
nguyên như 2912, -1706, }
Kiểu số thực: giá trị của nó là các số thực như3.1415, 29.12, -17.06, }
Kiểu luận lý: giá trị đúng hoặc sai
Kiểu ký tự: 256 ký tự trong bảng mã ASCII
Trang 22Miền giá trị (Range)
short 2 –32.768 } +32.767
Trang 23Các kiểu số nguyên (không dấu)
n bit không dấu: 0 } 2n – 1
Kiểu (Type)
Độ lớn (Byte)
Miền giá trị (Range)
unsigned char 1 0 } 255
unsigned int 2 0 } 65.535
unsigned short 2 0 } 65.535
unsigned long 4 0 } 4.294.967.295
Trang 24• (*) Độ chính xác kép (Double-precision) chính xác đến 19 số lẻ.
Kiểu (Type)
Độ lớn (Byte)
Miền giá trị (Range)
float (*) 4 3.4*10 –38 } 3.4*10 38
double (**) 8 1.7*10 –308 } 1.7*10 308
Trang 25Đặc điểm
C ngầm định một cách không tường minh:
• false (sai): giá trị 0.
• true (đúng): giá trị khác 0, thường là 1.
C++: bool
Ví dụ
0 (false), 1 (true), 2 (true), 2.5 (true)
1 > 2 (0, false), 1 < 2 (1, true)
Trang 26Đặc điểm
Tên kiểu: char
Miền giá trị: 256 ký tự trong bảng mã ASCII
Chính là kiểu số nguyên do:
• Lưu tất cả dữ liệu ở dạng số.
• Không lưu trực tiếp ký tự mà chỉ lưu mã ASCII của
ký tự đó.
Ví dụ
Lưu số 65 tương đương với ký tự ‘A’}
Lưu số 97 tương đương với ký tự ‘a’
Trang 27Ví dụ
typedef int SoNguyen;
Có thể khai báo: SoNguyen x;
Cú pháp
typedef <tên kiểu> <tên kiểu mới>;
Trang 28Cú pháp
<kiểu> <tên biến>;
<kiểu> <tên biến 1>, <tên biến 2>;
Ví dụ
int i;
int j, k;
unsigned char dem;
float ketqua, delta;
Trang 29Phải khai báo biến trước khi sử dụng
Trong C/ C++ có thể khai báo biến ở:
Ngoài hàm
Đầu hàm
Tham số hàm
Trong chương trình
Trang 31Toán tử tác động lên các giá trị của toán hạng
và cho giá trị có kiểu nhất định
Toán tử: +, –, *, /, %}
Toán hạng: hằng, biến, lời gọi hàm
Ví dụ
2 + 3, a div 5, (a + b) * 5, }
Trang 32Khái niệm
Thường được sử dụng trong lập trình
Gán giá trị cho biến
Trang 34Toán tử 1 ngôi
Chỉ có một toán hạng trong biểu thức
++ (tăng 1 đơn vị), (giảm 1 đơn vị)
Trang 35Toán tử 2 ngôi
Có hai toán hạng trong biểu thức
+, –, *, /, % (chia lấy phần dư)
Trang 36Các toán tử trên bit
Tác động lên các bit của toán hạng (nguyên)
& (and), | (or), ^ (xor), ~ (not hay lấy số bù 1)
>> (shift right), << (shift left)
Trang 37int z1, z2, z3, z4, z5, z6;
z1 = a & b; // 0000 0000 0000 0100 z2 = a | b; // 0000 0000 0000 0111 z3 = a ^ b; // 0000 0000 0000 0011 z4 = ~a; // 1111 1111 1111 1010 z5 = a >> 2;// 0000 0000 0000 0001 z6 = a << 2;// 0000 0000 0001 0100 }
Trang 38Các toán tử quan hệ
So sánh 2 biểu thức với nhau
Cho ra kết quả 0 (hay false nếu sai) hoặc 1
(hay true nếu đúng)
Trang 39Các toán tử luận lý
Tổ hợp nhiều biểu thức quan hệ với nhau
&& (and), || (or), ! (not)
Trang 40Toán tử điều kiện
Đây là toán tử 3 ngôi (gồm có 3 toán hạng)
<biểu thức 1> ? <biểu thức 2> : <biểu thức 3>
• <biểu thức 1> đúng thì giá trị là <biểu thức 2>.
• <biểu thức 1> sai thì giá trị là <biểu thức 3>.
Ví dụ
s1 = (1 > 2) ? 2912 : 1706;
int s2 = 0;
1 < 2 ? s2 = 2912 : s2 = 1706;
Trang 41Toán tử phẩy
Các biểu thức đặt cách nhau bằng dấu ,
Các biểu thức con lần lượt được tính từ trái
Trang 42() [] ->
! ++ - + * (cast) & sizeof
* / % + -
Trang 43Quy tắc thực hiện
Thực hiện biểu thức trong ( ) sâu nhất trước
Thực hiện theo thứ tự ưu tiên các toán tử
Trang 46Phân loại
Câu lệnh đơn: chỉ gồm một câu lệnh
Câu lệnh phức (khối lệnh): gồm nhiều câu
lệnh đơn được bao bởi { và }
Trang 47• Văn bản thường (literal text)
• Ký tự điều khiển (escape sequence)
• Đặc tả (conversion specifier)
Trang 48Văn bản thường (literal text)
Được xuất y hệt như lúc gõ trong chuỗi địnhdạng
Ví dụ
Xuất chuỗi Hello World
printf(“Hello ”); printf(“World”);
printf(“Hello World”);
Xuất chuỗi a + b
printf(“a + b”);
Trang 49Ký tự điều khiển (escape sequence)
Gồm dấu \ và một ký tự như trong bảng sau:
In dấu \
In dấu ?
In dấu “
Trang 50Đặc tả (conversion specifier)
Gồm dấu % và một ký tự
Xác định kiểu của biến/giá trị muốn xuất
Các đối số chính là các biến/giá trị muốn xuất, được liệt kê theo thứ tự cách nhau dấu phẩy
Số nguyên không dấu
char int, short, long float, double char[], char*
unsigned int/short/long
Trang 53Phối hợp các thành phần
int a = 1, b = 2;
Xuất 1 cong 2 bang 3 và xuống dòng
• printf(“ %d ”, a); // Xuất giá trị của biến a
• printf(“ cong ”); // Xuất chuỗi “ cong ”
• printf(“ %d ”, b); // Xuất giá trị của biến b
• printf(“ bang ”); // Xuất chuỗi “ bang ”
• printf(“ %d ”, a + b); // Xuất giá trị của a + b
• printf(“\n”); // Xuất điều khiển xuống dòng \n
printf(“%d cong %d bang %d\n”, a, b, a+b);
Trang 54Các đối số là tên các biến sẽ chứa giá trị
nhập và được đặt trước dấu &
Trang 55Ví dụ, cho a và b kiểu số nguyên
scanf(“%d”, &a); // Nhập giá trị cho biến a
scanf(“%d”, &b); // Nhập giá trị cho biến b
scanf(“%d%d”, &a, &b);
Các câu lệnh sau đây sai
• scanf(“%d”, a); // Thiếu dấu &
• scanf(“%d”, &a, &b);// Thiếu %d cho biến b
• scanf(“% f ”, &a); // a là biến kiểu số nguyên
• scanf(“% 9 d”, &a); // không được định dạng
• scanf(“ a = %d , b = %d”, &a, &b”);
Trang 56• cout<<“giá trị của a = ”<<a<<“\n”;
• Các biến và chuỗi cách nhau bởi dấu << (chuỗi nằm trong cặp dấu nháy kép “”)
Trang 59Các hàm trong thư viện toán học
#include <math.h>
1 đầu vào: double, Trả kết quả: double
• acos, asin, atan, cos, sin, }
• exp, log, log10
• sqrt
• ceil, floor
• abs, fabs
2 đầu vào: double, Trả kết quả: double
• double pow(double x, double y)
Trang 61Câu lệnh điều kiện if
Trang 62if (<BT Logic>)
<Lệnh 1>; Câu lệnh đơn hoặc
Câu lệnh phức (kẹp giữa { và } )
Trong ( ) , cho kết quả (sai = 0, đúng ≠ 0)
Trang 63printf(“a bang 0”);
a = 2912;
}
}
Trang 64Trong ( ) , cho kết quả (sai = 0, đúng ≠ 0)
Trang 66Câu lệnh if và câu lệnh if} else là một câu lệnhđơn
Trang 69} ;
printf(“a khac 0.”);
Trang 70<Lệnh> : đơn hoặckhối lệnh {}.
Trang 71case 1 : printf(“Mot”); break;
case 2 : printf(“Hai”); break;
case 3 : printf(“Ba”); break;
} }
Trang 73case 1 : printf(“Mot”); break;
case 2 : printf(“Hai”); break;
case 3 : printf(“Ba”); break;
default : printf(“Ko biet doc”);
} }
Trang 74Câu lệnh switch là một câu lệnh đơn và có thể
lồng nhau
Trang 75Các giá trị trong mỗi trường hợp phải khác
nhau
switch (a)
{
case 1 : printf(“Mot”); break;
case 1 : printf(“MOT”); break;
case 2 : printf(“Hai”); break;
case 3 : printf(“Ba”); break;
case 1 : printf(“1”); break;
case 1 : printf(“mot”); break;
default : printf(“Khong biet doc”);
}
Trang 76switch sẽ nhảy đến case tương ứng và thực
hiện đến khi nào gặp break hoặc cuối switch sẽkết thúc
Trang 77switch nhảy đến case tương ứng và thực hiện
đến khi nào gặp break hoặc cuối switch sẽ kết
thúc
Trang 78Tận dụng tính chất khi bỏ break;
Trang 81for (<Khởi đầu>; <Đ/K lặp>; <Bước nhảy>)
<Lệnh>; <Khởi đầu> , <ð/K lặp> , <Bước nhảy> :
là biểu thức C bất kỳ có chức năng riêng
<Lệnh> : đơn hoặc khối lệnh.
<Khởi đầu>
<Bước nhảy>
Trang 82printf(“%d”, k) ;
printf(“\n”) ; }
}
Trang 83Câu lệnh FOR là một câu lệnh đơn và có thể
lồng nhau
Trang 84Trong câu lệnh for, có thể sẽ không có phần
Trang 85Trong câu lệnh for, có thể sẽ không có phần
Trang 86Trong câu lệnh for, có thể sẽ không có phần
Trang 88Không được thêm ; ngay sau lệnh lệnh for.
=> Tương đương câu lệnh rỗng
Trang 89Các thành phần <Khởi đầu>, <Đ/K lặp>, <Bước
nhảy> cách nhau bằng dấu ;
Nếu có nhiều thành phần trong mỗi phần thì
được cách nhau bằng dấu ,
for (int i = 1 , j = 2; i + j < 10 ; i++ , j += 2 )
printf(“%d\n”, i + j);
Trang 90Biểu thức C bất kỳ, thường là biểu thức quan hệ cho kết quả
0 (sai) và != 0 (đúng)
Trang 92Câu lệnh while là một câu lệnh đơn và có thể
lồng nhau
Trang 93Câu lệnh while có thể không thực hiện lần nào
do điều kiện lặp ngay từ lần đầu đã không thỏa
void main()
{
int n = 1 ; while ( n > 10 ) {
printf(“%d\n”, n);
n ;
}
… }
Trang 94Không được thêm ; ngay sau lệnh lệnh while.
Trang 95Câu lệnh while có thể bị lặp vô tận (loop)
void main()
{
int n = 1 ; while ( n < 10 ) {
printf(“%d”, n);
n ;
}
n = 1 ; while ( n < 10 )
printf(“%d”, n);
}
Trang 96Biểu thức C bất kỳ, thường là biểu thức quan hệ cho kết quả
0 (sai) và != 0 (đúng)
Trang 98Câu lệnh do… while là một câu lệnh đơn và có
printf(“%d\n”, a + b);
b = b + 2;
} while (b < 20);
a++;
}
while (a < 20);
Trang 99Câu lệnh do… while sẽ được thực hiện ít nhất 1
lần do điều kiện lặp được kiểm tra ở cuối
void main()
{
int n;
do {
printf(“Nhap n: ”);
scanf(“%d”, &n);
} while ( n < 1 || n > 100 );
}
Trang 100Câu lệnh do… while có thể bị lặp vô tận (loop)
…
int n = 1 ; do
{
printf(“%d”, n);
n ;
} while ( n < 10 );
n = 1 ; do
printf(“%d”, n);
while ( n < 10 );
…
Trang 101Đều có khả năng lặp lại nhiều hành động.
int n = 10 ; for (int i = 1 ; i <= n ; i++)
printf(“%d\n”, i);
int i = 1 ; while ( i <= n ) {
printf(“%d\n”, i); i++ ; }
int i = 1 ;
do {
printf(“%d\n”, i); i++;
Trang 102Số lần lặp xác định ngay trong câu lệnh for
int n = 10 ; for (int i = 1 ; i <= n ; i++ )
…;
int i = 1;
while ( i <= n ) {
Trang 103while có thể không thực hiện lần nào.
do… while sẽ được thực hiện ít nhất 1 lần.
Trang 106Tạ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ềunơi trong chương trình tách công việc đóthành chương trình con
Để thuận tiện trong quản lý, trình bày và phát
triển
Trong C, một chương trình con gọi là hàm: có
tên, đầu vào và đầu ra
Có chức năng giải quyết một số vấn đề chuyên
biệt cho chương trình chính
Trang 107Hàm trong C có thể trả về kết quả thông qua tên
hàm hay có thể không trả về kết quả
Một hàm khi được định nghĩa thì có thể được gọitrong chương trình
Được gọi nhiều lần với các tham số khác nhau
Trong C, hàm main() được gọi thực hiện đầu tiên
Hàm có hai loại: hàm chuẩn (hàm được trình biêndịch C viết sẵn) và hàm tự định nghĩa bởi người
sử dụng
Trang 108Hàm thư viện là những hàm đã được định
nghĩa sẵn trong một thư viện nào đó
Muốn sử dụng các hàm thư viện thì phải khai
báo thư viện trước khi sử dụng bằng lệnh
#include <tên thư viện.h>
Trang 109Ý nghĩa của một số thư viện thường dùng:
1 stdio.h:
- Thư viện chứa các hàm vào/ ra chuẩn
(standard input/output)
- Gồm các hàm printf(), scanf(), getc(),
putc(), gets(), puts(), fflush(), fopen(), fclose(), fread(), fwrite(), getchar(),
putchar(), getw(), putw()…
2 conio.h :
- Thư viện chứa các hàm vào ra trong chế độ
DOS (DOS console)
- Gồm các hàm clrscr(), getch(), getche(),
getpass(), cgets(), cputs(), putch(), clreol(),…
Trang 1103 math.h:
- Thư viện chứa các hàm tính toán
- Gồm các hàm abs(), sqrt(), log() log10(),
sin(), cos(), tan(), acos(), asin(), atan(), pow(), exp(),…
4 alloc.h:
- Thư viện chứa các hàm liên quan đến việc
quản lý bộ nhớ
- Gồm các hàm calloc(), realloc(), malloc(),
free(), farmalloc(), farcalloc(), farfree(), …
Trang 1115 io.h:
- Thư viện chứa các hàm vào ra cấp thấp
- Gồm các hàm: open(), _open(), read(),
_read(), close(), _close(), creat(), _creat(), creatnew(), eof(), filelength(), lock(),…
Muốn sử dụng các hàm thư viện thì ta phải xem cú
pháp của các hàm và sử dụng theo đúng cú pháp (xem trong phần trợ giúp của Turbo C)
Trang 112Xuất kết quả S
Tính s1=a!
Tính s2=b!
Tính s2=b!
Tính s3=c!
Tính s3=c!
ðặt vấn đề
Trang 115Giải pháp => Viết 1 lần và sử dụng nhiều lần
Đoạn lệnh nhập tổng quát, với n = a, b, c
Đoạn lệnh tính giai thừa tổng quát, n = a, b, c
Trang 116Cú pháp
Trong đó
• <kiểu trả về> : kiểu bất kỳ của C ( char , int , long ,
float ,…) Nếu không trả về thì là void
• <tên hàm>: theo quy tắc đặt tên định danh.
• <danh sách tham số> : tham số hình thức đầu vào giống khai báo biến, cách nhau bằng dấu ,
• <giá trị> : trả về cho hàm qua lệnh return
<kiểu trả về> <tên hàm> ( [danh sách tham số] )
{
<các câu lệnh>
[ return <giá trị>;]
}
Trang 117Cần xác định các thông tin sau đây:
Tên hàm.
Hàm sẽ thực hiện công việc gì
Các đầu vào (nếu có).
sẽ thực hiện
Trang 118Ví dụ 1
Tên hàm: XuatTong
Công việc: tính và xuất tổng 2 số nguyên
Đầu vào: hai số nguyên x và y
Đầu ra: không có
void XuatTong(int x, int y)
Trang 119Ví dụ 2
Tên hàm: TinhTong
Công việc: tính và trả về tổng 2 số nguyên
Đầu vào: hai số nguyên x và y
Đầu ra: một số nguyên có giá trị x + y
int TinhTong(int x, int y)
Trang 120Ví dụ 3
Tên hàm: NhapXuatTong
Công việc: nhập và xuất tổng 2 số nguyên
Đầu vào: không có
Đầu ra: không có
void NhapXuatTong()
{
int x, y;
printf(“Nhap 2 so nguyen: ”);
scanf(“%d%d”, &x, &y);
printf(“%d cong %d bang %d”, x, y, x + y); }
Trang 121• Toàn cục: khai báo trong ngoài tất cả các hàm (kể
cả hàm main) và có tác dụng lên toàn bộ chương trình.
• Cục bộ: khai báo trong hàm hoặc khối { } và chỉ
có tác dụng trong bản thân hàm hoặc khối đó (kể
cả khối con nó) Biến cục bộ sẽ bị xóa khỏi bộ nhớ khi kết thúc khối khai báo nó.
Trang 122int a;
int Ham1() {
int a1;
}
int Ham2() {
int a2;
{
int a21;
} }
void main() {
int a3;
}
Trang 123Thông thường người ta thường đặt phần tiêu đề
hàm/nguyên mẫu hàm (prototype) trên hàm
main và phần định nghĩa hàm dưới hàm main
void XuatTong(int x, int y); // prototype
void main()
{
… }
void XuatTong(int x, int y)
{
printf(“%d cong %d bang %d”, x, y, x + y); }
Trang 124// Truyền bằng tham biến (con trỏ)
void Swap2 (int *x, int *y)
// Truyền bằng tham chiếu
void Swap3 (int &x, int &y)
Swap1(m,n);
printf(“m=%d n=%d\n”,m,n”); Swap2(&m,&n);
printf(“m=%d n=%d\n”,m,n”); Swap3(m,n);
printf(“m=%d n=%d\n”,m,n”); return 0;
}
?
Trang 125Truyền bằng Giá trị (Call by Value) (tham trị)
Truyền đối số cho hàm ở dạng giá trị.
Có thể truyền hằng, biến, biểu thức nhưng
}
Trang 126Mặc nhiên, việc truyền tham số cho hàmtrong C là truyền theo giá trị; nghĩa là các giátrị thực (tham số thực) không bị thay đổi giá trịkhi truyền cho các tham số hình thức
Ví dụ 1: Giả sử muốn in ra các, mỗi dòng gồm
50 ký tự nào đó Để đơn giản ta viết hàm, hàm này sẽ in ra trên một dòng 50 ký tự chotrước