kiểu dữ liệu và biến trong c -...

34
Kiểu dữ liệu và biến trong C (Data Types and Variables in C) TS. Bùi Ngọc Thăng Bộ môn KHMT, Khoa CNTT, Trường ĐHCN

Upload: vukien

Post on 29-Aug-2019

228 views

Category:

Documents


0 download

TRANSCRIPT

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

Nội dung bài giảngKiểu dữ liệu cơ bảnBiến và hằngToán tử

09/06/16 2

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

Từ khóa (keywords) trong C

09/06/16 8

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