You are on page 1of 33

Luyện tậ p

Ô n lạ i cá c cấ u trú c điều khiển


Kỹ thuậ t lậ p trình
Kinh nghiệm lậ p trình
Mộ t số bà i tậ p

1
Că n củ a mộ t số chính phương
#include <iostream>
 Nhậ p và o mộ t số chính #include <cmath>
using namespace std;
phương (unsigned long int main()
{
long) unsigned long long x,
y;
Tính cin >> x;
y = sqrt(x);
cout << y;
}
Că n củ a mộ t số chính phương
#include <iostream>
Dịch
  chương trình bình thườ ng
#include <cmath>
(khô ng đặ t chế độ -O2) using namespace std;
int main()
Chạy chương trình và nhậ p và o :
{
9007199515875289
unsigned long long x,
Kết quả in ra : y;
cin >> x;
94906266
y = sqrt(x);
Kết quả đú ng cout << y;
94906267 }
Sai số tính toá n
Nếu khô ng có chỉ dẫ n đặ c biệt, hà m sqrt(x) nhậ n và o đố i số x là
kiểu double (15-16 chữ số có nghĩa)
Vớ i x nhậ p và o bằ ng 9007199515875289, việc chuyển đổ i từ
unsigned long long sang double đã có sai số ngay từ trướ c khi
tính că n
Giả i phá p, ép kiểu cho x thà nh long double trướ c khi tính că n…

4
Că n củ a mộ t số chính phương
#include <iostream>
Dịch
  chương trình bình thườ ng (khô ng
#include <cmath>
đặ t chế độ -O2) using namespace std;
int main()
Chạy chương trình và nhậ p và o :
{
9007199515875289
unsigned long long x, y;
Kết quả in ra đú ng cin >> x;
94906267 y = sqrt((long
double)x);
(Đã kiểm thử bằ ng vò ng lặ p cho mọ i số cout << y;
chính phương unsigned long long ) }
Độ dà i phủ
 Viết chương trình nhậ p và o 4 số thự c trong
đó và
Tính độ dà i phầ n trụ c số phủ bở i hai đoạ n và

6
Nếu
  , độ dà i phầ n phủ
bằ ng tổ ng độ dà i hai 𝑎  𝑏  𝑐  𝑑 

khoả ng:
Nếu , phầ n phủ là mộ t
khoả ng, độ dà i bằ ng
𝑎  𝑐  𝑏  𝑑 
điểm cự c phả i – điểm
cự c trá i
7
#include <iostream>
using namespace std;
int main()
{
double a, b, c, d;
cin >> a >> b >> c >> d;
if (b < c || d < a) cout << b - a + d - c; //[a, b]∩[c, d] = ∅
else //[a, b]∩[c, d] ≠ ∅
{
a = a < c ? a : c; //a = min(a, c)
b = b > d ? b : d; //b = max(b, d)
cout << b - a;
}
}

8
Trung bình cộ ng
 Nhậ p và o hai số nguyên có giá trị tuyệt đố i
Tính trung bình cộ ng củ a hai số

9
Trung bình cộ ng
#include <iostream>
Cẩ n thậ n vớ i phép “/”
#include <iomanip>
using namespace std; Nếu hai toá n hạ ng kiểu số
int main()
nguyên, máy sẽ dịch thà nh
{
int a, b; phép chia nguyên
cin >> a >> b;
Ví dụ a = 2, b = 3 sẽ cho kết
cout << fixed <<
setprecision(1); quả bằ ng 2
cout << (a + b) / 2; //Sai
}

10
Trung bình cộ ng
#include <iostream> Toá n tử ép kiểu
#include <iomanip>
Viết double(x) hay (double)x trong
using namespace std;
biểu thứ c buộ c máy hiểu x là kiểu
int main()
{ double trướ c khi tính biểu thứ c
int a, b;
cin >> a >> b;
cout << fixed << setprecision(1);
cout << double(a + b) / 2;
}

11
#include <iostream> #include <iostream>
#include <ipmanip> #include <ipmanip>
using namespace std; using namespace std;
int main() int main()
{ {
int a, b; int a, b;
cin >> a >> b; cin >> a >> b;
cout << fixed << cout << fixed <<
setprecision(1); setprecision(1);
cout << double(a + b) / 2; cout << (double(a) + b) / 2;
} }

Tính a + b kiểu int, ép É p a thà nh double, tính


thà nh double trướ c khi a + b kiểu double rồ i
chia 2 chia 2
12
#include <iostream> #include <iostream>
#include <iomanip> #include <iomanip>
using namespace std; using namespace std;
int main() int main()
{ {
int a, b; int a, b;
cin >> a >> b; cin >> a >> b;
cout << fixed << cout << fixed <<
setprecision(1); setprecision(1);
cout << double(a + b) / 2; cout << (double(a) + b) / 2;
} }

Nhậ p và o a = 2, b = 5 Nhậ p và o a = 2, b = 5
In ra 3.5 (đú ng) In ra 3.5 (đú ng)
13
#include <iostream> #include <iostream>
#include <iomanip> #include <iomanip>
using namespace std; using namespace std;
int main() int main()
{ {
int a, b; int a, b;
cin >> a >> b; cin >> a >> b;
cout << fixed << cout << fixed <<
setprecision(1); setprecision(1);
cout << double(a + b) / 2; cout << (double(a) + b) / 2;
} }

Nhậ p và o: Nhậ p và o:
a = 2000000000 a = 2000000000
b = 2000000000 b = 2000000000
In ra -147483648.0 (sai) In ra 2000000000.0 (đú ng) 14
Quy tắ c tính phép toá n số nguyên
Xét biểu thứ c , trong đó là mộ t trong nhữ ng phép toá n +, - , *, /, %
 
int int int
int int int
int unsigned int unsigned int
int unsigned int unsigned int
unsigned int int unsigned int
unsigned
unsigned int
int int int
unsigned unsigned
unsigned int
int
unsigned
long long int unsigned
long long int unsigned
long long int
long long int unsigned
long long long
int int unsigned
long long long
int int
unsigned
long long
long long
int int long long
unsigned long long
int int unsigned
unsigned long
long long
long int
int
unsigned
unsigned long
long long
long int
int unsigned
long long
long long
int int unsigned
unsigned long
long long
long int
int
unsigned long long int unsigned long long int unsigned long long int

15
Xét biểu thứ c , trong đó là mộ t trong nhữ ng phép toá n +, - , *, /, %
 
int int int
int int int
int unsigned int unsigned int
int unsigned int unsigned int
unsigned int int unsigned int
unsigned
unsigned int
int int int
unsigned unsigned
unsigned int
int
unsigned
long long int unsigned
long long int unsigned
long long int
long long int unsigned
long long long
int int unsigned
long long long
int int
unsigned
long long
long long
int int long long
unsigned long long
int int unsigned
unsigned long
long long
long int
int
unsigned
unsigned long
long long
long int
int unsigned
long long
long long
int int unsigned
unsigned long
long long
long int
int
unsigned long long int unsigned long long int unsigned long long int

Quy tắ c 1: Nếu toá n hạ ng có kiểu nhỏ hơn 32 bit sẽ bị ép thà nh kiểu int
char, short int, unsigned char, unsigned short int => int

16
Xét biểu thứ c , trong đó là mộ t trong nhữ ng phép toá n +, - , *, /, %
 
int int int
int int int
int unsigned int unsigned int
int unsigned int unsigned int
unsigned int int unsigned int
unsigned
unsigned int
int int int
unsigned unsigned
unsigned int
int
unsigned
long long int unsigned
long long int unsigned
long long int
long long int unsigned
long long long
int int unsigned
long long long
int int
unsigned
long long
long long
int int long long
unsigned long long
int int unsigned
unsigned long
long long
long int
int
unsigned
unsigned long
long long
long int
int unsigned
long long
long long
int int unsigned
unsigned long
long long
long int
int
unsigned long long int unsigned long long int unsigned long long int

Quy tắ c 2: Nếu hai toá n hạ ng khá c kiểu, khá c kích thướ c (số bit), kiểu toá n hạ ng nhỏ
hơn bị ép thà nh kiểu toá n hạ ng lớ n hơn
unsigned int + long long int = long long int + long long int = long long int

17
Xét biểu thứ c , trong đó là mộ t trong nhữ ng phép toá n +, - , *, /, %
 
int int int
int int int
int unsigned int unsigned int
int unsigned int unsigned int
unsigned int int unsigned int
unsigned
unsigned int
int int int
unsigned unsigned
unsigned int
int
unsigned
long long int unsigned
long long int unsigned
long long int
long long int unsigned
long long long
int int unsigned
long long long
int int
unsigned
long long
long long
int int long long
unsigned long long
int int unsigned
unsigned long
long long
long int
int
unsigned
unsigned long
long long
long int
int unsigned
long long
long long
int int unsigned
unsigned long
long long
long int
int
unsigned long long int unsigned long long int unsigned long long int

Quy tắ c 3: Nếu hai toá n hạ ng cù ng kiểu, biểu thứ c tính theo kiểu đó

18
Xét biểu thứ c , trong đó là mộ t trong nhữ ng phép toá n +, - , *, /, %
 
int int int
int int int
int unsigned int unsigned int
int unsigned int unsigned int
unsigned int int unsigned int
unsigned
unsigned int
int int int
unsigned unsigned
unsigned int
int
unsigned
long long int unsigned
long long int unsigned
long long int
long long int unsigned
long long long
int int unsigned
long long long
int int
unsigned
long long
long long
int int long long
unsigned long long
int int unsigned
unsigned long
long long
long int
int
unsigned
unsigned long
long long
long int
int unsigned
long long
long long
int int unsigned
unsigned long
long long
long int
int
unsigned long long int unsigned long long int unsigned long long int

Quy tắ c 4: Nếu hai toá n hạ ng khá c kiểu, cù ng kích thướ c (số bit), biểu thứ c tính
theo kiểu toá n hạ ng khô ng dấ u

19
Quy tắ c tính phép toá n số thự c
Mộ t phép toá n tuâ n theo quy tắ c tính số thự c nếu nó có ít nhấ t mộ t toá n hạ ng là số thự c
 
Xét biểu thứ c , trong đó là mộ t trong nhữ ng phép toá n +, - , *, /
Nếu hai toá n hạ ng khá c kiểu, toá n hạ ng thuộ c kiểu nhỏ hơn sẽ bị ép thà nh kiểu củ a toá n
hạ ng cò n lạ i
Nếu hai toá n hạ ng cù ng kiểu, biểu thứ c sẽ tính theo kiểu toá n hạ ng
Ví dụ
float + double = double
long double * double = long double
float - long double = long double

20
Trung bình cộ ng
 Nhậ p và o hai số nguyên có giá trị tuyệt đố i
Tính trung bình cộ ng củ a hai số
Chỉ ra lỗ i (nếu có củ a cá c chương trình sau)

21
#include <iostream> #include <iostream>
#include <iomanip> #include <iomanip>
using namespace std; using namespace std; Sai
int main()
Sai int main()
{ Phép chia {
Phép chia
nguyên int a, b;
int a, b; nguyên
cin >> a >> b;
cin >> a >> b;
cout << fixed <<
cout << fixed << setprecision(1);
setprecision(1);
cout << (long long)(a + b) / 2;
cout << (a + b) / 2; }
}
Cộ ng trà n số
Cộ ng trà n số

22
#include <iostream>
#include <iomanip>
using namespace std; Đú ng
int main()
{
int a, b; Phép chia
thự c
cin >> a >> b;
cout << fixed << setprecision(1);
cout << ((long long)a + b) / 2.0;
} Cộ ng
long long + int = long long
23
#include <iostream>
using namespace std;
int main()
Đú ng
{
int a, b; Phép chia
cin >> a >> b; thự c

cout << ((long long)a + b) / double(2);


}
Cộ ng
long long + int = long long
24
#include <iostream>
using namespace std;
Đú ng
int main()
{
int a, b; Phép chia
thự c
cin >> a >> b;
cout << (double(a) + b) / 2;
} Phép cộ ng thự c, số chữ số có nghĩa
củ a double đủ chứ a kết quả đú ng
25
#include <iostream>
using namespace std;
Đú ng
int main()
{
int a, b; Phép chia
thự c
cin >> a >> b;
cout << ((long double)a + b) / 2;
} Phép cộ ng thự c, số chữ số có nghĩa củ a
long double đủ chứ a kết quả đú ng
26
#include <iostream>
#include <iomanip>
using namespace std; Đú ng
int main()
{ ép kiểu thà nh đú ng
wow! Tự tìm hiểu thêm!
int a, b; Phép chia
thự c
cin >> a >> b;
cout << fixed << setprecision(1);
cout << unsigned(a + b) / 2.0;
Cộ ng trà n số
}
27
Thự c hà nh dò kiểu biểu thứ c
#include <iostream>
#include <typeinfo>
using namespace std; typeid(biến).name()
int main() typeid(kiểu).name()
{ Trả về ký tự mô tả kiểu
int a;
long long b;
cout << "type of a: " << typeid(a).name() << endl;
cout << "type of b: " << typeid(b).name() << endl;
cout << "type of a + b: " << typeid(a + b).name() << endl;
}

28
Toá n tử ép kiểu
#include <iostream>
using namespace std; Lệnh j = i + 1 trà n số do phép tính
int main()
i + 1 tính theo kiểu int
{
int i; Có thể khắ c phụ c bằ ng cá ch khai
long long j;
i = LONG_MAX; bá o i thuộ c kiểu long long. Tuy
j = i + 1;
nhiên điều này có thể gây ra nhiều
cout << j;
} sự thay đổ i phiền phứ c…
29
Toá n tử ép kiểu
#include <iostream>
Để trá nh lỗ i trà n số họ c, khi biết chắ c kiểu
using namespace std;
int main() kết quả , có thể ép trình dịch hiểu mộ t toá n
{ hạ ng phả i thuộ c mộ t kiểu nà o đó
int i;
long long j; É p kiểu
i = LONG_MAX; (Kiểu)toá n hạ ng
j = (long long)i + hoặ c Kiểu (toá n hạ ng)
1;
Chú ý: Thay bằ ng j = (long long)(i + 1) vẫ n bị
cout << j;
} lỗ i trà n số do lỗ i trà n nằ m ở phép cộ ng

30
Cá c thô ng tin về kiểu
Để hiểu rõ cá c thô ng tin về mộ t kiểu dữ liệu,
C++ cung cấ p mộ t mẫ u lớ p numeric_limits
Viết std::numeric_limits<Kiểu>::Phương thứ c
để hiện thô ng tin củ a Kiểu.

31
#include <iostream>
#include <limits> Định nghĩa kiểu T là long long
typedef long long T;
using namespace std; In kiểu bool dạ ng false/true thay vì 0/1
int main ()
{ Kích thướ c kiểu tính bằ ng byte
cout << boolalpha;
Giá trị nhỏ nhấ t
cout << "Size in bytes: " << sizeof(T) << endl
<< "Minimum: " << numeric_limits<T>::min() << endl
<< "Maximum: " << numeric_limits<T>::max() << endl
<< "Signed: " << numeric_limits<T>::is_signed << endl
<< "Non-sign bits: " << numeric_limits<T>::digits << endl
<< "Has inf: " << numeric_limits<T>::has_infinity << endl;
}

32
Thông tin về kiểu long long
Size in bytes: 8
Minimum: -9223372036854775808
Maximum: 9223372036854775807
Signed: true
Non-sign bits: 63
Has inf: false

33

You might also like