Chương 2 Các yếu tố cơ bản của ngôn ngữ C

Chương 2 - Các yếu tố cơ bản của ngôn ngữ C

 Từ vựng trong C  Biểu thức  Hàm vào/ra dữ liệu chuẩn  Các câu lệnh điều khiển

Từ vựng trong C

 Tập ký tự  Tên  Từ khóa  Các kiểu dữ liệu  Hằng  Biến

Từ vựng trong C

 Tập ký tự

 26 chữ cái hoa: A, B, …, Z  26 chữ cái thường: a, b, …, z  10 chữ số: 0, 1, …9  Các ký tự đồ họa: +, -, *, /, =, !, #, %, ^, &, _, ~, [, ],\, |, ; , :, ‘, “, {, }, ,, ., <, >, ?, (, )

 Các ký tự không hiển thị ra màn hình: space, tab,

enter

Từ vựng trong C

 Từ khóa

 Là những từ dành riêng cho một ngôn ngữ lập trình  Một số từ khóa thường dung: const, enum, signed, struct, typedef, unsigned… char, double, float, int, long, short, void case, default, else, if, switch do, for, while break, continue, goto, return

Từ vựng trong C

 Tên/Định danh (Identifier)

 Một dãy ký tự dùng để chỉ tên một hằng số, hằng ký tự, tên

một biến, một kiểu dữ liệu, một hàm một hay thủ tục.

 Quy tắc đặt tên:

 Ký tự đầu tiên có thể là chữ cái hoặc dấu gạch dưới _  Các ký tự sau đó (nếu có) có thể là chữ cái, dấu gạch dưới

 VD: x1, temp, _bien1 là những tên hợp lệ; 1abc, bai

hoặc số.

1 la những tên không hợp lệ

Từ vựng trong C

 Đối tượng dữ liệu: gồm các thuộc tính

 Kiểu dữ liệu: chỉ ra loại dữ liệu có thể được lưu trữ  Giá trị: hiện đang được lưu trong đối tượng dữ liệu  Địa chỉ: vị trí của đối tượng dữ liệu trong bộ nhớ  Tên: dùng để xác định đối tượng dữ liệu

 Kiểu dữ liệu

 Mỗi kiểu dữ liệu có tên và kích thước nhất định.  Có miền giá trị xác định

Từ vựng trong C

 Kiểu dữ liệu  Kiểu ký tự

 Tên: char và unsigned char  Kích thước: 1 byte  Miền giá trị

Kiểu

Phạm vi biểu diễn

Số ký tự

char

-128 đến 127

256

unsigned char

0 đến 255

256

 Một ký tự được biểu diễn thông qua bảng mã ASCII

(http://en.wikipedia.org/wiki/ASCII)

Từ vựng trong C

 Kiểu dữ liệu Kiểu ký tự

 Phân nhóm ký tự: 3 nhóm

 Nhóm các ký tự điều khiển: từ 0÷31 và 127  Nhóm các ký tự văn bản: 32÷126  Nhóm các ký tự đồ họa: 128÷255

Từ vựng trong C

 Kiểu dữ liệu  Kiểu nguyên

 short, int, long

 Kích thước và phạ vi biểu diễn:

Kiểu Phạm vi biểu diễn Kích thước

int/ signed int -32768 đến 32767 2/4 bytes

unsigned int 0 đến 65535 2/4 bytes

short/ signed short -32768 đến 32767 2 bytes

unsigned short 0 đến 65535 2 bytes

long/ signed long -2147483648 đến 2147483647 4 bytes

unsigned long 0 đến 4294967295 4 bytes

Từ vựng trong C

 Kiểu dữ liệu

 Kiểu số phẩy động

 float, double, long double

 Kích thước và phạm vi biểu diễn:

Phạm vi biểu diễn Kích thước Kiểu

float 3.4E-38 đến 3.4E+38 4 bytes

double 8 bytes 1.7E-308 đến 1.7E+308

long

3.4E-4932 đến 1.1E4932 10 bytes

double

Từ vựng trong C

 Kiểu dữ liệu

 Định nghĩa kiểu dữ liệu mới bằng typedef

 Cú pháp: typedef ;

 Ví dụ:

typedef int nguyen

typedef float m50[50]

typedef int m_20x30[20][30]

Từ vựng trong C

 Hằng

 Là đại lượng mà giá trị của nó không thay đổi trong suốt

quá trình hoạt động của chương trình

 Cú pháp khai báo

 Ví dụ:

#define #define MAX 1000 #define PI 3.141593

 Hằng số học:

 Hằng số nguyên  Hằng số thực

 Hằng ký tự: ký tự đơn được viết trong dấu nháy đơn  Hằng kiểu chuỗi: một dãy các ký tự liên tục được đặt

trong dấu nháy kép

Từ vựng trong C

 Biến

 Là một đối tượng dữ liệu có giá trị thay đổi trong quá

trình hoạt động của chương trình

 Cú pháp khai báo: ;

 Ví dụ

Khai báo ba biến int là a,b,c

int a,b,c;

Khai báo hai biến long là dai và mn

long dai,mn;

Khai báo hai biến ký tự là kt1 và kt2

char kt1,kt2;

Khai báo hai biến float là x và y

float x,y

double canh1,canh2; Khai báo hai biến double là canh1 và canh2

Từ vựng trong C

 Biến (t.)

Vị trí khai báo biến:  Các biến ngoài:

 Là các biến được khai báo bên ngoài hàm  Phạm vi sử dụng được tính từ vị trí khai báo đến cuối

 Là các biến được khai báo bên trong hàm, hoặc bên

chương trình  Các biến cục bộ:

 Phạm vi sử dụng: được tính từ vị trí khai báo đến cuối

trong các khối lệnh

hàm hoặc cuối khối lệnh

Biểu thức

 Biểu thức trong C  Các toán tử  Phép toán chuyển đổi kiểu dữ liệu

Biểu thức

 Là sự kết hợp giữa toán tử và toán hạng để

diễn đạt một công thức toán học nào đó

 Mỗi biểu thức có một giá trị trả về  Biểu thức thường được dùng trong:

 Vế phải của câu lệnh gán  Đối số của hàm  Làm chỉ số cho phần tử của mảng  Trong các biểu thức điều kiện

Biểu thức

 Toán tử:

 Là các phép toán được ngôn ngữ lập trình hỗ trợ trực

tiếp

 Được biểu diễn thông qua các ký hiệu  Phân loại: 1 ngôi, 2 ngôi, 3 ngôi  Một số toán tử thông dụng

+ - * / %

 Toán tử số học:  Toán tử quan hệ: == > < >= <= !=  Toán tử gán: = += -= *= /=  Toán tử tăng, giảm trị: ++ --  Toán tử logic:  Toán tử trên bit gồm: & | ~ ^

&& || !

Biểu thức

 Các loại biểu thức  Biểu thức số học  Biểu thức so sánh  Biểu thức logic  Biểu thức gán

Biểu thức

 Phép toán chuyển đổi kiểu dữ liệu:

 Trong biểu thức gồm các toán hạng khác kiểu, kiểu thấp hơn sẽ được tự động nâng thành kiểu cao hơn trước khi thực hiện phép toán. Điều này được gọi là tăng cấp kiểu. Cấp của kiểu dữ liệu theo thứ tự:char < int < long < float < double

 Giá trị của kiểu dữ liệu này được gán cho 1 biến có kiểu dữ liệu khác. Việc này xảy ra trong lệnh gán hoặc truyền giá trị các tham số, kiểu dữ liệu được tự động đổi kiểu như sau:  Giá trị của vế phải được chuyển sang kiểu của vế trái đó là kiểu

của kết quả.

 Kiểu int có thể được chuyển thành float.  Kiểu float có thể chuyển thành int do chặt đi phần sau dấu phảy.  Kiểu double chuyển thành float bằng cách làm tròn.  Kiểu long được chuyển thành int.

Biểu thức

 Phép toán chuyển đổi kiểu dữ liệu:

 Ngoài ra, có thể thực hiện chuyển kiểu giá trị bằng

phép chuyển kiểu (ép kiểu)

Cú pháp: (Kiểu_dữ_liệu_mới) ;

Biểu thức  Ví dụ :

#include #define Max 100 const int m = 40; int bt; int main() {

// co so 10 // co so 8 // co so 16

int a = 15; a=1; int b = 015; int c = 0x15; float d = 1.2e-6; // 15.06*10^-3 bt = a + b + c/m + (a>b);

0 1 2 3 4 5 6 7 8 9 10 11 }

Nhập/xuất dữ liệu

 Thư viện

 Cú pháp

#include (standard input/output)

là cách trình bày thông tin xuất và được đặt trong cặp nháy kép “ ”, có thể bao gồm các thành phần sau:

 Văn bản thường (literal text)  Ký tự điều khiển (escape sequence)  Đặc tả (conversion specifier)

printf([, <đs1>, <đs2>, …]);

Nhập/xuất dữ liệu

 Văn bản thường (literal text)

 Được xuất y hệt như lúc gõ trong chuỗi định dạng.

 Ví dụ

 Xuất chuỗi Hello World

 printf(“Hello ”); printf(“World”);  printf(“Hello World”);

 Xuất chuỗi a + b

 printf(“a + b”);

Nhập/xuất dữ liệu

 Ký tự điều khiển (escape sequence)

 Gồm dấu \ và một ký tự như trong bảng sau:

Ký tự điều khiển

Ý nghĩa

\a \b \n \t \\ \? \”

Tiếng chuông Lùi lại một bước Xuống dòng Dấu tab In dấu \ In dấu ? In dấu “

 Ví dụ

 printf(“\t”); printf(“\n”);  printf(“\t\n”);

Nhập/xuất dữ liệu

 Đặc tả (conversion specifier):

%[-][fw][.pp]  Ý nghĩa:

 Dấu -: căn lề cho dữ liệu

 Có dấu -: kết quả in ra được căn trái  Không có dấu -: kết quả được căn theo bên phải

 fw: xác định kích thước tối thiểu để in  pp:

 Đối số kiểu double/float: pp là độ chính xác của giá trị in ra  Đối số là xâu ký tự:

 pp nhỏ hơn độ dài của xâu: in ra pp ký tự đầu tiên của xâu  Không có pp hoặc pp lớn hơn độ dài xâu: in ra toàn bộ xâu  Đối số là số nguyên: số ký tự được in ra (điền thêm số 0 nếu cần)

Nhập/xuất dữ liệu

 Đặc tả (conversion specifier):

 Ký tự định dạng: Dùng để xác định quy tắc chuyển

dạng và dạng in ra của đối số tương ứng.

Đặc tả

Ý nghĩa

%c %d, %ld %f, %lf %s %u

Ký tự Số nguyên có dấu Số thực Chuỗi ký tự Số nguyên không dấu

char char, int, short, long float, double char[], char* unsigned int/short/long

Nhập/xuất dữ liệu

 Ví dụ:

int a = 1706; float x = 176.85; printf(“%10d”, a);printf(“\n”); printf(“%10.2f”, x);printf(“\n”); printf(“%.2f”, x);printf(“\n”); printf(“%f\n”,x)

Nhập/xuất dữ liệu

 Thư viện

 #include (standard input/output)

 Cú pháp

 scanf([, <đs1>, <đs1>, …]);  giống định dạng xuất nhưng chỉ có các

đặc tả.

 Các đối số là tên các biến sẽ chứa giá trị nhập và được đặt

trước dấu &

Nhập/xuất dữ liệu

 Ví dụ: cho a và b kiểu số nguyên

// Nhập giá trị cho biến a // Nhập giá trị cho biến b

 Các câu lệnh sau đây sai

scanf(“%d”, &a); scanf(“%d”, &b); //scanf(“%d%d”, &a, &b);

// Thiếu dấu &

// a là biến kiểu số nguyên

scanf(“%d”, a); scanf(“%d”, &a, &b);// Thiếu %d cho biến b scanf(“%f”, &a); scanf(“%9d”, &a); // không được định dạng scanf(“a = %d, b = %d”, &a, &b”); //chứa ký tự khác

Các câu lệnh điều khiển

 Câu lệnh điều khiển rẽ nhánh

 Câu lệnh if … else  Câu lệnh switch … case  Câu lệnh điều khiển lặp

 Câu lệnh for  Câu lệnh while  Câu lệnh do … while

Các câu lệnh điều khiển

 Câu lệnh if … else

 Bài toán: Xác định 1 năm có phải là năm nhuận  Lệnh if là lệnh cho phép thực hiện hay không thực hiện một khối lệnh nào đó tùy thuộc vào tính đúng của biểu thức.

 Có 2 dạng:

Dạng 1

Dạng 2 if (biểu thức)

if (biểu thức) khối lệnh (1)

khối lệnh (1) else

khối lệnh (2)

Các câu lệnh điều khiển

 Câu lệnh if … else

Các câu lệnh điều khiển  Câu lệnh if … else

 Trong C, cho phép sử dụng nhiều câu lệnh if lồng

nhau

 Máy sẽ ghép lệnh else với lệnh if không có else gần nhất  Chú ý: nên sử dụng dấu {} để tránh nhầm lẫn if-else của câu

 Khi muốn thực hiện 1 trong n quyết định

lệnh này với câu lệnh khác

if (biểu thức 1)

khối lệnh 1

else if (biểu thức 2)

khối lệnh 2 ......

else

khối lệnh n

Các câu lệnh điều khiển  Câu lệnh if … else

Ví dụ:

 Viết chương trình nhập vào hai số nguyên n, k. Kiểm tra xem n có chia hết cho k hay không, nếu có in ra màn hình dưới định dạng: n chia het cho k (Ví dụ: 6 chia hết cho 3), nếu không in ra màn hình dòng chữ “khong chia het”.

 Viết chương trình giải phương trình bậc nhất.  Viết chương trình giải phương trình bậc 2 (kể

cả trường hợp có nghiệm phức)

Các câu lệnh điều khiển

 Câu lệnh if … else

 Một số lỗi đơn giản thường gặp:

#include #include main() {

int b; printf("Nhap b =“);scanf("%d",&b); if (b=0)

printf("b bang 0");

getch();

}

0 1 2 3 4 5 6 7 8 9 10 11

Các câu lệnh điều khiển

 Câu lệnh if … else

 Một số lỗi đơn giản thường gặp:

#include #include main() {

int b; printf("Nhap b =“);scanf("%d",&b); if (b%5==0)

printf("b la chia het cho5\n"); printf("b = 5*%d",b/5);

else …

}

0 1 2 3 4 5 6 7 8 9 10

Các câu lệnh điều khiển

 Câu lệnh if … else

 Một số lỗi đơn giản thường gặp:

#include #include main() {

int b; printf("Nhap b = );scanf("%d",&b); if (b%5==0);

printf("b la uoc cua 5\n");

getch();

}

0 1 2 3 4 5 6 7 8 9

Các câu lệnh điều khiển

 Câu lệnh switch … case

 Có thể sử dụng câu lệnh switch để chọn 1 trong nhiều quyết

định

switch (biểu thức nguyên ) là các số nguyên, hằng ký tự

{

case n1:

khối lệnh 1 break;

case n2:

 ni hoặc biểu thức hằng.  default là một thành phần không bắt buộc phải có trong thân của switch.  Sự hoạt động của switch:

khối lệnh 2 break; .......

case nk:

khối lệnh k

break;

[ default:

khối lệnh k+1

break;]

} • Giá trị biểu thức bằng ni, chương trình hoạt động tại nhãn case ni, cho đến khi gặp break. • Nếu giá trị biểu thức khác với tất cả các ni, sẽ thực hiện lệnh sau default, hoặc thoát khỏi switch.

Các câu lệnh điều khiển

 Câu lệnh switch … case

Các câu lệnh điều khiển

 Câu lệnh switch … case

 Ví dụ:

 Viết chương trình đọc các số từ 0 đến 9. Nếu nằm ngoài khoảng

 Viết chương trình in ra số ngày trong tháng, nếu là tháng 2 yêu

đó, in ra dòng thông báo: “Khong doc duoc”.

cầu nhập thêm năm để tính ngày.

Các câu lệnh điều khiển

 Câu lệnh for

 Bài toán: in ra bảng cửu chương của 3?  Lệnh for cho phép thực hiện lặp lại 1 số câu lệnh tuân

theo một số quy luật nào đó.

for (; <Đ/K lặp>; )

;

Đ

<Đ/K lặp>

S

Các câu lệnh điều khiển  Câu lệnh for

 Ví dụ

int i; for(i = 1; i <= 9; i++)

printf("3x%d = %d\n", i, i*3);

 Một số lưu ý:

1. Câu lệnh for là câu lệnh đơn, và có thể lồng nhau 2. Các phần khởi đầu, bước nhảy, điều kiện lặp có thể không

3.

4. 5. Các thành phần , <Đ/K lặp>, cách

xuất hiện Lệnh break làm kết thúc câu lệnh. Lệnh continue bỏ qua lần lặp hiện tại.

6. Nếu có nhiều thành phần trong mỗi phần thì được cách nhau

nhau bằng dấu ; (bắt buộc phải có!)

bằng dấu ,

Các câu lệnh điều khiển

 Câu lệnh for  Ví dụ:

 Viết chương trình nhập vào số nguyên n, tính tổng bình

phương các số từ 1 đến n (n nhập từ bàn phím)

 Viết chương trình tính n! (n nhập từ bàn phím)  Viết chương trình tính và in ra màn hình giá trị biểu

thức: (n nhập từ bàn phím)

 Viết chương trình in ra bảng cửu chương

Các câu lệnh điều khiển

 Câu lệnh for

 Một số lỗi thường gặp

#include #include main() {

int n,s; n = 10; s = 0; for(int i = 1;i<10;i++);

s += i;

printf("Tong cac so tu nhien tu 1 den 10: %d",s); getch();

}

Các câu lệnh điều khiển

 Câu lệnh for

 Một số lỗi thường gặp

#include #include main() {

int i,j; for(i = 1,j = 1;j<5,i<3;i++,j++)

printf("i = %d; j = %d\n",i,j);

getch();

}

Các câu lệnh điều khiển

 Câu lệnh while

 Btoán: in ra các bội số (nhỏ hơn 20) của 2?  Lệnh while là lệnh thực hiện 1 số câu lệnh khi thỏa mãn một

điều kiện nào đó.

while (Điều kiện) Hành_động_cần_lặp;

Đ

<Đ/K lặp>

S

Các câu lệnh điều khiển

 Câu lệnh while  Một số lưu ý:

 Câu lệnh while là câu lệnh đơn, có thể đặt lồng nhau  Câu lệnh while có thể không thực hiện lần nào  Câu lệnh while có thể lặp vô tận  Có thể sử dụng các lệnh break, continue trong các

vòng lặp

Các câu lệnh điều khiển

 Câu lệnh do…while

 Lệnh do… while là lệnh cho phép thực hiện 1 số câu lệnh khi còn thỏa mãn một điều kiện nào đó.

do

Hành_động_cần_lặp ;

while (Điều kiện);

Đ

<Đ/K lặp>

S

Các câu lệnh điều khiển

 Câu lệnh do…while

 Một số lưu ý:

 Câu lệnh do … while là câu lệnh đơn, có thể đặt lồng

 Câu lệnh do … while thực hiện ít nhất 1 lần  Câu lệnh do … while có thể lặp vô tận  Có thể sử dụng các lệnh break, continue trong các

nhau

vòng lặp

Các câu lệnh điều khiển

 So sánh 3 câu lệnh lặp

 Đều có khả năng lặp lại một (hoặc nhiều) hành động

nhiều lần.

 Câu lệnh for có số vòng lặp được xác định trước  while có thể không thực hiện lần nào.  do… while sẽ được thực hiện ít nhất 1 lần.

Các câu lệnh điều khiển

 Bài tập trên lớp: Sử dụng các câu lệnh điều

khiển thực hiện các bài sau  Viết chương trình nhập vào một số nguyên dương

không lớn hơn 10000, in ra màn hình tổng các chữ số của số đó (ví dụ nhập n = 1356 in ra 15). Chương trình chỉ cho phép người dùng nhập các giá trị từ 1 – 10000, nếu nằm ngoài vùng giá trị trên yêu cầu nhập lại.

 Viết chương trình in ra 3 số hoàn thiện bé nhất. Số hoàn thiện n là số nguyên dương mà tổng các ước nguyên dương (nhỏ hơn n) bằng n. VD: 28 = 1+2+4+7+14;

Các câu lệnh điều khiển

 Viết chương trình C thực hiện thuật toán theo sơ đồ khối hình bên

Bài tập về nhà

 Tìm hiểu các bài toán sau và cài đặt chương

trình tương ứng:  Tính gần đúng tích phân xác định (phương pháp

hình chữ nhật, hình thang)

 Tìm nghiệm gần đúng của phương trình (phương

pháp chia đôi)

 Tính căn bậc hai theo phép lặp Newton