1. Trang chủ
  2. » Công Nghệ Thông Tin

Ngôn ngữ C 2

57 1,6K 4
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Ngôn ngữ lập trình C
Tác giả Dennis M. Ritchie, W. Kernighan
Trường học Trường Đại Học Khoa Học Tự Nhiên
Chuyên ngành Ngôn ngữ lập trình
Thể loại Giáo trình
Năm xuất bản 1978
Thành phố Hồ Chí Minh
Định dạng
Số trang 57
Dung lượng 307,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Ngôn ngữ C

Trang 1

CHƯƠNG I:

SƠ LƯỢC VỀ NGÔN NGỮ C

I LỊCH SỬ PHÁP TRIỂN CỦA NGÔN NGỮ C

C là một ngôn ngữ lập trình do Dennis M.Ritchie và W Kernighan viết ra nhằmđáp ứng nhu cầu của những nhà tin học trong việc xây dựng phần mềm hệ thống, hệđiều hành Nó được phát triển tại phòng thí nghiệm Bell vào những năm 1960 đầu 1970.Năm 1978 cuốn giáo trình “Ngôn ngữ lập trình C” do chính tác giả của ngôn ngữ đượcxuất bản và phát triển rộng rãi

Lúc đầu ngôn ngữ C được nghiên cứu và thao tác trên hệ điều hành UNIX, nhưngnay đã được phát triển rộng rãi trên các hệ điều hành khác

Thực tế, C đã tổ hợp được các thành tựu tiên tiến của tin học và đã trở thành mộtchuẩn mặc nhiên trong tin học

Không chỉ có C mà còn có rất nhiều Ngôn ngữ lập trình (NNLT) bậc cao khác,chúng đều có một số nét chung như sau:

+ Quy định một số các ký tự dùng để viết chương trình, tập các ký tự này gọi làBảng chữ cái của ngôn ngữ

+ Quy định một số từ đặc biệt với các chức năng khác nhau gọi là Từ khóa.+ Quy định cấu trúc chung của một chương trình và các giai đoạn khi viết từngphần của chương trình

+ Tổ chứa một thư viện các chương trình con chuẩn hổ trợ người viết chươngtrình

Là các từ dành riêng trong ngôn ngữ, mỗi ngôn ngữ có một bộ từ khoá riêng, mỗi

từ có một chức năng nhất định, nghĩa là khi lập trình bằng ngôn ngữ C chúng ta khôngđược sử dụng chúng vào những công việc khác như đặt tên cho biến, hàm, chương trìnhcon …

casecontinueelsefloatifnearshortstructunsigned

defaultenumforintsignedswitchvoid

Chú ý: Từ khoá phải được viết bằng chữ thường Ngôn ngữ C phân biệt chữ hoa

và chữ thường, có nghĩa là INT sẽ khác với int

3 Tên

Tên là một khái niệm rất quan trọng, nó dùng để phân biệt hay xác định các đạilượng trong một chương trình Chúng ta có tên hằng, tên biến, tên mảng, tên hàm, têncon trỏ, tên cấu trúc, tên nhãn,… Tên phải được đặt theo qui tắc sau:

Trang 2

- 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ênphải là chữ hoặc là dấu gạch nối Tên không được đặc trùng với từ khoá Độ dài cực đạicủa tên mặc định là 32.

- Chú ý: Trong các tên, chữ hoa và chữ thường được xem là khác nhau Trong

C thường dùng chữ hoa để đặt tên cho các hằng và dùng chữ thường để đặt tên cho hầuhết các đại lượng khác như biến, mảng, hàm, cấu trúc Tuy nhiên đây không phải là điềubắt buộc

Ví dụ:

delta, temp, x1, y1 tên đúng

3xyz, r#2 tên sai

III DẠNG CHUNG CỦA MỘT CHƯƠNG TRÌNH C

<khai báo thư viện>

[<khai báo các đối dữ liệu ngoài>]

[<khai báo nguyên mẫu của các hàm>]

- Khởi động: Vào chương trình DOS, chuyển đến thư mục chứa tập tin turbo.exe,

gõ lệnh turbo  (Enter), cửa sổ của chương trình C xuất hiện

- Thoát: Nhấn tổ hợp phím Alt+X, hoặc chọn menu File\Quit

2 Cách soạn thảo và dịch một chương trình C

Các bước thực hiện:

- Mở cửa sổ soạn thảo bằng cách gõ phím F10+F, N

- Gõ các lệnh của chương trình

- Nhấn F2 để Save chương trình (tập tin có phần mở rộng C)

- Biên dịch chương trình: Dùng tổ hợp phím Alt+F9 Nếu chương trình có lỗi,những lỗi đó sẽ được hiển thị ở khung Message bên dưới, và dòng lệnh bị lỗi đầu tiên sẽ

có một vệt màu xanh chỉ định, gõ phím Enter vệt xanh sẽ biến mất và vị trí con trỏ nằmsát ngay chỗ sai đầu tiên của chương trình Sau khi sửa sai (nếu có) thì tiến hành biêndịch lại cho tới khi chương trình không còn lỗi

- Chạy chương trình: Dùng tổ hợp phím Ctl+F9

3 Các thao tác cơ bản thường sử dụng

F2: Save chương trình

F10+F, N: Mở một cửa sổ soạn thảo mới

F6: di chuyển cửa sổ cuối cùng lên trên cùng

F3: Mở một file đã được save trước đó

Trang 3

F10: Gọi thanh menu.

Trang 4

CHƯƠNG II:

HẰNG, BIẾN VÀ MẢNG

I CÁC KIỂU DỮ LIỆU

Trong C có các kiểu dữ liệu sau:

* Ki u nguyên:ểu nguyên:

Tên kiểu Kích thước Phạm vichar 1 byte -27 … 27

unsigned char 1 byte 0 … 28 – 1

int 2 bytes -215 … 215 – 1unsigned int 2 bytes 0 … 216 – 1short 2 bytes 0 … 216 – 1long 4 bytes -231 … 231 – 1unsigned long 4 bytes 0 … 232 - 1

* Ki u d u ph y đ ng:ểu nguyên: ấu phẩy động: ẩy động: ộng:

Tên kiểu Kích thước Phạm vifloat 4 bytes 3.4E –38 … 3.4E +38double 8 bytes 1.7E –308 … 1.7E +308long double 10 bytes 3.4E –4932 …3.4E +4932

II HẰNG

Hằng là một đại lượng mà giá trị của nó không thay đổi trong quá trình tính toán.Sau đây là một số loại hằng được sử dụng trong C:

1 Hằng số:

* Hằng dấu phẩy động (float và double):

Thường được viết theo 2 cách:

Cách 1 (dạng thập phân): Số gồm phần nguyên và phần phân cách nhau bởi

dấu chấm Phần nguyên và phần phân có thể vắng mặt nhưng dấu chấm thập phân bắtbuộc phải có

Ví dụ:

123.456 , .34 (=0.34) , 15 (=15.0)

Cách 2 (dạng khoa học hay dạng mũ): Số gồm phần định trị và phần bậc hai

phần này cách nhau bởi chữ e hoặc E Phần định trị có thể là một số nguyên hoặc sốthực dạng thập phân Phần bậc phải là một số nguyên

Ví dụ:

123.456E-4 (=0.0123456)0.12E3 (=120.0)

* Hằng nguyên (int và long):

Hằng int là số nguyên có giá trị trong khoảng từ -32768 đến 32767 Nếu sốvượt quá miền giá trị này thì nó sẽ thuộc hằng long Hằng long được viết bằng cáchthêm L hoặc l vào cuối số

Ví dụ:

-45 , 4007 , 4568946L

* Hằng hệ bát phân (hệ 8):

Được viết như hằng int với số 0 đứng đầu, dạng như sau: 0c1c2c3… với ci là

số nguyên trong khoảng từ 0 đến 7

Ví dụ:

Trang 5

Là một ký tự riêng biệt được viết trong 2 dấu nháy đơn Giá trị của hằng ký tự là

số thứ tự của ký tự đó trong bảng mã ASCII Vì vậy hằng ký tự có thể tham gia vào cácphép toán như mọi số nguyên khác

Ví dụ:

“Ha Noi”

“Hai Phong”

“” \\chuỗi rổng

Chú ý: Cần phân biệt ‘a’ và “a”, ‘a’ là hằng ký tự được lưu trong 1 byte, còn “a”

là hằng chuỗi ký tự được lưu trữ trong một mảng hai phần tử gồm ký tự a và ký tự \0

4 Tên hằng:

Để định nghĩa một tên hằng ta dùng toán tử #define với cú pháp như sau:

#define <tên hằng> <giá trị của hằng>

Ví dụ:

#define MAX 1000

#define KT “Khoa cong nghe thong tin”

Trong chương trình nếu chúng ta sử dụng tên MAX thì sẽ được thay bằng giátrị 1000, còn nếu sử dụng tên KT thì sẽ được thay bằng chuỗi “Khoa cong nghe thongtin”

Trang 6

III BIẾN

1 Khái niệm:

- Biến là vùng trống trong bộ nhớ và được đặt tên để tiện tham khảo

- Tên biến phải tuân thủ theo qui tắc đặt tên đã được nêu ở chương 1

- Tên biến thường được viết bằng chữ thường

- Biến ngoài: Là biến được khai báo ngoài tất cả các hàm (kể cả hàm main)

int x, y // khai báo 2 biến có tên x, y có kiểu int

char ch // khai báo biến có tên ch kiểu char

- Vị trí khai báo biến: Các khai báo biến cần đặt ngay sau dấu { đầu tiên của thânhàm (hoặc bắt đầu một khối lệnh) và cần đứng trước mọi câu lệnh khác

…}

- Khởi tạo giá trị ban đầu cho biến: Để khởi tạo giá trị cho biến ta phải dùng toán

tử gán (=) Chúng ta có thể vừa khai báo, vừa gán trị cho biến hoặc cũng có thể gán trịcho biến sau khi đã khai báo biến

Ví dụ:

int x = 20, y = 30 // vừa khai báo vừa gán trị

int a, b, c

a = 20, b = 30, c = 40 // gán trị sau khi đã khai báo biến

- Các biến ngoài khi chưa được gán trị mà được một hàm gọi tới sẽ được gán giátrị là 0

- Lấy địa chỉ của biến: Mỗi biến đều được cấp phát một vùng nhớ gồm một sốbytes liên tiếp dựa vào kiểu của biến Địa chỉ của byte đầu tiên chính là địa chỉ của biến

Để lấy địa chỉ của biến dùng cú pháp sau:

&<tên biến>

IV KIỂU ENUM

- Kiểu enum giúp chúng ta định nghĩa một tập hợp những hằng có kiểu int, dạngchung như sau:

enum [<tên kiểu>] {<tên hằng 1> [=<giá trị 1>],…} [<tên biến 1> [,<tên biến 2>]…];

Trong đó:

[<tên kiểu>]: Là tên của một kiểu dữ liệu mới

<tên hằng 1> [=<giá trị 1>]: định nghĩa một <tên hằng> mà giá trị của nó sẽđược chỉ ra trong điều khoản <giá trị> Nếu điều khoản <giá trị> không được sử dụngthì giá trị của <tên hằng> sẽ là <giá trị> của tên hằng đứng trước nó cộng với 1 biết rằng

<giá trị> của hằng đầu tiên là 0

[<tên biến 1> [,<tên biến 2>]…]: là danh sách các biến kiểu enum

Trang 7

- Nếu điều khoản <tên kiểu> có tồn tại thì sau này chúng ta có thể sử dụng cụm từenum <tên kiểu> để khai báo các biến enum theo mẫu:

enum <tên kiểu> <danh sách các biến>;

2 Khai báo:

- Cú pháp:

<kiểu dữ liệu> <tên mảng>[<số phần tử>][[<số phần tử>]…]

- Ví dụ:

int a[10]; // mảng có tên là a, 1 chiều, có 10 phần tử,

// mỗi phần tử có kiểu int và chiếm 2 bytes trong bộ nhớint b[4][2]; // mảng tên là b, 2 chiều, 4 dòng và 2 cột tức có 8 phần tử kiểu int,

// mỗi phần tử chiếm 2 bytes trong bộ nhớfloat x[5], y[3][3]; // mảng x là mảng 1 chiều có 5 phần tử kiểu float,

// mỗi phần tử chiếm 4 bytes bộ nhớ// mảng b là mảng 2 chiều, có 9 phần tử kiểu float

- Chú ý:

+ Các phần tử mảng được đánh số từ 0

Ví dụ:

int a[3]; // có 3 phần tử: a[0], a[1], a[2]

+ Các phần tử mảng được cấp phát các vùng nhớ liên tiếp nhau trong bộ nhớ.+ Các phần tử mảng hai chiều được cấp phát theo hàng

Ví dụ:

void main( ){

clrscr( );

int a[2][2], i, j;

for(i=0; i<2; i++)for(j=0; j<2; j++)

Trang 8

a[0] // truy xuất phần tử thứ 0 của mảng a

a[1] // truy xuất phần tử thứ 1 của mảng a

b[0][1] // truy xuất phần tử hàng 0 cột 1 của mảng b

- Chú ý: Khi chỉ số vượt ra ngoài kích thước mảng (tức truy xuất phần tử nằm

ngoài mảng), máy vẫn không báo lỗi, nhưng nó sẽ truy nhập đến một vùng nhớ bênngoài mảng và có thể làm rối loạn chương trình

Trang 9

Ví dụ:

P = (a + b + c)/2; \\ bieu thuc tinh nua chu vi tam giac

S = a*b \\ bieu thuc tinh dien tich hinh chu nhat

*/

%

CộngTrừNhânChia lấy nguyên (không áp dụng cho kiểu float hoặc double)Chia lấy dư (không áp dụng cho kiểu float hoặc double)

Các phép toán sau đây cho phép xử lý đến từng bit của một số nguyên Các toán

tử này không thực hiện trên các kiểu float và double

Dịch tráiDịch phảiLấy phần bù theo bit

1000

1110

0110

a << N = a*2N

a >> N = a/2N

~1 = 0

~0 = 1

Trang 10

và False mà thay vào đó ta sử dụng 0 và 1:

a b a && b a || b0

0khác 0khác 0

0khác 00khác 0

0001

0111

a ! a0

khác 0

10

4 Phép toán tăng giảm:

- C đưa ra hai phép toán 1 ngôi (++ và ) để tăng hoặc giảm các biến (nguyên vàthực):

a++, ++a : tương đương với a = a+1

a , a : tương đương với a = a-1

- Tuy nhiên, a++ và ++a là khác nhau:

a++ : dùng biến rồi mới tăng trị

++a : tăng trị rồi mới dùng biến

- Tương tự cho a và a

Trang 11

a = b = c = d = 8 // biến a, b, c và d đều có giá trị là 8

z = (y = 2)*(x = 6) // 6 gán cho x, 2 gán cho y và 12 gán cho z

- Câu lệnh gán cũng có thể có dạng: a = a + b hoặc có thể viết gọn a + = b

Lệnh gán sẽ lấy giá trị của a cộng với b và gán lại cho a

int i = 4; // biến i có giá trị là 4

i = i*2; // biến i có giá trị 8

i / = 2; // biến i có giá trị 4

i %= 2; // biến i có giá trị 0

IV CHUYỂN ĐỔI KIỂU GIÁ TRỊ

- Việc chuyển đổi kiểu xẩy ra:

+ Khi biểu thức gồm các toán hạng khác kiểu

+ Trong phép gán

+ Trong việc truyền giá trị các tham số thực cho các đối của hàm

+ Trong câu lệnh return

- Việc chuyển đổi kiểu thường được thực hiện tự động theo qui luật:

+ Nếu trong biểu thức có hai toán hạng có kiểu khác nhau thì kiểu thấp hơn sẽđược nâng thành kiểu cao hơn trước khi thực hiện phép toán như:

giữa int và long thì int sẽ chuyển thành long;

giữa int và float thì chuyển int thành float;

giữa float và double thì chuyển float thành double,…

- Tuy nhiên, chúng ta cũng có thể ép thành một kiểu như ý muốn theo dạng:

(<tên kiểu>) <biểu thức>

Trang 12

V BIỂU THỨC ĐIỀU KIỆN

- Biểu thức điều kiện có dạng:

printf(“So lon la: %d”,a>b?a: b); // So lon la: 9

c = 1 ? 2:3 // biến c chứa giá trị là 2

c = 0 ? 2:3 // biến c chứa giá trị là 3

VI THỨ TỰ ƯU TIÊN CỦA CÁC PHÉP TOÁN

Sau đây là bảng tóm tắt về thứ tự ưu tiên của các toán tử:

- Các toán tử trên cùng một hàng thì có cùng một độ ưu tiên

- Các hàng được sắp theo độ ưu tiên giảm dần tức là các toán tử ở hàng trên sẽ có

độ ưu tiên hơn các toán tử ở hàng dưới

- Toán tử sizeof dùng để trả về kích cở tính bằng byte của một kiểu dữ liệu (int,float,…) hay một đối tượng dữ liệu (biến, mảng…)

+ Cú pháp: sizeof (<kiểu dữ liệu>)

sizeof(<đối tượng dữ liệu>)+ Ví dụ:

Trang 13

- Chú ý: Các lời gọi hàm, các câu lệnh gán lồng nhau và các toán tử tăng, giảm

đều có thể tạo ra “hiệu ứng phụ” (hiệu ứng lề) tức là một số biến bị thay đổi do việc tínhtoán của biểu thức tạo ra Các hiệu ứng này phụ thuộc vào trật tự tính toán và các biếntham gia trong biểu thức Các hiệu ứng phụ có thể gây ra các kết quả khác nhau tùy theotừng trình biên dịch C và tùy theo các máy khác nhau

Ví dụ:

a[i] = i++;

Tùy mỗi trình biên dịch mà có thể hiểu chỉ số mảng sẽ lấy giá trị cũ hay giá trịmới

Trang 14

\f Sang trang mới

\b Lùi lại một bước

\t Dấu tab+ Các ký tự đặc tả có dạng:

% [cờ] [chiều rộng] [ độ chính xác] <kiểu>

[cờ]: Dùng để canh chỉnh dạng số liệu:

Nếu không có cờ số liệu sẽ lệch phải

Nếu khai báo cờ là dấu - thì số liệu sẽ lệch trái

Nếu khai báo cờ là dấu + thì số liệu sẽ có dấu + hoặc - tùy sốliệu dương hay âm

Nếu khai báo cờ là khoảng trống (blank) số liệu sẽ mang dấu khi âm

-Nếu khai báo cờ là # thì số thực luôn có dấu chấm thập phân.[chiều rộng]: Là độ dài tối đa để xuất số liệu, tính luôn phần thậpphân và dấu chấm phân cách Nếu [chiều rộng] có dạng 0n và dữ liệu canh phải thì phần

dư thừa bên trái sẽ được lấp đầy bằng những con số 0, còn nếu [chiều rộng] có dạng n

và dữ liệu canh phải thì phần dư thừa bên trái được lấp đầy bằng những khoảng trống

Khi chúng ta bỏ qua điều khoản này hoặc [chiều rộng]nhỏ hơn độ dài thực tế của dữ liệu ra thì chiều rộng sẽ là độ dài thực tế của dữ liệu ra

[ độ chính xác]: Dùng để khai báo phần thập phân có bao nhiêu sốlẻ

<kiểu>: Chỉ định đối in ra có kiểu dữ liệu nào

<kiểu> Kiểu của đối tương ứng

c Dữ liệu có kiểu char hay unsigned char

d i Dữ liệu có kiểu int hoăc short

u Dữ liệu có kiểu unsigned int hoặc unsigned short

o Dữ liệu có kiểu int và khi in ra tự động đổi thành hệ 8 (hệ bát phân)

x Dữ liệu có kiểu int và khi in ra tự động đổi thành hệ 16 (thập lục

phân) và dùng các ký tự a, b, c, d, e, f để biểu diễn 10, 11, 12, 13,

14, 15

X Dữ liệu có kiểu int và khi in ra tự động đổi thành hệ 16 (thập lục

phân) và dùng các ký tự A, B, C, D, E, F để biểu diễn 10, 11, 12, 13,

14, 15

f Dữ liệu có kiểu float

e Dữ liệu có kiểu float được in theo dạng khoa học

Trang 15

g Dữ liệu có kiểu float được in ra dưới dạng dấu chấm thập phân hay

số mũ tùy thuộc vào dữ liệu có giá trị như thế nào và độ rộng truyxuất ra sao Sô mũ được in dưới dạng e

G Dữ liệu có kiểu float được in ra dưới dạng dấu chấm thập phân hay

số mũ tùy thuộc vào dữ liệu có giá trị như thế nào và độ rộng truyxuất ra sao Sô mũ được in dưới dạng E

li ld lo lx lX Dữ liệu có kiểu long

Le LE Lg LG Lf Dữ liệu có kiểu long double

+ Các ký tự không thuộc vào những ký tự điều khiển hay đặc tả gọi lànhững ký tự hiển thị sẽ được in trực tiếp ra màn hình

arg1, arg2,…: Các đối cần được phân cách nhau bởi dấu phẩy Đối có thể là

một hằng, một biến, một phần tử mảng, một lời gọi hàm hay nói chung là một biểu thứcbất kỳ Giá trị của đối sẽ được chuyển dạng và in ra theo cách của đặc tả tương ứng.Một điều cần chú ý ở đây là mỗi đặc tả cần có một đối tương ứng Khi mà một đặc tảkhông tìm thấy đối tương ứng hoặc khi kiểu giá trị của đối tương ứng không tương thíchvới ký tự chuyển dạng thì máy sẽ bị lẫn lộn và có thể đưa ra những kết quả vô nghĩa

Số đối có thể lớn hơn số đặc tả, khi đó những đối cuối cùngkhông có đặc tả tương ứng sẽ không được in ra

Trang 16

- Giải thích:

control: Bao gồm các ký tự đặc tả chuyển dạng, mỗi đặc tả chuyển dạng

tương ứng với một đối Chuỗi này có dạng tổng quát như sau:

<ký tự chuyển dạng>: Gồm các dạng sau:

<ký tự chuyển dạng> <Ý nghĩa>

c Vào một ký tự, đối tương ứng là con trỏ ký tự Có xét ký tự

khoảng trắng

d Vào một giá trị kiểu int, đối tương ứng là con trỏ kiểu int, dữ

liệu nhập vào là số nguyên

ld Vào một giá trị kiểu long, đối tương ứng là con trỏ kiểu long,

dữ liệu vào phải là số nguyên

o Vào một giá trị kiểu int hệ 8, đối tương ứng là con trỏ kiểu int,

dữ liệu vào phải là số nguyên hệ 8

lo Vào một giá trị kiểu long hệ 8, đối tương ứng là con trỏ kiểu

long, dữ liệu vào phải là số nguyên hệ 8

x Vào một giá trị kiểu int hệ 16, đối tương ứng là con trỏ kiểu

int, dữ liệu vào phải là số nguyên hệ 16

lx Vào một giá trị kiểu long hệ 16, đối tương ứng là con trỏ kiểu

long, dữ liệu vào phải là số nguyên hệ 16

f hay e Vào một giá trị kiểu float, đối tương ứng là con trỏ kiểu float,

dữ liệu vào phải là số có dấu phẩy động

lf hay le Vào một giá trị kiểu double, đối tương ứng là con trỏ kiểu

double, dữ liệu vào phải là số có dấu phẩy động

[^dãy ký tự]

Các ký tự trên dòng sẽ lần lượt đọc vào cho đến khi nào gặpmột ký tự thuộc tập các ký tự đặt trong hai dấu [] Đối tươngứng là con trỏ kiểu char trỏ tới một vùng nhớ đủ lớn, dữ liệunhập là một chuỗi ký tự bất kỳ kể cả khoảng trắng

agr1, agr2,…: Các đối phải được ngăn cách nhau bởi dấu phẩy Mỗi đối là

một con trỏ chứa địa chỉ của một vùng nhớ (địa chỉ biến, mảng,…) dùng để lưu trữ giátrị đọc vào từ bàn phím

Trang 18

Hàm trả về ký tự được hiển thị.

- Giải thích:

ch: Chứa mã ký tự cần hiển thị

Trang 19

if (!kbhit( )) goto tiep;

if (getch( )!=27) goto tiep;

}

Trang 20

CHƯƠNG V:

CÁC CẤU TRÚC ĐIỀU KHIỂN

I CÂU LỆNH ĐƠN, CÂU LỆNH GHÉP

Chương trình của C là tập hợp liên tiếp các câu lệnh đơn Các câu lệnh này đượcmáy tính thi hành một cách tuần tự, câu ghi trước sẽ được thực hiện trước, câu ghi sau

sẽ được thực hiện sau Nếu một thao tác nào đó không thể mô tả bằng câu lệnh đơn màphải cần đến nhiều câu lệnh đơn ghép lại thì các câu lệnh này phải được đặt trong cặpngoặc móc ({ }) Như vây toàn bộ các câu lệnh bắt đầu từ { đến } được xem như mộtlệnh đơn

Nếu <điều kiện> đúng thì <câu lệnh 1> được thực hiện Nếu <điều kiện> sai thì

<câu lệnh 2> không được thực hiện

Trang 21

if (a<0)printf(“So a nho hon 0”);

elseprintf(“So a bang 0”);

Nếu giá trị của <biến> rơi vào <giá trị 1> thì <câu lệnh 1> được thực hiện

Nếu giá trị của <biến> rơi vào <giá trị 2> thì <câu lệnh 2> được thực hiện

Tương tự, nếu giá trị của <biến> rơi vào <giá trị n> thì <câu lệnh n> được thựchiện

Nếu giá trị của <biến> không rơi vào giá trị nào cả thì <câu lệnh n+1> sau defaultđược thực hiện nếu như có mệnh đề default

Trang 22

<biến chạy = giá trị đầu>: Khởi tạo giá trị ban đầu cho biến chạy.

<điều kiện>: Điều kiện để tồn tại dòng lặp

<biểu thức tăng giảm>: Biểu thức để tăng giá trị biến chạy

- Ý nghĩa:

Nếu giá trị biến chạy còn thỏa <điều kiện> thì vòng lặp còn tồn tại, tức là <câulệnh> sẽ được thực hiện Mỗi lần lặp thì biến chạy sẽ được tăng lên hoặc giảm xuốngphụ thuộc vào <biểu thức tăng giảm> và vòng lặp sẽ lặp đi lặp lại cho đến khi giá trị củabiến chạy không còn thoả <điều kiện>

- Chú ý:

Các đối số trong câu lệnh for có thể được bỏ đi nhưng phải giữ dấu chấm phẩy (;).For(;;) là một vòng lặp vô hạn Chu trình này được thoát ra thường nhờ vào cáclệnh break hoặc return có trong vòng lặp

Nếu <câu lệnh> là một nhóm lệnh thì phải đặt trong cặp ngoặc móc

int count, total=0;

for(count = 1; count<=10; count++)

Trang 23

Nếu <điều kiện> còn thỏa thì <câu lệnh> sẽ được thực hiện Nếu <câu lệnh>

là một nhóm lệnh thì phải đặt trong cặp ngoặc móc

printf("Nhap chieu rong: ");

scanf("%d",&cr);

printf("\nNhap chieu dai: ");

scanf("%d",&cd);

dt=cd*cr;

printf("\nDien tich la: %d", dt);

printf("\nCo muon tiep tuc hay khong?c/k: ");

ch = getch();

}while (ch=='c' || ch=='C');

}

Trang 24

- Khi gặp lệnh continue máy sẽ trở về đầu vòng lặp.

- Trong lệnh while và do-while, lệnh continue chuyển điều khiển về phần kiểm trađiều kiện

- Lệnh continue chỉ thực hiện cho vòng lặp chứ không áp dụng cho lệnh switch

if (a[i]<0) continue;

kq+=a[i];

}printf("Tong nhung so duong: %d",kq);

getch();

}

Trang 25

Phép toán: &x cho ta địa chỉ của biến x.

2 Con trỏ

Con trỏ là biến chứa địa chỉ của một biến khác Vì có nhiều loại địa chỉ nên cũng

có nhiều kiểu con trỏ tương ứng Con trỏ kiểu int dùng để chứa địa chỉ các biến kiểu int,con trỏ kiểu float dùng để chứa địa chỉ các biến kiểu float,… Kích thước của biến contrỏ không phụ thuộc vào biến mà nó trỏ tới là kiểu gì Kích thước của biến con trỏ luôn

là 2 bytes do cách dùng 2 bytes để lưu địa chỉ của MS_DOS

3 Qui tắc sử dụng con trỏ trong các biểu thức

- Sử dụng tên con trỏ: Con trỏ cũng là một biến nên khi tên của nó xuất hiện trongbiểu thức thì giá trị của nó sẽ được sử dụng Chúng ta cần lưu ý là giá trị mà con trỏchứa là địa chỉ của một biến khác Vì vậy khi tên con trỏ đứng ở bên trái phép gán thìbiểu thức bên phải phải là địa chỉ

Ví dụ:

int *px, x; // khai báo con trỏ px và một biến x

px = &x; // giá trị mà con trỏ px chứa là địa chỉ của biến x

- Sử dụng dạng khai báo của con trỏ: Nếu con trỏ px trỏ tới biến x thì cách viết

printf(“&x=%d\n”,&x); //in địa chỉ biến x ra màn hình

px = &x; //nội dung của px là địa chỉ của biến x

// hay px trỏ tới xprintf(“px = %d\n”, px);

printf(“*px = %d\n”, *px);

py = &y; //nội dung của py là địa chỉ của biến y

// hay py trỏ tới y

py = px; // py trỏ tới vùng nhớ mà px đang trỏprintf(“Sau khi gán: *py = %d”, *py);

getch( );

}

Trang 26

- Sử dụng địa chỉ con trỏ: &<tên con trỏ> cho ta địa chỉ của biến con trỏ.

4 Cấp vùng nhớ cho biến con trỏ

Con trỏ cũng là biến nhưng nó lưu địa chỉ của một vùng nhớ nào đó Khi chúng takhai báo một biến con trỏ thì biến này tạm thời trỏ đến một vùng nhớ bất kỳ Nếu chúng

ta muốn nó trỏ tới một số byte nào đó trong vùng nhớ thì chúng ta phải cấp phát Trongthư viện alloc.h có những lệnh cấp phát như sau:

void *calloc(unsigned n, unsigned size);

khi đó phép toán: &a[i]

với i trong khoảng [0,19] cho địa chỉ của phần tử a[i]

b Tên mảng là một hằng địa chỉ: nó chính là địa chỉ của phần tử đầu tiên của

mảng

Ví dụ:

float a[10];

Khi chúng ta khai báo một mảng tên a, có 10 phần tử thì máy sẽ bố trí cho

10 khoảng nhớ liên tiếp (mỗi khoảng nhớ 4 bytes do kiểu mảng là kiểu float) Như vậynếu biết địa chỉ của một phần tử nào đó thì chúng ta dễ dàng suy ra địa chỉ các phần tửkhác Một điều quan trọng mà chúng ta muốn nói ở đây là: tên mảng là một hằng địachỉ, nó chính là địa chỉ của phần tử đầu tiên của mảng Như vậy, trong mọi ngữ cảnh:

a tương đương với &a[0]

a+i tương đương với &a[i]

*(a+i) tương đương với a[i]

c Nếu con trỏ pa trỏ tới một phần tử a[k] nào đó thì:

pa + i trỏ tới phần tử thứ i sau phần tử a[k], tức phần tử thứ a[k+i]

pa - i trỏ tới phần tử thứ i trước phần tử a[k], tức phần tử thứ a[k-i]

*(pa + i) tương đương với pa[i]

Như vậy với khai báo:

int a[30], *pa;

pa = a; và pa = &a[0]; là tương đương nhaua[i] *(a+i) *(pa+i) pa[i] là tương đương nhau

Trang 27

for (i=0;i<4;i++){

printf("\n a[%d] = ",i+1);

printf("\n a[%d] = ",i+1);

printf("\n a[%d] = ",i+1);

Trang 28

printf("\n a[%d] = ",i+1);

2 Con trỏ và mảng hai chiều

a Phép toán lấy địa chỉ: Không dùng được đối với mảng hai chiều (nhưng có thể

dùng được đối với mảng hai chiều kiểu nguyên) Nói cách khác, trong nhiều trường hợpcâu lệnh

&a[i][j]

là không hợp lệ và gây ra lỗi

b Tính địa chỉ trong mảng 2 chiều:

Ví dụ:

int a[2][3];

Khi ta khai báo mảng a có 2 hàng và 3 cột, tức có 6 phần tử mảng, thì máy

sẽ cấp phát sáu địa chỉ liên tiếp trong bộ nhớ để biểu diễn:

a trỏ tới đầu phần tử hàng thứ nhất (phần tử a[0][0]),

a+1 trỏ tới đầu phần tử hàng thứ hai (phần tử a[1][0]),

c Một số giải pháp để duyệt phần tử mảng hai chiều:

Do chúng ta không thể lấy địa chỉ của phần tử mảng hai chiều Vì vậy chúng taphải dùng con trỏ tạm hoặc biến tạm để làm trung gian cho việc nhập liệu vào mảng

Ngày đăng: 13/11/2012, 16:50

HÌNH ẢNH LIÊN QUAN

V. BIỂU THỨC ĐIỀU KIỆN - Ngôn ngữ C 2
V. BIỂU THỨC ĐIỀU KIỆN (Trang 12)
Sau đây là bảng tóm tắt về thứ tự ưu tiên của các toán tử: - Ngôn ngữ C 2
au đây là bảng tóm tắt về thứ tự ưu tiên của các toán tử: (Trang 12)
printf(“&amp;x=%d\n”,&amp;x); //in địa chỉ biến x ra màn hình - Ngôn ngữ C 2
printf (“&amp;x=%d\n”,&amp;x); //in địa chỉ biến x ra màn hình (Trang 25)

TỪ KHÓA LIÊN QUAN

w