ngÔn ngỮ lẬp trÌnh c/c++fit.hnue.edu.vn/~trungnc/textbookandlecturenote/nhap mon lap trinh 2/1...
TRANSCRIPT
Facu
lty o
f In
form
ati
on
Tech
no
log
y
ADVANCED PROGRAMMING
Pascal Review and Introduction to
C Language
Dr. Nguyen Chi Trung
Faculty of Information Technology
Hanoi National University of Education
• ..
Pascal Programming Review
HỆ THỐNG KIẾN THỨC ĐÃ HỌC
NCT.FIT.HNUE 3
Pascal
Các kiểu dữ liệu
Các cấu trúc điều khiển
Các thuật toán
Chương trình con
HỆ THỐNG KIẾN THỨC ĐÃ HỌC
NCT.FIT.HNUE 4
Cá
c k
iểu
dữ
liệ
u
Kiểu dữ liệu cơ bản (tiền định)
Integer (byte, short, word, longint)
Real (extended)
Char
Boolean
Kiểu dữ có cấu trúc
String
Array
One dimension
Two dimension
Text file
Record
Kiểu con trỏ
• Các phép toán?
• Các hàm, thủ tục?
• Miền giá trị?
Standard arithmetic functions: Example
Examples
9/17/2017NCT.FIT.HNUE 5
sqr(3)=9
sqr(2.5)=6.25
sqrt(9)=3.00
abs(–28.55)=28.55
ln(exp(1))=1.00
arctan(1)=45 degrees
round(8.4) returns 8
round(8.5) returns 9
trunc(8.4) returns 8
trunc(8.5) returns 8
round(n) rounds n to the closest integer
trunc(n) truncates the fraction part of n
writeln(frac(8.22):2:2);
produces 0.22
writeln(int(8.22):2:2);
produces 8.00
frac(n) returns the fractional portion of
the real number n
int(n) returns the integer portion of the
real number n
HỆ THỐNG KIẾN THỨC ĐÃ HỌC
NCT.FIT.HNUE 6
Các c
ấu trú
c đ
iều k
hiể
nTuần tự
Rẽ nhánh
Rẽ nhánh khuyết (if – then)
Rẽ nhánh đủ (if –then – else)
Rẽ nhiều nhánh (chọn lựa) (case of)
Lặp
Lặp với số lần biết trước
Lặp tiến (for-to-do)
Lặp lùi (for-downto-do)
Lặp với số lần không biết trước
Kiểm tra điều kiện trước (while-do)
Kiểm tra điều kiện sau (repeat-until)
HỆ THỐNG KIẾN THỨC ĐÃ HỌC
NCT.FIT.HNUE 7
Các thuật toán
Liên quan đến các cấu trúc điều khiển
Số nguyên tố, cặp số nguyên tố cùng nhau
Số hoàn hảo, cặp số hoàn
hảo
UCLN
Khác 2
Liên quan đến mảng
Tìm kiếm
Tiềm kiếm tuần tự
Tìm kiếm nhị phân
Sắp xếp
Chọn trực tiếp (selection S)
Nổi bọt (Bubble S)
Chèn trực tiếp (Insertion S)
Duyệt mảng khác 3
Liên quan đến xâu kí tự
Xóa dấu cách thừa
Sửa lỗi về dấu ngắt câu
Khác 4...
Khác 1
1
Số nguyên tố
Bài toán 1
o INPUT: số nguyên a
o OUTPUT: kết luận về tính nguyên tố của số a
Function prime(a: longint) : Boolean;
Var i : longint; d : integer;
Begin
d := 0;
for i:=1 to a div 2 do
if a mod i = 0 then d := d + 1;
prime := (d = 1);
End;
9/17/2017NCT.FIT.HNUE 8
Số nguyên tố
Bài toán 2
o INPUT: a, b (các số nguyên dương, a < b)
o OUTPUT: các số nguyên tố trong đoạn [a, b]
Dùng hàm prime(a) đã biết
Procedure ListOfPrimes (a, b : longint);
Var i : longint;
Begin
writeln(‘The primes in set of [’, a, ‘,’ ,b, ‘] are:’);
for i:=a to b do
if prime(a) then write(a, ‘, ’);
End;
9/17/2017NCT.FIT.HNUE 9
Số nguyên tố
Bài toán 3
o INPUT: a, b (các số nguyên dương, a < b)
o OUTPUT: các cặp số nguyên tố cùng nhau trong đoạn [a, b]
Function GCD(a, b : longint) : boolean; {đã biết}
Procedure ListPrimesTogether(a, b : longint);
Var i, j : longint;
Begin
writeln(The primes together in set of [’, a, ‘,’ ,b, ‘] are:’);
for i:=2 to a do
for j:=2 to b do
if GCD(i, j)=1 then writeln(i, ‘, ’, i);
End;
9/17/2017NCT.FIT.HNUE 10
Số hoàn hảo (hoàn thiện)
Các bài toán đặt ra tương tự như đối với số nguyên tố
Bài toán 1
o INPUT: số nguyên a
o OUTPUT: kết luận về tính hoàn hảo của số a
Function perfect(a: longint) : Boolean;
Var i : longint; d : integer;
Begin
d := 0;
for i:=1 to a div 2 do
if a mod i = 0 then d := d + i;
perfect := (d = a);
End;
9/17/2017NCT.FIT.HNUE 11
Số hoàn hảo (hoàn thiện)
Bài toán 2
o INPUT: hai số nguyên a và b
o OUTPUT: kết luận tính hoàn hảo của cặp số (a, b)
Function perfectCouple(a, b: longint) : boolean;
Var i, j, sa, sb : longint; ok : boolean;
Begin
ok := false; sa := 0;
for i:=1 to a div 2 do if a mod i = 0 then sa := sa + i;
if sa = b then
begin sb := 0;
for j := 1 to n do if b mod j = 0 then sb := sb+j;
ok := (sb = a);
end;
perfectCouple := ok;
End;
9/17/2017NCT.FIT.HNUE 12
Ước chung lớn nhất Bài toán
o INPUT: hai số nguyên a và b
o OUTPUT: GCD(a, b)
Function GCD1(a, b: longint) : longint; {trừ liên tiếp}
Begin a := abs(a); b := abs(b);
while a<>b do
if a > b then a := a – b else b := b – a;
GCD1 := b;
End;
Function GCD2(a, b: longint) : longint; {chia liên tiếp}
var r : longint;
Begin a := abs(a); b := abs(b); r := a mod b;
while r > 0 do
begin a := b; b := r; r := a mod b; end;
GCD2 := b;
End; 9/17/2017NCT.FIT.HNUE 13
KHÁC Bài toán 1: Xét biểu thức S = 1+ 1/(a+1) + ...+ 1/(a+n)
a) Tính S với n cho trước
b) Tính S biết số hạng cuối cùng của dãy thỏa mãn 1/(a+n) <
cho trước
Bài toán 2: Lãi xuất tiết kiệm
INPUT: a (tiền gửi ban đầu); k (lãi suất); c (chu kì)
OUPUT:
a) Tính số tiền b rút được sau t tháng
b) Tính số tháng t phải gửi để nhận được số tiền b
Bài toán 3: Tốc độ tăng dân số
INPUT: a (dân số năm N nào đó); k (tốc độ tăng dân số)
OUPUT:
a) Tính số dân ở một năm M nào đó (M > N)
b) Cho biết năm M nào thì dân số không ít hơn b cho trước
9/17/2017NCT.FIT.HNUE 14
KHÁC Bài toán 4: Xét dãy fibonacii 1, 1, 2, 3, 5, 8, 13, ....
INPUT: định nghĩa về dãy fibonacii
OUPUT:
a) Tìm số fibonacii thứ n
b) Tính vị trí của số fibonacii nhỏ nhất mà nó >= 500.000
Bài toán 5: Các bài toán vui
Vừa gà vừa chó
Trăm trâu, trăm cỏ
vv...
9/17/2017NCT.FIT.HNUE 15
HỆ THỐNG KIẾN THỨC ĐÃ HỌC
NCT.FIT.HNUE 16
Các thuật toán
Liên quan đến các cấu trúc điều khiển
Số nguyên tố, cặp số nguyên tố cùng nhau
Số hoàn hảo, cặp số hoàn
hảo
UCLN
Khác 2
Liên quan đến mảng
Tìm kiếm
Tiềm kiếm tuần tự
Tìm kiếm nhị phân
Sắp xếp
Chọn trực tiếp (selection S)
Nổi bọt (Bubble S)
Chèn trực tiếp (Insertion S)
Duyệt mảng khác 3
Liên quan đến xâu kí tự
Xóa dấu cách thừa
Sửa lỗi về dấu ngắt câu
Khác 4...
Khác 12
Tìm kiếm tuần tự Bài toán 1
o INPUT: n, x, mảng a: a1, a2, ..., an (giả sử kiểu mảng a là arr,
mỗi phần tử có kiểu số thực);
o OUTPUT: Kết luận có x trong mảng a không
Function Found(x : real; n: integer; a : arr) : boolean;
var ok : boolean; i : integer;
Begin
ok := false; {giả sử không có x trong a}
i := 1;
while (i <= n) and not ok do
if a[i] = x then ok := true else i := i + 1;
Found := ok;
End;
9/17/2017NCT.FIT.HNUE 17
Tìm kiếm tuần tự Bài toán 2
o INPUT: n, x, mảng a = a1, a2, ..., an (giả sử kiểu mảng a là arr,
mỗi phần tử có kiểu số thực);
o OUTPUT: Đưa ra vị trí của các phần từ trong mảng mà bằng x
(nếu có)
Procedure SearchingPosition (x : real; n: integer; a : arr);
var d, i : integer;
Begin
d := 0;
writeln(‘The items’ positions in a-array that equal to x-value
are:’);
for i := 1 to n do
if a[i] = x then begin d := d + 1; write(i, ‘, ’); end;
if d = 0 then writeln(‘After searching, not found x in a-
array’);
End; 9/17/2017NCT.FIT.HNUE 18
Tìm kiếm nhị phân Bài toán
o INPUT: n, x, mảng a = a1, a2, ..., an đã được sắp xếp tăng (giả
sử kiểu mảng a là arr, mỗi phần tử có kiểu số thực);
o OUTPUT: Kết luận có x trong mảng a không
Function BinarySearch(x : real; n: integer; a : arr) : boolean;
var ok : boolean; i : integer;
Begin
ok := false; L := 1; R := n;
while (L <= R) and not ok do
begin M := (L+R) div 2;
if x = a[M] then ok := true
else if x > a[M] then L := M + 1 else R := M - 1;
end;
BinarySearch := ok;
End;
9/17/2017NCT.FIT.HNUE 19
Sắp xếp chèn trực tiếp Bài toán
o INPUT: n, mảng a1, a2, ..., an (kiểu mảng a là arr, phần tử kiểu real);
o OUTPUT: mảng a1, a2, ..., an được sắp xếp tăng dần
Procedure InsertionSort(var a : arr; n : integer);
var i, k : integer; x : real;
Begin
for i := 2 to n do {tìm cách chèn a[i] vào đúng vị trí của dãy trái}
begin {x lưu giá trị của a[i] vì a[i] có thể bị thay đổi}
x := a[i]; k := i – 1; {so sánh a[i] với từng phần tử dãy trái}
while (k >= 1) and (a[k] > x) do
begin
a[k+1] := a[k]; {nếu phần tử a[k] của dãy trái nhỏ hơn a[i]}
k := k – 1; {thì tịnh tiến a[k] sang phải 1 vị trí}
end; {để nhường chỗ cho a[i] chèn vào}
a[k+1] := x; {đặt a[i] vào vị trí cần chèn}
End; 9/17/2017NCT.FIT.HNUE 20
Sắp xếp chèn trực tiếp Procedure InsertionSort(var a : arr; n : integer);
9/17/2017NCT.FIT.HNUE 21
i k x In while a[1] a[2] a[3] a[4] a[5]
5 4 3 2 1
2 1 4 T 5
0 F 4 5 3 2 1
3 2 3 T 5
1 T 4
0 F 3 4 5 2 1
4
.....
.....
Sắp xếp nổi bọt Bài toán
o INPUT: n, mảng a1, a2, ..., an (giả sử kiểu mảng a là arr, mỗi
phần tử có kiểu số thực);
o OUTPUT: mảng a1, a2, ..., an được sắp xếp tăng dần
Procedure BubbleSort(var a : arr; n : integer);
var i, j : integer; tg : real;
Begin
for i := 2 to n do
for j := n downto i do
if a[j] < a[j-1] then
begin tg := a[j];
a[j] := a[j-1];
a[j-1] := tg;
end;
End;
9/17/2017NCT.FIT.HNUE 22
Sắp xếp chọn trực tiếp Bài toán
o INPUT: n, mảng a1, a2, ..., an (giả sử kiểu mảng a là arr, mỗi
phần tử có kiểu số thực);
o OUTPUT: mảng a1, a2, ..., an được sắp xếp tăng dần
Procedure SelectionSort(var a : arr; n : integer); {chưa tối ưu}
var i, j : integer; tg : real;
Begin
for i := 1 to n-1 do
for j := i + 1 to n do
if a[j] < a[i] then
begin
tg := a[i]; a[i] := a[j]; a[j] := tg;
end;
End;
9/17/2017NCT.FIT.HNUE 23
Sắp xếp chọn trực tiếp Bài toán
o INPUT: n, mảng a1, a2, ..., an (giả sử kiểu mảng a là arr, mỗi
phần tử có kiểu số thực);
o OUTPUT: mảng a1, a2, ..., an được sắp xếp tăng dần
Procedure SelectionSort(var a : arr; n : integer); {tối ưu}
var i, j : integer; tg : real;
Begin
for i := 1 to n-1 do
begin {Tìm k là vị trí nhỏ nhất trong dãy từ i đến n}
k := i; for j := i+1 to n do
if a[j] < a[k] then k := j;
if k<>i then {chuyển phần tử ở vị trí k về đầu dãy i}
begin tg := a[k]; a[k] := a[i]; a[i] := tg;
end;
End;
9/17/2017NCT.FIT.HNUE 24
DUYỆT MẢNG KHÁC
Bài toán 1: Tìm max, tìm min
Bài toán 2: Tìm vị trí các phần tử lớn hơn trung bình cộng
Bài toán 3: Đếm số lượng và tỷ lệ HS khá trở lên
......
9/17/2017NCT.FIT.HNUE 25
HỆ THỐNG KIẾN THỨC ĐÃ HỌC
NCT.FIT.HNUE 26
Các thuật toán
Liên quan đến các cấu trúc điều khiển
Số nguyên tố, cặp số nguyên tố cùng nhau
Số hoàn hảo, cặp số hoàn
hảo
UCLN
Khác 2
Liên quan đến mảng
Tìm kiếm
Tiềm kiếm tuần tự
Tìm kiếm nhị phân
Sắp xếp
Chọn trực tiếp (selection S)
Nổi bọt (Bubble S)
Chèn trực tiếp (Insertion S)
Duyệt mảng khác 3
Liên quan đến xâu kí tự
Xóa dấu cách thừa
Sửa lỗi về dấu ngắt câu
Khác 4...
Khác 1
3
Xóa dấu cách thừa trong xâu Bài toán
o INPUT: S (xâu kí tự biểu thị một đoạn văn bản);
o OUTPUT: S (xâu S không chứa dấu cách thừa}
Procedure DeleteRedudantSpaces(var S: string);
var k : byte;
Begin
repeat
k := pos(‘ ’,S); {tìm vị trí 2 dấu cách trong S}
if k > 0 then delete(S, k, 1);
until k=0;
End;
9/17/2017NCT.FIT.HNUE 27
Sửa lỗi văn phạm về ngắt dấu trong câu Bài toán
o INPUT: S (xâu kí tự biểu thị một đoạn văn bản);
o OUTPUT: S (xâu S không chứa lỗi dấu ngắt}
o Giả sử chỉ xét dấu phẩy
Procedure FixSyntaxErrors(var S: string);
var k, err : byte;
Begin
{xóa dấu cách trước dấu phẩy}
repeat k := pos(‘ ,’,S); if k > 0 then delete(S, k, 1); until k=0;
{chỉ để duy nhất 1 dấu cách sau dấu phẩy}
repeat k := pos(‘, ’,S); if k > 0 then delete(S, k+1, 1); until k=0;
repeat k := pos(‘,’,S); err := 0;
if (k > 0) and (s[k+1] <> #32) then err := 1;
if err = 1 then Insert(‘ ’, S,k) ;
until err=0;
End; 9/17/2017NCT.FIT.HNUE 28
Sửa lỗi văn phạm về ngắt dấu trong câu Bài toán
o INPUT: S (xâu kí tự biểu thị một đoạn văn bản);
o OUTPUT: S (xâu S không chứa lỗi dấu ngắt}
Procedure FixSyntaxErrors(c :char; var S: string);
var k, err : byte;
Begin {xóa dấu cách trước dấu c}repeat k := pos(#32+c,S); if k > 0 then delete(S, k, 1);
until k=0;
{chỉ để duy nhất 1 dấu cách sau dấu c}
repeat k := pos(c +#32+#32,S); if k > 0 then delete(S, k+1, 1);
until k=0;
repeat k := pos(c,S); err := 0;
if (k > 0) and (s[k+1] <> #32) then err := 1;
if err = 1 then Insert(#32, S,k) ;
until err=0;
End; 9/17/2017NCT.FIT.HNUE 29
Sửa lỗi văn phạm về ngắt dấu trong câu Bài toán
o INPUT: S (xâu kí tự biểu thị một đoạn văn bản);
o OUTPUT: S (xâu S không chứa lỗi dấu ngắt}
Gọi thực hiện:
o FixSyntaxErrors(‘,’, S);
o FixSyntaxErrors(‘.’, S);
o FixSyntaxErrors(‘;’, S);
o .....
Gọi thực hiện cách 2
Const dau[1..?] of char = (‘.’, ‘,’, ‘;’, ‘:’, ‘!’, ‘?’);
Khi đó:
for i := 1 to 6 do FixSyntaxError(dau[i], S);
9/17/2017NCT.FIT.HNUE 30
KHÁC 4
Bài toán về thống kê kí tự, từ, câu,
ví dụ:
o Đếm số dấu cách
o Đếm số từ
o Tìm từ có độ dài cho trước
o Tìm số từ cụ thể nào đó
o Tìm câu có độ dài dài nhất
o ....
9/17/2017NCT.FIT.HNUE 31
HỆ THỐNG KIẾN THỨC ĐÃ HỌC
NCT.FIT.HNUE 32
Các thuật toán
Liên quan đến các cấu trúc điều khiển
Số nguyên tố, cặp số nguyên tố cùng nhau
Số hoàn hảo, cặp số hoàn
hảo
UCLN
Khác 2
Liên quan đến mảng
Tìm kiếm
Tiềm kiếm tuần tự
Tìm kiếm nhị phân
Sắp xếp
Chọn trực tiếp (selection S)
Nổi bọt (Bubble S)
Chèn trực tiếp (Insertion S)
Duyệt mảng khác 3
Liên quan đến xâu kí tự
Xóa dấu cách thừa
Sửa lỗi về dấu ngắt câu
Khác 4...
Khác 1
4
KHÁC 1
Chương trình con
1) Kiến thức: phân biệt được
o Thủ tục và hàm
o Biến toàn cục và biến địa phương
o Tham biến và tham trị
o ....
o 2) Thuật toán & bài toán: Tất cả các thuật toán giải
quyết bài toán dựa trên ý tưởng chia để trị. Nói cách khác
là lập trình sử dụng CTC để phân tích bài toán cần giải
thành các bài toán con
9/17/2017NCT.FIT.HNUE 33
1.1. Ngôn ngữ C/C++ và các môi trường lập trình C/C++
1.2. Cấu trúc một chương trình C/C++
1.3. Kiểu dữ liệu, hằng, biến, biểu thức và mảng
Giới thiệu ngôn ngữ lập trình C/C++
.
Ngôn ngữ C/C++
và các môi trường lập trình C/C++
• C được B.Kernighan & D.Ritchie (1978) thiết kế tại phòng thí
nghiệm Bell, AT&T để viết hệ điều hành UNIX.
• ANSI C (1990, viện tiêu chuẩn quốc gia Mỹ) ra đời nhằm chuẩn
hóa C.
• C++ là ngôn ngữ mở rộng của C được Stroustrup sáng lập để
cho phép lập trình hướng đối tượng (OOP - Object oriented
programming), để có thể viết các phần mềm hệ thống và các
phần mềm thương mại cho mọi hệ điều hành.
• Hãng Borland phát triển cả hai môi trường Turbo C/C++ và
Borland C/C++.
Giới thiệu ngôn ngữ lập trình C/C++
NCT.FIT.HNUE 36
• Microsoft: Visual Basic và Visual C++; Cho phép lập trình trực
quan song song để phát triển ứng dụng trên nền của hệ điều 32
bit.
• Borland: Delphi cạnh tranh với Visual Basic của Microsoft.
Delphi là phiên bản hướng đối tượng cho ngôn ngữ Pascal và
tích hợp cả lập trình C++ Builder.
• Borland: C++ Builder Project Union để cạnh tranh với Visual
C++; RAD (Rapid Application Development).
• SUN: JAVA của Sun là “phiên bản C++” được thiết kế lại hợp
lý hơn, có khả năng chạy trên nhiều nền tảng;
• Microsoft: .NET; C# trong Visual Studio .NET. (C# đối ứng
Java).
Các môi trường lập trình trên ngôn ngữ lập trình C/C++
NCT.FIT.HNUE 37
• Microsoft đã tạo ra ngôn ngữ C# mới với các tính năng tương tự
như JAVA nhưng chỉ chạy trên nền Windows.
• Microsoft rất sáng tạo khi dùng khái niệm Studio cho bộ công cụ
lập trình Visual Studio của họ.
• Các công ty đua nhau bắt chước dùng khái niệm Studio, trong đó
có Sun, Oracle, và Borland.
• Borland ngừng phát triển C++ Builder cho 32 bit và đổi sang ủng
hộ Microsoft .NET. Họ phát triển Borland Developer Studio
(BDS) từ 2006.
• Borland International Delphi Inprise Jbuilder
Borland Software Corporation.
Bình luận về các hãng phát triển môi trường lập trình
NCT.FIT.HNUE 38
• C language: D. Ritchie, the BELL Telephone Laboratories USA,
1972, to write an operation system known as UNIX, has become
popular language among the professional users.
• C++ language: Stroustrup, the BELL Telephone Laboratories
USA, 1980, “Object Oriented Program”, has become popular
language among the professional software experts for developing
specialized software.
• JAVA: developed language employing the advantages of internet,
1990.
• C#: Hejlsberg, Microsoft, 2006, for the Common Language
Infrastructure.
Kết luận về C/C++
NCT.FIT.HNUE 39
NCT.FIT.HNUE 40
.
Cấu trúc chương trình C/C++
Ví dụ chương trình C/C++ đơn giản
Bài toán: Lập trình tính chu vi và diện tích của 3 hình tròn biết bán
kính là số thực dương nhập từ bàn phím.
Chương trình gồm 4 phần:
1) Khai báo các thư viện chương trình (từ khóa #include) và các
hằng (#define)
2) Khai báo các hàm (tự định nghĩa) sẽ sử dụng trong chương trình
3) Hàm main(): chương trình chính
4) Định nghĩa (xây dựng) các hàm đã được khai báo.
Cấu trúc một chương trình trên C /C++
NCT.FIT.HNUE 42
#include <iostream.h>
#include <conio.h>
#include <iomanip.h>
#define PI 3.14
float cv(float r) {return 2*PI*r;}
double dt(float);
int main() {
float r1, r2, r3; clrscr();
cout<<"Nhap cac ban kinh r1, r2, r3: "; cin >> r1 >> r2 >> r3;
cout<<setiosflags(ios::showpoint)<<setprecision(3);
cout<<"CV, DT hinh tron 1: " <<cv(r1)<<"\t"<<dt(r1)<<endl;
cout<<"CV, DT hinh tron 2: " <<cv(r2)<<"\t"<<dt(r2)<<endl;
cout<<"CV, DT hinh tron 3: " <<cv(r3)<<"\t"<<dt(r3)<<endl;
getch(); return 0; }
double dt(float r){ return PI*r*r; }
Cấu trúc một chương trình trên C
NCT.FIT.HNUE 43
Trong môi trường
TC 3.0
#include <iostream>
#include <conio.h>
#include <iomanip.h>
#define PI 3.14
using namespace std;
float cv(float r) {return 2*PI*r;}
double dt(float);
int main() {
float r1, r2, r3; system("cls");
cout<<"Nhap cac ban kinh r1, r2, r3: "; cin >> r1 >> r2 >> r3;
cout<<setiosflags(ios::showpoint)<<setprecision(3);
cout<<"CV, DT hinh tron 1: " <<cv(r1)<<"\t"<<dt(r1)<<endl;
cout<<"CV, DT hinh tron 2: " <<cv(r2)<<"\t"<<dt(r2)<<endl;
cout<<"CV, DT hinh tron 3: " <<cv(r3)<<"\t"<<dt(r3)<<endl;
system(“pause”); return 0; }
double dt(float r){ return PI*r*r; }
Cấu trúc một chương trình trên C
NCT.FIT.HNUE 44
Trong môi trường
DEV C++ 4.9
#include <iostream.h>
#include <conio.h>
#include <iomanip.h>
#define PI 3.14
float cv(float r) {return 2*PI*r;}
double dt(float);
void main() {
float r1, r2, r3;
cout<<"Nhap cac ban kinh r1, r2, r3: "; cin >> r1 >> r2 >> r3;
cout<<setiosflags(ios::showpoint)<<setprecision(3);
cout<<"CV, DT hinh tron 1: " <<cv(r1)<<"\t"<<dt(r1)<<endl;
cout<<"CV, DT hinh tron 2: " <<cv(r2)<<"\t"<<dt(r2)<<endl;
cout<<"CV, DT hinh tron 3: " <<cv(r3)<<"\t"<<dt(r3)<<endl;
}
double dt(float r){ return PI*r*r; }
Cấu trúc một chương trình trên C
NCT.FIT.HNUE 45
Trong môi trường
C-Free 4.0
• cin >> tên biến: nhập giá trị cho biến từ bàn phím. Trong đó kí
pháp >> là toán tử vào
• cout << “thông báo”: đưa ra màn hình thông báo
• cout << biểu thức: đưa ra màn hình giá trị của biểu thức. Kí pháp
<< là toán tử ra
Vào/ra dữ liệu trong C++
NCT.FIT.HNUE 46
• Ví dụ: Chuyển hệ cơ số 2 sang hệ 10
1011 = 1 × 23 + 0 × 22 + 1 × 21 + 1 × 100 = 11 (hệ 10)
• Thuật toán
Input: S, a
Output: M
• Bước 1: Nhập S, a (S là mảng các số (bit))
• Bước 2: M 0; n số chữ số của S;
• Bước 3: Với mỗi i = 1, 2, ..,, n thực hiện lệnh:
M M + S[i]*an-i-1
• Bước 4: Đưa ra M
Chuyển đổi một số ở hệ cơ số bất kì sang hệ 10
NCT.FIT.HNUE 47
• Ví dụ:
1011 = 1 × 23 + 0 × 22 + 1 × 21 + 1 × 100 = 11 (hệ 10)
• Lập chương trình
#include <iostream.h>
#include <math.h>
void main()
{ int a= 2;
int s[10]={1,0,1,1};
int n=4;
double m=0;
for(int i=0;i<n;i++) m+=double(s[i])*pow(2,n-i-1);
cout<<m<<endl;
}
Chuyển đổi một số ở hệ cơ số bất kì sang hệ 10
NCT.FIT.HNUE 48
• Ví dụ: Chuyển một số từ hệ 10 sang hệ 2
11 = 1011
• Thuật toán
Input: N10, a
Output: S
• Bước 1: Nhập N, a
• Bước 2: Nếu N = 0 thì Đưa ra 0 và kết thúc thuật toán;
• Bước 3: m := 0 ; (chỉ số của mảng S)
• Bước 4: Lặp các công việc sau khi N > 0
o4.1. r N mod a;
o4.2. m m+1; S[m] r;
o4.2. N N div a;
• Bước 5: Đưa ra S theo thứ tự từ m đến 1;
Chuyển đổi một số ở hệ cơ 10 sang hệ cơ số bất kì
NCT.FIT.HNUE 49
• Chương trình
#include <iostream.h>
#include <math.h>
void main()
{ int a=2, N, m=0,r;
int S[10];
cout<<"N="; cin>>N;
while (N>0)
{ r=N%a; S[++m]=r;
N=N/a;
}
for(int i=m;i>0;i--) cout<<S[i]; cout<<endl;
}
Chuyển đổi một số ở hệ cơ 10 sang hệ cơ số bất kì
NCT.FIT.HNUE 50
Kiểu dữ liệu, hằng, biến và biểu thức
• Các kiểu dữ liệu cơ bản trong ngôn ngữ C/C++
Kiểu dữ liệu
NCT.FIT.HNUE 52
stt Kiểu Phạm vi Kích thước Ghi chú
1 char 1B 0-31
32-127
128-255
signed char -128-127
unsigned char 0-255
2 int 2B -32768-32767
unsigned int 0-65535
long (int) 4B -2.147.483.648
2.147.483.657
unsigned long (int) 0 4.294.967.295
3 float 4B 3.4E-38-3.4E+38 chính xác đơn(8)
double 8B 1.7E-308-1.7E+308 chính xác kép(16)
long double 10B 3.4E-4932-1.1E4932 số cs có nghĩa(18)
• Khai báo
#define tên_hằng giá_trị //Cách khai báo của C
const tên_hằng = giá_trị; // Cách khai báo của C++
• Ví dụ:
#define heso 10
#define he8 0347
#define he16 0xA9
const PI = 3.14;
const longint = 12345678;
Hằng
NCT.FIT.HNUE 53
• Chú ý về hằng ký tự
– ‘a’ là hằng ký tự được lưu trữ trong 1 bye; có giá trị là mã
ASCCI của chữ a, tức giá trị 97 ở hệ 10; hay 0141 ở hệ 8.
– Giá trị của ‘9’ là ‘9’-‘0’ = 57-48
– Các hằng ký tự đặc biệt: ‘\n’ (xuống dòng); ‘\0’ (ký tự NULL:
\0); ‘\t’ (Tab); ‘\b’ (Back space); ‘\r’ (CR về đầu dòng); ‘\f’ (LF
sang trang).
– Phân biệt ‘0’ là hằng ký tự ứng với chữ số 0 , có giá trị 48; ‘\0’
là hằng ký tự ứng với ký tự NULL có giá trị 0
– Hằng ký tự thực chất là số nguyên.
Ví dụ lệnh printf(“%c, %c”, 65,66); sẽ in ra AB
– Phân biệt hằng ký tự và hằng xâu ký tự: ‘a’ khác “a” (gồm ‘a’
và ký tự NULL).
Hằng
NCT.FIT.HNUE 54
• Biến
– Khai báo như sau: tên_kiểu tên_biến;
– Vị trí khai báo, phạm vi ảnh hưởng: vị trí bất kì, khai báo trước
khi sử dụng; ảnh hưởng trong khối nơi biến được khai báo.
– Đặc biệt : int x = 10; Lấy địa chỉ biến: &tên_biến
• Ví dụ
void simple()
{ int n; // khai bao cuc bo
for(int i=0;i<10;i++) // cho phep khai bao i trong for
{ int m;
if (i&1) n+=1 }
m = n/2; // sai
n = i; // sai }
Biến
NCT.FIT.HNUE 55
• Biểu thức là một dãy các biến và hằng được nối với nhau bởi các
toán tử (phép toán) thích hợp.
• Phép toán số học:
o 2 ngôi: +, -, *, / , % (chia lấy phần dư)
o 1 ngôi: - (phép lấy đối)
• Phép toán bít
o & : and
o | : or
o ^ : xor (đồng tính bị huỷ, khác tính thì tồn tại)
o 1 ^ 1 = 0 ^ 0 = 0; 1 ^ 0 = 0 ^ 1 = 1)
• Phép toán quan hệ
==, !=, > , <, >=, <=
Biểu thức
NCT.FIT.HNUE 56
• Phép toán logic
o ! : not
o && : and
o || : or
• Phép toán tăng giảm:
o ++n; n++ ;
o --n; n--;
• Thứ tự ưu tiên các phép toán
• Biểu thức điều kiện
o varible = condition? value1:value2
o Ví dụ: x = 4>5? 10:100;
Biểu thức
NCT.FIT.HNUE 57
() []
! ~ & - ++ --
* / %
+ -
<< >>
< <= > >=
== !=
&
^
|
&&
||
?:
= += -= *= /= <<=
>>= &= ^= |=
• Bảng chân lí
Kiểu dữ liệu và biểu thức
NCT.FIT.HNUE 58
a b a & b a | b a xor b not a
1 1 1 1 0 0
1 0 0 1 1 0
0 1 0 1 1 1
0 0 0 0 0 1
• Ví dụ Giả sử ta có khai báo:
int a;
float b;
• Khi đó, ta có thể xem số nguyên a như một số thực bằng cách:
(float)a; // trong C
float(a); // trong C++
• Chú ý :
– m%n = phần dư của m chia cho n
– m/n = là phần nguyên của m chia cho n
– ((float) m)/n = kết quả của m chia cho n
– int(r+0.5) = giá trị int
Phép chuyển kiểu
NCT.FIT.HNUE 59
• Khai báo mảng.
– kiểu_mảng tên_mảng[kíchthước]
– kiểu_mảng tên_mảng[kíchthước1] [kíchthước2]
• Ví dụ
– int a[10];
– float b[5][7];
• Truy cập mảng
– Chỉ số của mảng có thứ tự từ 0 đến n - 1.
• Khởi tạo mảng khi khai báo
– int a[5] = {3, 6, 12, 1, 45};
– float b[] = {3.14, 3.1416, 2.54, 2.55, 9.5};
– int p[2, 3] = { (3, 6, 12) , (1, 4, 5)};
Kiểu dữ liệu mảng
NCT.FIT.HNUE 60
End of chapter 1
NCT.FIT.HNUE