Slide Ngôn Ngữ Lập Trình C Nguyễn Đình Thuân, 98 Trang

background image

1

NGÔN NGỮ LẬP TRÌNH

C/C++

Nguyễn Đình Thuân
Khoa Công Nghệ Thông Tin

Đạ

i học Nha Trang

Nha Trang, 7-2007

background image

2

Ni dung môn hc

Chương 1: Tổng quan
Chương 2: Các toán tử
Chương 3: Các cấu trúc điều khiển
Chương 4: Dữ liệu có cấu trúc
Chương 5: Các hàm trong C
Chương 6: Các cấu trúc dữ liệu khác
Chương 7: Đồ họa trong C

background image

3

Chương 1: Tng quan

1.1 Giới thiệu

Đ

ã có nhiều sách trên thế giới viết về C/C++ và hầu

hết là ca ngợi, nhất là các lập trình viên luôn xem
C/C++ là công cụ mạnh và uyển chuyển.

C là kết quả của quá trình phát triển khởi đầu từ ngôn
ngữ BCPL (do Martin Richards đưa ra vào năm 1967)
là sản phẩm của dự án Combine Programming
Language giữa 2 trường Đại học London và
Cambridge. Ngôn ngữ B (do Ken Thompson phát triển
từ ngôn ngữ BCPL vào năm 1970 khi viết hệ điều
hành UNIX đầu tiên trên máy PDP-7) và ngôn ngữ B
là tiền thân của ngôn ngữ C.

background image

4

1.1 Gii thiu (tiếp)

Năm 1978, hai tác giả Brian Kernighan và Dennish
Ritchie và đã cho xuất bản quyển The C Programming
Language (Prentice-Hall) và được phổ biến rộng rãi
đế

n nay. Vì vậy ngôn ngữ C thường được gán cho

“Tiêu chuẩn K&R”.

Hiện nay có gần 30 trình biên dịch C đang phổ biến
trên thị trường và chúng không nhất quán nhau. Để
cải thiện tình trạng này, chuẩn ANSI C cũng được ra
đờ

i vào năm 1978, nhằm chăm lo việc phát triển các

môi trường và các hàm thư viện của C.

background image

5

Các đặc đim ca ngôn ng C:

o Tính cô đọng (compact): C chỉ có 32 từ khóa chuẩn và 40 toán tử chuẩn,

nhưng hầu hết đều được biểu diễn bằng những chuỗi ký tự ngắn gọn.

o Tính cấu trúc (structured): C có một tập hợp những chỉ thị của lập trình

như cấu trúc lựa chọn, lặp… Từ đó các chương trình viết bằng C được
tổ chức rõ ràng, dễ hiểu.

o Tính tương thích (compatible): C có bộ tiền xử lý và một thư viện chuẩn vô

cùng phong phú nên khi chuyển từ máy tính này sang máy tính khác các
chương trình viết bằng C vẫn hoàn toàn tương thích.

o Tính linh động (flexible): C là một ngôn ngữ rất uyển chuyển và cú pháp,

chấp nhận nhiều cách thể hiện, có thể thu gọn kích thước của các mã
lệnh làm chương trình chạy nhanh hơn.

o Biên dịch (compile): C cho phép biên dịch nhiều tập tin chương trình riêng

rẽ thành các tập tin đối tượng (object) và liên kết (link) các đối tượng đó
lại với nhau thành một chương trình có thể thực thi được (executable)
thống nhất.

background image

6

1.2 Môi trường làm vic Turbo C

1. Gọi Turbo C
2. Soạn thảo chương trình mới
3. Ghi chương trình đang soạn thảo vào đĩa
4. Thực hiện chương trình
5. Mở một chương trình đã có trên đĩa
6. Thoát khỏi Turbo C và trở về DOS (hay Windows)
7. Sử dụng một số lệnh trên thanh menu

background image

7

1.3 Các thành phn trong chương trình C

- Bộ ký tự
- Các từ khoá trong C
- Lời chú thích đặt trong cặp dấu /* và */

hoặc sau //

background image

8

Ví d 1:

/*VIDU.CPP*/
#include <stdio.h>

int

main()

{

printf(“Day la vi du \n");
printf(“don gian Lap trinh C\n");

return 0;

}

/*VIDU.CPP*/
#include <stdio.h>

int

main()

{

printf(“Day la vi du \n");
printf(“don gian Lap trinh C\n");

return 0;

}

Th

Th

ư

ư

vin nhp xut chun

vin nhp xut chun

Ghi chú

Ghi chú

Hàm main

Hàm main

Báo CT kết thúc cho HĐH

Báo CT kết thúc cho HĐH

background image

9

Ví d 2

#include <stdio.h>
#include <conio.h>

int

main(void)

{

int

a, b;

printf(“Nhap 2 so ngguyen: ");
scanf("%d %d", &a, &b);
printf("%d - %d = %d\n", a, b, a - b);
getch();
return 0;

}

#include <stdio.h>
#include <conio.h>

int

main(void)

{

int

a, b;

printf(“Nhap 2 so ngguyen: ");
scanf("%d %d", &a, &b);
printf("%d - %d = %d\n", a, b, a - b);
getch();
return 0;

}

Khai báo 2 biến s

nguyên, “a” và “b”

Nhp 2 s nguyên

vào a và b

Viết các biu thc “a”,

“b” và “a-b” theo định

dng %d

Nhap 2 so nguyen: 21 17
21 - 17 = 4

Nhap 2 so nguyen: 21 17
21 - 17 = 4

background image

10

Ghi chú:

Phần chú thích được trình biên dịch bỏ qua

Các từ có phân biệt chữ hoa và chữ thường

Câu lệnh luôn được kết thúc bằng dấu ;

Chuỗi ký tự phải ghi giữa cặp nháy kép “

In xuống dòng dùng ký tự \n

Chương trình C gồm 1 hoặc nhiều hàm, hàm
đượ

c gọi thực hiện đầu tiên là hàm main.

background image

11

1.4 Các bước cơ bn khi viết

chương trình

1.

Phân tích, đặc tả bài toán

2.

Tìm lời giải (thuật toán) và kiểu dữ liệu.

3.

Viết chương trình bằng ngôn ngữ lập trình

4.

Chạy thử sửa lỗi.

5.

Tổng kết chương trình

background image

12

1.5 Các kiu d liu cơ bn

trong C

void

Không giá trị

8 bytes

double

Số thực chính
xác kép

4 bytes

float

Số thực

2 bytes

int

Số nguyên

1 byte

char

Ký tự

Kích thước

T khóa

Kiu

background image

13

Kiu logic trong C

Trong C không có kiểu dữ liệu logic
(nhận các giá trị ĐÚNG – SAI), thay vào
đ

ó các biểu thức so sánh sẽ cho kết quả

S

Biểuthức có giá trị

0

(0.0) ứng với kết

quả SAI (FALSE)

Biểu thức có giá trị khác không như :

1,

3.5, -7, 10.4, …

đề

u được xem là ĐÚNG

(TRUE)

background image

14

1.5 Các kiu d liu cơ bn (tiếp)

B chuyn kiu (modifiers)

signed (có du)

unsigned (không du)

short

(số nguyên ngắn)

long (s nguyên độ dài gp đôi)

background image

15

DataType

3.4 * (10**-4932) to 1.1 * (10**+4932)

80 bits

long double

1.7 * (10**-308) to 1.7 * (10**+308)

64 bits

double

3.4 * (10**-38) to 3.4 * (10**+38)

32 bits

float

-2,147,483,648 to 2,147,483,647

32 bits

long

0 to 4,294,967,295

32 bits

unsigned long

-32,768 to 32,767

16 bits

int

-32,768 to 32,767

16 bits

short int

0 to 65,535

16 bits

unsigned int

-32,768 to 32,767

16 bits

enum

-128 to 127

8 bits

char

0 to 255

8 bits

unsigned char

Range

Length

Type

background image

16

1.6 Khai báo trong C

- Tất cả các yếu tố trong chương trình do người lập trình

đặ

t ra phải được khai báo trước khi sử dụng, khai báo

trước hết phải đặt tên cho yếu tố đó.

- Tên hay còn gọi là danh hiệu(identifier) dùng để đặt cho

biến, hằng, kiểu, hàm, ... Tên được đặt theo qui định:

Gồm chữ cái, chữ số, dấu gạch chân.

Không bắt đầu bằng chữ số

Không trùng với từ khóa.

Tên chuẩn là một số tên do C đặt sẵn như: sin, cos...

Độ

dài tối đa của tên là không giới hạn, tuy nhiên chỉ

có 31 ký tự đầu tiên là có ý nghĩa.

background image

17

1. Khai báo biến

Khai báo:

Biến là đại lượng được người lập trình định
nghĩa và được đặt tên thông qua việc khai báo
biến. Biến dùng để chứa dữ liệu trong quá
trình thực hiện chương trình và giá trị của biến
có thể thay đổi trong quá trình này.

Mỗi biến thuộc về một kiểu dữ liệu xác định và
có giá trị thuộc kiểu đó.

<kiểu> <tên biến>;

background image

18

1. Khai báo biến (tiếp)

Ví dụ:

int a, b, c; /*Ba biến a, b,c có kiểu int*/
long int chu_vi; /*Biến chu_vi có kiểu long*/
float nua_chu_vi; /*Biến nua_chu_vi có kiểu float*/
double dien_tich; /*Biến dien_tich có kiểu double*/

a) Khai báo biến ngoài (biến toàn cục): Các biến được đặt

bên ngoài tất cả các hàm(kể cả hàm main) và phạm vi
sử dụng trong toàn bộ chương trình.

b) Khai báo biến trong(biến cục bộ): Các biến được đặt ở

bên trong hàm hay khối lệnh. Các biến này chỉ có tác
dụng trong hàm hoặc khối lệnh tương ứng

background image

19

1. Khai báo biến (tiếp)

Ví dụ 1:
#include <stdio.h>
#include<conio.h>
int a; //khai bao bien ngoai
int main ()

{

int I,j; //khai bao bien ben trong hàm main
clrscr();
i=1; j=2;
a=3;
printf("\n Gia tri cua i la %d",i);
printf("\n Gia tri cua j la %d",j);
printf("\n Gia tri cua bienngoai a la %d",a);
getch();
return 0;

}

background image

20

2. Khai báo hng

Khai báo

Hoặc được khai báo thông qua gán giá trị đầu

Hằng (Constant) là đại lượng không đổi trong quá trình thực thi

của chương trình.

Hằng bao gồm hằng số nguyên, hằng số thực, hằng ký tự, hằng

chuỗi ký tự.

a) Hằng số:

Hằng số nguyên: 10, -167
Hằng số thực: 1.234, -0.34E3

-

Ngầm định, trình biên dịch ghép hằng vào kiểu dữ liệu tương ứng

nhỏ nhất
Ví dụ:

hằng số 10 có kiểu int
hằng số 60000 có kiểu unsigned
hằng số 100000 có kiểu long

- C qui ước các hằng số thực có kiểu double

const [kiểu] <tên hằng> = <giá trị>;

background image

21

2. Khai báo hng (tiếp)

-

Trường hợp muốn chỉ rõ kiểu của hằng, dùng tiếp vĩ
ngữ(suffix): U(unsigned), L (long), F(float)

-

Ví dụ:

-

1,123,31000,-234

có kiểu int

-

-34L, 20000L

có kiểu long

-

34U, 40000

có kiểu unsigned

-

23.45F, 34,4-3F

có kiểu float

-

12.23, 4522,78

có kiểu double

-

Hằng bắt đầu 0X là hằng thuộc hệ cơ số 16

-

Hằng bắt đầu 0 là hằng thuộc hệ cơ số 8

-

Ví dụ:

-

int i=0x20, j=20, k=020; // i=32 và k=16 trong hệ cơ số 10

-

background image

22

Ví d v hng

Các hằng pi, t, heso được tạo với từ khóa const

#include <stdio.h>

int main(void)
{

const long double pi = 3.141592653590L;
const t = 7;
const heso = 9.123;

days_in_week = 5;

return 0;

}

#include <stdio.h>

int main(void)
{

const long double pi = 3.141592653590L;
const t = 7;
const heso = 9.123;

days_in_week = 5;

return 0;

}

Li

Li

background image

23

b) Hng ký t

- Hằng ký tự là một ký tự riêng biệt được viết trong

cặp dấu nháy đơn (‘ ‘). Mỗi một ký tự tương ứng
với một giá trị trong bảng mã ASCII. Hằng ký tự
cũng được xem như trị số nguyên.

Ví dụ: ‘a’, ‘A’, ‘0’, ‘9’
- Có thể thực hiện các phép toán số học trên 2 ký

tự (thực chất là thực hiện phép toán trên giá trị
ASCII của chúng)

background image

24

b) Hng ký t(tiếp)

Một số ký tự không tin được (có trị ASCII từ 0 đến 31) trình

biên dịch C nhận biết điều này bằng cặp ký tự bắt đầu

bằng ‘\’:
\n newline
\t

tab

\b backspace
\r

carriage return

\f

form feed

\a alert
\’

\”

\\

\

background image

25

Hng chui ký t

Hằng chuỗi ký tự là một chuỗi hay một xâu ký tự

đượ

c đặt trong cặp dấu nháy kép (“ ”).

-

Các chuỗi được lưu trữ trong bộ nhớ như là một
dãy các ký tự liên tiếp và kết thúc bằng ký tự
rỗng (NULL) có mã ASCII là 0.
Ví dụ:

“Ngon ngu lap trinh C”
“Khoa CNTT-DHNT”

- Phân biệt: “A” và ‘A’

background image

26

Hng x lý trước biên dch

Các hằng có thể được xác lập trước khi biên
dịch

Bản chất là tìm kiếm và thay thế

Thường được đặt tên với các chữ cái in hoa

#include <stdio.h>

#define PI

3.141592653590L

#define DAYS_IN_WEEK

7

#define SUNDAY

0

int

day = SUNDAY;

#include <stdio.h>

#define

PI

3.141592653590L

#define

DAYS_IN_WEEK

7

#define

SUNDAY

0

int

day = SUNDAY;

Tìm t“PI”, thay bng 3.1415....

Lưu ý: không

có “=” và “;”

background image

27

3. Biu thc

Biểu thức là sự kết hợp giữa các toán tử (operator) và
các toán hạng (operand) theo đúng một trật tự nhất định.

Mỗi toán hạng có thể là một hằng, một biến hoặc một
biểu thức khác.

Trong trường hợp, biểu thức có nhiều toán tử, ta dùng
cặp dấu ngoặc đơn () để chỉ định toán tử nào được thực
hiện trước.

Ví dụ: Biểu thức nghiệm của phương trình bậc hai:

(-b + sqrt(Delta))/(2*a)

Trong đó 2 là hằng; a, b, Delta là biến.

background image

28

Chương 2: Các toán t

1. Toán tử gán
2. Toán tử số học
3.Toán tử quan hệ
4. Toán tử logic
5. Toán tử thao tác bit
6. Toán tử sizeof

7. Toán tử chọn theo điều kiện
8, Toán tử con trỏ
9. Toán tử dấu phẩy
10.Thứ tự ưu tiên của các phép toán
11. Hàm xuất dữ liệu
12. Hàm nhập dữ liệu

background image

29

1. Toán t gán:

Cú pháp

Có thể sử dụng liên tiếp nhiều phép gán

Giá trị được gán sẽ sẵn sàng cho lệnh kế tiếp

int i, j, k, l, m, n;

i = j = k = l = m = n = 22;

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

int i, j, k, l, m, n;

i = j = k = l = m = n = 22;

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

“n = 22” gán trước, li
gán “n” cho “m”, “m”
cho “l”, …

i, j, k, l, m,

n đều nhn giá tr22.

“j” được gán 93, giá tr 93 s
đượ

c in ra màn hình

<biến> = <biều thức>

background image

30

Toán t gán (tiếp)

Có thể sử dụng liên tiếp nhiều phép gán

int i, j, k, l, m, n;

i = j = k = l = m = n = 11;

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

int i, j, k, l, m, n;

i = j = k = l = m = n = 11;

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

“n = 11” gán trước, li
gán “n” cho “m”, “m”
cho “l”, …

i, j, k, l, m,

n đều nhn giá tr11.

“j” được gán 91, giá tr 91 s
đượ

c in ra màn hình

background image

31

Mt s phép gán đặc bit

Các phép gán kết hợp toán tử khác:

+=

-=

*=

/=

%=

&=

|=

^=

<<=

>>=

Tổng quát:

<biến> <toán t>= <biu thc>

tương đương:

<biến> = <biến> <toán t> <biu thc>

a += 27;

a += 27;

a = a + 27;

a = a + 27;

f /= 9.2;

f /= 9.2;

f = f / 9.2;

f = f / 9.2;

i *= j + 2;

i *= j + 2;

i = i * (j + 2);

i = i * (j + 2);

background image

32

2. Các các phép toán s hc

+

cộng

-

trừ

*

nhân

/

chia

%

chia lấy dư

Lu ý:

“/” cho kết qu ph thuc vào kiu ca các toán hng

“%” không thc hin được vi các s thc

background image

33

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

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” kiu int, “/” là

phép chia ly nguyên

k nhn giá tr1

“f”, “g” kiu double, “/”

là phép chia s thc

h nhn giá tr 1.25

Phép chia nguyên, bt

k “h” có kiu double.

Kết qu là 1.00000

background image

34

Phép tăng (gim)

1

NNLT C có 2 toán tử đặc biệt hỗ trợ việc tăng (giảm)
giá trị của một biến thay đổi 1 đơn vị

++

tăng 1

--

giảm 1

Các toán tử này có thể đặt ở trước hoặc sau biến.

int i = 5, j = 4;

i ++;
-- j;
++ i;

int i = 5, j = 4;

i ++;
-- j;
++ i;

“i”

6

“j”

3

“i”

7

background image

35

Trước hay sau ?

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:

#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=6
i=5, j=6

i=6, j=6
i=5, j=6

Tương đương:

1. j++;
2. i = j;

Tương đương:

1. i = j;
2. j++;

background image

36

Chuyn kiu/Ép kiu (Type Casting)

Chuyểnkiểu làm thay đổi

tm thi

kiểu của một

biến trong một biểu thức.

int main(void)
{

int i = 5, j = 4;
double f;

f = (double)i / j;
f = i / (double)j;
f = (double)i / (double)j;
f = (double)(i / j);

return 0;

}

int main(void)
{

int i = 5, j = 4;
double f;

f = (double)i / j;
f = i / (double)j;
f = (double)i / (double)j;
f = (double)(i / j);

return 0;

}

Phép chia s nguyên

đượ

c thc hin, kết

qu, 1, được đổi sang

kiu double, 1.00000

background image

37

3. Các toán t quan h (Relational Operators)

NNLT C hỗ trợ các toán tử quan hệ:

<

bé hơn

<=

bé hơn hay bằng

>

lớn hơn

>=

lớn hơn hay bằng

==

bằng

!=

khác

Tất cả đều cho kết quả

1

khi so sánh đúng

0

trong trườ

ng hợp ngược lại.

background image

38

4. Toán t logic

NNLT C hỗ trợ các toán tử logic:

&&

và (and)

||

hoặc (or)

!

phủ định (not)

Tất cả đều cho kết quả 1 hoặc 0 tương ứng
các trường hợp ĐÚNG hoặc SAI

int i, j = 10, k = 28;

i = ((j > 5) && (k < 100)) || (k > 24);

int i, j = 10, k = 28;

i = ((j > 5) && (k < 100)) || (k > 24);

background image

39

5. Toán t thao tác bit (Bitwise Operators)

Các toán tử trên bit chỉ có tác dụng trên các kiểu số
nguyên:

&

And

|

Or

^

Xor

~

Not

<<

Shift Left

>>

Shift Right

background image

40

6. Toán t sizeof

sizeof

(Obj)

Cho biết kích thước của đối tượng theo số byte

#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 bytes
a short is 2 bytes
a double is 8 bytes

"big" is 4 bytes
a short is 2 bytes
a double is 8 bytes

background image

41

7. Toán t chn theo điu kin

(

đ

iu kin

) ?

BT1

:

BT2

Biểu thức nhận giá trị

BT1

nếu điều kiện khác 0

(ĐÚNG), các trường hợp khác nhận giá trị

BT2

int i, j = 100, k = -1;

i = (j > k) ? j : k;

int i, j = 100, k = -1;

i = (j > k) ? j : k;

int i, j = 100, k = -1;

i = (j < k) ? j : k;

int i, j = 100, k = -1;

i = (j < k) ? j : k;

Nếu (j > k)

i = j;

Ngược li

i = k;

Nếu (j > k)

i = j;

Ngược li

i = k;

Nếu (j < k)

i = j;

Ngược li

i = k;

Nếu (j < k)

i = j;

Ngược li

i = k;

background image

42

8. Toán t con tr

+ Một con trỏ là địa chỉ trong bộ nhớ của một biến. Một biến

con trỏ là một biến được khai báo riêng để chứa một con

trỏ đến một đối tượng của kiểu đã chỉ ra nó.

+ Có hai toán tử được sử dụng để thao tác với các con trỏ.

- Toán tử thứ nhất là &, là một toán tử quy ước trả về địa

chỉ bộ nhớ của hệ số của nó.
Ví dụ: p = &n
Đặ

t vào biến m địa chỉ bộ nhớ của biến count.

Chẳng hạn, biến n ở vị trí bộ nhớ 2000, giả sử n có giá trị

là 100. Sau câu lệnh trên p sẽ nhận giá trị 2000.
- Toán tử thứ hai là *, là một bổ sung cho &; đây là một

toán tử quy ước trả về giá trị của biến được cấp phát tại
đị

a chỉ theo sau đó.

Ví dụ: m = *p
Sẽ đặt giá trị của n vào m. Bây giờ m sẽ có giá trị là 100 vì

100 được lưu trữ tại địa chỉ 2000.

background image

43

9. Toán t du phy ,

Toán tử dấu , được sử dụng để kết hợp các
biểu thức lại với nhau. Bên trái của toán tử
dấu , luôn được xem là kiểu void. Điều đó
có nghĩa là biểu thức bên phải trở thành giá
trị của tổng các biểu thức được phân cách
bởi dấu phẩy.

Ví dụ: x = (y=3,y+1);

Trước hết gán 3 cho y rồi gán 4 cho x. Cặp
dấu ngoặc đơn là cần thiết vì toán tử dấu ,
có độ ưu tiên thấp hơn toán tử gán.

background image

44

10. Độ ưu tiên ca toán t

Thứ tự thực hiện các toán tử trong một biểu thức phụ
thuộc vào

độ

ưu tiên

của chúng.

Có 15 mức ưu tiên.

Thông thường, toán tử một ngôi có độ ưu tiên cao hơn
toán tử hai ngôi.

Các cặp dấu ngoặc đơn () thường được dùng để chỉ rõ
thứ tự các toán tử.

#include <stdio.h>
int main(void)
{

int j = 3 * 4 + 48 / 7;
printf("j = %i\n", j);
return 0;

}

#include <stdio.h>
int main(void)
{

int j = 3 * 4 + 48 / 7;
printf("j = %i\n", j);
return 0;

}

j = 18

j = 18

background image

45

Bng th t thc hin các toán t

Toán t

Th t (nếu cùng ĐƯT)

() [] -> .

! ++ -- - + (cast) * & sizeof

* / %

+ -

<< >>

< <= >= >

== !=

&

|

^

&&

||

?:

= += -= *= /= %=

background image

46

Ví d

#include <stdio.h>

int main(void)
{

int

i = 0, j, k = 7, m = 5, n;

j = m += 2;
printf("j = %d\n", j);
j = k++ > 7;
printf("j = %d\n", j);
j = i == 0 & k;
printf("j = %d\n", j);
n = !i > k >> 2;
printf("n = %d\n", n);
return 0;

}

#include <stdio.h>

int main(void)
{

int

i = 0, j, k = 7, m = 5, n;

j = m += 2;
printf("j = %d\n", j);
j = k++ > 7;
printf("j = %d\n", j);
j = i == 0 & k;
printf("j = %d\n", j);
n = !i > k >> 2;
printf("n = %d\n", n);
return 0;

}

background image

47

11. Hàm xut - printf

Xuất dữ liệu ra màn hình:

printf

(

"

%d

-

%d

=

%d

\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:

%d: 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

printf(“Chuỗi định dạng ”, Các biểu thức);

background image

48

11. Hàm xut – printf (tiếp)

In số thực có 3 số lẻ, nếu số cần in có nhiều hơn 3 số lẻ thì làm tròn.

%.3f

In số thực tối đa 6 ký số (tính luôn dấu chấm), nếu số cần in nhiều hơn 6

ký số thì in hết

%6f

In số thực

%f

In số nguyên tối đa 4 ký số, nếu số cần in nhiều hơn 4 ký số thì in hết

%4d

In ra số nguyên

%d

Ví dụ

Xuất số nguyên dạng khoa học (nhân 10 mũ x)

%e hoặc %E hoặc %g hoặc

%G

Xuất chuỗi ký tự

%s

Xuất một ký tự

%c

Xuất số nguyên hệ thập lục phân

%x

Xuất số nguyên hệ bát phân

%o

Xuất số thực có <số chữ số thập phân> theo quy tắc làm tròn số.

%[.số chữ số thập phân] f

Xuất số nguyên

%d

background image

49

12. Hàm nhp - scanf

Nhập dữ liệu từ bàn phím

scanf

(

"%d %d"

,

&

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

scanf(“Chuỗi định dạng”, địa chỉ của các biến);

background image

50

12. Hàm nhp – scanf(tiếp)

Nhập số thực tối đa 6 ký số (tính luôn dấu chấm), nếu nhập nhiều hơn 6 ký số thì chỉ

nhận được 6 ký số đầu tiên (hoặc 5 ký số với dấu chấm)

%6f

Nhập số thực

%f

Nhập số nguyên tối đa 4 ký số, nếu nhập nhiều hơn 4 ký số thì chỉ nhận được 4 ký số

đầ

u tiên

%4d

Nhập số nguyên

%d

Ví dụ:

Nhập một ký tự

%c

Nhập số thực có tối đa <số ký số> tính cả dấu chấm

%[số ký số] f

Nhập số nguyên có tối đa <số ký số>

%[số ký số]d

Ý nghĩa

Đị

nh dạng

background image

51

Chương 3: Các cu trúc điu khin

1. Lệnh if
2. Lệnh switch
3. Lệnh for
4. Lệnh while
5. Lệnh do .. While

background image

52

1. Lnh if

Dùng để thực hiện hay không một
phát biểu theo một điều kiện.

Dạng 1:

if (

<Bthức ĐK>)

<Lệnh S

>

;

Ví dụ

if

(d

elta > 0)

{

x1 = (-b + sqrt(delta))/2/a;
x2 = (-b - sqrt(delta))/2/a;

}

Bthức ĐK

Lệnh S

T

Chỉ có 1
phát biểu
trong thân
của if

F

background image

53

Dng 2 ca lnh if

Dùng để chọn lựa phát biểu nào sẽ được thực hiện
giữa 2 phát biểu.

Cú pháp:

if (

< Bthức ĐK >)

<Lệnh S

1> ;

else

<

Lệnh S

2>

;

#include <stdio.h>
#include <conio.h>
int main ()
{

float a;
printf("Nhap a = "); scanf("%f",&a);
if (a !=0 )

printf("Nghich dao cua %f la %f",a,1/a);

else

printf(“Khong the tim nghich dao cua a”);

getch();
return 0;

}

Bthức ĐK

Lệnh S

1

T

F

Lệnh S

2

background image

54

Trường hp đặc bit

Xét phát biểu sau:

i

f

(

<ĐK1>)

if

(

<ĐK2>) <S1>;

else

<S2>

;

else sẽ thuộc về if nào gần 1 chưa có else

else

else

?

ĐK2

S1

Yes

No

S2

ĐK2

Yes

No

background image

55

2. Lnh switch

Dùng để chọn một

trong số những

phát biểu để thực

hiện tùy theo giá trị

của biu thc chn.

Các giá trị case: chỉ

ra các trường hợp

phân nhánh.

Các giá trị case là

một hay nhiều giá

trị rời rạc theo sau

là dấu : và một phát

biểu tương ứng, kết

thúc là break.

Cú pháp:
switch (<Biểu thức>)
{

case <giá trị 1>: <LệnhS1>; break;

case <giá trị n>: <Lệnh Sn>; break;
[default : <lệnh mặc định Sn+

1

>;]

}

BiểuThức

S1

S2

Sn+

1

Sn

Gtrị1

Gtrị2

GtrịN

default

background image

56

Ví d 1

Nhập vào một số nguyên, chia số nguyên này cho 2 lấy phần dư. Kiểm tra

nếu phần dư bằng 0 thì in ra thông báo “số chẵn”, nếu số dư bằng 1 thì

in thông báo “số lẻ”.

#include <stdio.h>
#include<conio.h>
int main ()
{ int songuyen, phandu;

clrscr();
printf("\n Nhap vao so nguyen ");
scanf("%d",&songuyen); phandu=(songuyen % 2);
switch(phandu)

{

case 0: printf("%d la so chan ",songuyen); break;
case 1: printf("%d la so le ",songuyen); break;

}

getch();
return 0;

}

background image

57

Ví d 2

Ví dụ 2: Nhập vào 2 số nguyên và 1 phép toán.
- Nếu phép toán là ‘+’, ‘-‘, ‘*’ thì in ra kết qua là tổng, hiệu, tích của 2 số.
- Nếu phép toán là ‘/’ thì kiểm tra xem số thứ 2 có khác không hay không? Nếu khác không thì in ra

thương của chúng, ngược lại thì in ra thông báo “khong chia cho 0”.

#include <stdio.h>
#include<conio.h>
int main ()
{ int so1, so2; float thuong; char pheptoan;

printf("\n Nhap vao 2 so nguyen "); scanf("%d%d",&so1,&so2);
fflush(stdin); /*Xóa ký tự enter trong vùng đệm trước khi nhập phép toán */
printf("\n Nhap vao phep toan "); scanf("%c",&pheptoan);
switch(pheptoan)
{

case '+': printf("\n %d + %d =%d",so1, so2, so1+so2); break;
case '-': printf("\n %d - %d =%d",so1, so2, so1-so2); break;
case '*': printf("\n %d * %d =%d",so1, so2, so1*so2); break;
case '/': if (so2!=0)

{ thuong=float(so1)/float(so2);

printf("\n %d / %d =%f", so1, so2, thuong); }

else printf("Khong chia duoc cho 0"); break;

default : printf("\n Chua ho tro phep toan %c", pheptoan); break;

}
getch();
return 0;

}

background image

58

3. Lnh for

Lệnh for cho phép lặp lại các lệnh cho đến khi Biểu thức

đ

iều kiện 2 là sai

Cú pháp:

for (<biểuthức 1>;<biểuthức 2>;<biểuthức 3>) <lệnh S>

Bthức 2

Lệnh S

T

F

BThức 3

Bthức 1

Ví dụ: Viết chương trình nhập vào một số nguyên
n. Tính tổng của các số nguyên từ 1 đến n.
#include <stdio.h>
#include<conio.h>
int main ()
{ unsigned int n,i,tong;

printf("\n Nhap vao so n:");

scanf("%d",&n);

tong=0;
for (i=1; i<=n; i++) tong+=i;
printf("\n Tong tu 1 den %d =%d ",n,tong);
getch();
return 0;

}

background image

59

4. Lnh while

Dùng để lặp lại một công việc nào đó

cho đến khi điều kiện sai.

Cú pháp

w

hile

(<Biu thc ĐK>) <Lnh S>

while kiểm tra điều kiện trước rồi mới

thực hiện lệnh S.

Số lầp lặp là không biết trước.
Số lần lặp tối thiểu là 0 và tối đa là

không xác định.

Chú ý: Trong thân ca while phi có

ít nht mt phát biu có kh năng
thay
đổi giá tr ca điu kin. Nếu
không s
lp vô tn (infinite loop)

Ví dụ:

gt=1; i=1;

while

(i<n)

{

i++;
gt=gt*i;

}

BTĐK

Lệnh S

T

F

background image

60

Ví d v lnh while

Ví dụ 2: Viết chương trình nhập vào một số nguyên n. Tính tổng của các

số nguyên từ 1 đến n.

#include <stdio.h>
#include<conio.h>
int main ()
{ unsigned int n,i,tong;

printf("\n Nhap vao so nguyen duong n:"); scanf("%d",&n);
tong=0;
i=1;
while (i<=n)
{

tong+=i;
i++;

}
printf("\n Tong tu 1 den %d =%d ",n,tong);
getch();
return 0;

}

background image

61

5. Lnh do .. while

Vòng lặp do … while dùng để lặp lại một công việc

nào đó khi điều kiện còn đúng.

Cú pháp:

do <Lnh S> while (<Biu thc điu kin>)

Thực hiện xong lệnh S mới kiểm tra điều kiện.

Số lầp lặp là không biết trước.

Số lần lặp tối thiểu là 1 và tối đa là không xác
đị

nh.

Chú ý: Trong thân ca do .. While phi có ít

nht mt phát biu có kh năng thay đổi giá tr

ca điu kin. Nếu không s lp vô tn (infinite

loop)

BTĐK

S

F

T

background image

62

Ví d v lnh do .. while

Viết chương trình nhập vào một số nguyên n. Tính tổng của các số nguyên

từ 1 đến n.

#include <stdio.h>
#include<conio.h>
int main ()
{ unsigned int n,i,tong;

printf("\n Nhap vao so nguyen duong n:"); scanf("%d",&n);
tong=0;
i=1;
do
{

tong+=i;
i++;

} while (i<=n);
printf("\n Tong tu 1 den %d =%d ",n,tong);
getch();
return 0;

}

background image

63

6. CÁC CÂU LNH ĐẶC BIT

1. Lệnh break

Cú pháp: break

Dùng để thoát khỏi vòng lặp. Khi gặp câu lệnh này trong vòng lặp, chương trình sẽ

thoát ra khỏi vòng lặp và chỉ đến câu lệnh liền sau nó. Nếu nhiều vòng lặp thì

break sẽ thoát ra khỏi vòng lặp gần nhất. Ngoài ra, break còn được dùng trong

cấu trúc lựa chọn switch.

2. Lệnh continue

Cú pháp: continue

- Khi gặp lệnh này trong các vòng lặp, chương trình sẽ bỏ qua phần còn lại trong

vòng lặp và tiếp tục thực hiện lần lặp tiếp theo.
- Ðối với lệnh for, biểu thức 3 sẽ được tính trị và quay lại bước 2.
- Ðối với lệnh while, do while; biểu thức điều kiện sẽ được tính và xét xem có thể

tiếp tục thực hiện <Lệnh S> nữa hay không? (dựa vào kết quả của biểu thức điều

kiện).

Ví dụ:

while (x != y)
{


if (x==a) continue;
b+=6;

if (y==b) break;

}

background image

64

Chương 4: Các hàm trong C

1. Khái niệm hàm trong C

Tại sao phải dùng chương trình con:

Có công việc cần phải được thực hiện tại nhiều nơi trong chương

trình => tách công việc đó thành chương trình con

Phân đoạn, module chương trình để thuận tiện trong quản lý,

trình bày và phát triển.

Trong C, chương trình con được gọi là hàm. Hàm trong C có

thể trả về kết quả thông qua tên hàm hay có thể không trả về

kết quả.

Hàm có hai loại: hàm chuẩn (hàm được trình biên dịch C viết

sẵn) và hàm tự định nghĩa.

Một hàm khi được định nghĩa thì có thể được gọi trong

chương trình.

Trong C, hàm main() được gọi thực hiện đầu tiên

background image

65

Ví d

Viết hàm main dùng để nhập vào 2 số nguyên a,b và in ra màn hình số lớn trong 2

số đã nhập

#include <stdio.h>
#include <conio.h>
int max(int a, int b);

int main()
{

int a, b, c;
printf("\n Nhap vao 3 so a, b,c ");
scanf("%d%d%d",&a,&b,&c);
printf("\n So lon la %d",max(a, max(b,c)));
getch();
return 0;

}

int max(int a, int b)
{

return (a>b) ? a:b;

}

background image

66

Ghi chú

-

Dòng

int max(int a, int b); gọi là Prototype của hàm, qui định

kiểu trả về của hàm, số lượng tham số và kiểu của chúng.

-

Các Prototype của các hàm sẵn có chứa trong các tập tin *.h

-

Hàm có thể được gọi bởi hàm main(), hoặc từ một hàm khác

hoặc chính nó(đệ qui).

-

Hàm có thể có tham số hoặc không.

-

Hàm chỉ có 1 điểm vào (lệnh đầu tiên của hàm) nhưng có thể

có nhiều điểm ra (lệnh return).

-

Một hàm có thể được viết ngay trong văn bản chương trình

(như trên), hoặc được viết trong tập tin khác và đưa vào

chương trình bằng chỉ thị #include, hoặc được biên dịch riêng

rẽ và kết nối lại.

-

Khác với ngôn ngữ lập trình Pascal:

-

Ngôn ngữ C không có khái niệm thủ tục (thật ra thủ tục không

khác hàm, ở thủ tục không quan tâm đến giá trị trả về)

-

Không cho phép các hàm lồng vào nhau

background image

67

2. Hàm thư vin/hàm chun

Hàm thư viện là những hàm đã được định nghĩa sẵn trong một thư viện

nào đó, muốn sử dụng các hàm thư viện thì phải khai báo thư viện trước

khi sử dụng bằng lệnh #include <tên thư viện.h>

Ý nghĩa ca mt s th vin thng dùng:

1. stdio.h : Thư viện chứa các hàm vào/ ra chuẩn (standard input/output). Gồm các

hàm printf(), scanf(), getc(), putc(), gets(), puts(), fflush(), fopen(), fclose(),

fread(), fwrite(), getchar(), putchar(), getw(), putw()…

2. conio.h : Thư viện chứa các hàm vào ra trong chế độ DOS (DOS console). Gồm

các hàm clrscr(), getch(), getche(), getpass(), cgets(), cputs(), putch(),

clreol(),…

3. math.h: Thư viện chứa các hàm tính toán gồm các hàm abs(), sqrt(), log().

log10(), sin(), cos(), tan(), acos(), asin(), atan(), pow(), exp(),…

4. alloc.h: Thư viện chứa các hàm liên quan đến việc quản lý bộ nhơ. Gồm các

hàm calloc(), realloc(), malloc(), free(), farmalloc(), farcalloc(), farfree(), …

5. io.h: Thư viện chứa các hàm vào ra cấp thấp. Gồm các hàm open(), _open(),

read(), _read(), close(), _close(), creat(), _creat(), creatnew(), eof(),

filelength(), lock(),…

6. graphics.h: Thư viện chứa các hàm liên quan đến đồ họa. Gồm initgraph(),

line(), circle(), putpixel(), getpixel(), setcolor(), …

...
Muốn sử dụng các hàm thư viện thì ta phải xem cú pháp của các hàm và sử dụng

theo đúng cú pháp (xem trong phần trợ giúp của Turbo C).

background image

68

3. Hàm ca người s dng

Hàm người dùng là những hàm do người lập
trình tự tạo ra nhằm đáp ứng nhu cầu xử lý của
mình.

Cấu trúc của hàm:

<kiểu kết quả> <Tên hàm> ([<kiểu> <tham số>][,<kiểu><tham số>][…])
{

[Khai báo]
<câu lệnh thực hiện hàm>
[return <Biểu thức>;]

}

background image

69

Truyn Bng Tr - Tham biến - Tham Chiếu

Ví dụ: Viết chương trình hoán vị 2 phần tử

#include<stdio.h>

// Truyn bng tham tr
void Swap1 (int x, int y)
{

int temp = x;
x = y;
y = temp;

}
// Truyn bng tham biến (con tr)
void Swap2 (int *x, int *y)
{

int temp = *x;
*x = *y;
*y = temp;

}
// Truyn bng tham chiếu
void Swap3 (int &x, int &y)
{

int temp = x;
x = y;
y = temp;

}

1
2
3
4
5
6

7
8
9

10
11

12
13
14
15
16
17
18

int main()
{ int m=12; n=28;

Swap1(m,n);
printf(“m=%d n=%d\n”,m,n”);
Swap2(&m,&n);
printf(“m=%d n=%d\n”,m,n”);
Swap3(m,n);
printf(“m=%d n=%d\n”,m,n”);
return 0;

}

?

?

background image

70

4. Tham tr và tham biến

Mặc nhiên, việc truyền tham số cho hàm trong C là truyền theo giá trị; nghĩa là

các giá trị thực (tham số thực) không bị thay đổi giá trị khi truyền cho các

tham số hình thức

Ví dụ 1: Giả sử muốn in ra các, mỗi dòng gồm 50 ký tự nào đó. Để đơn giản ta

viết hàm, hàm này sẽ in ra trên một dòng 50 ký tự cho trước.

#include <stdio.h>
#include <conio.h>
void InKT(char ch)
{ int i;

for(i=1;i<=50;i++) printf(“%c”,ch);

]

printf(“\n”);

}

int main()
{

char c = ‘A’;
InKT(‘*’); /* In ra 50 dau * */
InKT(‘+’);
InKT(c);
return 0;

}

Lưu ý:
- Trong hàm InKT ở trên, biến ch gọi là
tham số hình thức được truyền bằng giá
trị (gọi là tham trị của hàm). Các tham trị
của hàm coi như là một biến cục bộ trong
hàm và chúng được sử dụng như là dữ
liệu đầu vào của hàm.
-Khi chương trình con được gọi để thi
hành, tham trị được cấp ô nhớ và nhận
giá trị là bản sao giá trị của tham số thực.
-Việc thay đổi giá trị của chúng không có
ý nghĩa gì đối với bên ngoài hàm, không

nh hưởng đến chương trình chính,

nghĩa là không làm ảnh hưởng đến tham
số thực tương ứng.

background image

71

5. HÀM ĐỆ QUY

Đị

nh nghĩa: Một hàm được gọi là đệ quy nếu bên trong thân hàm có lệnh gọi đến chính nó.

Ví dụ: Định nghĩa giai thừa của một số nguyên dương n như sau:

n!=1* 2 * 3 *…* (n-1) *n = (n-1)! *n (với 0!=1)
Như vậy, để tính n! ta thấy nếu n=0 thì n!=1 ngược lại thì n!=n * (n-1)!

Với định nghĩa trên thì hàm đệ quy tính n! được viết:
#include <stdio.h>
#include <conio.h>
/*Hàm tính n! bằng đệ quy*/
unsigned int giaithua_dequy(int n)
{

if (n==0) return 1;
else return n*giaithua_dequy(n-1);

}

/*Hàm tính n! không đệ quy*/
unsigned int giaithua_khongdequy(int n)
{

unsigned int kq,i;
kq=1;
for (i=2;i<=n;i++) kq=kq*i;
return kq;

}

int main()
{

int n;
printf("\n Nhap so n can tinh giai thua "); scanf("%d",&n);
printf("\nGoi ham de quy: %d !=%u",n,giaithua_dequy(n));
printf("\nGoi ham khong de quy: %d != %u",

n,giaithua_khongdequy(n));

getch();
return 0;

}

background image

72

Đặ

c đim cn lưu ý khi viết hàm đệ quy

- Hàm đệ quy phải có 2 phần:

+ Phần dừng hay phải có trường hợp nguyên tố. Trong ví dụ ở

trên thì trường hợp n=0 là trường hợp nguyên tố.
+ Phần đệ quy: là phần có gọi lại hàm đang được định nghĩa.

Trong ví dụ trên thì phần đệ quy là n>0 thì n! = n * (n-1)!

- Sử dụng hàm đệ quy trong chương trình sẽ làm chương trình dễ

đọ

c, dễ hiểu và vấn đề được nêu bật rõ ràng hơn. Tuy nhiên

trong đa số trường hợp thì hàm đệ quy tốn bộ nhớ nhiều hơn

và tốc độ thực hiện chương trình chậm hơn không đệ quy.

- Tùy từng bài có cụ thể mà người lập trình quyết định có nên dùng

đệ

quy hay không (có những trường hợp không dùng đệ quy

thì không giải quyết được bài toán).

background image

73

6. Tham s ca hàm main()

-

Là 2 tham số : argc và argv

-

Tham số argc là số nguyên chỉ tham số trên dòng lệnh, có giá trị nhỏ nhất =1,
vì bản thân tên chương trình là tham số thứ nhất

-

Tham số argv là mảng các con trỏ, trỏ đến các tham số trên dòng lệnh: char
*argv[ ];

argv[0]: chứa địa chỉ của tên chương trình
argv[1]: chứa địa chỉ của tham số thứ nhất
argv[2]: chứa địa chỉ của tham số thứ hai

Ví dụ: Chương trình sau đã được biên dịch thành MYPRO.EXE, nếu nhập trên dòng lệnh

MYPRO thì có dòng nhắc nhở, nếu nhập MYPRO LAN thì Chao ban LAN

#include <stdio.h>
main(int argc, char *argv[])
{

if (argc !=2) printf(“Phai nhap Ten”);
else printf(“Chao ban %s\n”,argv[1]);

}

background image

74

Chương 5: D liu có cu trúc

1. Kiểu mảng:

- Mảng là một tập hợp các phần tử cố định có cùng một kiểu, gọi là

kiểu phần tử. Kiểu phần tử có thể là có các kiểu bất kỳ: ký tự, số,

chuỗi ký tự…; cũng có khi ta sử dụng kiểu mảng để làm kiểu

phần tử cho một mảng (trong trường hợp này ta gọi là mảng của

mảng hay mảng nhiều chiều).

- Có thể chia mảng làm 2 loại: mảng 1 chiều và mảng nhiều chiều.
- Khai báo mng vi s phn t xác định

Cú pháp: <Kiu> <Tên mng ><[s phn t]>

Ý nghĩa:
- Tên mng: đây là một cái tên đặt đúng theo quy tắc đặt tên của

danh biểu. Tên này cũng mang ý nghĩa là tên biến mảng.

- S phn tử: là một hằng số nguyên, cho biết số lượng phần tử tối

đ

a trong mảng là bao nhiêu (nói khác là kích thước của mảng).

- Kiu: mỗi phần tử của mảng có dữ liệu thuộc kiểu gì.
- Khi khai báo một biến mảng gồm có s phn t phần tử, phần tử

thứ nhất là tên mng [0], phần tử cuối cùng là tên mng[s

phn t -1]

background image

75

1. Kiu mng(tiếp)

Ví dụ: int a[10]; /* Khai báo biến mảng a gồm 10 phần tử , phần tử thứ

nhất là a[0], phần tử cuối cùng là a[9].*/

Có thể coi mảng a là một dãy liên tiếp các phần tử trong bộ nhớ như sau:

2. Khai báo mảng với số phần tử không xác định

Cú pháp: <Kiểu> <Tên mảng> <[]>

Khi khai báo, không cho biết rõ số phần tử của mảng, kiểu khai báo

này thường được áp dụng trong các trường hợp: vừa khai báo vừa

gán giá trị, khai báo mảng là tham số hình thức của hàm.

a. Vừa khai báo vừa gán giá trị

Cú pháp: <Kiểu> <Tên mảng> []= {Các giá trị phân cách bởi dấu ,}
Nếu vừa khai báo vừa gán giá trị thì mặc nhiên C sẽ hiểu số phần tử

của mảng là số giá trị mà chúng ta gán cho mảng trong cặp dấu {}.

b. Khai báo mảng là tham số hình thức của hàm, trong trường hợp này ta

không cần chỉ định số phần tử của mảng là bao nhiêu.

Vị trí

0

1

2

3

4

5

6

7

8

9

Tên phần tử a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

background image

76

1. Kiu mng(tiếp)

- Truy xuất từng phần tử của mảng

+ Mỗi phần tử của mảng được truy xuất thông qua Tên biến mảng

theo sau là chỉ số nằm trong cặp dấu ngoặc vuông [ ]. Chẳng hạn

a[0] là phần tử đầu tiên của mảng a được khai báo ở trên. Chỉ số

của phần tử mảng là một biểu thức mà giá trị là kiểu số nguyên.
+ Với cách truy xuất theo kiểu này, Tên biến mảng[Chỉ số] có thể coi

như là một biến có kiểu dữ liệu là kiểu được chỉ ra trong khai báo

biến mảng.

Ví dụ 2: Vừa khai báo vừa gán trị cho 1 mảng 1 chiều các số nguyên. In

mảng số nguyên này lên màn hình.

#include <stdio.h>
#include <conio.h>
int main()
{

int n,i,j,tam;
int dayso[]={66,65,69,68,67,70};
n=sizeof(dayso)/sizeof(int); /*Lấy số phần tử*/
printf("\n Noi dung cua mang ");
for (i=0;i<n;i++) printf("%d ",dayso[i]);
return 0;

}

background image

77

1. Kiu mng(tiếp)

Ví dụ 4: Nhập vào một dãy n số và sắp xếp các số theo thứ tự tăng.
#include<conio.h>
#include<stdio.h>
void Nhap(int a[],int N)
{ int i;

for(i=0; i< N; i++)

{

printf("Phan tu thu %d: ",i);
scanf("%d",&a[i]);

}

}

void InMang(int a[], int N)
{ int i;

for (i=0; i<N;i++) printf("%d ",a[i]);
printf("\n");

}
void SapXep(int a[], int N)
{ int t,i;

for(i=0;i<N-1;i++)

for(int j=i+1;j<N;j++)

if (a[i]>a[j])
{ t=a[i]; a[i]=a[j]; a[j]=t; }

}

int main()
{ int b[20], N;

printf("So phan tu cua mang N=

");

scanf("%d",&N);
Nhap(b,N);
printf("Mang vua nhap: ");
InMang(b,N);

SapXep(b,N); /* Gọi hàm sắp

xếp*/

printf("Mang sau khi sap xep: ");
InMang(b,N);
getch();

return 0;

}

background image

78

1. Kiu mng(tiếp)

Ví dụ: Viết chương trình cho phép nhập 2 ma trận a, b có m dòng n cột, thực hiện phép toán

cộng hai ma trận a,b và in ma trận kết quả lên màn hình.

#include<conio.h>
#include<stdio.h>
void Nhap(int a[][10],int M,int N)
{ int i,j;

for(i=0;i<M;i++)

for(j=0; j<N; j++){

printf("Phan tu o dong %d cot %d: ",i,j);
scanf("%d",&a[i][j]);

}

}
void InMaTran(int a[][10], int M, int N)
{ int i,j;

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

for(j=0; j< N; j++) printf("%d ",a[i][j]);

printf("\n");

}

}
/* Cong 2 ma tran A & B ket qua la ma tran C*/
void CongMaTran(int a[][10],int b[][10],int M,int N,int c[][10])
{ int i,j;

for(i=0;i<M;i++)

for(j=0; j<N; j++) c[i][j]=a[i][j]+b[i][j];

}

int main()
{ int a[10][10], b[10][10], M, N;

int c[10][10];/* Ma tran tong*/

printf("So dong M= "); scanf("%d",&M);
printf("So cot M= "); scanf("%d",&N);
printf("Nhap ma tran A\n"); Nhap(a,M,N);
printf("Nhap ma tran B\n"); Nhap(b,M,N);
printf("Ma tran A: \n"); InMaTran(a,M,N);
printf("Ma tran B: \n"); InMaTran(b,M,N);
CongMaTran(a,b,M,N,c);
printf("Ma tran tong C:\n");
InMaTran(c,M,N);
getch();
return 0;

}

background image

79

Mng nhiu chiu

20

25

38

28

Brisbane

13

19

32

24

Melbourne

17

22

34

26

Sydney

Mùa đông

Mùa thu

Mùa hè

Mùa xuân

int Mua[3][4];

...

32

19

13

28

38

25

...

26

34

22

17

24

20

First row

Second row

Third row

hàng đầu

hàng hai

hàng ba

Cách tổ chức trong bộ nhớ

background image

80

2. Kiu chui ký t

- Kiểu chuỗi ký tự là một trường

hợp đặc biệt của mảng các ký
tự. Chuỗi ký tự kết thúc bằng
ký tự có mã ASCII là 0 (‘\0’)

-

Do đó, char[10]; //lưu trữ tối
đ

a 9 ký tự

Ghi chú:

+ Khi áp dụng các phép toán
trên chuỗi, ta phải sử dụng
các hàm (string.h)

Ví dụ:-Hàm strcpy(chuỗi1,chuỗi 2):

chép chuỗi 2 vào chuỗi 1

-Hàm strcmp(chuỗi1,chuỗi2):

so sánh 2 chuỗi trả về 0 nếu 2
chuỗi bằng nhau

….

Ví dụ: Nhập vào một chuỗi và hiển thị
trên màn hình chuỗi vừa nhập.
#include<conio.h>
#include<stdio.h>
#include<string.h>
int main()
{ char Ten[12];

printf("Nhap chuoi: ");gets(Ten);
printf("Chuoi vua nhap: ");puts(Ten);
getch();

return 0;

}

background image

81

3. Kiu con tr

-

Các biến trước đây đều là biến có kích thước và kiểu dữ liệu xác định. Gọi các biến
kiểu này là biến tĩnh. Khi khai báo biến tĩnh, các ô nhớ sẽ được cấp phát mà không biết
trong quá trình chạy chương trình có sử dụng hết chúng hay không.

-

Các biến tĩnh dạng này sẽ tồn tại trong suốt thời gian thực thi chương trình dù có
những biến mà chương trình chỉ sử dụng 1 lần rồi bỏ. Các hạn chế về biến tĩnh:

-

Cấp phát ô nhớ dư, gây ra lãng phí ô nhớ.

-

Cấp phát ô nhớ thiếu, chương trình thực thi bị lỗi.

-

Để

giải quyết những hạn chế trên, ngôn ngữ C cung cấp cho ta một loại biến đặc biệt

gọi là biến động với các đặc điểm sau:

-

Chỉ phát sinh trong quá trình chạy chương trình chứ không phát sinh lúc bắt đầu chương trình.

-

Khi chạy chương trình, kích thước của biến, vùng nhớ và địa chỉ vùng nhớ được cấp phát cho
biến có thể thay đổi.

-

Sau khi sử dụng xong có thể giải phóng để tiết kiệm chỗ trong bộ nhớ.

-

Vì thế, ngôn ngữ C lại cung cấp cho ta một loại biến đặc biệt nữa để khắc phục tình
trạng này, đó là biến con trỏ (pointer) với các đặc điểm:

-

Biến con trỏ không chứa dữ liệu mà chỉ chứa địa chỉ của dữ liệu hay chứa địa chỉ của ô nhớ

-

Kích thước của biến con trỏ không phụ thuộc vào kiểu dữ liệu, luôn có kích thước cố định là 2
bytes nếu trong cùng 1 đoạn và 4 bytes nếu khác đoạn.

background image

82

3. Kiu con tr(tiếp)

a. Khai báo biến con tr

Cú pháp: <Kiu> * <biến con tr>

Ví dụ 1: Khai báo 2 biến a,b có kiểu int và 2 biến pa, pb là 2 biến con trỏ kiểu int.
int a, b, *pa, *pb;
Ví dụ 2: Khai báo biến f kiểu float và biến pf là con trỏ float
float f, *pf;

b. Các phép toán trên con trỏ

+. Phép gán con trỏ: Hai con trỏ cùng kiểu có thể gán cho nhau.

Ví dụ:

int a, *p, *a ; float *f;
a = 5 ;
p = &a ;
q = p ; /* đúng */
f = p ; /* sai do khác kiểu */

+ Cộng, trừ con trỏ với một số nguyên: Có thể cộng (+), trừ (-) 1 con trỏ với 1 số

nguyên N nào đó; kết quả trả về là 1 con trỏ. Con trỏ này chỉ đến vùng nhớ cách

vùng nhớ của con trỏ hiện tại N phần tử.

- Đơn vị tăng hay giảm của con trỏ có kích thướccủa biến được trỏ đến

background image

83

4. Con tr được dùng như mng.

Ví dụ: Cho 1 mảng 1 chiều các số nguyên a có 5 phần tử, truy cập các phần tử theo

kiểu mảng và theo kiểu con trỏ.

#include <stdio.h>
#include <conio.h>
/* Nhập mảng bình thường*/
void NhapMang(int a[], int N)
{

int i;
for(i=0;i<N;i++)

{

printf("Phan tu thu %d: ",i);
scanf("%d",&a[i]);

}

}
/* Nhập mảng theo dạng con trỏ*/

void NhapContro(int a[], int N)
{

int i;
for(i=0;i<N;i++)

{

printf("Phan tu thu %d: ",i);
scanf("%d",a+i);

}

}

int main()
{ int a[20],N,i;

printf("So phan tu N= ");scanf("%d",&N);
NhapMang(a,N);
printf("Truy cap theo kieu mang: ");
for(i=0;i<N;i++) printf("%d ",a[i]);
printf("\nTruy cap theo kieu con tro: ");
for(i=0;i<N;i++) printf("%d ",*(a+i));
getch();
return 0;

}

background image

84

5. Con tr và cp phát động

a. Hàm cp phát:

void *malloc(size_t size): Cấp phát vùng nhớ có kích thước là size.

void *calloc(size_t nitems, size_t size): Cấp phát vùng nhớ có kích thước là

nitems*size.

Ví dụ: Giả sử ta có khai báo:

int a, *pa, *pb; pa = (int*)malloc(sizeof(int)); /* Cấp phát vùng nhớ có kích

thước bằng với

kích thước

của một số nguyên */
pb= (int*)calloc(10, sizeof(int)); /* Cấp phát vùng nhớ có thể chứa được 10 số

nguyên*/

Lưu ý: Khi sử dụng hàm malloc() hay calloc(), ta phải ép kiểu vì nguyên mẫu các

hàm này trả về con trỏ kiểu void.

b. Thu hi vùng nh: Một vùng nhớ đã cấp phát cho biến động do biến con trỏ giữ

đị

a chỉ, khi không còn sử dụng nữa, ta sẽ thu hồi lại vùng nhớ này nhờ hàm

free().
Cú pháp: void free(void *block)

Ý nghĩa: Giải phóng vùng nhớ được quản lý bởi con trỏ block.
Ví dụ: Ở ví dụ trên, sau khi thực hiện xong, thu hồi vùng nhớ cho 2 biến con trỏ pa

và pb như sau:

free(pa); free(pb);

background image

85

Chương 6: Các cu trúc d

liu khác

1. Kiểu cấu trúc(Structure): là kiểu dữ liệu bao gồm

nhiều thành phần có kiểu khác nhau, mỗi thành
phần được gọi là một trường (field)

a. Khai báo:

Cách 1:
struct <Tên cấu trúc>
{

<Kiểu> <Trường 1> ;
<Kiểu> <Trường 2> ;
……..
<Kiểu> <Trường n> ;

};

Cách 2: Sử dụng từ khóa
typedef để định nghĩa kiểu:
typedef struct
{

<Kiểu> <Trường 1> ;
<Kiểu> <Trường 2> ;
……..

<Kiểu> <Trường n> ;

} <Tên cấu trúc>;

background image

86

1. Kiu cu trúc(tiếp)

struct svien
{

char hoten[30];
char diachi[40];
float dtb;

};

typedef struct
{

char hoten[30];
char diachi[40];
float dtb;

} sinhvien;

Khai báo biến:

struct svien sv1,sv2;

sinhvien sv3, sv4;

b. Truy xuất đến một trường của biến cấu trúc
Cách 1: <biến cấu trúc>.<tên trường>
Cách 2: <biến con trò đến cấu trúc> -> <tên trường>

background image

87

Ví d v kiu cu trúc

#include<conio.h>
#include<stdio.h>
#include<string.h>
typedef struct
{ unsigned char Ngay,Thang,Nam;
} NgayThang;

typedef struct
{ char MSSV[10];

char HoTen[40];
NgayThang NgaySinh;
int Phai;
char DiaChi[40];

} SinhVien;

/* Hàm in lên màn hình 1 mẩu tin SinhVien*/
void InSV(SinhVien s)
{

printf("%7s %20s %2d-%2d-%4d %s\n",s.MSSV,s.HoTen,
s.NgaySinh.Ngay,s.NgaySinh.Thang,s.NgaySinh.Nam,s.DiaChi);

}

background image

88

Ví d v kiu cu trúc(tiếp)

int main()
{

SinhVien SV, s;
printf("Nhap MSSV: ");gets(SV.MSSV);
printf("Nhap Ho va ten: ");gets(SV.HoTen);
printf("Sinh ngay: ");scanf("%d",&SV.NgaySinh.Ngay);
printf("Thang: ");scanf("%d",&SV.NgaySinh.Thang);
printf("Nam: ");scanf("%d",&SV.NgaySinh.Nam);
printf("Gioi tinh (0: Nu), (1: Nam): ");scanf("%d",&SV.Phai);
flushall();
printf("Dia chi: ");gets(SV.DiaChi);
InSV(SV);
s=SV; /* Gán trị cho mẩu tin s*/
InSV(s);
getch();
return 0;

}

background image

89

Ví d v con tr đến kiu cu trúc

#include<conio.h>
#include<stdio.h>
typedef struct
{ unsigned char Ngay,Thang,Nam;
} NgayThang;
int main()
{

NgayThang Ng={25,2,2007};
NgayThang *p;
p=&Ng;
printf("Truy cap cau truc thong thuong %d-%d-%d\n",

Ng.Ngay,Ng.Thang,Ng.Nam);

printf("Truy cap qua con tro %d-%d-%d\n",

p->Ngay,p->Thang,p->Nam);

printf("Truy cap qua vung nho con tro %d-%d-%d\n",

(*p).Ngay,(*p).Thang,(*p).Nam);

getch();
return 0;

}

background image

90

2. Kiu tp tin

a. Khái niệm:

-

Là kiểu dữ liệu cho phép lưu trữ dữ liệu ở bộ nhớ ngoài (đĩa). Khi kết thúc
chương trình thì dữ liệu vẫn còn do đó chúng ta có thể sử dụng nhiều lần.

-

Ngoài ra, kiểu tập tin có thể có kích thước lớn với số lượng các phần tử
không hạn chế (chỉ bị hạn chế bởi dung lượng của bộ nhớ ngoài).

Biến tp tin: là một biến thuộc kiểu dữ liệu tập tin dùng để đại diện cho

một tập tin. Dữ liệu chứa trong một tập tin được truy xuất qua các thao

tác với thông số là biến tập tin đại diện cho tập tin đó.

Con tr tp tin: Khi một tập tin được mở ra để làm việc, tại mỗi thời
đ

iểm, sẽ có một vị trí của tập tin mà tại đó việc đọc/ghi thông tin sẽ xảy ra.

Người ta hình dung có một con trỏ đang chỉ đến vị trí đó và đặt tên nó là

con trỏ tập tin.

b. Khai báo:

FILE <Danh sách các biến con tr> ;

Ví dụ:

FILE *f1,*f2;

background image

91

c. Các thao tác trên tp tin

+Mở tập tin

Cú pháp: FILE *fopen(char *Path, const char *Mode)

Trong đó:
- Path: chuỗi chỉ đường dẫn đến tập tin trên đĩa.
- Type: chuỗi xác định cách thức mà tập tin sẽ mở.

Ví dụ: Mở một tập tin tên C:\BAITAP\VIDU.TXT để ghi.
FILE *f;
f = fopen(“C:\\BAITAP\\VIDU.TX”, “w”);
if (f!=NULL)
{

/* Các câu lệnh để thao tác với tập tin*/

/* Đóng tập tin*/

}

background image

92

Bng các giá tr ca Mode

Chế độ

Ý nghĩa

r

Mở tập tin văn bản để đọc

w

Tạo ra tập tin văn bản mới để ghi

a

Nối vào tập tin văn bản

rb Mở tập tin nhị phân để đọc

wb Tạo ra tập tin nhị phân để ghi

ab Nối vào tập tin nhị phân

r+ Mở một tập tin văn bản để đọc/ghi

w+ Tạo ra tập tin văn bản để đọc ghi

a+ Nối vào hay tạo mới tập tin văn bản để đọc/ghi

r+b Mở ra tập tin nhị phân để đọc/ghi

w+b Tạo ra tập tin nhị phân để đọc/ghi

a+b Nối vào hay tạo mới tập tin nhị phân

background image

93

c. Các thao tác trên tp tin

+ Hàm đóng tập tin: Hàm fclose() được dùng để đóng tập tin

đượ

c mở bởi hàm fopen(). Hàm này sẽ ghi dữ liệu còn lại

trong vùng đệm vào tập tin và đóng lại tập tin.

Cú pháp: int fclose(FILE *f)

+ Hàm kiểm tra đến cuối tập tin hay chưa?

Cú pháp: int feof(FILE *f)

Kiểm tra xem đã chạm tới cuối tập tin hay chưa và trả về
EOF nếu cuối tập tin được chạm tới, ngược lại trả về 0.

+ Hàm di chuyển con trỏ tập tin về đầu tập tin - Hàm rewind()

Khi ta đang thao tác một tập tin đang mở, con trỏ tập tin luôn
di chuyển về phía cuối tập tin. Muốn cho con trỏ quay về đầu
tập tin như khi mở nó, ta sử dụng hàm rewind().

Cú pháp: void rewind(FILE *f)

background image

94

d. Truy cp vào tp tin văn bn

+ Hàm ghi dữ liệu lên tập tin văn bản: Hàm putc()

Hàm này được dùng để ghi một ký tự lên một tập tin văn bản đang được mở để làm việc.

Cú pháp: int putc(int c, FILE *f)

Trong đó, tham số c chứa mã Ascii của một ký tự nào đó. Mã này được ghi lên tập tin liên kết

với con trỏ f. Hàm này trả về EOF nếu gặp lỗi.

+ Hàm này dùng để ghi một chuỗi ký tự chứa trong vùng đệm lên tập tin văn bản.

Cú pháp: int puts(const char *buffer, FILE *f)

Trong đó, buffer là con trỏ có kiểu char chỉ đến vị trí đầu tiên của chuỗi ký tự được ghi vào. Hàm

này trả về giá trị 0 nếu buffer chứa chuỗi rỗng và trả về EOF nếu gặp lỗi.

Ví dụ: Viết chương trình ghi chuỗi ký tự lên tập tin văn bản C:\BAITHO.TXT
#include<stdio.h>
#include<conio.h>
int main()
{ FILE *f;

f=fopen(“C:\\BAITHO","r+");
if (f!=NULL) {

fputs(“Chi co thuyen moi hieu.\n",f);
fputs(« Bien menh mong duong nao.",f);
fclose(f);

}

getch();
return 0;

}

background image

95

d. Truy cp vào tp tin văn bn(tiếp)

+ Hàm dùng để ghi dữ liệu có định dạng lên tập tin văn bản.

Cú pháp: fprintf(FILE *f, const char *format, varexpr)

Trong đó: format: chuỗi định dạng (giống với các định dạng

của hàm printf()), varexpr: danh sách các biểu thức, mỗi biểu

thức cách nhau dấu phẩy (,).

+ Hàm dùng để đọc dữ liệu từ tập tin văn bản đang được mở để

làm việc.

Cú pháp: int getc(FILE *f)

Hàm này trả về mã Ascii của một ký tự nào đó (kể cả EOF)

trong tập tin liên kết với con trỏ f.

+ Hàm đọc dữ liệu từ tập tin văn bản vào danh sách các biến theo

đị

nh dạng.

Cú pháp: fscanf(FILE *f, const char *format, varlist)

Trong đó: format: chuỗi định dạng (giống hàm scanf());

varlist: danh sách các biến mỗi biến cách nhau dấu phẩy (,).

background image

96

Ví d

Viết chương trình chép tập tin C:\BAITHO.TXT ở trên sang tập tin D:\BAIHAT.TXT.
#include<stdio.h>
#include<conio.h>
int main()
{

FILE *f1,*f2;
f1=fopen(“C:\\BAITHO.TXT","rt");
f2=fopen("D:\\BAIHAT.TXT","wt");
if (f1!=NULL && f2!=NULL)
{

int ch=fgetc(f1);
while (! feof(f1))
{

fputc(ch,f2);
ch=fgetc(f1);

}

fcloseall();

}
getch();
return 0;

}

background image

97

e. Truy cp vào tp tin nh phân

+ Hàm ghi dữ liệu lên tập tin nhị phân - Hàm fwrite()

Cú pháp: size_t fwrite(const void *ptr, size_t size, size_t n, FILE *f)

Trong đó:
- ptr: con trỏ chỉ đến vùng nhớ chứa thông tin cần ghi lên tập tin.
- n: số phần tử sẽ ghi lên tập tin.
- size: kích thước của mỗi phần tử.
- f: con trỏ tập tin đã được mở.
- Giá trị trả về của hàm này là số phần tử được ghi lên tập tin. Giá trị này bằng n trừ

khi xuất hiện lỗi.

+Đọc dữ liệu từ tập tin nhị phân - Hàm fread()

Cú pháp: size_t fread(const void *ptr, size_t size, size_t n, FILE *f)

Trong đó:
- ptr: con trỏ chỉ đến vùng nhớ sẽ nhận dữ liệu từ tập tin.
- n: số phần tử được đọc từ tập tin.
- size: kích thước của mỗi phần tử.
- f: con trỏ tập tin đã được mở.
- Giá trị trả về của hàm này là số phần tử đã đọc được từ tập tin. Giá trị này bằng n

hay nhỏ hơn n nếu đã chạm đến cuối tập tin hoặc có lỗi xuất hiện..

background image

98

e. Truy cp vào tp tin nh phân(tiếp)

+ Hàm di chuyển con trỏ tập tin - Hàm fseek()

- Việc ghi hay đọc dữ liệu từ tập tin sẽ làm cho con trỏ tập tin dịch chuyển

một số byte, đây chính là kích thước của kiểu dữ liệu của mỗi phần tử của

tập tin.
- Khi đóng tập tin rồi mở lại nó, con trỏ luôn ở vị trí ngay đầu tập tin.

Nhưng nếu ta sử dụng kiểu mở tập tin là “a” để ghi nối dữ liệu, con trỏ tập

tin sẽ di chuyển đến vị trí cuối cùng của tập tin này.
- Ta cũng có thể điều khiển việc di chuyển con trỏ tập tin đến vị trí chỉ định

bằng hàm fseek().

Cú pháp: int fseek(FILE *f, long offset, int whence)

Trong đó:

- f: con trỏ tập tin đang thao tác.
- offset: số byte cần dịch chuyển con trỏ tập tin kể từ vị trí trước đó. Phần tử đầu tiên

là vị trí 0.

- whence: vị trí bắt đầu để tính offset, ta có thể chọn điểm xuất phát là:

0 SEEK_SET Vị trí đầu tập tin
1 SEEK_CUR Vị trí hiện tại của con trỏ tập tin
2 SEEK_END Vị trí cuối tập tin

- Kết quả trả về của hàm là 0 nếu việc di chuyển thành công. Nếu không thành công,

1 giá trị khác 0 (đó là 1 mã lỗi) được trả về.


Wyszukiwarka

Podobne podstrony:
ĐHĐL Giáo Trình Hợp Ngữ (NXB Đà Lạt 2002) Nguyễn Hữu Lộc, 110 Trang
Giáo Trình Khai Thác, Kiểm Định, Sửa Chữa, Tăng Cường Cầu Gs Ts Nguyễn Viết Trung, 72 Trang
Quy Chuẩn Kỹ Thuật Quốc Gia Các Công Trình Hạ Tầng Kỹ Thuật Đô Thị, 98 Trang
Slide Lập Thẩm Định Dự Án Đầu Tư xây Dựng Pgs Ts Nguyễn Văn Hiệp
Slide Ngôn Ngữ Lập Trình Tính Toán Fortran Trần Thùy Dương, 71 Trang
Slide Lập Trình Hợp Ngữ Nhiều Tác Giả, 109 Trang
Slide kỹ Thuật Lập Trình Nguyễn Thủy Đoan Trang, 20 Trang
Mẫu Mô Tả Công Việc Và Các Tiêu Chuẩn Đánh Giá Một Lập Trình Viên Nguyễn Trọng Hòa
ĐHCT Giáo Trình Thực Hành Lập Trình Hệ Thống (NXB Cần Thơ 2008) Nguyễn Hứa Duy Khang, 39 Trang
Slide Đặc Tả Ngôn Ngữ Lập Trình Từ Vựng Cú Pháp Ts Ngyuyễn Hứa Phùng, 17 Trang
ĐHĐL Giáo Trình Kỹ Thuật Lập Trình Pascal (NXB Đà Lạt 2001) Nguyễn Danh Hưng, 135 Trang
Giáo Trình Ngôn Ngữ Lập Trình C (NXB Hồ Chí Minh 2007) Nguyễn Hữu Tuấn, 143 Trang
Lập Trình Web Động Với PHP và MySQL Phần 1 Tống Phước Khải, 132 Trang
Suy Nghĩ, Nhận Thức Và Công Việc (Hội Ký Xây Dựng) Nguyễn Đình Cống, 160 Trang
Slide Lập Trình Trên Môi Trường Windows Với ADO NET Phạm Minh Tuấn, 23 Trang
Slide Lập Trình Trên Môi Trường Windows Với Windows Form Phạm Minh Tuấn, 34 Trang
Bài Tập Lập Trình C Lương Trần Hy Hiền, 18 Trang
BCVT Bài Tập Tiếng Anh Chuyên Ngành Điện Từ Viễn Thông Ths Nguyễn Quỳnh Giao, 86 Trang
ĐHMO Lập Dự Toán Xây Dựng Cơ Bản Ths Lương Văn Cảnh, 21 Trang

więcej podobnych podstron