Bài giảng Tin học đại cương - Phần 2: Ngôn ngữ lập trình C (Tiết 2)
11/24/2010
Nội dung
Biến
Hằng
2.2 Biến, kiểu dữ liệu và các
toán tử toán học
Các kiểu dữ liệu cơ bản trong C
Biểu thức toán học
Một số hàm toán học trong C
Toán tử logic và toán tử trên bit
Độ ưu tiên của các toán tử
2.2 Biến, hằng, kiểu dữ liệu
2.2 Biến, hằng, kiểu dữ liệu
Biến (variable) là đại lượng mà giá trị có thể thay đổi trong
chương trình.
Định danh hợp lệ
wiggles
cat2
Hot_Tub
taxRate
_kcab
Định danh không hợp lệ
$Z]**
2cat
Hot-Tub
tax rate
don‘t
int
Biến phải được khai báo trước khi sử dụng.
Tên biến được đặt theo quy tắc định danh.
Quy tắc đặt định danh (identifier):
Gồm có: chữ cái, chữ số và dấu gạch dưới “_”
Bắt đầu của định danh phải là chữ cái hoặc dấu gạch
dưới, không được bắt đầu định danh bằng chữ số.
Ngôn ngữ C phân biệt chữ hoa và chữ thường !
Định danh do người lập trình đặt không được trùng với
từ khóa, và các định danh khác.
sum, Sum, sUm, suM, SUm là các tên biến khác nhau
1
11/24/2010
2.2 Biến, hằng, kiểu dữ liệu
2.2 Biến, hằng, kiểu dữ liệu
Độ dài tên biến không giới hạn, tuy nhiên chỉ có 31 ký tự
đầu là có ý nghĩa.
Các ký tự, số hoặc xâu ký tự được
gọi là một hằng (constant)
Vd. 5, 5.6, 'A',
"programming is fun\n"
Không nên đặt tên biến quá dài
Nên đặt tên biến có ý nghĩa
Biểu thức mà toán hạng chỉ gồm
các hằng số được gọi là biểu thức
hằng
VD. Biến chứa thông tin về điểm thi nên đặt là diemThi
hoặc diemThiTHDCthay vì chỉ đặt tên là d, I, x …
VD. 4+5-6.1
Dùng quy tắc Camel: vd, soSinhVien, diemThi
Dùng dấu gạch nối: vd, so_sinh_vien, diem_thi
2.2 Biến, hằng, kiểu dữ liệu
2.2 Biến, hằng, kiểu dữ liệu
Kiểu số nguyên cơ bản : int
10, ‐23, 0 là các hằng số nguyên
Các kiểu dữ liệu cơ bản trong C : int, float,
double, char
Mặc định trong C các hằng số nguyên biểu diễn bằng hệ cơ
số 10.
Ngoài hệ cơ số 10, hằng số nguyên còn được biểu diễn
bằng hệ cơ số 8 (octal) và hệ sơ số 16 (hexa)
. Hệ cơ số 8 : bắt đầu bằng số 0, vd 050, 045
. Hệ cơ số 16: bắt đầu bằng 0x, vd 0x5F, 0xE5
In ra dùng %d, %i , %o, %#o, %x, %#x
printf("%d %d %d\n",50, 050, 0x50);
In ra : 50 40 80
2
11/24/2010
2.2 Biến, hằng, kiểu dữ liệu
2.2 Biến, hằng, kiểu dữ liệu
Các kiểu số nguyên khác: char, short, long, long long
Kích thước lưu trữ
Số nguyên có dấu và số nguyên không dấu: signed và
unsigned
Mặc định các kiểu số nguyên là signed
Macintosh
Metrowerks CW
(Default)
IBM PC
Windows XP
Linux on a PC Windows NT
ANSI C
Minimum
Khai báo số nguyên không dấu: unsigned
Type
unsigned int, unsigned long,…
char
int
8
8
8
8
32
16
32
32
16
32
64
32
16
32
64
16
16
32
64
Để chỉ ra rõ một hằng số nguyên là không dấu, dùng u
hoặc U ở cuối
short
long
243U, 34u, 343454UL
long long 64
Để chỉ rõ hằng kiểu long ta dùng thêm ký hiệu l hoặc L ở sau
2.2 Biến, hằng, kiểu dữ liệu
2.2 Biến, hằng, kiểu dữ liệu
Kiểu số thực : float
Kiểu số thực mở rộng : double
Sử dụng 64 bit
3., 125.8, và –.0001 là các hằng số thực
3.5e+2, .12e3 là các hằng số thực dưới dạng ký pháp khoa
học
Độ chính xác gấp đôi so với float
Để phân biệt 1 hằng số thực là float thì thêm ký hiệu f
hoặc F ở cuối .34f 45.56F
Kích thước biểu diễn : 32 bit
In ra số thực
%f dưới dạng dấu phảy tĩnh
%e dưới dạng ký pháp khoa học
%g tự điều chỉnh cho dễ nhìn
printf("%f %e %g", .00000012, 5.12, 50000.12);
3
11/24/2010
2.2 Biến, hằng, kiểu dữ liệu
2.2 Biến, hằng, kiểu dữ liệu
Một số hằng ký tự
Ký hiệu
Ý nghĩa
Kiểu ký tự : char
\a
\b
\f
\n
\r
\t
\v
\\
\”
\’
\?
Audible alert
Backspace
‘A’, ‘v’, ‘0’, ‘\n’ là các hằng ký tự
In ra bằng %c
Form feed
Newline
Có thể dùng như một giá trị nguyên (chính là mã
ASCII của ký tự đó)
Carriage return
Horizontal tab
Vertical tab
Backslash
printf("%c %d",'A','A');
Double quote
Single quote
Question mark
2.2 Biến, hằng, kiểu dữ liệu
2.2 Biến, hằng, kiểu dữ liệu
Type
Constant Examples
Printf char
char
'a', '\n'
%c
/* Example 2.2.1
* kich thuoc cac kieu du lieu co ban */
#include <stdio.h>
short int
unsigned short int
int
%hi, %hx, %ho
%hi, %hx, %ho
12, ‐97, 0xFFE0, 0177 %i, %x, %o
int main(void)
{
unsigned int
long int
12u, 100U, 0XFFu
%u, %x, %o
12L, ‐2001, 0xffffL
%li, %lx, %lo
printf("Kieu int %d bytes.\n", sizeof(int));
printf("Kieu char %d bytes.\n", sizeof(char));
printf("Kieu long %i bytes.\n", sizeof(long));
printf("Kieu double %u bytes.\n", sizeof(double));
return 0;
unsigned long int
long long int
12UL, 100ul, 0xffeeUL %lu, %lx, %lo
0xe5e5e5e5LL, 500ll
12ull, 0xffeeULL
%lli, %llx, %llo
%llu, %llx, %llo
unsigned long long
int
}
float
12.34f, 3.1e‐5f
12.34, 3.1e‐5
%f, %e, %g
%f, %e, %g
double
long double
12.341, 3.1e‐5l
%Lf, %Le, %Lg
4
11/24/2010
2.2 Biến, hằng, kiểu dữ liệu
2.2 Biến, hằng, kiểu dữ liệu
/* Example 2.2.2*/
#include <stdio.h>
Khai báo biến
Kiểu_dữ_liệu tên_biến ;
Kiểu_dữ_liệu tên_biến = giá_trị_ban_đầu ;
#define lai_xuat 0.013
int main(void)
int a;
{
float b, c, diem_thi;
double g, pi=3.1415, rad = 3.14;
const int so_thang = 12;
float tien_gui = 10e6;
Khai báo hằng dưới dạng biểu tượng (symbolic constant )
#define TÊN_HẰNG giá_trị
printf("Tien lai 1 nam : %g\n", tien_gui*so_thang*lai_xuat);
return 0;
}
const kiểu_dữ_liệu TÊN_HẰNG = giá_trị ;
Kiểu dữ liệu logic – Boolean
Kiểu _Bool : kiểu logic chỉ có từ bản C99
Kiểu logic trong C :
False tương ứng với 0
Biểu thức trong C
True tương ứng với giá trị ꢀ 0
Kiểu _Bool : được định nghĩa trong <stdbool.h>
Hai giá trị true, false được định nghĩa
Có thể dùng %i để in ra biến kiểu _Bool
•
•
•
•
Biểu thức toán học
Các loại toán tử
Độ ưu tiên của các toán tử
Thay đổi độ ưu tiên của toán tử
_Bool sam = true;
if(sam) printf("TRUE");
else printf("FALSE");
5
11/24/2010
2.2 Biến, hằng, kiểu dữ liệu
2.2 Biến, hằng, kiểu dữ liệu
Toán tử
Ý nghĩa
Kiểu dữ liệu của toán
hạng
Ví dụ
Phép đổi dấu
Số thực hoặc số
nguyên
int a, b;
‐12; ‐a; ‐25.6;
–
Biểu thức toán học : gồm các toán tử và toán hạng
Toán hạng có thể là biến hoặc là hằng số
Toán tử :
Phép toán cộng Số thực hoặc số
float x, y;
5 + 8; a + x;
3.6 + 2.9;
3 – 1.6; a – 5;
ꢁ
nguyên
Phép toán trừ Số thực hoặc số
nguyên
–
Phép toán nhân Số thực hoặc số
nguyên
a * b; b * y;
2.6 * 1.7;
*
Toán tử 1 ngôi: –, +,!
Toán tử hai ngôi : +, –, *, /, % ,…
Trình tự thực hiện theo thứ tự ưu tiên của các toán tử
Phép toán chia Số thực hoặc số
/
10.0/3.0; (bằng 3.33…)
10/3.0; (bằng 3.33…)
10.0/3; (bằng 3.33…)
nguyên
Phép chia lấy
phần nguyên
Phép chia lấy
phần dư
Giữa 2 số nguyên
Giữa 2 số nguyên
/
10/3;
(bằng 3)
%
10%3; (bằng 1)
2.2 Biến, hằng, kiểu dữ liệu
#include <stdio.h> //Example 2.2.3
int main(void)
Độ ưu tiên của toán tử
Độ ưu tiên đề cập đến thứ tự thực thi các toán tử trong C
{
int a = 100;
int b = 2;
int c = 25;
Độ ưu tiên tạo nên cấu trúc phân cấp của loại toán tử này
so với loại toán tử khác khi tính giá trị một biểu thức số học
int d = 4;
int result;
Độ ưu tiên của các toán tử này được thay đổi bởi các dấu
ngoặc đơn trong biểu thức
result = a ‐ b; // trừ
printf ("a ‐ b = %i\n", result);
result = b * c; // nhân
printf ("b * c = %i\n", result);
result = a / c; // chia
printf ("a / c = %i\n", result);
result = a + b * c; // thứ tự thực hiện
printf ("a + b * c = %i\n", result);
printf ("a * b + c * d = %i\n", a * b + c * d);
return 0;
Loại toán tử
Một ngôi
Hai ngôi
Toán tử
Tính kết hợp
Phải đến trái
Trái đến phải
Trái đến phải
Trái đến phải
Phải đến trái
– , ++, – –
^
(pow(x,y) xy)
Hai ngôi
* , / , %
Hai ngôi
+ , –
=
Hai ngôi
}
6
11/24/2010
2.2 Biến, hằng, kiểu dữ liệu
2.2 Biến, hằng, kiểu dữ liệu
Phép toán với số nguyên và toán tử một ngôi
Phép chia module (%)
#include <stdio.h> //Example 2.2.4
int main (void)
{
#include <stdio.h> //Example 2.2.5
int main (void)
{
int a = 25;
int b = 2;
float c = 25.0;
float d = 2.0;
printf ("6 + a / 5 * b = %i\n", 6 + a / 5 * b);
printf ("a / b * b = %i\n", a / b * b);
printf ("c / d * d = %f\n", c / d * d);
printf ("‐a = %i\n", ‐a);
return 0;
int a = 25, b = 5, c = 10, d = 7;
printf ("a %% b = %i\n", a % b);
printf ("a %% c = %i\n", a % c);
printf ("a %% d = %i\n", a % d);
printf ("a / d * d + a %% d = %i\n",
a / d * d + a % d);
return 0;
}
}
2.2 Biến, hằng, kiểu dữ liệu
. Chuyển đổi giữa số nguyên và số thực
// Example 2.2.6
#include <stdio.h>
int main (void)
{
Toán tử chuyển kiểu (type cast operator)
f2 = (float) i2 / 100;
float f1 = 123.125, f2;
int i1, i2 = ‐150;
(int) 29.55 + (int) 21.99
i1 = f1; // floating to integer conversion
printf ("%f assigned to an int produces %i\n", f1, i1);
Hoặc
int(29.55) + int(21.99)
f1 = i2; // integer to floating conversion
printf ("%i assigned to a float produces %f\n", i2, f1);
f1 = i2 / 100; // integer divided by integer
printf ("%i divided by 100 produces %f\n", i2, f1);
f2 = i2 / 100.0; // integer divided by a float
printf ("%i divided by 100.0 produces %f\n", i2, f2);
Chuyển kiểu tự động
f2 = (float) i2 / 100; // type cast operator
printf ("(float) %i divided by 100 produces %f\n", i2, f2);
char int long int float double long double
return 0;
}
7
11/24/2010
Một số hàm toán học trong C
Kí hiệu
toán học
Hàm
Ý nghĩa
Căn bậc 2 của x
Ví dụ
VD1. Viết chương trình tính khoảng cách giữa
hai điểm A(1, 3, 5) và B(0.5, 7, 6.5) trong không
gian 3 chiều
sqrt(x)
sqrt(16.0)bằng 4.0
x
xy
ex
pow(x,y)
exp(x)
log(x)
pow(2,3)bằng 8
exp(1.0)bằng 2.718282
log(2.718282)bằng 1.0
x mũ y
e mũ x
logarithm tự nhiên (cơ số e) ln x
của x
log10(x)
sin(x)
log10(100)bằng 2
sin(0.0)bằng 0.0
cos(0.0)bằng 1.0
tan(0.0)bằng 0.0
ceil(2.5)bằng 3
ceil(-2.5)bằng –2
logarithm cơ số 10 của x
sin của x
log x
sin x
cos x
tg x
cos(x)
tan(x)
ceil(x)
VD2. Viết chương trình tính
cosin của x
tang của x
phần nguyên già của x, tức
x
là số nguyên nhỏ nhất
log3 (56)
không nhỏ hơn x
floor(x)
floor(2.5)bằng 2
phần nguyên non của x, tức
là số nguyên lớn nhất không
lớn hơn x
x
floor(-2.5)bằng –3
Toán tử quan hệ và Logic
Toán tử quan hệ và Logic (tt.)
Toán tử quan hệ : Kiểm tra mối quan hệ giữa hai biến
hay giữa một biến và một hằng
Toán tử Logic: là những ký hiệu dùng để kết hợp hay
phủ định biểu thức chứa các toán tử quan hệ
Toán tử
Ý nghĩa
Toán tử quan hệ
AND: Kết quả là True khi cả 2 điều kiện đều đúng
&&
OR : Kết quả là True khi chỉ một trong hai điều kiện
Toán tử
Ý nghĩa
||
!
là đúng
>
>=
<
Lớn hơn
Lớn hơn hoặc bằng
Nhỏ hơn
NOT: Tác động trên các giá trị riêng lẻ, chuyển đổi
True thành False và ngược lại.
Ví dụ: (5>10) && (7<20)
<=
==
!=
Nhỏ hơn hoặc bằng
Bằng
Không bằng
Những biểu thức dùng toán tử Logic trả về
0 thay cho false và 1 thay cho true
8
11/24/2010
Toán tử Logic nhị phân (tt.)
Toán tử Logic nhị phân
Toán tử logic nhị phân: thực hiện giống toán tử logic
nhưng trên các bit.
Ví dụ
Toán tử
Mô tả
Bitwise AND
( x & y)
Mỗi vị trí của bit trả về kết quả là 1 nếu bit của hai toán
hạng là 1.
• 10 & 15 1010 & 11111010 10
• 10 | 15 1010 | 11111111 15
• 10 ^ 15 1010 ^ 11110101 5
• ~ 10 ~1010 1…11110101 -11
•15 << 3 1111 << 3 1111000
•15 >> 3 1111 >> 3 1
Bitwise OR
( x | y)
Mỗi vị trí của bit trả về kết quả là 1 nếu bit của một
trong hai toán hạng là 1.
Bitwise NOT
( ~ x)
Ðảo giá trị của bit(1 thành 0 và ngược lại).
Bitwise XOR
( x ^ y)
Thực hiện XOR trên 2 bit (cho giá trị 0 nếu 2 bit bằng
nhau, và 1 nếu ngược lại).
<<, >> dịch bit
trái và phải
Độ ưu tiên Toán tử
Trình tự kết hợp
Trái sang phải
Độ ưu tiên giữa các toán tử
(
)
[
]
.
‐>
++
Khi một biểu thức có nhiều loại toán tử thì độ ưu tiên
giữa chúng phải được thiết lập.
‐‐ (dạng hậu tố)
++
+
‐‐
‐
Phải sang trái
!
~
(type)
*
Thứ tự ưu tiên
Kiểu toán tử
&
1
2
3
Số học (Arithmetic)
sizeof
So sánh (Comparison)
Logic (Logical)
*
/
%
Trái sang phải
Trái sang phải
Trái sang phải
Trái sang phải
+
‐
<<
>>
<
>
<=
>=
9
11/24/2010
Độ ưu tiên của các toán tử
Độ ưu tiên giữa các toán tử (tt.)
Độ ưu tiên Toán tử
Trình tự kết hợp
Trái sang phải
Trái sang phải
Trái sang phải
Trái sang phải
Trái sang phải
Trái sang phải
Phải sang trái
Phải sang trái
==
&
!=
Ví dụ :
2*3+4/2 > 3 AND 3<5 OR 10<9
^
!
Việc tính toán như sau :
&&
||
[2*3+4/2] > 3 AND 3<5 OR 10<9
Toán tử số học sẽ được tính trước
?: (toán tử điều kiện)
=
+=
*=
%=
^=
‐=
/=
&=
|=
[[2*3]+[4/2]] > 3 AND 3<5 OR 10<9
[6+2] >3 AND 3<5 OR 10<9
[8 >3] AND [3<5] OR [10<9]
<<=
>>=
, (ngăn cách biểu thức)
Trái sang phải
Thay đổi độ ưu tiên
Độ ưu tiên giữa các toán tử (tt.)
Dấu ngoặc đơn ( ) có độ ưu tiên cao nhất
Độ ưu tiên của các toán tử có thể được thay đổi bởi dấu
ngoặc đơn
Kế đến là toán tử so sánh có cùng độ ưu tiên. Ta áp dụng quy
tắc tính từ trái sang phải.
. Toán tử có độ ưu tiên thấp hơn nếu đặt trong dấu ngoặc
đơn sẽ được thực thi trước
True AND True OR False
. Khi các cặp ngoặc đơn lồng nhau ( ( ( ) ) ), cặp ngoặc đơn
trong cùng nhất sẽ được thực thi trước
Cuối cùng là toán tử kiểu Logic.
AND sẽ có độ ưu tiên cao hơn OR
Nếu trong biểu thức có nhiều cặp ngoặc đơn thì việc thực thi
sẽ theo thứ tự từ trái sang phải
[True AND True] OR False
True OR False
True
10
11/24/2010
Thay đổi độ ưu tiên (tt.)
Thay đổi độ ưu tiên (tt.)
3) 5+9*3^2‐4 >10 AND (2+16‐8/4 > 6 OR False)
Kế đến dấu ngoặc đơn ở ngoài được tính đến
Ví dụ :
5+9*3^2‐4 > 10 AND (2+2^4‐8/4 > 6 OR (2<6 AND 10>11))
4) 5+9*3^2‐4 > 10 AND (2+16‐2 > 6 OR False)
5) 5+9*3^2‐4 > 10 AND (18‐2 > 6 OR False)
6) 5+9*3^2‐4 > 10 AND (16 > 6 OR False)
7) 5+9*3^2‐4 > 10 AND (True OR False)
8) 5+9*3^2‐4 > 10 AND True
Cách tính :
1) 5+9*3^2‐4 > 10 AND (2+2^4‐8/4 > 6 OR (True AND False))
Dấu ngoặc đơn bên trong sẽ được tính trước
2) 5+9*3^2‐4 > 10 AND (2+2^4‐8/4 > 6 OR False)
Thay đổi độ ưu tiên (tt.)
9) 5+9*9‐4>10 AND True
Biểu thức bên trái được tính trước
10) 5+81‐4>10 AND True
11) 86‐4>10 AND True
12) 82>10 AND True
13) True AND True
14) True
11
Bạn đang xem tài liệu "Bài giảng Tin học đại cương - Phần 2: Ngôn ngữ lập trình C (Tiết 2)", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
- bai_giang_tin_hoc_dai_cuong_phan_2_ngon_ngu_lap_trinh_c_tiet.pdf