Kiểu dữ liệu và biến trong C -...
Transcript of Kiểu dữ liệu và biến trong C -...
Kiểu dữ liệu và biến trong C(Data Types and Variables in C)
TS. Bùi Ngọc ThăngBộ môn KHMT, Khoa CNTT, Trường
ĐHCN
Ví dụ
09/06/163
#include <stdio.h>
int main(void){
int a, b;
printf(“Nhap 2 so nguyen: ");scanf("%i %i", &a, &b);
printf("%i - %i = %i\n", a, b, a - b);
return 0;}
#include <stdio.h>
int main(void){
int a, b;
printf(“Nhap 2 so nguyen: ");scanf("%i %i", &a, &b);
printf("%i - %i = %i\n", a, b, a - b);
return 0;}
Khai báo 2 biến số nguyên, “a” và “b”
Nhập 2 số nguyên vào a và b
Viết các biểu thức “a”, “b” và “a-b” theo định
dạng %i Nhap 2 so nguyen: 21 1721 - 17 = 4
Nhap 2 so nguyen: 21 1721 - 17 = 4
Lệnh xuất - printf
Xuất dữ liệu ra màn hình:
printf("%i - %i = %i\n", a, b, a - b); Các ký tự hằng được in nguyên văn Các ký tự định dạng được thay bằng giá trị của biểu thức
tương ứng: %i: ký tự định dạng số nguyên kiểu int Các ký tự điều khiển: \n – xuống dòng; \t – dấu tab;
\\ – dấu \; \“– dấu “ … Thư viện: stdio.h
09/06/164
Lệnh nhập - scanf
Nhập dữ liệu từ bàn phímscanf("%i %i", &a, &b);
Trong chuỗi định dạng chỉ có ký tự định dạng và khoảng trắng.
Dữ liệu phải được nhập vào các biến. Trước tên biến phải ghi dấu & - toán tử địa chỉ. Nếu
không có toán tử địa chỉ, giá trị của biến sẽ không được cập nhật
Thư viện: stdio.h
09/06/165
Biến (Variables)Biến là đại lượng mang tin (giá trị)Biến được cấp phát bộ nhớ như 1 ô nhớMỗi biến có 3 đặc điểm:
tên (used to refer to it)Kiểu (set of possible values)Giá trị hiện thời (changes as program runs)
Biến được định nghĩa bằng tên và kiểu. Ví dụ: int i, j, k;
double length, width;
09/06/16 6
TênTên là một khái niệm quan trọng, nó dùng để xác định các
đối tượng khác nhau trong chương trình. Tên là một dãy các ký tự: chữ, số và dấu gạch nối. Ký tự đầu của tên phải là chữ hoặc dấu gách nối.
Một số ví dụ: i, k56, X, nchars, numberOfChars, _x1, number_of_chars.
Trong tên chữ thường, chữ hoa được xem là khác nhau, như vậy tên AB khác tên ab.
Nên sử dụng tên có nghĩa. C có sẵn một số tên từ khóa (keywords) mà chúng ta không
thể đặt tên trùng với nó
09/06/16 7
Kiểu dữ liệu cơ bản trong CKiểu ký tự (char)Kiểu nguyên (int)Kiểu dấu phẩy động
Chính xác đơn (float)Chính xác kép (double)
09/06/16 9
Kiểu ký tự và kiểu nguyênName #bytes Format Min Val Max Val
char 1 %c CHAR_MIN CHAR_MAX
unsigned char 1 %c 0 UCHAR_MAX
short 2 %hi SHRT_MIN SHRT_MAX
unsigned short 2 %hu 0 USHRT_MAX
int 4 %i INT_MIN INT_MAX
unsigned int 4 %u 0 UINT_MAX
long 4 %li LONG_MIN LONG_MAX
unsigned long 4 %lu 0 ULONG_MAX
09/06/16 10
Ví dụ về kiểu int
09/06/1611
#include <stdio.h>#include <limits.h>
int main(){
unsigned long big = ULONG_MAX;
printf("minimum int = %i, ", INT_MIN);printf("maximum int = %i\n", INT_MAX);printf("maximum unsigned = %u\n", UINT_MAX);printf("maximum long int = %li\n", LONG_MAX);printf("maximum unsigned long = %lu\n", big);
return 0;}
#include <stdio.h>#include <limits.h>
int main(){
unsigned long big = ULONG_MAX;
printf("minimum int = %i, ", INT_MIN);printf("maximum int = %i\n", INT_MAX);printf("maximum unsigned = %u\n", UINT_MAX);printf("maximum long int = %li\n", LONG_MAX);printf("maximum unsigned long = %lu\n", big);
return 0;}
minimum int = - 2147483648, maximum int = 2147483647maximum unsigned = 4294967295maximum long int = 2147483647maximum unsigned long = 4294967295
minimum int = - 2147483648, maximum int = 2147483647maximum unsigned = 4294967295maximum long int = 2147483647maximum unsigned long = 4294967295
Ví dụ về kiểu ký tự (char)
09/06/1612
#include <stdio.h>#include <limits.h>
int main(){
char lower_a = 'a';char lower_m = 'm';
printf("minimum char = %i, ", CHAR_MIN);printf("maximum char = %i\n", CHAR_MAX);
printf(“Sau '%c' la '%c'\n", lower_a, lower_a + 1);printf(“Ky tu in hoa '%c'\n", lower_m - 'a' + 'A');
return 0;}
#include <stdio.h>#include <limits.h>
int main(){
char lower_a = 'a';char lower_m = 'm';
printf("minimum char = %i, ", CHAR_MIN);printf("maximum char = %i\n", CHAR_MAX);
printf(“Sau '%c' la '%c'\n", lower_a, lower_a + 1);printf(“Ky tu in hoa '%c'\n", lower_m - 'a' + 'A');
return 0;} minimum char = -128, maximum char = 127
Sau 'a' la 'b'Ky tu in hoa 'M'
minimum char = -128, maximum char = 127Sau 'a' la 'b'Ky tu in hoa 'M'
In ra mã ASCII của ký tự
Trong NNLT C, ký tự chính là số nguyên
Số nguyên trong các cơ số khácCác hệ cơ số có thể thực hiện được: cơ số 8 (octal), cơ
số 10 (decimal), cơ số 16 (hexadecimal)
09/06/1613
Số 0: số octal 0x: số hexadecimal
#include <stdio.h>
int main(void){
int dec = 20, oct = 020, hex = 0x20;
printf("dec=%d, oct=%d, hex=%d\n", dec, oct, hex);printf("dec=%d, oct=%o, hex=%x\n", dec, oct, hex);
return 0;}
#include <stdio.h>
int main(void){
int dec = 20, oct = 020, hex = 0x20;
printf("dec=%d, oct=%d, hex=%d\n", dec, oct, hex);printf("dec=%d, oct=%o, hex=%x\n", dec, oct, hex);
return 0;}
dec=20, oct=16, hex=32dec=20, oct=20, hex=20
dec=20, oct=16, hex=32dec=20, oct=20, hex=20
Kiểu dấu phẩy độngName #bytes format Max val Min val
float 4 %f %e %g FLT_MIN FLT_MAX
double 8 %lf %le %lg DBL_MIN DBL_MAX
long double 12 %Lf %Le %Lg
LDBL_MIN LDBL_MAX
09/06/16 14
• Thường ta hay sử dụng kiểu double.•Giá trị Max/Min được định nghĩa trong “float.h”
Ví dụ về double
09/06/1615
#include <stdio.h>#include <float.h>
int main(void){
double f = 3.1416, g = 1.2e-5, h = 5000000000.0;
printf("f=%lf\tg=%lf\th=%lf\n", f, g, h);printf("f=%le\tg=%le\th=%le\n", f, g, h);printf("f=%lg\tg=%lg\th=%lg\n", f, g, h);
printf("f=%7.2lf\tg=%.2le\th=%.4lg\n", f, g, h);
return 0;}
#include <stdio.h>#include <float.h>
int main(void){
double f = 3.1416, g = 1.2e-5, h = 5000000000.0;
printf("f=%lf\tg=%lf\th=%lf\n", f, g, h);printf("f=%le\tg=%le\th=%le\n", f, g, h);printf("f=%lg\tg=%lg\th=%lg\n", f, g, h);
printf("f=%7.2lf\tg=%.2le\th=%.4lg\n", f, g, h);
return 0;}
f=3.141600 g=0.000012 h=5000000000.000000f=3.141600e+00 g=1.200000e-05 h=5.000000e+09f=3.1416 g=1.2e-05 h=5e+09f= 3.14 g=1.20e-05 h=5e+09
f=3.141600 g=0.000012 h=5000000000.000000f=3.141600e+00 g=1.200000e-05 h=5.000000e+09f=3.1416 g=1.2e-05 h=5e+09f= 3.14 g=1.20e-05 h=5e+09
Kiểu Boolean và voidTrong C:
Không có kiểu booleanKiểu int được sử dụng thay thế cho giá trị boolean. 0 (số không)
biểu diễn False, tất cả các giá trị còn lại được xem như biểu diễn giá trị True.
Kiểu void:Hàm mà không trả về bất cứ kiểu cụ thể nàoKiểu tổng quát sử dụng để ép kiểu
09/06/16 16
Hằng số (Constant)Biến – giá trị của nó có thể thay đổi khi chương trình
thi hànhSố PI hoặc tốc độ ánh sáng không phải là biến bởi vì
giá trị của nó là hằng số (constant)Có 2 cách để thao tác đối với hằng số:
const float Pi = 3.14
#define Pi 3.14
09/06/16 17
Khai báo hằng sốKhai báo hằng số như sau:const float SPEED_OF_LIGHT = 1079252848.8;
Hoặc sử dụng ký hiệu khoa học:const float SPEED_OF_LIGHT = 1.079e+9; Biến được mô tả với từ khóa const không thể thay đổi
đượcCố gắng thay đổi biến hằng (const variable ) sẽ sinh ra lỗi
biên dịch
09/06/16 18
Ví dụ về hằng sốCác hằng pi, days_in_week, sunday được tạo với từ khóa const
09/06/1619
#include <stdio.h>
int main(void){
const long double PI = 3.141592653590L;const int DAYS_IN_WEEK = 7;const SUNDAY = 0;
DAYS_IN_WEEK = 5;
return 0;}
#include <stdio.h>
int main(void){
const long double PI = 3.141592653590L;const int DAYS_IN_WEEK = 7;const SUNDAY = 0;
DAYS_IN_WEEK = 5;
return 0;}
Lỗi
Dùng #define để định nghĩa hằng số và kiểuMột cách tổng quát thì từ khóa tiền xử lý #define đùng để định nghĩa tên
của một kiểu (đối tượng) nào đó
#define SPEED_OF_LIGHT 1079252848.8
#define name replacementText
#define PI 3.14159 //định nghĩa tên một hằng số PI Câu lệnh #define chỉ là một loại câu lệnh macroSo với cách định nghĩa dùng từ khóa const thì cách dùng này không được
uyển chuyển bằng nhưng nó thường cho hiệu quả thực thi nhanh hơn vì đây chỉ là các macro
09/06/16 20
Ví dụ về #define
09/06/1621
#include <stdio.h>
#define PI 3.141592653590L#define DAYS_IN_WEEK 7#define SUNDAY 0
int day = SUNDAY;long flag = USE_API;
#include <stdio.h>
#define PI 3.141592653590L#define DAYS_IN_WEEK 7#define SUNDAY 0
int day = SUNDAY;long flag = USE_API;
Tìm từ “PI”, thay bằng 3.1415....
Không thay thế “PI”
Lưu ý: không có “=” và “;”
Qui ước tên trong CNên sử dụng tên mô tả ngữ nghĩa của biến, điều này sẽ tạo cho
chương trình dễ đọc và dễ hiểu. Nhiều tền của hàm trong thư viện bắt đầu bằng dấu ‘_’. Vì vậy, chúng
ta nên tránh đặt tên hàm hoặc tên biến bắt đầu bằng ‘_’.Tên hàm nên đặt chữ hoa của mỗi từ: CountWord()Tên biến nên đặt tất cả đều là chữ thường: iage, fscoreHằng số nên định nghĩa tất cả đều chữ hoa. MAX_LENGTH
09/06/16 22
Toán tử gánCú pháp: var = expression;i = 0;
Khi gặp phép gán, biểu thức của vế phải của phép gán “=“ được đánh giá và kết quả được lưu trong biến của vế trái của phép gán “=“
Biến phải được gán trước khi chúng sử dụng; ngược lại chúng sẽ nhận giá trị “rác, vô nghĩa” (“garbage” values )
Tùy theo sự thực hiện của chương trình, giá trị “rác” có thể mặc định là 0 nhưng cũng có thể là một giá trị bất kỳ
09/06/16 23
Toán tử gánBiến có thể được khởi tạo khi chúng được khai báo
char c = ‘A’;
int x = 10; Biến có thể được thay đổi trong chương trình:
y = x + 5;
x = x + 3;
09/06/16 24
Toán tử số họcToán tử Sử dụng Mô tả
+ op1 + op2
- Op1 - op2
* Op1 * op2
/ Op1 / op2 Chia op1 cho op2. Lầy phần nguyên (thương số)
% (modulus) Op1 % op2 Lấy phần dư của phép chia op1 cho op2 . Không thể sử dụng cho số thực
09/06/16 25
Ví dụ về toán tử chia “/”Trình biên dịch dựa vào kiểu của các toán
hạng để quyết định phép chia tương ứng
09/06/1626
int main(void){
int i = 5, j = 4, k;double f = 5.0, g = 4.0, h;
k = i / j;h = f / g;h = i / j;
return 0;}
int main(void){
int i = 5, j = 4, k;double f = 5.0, g = 4.0, h;
k = i / j;h = f / g;h = i / j;
return 0;}
“i”, “j” kiểu int, “/” là phép chia lấy nguyên k nhận giá trị 1
“f”, “g” kiểu double, “/” là phép chia số thực h nhận giá trị 1.25
Phép chia nguyên, “h” có kiểu double.
Kết quả là 1.00000
Toán tử tăng và giảmToán tử tăng ++: cộng 1 vào toán hạng của nóToán tử --: trừ 1 từ toán tử của nóDấu phép toán ++ và –- có thể đứng trước hoặc sau toán
hạngVí dụ: ++n, n++, --n, n--Việc chọn phương án nào là tùy theo ngữ cảnh. Bình
thường, khuyến cáo nên dùng toán tử này sau toán hạng
09/06/16 27
Ví dụThứ tự thực hiện các toán tử ++ và -- phụ thuộc vào vị trí của chúng (trước hay sau) so với biến:
09/06/1628
#include <stdio.h>
Int main(void){
int i, j = 5;i = ++j;printf("i=%d, j=%d\n", i, j);j = 5;i = j++;printf("i=%d, j=%d\n", i, j);
return 0;}
#include <stdio.h>
Int main(void){
int i, j = 5;i = ++j;printf("i=%d, j=%d\n", i, j);j = 5;i = j++;printf("i=%d, j=%d\n", i, j);
return 0;}
i=6, j=6i=5, j=6
i=6, j=6i=5, j=6
Tương đương: 1. j++; 2. i = j;
Tương đương: 1. i = j; 2. j++;
Lệnh gánx += 10
Được rút gọn từx = x + 10
Chúng ta cũng có thể sử dụng lệnh gán:-= *= /= %=
Giá trị của giá trị biếna = b = 10;
09/06/16 29
Toán tử so sánhToán tử Cách sử dụng Trả lại giá trị 1 nếu:
> Op1 > op2 Op1 lớn hơn op2
>= Op1 >= op2 op1 lơn hơn hoặc bằng op2
< Op1 < op2 op1 nhỏ hơn op2
<= Op1 <= op2 op1 nhỏ hơn hoặc bằng op2
== Op1 == op2 op1 và op2 bằng nhau
!= Op1 != op2 op1 không bằng op2
09/06/16 30
Toán tử logic
09/06/16 31
a b a&&b a||b
Khác không Khác không 1 1
Khác không 0 0 1
0 Khác không 0 1
0 0 0 1
a !a
Khác không 0
0 1
Chú ý: a và b có thể là nguyên hay thực
Tính giá trị biểu thứcKhi tính giá trị biểu thức, toán tử có thứ tự ưu tiên sẽ
được thực hiện trướcVí dụ: ‘*’ thực hiện trước ‘+’.Sử dụng dấu ngoặc để chỉ rõ cách tính biểu thứcĐối với các phép toán ưu cùng mức ưu tiên thì trình tự
tính toán có thể từ trái qua phải hay ngược lại
09/06/16 32
Thứ tự ưu tiênDấu ngoặc ()
Toán tử 1 ngôi ++expr –-expr !
Nhân/ Chia * / %
Cộng/trừ + -
Dịch chuy << >>
So sánh < > <= >=
Bằng/Khác == !=
Toán tử lấy bit & ^ |
Toán tử logic && ||
Toán tử điều kiện ?:
Phép gán = += -= *= /= %= &= ^= |= <<= >>= >>>=
09/06/16 33
sizeof
sizeof(Obj)Cho biết kích thước của đối tượng theo đơn vị byte
09/06/1634
#include <stdio.h>
int main(void){
long big;
printf("\"big\" is %u bytes\n", sizeof(big));printf("a short is %u bytes\n", sizeof(short));printf("a double is %u bytes\n", sizeof (double));
return 0;}
#include <stdio.h>
int main(void){
long big;
printf("\"big\" is %u bytes\n", sizeof(big));printf("a short is %u bytes\n", sizeof(short));printf("a double is %u bytes\n", sizeof (double));
return 0;}
"big" is 4 bytesa short is 2 bytesa double is 8 bytes
"big" is 4 bytesa short is 2 bytesa double is 8 bytes