You are on page 1of 102

Chng I : Tng quan

Trang 1
Chng I. TNG QUAN
I. Gioi thiu v ngn ngu C:
I.1. Lch s ngn ng C:

Ngn ng C c Dennis Ritchie thit k tai phong th nghim Bell nm 1972 vi muc
ch vit h iu hanh UNIX. Tuy nhin nh tnh u vit va linh ng cua C nn C a c
gii tin hoc s dung khp ni nh mt ngn ng chnh thng. Do co nhiu phin ban C cua
nhiu nha san xut phn mm nn nm 1983 ANSI (American National Standard Institute)
xy dng tiu chun ANSI C. T chc ISO cung xy dng chun cho C. Hai chun nay ging
nhau va c bit n vi tn chung la ANSI C.
I.2. u im cua ngn ng C:
Hin nay co rt nhiu ngn ng lp trnh khac nhau nh PASCAL, JAVA, DELPHI,
BASIC, ... Mi ngn ng co mt s im manh ring tuy nhin ngn ng C c s dung
rng rai nh nhng u im sau:
C la ngn ng manh va mm deo (linh ng). C co th c s dung vit h
iu hanh, trnh bin dch cua ngn ng khac, trnh iu khin, soan thao vn ba n, hoa,
bang tnh, ...
Ngn ng C c s dung rng rai bi cac nha lp trnh chuyn nghip va nh
co chun ANSI C nn co tnh kha chuyn cao : chng trnh vit cho may tnh IBM-PC co th
c bin dch va chay trn h thng may tnh khac nh VAX.
Chng trnh dch co hiu qua cao : n 80% tnh nng cua chng trnh o
vit trn ma may. Ngn ng C co th s dung kha nhiu chng trnh dch va cac th vin tin
ch
C co t t khoa nn suc tch va c ong.
C la ngn ng co cu truc modul thng qua vic s dung cac ham.
I.3. Nhc im cua ngn ng C:
Tuy nhin C cung co mt s nhc im sau :
Ngn ng C co cu phap la va kho hoc. Nhng ngi a tng vit ngn ng
khac co th vt qua c kho khn nay.
Mt s k hiu co y ngha khac nhau tuy thuc vao ng canh s dung.
C qua mm deo co th lam cho chng trnh co ve bt n.
I.4. Thut toan (Algorithm):
Thut toan la mt chui cac ch dn chnh xac em n mt li giai cho mt bai toan.
Khi xy dng thut toan ta chu y no phai thoa man cac iu kin sau :
+ Tnh kha thi: thut toan phai thc hin c khi xy dng chng trnh chay c
trn may tnh.
Chng I : Tng quan


Trang 2
+ S bc cn thc hin trong thut toan la hu han sau mt s ln lp nht nh ta
phai c nghim cua bai toan
+ Tnh ti u: thng thng i vi mt bai toan co nhiu phng phap giai khac nhau
ta phai chon ra trong s o phng phap giai ti u nht v thi gian thc hin, cho kt qua
chnh xac nht, khi lng tnh toan t nht va n gian khi vit chng trnh.

V du :
+ Phat biu bai toan : Trong lp co bao nhiu ngi tn Xun ?
+ u vao :
Danh sach lp
Tn cn kim tra : Xun
+ u ra :
S ngi co tn Xun
+ Thut toan :
Ly danh sach lp
Ly tn cn kim tra : Xun
Xoa b m v 0
Ln lt i vi tng tn trong danh sach : So sanh vi tn cn kim tra,
nu ung th cng 1 vao b m
Thng bao gia tr b m ( s sinh vin co tn Xun )
I.5. Lu :

A
Thc hin cng vic A
A
Goi chng trnh con A Nhp xut d liu
A
B
ung
Sai
Begin
End
Tuy thuc vao trang thai ung
sai cu a biu thc B ma re
nhanh thch hp
Bt u va kt thuc mt thut toan
Chng I : Tng quan


Trang 3
I.6. Cac bc c ban khi vit chng trnh C:
Thit k chng trnh :
Xac nh u vao, u ra cua bai toa n
Xy dng thut toan giai quyt bai toan.
Soan thao :
S dung chng trnh soan thao TURBO C hoc BORLAND C hoc C++, sau o lu
lai file o vi tn la *.c ( i vi C++ la *.cpp )
Dch :
Chng trnh soan thao cung la trnh bin dch.
Trnh bin dch se co nhim vu dch chng trnh ngun sang ma may qua 2 gian
oan: dch ra tp tin *.obj va lin kt cac file *.obj lai vi nhau qua trnh lin kt. Nu
co li th ta quay tr lai bc soan thao sa cha.
Chay chng trnh
Nu co li th ta phai kim tra lai thut toan, li logic, .... n khi cho kt qua ung.
II. Cac phn tu co ban cua ngn ngu C:
II.1. B k t cu a C:
Ngn ng C c xy dng trn b k t sau :
Cac ch cai hoa A .. Z, cac ch cai thng a .. z
Cac ch s 0 .. 9
Du chm cu : , ; . ?
Cac k t c bit nh []{}!@#$%^&*()-=\+|...
Cac k t khng nhn thy nh khoang trng, du tab, ky t xung dong.
K t gach di _
y ch la t p con cua Bang ma ASCII
Ta khng c phep s dung cac k t ngoai b k t trn.
II.2. Cac t khoa (keyword):
T khoa la t dung ring, khng th nh ngha lai, mi t khoa co mt y ngha ring.
Ta khng c s dung t khoa vao muc ch khac nh t tn cho bin, hng, mang; cn
phai vit chnh xac t khoa.
auto asm break case cdecl char const
continue default do double else enum extern
far float for goto huge if int
interrupt long near pascal register return short
signed sizeof static struct switch typedef Union
unsigned void volatile while
_cs _ds _es _ss
_AH _AL _AX _BH _BL _BX _CH
_CL _CX _DH _DL _DX _BP _DI
_SI _SP
Chng I : Tng quan


Trang 4
II.3. Tn va cach t tn:
Chng trnh s dung rt nhiu tn: tn bi n, tn hng, tn ham,....
Cac tn phai c khai bao trc khi s dung
Cach t tn :
Tn la day k t lin nhau gm cac ch cai thng va hoa, cac ch s va du
gach di.
Tn khng c cha cac k t c bit nh du chm cu, du cach ...
Tn khng c bt u bng ch s
C phn bit ch hoa va ch thng : bien,Bien va BIEN la cac tn khac nhau.
Khng c s dung t khoa t tn.
Tn co th dai ti 31 k t, tuy nhin khng nn t tn qua dai.
Tn bin, tn hng nn phan anh cai ma no lu tr
Tn ham nn phan anh cng vic ma no lam.
V du : bien_dem, nghiem1, hoan_vi,... : ung.
1st, bien dem, registry la cac v du sai .
Chu y : + C co phn bit ch hoa va ch thng
+ Tt ca cac t khoa va ham chun u la ch thng, cac macro chun u la
ch hoa
II.4. Li chu giai:
Li chu giai trong chng trnh co muc ch lam cho ngi oc d hiu, chng trnh
sang sua, thu n li trong vic tm kim, sa cha, g ri, ... nht la i vi chng trnh ln,
phc tap. Ta cn co thoi quen s dung cac cu chu thch. Khng s dung chu thch vi nhng
lnh a qua ro rang.
Li chu giai khng co ta c dung tao ra ma chng trnh. Trnh bin dch se bo qua tt
ca cac cu ghi chu. Ta khng s dung cac cu chu thch lng vao nhau
Li chu giai bt ky u trong chng trnh, c t gia cp k hiu /* va */ , chu
giai co th nm trn nhiu dong.
V du : /* y la ham hoan v
ham nay s dung con tro */
Trong C++, sau mi dong, li chu giai co th nm sau k hiu //. Mi k hiu // ch co
tac dung trn dong o.
V du : int dem=0; // dem la bin m.
II.5. Cu lnh va du chm cu:
Mi cu lnh c kt thuc bng du chm phy ;
Nhng dong khng phai la cu lnh th kt thuc khng co du chm cu.
Cac cu lnh cung nhom nn t thng ct.
Mi cu lnh nn vit trn mt dong (nu co th )



Chng I : Tng quan


Trang 5
V du :
#include <stdio.h> // khng phai la lnh
main()
{
int i,j;
i=0;
return 0; // ba dong trn la 3 lnh nn co du ;
}
III. Cu truc chung cua chuong trinh :

Chng trnh C la mt tp h p nhiu ham trong o phai co 1 ham chnh goi la main().
Ham la oan ma lnh c lp c t tn va thc hin mt cng vic xac nh khi
c goi n. Mt ham co th goi n nhiu ham khac.
Ham main() la ham c may tnh thc hin trc tin trong mt chng trnh.



void ham1(void)
{
......
}
void ham2(void)
{
......
}
main()
{
......
ham1();
......
ham2();
......
}
Chng I : Tng quan


Trang 6
Mt chng trnh C thng co cu truc nh sau :
/* Cac ch th tin x l */
#include ....
#define ...
typedef .... /* nh ngha cac kiu d liu */
/* khai bao nguyn mu cac ham*/
kiu_d_liu tn_ham(tham_s);
khai bao cac bin toan cuc;
/* chng trnh chnh */
main()
{ ........ /* cac cu lnh*/
return 0;
}
/* khai bao cac ham*/
kiu_d_liu tn_ham(tham_s)
{ ........ /* cac cu lnh */
return (gia_tr_tra_v );
}
V du :
#include <stdio.h> // ch th tin x l
void main() // ham main()
{
printf(\nChao cac ban !); // cu lnh
}

V du : tnh din tch hnh ch nht bit chiu dai va chiu rng co s dung ham
#include <stdio.h>
#include <conio.h>
int tich(int x,int y); // khai bao nguyn mu ham
main()
{
int x,y; // khai bao bin
printf(\nNhap chieu dai:);scanf(%d,&x); // ham oc t ban phm
printf(\nNhap chieu rong:);scanf(%d,&y);
printf(\nDien tich hinh chu nhat: %d,tich(x,y)); // ham in ra man hnh
getch(); // oc mt k t ch
return 0;
}
int tich(int x,int y) // nh ngha ham
{
return (x*y);
}
Chng I : Tng quan


Trang 7
V du : tnh din tch hnh ch nht bit chiu dai va chiu rng khng dung ham
#include <stdio.h>
#include <conio.h>
main()
{
int x,y;
printf(\nNhap chieu dai:);scanf(%d,&x);
printf(\nNhap chieu rong:);scanf(%d,&y);
printf(\nDien tich hinh chu nhat: %d,x*y);
getch();
return 0;
}
IV. Bai tp:
1. Xy dng thut toan va ve s khi cua cac bai toan sau:
a. Tnh n!
b. Tnh

=
n
i
i
1

c. Giai phng trnh ax + b = 0
d. Giai phng trnh ax
2
+ bx + c = 0
e. Giai phng trnh ax
3
+ bx
2
+ cx + d = 0
f. Giai phng trnh ax
4
+ bx
3
+ cx
2
+ dx + e = 0
2. Tnh chu vi, din tch cua hnh tron bit ban knh r = 3 cm.
3. a ra man hnh dong ch : Mn hoc ngn ng lp trnh C .
Chng II : Kiu d liu, bin va hng


Trang 8
Chng II. KIU DU LIU, BIN VA HNG
I. Kiu du li u:
Kiu d liu la tp hp cac gia tr ma cac bin thuc kiu o co th nhn c.
Mi kiu d liu co mt s phep toa n tng ng.
Cac kiu d liu c phn loai nh sau :

II. Bin va hng, cac phep gan co ban:
Bin dung lu d liu co th thay i gia tr c.
Hng dung lu d liu khng th thay i.
Bin va hng la vung nh lu tr d liu c t tn cho d truy cp (khng phai
dung a ch) .
Trc khi s dung bin va hng ta cn khai bao trc.
II.1. Khai bao va khi tao bin:
Khai bao bin : kiu_d_liu danh_sach_cac_tn_bin
Ta co th khai bao nhiu bin cung kiu cung mt luc, cac bin cach nhau du phy.
V du : int dem, tam, x, y;
float tr_binh;
Khi tao bin : bin = biu thc
V du : int x ;
x = 10;
hoc : int x =10 ;
Ta cn chu y x = y khng phai la x bng y ma la gan gia tr cua y vao x.
V du : int x,y;
y=x;
kiu s nguyn
kiu s thc
kiu k t
kiu logic
kiu c s
kiu v hng
t nh ngha
kiu lit k
kiu v hng
n gian
kiu d liu co
cu truc
kiu file
kiu array
kiu struct
kiu con tro
Kiu
d
liu
Chng II : Kiu d liu, bin va hng


Trang 9
Ta nn nh rng b nh may tnh khng rng khi may tnh lam vic. Cac khi nh cp
phat cho bin co th a co gia tr trc o . Ta cha khi tao x nn ta khng bit c gia tr x.
II.2. Khai bao va khi tao hng:
Khai ba o hng : const kiu_d_liu tn_hng = gia tr hng
V du : const int so_luong = 50 ;
const float sai_so = 0.5 ;
II.3. Phep gan:
Bin nhn gia tr qua phep gan vi du bng : tn_bin = biu thc
V du : a = 5; // gan cho a gia tr la 5
b = a - 4; // tnh gia tr a - 4 ri gan gia tr o cho b
Phep gan kep :
V du : a = b = c = 7 ;
a = (b = 4 ) + ( c = 5 ) ;
Khi ta s dung phep gan kep, cu lnh se ngn hn tuy nhin khng nn lam dung.
III. Kiu s nguyn:
Cac kiu s nguyn la nhng tp hp con cua tp Z, khng phai la toan b tp Z .
Cac kiu s nguyn cua C vi cac dai gia tr khac nhau :
Kiu bin T khoa S byte Dai gia tr
Character char 1 -128 127
Integer int 2 -32768 32767
Short integer short 2 -32768 32767
Long integer long 4 -2147483648 2147483647
Unsigned character unsigned char 1 0 255
Unsigned integer unsigned int 2 0 65535
Unsigned short integer unsigned short 2 0 65535
Unsigned long integer unsigned long 4 0 4294967295
Vi tt ca cac kiu, ta ch nn gan cho bin cac gia tr nm trong dai gia tr cua kiu
o, nu khng ta se nhn c kt qua khng mong mun mc du C khng thng bao li.
Kiu int la kiu thng dung nht. Kiu char thc ra la kiu k t nhng C cho phep s
dung kiu char nh la kiu nguyn: trong biu thc s hoc th char c hiu la kiu nguyn.
Cac phep tnh s hoc i vi s nguyn :
Phep toan K hiu V du
Cng + x+y
Tr - x-y
Nhn * x*y
Chia ly phn nguyn / x/y
Chia ly phn d % x%y
Tng ++ x++ hoc ++x
Giam -- x--hoc --x
Chng II : Kiu d liu, bin va hng


Trang 10
V du : 10 % 3 =1 ; 5 / 3 = 1 ;
Biu din s nguyn di dang Hexa ( h thp luc phn) :
H thp phn s dung : 0 1 2 3 4 5 6 7 8 9
H nh phn s dung : 0 1
H thp luc phn s dung : 0 1 2 3 4 5 6 7 8 9 A B C D E F
V du : s 53 dang nh phn la 110101, dang Hexa la 35.
S nguyn c biu din di dang Hexa : 0xgia _tr_Hexa hoc 0Xgia _tr_Hexa
V du : 0x12 (=18) ; 0X12 (=18)
i vi s h 8 ta vit thm s 0 vao trc : 0gia_tr_Oct
V du : 0123 (=83)
Biu din s m trong may tnh:
S m : V du : int x= - 21 ;
21 : 0000 0000 0001 0101
S bu 1 : 1111 1111 1110 1010
S bu 2 : 1111 1111 1110 1011
Hin tng tran s :
Hin tng nay xay ra khi kt qua d kin cua phep tnh s hoc vt ra kho i dai gia tr
co th biu din c cua kiu d liu o. Luc o kt qua thc t se la kt qua sai.
V du : 32767 + 1 se co kt qua -32768
khc phuc ta chuyn sang s dung cac kiu d liu co dai gia tr cho phep rng hn
Chung ta nn khai bao vi kiu d liu ti u va co kt qua mong mun va tit
kim b nh.
Nu chung ta t mt s m vao bin khng du hoc t mt s vao kiu d liu co
dai gia tr nho hn s o th trnh bin dch se khng bao li nhng ta se co kt qua khng
mong mun.

Hng s nguyn co kiu nh trc :
i khi chung ta mun ghi cac hng s vi kiu nh trc mt cach tng minh
am bao chnh xac : ghi thm 1 k t vao cui s o
V du : U : unsigned int
UL : unsigned long int
0x123L: hng s nguyn di dang Hexa kiu long.

V du : signed char ch= 0xFF;
int x= 0xFFFF;
unsigned int y= 0xFFFFu;
printf("\n The decimal of signed 0xFF is %d", ch); -1
printf("\n The decimal of signed 0xFFFF is %d", x); -1
printf("\n The decimal of unsigned 0xFFFFu is %u", y); 65535
printf("\n The hex of decimal 12 is %#X ", 12); 0XC
printf("\n The hex of decimal -12 is %#X ", -12); 0XFFF4
Chng II : Kiu d liu, bin va hng


Trang 11
IV. Kiu s thuc:
Cac kiu s thc cua C :
Kiu bin T khoa S byte Dai gia tr
S thc co chnh xac n float 4 1.2E-38 3.4E38
S thc co chnh xac kep double 8 2.2E-308 1.8E308
S thc co chnh xac kep dai ln long double 10
3.4E-4932 3.4E4932
Biu din s thc dang thp phn :
V du : 3.14 ; 2.718281828
Biu din s thc dang khoa hoc :
V du : 6.023e23=6.023E23 (= 6.023 * 10
23
)
Trong v du trn, phn nh tr la 6.023, phn mu la 23
Phn nh tr va phn mu co th co du i kem, chung c vit lin nhau khng co
du ngn cach. V du : -12.23e-23
Phn nguyn hay phn thp phn co th khng co nhng du chm khng th thiu.
V du : 3. .14
Ta y : 3 la s nguyn nhng 3. la s thc.
Biu din s thp phn trong may tnh:
S thp phn : V du : 12.5 : 1100.1
0.25 : 0.01
Quy trnh chuyn i .
Hng s thc co kiu nh trc :
Tng t nh s nguyn :
F : kiu float
L : kiu long
Cac phep toan vi kiu s thc :
Phep cng ( + ) , tr ( - ) , nhn ( * ) , chia ( / ) , phep tng giam.
Phep chia (/) i vi s thc se cho kt qua la s thc. S thc khng co phep %.
Khai bao va khi tao s thc : tng t nh s nguyn :
float x;
x=0.3333;
Hoc float x=0.3333;
Do cach lu tr s thc trong may tnh, ta khng nn kim tra s bng nhau gia 2 s
thc ma ta kim tra fabs( a - b ) < esp hay khng.
V. Kiu Boolean:
Thc ra ngn ng C khng nh ngha ro rang kiu Boolean. Kiu nay tn tai di
dang s nguyn.
S nguyn co gia tr 0 c hiu la FALSE, con lai c hiu la TRUE. Nu kt qua la
FALSE th co gia tr la 0, nu kt qua la TRUE th co gia tr la 1.
Cac phep toan logic va cac phep toan quan h cho kt qua kiu Boolean

Chng II : Kiu d liu, bin va hng


Trang 12
Cac toan t vi kiu Boolean :
Toan t Phep toan logic Y ngha
&& AND Phep va
|| OR Phep hoc
! NOT Phep phu nh
Cac phep toan quan h :
K hiu Y ngha
!= so sanh khac nhau
== so sanh bng nhau
>= so sanh ln hn hoc bng
<= so sanh nho hn hoc bng
> so sanh ln hn
< so sanh nho hn
VI. Kiu ki tu (character):
Mi gia tr kiu char chim 1 byte va c biu din thng qua bang ma ASCII.
Cac kiu k t trong C :
Kiu bin T khoa S byte Dai gia tr
Kiu co du char ( signed char) 1 -128 127
Kiu khng du unsigned char 1
0 255
Phn loai :
Cac k t vn ban co ma t 32 n 126, co th a ra man hnh va may in. Cac
k t nay gm cac k t ! # $ % & , cac con s, cac ch cai thng va hoa, ...
Cac k t iu khin co ma t 0 n 31, noi chung cac k t nay khng th a
ra man hnh. Mt s k t iu khin :
Ta cn phn bit hai k t 0 va \0 : K t 0 la s 0 co ma 48, con k t \0 la k t
NULL co ma 0.

K t Day ma Gia tr hexa Gia tr thp phn
chung BEL \a x07 7
xoa trai BS \b x08 8
nhay cach ngang \t x09 9
nhay cach ng \v x0B 11
xung dong mi \n x0A 10
sang trang \f x0C 12
v u dong \r x0D 13
du \ x22 34
du \ x27 39
du ? \? x3F 63
du \ \\ x5C 92
du NULL \0 x00 0
Chng II : Kiu d liu, bin va hng


Trang 13
V du : in ra mt dong vi ting chung trc va sau dong ch :
printf(\aHello%c,7);
Cac k t hoa co ma s t 127 n 255. Cac k t nay co th a ra man hnh
nhng khng th a ra may in nh cac lnh DOS.

Hng k t c biu din nm gia 2 du nhay n : a,7,....
K t c biu din di dang Hexa : \xHHH
K t c biu din di dang Octal : \DDD
V du : A co th vit nh sau : \x41 hoc \101

Mt s ham x l k t : (c cung cp trong th vin ctype.h)
Ham Tac dung
int toascii(int c) chuyn c thanh ma ASCII
int tolower(int c) chuyn c thanh ch thng
int toupper(int c) chuyn c thanh ch hoa
V du : Nhp ch thng t ban phm va chuyn thanh ch hoa:
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
main()
{
int chu_thuong,chu_hoa;
chu_thuong=getchar();
chu_hoa=toupper(chu_thuong);
putchar(chu_hoa);
getch();
return 0;
}

V du : Chuyn mt s thanh ma ASCII
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
main()
{
int number,result;
number=511;
result=toascii(number);
printf(\n%d %d %c\n, number, result, result);
getch();
return 0;
}
Chng II : Kiu d liu, bin va hng


Trang 14
Ham toascii xoa tt ca cac bit ngoai tr 7 bit cui -> kt qua thuc [0,127]
Kt qua : 511 127
Hng xu k t : la day k t nm gia 2 du ngoc kep
V du : Ngn ng
Xu k t c lu trong 1 mang nh lin nhau co cac phn t la cac k t ring bit,
phn t cui cung la k t NULL ( \0 la k hiu kt thuc cua xu k t ) . V du :

S khac nhau gia Z va Z :
- Z gm 1 byte, Z gm 2 byte lu trong b nh
- Z co th c s dung trong biu thc toan hoc, con Z th khng.
VII. Khai bao bng cac hng tuong trung:
Mu khai bao :
#define tnbanu day_ thay_th
trong o day_ thay_th co th la hng s, hng xu k t, hng logic ....
Trnh bin dch se thay th tt ca tnbanu trong chng trnh bng day_thay_th
V du :
#define PI 3.141592653589793
#define TRUE 1
#define FALSE 0
#define begin {
#define end }
Chu y: Khng co du = va du ; cui cu v y khng phai la lnh
VIII. Cac kiu du liu tu djnh ngha:
VIII.1. Kiu lit k :
Khi mun nh ngha 1 kiu d liu bng cach lit k tt ca cac tn, cac gia tr ma ta
mun co, ta s dung t khoa enum nh sau :
enum tn_kiu {pt1,pt2,.... } bin_1,bin_2;
enum tn_kiu {pt1,pt2,.... };
enum {pt1,pt2,.... } bin_1,bin_2;
enum {pt1,pt2,.... };
V du :
enum colors {BLUE,GREEN,RED};
enum colors color ;
color = RED ;
Day cac phn t c lit k tng ng vi day s t nhin bt u t 0.
V du : theo v du trn :
printf(%d%d,BLUE,RED);
se co kt qua la 02.
phn t bt u co gia tr khac 0, ta nh ngha nh sau :
T O I \0
Chng II : Kiu d liu, bin va hng


Trang 15
enum thu {hai=2,ba,tu,nam,sau,bay,cn};
VIII.2. Kiu typedef:
T khoa typedef khng tao ra kiu d liu mi ma no t tn mi cho kiu d liu a
tn tai.
Mu : typedef tn_kiu_cu tn_kiu_mi
V du :
typedef int nguyen;
typedef float thuc;
sau o ta khai bao bin :
nguyen a,b;

typedef con co tac dung manh hn:
char line1[81], line2[81], line3[81];
Ta co th nh ngha lai :
typedef char line[81];
line line1,line2,line3;
IX. Bai tp :
1. Tnh 30/4; 30%4;
2. int x,y;
x=0xAB;
y=0x23;
printf(\n x+y = %#x\n x-y = %#x, x+y, x-y );
3. Biu din cac s sau di dang nh phn :
127, -129, 12.12
4. Chuyn i gia cac c s 2, 8, 10, 16 :
1234.1234
(10)
, 11001011.10110011
(2)
, 1234.5671
(8)
, ABC.1234
(16)
.
5. Biu din cac s sau di dang khoa hoc :
1234567890; -123.456; -0.00123 ( 1.23456789E9 ; -1.23456E2 ; -1.23E-3 )
6. i vi cac d liu sau, ta dung kiu d liu nao cho hp ly :
Ngay, thang, nm sinh ; im trung bnh mn hoc
7. Vit chng trnh nhp s giy, xut ra di dang gi : phut : giy
8. Vit chng trnh nhp gi : phut : giy, xut ra s giy.
9. Vit chng trnh nhp gi1 : phut1 : giy1 va gi2 : phut2 : giy2, xut ra tng.
10. Tnh :
(4<5) || (5<4)
!(4-4) && (2+3)
11. Nu ta gan mt s co du chm thp phn vao s nguyn th sao ?
TL: gia tr c gan vao se b ct mt phn thp phn .v du : 3.14 th ch con lai 3.
12. S nguyn m la TRUE hay FALSE ?
Chng III : Cu lnh, biu thc va toan t


Trang 16
Chng III. CU LNH, BIU THUC, VA TOAN TU
I. Cu lnh:
Cu lnh la 1 ch th hoan chnh, ra lnh cho may tnh thc hin cng vic nao o. Cac
cu lnh kt thuc bi du chm phy, thng c vit trn 1 dong chng trnh ro rang.
Trnh bin dch se bo qua cac k t khng nhn thy nh tab, enter, spacebar, v vy 2
cu lnh sau y la tng ng vi nhau :
x=y+z;
va x = y + z ;
Khoang trng ch co y ngha trong xu k t nh Dai hoc Da Nang
Vi xu k t co th vit trn cac dong khac nhau th ta phai dung k t \ .
V du : int x,\
y,z;
printf(\nDai hoc \
Da Nang);
Cu lnh n gian la nhng lnh khng cha lnh khac nh phep gan, li goi ham kiu
void (ham khng co gia tr tra v), lnh nhay khng iu kin.
Cu lnh cu truc la khi lnh, lnh th va lnh re nhanh, lnh lp.
II. Khi lnh:
Khi lnh la mt nhom cu lnh c bao bi cp du ngoc {}.
V du : { cu lnh 1;
cu lnh 2;
........
cu lnh n;
}
Nhng ni co th t mt lnh n th co th t 1 khi lnh. Bn trong khi lnh co
th co khi lnh khac.
III. Biu thuc:
Biu th c bao gm cac toan hang va toan t.
Toan hang co th la bin, hng, ham.
Toan t la + - * / % & | ......
V du : biu thc tan(x)*y - 2 gm cac toan hang la ham tan cua x, bin y va hng 2;
cac toan hang la *, - .
Biu thc s hoc la biu thc co kt qua la gia tr s hoc.
Biu thc logic la biu thc co kt qua la TRUE hoc FALSE ( thng qua 0 va 1).
Biu thc quan h la cac biu thc logic n gian, cha cac toan t quan h nh
>,<,>=,<=,==,!=. Cac toan hang trong biu thc nay khng nht thit phai tng
thch vi nhau v kiu.
Chng III : Cu lnh, biu thc va toan t


Trang 17
IV. Toan tu:
Toan t la mt k hiu nhm th c hin cac tnh toan trn 1 hay nhiu s hang.
IV.1. Phep tnh theo bit:
Khng ap du ng cho kiu float va double
Toan t Y ngha
& phep AND theo tng bit
| phep OR theo tng bit
^ phep XOR theo tng bit
~ phep ao tng bit
V du : 3 = 0000 0000 0000 0011
~3 = 1111 1111 1111 1100
Ta cn phai phn bit gia cac toan t & va && :
3 & 4 = 0, 3 && 4 = 1.
Tng t nh vy vi cac toan t | va || :
3 | 4 = 7, 3 || 4 = 1.
Ta dung cac phep tnh theo bit xoa hoc lp cac bit trong cac s nh phn.
V du : lp bit th 0 va bit th 3 cua s nguyn x, ta dung lnh x = x | 0x9;
xoa bit th 1 va bit th 2 cua s nguyn x, ta dung lnh x = x & 0xF9;
Phep dch s hoc >> va << :
I<<M : dch s nguyn I sang trai i M bit, tng ng vi I*2
M
.
I>>M : dch s nguyn I sang phai i M bit, tng ng vi I/2
M
.
V du : tnh I*20 ta vit (I<<4) + (I<<2) v 20 = 2
4
+ 2
2
.
V du : int i=0x123;
i=i>>3;
printf(\n i=%#x,i); 0x24
printf(\n i=%#o,i); 044
Chu y :
1. int i=0xFFFF;
printf("\ni=%d",i) ; -1
i=i<<2;
printf("\ni=%d",i) ; -4
2. int x=0xFFFF;
x=x<<2;
printf(\nx=%#x,x);
Kt qua: 0xFFFC; /* khng phai x*2
2
*/
3. I>>M tng ng vi I/2
M
khi I > 0.
V du: int i=-15;
clrscr();
printf("\ni=%d",i) ; -15
i=i>>3;
printf("\ni=%d",i) ; -2
Chng III : Cu lnh, biu thc va toan t


Trang 18
IV.2. Phep gan m rng :
x+=y <=> x=x+y
x-=y <=> x=x-y
x*=y <=> x=x*y
x/=y <=> x=x/y
x%=y <=> x=x%y
x>>=y <=> x=x>>y
x<<=y <=> x=x<<y
x&=y <=> x=x&y
x|=y <=> x=x|y
x^=y <=> x=x^y
Chu y : a = a*b+c; khng tng ng vi a*=b+c;
V a*=b+c; tng ng vi a=a*(b+c);
Vic dung phep gan m rng co th gy kho hiu nhng nhiu b bin dch tao ra ma
hiu qua hn nu ta dung no.
IV.3. Phep tng / giam gia tr 1 n v (dung vi cac bin):
i=i+1 <=> i++ hoc ++i
i=i-1 <=> i-- hoc --i
S khac nhau gia 2 lnh gan a= ++i va a= i++ :
++i : tng i ln 1 n v, sau o mi gan.
i++ : gan trc, sau o mi tng i ln 1 n v.
V du : x=0;a=x++; // a=x; x++; : a=0, x=1;
x=0;a=++x; // x++; a=x; : a=1,x=1;
IV.4. Toan t quan h :
Toan t Y ngha
== toan hang 1 co bng toan hang 2 khng ?
> toan hang 1 co ln hn toan hang 2 khng ?
< toan hang 1 co nho hn toan hang 2 khng ?
>= toan hang 1 co ln hn hoc bng toan hang 2 khng ?
<= toan hang 1 co nho hn hoc bng toan hang 2 khng ?
!= toan hang 1 co khac toan hang 2 khng ?
Ta cn phai phn bit toan t quan h == va toan t gan =
IV.5. Toan t sizeof():
Toan t sizeof(x) tra lai s byte ma x chim.
Ta con co th vit sizeof(kiu_d_liu)
V du : float x;
printf(\n Kch thc cua kiu s thc la : %d, sizeof(x));
printf(\n Kch thc cua kiu s nguyn la : %d, sizeof(int));
Chng III : Cu lnh, biu thc va toan t


Trang 19
IV.6. Toan t iu kin :
biu_thc1 ? biu_thc2 : biu_thc3;
Nu biu_thc1 la ung (khac 0) th gia tr cua biu thc trn la biu_thc2, nu
biu_thc1 la sai (bng 0) th gia tr cua biu thc trn la biu_thc3.

V du : Gia s ta mun tm gia tr ln nht max cua 2 s a va b. Ta co th vit nh sau :
max = a > b ? a : b
Nu a > b la TRUE th max c gan bng a, nu khng th c gan bng b.
V du: printf(There %s %d fish, (n>1) ? are:is, n);
printf("There %s %d dog%s", (n>1)?"are":"is", n, (n>1)?"s":"");

V. Thu tu uu tin giua cac phep toan:
Toan t Chiu tnh toan
() [] -> L R
- ++ -- ! ~ sizeof() &(a ch) *(con tro) toan t ep kiu : toan t 1 ngi R L
* / % L R
+ - L R
<< >> L R
< <= >= > L R
== != L R
& L R
^ L R
| L R
&& L R
|| L R
? : R L
+= -= *= /= %= &= ^= |= <<= >>= R L
Nu khng nh th t th ta co th dung cac du ngoc n ().
Nu cac toan t cung cp th lam theo chiu tnh toan.

Ta khng nn vit : x = f (...) + g (...); nu 1 trong 2 ham f va /hoc g co th lam thay
i gia tr cua cac bin truyn cho ham con lai. C khng ch ro ham nao se c thc hin
trc.
Tng t : * printf("%d %d\n", ++n, power(2, n)); /* sai */
* a[i] = i++;
VI. Su hiu chnh khi tinh toan :
Ngn ng C cho phep s trn ln cac toan hang thuc cac kiu khac nhau.
VI.1. S chuyn i s hoc :
Chng III : Cu lnh, biu thc va toan t


Trang 20
Vic chuyn i kiu gia tr xay ra t ng khi trong biu thc co cac toan hang khac
kiu. Vic chuyn i kiu gia tr cung xay ra khi gan gia tr kiu nay cho bin (hoc phn t
mang) kiu kia, khi truyn gia tr cac i s cho cac tham s , trong cu lnh return.
int long float double long double.
Khi chuyn i theo chiu ngc lai th se b mt mat thng tin, co th co canh bao
nhng khng co li.
V du: int n;
long p;
float x,s;
s=n*p+x;
u tin khi tnh n*p, n c i thanh kiu long. Tch co kiu long nn khi tnh tng,
tch c chuyn thanh kiu float. Tng co kiu float se c gan cho s.
VI.2. S u tin cho kiu s :
Cac phep tnh s hoc khng nh ngha cho kiu char va short. C t ng hiu chnh
kiu char va kiu short thanh kiu int.
VI.3. Chuyn i i vi kiu k t char:
Kiu k t char khi trong biu thc s hoc se c chuyn i thanh kiu int da vao
bang ma ASCII.
V du : char ch;
ch = A + 1; // A=65 nn A+1=66 t o ch=B
VII. C y chuyn di kiu gia trj:
nhn c kt qua mong mun i khi ta phai chuyn i kiu cua gia tr.
V du :
#include <stdio.h>
#include <conio.h>
main()
{
int m,n;
float x;
m=3;n=2;
x=m/n; // phep chia ly phn nguyn, sau o chuyn sang kiu float gan vao x
printf(\n Khi chua chuyen doi : m/n = %f,x);
printf(\n Khi da chuyen doi : m/n = %f,(float)m/n);
getch();
return 0;
}
y (float)m co ngha la chuyn i n sang kiu s thc.
Khi o (float)m/n la phep chia gia 2 s thc.
Ta co th vit (float)(m) hoc (float)m.
Chng III : Cu lnh, biu thc va toan t


Trang 21
VIII. Cac ham s hoc chun:
Cac ham s hoc chun nhn cac i s la cac s nguyn hoc s thc, cac ham nay
nm trong file math.h. V vy trc khi s dung ta cn khai bao #include <math.h>

Ham Y ngha
int abs(int i) tra lai gia tr tuyt i cua s nguyn i
double fabs(double d) tra lai gia tr tuyt i cua s thc d
double sin(double d) tra lai ham sin
double cos(double d) tra lai ham cos
double cosh(double d) tra lai ham ch (hyberbolic)
double tan(double d) tra lai ham tg
double exp(double d) tra lai gia tr e mu d
double log(double d) tra lai ham loga c s e
double log10(double d) tra lai ham loga c s 10
double pow(double d1, double d2) tra lai gia tr d1 mu d2
double floor(double d) tra lai ham ct tron s
double ceil(double d) tra lai ham lam tron s
double fmod(double d1, double d2) tra lai ham phn d cua phep chia d1/d2
double sqrt(double d) tra lai ham cn bc hai
void srand(double d) khi tao b s ngu nhin
V du :
floor(3.2) = 3. floor(3.7) = 3.
ceil(3.2) = 4. ceil(3.7) = 4.
lam tron cac s thc t 2.5 n cn 3.5 thanh 3 ta dung floor(i+0.5)
IX. Bai tp :
1. Gia s ta co :
float x,y;
x=(int)3.4;
y=(int)3.8;
Tnh x,y. (3,3)
2. Gia s ta co :
int x=3,y=5;
x=y++;
y=++x;
Tnh x,y. ( 6,6)
3. float x,y;
x=14/5;
y=(float)14/5;
Tnh x,y. ( 2.000 , 2.8 )
4. Tnh 10101 | 11001, 10101 & 11001
Chng III : Cu lnh, biu thc va toan t


Trang 22
5. Ban u 4 s x,y,z,t u bng 5. Thc hin cac lnh :
y=x++;
t=++z;
Hoi kt qua cui cung cua 4 s trn.
6. Lp lnh tnh biu thc :

) ( cos 3 ) tan(
2
x x
e z
+
=

7. Vit chng trnh nhp 4 s nguyn, tnh tng 2 s nguyn gia
V du : nhp 4 s a <= b <= c <= d , xut ra b + c.
8. Vit oan lnh tnh ham du nh sau :

>
=
<
=
0 n nu
0 n nu 0
0 n nu
1
1
) (n sign


Li giai: Cach 1: sign = n > 0 ? 1 : 0 ;
sign = n < 0 ? -1: sign ;
Cach 2: sign = n > 0 ? 1 : ( n == 0 ? 0 : -1 ) ;
Hoc sign = n > 0 ? 1 : ( n < 0 ? -1 : 0 ) ;
Chng IV : Nhp xut d liu


Trang 23
Chng IV. NHP XUT DU LIU
I. Ham printf() :
Ham printf() nm trong stdio.h. Ham nay co kha nng chuyn dang, tao khun va a
cac kiu d liu ra man hnh.
I.1. Dang :
int printf(xu nh dang, day cac biu thc )
V du :
printf(%d %d %c,1,2,c);
v du trn ta thy co s tng ng 1-1 va ung trnh t gia cac ma nh dang trong
xu nh dang va day cac biu thc.
I.2. Xu nh dang : bao gm :
Cac k t iu khin :
- \n : sang dong.
- \f : sang trang.
- \b : xoa lui mt k t
- \t : tab (tng ng vi 8 khoang trng)
Cac ma nh dang (%) cho cac biu thc tng ng
Cac k t hin th: Ngoai nhng k t bnh thng, a ra nhng k t c bit,
ta phai vit nh sau :
- \ : in ra du
- \* : in ra du *
- \\ : in ra du \
Khun nh dang :
%[flag][fw][.pp]ktnhdang
trong o % va ktnhdang bt buc phai co
flag: co bn c:
- Canh trai cac gia tr xut (mc nh la canh phai)
+ Hin th du cua cac s ( + hoc - ).
Cac s khng du c bt u bng khoang trng, s m bt u bng du -
# In cac s co k hiu cua h thng s (ch dung vi cac k t chuyn dang x, X hoc o) :
in 0x hoc 0X trc s thp luc phn, in 0 trc s bat phn.

- Khi khng co du tr th kt qua c dn v pha bn phai nu dai thc t
cua no nho hn dai cua khun in danh cho no. Cac v tr d tha se c lp bng cac
khoang trng. Nu day s fw bt u bng s 0 th cac v tr d tha se c lp y bng s 0
- Khi co du tr th kt qua c dn v pha bn trai va cac v tr d tha lun
c lp bng cac khoang trng.

Chng IV : Nhp xut d liu


Trang 24
Trng ra fw Du - Kt qua
-2035 8 co -2035
-2035 08 co -2035
-2035 8 khng -2035
-2035 08 khng -0002035
abcdef 08 co abcdef
abcdef 08 khng abcdef
abcdef 8 khng abcdef
fw : la day s nguyn xac nh rng ti thiu danh cho trng ra :
- Khi fw ln hn dai thc t cua trng ra th cac v tr d tha se c lp
y bi cac khoang trng hoc cac s 0 tuy thuc vao s co mt cua s 0. Ni dung trng ra
c y sang bn trai hay phai tuy thuc vao s co mt cua du tr.
- Khi khng co fw hoc fw ln hn dai thc t cua trng ra th rng danh
cho trng se bng dai thc t cua trng ra.
V du : a ra dong 123^^^^^^000123123^^^ ta vit nh sau :
printf(%-9d%06d%-6d,123,123,123);
.pp : pp la s nguyn co chc nng :
- i vi s nguyn th in ra t nht pp ch s (nu thiu th chen cac s 0). i
vi phn thp phn, nu khng co pp th chnh xac mc nh la 6. Nu pp ln hn dai
thc cua trng ra th no chen cac s 0 vao, nu nho hn th no se ct bt.
- i vi xu k t : Nu pp nho hn dai xu th ch co pp k t u tin cua
xu c a ra. Nu khng co pp hoc pp ln hn dai xu th toan b xu c a ra.
V du : printf(%-10.2f,-123.456); se cho kt qua -123.46^^^
Tai v tr fw va .pp ta co th t du *, khi o chung c xac nh bi biu thc tng
ng: V du : int n=8;
float y=4.5;
printf(\n%*.2f,n,y);
se cho kt qua ^^^^4.50
K t nh dang : la k hiu xac nh quy tc nh dang va dang in ra cua biu thc.
K t nh dang Y ngha
%c In ra k t ki u char, co th dung cho short hoc int
%d, %i In ra s nguyn int, co th dung cho char
%u In ra unsigned int, co th dung cho unsigned char, unsigned short
%ld In ra s nguyn kiu long int
%lu In ra s nguyn kiu unsigned long int
%x,%X In ra s nguyn dang Hexa (%x: lower case, %X: upper case)
%o In ra s nguyn dang Octal
%f In ra s thc dang thng vi 6 ch s thp phn, dung cho float, double
%e,%E In ra s thc dang mu e hay E
%g,%G In ra s thc kiu %f hay %e tuy thuc vao cai nao ngn hn
%s In ra xu k t bng cach cung cp a ch cua xu k t
Chng IV : Nhp xut d liu


Trang 25
I.3. Day cac biu thc :
Cac biu thc cach nhau du ph y, biu thc la hng, bin, ham, phn t cua mang
hoc biu thc cu th.
I.4. Gia tr cua ham printf():
Khi thc hin thanh cng, printf() cho ta s k t (k ca k t iu khin) c a ra.
Khi co li ham tra v gia tr -1.
V du : m=printf(\n 123456); m=8
Mt s li hay mc phai :
- Ma nh dang khng phu hp vi kiu cua biu thc.
- S ma nh dang khng tng ng vi s biu thc.
II. Ham scanf() :
II.1. Mu :
int scanf(xu nh dang, day a ch cac bin)
V du : int x,y;
scanf(%d%d,&x,&y);
Dong vao : la day k t lin tip nhp t thit b vao, cui dong vao la k t \n.
Trong dong vao co cac khoang trng, du tab, ... cac thanh phn nay la du phn cach
gia cac trng vao.
y co s tng ng 1-1 va ung trnh t gia cac ma nh dang trong xu nh dang
va day cac a ch cac bin.
Xu nh dang : %[*][dd]]ktnhdang
Du * : Trng vao vn oc bnh thng nhng khng c lu vao b nh. V
vy se khng co i tng ng.
dd : day s xac nh dai trng vao.
- Nu dd vng mt hoc dd ln hn dai cua trng vao th toan b trng
vao c oc va ghi vao vung nh tng ng.
- Nu dd nho hn dai cua trng vao th ch co phn u cua trng vao co
kch c dd c oc va ghi vao vung nh tng ng, phn con lai c xem xet sau.
V du :
int a;
float x,y;
char ch[10],ct[10];
scanf("%f%5f%3d%3s%s",&x,&y,&a,ch,ct);
Khi ta nhp vao 12345 12 12345678abcd th :
x=12345
y=12
a=123
ch=456 (co k t NULL cui)
ct=78abcd (co k t NULL cui)
Chng IV : Nhp xut d liu


Trang 26
K t nh dang : c,[day k t],[^day k t]
K t nh dang Y ngha
%c oc mt k t kiu char
%d oc s nguyn int
%u oc unsigned int
%hd oc s nguyn kiu short int
%ld oc s nguyn kiu long int
%lu oc s nguyn kiu unsigned long int
%x oc s nguyn dang Hexa
%o oc s nguyn dang Octal
%f oc s thc float theo kiu vit thng hay vit theo s mu
%e oc s thc float vit theo s mu
%lf hoc %lu oc s thc double
%s oc xu k t khng cha du cach, dung a ch cua xu k t
[day k t]:
Cac k t trn dong vao se c oc nu thuc day k t trong 2 du []. i tng ng
phai la con tro kiu char tro ti vung nh u ln.
[^day k t]:
Cac k t trn dong vao se c oc ln lt cho n khi gp 1 k t thuc day k t
trong 2 du []. i tng ng phai la con tro kiu char tro ti vung nh u ln.
Mt s li hay mc phai :
- Ma nh dang khng phu hp vi kiu cua biu thc.
- S ma nh dang khng tng ng vi s biu thc.

V du :
#include <stdio.h>
#include <conio.h>
main()
{
char x[10],y[10];
printf("\nNhap vao day :");
scanf("%[1234567890]%[^0123456789]",x,y);
printf("\n%s",x);
printf("\n%s",y);
getch();
return 0;
}
Khi ta nhp 12345abcdefg123 th kt qua se la :
x=12345 va y=abcdefg.
Gia tr tra v cua ham :
Ham tra v s nguyn bng s cac gia tr nhn c (lu vao b nh).
Trong v du trn, gia tr tra v cua ham la 2.
Chng IV : Nhp xut d liu


Trang 27
Day cac a ch cua cac bin :
La cac con tro cha a ch cua cac bin, cac a ch nay cach nhau du phy.

V du : int a;
char b;
scanf(%c%d,&b,&a);
va ta nhp c^3 th b=c va a=3.
V du : int a;
char b;
scanf(%d%c,a,b);
va ta nhp 3^c th a=3 va b=^.
V du : int a;
char b;
scanf(%d %c,a,b);
va ta nhp 3^c th a=3 va b=c.
Nh vy nu gia 2 ma nh dang ta co thm vao cac khoang trng th khi nhp d
liu, may se nhay qua cac khoang trng, du xung dong, du tab..... n khi gp k t khac.
V du : int a,b;
scanf(%d%d,&x,&y);
Nu ta go vao 34^^45 th x=34,y=45.
Nu ta go ^^^34^^45^^^^ hoc nhp hai s o trn nhiu dong th vn co kt qua trn.
Khun oc : khun oc cung nh khun in.
V du : scanf(%3d %3d,&a,&b);
Ta nhp vao 12^^23 kt qua : a=12;b=23.
1234567 kt qua : a=123;b=456.
Chung ta nn nhp vao cac s trn tng dong khng b ln ln.
V du :
#include <stdio.h>
#include <conio.h>
main()
{
int x,y;
printf(\nNhap vao so x :);
scanf(%d,&x);
printf(\nNhap vao so y :);
scanf(%d,&y);
printf(\nx=%d,x);
printf(\ny=%d,y);
getch();
return 0;
}
Khi ta nhp 23^^^34^^^ th kt qua la Nhap vao so x : 23^^^34
Chng IV : Nhp xut d liu


Trang 28
Nhap vao so y :
x=23
y=34
D liu nhp vao t ban phm c lu vao stdin ch x l ch khng c x l
trc tip t ban phm. Do d liu a co sn trong stdin nn may tnh oc lun s nay va gan
cho bin tng ng ma khng ch ta go tip vao t ban phm. Trong stdin se con lai cac k t
^^^ va k t xung dong (\n).
III. Dua ra may in :
Mu : fprintf(stdprn,xu nh dang, day cac biu thc );
i s stdprn xac nh thit b a ra la may in.
Xu nh dang va day cac biu thc ging nh ham printf().
V du : fprintf(stdprn,Xin chao cac ban \n);
IV. Lung du liu :
Co nhiu thit b vao ra nh ban phm, man hnh, may in, tp tin d liu trn a .....
Dong d liu la cac byte d liu trao i gia cac thit b.
Cac dong d liu lin quan ti cac thit b vao ra thng dung :
Stdin ban phm
Stdout man hnh
Stderr man hnh
Stdprn may in
Stdaux cng ni tip
Lnh printf thc cht la lnh fprintf(stdout,...)
V. Dong vao stdin :
Stdin la dong vao chun (ban phm), cac ham scanf, gets, getchar nhn d liu t o.
Nu stdin co u d liu, cac ham trn se nhn phn d liu ma chung yu cu, phn d
liu con lai vn trn stdin.
Nu stdin cha co u d liu, may se tam dng ngi s dung nhp thm d liu t
ban phm vao stdin (cho n khi bm phm Enter ) .
V.1. Ham gets:
Ham nay nhp mt chui d liu t stdin. Ham nay thuc tp tin stdio.h
Mu : char *gets(char *s);
Trong o : s la con tro kiu char ti vung cha day k t nhn c.
Cng dung :
Nhn day k t t stdin cho n khi gp k t \n (tc la chui co th cha khoang
trng). K t \n c loai khoi stdin va cu ng khng tn tai trong chui nhn c. Chui c
b sung thm k t \0 va t vao vung nh ma con tro s tro ti. Ham tra v a ch ma chui
nhn c.

Chng IV : Nhp xut d liu


Trang 29
V du :
#include <stdio.h>
#include <conio.h>
main()
{
char name[20];
printf(Nhap vao ten cua ban :);
gets(name);
printf(\nTen cua ban la : %s,name);
getch();
return 0;
}
Ta cung co th dung ham nay oc mt s nguyn :
gets(str);
i=atoi(str);
hoc oc mt s thc:
gets(str);
f=atof(str);
V.2. Ham getchar():
Ham nay nhn mt k t t stdin. Ham thuc tp tin stdio.h
Mu : int getchar(void);
Cng dung :
Nhn mt k t t stdin, tra v k t nhn c.
Chu y :
1. Xet cu lnh :
int ch;
ch=getchar();
Nu ta nhp vao ch A va nhn Enter th ch=A va k t \n vn co trong stdin va no
se lam tri i ham getchar hoc gets sau o.
Nu ta nhn Enter th ch=\n va \n khng con trong stdin.
2. Ham scanf cung lai k t \n . K t nay se lam tri cac ham getchar va gets
sau o. ham nay hoat ng ung, ta thm vao %*c cui xu nh dang.
V du :
#include <stdio.h>
#include <conio.h>
main()
{
int t;
char name[20];
printf("Nhap vao tuoi cua ban :");
scanf("%d%*c",&t);
Chng IV : Nhp xut d liu


Trang 30
printf("\nTen cua ban la : ");
gets(name);
return 0;
}
V.3. Lam sach stdin :
Ta s dung ham fflush. Nhm xoa cac k t con lai trong stdin.
Mu : fflush(stdin);
V du :
#include <stdio.h>
#include <conio.h>
main()
{
int x,y;
printf(\nNhap vao so x :);
scanf(%d,&x);
fflush(stdin);
printf(\nNhap vao so y :);
scanf(%d,&y);
printf(\nx=%d,x);
printf(\ny=%d,y);
getch();
return 0;
}
Kt qua : Nhap vao so x : 25^^^69
Nhap vao so y : 56
x=25
y=56
VI. Cac ham xut ki tu puts va putchar:
VI.1. Ham puts :
Mu : int puts(const char *s);
Trong o s la con tro kiu char, tro ti vung nh cha chui k t cn xut ra stdout.
Cng dung : a chui s va thm k t \n ra man hnh
Gia tr tra v :
Khi thanh cng tra v k t cui cung c xut (\n). Khi co li tra v EOF.
V du : puts(Viet nam);
Lnh nay ging lnh writeln cua PASCAL.
VI.2. Ham putchar :
Mu : int putchar(int ch);
Trong o ch la la ma cua k t cn xut ra stdout.
Chng IV : Nhp xut d liu


Trang 31
Cng dung : a k t co ma la ch ra man hnh
Gia tr tra v :
Khi thanh cng tra v k t c xut . Khi co li tra v EOF.
V du : putchar(A); putchar(65);
VII. Cac ham vao ra trn man hinh va ban phim :
Cac ham nay thuc tp tin conio.h
VII.1. Ham getch :
Mu : int getch(void);
Cng dung :
- Nu co sn k t trong b m ban phm th ham nhn lun k t o.
- Nu b m rng th ch go mt phm ma khng cn bm Enter. K t va
go khng xut hin trn man hnh.
Gia tr tra v : Ham tra v k t nhn c.
Ta nn s dung ham getch() cui ham main() xem c kt qua trn man hnh
trong khi chng trnh ang ch ta go vao 1 phm.
VII.2. Ham getche :
Mu : int getche(void);
Cng dung : nh ham getch nhng hin th k t o trn man hnh.
VII.3. Ham putch :
Mu : int putch(int ch);
Trong o ch la ma cua k t cn xut.
Cng dung : Xut k t co ma ch ra man hnh, k t c xut vi mau c xac
nh trong ham textcolor. y la s khac bit gia ham putch va putchar, ham putchar lun
xut k t ra man hnh vi mau trng.
Gia tr tra v : Ham tra v k t c hin th
VII.4. Ham khbit :
Mu : int khbit(void);
Cng dung : Ham co gia tr khac 0 nu b m ban phm khng rng, co gia tr 0
nu b m ban phm rng.
VIII. Trinh bay man hinh :
Cac ham trnh bay man hnh nm trong tp tin conio.h
VIII.1. Ham di chuyn con tro :
Mu : gotoxy(int x, int y);
Cng dung : t con tro man hnh vao toa (x,y) cua man hnh. x la toa ct co
gia tr t 1 n 80, y la toa ct co gia tr t 1 n 25
Chng IV : Nhp xut d liu


Trang 32
VIII.2. Ham xoa man hnh clrscr() : (Clear Screen)
Mu : clrscr();
Cng dung : xoa toan b man hnh va t con tro v tr goc trn bn trai.
VIII.3. Ham clreol() : (Clear End of line)
Mu : clreol();
Cng dung : xoa cac k t nm bn phai con tro.
VIII.4. Ham delline():
Mu : void delline(void);
Cng dung : xoa dong cua ca s ang cha con tro.

Cac hng mau : c s dung vi cac ham textcolor() va ham textbackground()

Gia tr Mau
0 BLACK en
1 BLUE Xanh l
2 GREEN Xanh la cy
3 CYAN Xanh cm thach
4 RED o
5 MAGENTA Ta
6 BROWN Nu
7 LIGHTGRAY Xam nhat
8 DARKGRAY Xanh m
9 LIGHTBLUE Xanh nhat
10 LIGHTGREEN Xanh la cy nhat
11 LIGHTCYAN Xanh cm thach nhat
12 LIGHTRED o nhat
13 LIGHTMAGENTA Ta nhat
14 YELLOW Vang
15 WHITE Trng
128 BLINK Nhp nhay
VIII.5. Ham textcolor() :
Mu : void textcolor(int newcolor);
Cng dung : chon mau k t mi.

Newcolor co gia tr t 0 n 15 tng ng vi cac mau bang trn
cac k t nhp nhay ta cng thm 128 vao gia tr mau.
V du : textcolor(WHITE);
hoc textcolor(15);
Chng IV : Nhp xut d liu


Trang 33
VIII.6. Ham textbackground() :
Mu : void textbackground(int color);
Cng dung: chon mau nn mi
Color co gia tr t 0 n 7 tng ng vi 8 mau bang trn.
V du :
#include <stdio.h>
#include <conio.h>
main()
{
int x,y,i=0;
int attr;
char *s=Da Nang;
clrscr();
x=10;y=12;
while (s[i]!=\0)
{ gotoxy(x++,y++);
putch(s[i]);
i++; attr+=17;
textattr(attr);
}
getch();
return 0;
}
VIII.7. Ham highvideo(), lowvideo() va normvideo() :
Cac ham nay iu khin sang cua k t . highvideo() cho sang ln, lowvideo()
cho sang yu, normvideo() cho sang bnh thng.
V du : lowvideo(); printf(ABC);
normvideo(); printf(ABC);
VIII.8. Ham textattr() :
Mu : textattr(int newattr);
Trong o newattr la byte ma hoa thuc tnh mau.
B b b b f f f f
4 bit f la mau k t (foreground), 3 bit b la mau nn (background) va bit B xac lp nhp
nhay.
Cng dung : xac lp thuc tnh cua k t trn man hnh.
VIII.9. Ham wherex, wherey :
Mu : int wherex();
int wherey();
Gia tr tra v : Tra v gia tr la toa hin thi cua con tro trn man hnh
Chng IV : Nhp xut d liu


Trang 34
VIII.10. Ham printf, scanf, cprintf, cscanf :
Chc nng cprintf, cscanf gn ging nh printf, scanf nhng vi cac ham cprintf,
cscanf cac k t hin trn man hnh se anh hng bi cu lnh textcolor, con printf, scanf th
khng.
VIII.11. Ham window :
Mu : window(int x1, int y1, int x2, int y2);
Cng dung : tao ra ca s vn ban vi cac toa nh trn va a con tro v goc
trn bn trai ca s va tao. Cac lnh ghi ra vn ban trn man hnh se nm trong ca s nay.
IX. Bai tp :
1. Vit chng trnh nhp ban knh R va xut ra man hnh th tch, din tch cua hnh cu
(V=4R
3
/3, S=4R
2
)
2. Vit chng trnh nhp theo th t cac thng tin cua mt ngi (ho tn, tui, ngh
nghip, a ch,...) ri xut ra man hnh cac thng tin o.
Chng V : Cac cu lnh iu khi n


Trang 35
Chng V. CAC CU LNH DIU KHIN
Thng thng trong mt chng trnh, cac cu lnh c thc hin tun t t trn
xung. Tuy nhin co nhiu khi ta lai mun thay i tr t t trn nh s dung cac cu lnh iu
khin chng trnh. Cac cu lnh iu khin co th lam cho cac cu lnh c thc hin nhiu
ln hoc khng ln nao ca.
Cac cu lnh iu khin gm co :
cu lnh re nhanh : if...else ; switch
cu lnh nhay khng iu kin
cu lnh vong lp
cu lnh h tr nh break, continue.
I. Cu lnh if .. else....:
I.1. Cac dang cua cu lnh if :
Dang 1 : if (biu thc) /* khng co du chm phy y*/
lnh_1;

Dang 2 : if (biu thc)
lnh_1;
else
lnh_2;
biu thc
khi lnh 1
T
F
Chng V : Cac cu lnh iu khi n


Trang 36

Dang 1 : nu biu thc co gia tr khac 0 (TRUE) th thc hin khi lnh 1, nu bng 0
(FALSE) th tip tuc thc hin lnh tip theo sau lnh if.
Dang 2 : nu biu thc co gia tr khac 0 (TRUE) th thc hin khi lnh 1, nu bng 0
(FALSE) th thc hin khi lnh 2.
Biu thc khng nht thit phai la biu thc so sanh ma co th la biu thc s hoc.
V du : tm s ln nht va nho nht trong 2 s nhp t ban phm.
#include <stdio.h>
#include <conio.h>
main()
{
float x,y,min,max;
printf(Nhap so thuc thu nhat:);scanf(%f,&x);
printf(Nhap so thuc thu hai :);scanf(%f,&y);
if ( x<y )
{ min = x;
max = y;
}
else
{ min = y;
max = x;
}
printf(\n Gia tri lon nhat = %f, Gia tri nho nhat = %f,max, min);
getch();
return 0;
}
Ta co th thay th lnh trn bng lnh :
min=(x<y)? x:y;
max=(x>y)? x:y;
I.2. S lng nhau gia cac cu lnh if:
Cac cu l nh if co th lng nhau : trong khi lnh cua cu lnh if nay co th co cu
lnh if khac. tranh nhm ln ta nn s dung du o ng m khi lnh.
biu thc Khi lnh 2
khi lnh 1
T
F
Chng V : Cac cu lnh iu khi n


Trang 37
Nu s t khoa if bng s t khoa else th ta co tng ng tng cp if-else
Nu s t khoa if nhiu hn s t khoa else th else c gn vi if lin trc no.
V du :
if (n>0)
if (a>b)
z=a;
else z=b;
Nh vy else se gn lin vi if th hai.


chng trnh trong sang, ta cn tun thu :
Ta nn s dung cp du {} chc chn khng nhm ln.
Cac cu lnh, khi lnh nm trong mt cu lnh if nm dch v bn phai.
Cac cu lnh, khi lnh cung cp th vit thng ct.
im u va im cui cua khi lnh phai nm thng ct.
V du :
if (n>0)
if(a>b)
z=a;
tng ng vi :
if ((n>0)&&(a>b))
z=a;
I.3. else if:
if (biu thc 1)
khi lnh 1;
else if (biu thc 2)
khi lnh 2;
.......
else if ( biu thc n)
khi lnh n;
else khi lnh n+1;
i vi cu lnh nay :
Ch co 1 trong n+1 khi lnh c thc hin .
Nu biu thc i la biu thc u tin khac 0 (TRUE) th khi lnh i c thc hin
Nu ca n biu thc u bng 0 (FALSE) th khi lnh n+1 c thc hin.
V du : giai phng trnh bc 2
#include <stdio.h>
#include <conio.h>
#include <math.h>
main()
{
Chng V : Cac cu lnh iu khi n


Trang 38
float a,b,c,delta;
printf(\nNhap vao 3 he so:);
scanf(%f%f%f,&a,&b,&c);
if (a==0)
if (b==0)
if (c==0)
printf(\nPhuong trinh dung voi moi x);
else printf(\nPhuong trinh vo nghiem!);
else printf(\nPhuong trinh co 1 nghiem x: %f,(-c) / b);
else
{
delta=b*b-4*a*c;
if (delta<0.0)
printf(\nPhuong trinh vo nghiem);
else if (delta==0.0)
printf(\nPhuong trinh co mot nghiem kep : x = %f,-b/(2*a));
else { printf(\nPhuong trinh co hai nghiem phan biet :);
printf(\nx1 = %f, (-b+sqrt(delta))/(2*a));
printf(\nx2 = %f, (-b-sqrt(delta))/(2*a));
}
}
getch();
return 0;
}
II. Cu lnh switch:
Lnh if ch cho phep ta chon mt trong hai phng an tuy theo biu thc iu kin.
Tuy nhin i khi ta cn phai la chon 1 trong nhiu phng an khac nhau. thun tin ta se
dung cu lnh switch:
switch (biu thc)
{
case hng1 : [ khi lnh 1 ; ]
case hng2 : [ khi lnh 2 ; ]
........
case hngn : [ khi lnh n ; ]
[default : khi lnh n+1 ; ]
}
Trong o :
biu thc: la biu thc nguyn bt k
Cac hng i phai co gia tr khac nhau
Cac khi lnh i va thanh phn default la khng bt buc.
S hoat ng cua cu lnh switch :
Chng V : Cac cu lnh iu khi n


Trang 39
May se so sanh biu thc vi cac hng i theo th t t trn xung. Khi biu thc co gia
tr bng hng i th khi lnh i c thc hin. Nu trong khi lnh o khng co lnh nhay th
se thc hin tip tuc cac khi lnh bn di ma khng cn so sanh tip. Nu trong khi lnh
o co lnh break th se thoat ra khoi cu lnh switch. Khi biu thc co gia tr khac vi tt ca
hng i th se thc hin khi lnh n+1 (nu co).
Khi biu thc bng vi hng i, sau khi thc hin xong khi lnh i chng trnh se
thoat ra ngoai cu lnh switch sm hn ta co th dung lnh break. Ta cung co th s dung lnh
goto nhay ra khoi cu lnh switch (ta khng nn dung lnh goto).


V du :
#include <stdio.h>
#include <conio.h>
main()
{
char ch;
printf(\n Nhap 1 ki tu:);
scanf(%c,&ch);
switch (ch)
{
case A : printf(\nChu A);
break;
case B : printf(\nChu B);
break;
case C : printf(\nChu C);
break;
default : printf(\nKhong phai cac chu A,B,C);
}
getch();
return 0;
}
Nhiu gia tr case trong mt trng hp :
May se tip tuc lam vic khi cha gp lnh thoat, v vy ta co th sp xp co nhiu
gia tr case trong mt trng hp
V du :
#include <stdio.h>
#include <conio.h>
main()
{
int n;
printf(Nhap diem:);
scanf(%d,&n);
Chng V : Cac cu lnh iu khi n


Trang 40
switch (n)
{
case 0:
case 1:
case 2:
case 3:
case 4: printf(loai kem);break;
case 5:
case 6: printf(loai trung bnh);break;
case 7:
case 8: printf(loa i gioi);break;
default: printf(loai gioi);
}
getch();
return 0;
}
Trong C++ ta co th vit nh sau :
#include <stdio.h>
#include <conio.h>
main()
{
int n;
printf(Nhap diem:);
scanf(%d,&n);
switch (n)
{
case 0,1,2,3,4: printf(loai kem);break;
case 5,6: printf(loai trung bnh);break;
case 7,8: printf(loai gioi);break;
default: printf(loai gioi);
}
getch();
return 0;
}
Ta nn s dung default cho du khng bao gi xay ra trng hp o: ta dung default
kim tra xem co th co li hay khng bng cach t mt thng bao li o , t o ta d g ri.
III. Cu lnh for:
thc hin cac cng vic lp i lp lai hay lam vic vi cac phn t mang, nu ta
vit tng lnh mt th se khng hiu qua.
Dang :
for([ cac biu thc khi tao ] ; [ biu thc iu kin ] ; [ biu thc thay i iu kin ])
Chng V : Cac cu lnh iu khi n


Trang 41
cng vic ; /* y la thn cua chu trnh */

S hoat ng cua cu lnh for :
1. Thc hin biu thc khi tao.
2. Kim tra biu thc iu kin
- nu biu thc iu kin ung th thc hin cng vic bn trong chu trnh for.
- nu biu thc iu kin sai th thoat ra khoi lnh for .
3. Tnh biu thc 3, quay tr lai bc 2.
V du : a ra man hnh cac s t 1 n 10, mi s trn mt dong :
#include <stdio.h>
#include <conio.h>
main()
{
int i;
for(i=1;i<=10;i++)
printf(\n%d,i);
getch();
return 0;
}
V du :
#include <stdio.h>
#include <conio.h>
main()
{
Biu thc khi tao
Biu thc
iu kin
Thc hin cng vic
Thay i iu kin
T
F
Chng V : Cac cu lnh iu khi n


Trang 42
int i,n,sohang,tong=0;
printf(\nNhap n:);
scanf(%d,&n);
printf(\nNhap vao %d so nguyen :,n);
for(i=1;i<=n;i++)
{
printf(\nSo thu %d : ,i);
scanf(%d,&sohang);
tong+=sohang;
}
printf(\nTong = %d,tong);
getch();
return 0;
}

Cac biu thc trong ngoc vung co th co, co th khng nhng cac du chm phy,
ngoc n bt buc phai co mt. Cac biu thc cung loai c ngn cach nhau bi dy phy.
Vi C++ ta co th khai bao bin tam thi mt khi lnh {}. Trong vong lp for co
th khai bao bin trong biu thc u tin cua biu thc khi tao.
Khi biu thc 2 vng mt th no xem nh lun ung. Biu thc 2 co th gm nhiu
biu thc nhng tnh ung sai cua no la tnh ung sai cua biu thc cui cung.
ra khoi vong lp ta dung cac lnh break, goto hoc return trong thn chu trnh.
V du : vong lp for sau y khng co biu thc thay i iu kin:
for(count=0;count<10;)
printf(\n%d,count++);
Thm ch ta co th vit vong lp for khng co ca ba biu thc trn. Ta cung co th tao
vong lp for khng co cu lnh nao trong vong lp, moi cng vic a c thc hin trong cu
lnh for. Khi o cu lnh rng se la du chm phy ng mt mnh trn mt dong. Tuy nhin
ta khng nn lam nh vy.

Cac vong for lng nhau :
Pha trong cac thn cua vong for co th co nhng vong for khac.
V du :
for(i=1;i<10;i++)
{ for(j=1;j<10;j++)
printf(%3d,i+j);
printf(\n);
}
Khi gp lnh break trong vong lp for th may se ra khoi vong lp for su nht cha
lnh nay.


Chng V : Cac cu lnh iu khi n


Trang 43
IV. Cu lnh while:
Dang :
while (biu thc)
cng vic; /* thn chu trnh*/

Du ngoc bao quanh biu thc la bt buc.
S hoat ng cua cu lnh while :
1. Kim tra biu thc
- Nu biu thc ung th chuyn sang bc 2.
- Nu biu thc sai th thoat khoi vong lp.
2. Thc hin cng vic.
3. Quay lai bc 1.

V du : a ra man hnh cac s t 1 n 10, mi s trn mt dong :
#include <stdio.h>
#include <conio.h>
main()
{
int i=1;
while ( i<=10)
{ printf(\n%d,i);
i++;
}
getch();
return 0;
}
y ta nh phai tng gia tr cua bin i v nu khng th vong lp se c thc hin
mai mai v luc nao iu kin cung c thoa man.

biu thc
cng vic
T
F
Chng V : Cac cu lnh iu khi n


Trang 44
V du :
#include <stdio.h>
#include <conio.h>
main()
{
int n,tong=0,i=1;
while ( i<=10)
{ printf(\nNhap so thu %d : ,i);
scanf(%d,&n);
tong+=n;
i++;
}
printf(\nTong la : %d,tong);
getch();
return 0;
}
V du :
#include <stdio.h>
#include <conio.h>
main()
{
int n,i=1;
long luythua=1;
printf(\nNhap n:);
scanf(%d,&n);
while ( i<=10)
{ luythua*=n;
i++;
}
printf(\n%d luy thua 10 = : %ld,n,luythua);
getch();
return 0;
}
V du : kim tra s nguyn n co phai la s nguyn t khng
int k=2;
while (n%k && k*k<=n) k++;
if(k*k>n) printf(\nDay la so nguyen to);

V du : Tnh e
x
1+x/1!+x
2
/2!+...+x
n
/n!
#include <stdio.h>
#include <conio.h>
#include <math.h>
Chng V : Cac cu lnh iu khi n


Trang 45
#define EPS 1e-9
void main()
{
float x, tong=0, sh=1, n=0;
printf(Nhap gia tri x=);
scanf(%f,&x);
while (sh>EPS)
{ tong+=sh;
n++;
sh*=x/n;
}
printf(\ntong=%.10f,tong);
printf(\nepx(x)=%.10f, exp(x));
getch();
return 0;
}
Cung tng t nh for, vong lp while cung co th lng vao nhau.
Ta co th vit :
while(1)
cngvic;
Tt nhin, trong cngvic phai co lnh thoat ra khoi vong lp v han nay.
while(string[i]) /* trong khi string[i]!=0 : cha ti cui xu */
{......
}
V. Cu lnh do .. while:
Dang :
do
cng vic ; /* thn chu trnh */
while (biu thc);

biu thc
cng vic
F
T
Chng V : Cac cu lnh iu khi n


Trang 46
S hoat ng cua cu lnh do ...while :
1. Thc hin cng vic.
2. Kim tra biu thc :
- Nu ung th quay tr lai bc 1.
- Nu sai th thoat khoi vong lp.
i vi vong lp for va while, u tin phai kim tra biu thc iu kin v vy co th
khng thc hin cng vic trong chu trnh ln nao ca. i vi vong lp do...while th biu thc
iu kin c kim tra sau nn cng vic trong chu trnh c thc hin t nht mt ln.

V du : a ra man hnh cac s t 1 n 10, mi s trn mt dong :
#include <stdio.h>
#include <conio.h>
main()
{
int i=1;
do
{ printf(\n%d,i);
i++;
}
while ( i<=10);
getch();
return 0;
}
V du :
#include <stdio.h>
#include <conio.h>
main()
{
int n;
do
{ printf(\nNhap mot so duong : );
scanf(%d,&n);
printf(\nBan da nhap so : %d ,n);
}
while ( n<=0) ;
printf(\nDung so duong roi ! );
getch();
return 0;
}


Chng V : Cac cu lnh iu khi n


Trang 47
VI. Cac lnh re nhanh khng diu kin : break, continue, goto :
VI.1. Lnh break, continue:
Lnh break co tac dung kt thuc toan t iu khin ang thc hin. Lnh break c s
dung trong cac vong lp, khi gp lnh nay may se thoat ra kho i vong lp. Trng hp cac
vong lp lng nhau th khi gp lnh break, may se thoat ra khoi vong lp trong cung nht.
Trai vi lnh break, continue dung bt u mt vong mi cua chu trnh ma khng
thc hin phn con lai cua chu trnh. Khi gp lnh continue bn trong thn chu trnh cua vong
lp for, may se chuyn ti bc thc hin biu thc thay i iu kin. Khi gp lnh continue
bn trong thn chu trnh cua vong lp while, do...while , may se chuyn ti bc kim tra biu
thc iu kin.
V du : Dung lnh break thoat ra khoi vong lp sm.
#include <stdio.h>
#include <conio.h>
main()
{
int i;
for(i=1;i<10;i++)
{ printf(\n%d,i);
if (i==3) break;
}
getch();
return 0;
}
Bin i chay t 1 n 9 nhng khi i bng 3 th gp lnh break nn chng trnh ch hin
th ra man hnh 3 s 1,2,3.
V du : Dung lnh continue.
#include <stdio.h>
#include <conio.h>
main()
{
int i;
for(i=1;i<10;i++)
{ printf(\n%d,i);
if (i!=3) continue;
printf( Day la so 3);
}
getch();
return 0;
}
Chng trnh se hin th cac s t 1 n 9, mi s trn mt dong. Khi i khac 3 th may
se chuyn t i kim tra tip, khi i bng 3 th se hin th thm dong ch Day la so 3.
Chng V : Cac cu lnh iu khi n


Trang 48
V du : Tnh 10!!=2*4*6*8*10
#include <stdio.h>
#include <conio.h>
main()
{
int p=1, i=1;
while (1)
{ i++;
if(i>10) break;
if(i%2) continue;
p*=i;
}
getch();
return 0;
}
VI.2. Lnh goto:
Nhan c t tn nh tn bin va co du : pha sau. Nhan co th c gan cho bt
k cu lnh nao trong chng trnh.
Lnh goto co dang:
goto nhan;
V du :
ketthuc : printf(Het); // ketthuc la nhan cua lnh printf.
......
goto ketthuc;
Khi gp lnh nay may se thc hin cac lnh sau nhan.
V du :
nhan :
{ .....
.....
}
if (biu thc) goto nhan;

Chu y :
Cu lnh goto va nhan phai nm trong cung mt ham, khng th nhay t ham
nay sang ham khac.
Khng cho phep s dung goto nhay t ngoai vao trong khi lnh, thng la
nhay t trong khi lnh ra ngoai.
Ta nn han ch s dung lnh nay n mc ti a, ch dung trong nhng trng hp tht
cn thit bng cach s dung cac lnh iu khin khac v vic iu khin d b ri.


Chng V : Cac cu lnh iu khi n


Trang 49
V du : Kim tra xem mang n phn t co i xng khng ?
Cach 1 :
dx=1;
for(i=0,j=n-1;i<j;i++,j--)
{ if (mang[i]==mang[j])
continue;
dx=0;
break;
}
Cach 2 :
i=0;j=n-1;
while ((i<j)&&(mang[i]==mang[j]))
{ i++;j--;
}
if (i<j) dx1=0;
else dx1=1;
VII. Bai tp :
1. Tnh tng cua 100 s nguyn dng u tin.
2. Tnh n!, t hp n chp k ( C
n
k
).
3. a ra man hnh :
x x *****
xx xxx ****
xxx xxxxx ***
xxxx xxxxxxx **
xxxxx xxxxxxxxx *
4. Nhp vao mt s thc t ban phm, kim tra xem s o co thuc (-1,1) hay khng ?
Tnh gia tr ham s :

+
<
=
0
0 * 2 * 3
) (
2
2
x x x
x x x
x f

5. Nhp tui cua mt ngi. Hin th ra man hnh :
Nu tui < 18 : tre v thanh nin.
Nu 18 <= tui <= 60 : ngi ln.
Nu 60 < tui : ngi gia.
6. Giai h pt : ax+by=c
dx+ey=f
7. Giai pt bc 1, 2, 3, 4.
8. Giai pt trung phng : ax
4
+ bx
2
+ c = 0.
9. Tnh din tch hnh thang bit dai cac canh.
10. Nhp R[i], i=15. Tnh in tr tng ng cua mach cu
Chng V : Cac cu lnh iu khi n


Trang 50
11. Nhp s nguyn k, a va b. Tnh hoc m xem co bao nhiu bi s cua k trong khoa ng
[a,b].
12. Tnh n! s dung cac vong lp for, do...while, while.
13. Tnh

=
chn n nu
le n nu
n
n
n
..... 6 . 4 . 2
..... 5 . 3 . 1
! !

14. Tnh a thc bc n bit n, mang cac h s, bin x.
15. S dung cac vong lp tnh cac ham sin, cos, tan, exp, lg,... theo khai trin Taylor vi
chnh xac =1e-6.
16. Nhp n va tnh
( )

=
+

1
1
1
n
n
n
vi chnh xac =1e-6.
17. Chng trnh sau co li u :
for(i=1;i<10;i++)
{ printf(\n%d,i);
i=7-i;
}
18. co c 1000 ng ta cn bao nhiu loai giy bac 100

, 50

, 200

.
19. Tm 3 s a,b,c co hai ch s thoa man phng trnh Fecma: a
2
=b
2
+c
2
.
20. Cho bit chng trnh sau lam g ?
for(i=1;i<10;i++)
{ printf(\n%d,i);
if(i==5)
i=15;
}
21. Chng trnh sau lam vic nh th nao :
for(i=1;i<10;i++)
for(i=1;i<10;i++)
printf(\nChao ban);
22. Kim tra s n co phai la s nguyn t hay khng ?
23. Nhp vao mt s nguyn dng, kim tra xem s o co tun hoan hay khng.
24. ao ngc 1 s nguyn (ca m ln dng). V du : 123 thanh 321
25. Tnh tch phn
2
1
0
x
e dx

0
2
dx e
x

26. Vit chng trnh nhp s nguyn dng n va tnh tng cac ch s cua no.
27. Kim tra s nguyn n co bng tng lp phng cac ch s cua no khng .
28. Tm s co 3 ch s sao cho s o bng tng cac c s thc s cua no.
Vd : 6 = 1 + 2 + 3.
29. Tm s ln nht, nho nht co 3 ch s sao cho tng 3 ch s bng tch cua chung.
Chng VI : Ham, mang va con tro


Trang 51
Chng VI. HAM, MANG VA CON TRO
I. Ham:
I.1. Khai nim :
Khi vit chng trnh nu gp cac bai toan tng i ln th vic t chc chng trnh
cung nh quan ly lung d liu trong chng trnh o gp rt nhiu kho khn. V vy trong ky
thut lp trnh ngi ta thng t chc chng trnh ln thanh nhng n v chng trnh nho
hn va mi n v chng trnh nh vy co nhim vu ring nht nh. Chia tr (divide
and conquer) : chia nho vn ra thanh nhiu bai toan nho hn, mi bai toan nm trong mt
ham. Khi s dung ham, vic tm li se d dang hn v ta co th khoanh vung li mt ham cu
th nao o, ch khng phai u o trong chng trnh.
Mt khac, trong chng trnh, co khi ta gp nhng oan chng trnh lp i lp lai
nhiu ln. tranh s rm ra, ta s dung nhng chng trnh con co th goi nhiu ln ma
khng phai vit lai oan chng trnh o.
Nh vy khi s dung chng trnh con, chng trnh se co oan ma ngn hn, hiu qua
hn, thun tin trong vic g ri, hiu chnh,...... chng trnh chnh, ta ch cn quan tm
n kt qua lam vic cua ham ma khng cn quan tm n vic ham lam nh th nao.
Khi xy dng chng trnh con ta phai chu y n muc ch sau :
+ Cho phep phn nho bai toan thanh nhiu n v chng trnh
+ Cho phep d dang vit chng trnh
+ D dang trong vic quan ly cac bin nh
+ D dang kim soat cac li phat sinh trong chng trnh
Chng trnh con co th la thu tuc, ham va macro. Trong C ch co ham va macro.
Cac ham th vin (ham chun) c cha trong cac file header *.h. s dung mt
ham th vin ta cn khai bao bng ch th tin x l : #include <*.h> i vi nhng ham do
ngi s dung t lp, ta cn khai bao va nh ngha trc khi s dung.
I.2. Ham :
Ham la mt oan ma c lp thc hin mt cng vic nht nh khi c goi n. Ham
co th co hoc khng tra v mt gia tr tn cua no (gia tr tra v).
Ta co th xem ham nh la mt hp en : no co th nhn mt/nhiu gia tr u vao va
co th cho ra mt gia tr thuc kiu nao o. Nu ham khng nhn gia tr u vao hoc khng
co gia tr u ra th ta s dung t khoa void. Cac bin hoc biu thc cung cp gia tr vao cho
ham go i la i s. Ham co th thay i cac i s cua no.
Cac ham khng c lng vao nhau (khng khai bao 1 ham bn trong ham khac)
nhng mt ham co th goi mt ham khac.
Chng trnh co th co nhiu ham. Ham main c goi u tin
V du : tnh din tch hnh ch nht bit chiu dai va chiu rng co s dung ham :
#include <stdio.h>
#include <conio.h>
Chng VI : Ham, mang va con tro


Trang 52
int tich(int a,int b); // khai bao nguyn mu ham
main()
{
int x,y,dientich; // khai bao bin
printf(\nNhap chieu dai:);scanf(%d,&x); // ham oc t ban phm
printf(\nNhap chieu rong:);scanf(%d,&y);
dientich=tich(x,y); // li goi ham
printf(\nDien tich hinh chu nhat: %d,dientich); // ham a ra man hnh
getch(); // oc mt k t ch
return 0;
}
int tich(int a,int b) // nh ngha ham
{
return (a*b); // gia tr tra v
}
chng trnh trn, ham c nh ngha sau ham main(). Trong v du sau ham c
nh ngha trc ham main():
#include <stdio.h>
#include <conio.h>
int tich(int x,int y) // nh ngha ham
{
return (x*y);
}
main()
{
int x,y,dientich; // khai bao bin
printf(\nNhap chieu dai:);scanf(%d,&x); // ham oc t ban phm
printf(\nNhap chieu rong:);scanf(%d,&y);
dientich=tich(x,y); // li goi ham
printf(\nDien tich hinh chu nhat: %d,dientich);
getch();
return 0;
}
I.3. Khai bao nguyn mu ham :
Nu ta nh ngha ham sau ham main() th trc ham main() cn phai thc hin vic
khai bao nguyn mu ham (function prototype).
kiu_ gia_tr_tra_v tn_ham(danh sach tham s va kiu cua chung);
Nu co gia tr tra v th ta s dung cu lnh return. Nu ham khng co gia tr tra v th
s dung t khoa void ch kiu cua gia tr tra v (khi o ham ging nh thu tuc cua Pascal).
Nu khng dung void th kiu ngm nh se la int. T khoa void con c dung ch cac
ham khng co tham s (do o khi goi ham se khng cn i s).
Chng VI : Ham, mang va con tro


Trang 53
Tn ham c t theo cac quy tc t tn cua bin.
Trong phn khai bao nguyn mu ham khng cn phai t tn cho tham s. Theo v du
trn ta co th vit : int tich(int, int);
I.4. Lnh return:
Lnh return dung tra lai gia tr cho ham. Lnh return co th tra lai gia tr cua biu
thc. Trong 1 ham co th co nhiu lnh return, tuy nhin ch lnh return c bt gp u tin
c thc hin.
V du :
int tuyet_doi(int x)
{ if (x>=0)
return(x);
else return(-x);
}
Nu kiu tra v la void (khng co gia tr tra v) th dung lnh return; hoc bo qua.
I.5. Hoat ng cua ham :
Khi gp mt li goi ham th may se ri ch o cua chng trnh va chuyn n ham
tng ng thc hin. Qua trnh o din ra theo 4 bc sau:
+ Cp phat b nh
+ Gan gia tr cua cac i s cho cac tham s tng ng
+ Thc hin cac lnh trong thn ham
+ Khi gp cu lnh return hoc } cui cu a thn ham th may se giai phong
vung nh va cp phat va thoat khoi ham.
I.6. Li goi ham :
Ham ch lam vic trn cac ban sao ma thi. Nu ham co gia tr tra v th ta co th s
dung ham nay nh mt biu thc bnh thng vi cac i s thch hp.
V du :
int lapphuong(int x);
main()
{ int m,x=5;
.....
m=lapphuong(x);
}
Nu ham khng co gia tr tra v hoc ta khng s dung gia tr tra v th ta goi ham vi
cac i s thch hp nh sau :
V du : ham printf() co gia tr tra v kiu int nhng ta mun bo qua gia tr tra v :
printf(.......);
Nu ta nh ngha cac ham trc ham main() th ham trc khng c goi ham sau.
Nu ta nh ngha cac ham sau ham main() th cac ham co th goi nhau c.

Chng VI : Ham, mang va con tro


Trang 54
I.7. Truyn i s cho ham :
Truyn i s cho ham tc la cung cp cac gia tr u vao thc s cho ham phu hp
vi kiu va trt t cua cac tham s a khai bao. i s co th la bin,hng,biu thc.
Vic truyn i s cho ham c thc hin theo mt kiu duy nht : truyn theo gia
tr: ham khng lam thay i gia tr cua cac bin dung lam i s v ham ch lam vic trn cac
ban sao cua cac i s ma thi.
V du :
#include <stdio.h>
#include <conio.h>
void hoanvi(int a,int b);
main()
{ int x=2;
int y=3;
printf(\nTruoc khi goi ham : x = %d , y = %d ,x,y);
hoanvi(x,y);
printf(\nSau khi goi ham : x = %d , y = %d ,x,y);
getch();
return 0;
}
void hoanvi(int a,int b)
{ int tam;
printf(\nTruoc khi hoan vi: a = %d , b = %d ,a,b);
tam=a;
a=b;
b=tam;
printf(\nSau khi hoan vi: a = %d , b = %d ,a,b);
}
Kt qua :
Truoc khi goi ham : x = 2 , y = 3
Truoc khi hoan vi : a = 2 , b = 3
Sau khi hoan vi : a = 3 , b = 2
Sau khi goi ham : x = 2 , y = 3
Nh vy ham hoanvi a hoan v 2 s x va y, nhng khi quay tr lai chng trnh chnh
th gia tr cua x va y vn khng thay i.
tranh iu nay ta co th s dung cach truyn a ch hoc s dung bin toan cuc,
nhng s dung bin toan cuc gp mt s vn nh b nh, gia tr cua no co th b thay i
moi ni trong chng trnh.
Chng trnh s dung cach truyn a ch :
#include <stdio.h>
#include <conio.h>
void hoanvi(int *px,int *py);
main()
Chng VI : Ham, mang va con tro


Trang 55
{ int x=2;
int y=3;
hoanvi(&x,&y);
printf(\nx=%d,y=%d,x,y);
getch();
return 0;
}
void hoanvi(int *px,int *py)
{ int tam;
tam=*px;
*px=*py;
*py=tam;
}
I.8. Pham vi bin:
Pham vi bin la kha nng truy xut bin o cac phn khac nhau trong chng trnh.
Cac bin ch c s dung k t v tr bin c khai bao tr xung.
Bin toan cuc : bin c khai bao ngoai cac ham (k ca ham main), c s
dung moi ni trong chng trnh. Trnh bin dch se t ng gan cho bin nay gia tr 0 nu
ta khng khi tao gia tr cho no.
Thc ra i vi chng trnh trai trn nhiu tp tin, s dung cac bin toan cuc trong
cac modul khac ta phai s dung t khoa extern. Khi o trnh bin dch khng cp phat nh
nao cho bin o, lnh nay ch nhm muc ch bao rng bin o c khai bao u o trong
chng trnh (trong modul nao o cua chng trnh).
Bin a phng : bin c khai bao bn trong ham va ch s dung bn trong ham
trong thi gian ham o hoat ng (ham c goi). Nu bin a phng trung tn vi bin
toan cuc th trong pham vi ham o, bin toan cuc khng co tac dung.
Cac bin toan cuc co th c thay i trong bt k ham nao, y cung chnh la nhc
im cua chung: ta kho kim soat hn, nht la trong chng trnh ln. V vy cn han ch s
dung bin toan cuc khi no khng cn thit cho hu ht cac ham. Ta thng dung bin toan cuc
giai quyt vic phai truyn cac bin o cho nhiu ham khac nhau.
V du :
int x;
main()
{
int y;
......
}
int z;
ham1()
{ .......
}
Chng VI : Ham, mang va con tro


Trang 56
ham2()
{.......
}
bin z co tac dung i vi ham1 va ham2, bin x co tac dung i vi ca 3 ham, bin y
ch co tac dung i vi ham main().
Cac bin cuc b trong khi lnh:
Ta co th khai bao cac bin ngay u khi lnh, cac bin nay la bin cuc b.
Khi may bt u lam vic vi 1 khi lnh th cac bin va cac mang khai bao bn trong
khi lnh o mi c hnh thanh va c cp phat b nh. Cac bin nay ch tn tai trong thi
gian may lam vic vi kh i lnh va chung se c giai phong khi kt thuc khi lnh. V vy :
Gia tr cua bin hoc mang khai bao bn trong khi lnh khng th a ra s dung
bn ngoai khi lnh o.
ngoai khi lnh khng th can thip cac bin va mang khai bao trong khi lnh.
trong khi lnh co th s dung bin khai bao ngoai khi lnh nu bin o khng
trung tn vi cac bin khai bao trong khi lnh.
I.9. Cp phat b nh :
Bin toan cuc c cp phat b nh tnh nn goi la bin tnh va cp phat tnh.
Bin a phng co cac loai :
Cp phat ng : khi kt thuc ham bin c giai phong, khng lu kt qua cho ln sau.
Cp phat tnh : khi kt thuc ham khng giai phong bin, lu kt qua cho ln sau ( du ng
t khoa static trc dong khai bao) .
Cac bin a phng c ngm nh la cp phat ng. Nu thch, ta co th thm vao
t khoa auto vao u dong khai bao : auto int x; Cac bin auto c cp phat stack.
V du : s khac nhau gia bin cp phat ng va bin cp phat tnh.
#include <stdio.h>
#include <conio.h>
void ham(void);
main()
{ int dem;
for(dem=0;dem<=3;dem++)
{ printf(\nLan goi thu %d,dem);
ham();
}
getch();
return 0;
}
void ham(void)
{ static int x; // co th thay bng static int x=0;
int y=0;
printf( x = %d , y = %d ,x++,y++);
}
Chng VI : Ham, mang va con tro


Trang 57
Kt qua :
Lan goi thu 0 : x = 0 , y = 0
Lan goi thu 1 : x = 1 , y = 0
Lan goi thu 2 : x = 2 , y = 0
Lan goi thu 3 : x = 3 , y = 0
Cu lnh static int x; ch c thc hin khi bin dch, khi ham() c goi ln u tin
no cung khng c thc hin. Cu lnh int y=0 lun c thc hin mi khi goi ham.
Va theo v du trn ta thy cac bin a phng tnh c khi tao gia tr u bng 0 khi
dung ln u (nu ta khng khi tao).

Nu chng trnh c vit trn nhiu file va bin a c khai bao ngoai cac ham
nh sau: static int a; th bin a ch c bit n trong modul hin tai, khng c bit n
trong cac modul khac.
Bin a phng thanh ghi : register int x;
Dung yu cu trnh bin dch nu co th th t bin o vao thanh ghi thay v t
vao mt nh thng thng. Khi o ta co th truy xut n bin nay rt nhanh chong. Ta
thng s dung cach khai bao nay vi cac bin m cua vong lp. Nu trnh bin dch khng
th cp phat register th bin o la auto.
T khoa register khng c dung vi cac bin tnh hay bin ngoai. Ta khng th nh
ngha mt con tro ti bin thanh ghi.
I.10. qui :
qui la mt ham goi lai chnh no.
V du : n! = 1.2.3.....(n-1).n
hay

>
=
=
0 n nu
0 n nu
n n
n
)!. 1 (
1
!
#include <stdio.h>
#include <conio.h>
long giaithua(int n);
void main()
{
int n;
printf(\nNhap n:);scanf(%d,&n);
printf(%d!=%ld,n,giaithua(n));
getch();
}
long giaithua(int n)
{
if (n==0) return 1;
else return(giaithua(n-1)*n);
}

Chng VI : Ham, mang va con tro


Trang 58
V du : Tnh c s chung ln nht cua 2 s :
#include <stdio.h>
#include <conio.h>
int uscln(int x,int y)
{
if (y==0) return x;
else return uscln(y,x%y);
}
main()
{
int x,y;
do
{ printf("\nNhap 2 so nguyen duong :");
scanf("%d%d",&x,&y);
}
while ((x<=0)||(y<=0));
printf("\nx=%d\ny=%d",x,y);
printf("\nUSCLN=%d",uscln(x,y));
getch();
return 0;
}
Tuy nhin, ta cn han ch s dung qui n mc ti a do s dung nhiu b nh d
dn n tran ngn xp. Mt khac, thi gian thc hin chng trnh dung quy cung ln hn.
Nu co th ta nn s dung cac vong lp thay th. Tuy nhin co nhng bai toan ch co th
giai quyt bng qui.
V du : ta nh ngha lai ham giaithua():
long giaithua(int n)
{
long i=1,k=1;
while (i<=n) k=k*i++;
return k;
}
Bai tp : tm USCLN khng cn dung qui
I.11. Macro:
Macro la mt tp hp lnh va biu thc c ai din bng mt tn goi la tn_macro.
B tin x l khi gp cac tn_macro se thay th no bng tp lnh tng ng. Nu gp
tn_macro trong cac xu k t th b tin x l se khng thay th.
Mu : #define tn_macro day_vn_ban
V du : #define cube(y) ((y)*(y)*(y))
Khng c vit #define cube (y) ((y)*(y)*(y))

Chng VI : Ham, mang va con tro


Trang 59
z=cube(x); se c thay th bng
z=((x)*(x)*(x));
Ta phai vit mi toan hang trong ngoc n, nu khng khi thay th se sai:
V du : #define cube(y) (y*y*y)
z=cube(x+y); se c thay th bng :
z=(x+y*x+y*x+y); (kt qua khng mong mun)
Ngay ca khi ta dung #define cube(y) ((y)*(y)*(y))
Kt qua cung sai khi : x=cube(++y) -> x=((++y)*(++y)*(++y))=(y+3)
3
x=cube(y++) -> x=y
3
, y=y+3
V du : #define tong(x,y) ((x)+(y))
z=tong(x,y);
So vi vic s dung ham, chng trnh s dung macro se co oan ma dai hn, chay
nhanh hn do khng mt thu tuc goi ham. Tuy nhin macro khng co quy, khng co tnh
modul va macro co nhiu hiu ng xu.

#define Do(var,begin,end) for(var=begin;var<=end;var++)
Do(i,1,10) -> for(i=1;i<=10;i++) : ung
Do(*ptr,1,10) -> for(*ptr=1;*ptr<=10;*ptr++) : sai v
*ptr++ : ++ trc, * sau : khng ging mong mun cua ta
Macro lng nhau:
#define ONE 1
#define TWO (ONE + ONE)
#define THREE (ONE + TWO)
result = TWO * THREE;
Ta se co: result = (1 + 1) * (1 + (1 + 1));
I.12. Mt s ham va macro thng dung trong stdlib.h va time.h:
Macro random(n) cho mt s nguyn ngu nhin trong khoang t 0 n (n-1)
Ham rand() cho s nguyn ngu nhin trong khoang t 0 n 32767
Macro randomize() khi ng b tao s ngu nhin cn c goi n khi mun s
dung random() va rand()
V du :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
void main()
{
int i;
printf(\nChon mot so tu 0 den 99: );
scanf(%d,&i);
randomize();
Chng VI : Ham, mang va con tro


Trang 60
if(i==random(100))
printf(\nBan da trung doc dac!!!);
getch();
}
II. Mang:
Mt mang d liu gm mt s hu han cac phn t cung kiu. S lng cac phn t
cua mang c xac nh khi khai bao.
Mi phn t cua mang c truy cp trc tip qua tn mang va ch s v tr t gia
cp ngoc vung []. Cac phn t cua mang c anh ch s v tr t 0 tr i. Khi ch s vt
ra ngoai kch thc cua mang, C vn khng bao li nhng se truy cp n vung nh bn ngoai
va co th lam hong chng trnh.
II.1. Khai bao mang :
Mu : kiu_d_liu tn_mang[kch_thc_cua_mang];
V du : int mang[10];
char ten[20];
float day[100];
Cac phn t c phn bit nh ch s : t 0 n kch_thc_cua_mang - 1.
V du : #define MAX 10
int mang[MAX];
tng ng vi int mang[10];
V du sai : const int MAX=10;
int mang[MAX];
II.2. Khai bao xu k t :
Trong C, mt mang k t c goi la mt xu k t
V du : 3 v du sau tng ng nhau :
char text[5]={a,b,c,d,\0};
char text[5]=abcd;
char text[]=abcd;
Xu k t trong C c kt thuc bi k t NULL (\0).
II.3. Khi tao gia tr mang :
Ta co th khi tao mang ngay sau khi khai bao :
V du : int x[3]={5,6,7};
Tc la : x[0]=5, x[1]=6, x[2]=7.
N u ta khng khi tao toan b mang th phn con lai cua mang se t ng c t v
0 (i vi mang nguyn va thc) va v NULL (i vi mang k t)
V du : int a[10]={1,2,3};
Khi o : a[0]=1, a[1]=2, a[2]=3, t a[3] n a[9] nhn gia tr 0
int d[]={2,5,9,7}; // d[0]=2, d[1]=5, d[2]=9, d[3]=7
Chng VI : Ham, mang va con tro


Trang 61
Cac phn t cua mang c truy cp bnh thng thng qua ch s cua phn t o .
truy cp n phn t th i cua mang M ta dung cu phap nh sau : M[i]
Chng trnh khng kim tra liu ta co truy cp ra ngoai mang hay khng.
V du : Nhp va hin th cac gia tr cua mang t ban phm :
#include <stdio.h>
#define n 5
void main()
{
int i,mang[n];
for(i=0;i<n;i++)
{
printf(\nx[%d]=,i);
scanf(%d,&mang[i]);
}
printf(\nMang gom cac phan tu :\n);
for(i=0;i<n;i++)
printf(\nx[%d]=%d,i,mang[i]);
}
II.4. Tm kim va sp xp :
Tm kim:
Ln lt duyt qua cac phn t cua mang n khi tm c gia tr mong mun.
V du : tm xem trong xu k t co bao nhiu k t a :
int timkiem( char mang[], char a)
{ int i,count=0;
for(i=0;mang[i] != \0;i++)
{ if(mang[i]==a)
count++;
}
return count;
}
Ngoai ra con co phng phap tm kim kiu lnh gac:
V du : Tm xem trong mang a gm n phn t nguyn co s nguyn d khng.
Ta khai bao mang a gm n+1 phn t, t a[n]=d.
i=0;
while (a[i] != d)
i++;
if(i==n)
printf(\n Mang a khng co phn t %d ,d);
else printf(\n Phn t %d v tr %d,d,i);
Trong trng hp xu nht, phng phap trc so sanh 2*n ln trong khi phng phap
sau so sanh nhiu nht n+1 ln.
Chng VI : Ham, mang va con tro


Trang 62
Sp xp :
Thay i v tr cua cac phn t trong mang chung tun theo mt trt t nao o.
Phng phap sp xp ni bot:
Sp xp theo th t tng dn: u tin em phn t th nht ln lt so sanh vi cac
phn t tip theo, nu no ln hn th i ch 2 phn t c so sanh. Sau lt u, phn t th
nht gi gia tr nho nht. Tip tuc vong hai, em phn t th 2 so sanh vi cac phn t sau
no.....
V du : Sp xp cac phn t cua mang t nho n ln
#include <stdio.h>
#include <conio.h>
#define n 5
void main()
{
int i,j,mang[n],tam;
for(i=0;i<n;i++)
{
printf(\nx[%d]=,i);
scanf(%d,&mang[i]);
}
printf(\nMang chua sap xep:\n);
for(i=0;i<n;i++)
printf( x[%d]=%3d,i,mang[i]);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if (mang[i]>mang[j])
{
tam=mang[i];
mang[i]=mang[j];
mang[j]=tam;
}
printf(\nMang da sap xep:\n);
for(i=0;i<n;i++)
printf( x[%d]=%3d,i,mang[i]);
getch();
}
II.5. Mang nhiu chiu :
Mang 2 chiu la loai mang quen thuc nht : ma trn.
Mu : kiu_mang tn_mang[s_hang][s_ct];
V du : int x[5][7]; // khai bao nay cho ta mt mang s nguyn 5 hang 7 ct.
Cac phn t cung c anh cac ch s hang va ct t 0.

Chng VI : Ham, mang va con tro


Trang 63
Vic gan cac gia tr vao cac phn t cua mang cung nh mang mt chiu:
x[3][4]=6;
Khi tao mang 2 chiu :
int x[5][3]= { { 1,2,3 },
{ 2,3,4 },
......
};
Ta co th tao ra cac mang 3 chiu, 4 chiu,...... :
int x[5][3][7];
int y[5][6][8][3];
truy cp n phn t co ch s (i,j) cua ma trn M ta dung M[i][j].
V du : chng trnh nhn hai ma trn A
m*n
va B
n*p
:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 10
main()
{
int i,j,k,m,n,p;
int a[MAX][MAX],b[MAX][MAX],c[MAX][MAX];
printf("\nNhap vao 3 so m,n,p:");
scanf("%d%d%d",&m,&n,&p);
printf("\n");
randomize();
for (i=0;i<m;i++)
for (j=0;j<n;j++)
a[i][j]=random(100);
for (i=0;i<n;i++)
for (j=0;j<p;j++)
b[i][j]=random(100);
for (i=0;i<m;i++)
for (j=0;j<p;j++)
{ c[i][j]=0;
for (k=0;k<n;k++)
c[i][j]=c[i][j]+a[i][k]*b[k][j];
}
for (i=0;i<m;i++)
{ for (j=0;j<n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
Chng VI : Ham, mang va con tro


Trang 64
printf("\n\n");
for (i=0;i<n;i++)
{ for (j=0;j<p;j++)
printf("%4d",b[i][j]);
printf("\n");
}
printf("\n\n");
for (i=0;i<m;i++)
{ for (j=0;j<p;j++)
printf("%6d",c[i][j]);
printf("\n");
}
getch();
return 0;
}
Trong chng trnh trn, ta khng s dung ham v i vi mang nhiu chiu, ta khng
truyn nh mang mt chiu c. co th s dung ham, ta phai dung con tro.
III. Con tro:
III.1. Khai nim con tro :
Khi ta khai bao mt bin trong C, trnh bin dch se danh ring 1 nh vi a ch duy
nht lu bin o.
V du : int b=5;

Con tro la bin dung cha a ch cua 1 bin khac. Nu con tro p cha a ch cua
bin b th ta noi : con tro p ang tro ti bin b.
Co nhiu kiu bin nn co nhiu kiu con tro tng ng.
III.2. Con tro va bin n :
Khai bao con tro : kiu_d_liu *tn_con_tro
V du : int *p,b; // p la con tro dung tro ti bin kiu nguyn
// b la bin nguyn
Ta co th vit khai bao int* p; . Tuy nhin, khi vit int* p,b; ta se d nhm ln khi
cho r ng p va b la 2 bin con tro. Thc ra, p la bin con tro, b la bin int thng.
Khi tao con tro : tn_con_tro=&tn_bin
trong o & la toan t ly a ch
V du : p=&b; // con tro p tro n bin b
Hoc int *p=&b; // va khai bao con tro va khi tao con tro
5
b
F0F4
Ta noi bin b co ni dung
la 5, co a ch la F0F4
Chng VI : Ham, mang va con tro


Trang 65
S dung con tro :
*p la bin ma p tro ti ( tc la bin b)
V vy *p va b u ch ni dung cua bin b
p va &b u ch a ch cua bin b
V du : printf(%d,b); tng ng vi lnh printf(%d,*p);
b=5; tng ng vi lnh *p=5;
V du :
#include <stdio.h>
int x,y,*px,*py;
void main()
{ px=&x;py=&y;
printf(Nhap x:);scanf(%d,px);
printf(Nhap y:);scanf(%d,py);
}
V du sai :
#include <stdio.h>
void main()
{ int b,*p;
b=10;
*p=20;
}
y con tro p cha c khi tao, no co th tro n 1 ni nao o. Lnh *p=20 co th
lam hong chng trnh. V vy trc khi dung con tro, nu cha cho bit no tro n u th ta
dung lnh p=NULL hoc int *p=0; // p khng tro n u ca.
V du kim nh cac gia tr cua con tro :
#include <stdio.h>
#include <conio.h>
void main()
{
int number=10;
int *pointer=&number;
printf(\nGia tri cua number : %d,number);
printf(\nDia chi cua number : %p,&number);
printf(\nGia tri cua con tro pointer : %p,pointer);
printf(\nGia tri duoc tro toi boi con tro pointer : %d,*pointer);
printf(\nDia chi cua con tro pointer : %p,&pointer);
getch();
}
%p : dung in ra gia tr cua con tro (pointer value).
Cac v du trn ro rang ta co th s dung trc tip bin ma khng cn n con tro. Tuy
nhin cac v du sau se cho thy li ch cua con tro.

Chng VI : Ham, mang va con tro


Trang 66
V du :
#include <stdio.h>
void hoanvi(int *px,int *py)
{ int tam;
tam=*px;
*px=*py;
*py=tam;
}
void main()
{ int x=2;
int y=3;
hoanvi(&x,&y);
printf(\nx=%d,y=%d,x,y);
}
Do ta ch co th truyn gia tr cho ham nn ta phai s dung con tro. Con tro px tro n
bin x, py tro n bin y nn khi ta hoan v *px va *py th x va y se hoan v gia tr cho nhau.
V du :
#include <stdio.h>
#include <conio.h>
void ham(int x,int y,int *sum,int *product)
{
*sum=x+y;
*product=x*y;
}
main()
{
int x=2,y=3,tong,tich;
ham(x,y,&tong,&tich);
printf("\n x=%d",x);
printf("\n y=%d",y);
printf("\n tong=%d",tong);
printf("\n tich=%d",tich);
getch();
return 0;
}

Qua v du trn ta thy rng cac gia tr u vao th ta khai bao bin bnh thng, cac gia
tr u ra th ta s dung con tro v ta cn phai thay i gia tr cua chung.
V du : ham printf dung bin thng, ham scanf dung bin con tro.
Tng t nh trn ta co th vit ham giai phng trnh bc 2, gia tr tra v tuy theo
vic phng trnh co nghim hay khng, gia tr u ra la cac nghim (nu co).

Chng VI : Ham, mang va con tro


Trang 67
#include <stdio.h>
#include <math.h>
int ptb2(float, float, float, float *, float *);
void main()
{ float a,b,c,x1,x2;
int tam;
clrscr();
printf("Nhap gia tri a,b,c:");
scanf("%f %f %f", &a, &b, &c);
tam=ptb2(a,b,c,&x1,&x2);
switch(tam)
{ case 0 : printf("\nPhuong trinh vo nghiem");
break;
case 1 : printf("\nPhuong trinh co 1 nghiem : %f",x1);
break;
case 2 : printf("\nPhuong trinh co 2 nghiem : \n x1= %f \n x2= %f",x1,x2);
break;
case 3 : printf("\nPhuong trinh vo so nghiem");
}
}
int ptb2(float a, float b, float c, float *nghiem1, float *nghiem2)
{ float delta;
if(a==0)
if(b==0)
if(c==0) return 3;
else return 0;
else { *nghiem1=-c/b;
return 1;
}
else { delta=b*b-4*a*c;
if (delta<0.0)
return 0;
else if (delta==0.0)
{ *nghiem1=-b/(2*a);
return 1;
}
else { *nghiem1=(-b+sqrt(delta))/(2*a);
*nghiem2=(-b-sqrt(delta))/(2*a);
return 2;
}
}
}
Chng VI : Ham, mang va con tro


Trang 68

const int *p; : con tro n 1 bin nguyn hng : khng th thay i gia tr cua bin o.
int* const p; : con tro hng n 1 bin nguyn : khng th gan con tro n bin khac.
const int* const p; : con tro hng n 1 bin nguyn hng.
III.3. Con tro va cac kiu bin :
trn ta a bo qua vn cac bin co kiu khac nhau se chim lng b nh khac
nhau: bin kiu nguyn chim 2 byte, bin kiu s float chim 4 byte,......
a ch cua bin la a ch byte thp nht cua bin o.
III.4. Con tro va mang:
Tn mang khng co cp ngoc vung la hng con tro. y la con tro khng th thay
i gia tr c, no lun tro n phn t u tin cua mang.
Khi ta khai bao 1 mang, cac phn t cua mang c sp xp tun t nhau, phn t u
tin co a ch thp nht.

S hoc con tro: phep tng / giam con tro lam cho gia tr cua no tng / giam mt lng
bng s byte nh ma bin c no tro ti chim trong b nh. T o, nu ta khai bao mang a
co 10 phn t th : a=&a[0]; a+1 = &a[1]; ... a+i = &a[i] vi i t 0 n 9.
V du : p=a; khi o truy cp a[i] ta co th dung *(p+i) hoc p[i] hoc a[i].
Khi tng / giam con tro p th p se tro n phn t sau / trc so vi phn t ban u.
Nu ptr1 va ptr2 la 2 con tro tro n 2 phn t cua cung 1 mang th hiu ptr1 - ptr2 cho
ta bit khoang cach gia 2 phn t o trong mang. Phep tr gia 2 con tro ch co y ngha khi 2
con tro cung tro n 2 phn t trong mt mang.

Ngoai vic truy cp phn t mang bng ch s, vic truy cp gian tip qua con tro th
chng trnh chay nhanh hn.
V du sai : Xut cac phn t cua mt bin mang
int a[10],i;
for(i=0; i<10; i++)
{ printf(%d \n, *a);
a++;
}

V du: Xut cac phn t cua mt bin mang
int a[10],i,*p;
p=a; //p=&a[0]
for(i=0; i<10; i++)
{ printf(%d \n, *p);
p++;
}
Chng VI : Ham, mang va con tro


Trang 69
Khi dung bin con tro p duyt cac phn t cua mang, chung ta co th tm ch s i
thng qua biu thc i = p - a ;

Truyn mang mt chiu cho ham :
i s co kiu d liu bt k nhng phai la gia tr n, v vy truyn ca 1 mang cho
ham ta phai s dung con tro. Khi o ta co th thay i gia tr cua ma ng bn trong ham va khi
thoat ra khoi ham, gia tr cua mang co th thay i so vi luc goi ham (khac vi truyn bin
n cho ham).
#include <stdio.h>
int mang[10],i;
int lonnhat(int x[]);
main()
{ for(i=0;i<10;i++)
mang[i]=i;
prnt(\n So lon nhat = %d ,lonnhat(mang));
return 0;
}
int lonnhat(int x[]) // int lonnhat(int *x)
{ int j,ln;
ln=*x; // ln=x[0];
for(j=0;j<10;j++)
if( *(x+j) > ln ) // if ( x[j] > ln )
ln=*(x+j); // ln=x[j];
return ln;
}

Khi ta truyn mang cho ham nhng khng mun thay i gia tr cua mang th ta khai
bao u mang vi t khoa const.
V du : Nhp mt mang cac s nguyn va sp xp mang theo th t tng dn.
#include <stdio.h>
#include <conio.h>
#define N 20;
viod nhap(int *), sapxep(int *), xuat(const int *);
void main()
{
int a[N];
nhap(a); xuat(a); sapxep(a); xuat(a);
}
void nhap(int *x)
{
clrscr();
for(char i=0; i<N; i++) {
Chng VI : Ham, mang va con tro


Trang 70
printf(x[%d]=,i);
scanf(%d,&x[i]);
}
}
void sapxep(int *x)
{ char i, j;
int tam;
for(i=0; i<N-1; i++)
for(j=0; j<N; j++)
if (x[i]>x[j]) { tam=x[i];
x[i]=a[j];
x[j]=tam;
}
}
void xuat(const int *x)
{ clrscr();
for(int i=0; i<N; i++)
printf(\n x[%d]=%d, i, x[i]);
getch();
}
III.5. Con tro va xu k t :
V du :
char *pst,st[50]; // pst la con tro kiu char, st[50] la mang kiu char
pst=thu;
gets(st);
printf(%s %s,pst,st); la ung.
y con tro pst se co gia tr la a ch u cua mang ang cha xu k t thu. V
vy 2 cu lnh sau : puts(thu) va puts(pst) la tng ng.
Nu ta vit
st=thu;
gets(pst); th sai.
st la hng con tro cua mang st (cu th la st[0]) nn ta khng th gan hng a ch cho
hng con tro c. pst la con tro, khi no cha c khi tao th khng nn gan gia tr cho no.
Nu trc o ta gan pst=st;
Th gets(pst); la ung, lnh nay tng ng gets(st).
Cac ham thao tac trn xu k t : cac ham nay nm trong tp tin string.h
V du : char s1[80]=Cng ngh;
char s2[80]=Thng tin;
Ham xac nh dai xu : int strlen(char *str);
dai xu bng s k t co ngha trong xu tnh t u n k t \0.
V du : strlen(s1)=9.
Chng VI : Ham, mang va con tro


Trang 71
Ham ghep xu k t : char *strcat(char *str1,char *str2);
Copy ni dung xu str2 vao ui xu str1, kt qua c lu tr lai trong str1.
V du : strcat(s1,s2); s1 se la Cong ngheThong tin, s2 khng i.
Ta cn chu y xem xu str1 co u ch cha ca 2 xu khng.
Ham copy xu k t : char *strcpy(char *str1,char *str2);
Copy ni dung xu str2 vao xu str1.
V du : strcpy(s1,s2); s1 se la Thong tin, s2 khng i.
Ta khng th vit s1=s2 v tn mang la hng a ch, khng th gan c.
Trc khi dung ham nay cn cp phat b nh cho chui ch.
Ham copy xu k t : char *strdup(const char *s);
Nh ham strcpy() nhung no t ng cp phat b nh cho chui ch
Ham tm kim k t c trong xu k t str : strchr(str,c)
Ham tm kim xu k t str2 trong xu k t str1 : strstr(str1,str2)
Ham xac nh k t alphabet : isalpha(c)
Ham xac nh k t thng va k t in : islower(c) va isupper(c)
Ham xac nh k t ch s : isdigit()
Ham xac nh k t iu khin : iscntrl()
Ham xac nh k t \n , \t, blank : isspace()
Ham so sanh xu k t : int strcmp(char *str1,char *str2);
Ham tra v gia tr :
0 nu str1=str2
>0 nu str1>str2
<0 nu str1<str2
Ham so sanh nh sau :
- So sanh tng cp k t cua 2 xu theo gia tr cua chung trong bang ma ASCII
- Hai xu co dai khac nhau, ging nhau n k t cui cung cua xu ngn th
xu dai ln hn.
- Hai xu trung nhau ca ni dung ln dai th bng nhau.
Mt s ham so sanh khac :
- strcmpi(str1,str2) : so sanh khng phn bit ch hoa, ch thng.
- strncmp(str1,str2,n) : so sanh n k t u.
- strnicmp(str1,str2,n) : so sanh n k t u khng phn bit ch hoa, ch thng.
Cac ham chuyn i :
- int atoi(str): chuyn i xu str thanh s nguyn int.
- long atol(str): chuyn i xu str thanh s nguyn long.
- float atof(str): chuyn i xu str thanh s thc float.
- itoa(int value,char *string,int radix): chuyn i s nguyn c s radix thanh xu
- ltoa(long value, char *string, int radix): chuyn i s nguyn value c s radix
thanh xu
- ultoa(unsigned long value,char *string,int radix): chuyn i s nguyn value
khng du c s radix thanh xu
trong o c s radix thuc [2,36].
Chng VI : Ham, mang va con tro


Trang 72
- char *ecvt(double value, int ndig, int *dec, int *sign) : chuyn s thc thanh xu
- char *fcvt(double value, int ndig, int *dec, int *sign) : chuyn s thc thanh xu
III.6. Con tro va mang nhiu chiu:
Ta lu y rng trong mt s trng hp, phep toan ly a ch vi mang nhiu chiu
(&a[i][j]) la khng hp l. Trong trng hp cac phn t cua mang co kiu d liu int th ta co
th s dung phe p toan ly a ch cho no : &a[i][j]

V du :
#include <stdio.h>
void main()
{
float a[4][6];
int i,j;
for (i=0;i<4;i++)
for (j=0;j<6;j++)
scanf(%f,&a[i][j]);
}
Khi chay chng trnh trn may se bao li. Ta co th dung cu lnh scanf bng cach s
dung bin trung gian:
#include <stdio.h>
void main()
{
float tam,a[4][6];
int i,j;
for (i=0;i<4;i++)
for (j=0;j<6;j++)
{
scanf(%f,&x);
a[i][j]=x;
}
}
Cac phn t trong mang 2 chiu c sp xp nh sau : cac phn t cua hang u tin,
sau o n cac phn t hang k tip,...... Nh vy ta co:
int *pa,a[4][6];
pa=(int *)a; // phep ep kiu
th pa tro ti a[0][0]
pa + 1 tro ti a[0][1]
pa + 2 tro ti a[0][2]
........
pa + i*6 + j tro ti a[i][[j]

Chng VI : Ham, mang va con tro


Trang 73
a[0] cha a ch cua hang u
a[1] cha a ch cua hang th hai
......
a[3] cha a ch cua hang th bn
Nu ta gan trc tip pa=a th C se canh bao (warning) v pa la con tro kiu int con a la
con tro kiu int[6].
V du :
#include <stdio.h>
#include <conio.h>
void main()
{
int i,j;
int *pa,a[4][6];
pa=(int *)a;
printf(\nNhap vao cac phan tu cua mang:);
clrscr();
for (i=0;i<4;i++)
for (j=0;j<6;j++)
{ gotoxy(10*j+3,i+3);
printf(a[%d][%d]=,i,j);
scanf(%d,pa+i*6+j);
}
/* hien thi*/
printf(\n\n);
for (i=0;i<4;i++)
{ for (j=0;j<6;j++)
{ printf(a[%d][%d]=%4d, i, j, *(pa+i*6+j));
}
printf(\n);
}
getch();
}
Truy n i s la mang nhiu chiu cho ham :
float a[4][5];
truyn mang cho ham ta co 2 cach :
Cach 1 : Khai bao theo mt trong hai mu sau :
float (* pa)[5]; /* Dung khai bao con tro kiu float[5] */
float pa[][5];
Trong thn ham, truy cp phn t a[i][j] ta dung pa[i][j].
Vi cach nay, ta ch dung vi mang 2 chiu co s ct khng i ( y la 5)


Chng VI : Ham, mang va con tro


Trang 74
Cach 2 : dung 2 tham s :
float *pa; /* biu th a ch u cua mang */
int n; /* biu th s ct cua mang */
Vi cach nay ta a khc phuc c khuyt im cua cach 1 (s ct co th thay i).
Trong thn ham, truy cp phn t a[i][j] ta dung *(pa+ i*n + j).
V du : Nhp va hin th mang 2 chiu theo cach 1 :
#include <stdio.h>
void nhap(int a[][6],int m,int n);
void hienthi(int a[][6],int m,int n);
void main()
{
int m,n;
int a[10][6];
printf("\nNhap m,n:");
scanf("%d%d",&m,&n);
nhap(a,m,n);
printf("\n\n");
hienthi(a,m,n);
}
void nhap(int a[][6],int m,int n)
{
int i,j;
int x; /* bin trung gian */
clrscr();
printf("\nNhap vao cac phan tu cua mang:");
for (i=0;i<m;i++)
for (j=0;j<n;j++)
{ gotoxy(10*j+3,i+3);
printf("a[%d][%d]=",i,j);
scanf("%d",&x);
a[i][j]=x;
}
}
void hienthi(int a[][6],int m,int n)
{ int i,j;
printf("\nCac phan tu cua mang:\n");
for (i=0;i<m;i++)
{ for (j=0;j<n;j++)
printf(" a[%d][%d]=%4d", i, j,a[i][j]);
printf("\n");
}
}
Chng VI : Ham, mang va con tro


Trang 75

V du : Nhp va hin th mang 2 chiu theo cach 2 :
#include <stdio.h>
#include <conio.h>
#define N 5
void nhap(int *p,int m,int n);
void hienthi(int *p,int m,int n);
main()
{
int m,n;
int *pa,a[10][N];
pa=(int *)a;
printf("\nNhap m,n:");
scanf("%d%d",&m,&n);
nhap(pa,m,n);
printf("\n\n");
hienthi(pa,m,n);
getch();
return 0;
}
void nhap(int *p,int m,int n)
{
int i,j;
clrscr();
printf("\nNhap vao cac phan tu cua mang:");
for (i=0;i<m;i++)
for (j=0;j<n;j++)
{ gotoxy(10*j+3,i+3);
printf("a[%d][%d]=",i,j);
scanf("%d",p+i*N+j);
}
}
void hienthi(int *p,int m,int n)
{
int i,j;
printf("\nCac phan tu cua mang:\n");
for (i=0;i<m;i++)
{ for (j=0;j<n;j++)
printf(" a[%d][%d]=%4d", i, j, *(p+i*N+j));
printf("\n");
}
}
Chng VI : Ham, mang va con tro


Trang 76
Ta truyn mang 3,4 chiu cho mang theo cach tng t.
V du : mang 3 chiu a[m][n][p] ta dung 3 tham s :
float *pa;
int n,p;
pa=(float *)a;
Trong thn ham, truy cp phn t a[i][j][k] ta dung *(pa+ i*n*p + j*p + k).
III.7. Con tro va mang cac xu k t :
Mang xu k t c xem nh la mt mang 2 chiu cac k t.
V du : char x[5][20];
Khi o ta co 5 xu k t : x[0], x[1], .....x[4], mi xu cha nhiu nht 20 k t (k ca k
t NULL).
V du :
#include <stdio.h>
main()
{
char x[2][10];
puts(gets(x[0]));
puts(gets(x[1]));
return 0;
}

Mang con tro:
char *x[]= {
"Hop",
"Tac",
"Xa"
};
x la mang con tro tro ti cac xu k t.
x[0] cha a ch cua vung nh o cha xu Hop
x[1] cha a ch cua vung nh o cha xu Tac
x[2] cha a ch cua vung nh o cha xu Xa
x la hng con tro cha a ch cua x[0].

Ta thng dung mang con tro khi x ly cac xu k t.
III.8. Con tro kiu void:
Khai bao : void *tn_con_tro;
y la con tro c bit, co th nhn bt k a ch kiu nao.
V du : void *pa;
int a[5][6];
pa=a;
Chng VI : Ham, mang va con tro


Trang 77
Cac phep tng giam a ch, truy cp b nh va so sanh khng c dung vi con tro
kiu void.
Con tro kiu void thng c dung lam tham s nhn bt k a ch kiu nao t i
s . Trong thn ham phai s dung phep ep kiu.
V du : Nhp ma trn m*n va hin th ma trn chuyn v n*m
#include <stdio.h>
void nhap(int *a,int N,int m,int n);
void chuyenvi(void *a,void *b,int N,int m,int n);
void hienthi(int *a,int N,int m,int n);
void main()
{ int m,n; /* ma tran kich thuoc m*n */
int a[10][10],b[10][10];
printf("\nNhap m,n:");
scanf("%d%d",&m,&n);
nhap((int *)a,10,m,n); /* a la ma tran m*n */
printf("\n\n");
hienthi((int *)a,10,m,n);
chuyenvi(a,b,10,m,n); /* b la ma tran n*m */
hienthi((int *)b,10,n,m);
}
void nhap(int *a,int N,int m,int n)
{
int i,j;
clrscr();
printf("\nNhap vao cac phan tu cua mang:");
for (i=0;i<m;i++)
for (j=0;j<n;j++)
{ gotoxy(10*j+3,i+3);
printf("a[%d][%d]=",i,j);
scanf("%d",a+i*N+j);
}
}
void chuyenvi(void *a,void *b,int N,int m,int n)
{
int i,j;
int *pa,*pb;
pa=(int *)a;
pb=(int *)b;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
*(pb+j*N+i)=*(pa+i*N+j);
}
Chng VI : Ham, mang va con tro


Trang 78
void hienthi(int *a,int N,int m,int n)
{
int i,j;
printf("\nCac phan tu cua mang:\n");
for (i=0;i<m;i++)
{ for (j=0;j<n;j++)
printf(" a[%d][%d]=%4d", i, j,*(a+i*N+j));
printf("\n");
}
}
chng trnh trn, con tro kiu void nhn a ch cua ma trn a va b trong li goi
ham chuyenvi. Ta khng th s dung trc tip con tro void ma phai chuyn sang con tro kiu
int.
III.9. Cp phat b nh ng : <alloc.h>
Nu cp phat b nh ng, ta se s dung b nh hiu qua hn, cho nhiu muc ch
khac nhau. V du: cp phat b nh va u, khng lang ph b nh.
Ham malloc :
Mu : void *malloc(size_t size)
Cng dung : cp phat 1 khi nh size byte t b nh heap. Ham nay cho phep
chng trnh cp phat mt lng nh va u, chnh xac.
Gia tr tra v : Nu thanh cng, ham tra v con tro tro n khi nh va cp phat.
Nu li (khng u b nh) th tra v NULL.
V du :
#include <stdio.h>
#include <string.h>
#include <alloc.h>
#include <process.h>
void main()
{ char *str;
if ((str = (char *) malloc(10)) == NULL)
{ printf("\n Khong du bo nho de cap phat");
exit(1);
}
strcpy(str, "Hello");
str[0]=h;
printf("String is %s\n", str);
free(str); /* giai phong vung nh va cp phat */
}
i vi mang int, ta dung : if ((mang = (int *) malloc(10*sizeof(int))) == NULL) .....

Cp phat b nh dung cho mang 2 chiu m*n phn t :
Chng VI : Ham, mang va con tro


Trang 79

#include <stdio.h>
#include <alloc.h>
void main()
{ int **a , m, n, OK, i, j;
printf("\nNhap m = " );scanf("%d",&m);
printf("\nNhap n = " );scanf("%d",&n);
a=(int**)malloc(m*sizeof(int*));
if (a!=NULL ) /*Cap phat thanh cong */
{ OK = 1 ;
for(i=0;i<m;i++) /* gia tri ban dau cho bien con tro*/
a[i] = NULL;//(int*) ;
for(i=0;(i<m)&&OK;i++)
{ a[i]=(int*)malloc(n*sizeof(int));
if(a[i]==NULL)
OK = 0 ;
}
if(OK) //su dung a[0][0] , a[0][1]....., a[i][j] ...., a[m][n]
{ clrscr();
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{ gotoxy(10*j+3,i+3);
printf("a[%d][%d]=",i,j);
scanf("%d",&a[i][j]);
}
printf("\n\n");
for(i=0;i<m;i++)
{ for(j=0;j<n;j++)
printf("a[%d][%d]=%d",i,j,a[i][j]);
printf("\n");
}
}
}
/* giai phong vung nho cap phat */
if(a!=NULL)
{ for(i=0;i<m;i++)
if(a[i]!=NULL)
free(a[i]);
free(a);
}
}

Chng VI : Ham, mang va con tro


Trang 80
Khi xem ma ng 2 chi u la ma ng 1 chi u, ta co th khai ba o :
a = (int*) malloc ( m*n * size of ( int ));
va a[i][j] = a[ i*N + j]*/

#include <stdio.h>
#include <alloc.h>
#include <conio.h>
void main()
{ int *a , m, n, OK, i, j;
printf("\nNhap m = " );scanf("%d",&m);
printf("\nNhap n = " );scanf("%d",&n);
a=(int*)malloc(m*n*sizeof(int));
if (a!=NULL ) /*Cap phat thanh cong */
{ clrscr();
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{ gotoxy(10*j+3,i+3);
printf("a[%d][%d]=",i,j);
scanf("%d",a+i*n+j);
}
printf("\n\n");
for(i=0;i<m;i++)
{ for(j=0;j<n;j++)
printf("a[%d][%d]=%d",i,j,a[i*n+j]);
printf("\n");
}
free(a);
}
getch();
}
Ham calloc :
Mu : void *calloc(size_t nitems, size_t size);
Cng dung : cp phat mt khi nh kch thc nitems*size byte va xoa v 0.
cp phat khi nh ln hn 64K, dung farcalloc.
Gia tr tra v : Nu thanh cng, ham tra v con tro tro n khi nh va cp phat.
Nu li (khng u b nh) th tra v NULL.
V du :
#include <stdio.h>
#include <alloc.h>
#include <string.h>
int main()
{ char *str = NULL;
Chng VI : Ham, mang va con tro


Trang 81
str = (char *) calloc(10, sizeof(char));
strcpy(str, "Hello");
printf("String is %s\n", str);
free(str);
return 0;
}
im khac bit gia ham malloc va calloc: cac phn t do ham calloc lun c khi
tao bng 0, con ham malloc th khng chc chn.

Ham realloc :
Mu : void *realloc(void *block, size_t size);
Cng dung : iu chnh kch thc cua khi nh a cp phat block thanh size byte,
copy ni dung ti v tr mi nu cn thit. Khi nh block trc y a c cp phat nh cac
ham malloc, calloc hoc chnh ban thn ham realloc.
Gia tr tra v : Nu thanh cng, ham tra v a ch cua khi nh mi c cp phat
lai, a ch nay co th khac vi a ch ban u. Nu li (khng u b nh , cp phat lai khng
c) th tra v NULL.
Ham gi nguyn s liu t phn t u tin n phn t co ch s la min(new_size,
old_size) -1. Ham khng thit lp gia tr cho cac nh mi. Khi gia tr tra v la 0, khi nh cu
co th b mt gia tr.
realloc(NULL, 5 * sizeof(int)); tng ng malloc(5 * sizeof(int));
free(ptr); tng ng realloc(ptr,0);
V du:
#include <stdio.h>
#include <alloc.h>
#include <string.h>
void main(void)
{ char *str;
str = (char *) malloc(10);
strcpy(str, "Hello");
printf("String is %s\n Address is %p\n", str, str);
str = (char *) realloc(str, 20);
printf("String is %s\n New address is %p\n", str, str);
free(str);
}
Chu y: Ta nn kim tra gia tr tra v cua cac ham trn trc khi lam vic vi khi nh
va c cp phat. Cac ham malloc, calloc, realloc cp phat b nh heap.

III.10. Con tro tro ti ham:
Khi chng trnh c thc hin, cac lnh trong ham c nap vao b nh t mt a
ch xac nh. Con tro tro ti ham cha a ch bt u nay cua ham.
Chng VI : Ham, mang va con tro


Trang 82
Khai bao : kiu_d_liu (*con_tro)(danh sach tham s);
V du: int (*p1)(int a); // con tro tro n ham nhn 1 i s int va tra v kiu int
void (*p2)(char z); // con tro tro n ham nhn 1 i s char va khng co
gia tr tra v .
Ta cn phn bit vi khai bao sau:
int *ham(int a); // ham nhn 1 i s int va tra v con tro kiu int.
Khi tao: Con tro tro ti ham cn phai khi tao ch n 1 ham nao o, ham va con
tro phai co kiu tra v va danh sach tham s ging nhau.
V du : int binhphuong(int a);
int (*p)(int a);
p=binhphuong; // khi tao con tro p
S dung : Sau khi khai bao va khi tao nh trn ta co th goi ham binhphuong() bng
cach dung con tro p :
t = p(x);
Tn ham khng co du () la hng con tro tro ti ham o (tc la cha a ch bt u
cua ham o), v vy khi ta khi tao con tro (con tro tro ti ham) ta co th thao tac trn con tro
nh thao tac trn ham vy.
III.11. Chuyn i s cho ham main() :
main(int argc, char *argv[],char *env[])
Trong o :
bin argc (argument count) la s i s go vao t dong lnh.
bin argv (argument vector) la mang cac con tro tro ti cac i s trong dong lnh
*argv[0] la tn ng dn n chng trnh.
*argv[1] la i s th nht
*argv[2] la i s th hai.....
bin env la mang con tro. Mi con tro cha a ch cua mt bin mi trng, con tro
cui cung cha NULL.
V du : C:\>copy t1.dat t2.dat
argc=3
*argv[0] la C:\>copy.exe
*argv[1] la t1.dat
*argv[2] la t2.dat
argv[3] cha NULL

V du : chng trnh sp xp cac i s dong lnh theo th t tng dn :
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
main(int n,char *ds[])
{
int i,j,tam;
Chng VI : Ham, mang va con tro


Trang 83
int a[10];
if(n>1)
{ for(i=1;i<n;i++)
a[i]=atoi(ds[i]);
for(i=1;i<n-1;i++)
for(j=i+1;j<n;j++)
if (a[i]>a[j])
{
tam=a[i];
a[i]=a[j];
a[j]=tam;
}
printf(\nDanh sach cac tham so da sap xep:\n);
for(i=1;i<n;i++)
printf( a[%d]=%3d,i,a[i]);
}
getch();
return 0;
}
Ta lu tn cua chng trnh la sapxep.c. Sau o ta dch thanh file sapxep.exe
Khi ta chay : sapxep.exe 2 5 3 6 8 1 th se co kt qua:
Danh sach cac tham so da sap xep:
^^^a[1]= ^^1^^^a[2]=^^2^^^a[3]=^^3^^^a[4]=^^5^^^a[5]=^^6^^^a[6]=^^8
V du :
#include <stdio.h>
#include <conio.h>
main(int n,char *argv[],char *env[])
{
int i,j;
for(i=0;env[i]!=NULL;i++)
printf("\n %s",env[i]);
for(i=1;i<n;i++)
printf("\n argv[%d] : %s",i,argv[i]);
getch();
return 0;
}
Ta lu file va chay chng trnh ging nh v du trn.

IV. Bai tp :
1. S dung ham vit chng trnh tnh a
n
(a:thc, n nguyn dng) dung qui va khng
dung qui.
Chng VI : Ham, mang va con tro


Trang 84
2. Tnh phn t th n theo cng thc truy hi (dung qui va khng qui) :
a. phn t Fibonaci F
1
= F
2
= 1;
F
n
= F
n-1
+ F
n-2
vi n > 2.
b. cn bc hai cua x vi chnh xac =1e-6.
F
1
= 1; ; *
2
1
1
1
|
|

\
|
+ =

n
n n
F
a
F F

n
n
F x
+
= lim
.
3. Tnh C
k
n
theo 3 cach :

+
= =
=


+
=
=

n k 1 nu
n k hoc 0 k nu
n k 1 nu
0 k nu
1
1 1
1
1
.
*
1
1
.
)! ( !
!
.
k
n
k
n
k
n
k
n
k
n
k
n
C C
C c
C
k
k n C b
k n k
n
C a

4. Tm s nguyn t th n (dung mang lu cac s nguyn t).
5. S dung ham vit lai cac chng trnh trc y.
6. S dung ham vit chng trnh nhp, sp xp va hin th mang 1 chiu gm 10 s
nguyn. Nhp 1 s nguyn va kim tra xem s o co nm trong mang khng.
7. S dung ham vit chng trnh tnh tng cac s dng, tng bnh phng cua cac s m
trong mang 1 chiu.
8. Nhp mang 1 chiu, nhp s n va kim tra xem trong mang co chui con (gm n phn
t lin tip) tng hay khng.
9. Xy dng chui con (lin tip) tng dai nht t mang 1 chiu.
10. Kim tra s x co ln hn (nho hn) gia tr ln nht (nho nht) cua mang 1 chiu hay
khng.
11. Kim tra cac phn t cua mang 1 chiu co i mt phn bit hay khng.
12. Nhp vao 1 day s, kim tra xem day o co tng dn hay giam dn khng.
13. Tm phn t trong mang co gia tr gn s x nht.
14. Tm cac phn t x
i
sao cho tn tai cp phn t x
i
, x
k
thoa man : x
i
= x
j
+ x
k

15. Nhp m,n; xoa phn t th m va th n trong 1 mang 1 chiu.
16. Xoa cac phn t bng 0 trong mang 1 chiu.
17. u vao: s thang va nm nhun hay khng, u ra: s ngay trong thang o.
18. Nhp vao ngay thang nm (t nm 2001 n nm 2150). Kim tra tnh hp l.
19. Nhp ma trn, tm xem ct nao co nhiu s dng nht.
20. S dung ham vit chng trnh cng, nhn 2 ma trn
21. S dung ham vit chng trnh nhp, chuyn v va hin th ma trn.
22. Nhp ma trn vung n*n, cac phn t la cac s nguyn. Xut ra man hnh :
- Ma trn o co i xng qua ng cheo chnh khng ?
- Co 2 ct nao t l vi nhau khng, co 2 hang nao bng nhau hay khng
- Tnh tng cac phn t trn ng cheo phu.
Chng VI : Ham, mang va con tro


Trang 85
- Tnh tng cac phn t a[i][[j] ma i+j chia ht cho 5.
- Tm min, max trn tng hang, tng ct va toan b ma trn.
- Ma trn o sau khi i ct 3 va ct 4
23. Cho hai day s tng, vit chng trnh xy dng day tng t hai day o .
24. Tm ch sai trong oan chng trnh sau :
void main()
{ char str[]={H,e,l,l,o};
puts(str);
}
25. Tm li :
int i;
void ham1(int a);
void main()
{ int a=4;
for(i=0;i<10;i++)
ham1(a);
}
void ham1(int a)
{ for(i=0;i<5;i++)
printf(\na=%d,a);
}
26. m s ln xut hin cua cac k t trong xu k t .
27. Thay cac du tab trong xu k t bng cac khoang trng.
28. Thay th cac chui khoang trng bng 1 lng du tab va khoang trng t nht.
29. Tach t u tin va t cui cung cua chui.
30. m s t trong xu ( cac t ch cha cac k t alphabet, c ngn cach nhau bi
khoang trng, du tab).
31. Xu goi la palindrone nu no khng thay i khi ta ao ngc th t trong no (v du
madam). Kim tra xu co tnh cht palindrone khng.
32. Nhp vao 1 chui, xoa cac khoang trng va in ra man hnh.
33. Nhp vao 1 chui, sau o thay th cac khoang trng bng 1 khoang trng va in ra man
hnh.
34. ao ngc th t cac t trong chui.
V du : con cho con cn con meo con thanh con meo con cn con cho con.
V du : ng ai n thanh n ai ng
35. Nhp chui, i k t u mi t thanh ch hoa, cac t con lai cua t thanh ch thng.
36. Dung ham tnh :
D C B A Z * + + = ; C AB C B A BC A Z + + =
Chng VII : D liu kiu cu truc


Trang 86
Chng VII. DU LIU KIU CU TRUC
I. Kiu cu truc:
I.1. Khai bao va khi tao kiu bin cu truc :
Mang la tp hp gm cac phn t co cung kiu. Khi ta mun tao kiu d liu ma cac
phn t cua chung co kiu khac nhau nhng co s lin kt vi nhau, ta s dung kiu struct.
Mu : struct tn_kiu_cu_truc
{ khai bao cac thanh phn (cac trng)
};
V du : struct khach
{ char ten[20];
char diachi[100];
int tuoi;
int dienthoai;
};
Ta co mt kiu mi la kiu khach gm cac trng ten, diachi, tuoi va dienthoai.
Khai bao va khi tao bin :
struct khach khach_thu_1 = {Nguyen Van A,Da Nang,20,888888};
Ta cung co th khai bao bin cung luc vi kiu nh sau:
struct khach
{ char ten[20];
char diachi[100];
int tuoi;
int dienthoai;
} khach_thu_1, khach_thu_2;
Ta co th khai bao bin khng khai bao kiu:
struct
{ char ten[20];
char diachi[100];
int tuoi;
int dienthoai;
} khach_thu_1, khach_thu_2;
Khai bao kiu dung typedef:
typedef struct
{ char ten[20];
char diachi[100];
int tuoi;
int dienthoai;
} khach;
khi khai bao bin ta se khng dung t khoa struct:
Chng VII : D liu kiu cu truc


Trang 87
khach khach_thu_1, khach_thu_2;
nh ngha kiu cu truc lng nhau:
V du :
struct ngay
{ int ngaythu;
int thang;
int nam;
};
struct nhansu
{ char hoten[20];
struct ngay ngaysinh;
int gioitinh;
float hsluong;
}nguoi1;
I.2. Truy cp n cac phn t cua mt bin kiu cu truc :
Mu : tn_bin.tn_phn_t
V du : strcpy(khach_thu_1.ten,Tran Van B);
khach_thu_1.tuoi=40;
printf(Tuoi cua %s la %d, khach_thu_1.ten, khach_thu_1.tuoi);
Ta co th gan bin cu truc nay cho bin cu truc khac co cung kiu :
khach_thu_2= khach_thu_1;
Ta co th khi tao bin cu truc t luc khai bao nh khi tao mang:
khach khach_1={John,17 Le Duan, Da Nang,40,876543};
Vi cac cu truc lng nhau ta cung truy cp tng t.
V du : nguoi1.ngaysinh.nam
Ta co th s dung phep toan ly a ch i vi thanh phn cu truc
V du : scanf(%d,&khach_thu_1.tuoi);
Vi thanh phn cu truc khng nguyn, ta nhp thng qua bin trung gian.
I.3. Thanh phn kiu field:
Khi ta mun co c cac thanh phn nguyn gia tr nho, tit kim b nh th ta dung
kiu field. Cac phn t c nh ngha i dang cac bit co du hoc khng du. dai cua
mi trng khng vt qua 16 bit.
struct bit_field
{ int bit_1 : 1;
int bits_2_to_5 : 4;
int bit_6 : 1;
int bits_7_to_16 : 10;
} bit_var;
Ta khng th ly a ch thanh phn kiu field, khng th xy dng mang kiu field va
thanh phn kiu field khng th lam gia tr tra v.
Chng VII : D liu kiu cu truc


Trang 88
I.4. Con tro tro n kiu cu truc :
typedef struct
{ int x;
int y;
}diem;
diem diem1,diem2;
diem *pointer=&diem1;
Ta dung con tro truy cp n cac phn t cua cu truc :
tn_con_tro ->tn_thanh_phn
hoc (*tn_con_tro).tn_thanh_phn
toan t -> goi la toan t tro ti
V du : pointer->x=5; tng ng vi diem1.x
(*pointer).y=6; tng ng vi diem1.y
Tng t nh con tro bin thng, phep toan s hoc i vi con tro cu truc cung hoat
ng tng t.
I.5. Mang cu truc :
Ta khai bao toa bng cu truc :
typedef struct
{ int x;
int y;
}diem;
diem diem1,diem2;
lu tr toa cua 20 im ta dung mang :
diem taphop[20]= { {2,3},
{3,4}
};
Cung nh mang khac, mang cu truc cung c anh s th t t 0.
truy cp vao cac phn t cua mang :
taphop[3].x=4;
taphop[3].y=6;
Cung nh cac bin cu truc, ta co th gan cac phn t cua mang cho nhau va cho cac
bin cu truc n.
Chu y : thng khng c s dung phep toan ly a ch i vi cac thanh phn cua
mang cu truc.
cp phat b nh hiu qua, ta dung ham malloc:
diem *d;
int sodiem;
d=(diem *)malloc(sodiem*sizeof(diem));
I.6. Cu truc va ham :
Chuyn tng phn t cua bin cu truc hoc ca bin cu truc cho ham :
Chng VII : D liu kiu cu truc


Trang 89
ham1(diem1.x);
ham2(diem1.y);
Ta co th chuyn a ch cua tng phn t cho ham.
ham1(&diem1.x);
ham2(&diem1.y);

V du :
struct diem
{ int x;
int y;
} ;
void ham(struct diem d)
{
printf("\nd.x=%4d\nd.y=%4d",d.x,d.y);
}
void main()
{
struct diem diem1;
diem1.x=2;diem1.y=4;
ham(diem1);
}

thay i gia tr cua cu truc ta truyn con tro c u truc.
Gia tr tra v cua ham co th la cu truc hoc con tro cu truc.

V du:
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
typedef struct
{ char ten[30] ;
int diem ;
char kq[5] ;
} kieuHV;
kieuHV *lop , *p , tam ;
/* Ham nhap danh sach */
void nhapds ( int n , kieuHV lop[ ])
{ int i , diem ;
p = lop ;
for ( i = 0 ; i < n ; i++)
{ printf("\nNhap Ho ten nguoi thu %d : " , i + 1 ) ; gets ( p->ten);
printf ( " diem = " ) ; scanf ( "%d" , &diem ) ; p->diem = diem ;
Chng VII : D liu kiu cu truc


Trang 90
printf ("%c", getchar()); /* khu stdin */
p++ ;
}
}
/* Ham sap xep*/
void sapxep ( int n, kieuHV lop[ ])
{ int i , j ; kieuHV tam ;
for ( i = 0 ; i < n-1 ; i++)
for ( j=i + 1 ; j< n ; j++)
if ( lop[i].diem < lop[j].diem )
{ tam = lop[i] ; lop[i] = lop [j] ; lop [j] = tam ; }
}
/* ham in danh sach */
void inds( int n, kieuHV lop[] )
{ int i ;
for ( i = 0 ; i < n ; i++ )
{ printf ("%20s%5d ", lop[i].ten,lop[i].diem );
printf ("\n") ; /* xuong hang */
}
}
/* chuong trinh chinh */
void main ( )
{ int i , j, n , t, diem ;
printf ("\n Nhap si so : ") ; scanf ( "%d", &n);
lop = (kieuHV*)malloc ( n * sizeof ( kieuHV) ) ;
printf ("%c", getchar ());
nhapds(n, lop ) ; sapxep ( n, lop ) ; inds ( n, lop );
getch ( );
}
II. Kiu Union:
Cung nh cu truc, union gm nhiu thanh phn khac nhau, nhng chung khac nhau
ch : cac thanh phn cua cu truc chim cac vung nh khac nhau trong khi cac thanh phn cua
union c cp phat chung mt vung nh. dai cua union bng dai cua thanh phn ln
nht.
Vic khai bao va truy xut cac thanh phn cua union cung tng t nh struct.
Se la v ngha nu chung ta khi tao cho tt ca cac thanh phn cua bin union.
Ta co th khi tao : union u { char ch;
int x;
} a_union = {`H'};


Chng VII : D liu kiu cu truc


Trang 91
V du :
#include <stdio.h>
#include <conio.h>
typedef union
{ int ax;
int ay;
} test;
void main()
{
test r;
r.ax=4660;
printf("\n r.ax=%d",r.ax);
printf("\n r.ay=%d",r.ay);
getch();
}
Kt qua la : ax=4660
ay=4660
V du:
#include <stdio.h>
#include <conio.h>
union u { char ch[2];
int num;
};
void main(void)
{ union u val;
val.ch[0] = 'A';
val.ch[1] = 'b';
printf("The two character constants held by the union:\n");
printf("%c\n", val.num & 0x00FF); A
printf("%c\n", val.num >> 8); b
}
V du :
#include <stdio.h>
#include <conio.h>
typedef union
{ unsigned int ax;
struct
{ unsigned char al;
unsigned char ah;
} byte;
} thanh_ghi;
void main()
Chng VII : D liu kiu cu truc


Trang 92
{
thanh_ghi r;
r.ax=0x1234;
printf("\n r.ax=%x",r.ax);
printf("\n r.ah=%x",r.byte.ah);
printf("\n r.al=%x",r.byte.al);
getch();
}
Kt qua :
r.ax=1234
r.ah=12
r.al=34

Thc ra trong dos.h ngi ta a nh ngha kiu d liu union co tn REGS phuc vu
cho vic truy cp cac thanh ghi cua CPU trong vic goi ngt trong C.
struct BYTEREGS {
unsigned char al, ah, bl, bh;
unsigned char cl, ch, dl, dh;
};

struct WORDREGS {
unsigned int ax, bx, cx, dx;
unsigned int si, di, cflag, flags;
};

union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};

V du: typedef struct
{ char type;
union
{ char ch;
int i;
float f;
}v;
} solieu;
Da vao thanh phn type ma ta bit c cn x ly s liu theo kiu s nao. Cach lam
nay t tn b nh.
Ngi ta con dung union trch xut cac bit trong byte,word.
Chng VII : D liu kiu cu truc


Trang 93
III. Bai tp :
1. Xy dng mang cu truc ma mi cu truc (ng vi mi sinh vin) gm cac trng sau :
- Ho va tn
- Tui
- Lp
- im thi
trong o im thi la mt cu truc gm ba trng : toan, ly, hoa.
Nhp s liu cua 10 th sinh, hin th cac th sinh co im trung bnh ln hn 5 theo
th t tng d n cua tng s im.
Nhp vao tn cn tm, nu co nhiu hoc vin co cung tn cn tm th in ra ngi u
tin va ngi cui cung.
2. Vit chng trnh cng, tr, nhn, chia cac s phc.
3. Nhp vao toa 4 im A,B,C,D. Kim tra xem im D co nm trong tam giac ABC
khng, 2 oan thng AC va BD co ct nhau khng.
Chng VIII : D liu kiu tp tin (File)


Trang 94
Chng VIII. DU LIU KIU TP TIN (FILE)
I. Khai nim:
lu tr vnh vin d liu ta phai lu tr ln thit b nh ngoai cua may tnh nh a,
bng t,... Khi lu nh vy th nhom d liu o goi la tp tin (file).
File la mt kiu d liu co cu truc, bao gm tp hp cac phn t d liu co cung kiu
c nhom lai vi nhau tao thanh mt day. Mt file gm cac byte c ghi trong cac b nh
ngoai (a t, bng t.....). File co tn va dai cua no chnh bng s byte cua day.
Mt tp tin bt ky co th c n nh la tp tin vn ban, cung co th la tp tin nh
phn. Vic n nh nh v y phu thuc vao muc ch s dung tp tin va phu thuc vao cach
khai bao kiu truy cp khi m tp tin.

- Tp tin d liu nh phn : D liu trn file nh phn ging nh trong b nh
- Tp tin d liu vn ban : Khac vi file nh phn khi x l ma chuyn dong :
+ Khi ghi gia tr LF th chuyn thanh 2 gia tr la CR va LF.
+ Khi oc 2 gia tr CR va LF th chuyn thanh LF.
Trong o CR (ma 13) : v u dong; LF (ma 10) : xung dong.

Cac buoc xu li file :
- Khai bao bin file FILE *con_tro_file;
- M ghi hoc oc con_tro_file=fopen(tn_file, kiu_x_l );
- Ghi hoc oc file
- ong file fclose(con_tro_file);
Co 5 tp chun : stdin, stdout, stdprn, stderr, stdlog
II. Cac ham xu li tp tin trong C :
II.1. Cac ham dung chung cho ca 2 kiu nh phn va vn ban.
Ham fopen:
Mu : FILE *fopen(const char *tn_file,const char *kiu_x_l);
Trong o : tn_file: la ng dn ti file trn a.
kiu_x_l : la xu vi cac y ngha sau :
Kiu
i vi tp
tin vn ban
i vi tp
tin nh phn
Y ngha
r rt rb M file a tn tai oc, nu khng tra v li
w wt wb M file mi ghi, nu file a tn tai no se b xoa
a at ab M file ghi b sung, nu cha tn tai th tao file mi
r+ r+t r+b M file oc/ghi, nu file khng tn tai se bao li
w+ w+t w+b M file mi oc/ghi, nu a tn tai no se b xoa
a+ a+t a+b M file oc/ghi b sung, nu cha tn tai th tao file mi
Chng VIII : D liu kiu tp tin (File)


Trang 95
Cng dung: dung m tp tin, nu thanh cng se tra v con tro kiu FILE ng vi tp
tin va m, nu co li tra v NULL.
Chu y : Trong cac kiu oc ghi, cn lam sach vung m trc khi chuyn t oc sang
ghi hoc ghi sang oc nh ham fflush hoc ham dch chuyn v tr con tro.
Ham fclose:
Mu : int fclose(FILE *tn_tro_file);
Trong o : tn_tro_file la con tro tng ng vi tp tin cn ong.
Cng dung : dung ong tp tin, bao gm cac cng vic :
- y d liu con trong vung m ln a (khi ghi)
- Xoa vung m (khi oc)
- Giai phong bin tn_tro_file, nu thanh cng tra v gia tr 0, nu khng : EOF
Ham fcloseall:
Mu : int fcloseall(void);
Cng dung : ong tt ca cac tp tin ang m, nu thanh cng tra v gia tr bng s tp
tin ong c, nu khng tra v gia tr EOF.
Ham fflush:
Mu : int fflush(FILE * tn_tro_file);
Trong o : tn_tro_file la con tro tng ng vi tp tin ang x l.
Cng dung : lam sach vung m cua tp tin, nu thanh cng tra v gia tr 0, nu khng
tra v EOF
Ham fflushall:
Mu : int fflushall(void);
Cng dung : lam sach tt ca vung m cua cac tp tin ang m, nu thanh cng tra v
gia tr bng s tp tin c lam sach, nu khng tra v gia tr EOF.
Ham ferror
Mu : int ferror(FILE * tn_tro_file);
Trong o : tn_tro_file la con tro tng ng vi tp tin ang x l.
Cng dung : kim tra li thao tac trn tp tin, nu khng co li tra v gia tr 0, nu co
li tra v gia tr khac 0.
Ham perror:
Mu : void perror(const char *s);
Trong o s la con tro tro ti chui k t
Cng dung : in chui s va thng bao li.
Ham feof:
Mu : int feof(FILE * tn_tro_file);
Trong o : tn_tro_file la con tro tng ng vi tp tin ang x l.
Cng dung : kim tra kt thuc tp tin, tra v gia tr khac 0 nu gp cui tp tin khi oc,
nu khng tra v gia tr 0.
Ham unlink:
Mu : int unlink(FILE * tn_tro_file);
Trong o : tn_tro_file la con tro tng ng vi tp tin cn xoa.
Cng dung : xoa tp tin trn a, nu thanh cng tra v gia tr 0, nu khng : EOF
Chng VIII : D liu kiu tp tin (File)


Trang 96
Ham remove:
Mu : remove(const char * tn_tro_file);
Trong o : tn_tro_file la con tro tng ng vi tp tin cn xoa.
Cng dung : xoa tp tin trn a, ham nay la mt macro goi ti ham unlink.
Cac ham nay dung cho ca 2 kiu nh phn va vn ban nhng co vai im khac nhau.
Ham rename:
Mu : rename(const char *f1,const char *f2);
Cng dung : i tn tp f1 thanh tp f2
Ham putc va fputc:
Mu : int putc(int ch, FILE *con_tro _file);
int fputc(int ch, FILE *con_tro_file);
trong o ch la mt s nguyn, con_tro_file la con tro tng ng vi tp tin ang x l.
Cng dung : ghi ln tp tin k t co ma bng m=ch%256 (ch c xem nh khng
du). Nu thanh cng tra v gia tr ma k t c ghi, nu khng tra v gia tr EOF.
Ham getc va fgetc:
Mu : int getc(FILE *con_tro_file);
int fgetc(FILE *con_tro_file);
trong o con_tro_tp tin la con tro tng ng vi tp tin ang x l.
Cng dung : oc k t t tp tin, nu ht tp tin th tra v EOF.
II.2. Cac ham di chuyn con tro ch v tr:
Cac file ang m co 1 con tro ch v tr (File Position Locator) dung xac nh v tr
oc ghi trn file.
Ham rewind:
Mu : rewind(FILE f);
Cng dung : Tr v u tp ang m.
Ham ftell:
Mu : long ftell(FILE f);
Cng dung : Cho bit v tr hin tai cua con tro tp (v tr tnh theo byte, bt u t 0,
cho -1L nu co li)
Ham fseek:
Mu : int fseek(f, long n, int xuatphat);
Cng dung : Dch chuyn n byte k t v tr xut phat (cho khac 0 nu co li)
+ fseek(f,0,SEEK_SET); tr v u tp
+ fseek(f,0,SEEK_END); tr v cui tp
+ fseek(f,k,SEEK_CUR); dch chuyn k byte k t v tr con tro hin thi.
II.3. Cac ham nhp xut kiu vn ban:
Ham fprintf:
int frintf(FILE *f, const char *k,dss);
Cng dung : Ghi gia tr danh sach cac i s (dss) ln tp f theo khun dang c
ch nh trong chui iu khin (k).
Chng VIII : D liu kiu tp tin (File)


Trang 97
Ham fscanf:
int fscanf(FILE *f, const char *k, dss);
Cng dung : oc d liu t tp f theo khun dang c xac nh trong chui iu
khin k va kt qua c lu vao trong danh sach cac i s (dss).
Ham fputs:
int fputs(const char *s, FILE *f);
Trong o : s la con tro tro n a ch u cua mt chui ky t
f la con tro tp.
Cng dung : Ghi chui s ln tp f (du \0 khng ghi ln tp). Khi thanh cng ham tra
v ky t cui cung c ghi ln tp. Khi co li ham cho EOF.
Ham fgets:
char *fgets(char *s, int n, FILE *f);
Trong o : s la con tro tro n vung nh u ln cha chui ky t oc t tp
n la dai cc ai cua day cn oc
f la con tro tp.
Cng dung : oc day ky t t tp f va cha vao vung nh s. Khi thanh cng, ham tra
lai a ch vung nhn kt qua. Khi co li hoc gp cui tp, ham cho gia tr NULL.
V du : #include <stdio.h>
#include <ctype.h>
void main()
{ FILE *f;
char ch;
f=fopen("a.txt","w");
do
putc(toupper(ch=getchar()),f);
while(ch!='\n');
fclose(f);
}

V du: #include <stdio.h>
#include <ctype.h>
void main()
{ FILE *f;
char ch;
if((f=fopen("a.txt","r"))==NULL)
printf("\nKhong mo duoc file");
else
do
putchar(ch=getc(f));
while(ch!='\n');
fclose(f);
}
Chng VIII : D liu kiu tp tin (File)


Trang 98
V du : Vit chng trnh nhp theo kiu vn ban
#include <stdio.h>
#include <conio.h>
void main()
{ FILE *f;
int i,n;
float a;
f=fopen("a.txt","w");
printf("Nhap n :");scanf("%d",&n);
fprintf(f,"%d\n",n);
for(i=0;i<n;i++)
{ scanf("%f",&a);
fprintf(f,"%f\n",a);
}
fclose(f);
getch();
}

V du:Vit chng trnh xut theo kiu vn ban
#include <stdio.h>
#include <conio.h>
void main()
{ FILE *f;
int i,n;
float a;
f=fopen("a.txt","r");
fscanf(f,"%d",&n);
for(i=0;i<n;i++)
{ fscanf(f,"%f",&a);
printf("\n%f",a);
}
fclose(f);
getch();
}

V du 3: M mt tp vn ban va in ra tn sut xut hin cua bang ch cai
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <string.h>
#define N 256
void main()
Chng VIII : D liu kiu tp tin (File)


Trang 99
{ int i;
FILE *f;
static unsigned tso[26];
char *s;
clrscr();
f=fopen("a.txt","rt");
s=(char *)malloc(N);
while (!feof(f))
{ fgets(s,N,f);
strupr(s);
for(i=0;i<strlen(s);i++)
if ((s[i]>'A') && (s[i]<='Z'))
tso[s[i]-'A']++;
}
free(s);
printf("\n Cac chu cai trong tap tin :");
for(i=0;i<26;i++)
if (tso[i])
printf("\n %d chu %c",tso[i],i+'A');
getch();
}
II.4. Cac ham nhp xut kiu nh phn:
Ham putw:
int putw(int n, FILE *f);
Cng dung : Ghi gia tr n ln tp f di dang 2 byte. Nu thanh cng ham tra v s
nguyn cn ghi. Khi co li ham tra v EOF.
Ham getw:
int getw(FILE *f);
Cng dung : oc mt s nguyn 2 byte t tp f. Nu thanh cng ham tra v s
nguyn c oc. Khi co li hoc gp cui tp ham tra v EOF.
Ham fwrite:
int fwrite(void *ptr, int size, int n, FILE *f);
Cng dung : Ghi n mu tin, mi mu tin co kch thc size byte t vung nh ptr
ln tp f.
Ham fread:
int fread(void *ptr, int size,int n, FILE *f);
Cng dung : oc n mu tin, mi mu tin co kch thc size byte t tp f va cha vao
vung nh ptr



Chng VIII : D liu kiu tp tin (File)


Trang 100
V du: Copy tp t tp ngun sang tp ch
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define N 1
void main()
{ int i;
char t1[20],t2[20],a[N];
FILE *f1,*f2;
printf("Nhap ten tep nguon:"); scanf("%s",t1);
printf("Nhap ten tep dich:"); scanf("%s",t2);
f1=fopen(t1,"rb");
if (f1==NULL)
{ printf("Tep %s khong ton tai",t1);
getch();
exit(1);
}
f2=fopen(t2,"wb");
while ((fread(a,1,N,f1)) >0)
fwrite(a,1,N,f2);
fclose(f1);fclose(f2);
getch();
}

V du2: Vit chng trnh ghi cu truc ln a
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <stdlib.h>
void main()
{ char so[20];
FILE *f;
struct person
{ char ten[25];
int maso;
int diem;
} sv;
clrscr();
if ((f=fopen("a.txt","wb"))==NULL)
{ printf("Khong mo duoc tep");
getch();
exit(1);
Chng VIII : D liu kiu tp tin (File)


Trang 101
}
do
{ fflush(stdin);
printf("Nhap ho ten :");gets(sv.ten);
printf("Ma so :");scanf("%d",&sv.maso);
printf("Diem :");scanf("%d",&sv.diem);
fwrite(&sv,sizeof(sv),1,f);
printf("Tiep tuc khong (C/K)?");
}
while(toupper(getch())=='C');
fclose(f);
}

V du3: Vit chng trnh oc cu truc t a
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main()
{ char so[20];
FILE *f;
struct person
{ char ten[25];
int maso;
int diem;
} sv;
clrscr();
if ((f=fopen("a.txt","rb"))==NULL)
{ printf("Khong mo duoc tep");
getch();
exit(1);
}
while(fread(&sv,sizeof(sv),1,f)==1)
{ printf("\n Ten %s",sv.ten);
printf(" Ma so %d",sv.maso);
printf(" Diem %d",sv.diem);
}
fclose(f);
getch();
}


Chng VIII : D liu kiu tp tin (File)


Trang 102
V du : oc s liu vao 2 ma trn(n*n) t hai tp a.txt va b.txt. Tnh C=A*B va
ghi vao tp c.txt

#include <stdio.h>
FILE *f;
int n, a[10][10], b[10][10], c[10][10];
void main()
{ int i, j, k;
printf("Nhap n"); scanf("%d",&n);
f=fopen("a.txt","rb");
for(i=0; i<n;i++)
for(j=0;j<n;j++)
fscanf(f,"%d",&a[i][j]);
fclose(f);
f=fopen("b.txt","rb");
for(i=0; i<n;i++)
for(j=0;j<n;j++)
fscanf(f,"%d",&b[i][j]);
fclose(f);
for(i=0; i<n;i++)
for(j=0;j<n;j++)
{ c[i][j]=0;
for(k=0;k<n;k++)
c[i][j]+=a[i][k]*b[k][j];
}
f=fopen("c.txt", "wb");
for(i=0; i<n;i++)
for(j=0;j<n;j++)
fprintf(f," %d",c[i][j]);
fclose(f);
}
III. Bai tp:
1. Kim tra hai tp co ni dung nh nhau khng
2. Ni hai tp thanh mt tp tin mi
3. Loai bo cac cu chu thch trong chng trnh C.
4. Kim tra li cu phap nh cac du ngoc (), [], {}, , , cac chu thch.

You might also like