Giáo trình Lập trình Turbo C (Phần 1)
PhÇn 1 : turbo c n©ng cao vµ c++
Ch−¬ng 1 : BiÕn con trá
§1. Kh¸i niÖm chung
Mét con trá lµ mét biÕn chøa ®Þa chØ cña mét biÕn kh¸c. NÕu mét biÕn chøa ®Þa chØ
cña mét biÕn kh¸c tth× ta nãi biÕn thø nhÊt trá ®Õn biÕn thø hai .
Còng nh− mäi biÕn kh¸c, biÕn con trá còng ph¶i ®−îc khai b¸o tr−íc khi dïng. D¹ng
tæng qu¸t ®Ó khai b¸o mét biÕn con trá lµ :
type *<tªn biÕn>
Trong ®ã : type lµ bÊt k× kiÓu d÷ liÖu c¬ b¶n thÝch hîp nµo ®−îc chÊp nhËn trong C vµ <tªn
biÕn> lµ tªn cña mét biÕn con trá. KiÓu d÷ liÖu c¬ b¶n x¸c ®Þnh kiÓu cña nh÷ng biÕn mµ con
trá cã thÓ chØ ®Õn. VÝ dô khai b¸o biÕn con trá chØ ®Õn c¸c biÕn nguyªn vµ biÕn kiÓu kÝ tù:
char *p;
int *x,*y;
Con trá cã mét trÞ ®Æc biÖt gäi lµ NULL. TrÞ nµy cã nghÜa lµ con trá ch−a trá tíi mét ®Þa chØ
hîp lÖ nµo c¶. §Ó dïng ®−îc trÞ nµy chóng ta ph¶i dïng #include <stdio.h> ®Çu ch−¬ng
tr×nh
§2. C¸c phÐp to¸n vÒ con trá
C cã hai phÐp to¸n ®Æc biÖt ®èi víi con trá : * vµ & . PhÐp to¸n & lµ phÐp to¸n tr¶ vÒ
®Þa chØ trong bé nhí cña biÕn sau nã. VÝ dô :
p = &a;
sÏ ®Æt vµo biÕn p ®Þa chØ trong bé nhí cña biÕn a. §Þa chØ nµy kh«ng cã liªn quan g× ®Õn trÞ
sè cña biÕn a. Nãi c¸ch kh¸c ®Þa chØ cña biÕn a kh«ng liªn quan g× ®Õn néi dung cña biÕn a.
PhÐp to¸n * lµ phÐp to¸n tr¶ vÒ trÞ cña biÕn ®Æt t¹i ®Þa chØ ®−îc m« t¶ bëi biÕn ®i sau
nã. VÝ dô nÕu biÕn a chøa ®Þa chØ cña biÕn b th×
p = *a
sÏ ®Æt trÞ sè cña biÕn b vµo biÕn p
Ch−¬ng tr×nh 1-1 : LËp ch−¬ng tr×nh in sè 100 lªn mµn h×nh
main()
{
int *p,a,b;
clrscr();
a=100;
p=&a;
b=*p;
printf("%d",b);
getch();
}
§3. TÇm quan träng cña d÷ liÖu khi khai b¸o con trá
1
CÇn ph¶i b¶o ®¶m lµ con trá lu«n lu«n trá ®Õn mét kiÓu d÷ liÖu phï hîp. VÝ dô khi
khai b¸o con trá kiÓu int , tr×nh biªn dÞch sÏ hiÓu lµ con trá bao giê còng chØ ®Õn mét biÕn
cã ®é dµi lµ 2 byte .
Ta xÐt mét ch−¬ng tr×nh nh− sau
Ch−¬ng tr×nh 1-2
main()
{
float x=10.1,y;
int *p;
clrscr();
p=&x;
y=*p;
printf("%f",y);
getch();
}
Ch−¬ng tr×nh nµy nh»m g¸n trÞ cña x cho biÕn y vµ in ra trÞ ®ã. Khi biªn dÞch ch−¬ng
tr×nh kh«ng b¸o lçi mµ chØ nh¾c nhë :
Suspencious pointer conversion in function main
Tuy nhiªn ch−¬ng tr×nh kh«ng g¸n trÞ x cho y ®−îc. LÝ do lµ ta khai b¸o mét con trá
int vµ cho nã trá tíi biÕn float x. Nh− vËy tr×nh biªn dÞch sÏ chØ chuyÓn 2 byte th«ng tin cho
y chø kh«ng ph¶i 4 byte ®Ó t¹o ra mét sè d¹ng float .
§4. C¸c biÓu thøc con trá
1. C¸c phÐp g¸n con trá : Còng gièng nh− bÊt k× mét biÕn nµo kh¸c , ta cã thÓ dïng mét
con trá ë vÒ ph¶i cña mét phÐp g¸n ®Ó g¸n trÞ cña mét con trá cho mét con trá kh¸c. VÝ dô ta
viÕt
Ch−¬ng tr×nh 1-3 :
main()
{
int x;
int *p1,*p2;
clrscr();
p1 = &x;
p2 = p1;
printf(“ %p”,p2);
getch();
}
Ch−¬ng tr×nh nµy hiÖn lªn ®Þa chØ cña biÕn x ë d¹ng hex b»ng c¸ch dïng mét m· ®Þnh
d¹ng kh¸c cña hµm printf() . %p m« t¶ r»ng sÏ hiÖn lªn mét trÞ chøa trong mét biÕn con trá
theo d¹ng reg:xxxx víi reg lµ tªn cña mét trong c¸c thanh ghi segment cña CPU cßn xxxx lµ
®Þa chØ offset tÝnh tõ ®Çu segment .
2. C¸c phÐp to¸n sè häc cña con trá : Trong C , ta chØ cã thÓ dïng hai phÐp to¸n sè häc t¸c
®éng lªn con trá lµ phÐp + vµ - . §Ó hiÓu ®−îc c¸i g× sÏ x¶y ra khi thùc hiÖn mét phÐp to¸n
sè häc lªn con trá ta gi¶ sö p1 lµ mét con trá chØ ®Õn mét sè nguyªn cã ®Þa chØ lµ 2000 . Sau
khi thùc hiÖn biÓu thøc
2
p1++ ;
con trá sÏ chØ ®Õn sè nguyªn n»m ë ®Þa chØ 2002 v× mçi khi t¨ng con trá lªn 1 nã sÏ chØ ®Õn
sè nguyªn kÕ tiÕp mµ mçi sè nguyªn l¹i cã ®é dµi 2 byte . §iÒu nµy còng ®óng khi gi¶m . VÝ
dô :
p1-- ;
sÏ trá tíi sè nguyªn ë ®Þa chØ 1998 . Nh− vËy mçi khi con trá t¨ng lªn 1 , nã sÏ chØ ®Õn d÷
liÖu kÕ tiÕp t¹i ®Þa chØ nµo ®ã tuú theo ®é dµi cña kiÓu d÷ liÖu. C cßn cho phÐp céng hay trõ
mét sè nguyªn víi mét con trá . BiÓu thøc :
p1 = p1 + 9;
sÏ lµm cho con trá chØ tíi phÇn tö thø 9 cã kiÓu lµ kiÓu mµ p1 trá tíi vµ n»m sau ph©n tö hiÖn
thêi nã ®ang trá ®Õn . Ngoµi c¸c phÐp to¸n trªn , con trá kh«ng chÊp nhËn mét phÐp to¸n nµo
kh¸c .
3. So s¸nh c¸c con trá : Chóng ta cã thÓ so s¸nh 2 con trá trong mét biÓu thøc quan hÖ . VÝ
dô cho hai p vµ q , ph¸t biÓu sau ®©y lµ hîp lÖ :
if (p<q)
printf(“p tro den mot vi tri bo nho thap hon q\n”);
Tuy nhiªn cÇn nhí r»ng phÐp to¸n trªn lµ so s¸nh hai ®Þa chØ chøa trong p vµ q chø kh«ng
ph¶i néi dung cña hai biÕn mµ p vµ q trá tíi .
4. C¸c vÝ dô vÒ viÖc dïng con trá :
Ch−¬ng tr×nh 1-4 : Ph©n tÝch ch−¬ng tr×nh sau :
main()
{
int i,j,*p;
i=5;
p=&i;
j=*p;
*p=j+2;
}
Trong ch−¬ng tr×nh trªn ta khai b¸o hai biÕn nguyªn lµ i vµ j vµ mét biÕn con trá p trá
tíi mét sè nguyªn . Ch−¬ng tr×nh sÏ ph©n phèi bé nhí cho 3 biÕn nµy vÝ dô t¹i c¸c ®Þa chØ
100 , 102 vµ 104 v× mçi sè nguyªn dµi 2 byte vµ con trá mÆc nhiªn còng ®−îc m· ho¸ b»ng
2 byte .
100
102
104
i
j
p
lÖnh i=5 cho trÞ sè cña biÕn i lµ 5
100
102
104
5
i
j
p
lÖnh p= &i lµm cho con trá chØ tíi biÕn i nghÜa lµ con trá p chøa ®Þa chØ cña biÕn i . B©y giê
p chØ ®Õn biÕn i .
100
102
104
5
i
j
p
100
3
lÖnh j=*p ®Æt néi dung cña biÕn do p chØ tíi (biÕn i) vµo biÕn j nghÜa lµ g¸n 5 cho j
100
102
104
5
5
100
i
j
p
Mét trong nh÷ng vÊn ®Ò lÝ thó khi dïng con trá lµ xem néi dung bé nhí cña m¸y tÝnh
. Ch−¬ng tr×nh sau ®©y cho phÐp ta vµo ®Þa chØ b¾t ®Çu cña RAM mµ ta muèn kh¶o s¸t vµ
sau ®ã hiÖn lªn néi dung mçi byte ë d¹ng sè hex . Trong ch−¬ng tr×nh cã tõ kho¸ far dïng
®Ó tham kh¶o ®Õn c¸c vÞ trÝ kh«ng n»m trong cïng mét segment .
Ch−¬ng tr×nh 1-5 :
main()
{
unsigned long int start;
char *p;
int t;
clrscr();
printf("Nhap vao dia chi bat dau ma ban muon xem : ");
scanf("%lu",&start);
p = (char far *) start;
for(t=0;;t++,p++)
if(!(t%16))
{
printf("%2x\n",*p);
getch();
}
}
Trong ch−¬ng tr×nh ta dïng ®Þnh d¹ng %x trong hµm printf() ®Ó in ra sè d¹ng hex .
Dßng p = (char far *) start; dïng biÕn ®æi sè nhËp vµo thµnh mét con trá .
§5. Con trá vµ m¶ng
Trong ch−¬ng tr−íc chóng ta ®· thÊy c¸c vÝ dô vÒ m¶ng . Con trá th−êng ®−îc dïng
khi xö lÝ m¶ng . Chóng ta xÐt ch−¬ng tr×nh sau :
Ch−¬ng tr×nh 1-6 :
main()
{
int a[10],*pa,x;
a[0]=11;
a[1]=22;
a[2]=33;
a[3]=44;
clrscr();
pa=&a[0];
x=*pa;
pa++;
x=*pa;
4
x=*pa+1;
x=*(pa+1);
x=*++pa;
x=++*pa;
x=*pa++;
}
int a[10] , *pa , x; khai b¸o mét b¶ng gåm 10 phÇn tö kiÓu int , ®−îc liÖt kª lµ
a[0],a[1],..,a[9] , mét con trá ®Ó chØ ®Õn mét biÕn kiÓu int vµ mét biÕn kiÓu int lµ x.
a[0] = 11. . .; tõ a[4] ®Õn a[9] ch−a ®−îc khëi g¸n . Nh− vËy chóng sÏ chøa trÞ ngÉu nhiªn
®· cã t¹i nh÷ng vÞ trÝ bé nhí ®· ph©n phèi cho chóng .
pa=&a[0]; ®Æt vµo pa ®Þa chØ cña phÇn tö ®Çu tiªn cña m¶ng . BiÓu thøc nµy cã thÓ viÕt ®¬n
gi¶n lµ pa = a ; v× tªn cña mét m¶ng lu«n lu«n ®−îc tr×nh biªn dÞch coi lµ ®Þa chØ cña phÇn tö
®Çu tiªn cña m¶ng . Tªn cña m¶ng kh«ng cã chØ sè kÌm theo cã thÓ ®−îc dïng trong ch−¬ng
tr×nh nh− mét h»ng ®Þa chØ .
x=*pa; ®Æt néi dung cña biÕn nguyªn mµ pa trá ®Õn vµo (tøc lµ a[0]) vµo x . Nh− vËy x = 11
pa++; pa ®−îc t¨ng lªn 1 vµ b©y giê trá vµo phÇn tö thø 2 cña m¶ng tøc lµ chøa ®Þa chØ cña
phÇn tö a[1]
x=*pa ; pa trá ®Õn phÇn tö a[1] nªn x = 22
x = *pa +1 ; x =23
x = *(pa+1) ; tr−íc hÕt pa+1 ®−îc thùc hiÖn , nghÜa lµ pa trá vµo a[2] , sau ®ã néi dung cña
a[2] ®−îc g¸n cho x nªn x= 33 .Tuy pa tham gia vµo phÐp to¸n nh−ng trÞ sè cña nã kh«ng
thay ®æi .
x = *++pa; ++ ®−îc thùc hiÖn tr−íc nªn pa trá tíi a[2] . Sau ®ã trÞ cña a[2] ®−îc g¸n cho x
nªn x =33
x= ++*pa; *pa ®−îc thùc hiÖn tr−íc . Do pa chØ ®Õn a[2] nªn *pa=33 vµ ++*pa=34 . Nh−
vËy x = 34 vµ a[2]=34
x=*pa++; néi dung cña pa (tøc 34) ®−îc ®Æt vµo x . Sau ®ã nã ®−îc t¨ng lªn 1 nªn chØ vµo
a[3].
Ch−¬ng tr×nh 1-7:
main()
{
static int num[]={92,81,70,69,58};
int dex;
clrscr();
for(dex=0;dex<5;dex++)
printf("%d\n",num[dex]);
getch();
}
Ch−¬ng tr×nh 1-8 :
main()
{
static int num[]={92,81,70,69,58};
int dex;
clrscr();
for(dex=0;dex<5;dex++)
printf("%d\n",*(num+dex));
5
getch();
}
Hai ch−¬ng tr×nh chØ kh¸c nhau ë biÓu thøc : *(num+dex) . C¸ch viÕt nµy t−¬ng
®−¬ng víi num[dex] .Nãi c¸ch kh¸c truy cËp ®Õn phÇn tö cã chØ sè dex trong m¶ng num .
Chóng ta hiÓu *(num+dex) nh− sau : ®Çu tiªn num lµ ®Þa chØ cña phÇn tö ®Çu tiªn cña m¶ng
num vµ ta muèn biÕt trÞ sè cña phÇn tö cã chØ sè dex . V× vËy num+dex sÏ lµ ®Þa chØ cña
phÇn tö thø dex . *(num+dex) x¸c ®Þnh néi dung cña phÇn tö (num+dex) . Tãm l¹i :
*(array+index) t−¬ng tù array(index)
Cã hai c¸ch truy cËp m¶ng lµ :
theo kÝ hiÖu m¶ng &array[index]
theo kÝ hiÖu con trá array+index
Ch−¬ng tr×nh 1-9 : TÝnh nhiÖt ®é trung b×nh b»ng c¸ch dïng con trá
main()
{
float temp[40];
float sum=0.0;
int num,day=0;
clrscr();
do
{
printf("Cho nhiet do ngay thu %d: ",day+1);
scanf("%f",temp+day);
}
while(*(temp+day++)>0);
num = day-1;
for(day=0;day<num;day++)
sum+=*(temp+day);
printf("Nhiet do trung binh la : %.3f",sum/num);
getch();
}
Trong vÝ dô trªn chóng ta ®· dïng biÓu thøc (temp+day) ®Ó truy cËp m¶ng . Tuy nhiªn viÕt
while((*temp++)>0) v× temp lµ h»ng con trá chø kh«ng ph¶i biÕn con trá . Nh− vËy chØ ®−îc
phÐp thay ®æi trÞ cña biÕn con trá chø kh«ng ®−îc thay ®æi trÞ cña h»ng con trá . Chóng ta
viÕt l¹i ch−¬ng tr×nh nh− sau :
Ch−¬ng tr×nh 1-10 :
main()
{
float temp[40];
float sum=0.0;
int num,day=0;
float *p;
clrscr();
p=temp;
do
{
printf("Cho nhiet do ngay thu %d: ",day+1);
6
scanf("%f",p);
day++;
}
while(*(p++)>0);
p=temp;
num=day-1;
for(day=0;day<num;day++)
sum+=*(p++);
printf("Nhiet do trung binh la : %.3f",sum/num);
getch();
}
Trong ch−¬ng tr×nh nµy ®Þa chØ cña temp ®−îc ®−a vµo biÕn con trá p . Sau ®ã ta tham kh¶o
tíi p gièng nh− temp . Ta dïng p trá tíi m¶ng vµ *p lµ néi dung cña ®Þa chØ ®ã . H¬n n· do p
lµ biÕn con trá nªn ta cã thÓ t¨ng nã b»ng ph¸t biÓu p++.
§6. Con trá vµ chuçi
RÊt nhiÒu hµm th− viÖn trong C lµm viÖc víi chuçi theo con trá . VÝ dô hµm strchr()
tr¶ vÒ con trá trá ®Õn lÇn xuÊt hiÖn ®Çu tiªn cña mét kÝ tù nµo ®ã trong chuçi VÝ dô : ptr =
strchr(str,’x’)
th× biÕn con trá ptr sÏ ®−îc g¸n ®Þa chØ cña lÇn xuÊt hiÖn kÝ tù ‘x’ ®Çu tiªn trong chuçi str .
Sau ®©y lµ ch−¬ng tr×nh cho phÐp ta gâ vµo mét c©u vµ mét kÝ tù cÇn ®Þnh vÞ trong c©u .
Ch−¬ng tr×nh sÏ cho ta :
- ®Þa chØ b¾t ®Çu cña chuçi
- ®Þa chØ cña kÝ tù cÇn ®Þnh vÞ
- ®é lÖch so víi ®iÓm ®Çu chuçi
Ch−¬ng tr×nh 1-11 :
#include<string.h>
main()
{
char ch,line[81],*ptr;
clrscr();
printf("Cho mot cau : ");
gets(line);
printf("Cho ki tu can tim : ");
ch=getche();
ptr=strchr(line,ch);
printf("\nChuoi bat dau tai dia chi %u.\n",line);
printf("Ki tu xuat hien lan dau tai %u.\n",ptr);
printf("Do la vi tri %d",(ptr-line+1));
getch();
}
Chuçi còng cã thÓ ®−îc khëi t¹o b»ng con trá . Ta xÐt vÝ dô sau
Ch−¬ng tr×nh 1-11 :
main()
{
char *chao="Xin chao !";
7
char ten[30];
clrscr();
printf("Cho ten cua ban : ");
gets(ten);
printf(chao);
puts(ten);
getch();
}
Trong ch−¬ng tr×nh trªn ta ®· khëi t¹o chuçi b»ng ph¸t biÓu
char *chao = “ Xin chao !”
thay cho
static char chao[]=” Xin chao !”
C¶ hai c¸ch ®Òu cho cïng mét kÕt qu¶ . Trong ph−¬ng ¸n dïng con trá , chao lµ biÕn con trá
nªn cã thÓ thay ®æi ®−îc . VÝ dô ph¸t biÓu :
puts(++chao)
sÏ cho kÕt qu¶ : in chao !
NÕu ta cã mét m¶ng chuçi ta còng cã thÓ dïng m¶ng con trá trá tíi m¶ng chuçi nµy .
Ta khëi t¹o chóng gièng nh− khëi t¹o biÕn con trá ®¬n .
Ch−¬ng tr×nh 1-12 :
#define
main()
{
max 5
int dex;
int enter=0;
char name[40];
static char *list[max]=
{
"Hung",
"Ngan",
"Van",
"Hoa",
"Tien"
};
clrscr();
printf("Cho ten cua ban : ");
gets(name);
for(dex=0;dex<max;dex++)
if (strcmp(list[dex],name)==0)
enter=1;
if (enter==1)
printf("Ban da dang ki hoc lop C");
else
printf("Ban chua dang ki vao lop");
getch();
}
Ph¸t biÓu char *list[max] nãi r»ng list lµ mét m¶ng con trá gåm max phÇn tö chØ tíi
c¸c kÝ tù . Chóng ta xÐt tiÕp mét vÝ dô nh− sau :
8
Ch−¬ng tr×nh 1-13 : NhËp vµo mét d·y tªn vµ s¾p xÕp l¹i ®óng thø tù a,b,c
#define maxnum 38
#define maxlen 81
main()
{
static char name[maxnum][maxlen];
char *ptr[maxnum];
char *temp;
int count = 0;
int in,out;
clrscr();
while (count<maxnum)
{
printf("Ban cho ten : ");
gets(name[count]);
if (strlen(name[count])==0)
break;
ptr[count++]=name[count];
}
for (out=0;out<count-1;out++)
for (in=out+1;in<count;in++)
if (strcmp(ptr[out],ptr[in])>0)
{
temp=ptr[in];
ptr[in]=ptr[out];
ptr[out]=temp;
}
printf("Danh sach da sap xep :\n");
for(out=0;out<count;out++)
printf("Ten thu %d : %s\n",out+1,ptr[out]);
getch();
}
Ch−¬ng tr×nh nµy dïng c¶ m¶ng chuçi vµ m¶ng con trá chuçi . Con trá n»m trong
m¶ng ®−îc khai b¸o nh− sau :
char *ptr[maxnum]
chuçi n»m trong m¶ng hai chiÒu
static char name[maxnum][maxlen]
Do ta kh«ng biÕt mét chuçi dµi bao nhiªu nªn ph¶i dïng m¶ng chuçi name cã tèi ®a
maxnum phÇn tö , mçi phÇn tö cã maxlen kÝ tù . Khi nhËp chuçi ph¸t biÓu
ptr[count++] = name[count
sÏ g¸n ®Þa chØ cña mçi chuçi ®−îc cÊt gi÷ trong m¶ng name[][] vµo phÇn tö con trá ptr . Sau
®ã m¶ng con trá nµy ®−îc s¾p xÕp dùa trªn m¶ng name[][] nh−¬ng m¶ng name[][] kh«ng
thay ®æi g× c¶ .
Ng«n ng÷ C cã thÓ xö lÝ c¸c thµnh phÇn cña m¶ng nh− mét m¶ng . Cô thÓ C cã thÓ
xem mét dßng cña m¶ng hai chiÒu nh− lµ mét m¶ng mét chiÒu. ®iÒu nµy rÊt tiÖn lîi nh− ta
®É thÊy trong ch−¬ng tr×nh trªn . C©u lÖnh ptr[count++] = name[count hoµn toµn hîp lÝ v× vÕ
9
ph¶i chÝnh lµ ®Þa chØ cña m¶ng name[count] vµ m¶ng nµy lµ mét thµnh phÇn cña m¶ng
name[][] lµ mét m¶ng hai chiÒu . Ta xem l¹i khai b¸o :
static char name[maxnum][maxlen]
râ rµng ta cã thÓ xem ®©y lµ mét m¶ng mét chiÒu cã maxnum chuçi vµ tham kh¶o tíi phÇn
tö cña m¶ng mét chiÒu b»ng 1 chØ sè . VÝ dô :
name[count] víi count<=maxnum nh− thÕ
name[0] : ®Þa chØ cña chuçi 1
name[1] : ®Þa chØ cña chuçi 2
§7. Con trá trá ®Õn con trá
Chóng ta cã mét ch−¬ng tr×nh in ra mét b¶ng sè ®−îc viÕt nh− sau :
Ch−¬ng tr×nh 1-14:
#define row 4
#define col 5
main()
{
static int table[row][col]={
{13,15,17,19,21},
{20,22,24,26,28},
{31,33,35,37,39},
{40,42,44,46,48}
};
int c=10;
int i,j;
clrscr();
for(i=0;i<row;i++)
for(j=0;j<col;j++)
table[i][j]+=c;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
printf("%5d",table[i][j]);
printf("\n");
}
getch();
}
Trong ch−¬ng tr×nh trªn ta dïng kÝ hiÖu m¶ng. B©y giê ta muèn viÕt ch−¬ng tr×nh
dïng kÝ hiÖu con trá thay cho kÝ hiÖu m¶ng. VËy th× lµm thÕ nµo ®Ó m« t¶ table[i][j] b»ng
con trá . Ta thÊy r»ng :
- table lµ ®Þa chØ cña phÇn tö ®Çu tiªn cña toµn bé m¶ng , gi¶ ®Þnh lµ 1000
- do ®©y lµ m¶ng nguyªn nªn mçi phÇn tö chiÕm 2 byte vµ mçi dßng chiÕm 10 byte v×
cã 5 phÇn tö . Nh− vËy ®Þa chØ cña hai dßng liÒn nhau c¸ch nhau 10 byte
- do cã thÓ xem mçi dßng lµ mét m¶ng mét chiÒu nªn c¸c m¶ng mét chiÒu liÒn nhau
c¸ch nhau 10 byte
- tr×nh biªn dÞch biÕt sè cét trong m¶ng qua khai b¸o nªn nã sÏ hiÓu table+1 lµ ®em
table ( trÞ 1000 ) céng víi 10 byte thµnh 1010 . T−¬ng tù table+2 cho ta 1020 .
1000 13 15 17 19 21
table[0]
10
table==1000 1010 20 22 24 26 28
1020 31 33 35 37 39
table[1]
table[2]
table[3]
1030 40 42 44 46 48
§Ó tham kh¶o ®Õn tõng phÇn tö cña dßng tr−íc hÕt ta l−u ý ®Þa chØ cña m¶ng còng lµ
®Þa chØ cña phÇn tö ®Çu tiªn cña m¶ng . VÝ dô víi m¶ng mét chiÒu a[size] th× a vµ a[0] lµ nh−
nhau . Trë l¹i m¶ng hai chiÒu ®Þa chØ cña m¶ng mét chiÒu t¹o bëi dßng thø 3 cña m¶ng
table[][] lµ table[2] hay table+2 .Trong kÝ hiÖu con trá ®Þa chØ cña phÇn tö ®Çu tiªn cña m¶ng
mét chiÒu nµy lµ &table[2][0] hay *(table+2) . C¶ hai c¸ch viÕt table+2 vµ *(table+2) ®Òu
tham kh¶o néi dung cña cïng mét « nhí (1020) . NÕu céng 1 vµo table +3 ®Ó cã table+3 th×
ta nhËn ®−îc ®Þa chØ cña dßng thø 4 trong m¶ng table[][] . NÕu céng 1 vµo *(table+2) ®Ó cã
*(table+2)+1 th× cã ®Þa chØ cña phÇn tö thø 2 trong dßng thø 3 cña m¶ng table[][] . Tãm l¹i :
table[i] = *(table+i)
&table[i] = table+i
table[i][j] = *(*table+i)+j)
&table[i][j] = (*(table+i)+j)
Nh− vËy ch−¬ng tr×nh trªn ®−îc viÕt l¹i nh− sau :
Ch−¬ng tr×nh 1-15 :
#define row 4
#define col 5
main()
{
static int table[row][col]={
{13,15,17,19,21},
{20,22,24,26,28},
{31,33,35,37,39},
{40,42,44,46,48}
};
int c=10;
int i,j;
clrscr();
for(i=0;i<row;i++)
for(j=0;j<col;j++)
*(*(table+i)+j)+=c;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
printf("%5d",*(*(table+i)+j));
printf("\n");
}
getch();
}
Bµi tËp : LËp ch−¬ng tr×nh tÝnh hiÖu ®é dµi hai chuçi nhËp vµo tõ bµn phÝm
LËp ch−¬ng tr×nh x¸c ®Þnh gi¸ trÞ cùc ®¹i cña n sè nhËp vµo tõ bµn phÝm
LËp ch−¬ng tr×nh qu¶n lÝ hµng gåm ngµy , l−îng nhËp ,l−îng xuÊt vµ hµng tån kho
11
ch−¬ng 2 : Bµn phÝm vµ cursor
§1. C¸c m· phÝm më réng
Chóng ta ®· thÊy bµn phÝm t¹o c¸c m· th«ng th−êng cho c¸c ch÷ c¸i, c¸c sè vµ dÊu
chÊm c©u. C¸c phÝm nµy ®Òu t¹o m· ASCII dµi 1 byte. Tuy nhiªn cã nhÒu phÝm vµ tæ hîp
phÝm kh«ng ®−îc biÓu diÔn b»ng bé kÝ tù dµi mét byte nµy vÝ dô nh− c¸c phÝm chøc n¨ng tõ
F1 ®Õn F10 hay c¸c phÝm ®iÒu khiÓn cursor . C¸c phÝm nµy ®−îc m« t¶ b»ng mét m· dµi 2
byte. Byte ®Çu tiªn cã trÞ sè lµ 0 vµ byte thø hai lµ trÞ sè m· cña phÝm nµy .
1. NhËn biÕt c¸c m· më réng : Mét m· më réng ph¶i cã 2 byte vµ byte ®Çu tiªn lµ 0 nªn
ch−¬ng tr×nh cÇn ph¶i ®äc 2 byte nµy . Sau ®©y lµ ®o¹n ch−¬ng tr×nh nhËn biÕt c¸c m· më
réng Ch−¬ng tr×nh 2-1:
#include <string.h>
main()
{
char key,key1;
clrscr();
while ((key=getche())!='x')
if (key==0)
{
key1=getch();
printf("%3d%3d",key,key1);
}
else
printf("%3d",key);
}
Ch−¬ng tr×nh nµy sÏ hiÖn thÞ c¸c m· cña c¸c phÝm ®−îc gâ cho dï chóng lµ m· mét
byte hay 2 byte . Ta dïng hµm getch() ®Ó kh«ng hiÓn thÞ kÝ tù võa gâ lªn mµn h×nh . Trong
biÓu thøc kiÓm tra cña while ch−¬ng tr×nh ®äc m· ®Çu tiªn . NÕu m· nµy lµ 0 , ch−¬ng tr×nh
biÕt ®ã lµ m· më réng vµ ®äc tiÕp phÇn thø hai cña m· b»ng hµm getch() . Sau ®ã nã hiÓn thÞ
c¶ hai phÇn . NÕu phÇn ®Çu kh¸c kh«ng ch−¬ng tr×nh sÏ cho r»ng ®©y kh«ng ph¶i lµ m· më
réng vµ hiÖn thÞ m· nµy .
2. §o¸n nhËn m· më réng : Mét c¸ch ®o¸n nhËn m· më réng lµ dïng ph¸t biÓu switch nh−
trong ch−¬ng tr×nh sau :
Ch−¬ng tr×nh 2-2 :
main()
{
int key,key1;
clrscr();
while ((key=getche())!='X')
if (key==0)
{
key1=getch();
switch (key1)
{
case 59 : printf("Phim F1 duoc nhan\n");
break;
case 60 : printf("Phim F2 duoc nhan\n");
12
break;
case 75 : printf("Phim left arrow duoc nhan\n");
break;
default : printf("Phim mo rong khac duoc nhan\n");
break;
}
}
else
printf("%3d",key);
getch();
}
§2. §iÒu khiÓn cursor vµ ansi.sys
1.Kh¸i niÖm chung :TËp tin ansi.sys cung cÊp tËp ®· chuÈn ho¸ c¸c m· ®iÒu khiÓn cursor .
ANSI - America National Standards Institut. §Ó b¶o ®¶m sù cµi ®Æt cña tËp tin ansi.sys trong
tËp tin config.sys ta ®Æt dßng lÖnh :
device = ansi.sys
2. §iÒu khiÓn cursor b»ng ansi.sys : ansi.sys dïng d·y escape ®Ó ®iÒu khiÓn con nh¸y .
Chuçi escape gåm nhiÒu kÝ tù ®Æc biÖt . Ansi.sys t×m chuçi escape nµy qua thµnh phÇn cña
chuçi trong hµm prinft() vµ gi¶i m· c¸c lÖnh theo sau nã . Chuçi escape lu«n lu«n gièng
nhau , gåm kÝ tù kh«ng in ®−îc “\x1B”(lµ m· cña kÝ tù escape) sau ®ã lµ dÊu [ . Sau chuçi
escape cã thÓ cã mét hay nhiÒu kÝ tù . Nhê chuçi nµy con nh¸y cã thÓ ®i lªn , xuãng , sang
tr¸i , ph¶i hay ®Þnh vÞ t¹i mét vÞ trÝ nµo ®ã . VÝ dô ®Ó di chuyÓn con nh¸y xuèng d−íi ta dïng
chuçi “\x1B[B”
Ch−¬ng tr×nh 2-3 : ViÕt ch−¬ng tr×nh in mét chuçi theo ®−êng chÐo :
main()
{
clrscr();
printf("Cho mot chuoi tan cung bang dau .:");
while (getche()!='.')
printf("\x1B[B");
getch();
}
3. Dïng #define vµ chuçi escape : Chuçi “\x1B[B” ®−îc m· ho¸ vµ rÊt khã ®äc . Khi dïng
c¸c ch−¬ng tr×nh phøc t¹p nªn ghi chó râ rµng b»ng c¸ch dïng dÉn h−íng #define .
Ch−¬ng tr×nh 2-4 :
#define c_down "\x1B[B"
main()
{
while (getche()!='.')
printf(c_down);
getch();
}
Tãm t¾t c¸c lÖnh ®iÒu khiÓn con nh¸y
M·
C«ng dông
13
“[2J”
“[K”
“[A”
“[B”
“[C”
“[D”
Xo¸ mµn h×nh vµ ®−a con nh¸y vÒ home
Xo¸ ®Õn cuèi dßng
§−a con nh¸y lªn mét dßng
§−a con nh¸y xuèng mét dßng
§−a con nh¸y sang ph¶i mét cét
§−a con nh¸y sang tr¸i mét cét
“[%d;%df §−a con nh¸y ®Õn vÞ trÝ nµo ®ã
“[s”
CÊt gi÷ vÞ trÝ con nh¸y
“[u”
Kh«i phôc vÞ trÝ con nh¸y
“[%dA”
“[%dB”
“[%dC”
“[%dD”
§−a con nh¸y lªn mét sè dßng
§−a con nh¸y xuèng mét sè dßng
§−a con nh¸y sang ph¶i mét sè cét
§−a con nh¸y sang tr¸i mét dßng vµ nhiÒu cét
4. §iÒu khiÓn con nh¸y tõ bµn phÝm : Sau ®©y lµ ch−¬ng tr×nh cho phÐp b¹n vÏ c¸c h×nh
®¬n gi¶n trªn mµn h×nh
Ch−¬ng tr×nh 2-5 :
#define clear "\x1B[2J"
#define c_left "\x1B[D"
#define c_right "\x1B[C"
#define c_up "\x1B[A"
#define c_down "\x1B[B"
#define l_arrow 75
#define r_arrow 77
#define u_arrow 72
#define d_arrow 80
#define across 205
#define updown 186
main()
{
int key;
printf(clear);
while ((key=getch())==0)
{
key=getche();
switch (key)
{
case l_arrow : printf(c_left);
putch(across);
break;
case r_arrow : printf(c_right);
putch(across);
break;
case u_arrow : printf(c_up);
putch(updown);
break;
case d_arrow : printf(c_down);
putch(updown);
break;
}
14
printf(c_left);
}
getch();
}
5. §−a con nh¸y ®Õn vÞ trÝ bÊt k× : Chuçi escape d¹ng sau sÏ ®−a con nh¸y ®Õn vÞ trÝ bÊt k×
trªn mµn h×nh
Sè hex 1B cña kÝ tù escape
Sè hiÖu dßng
Sè hiÖu cét
Ch÷ c¸i f
“ \ x 1 B [ 10 ; 40 f ”
Sau ®©y lµ mét ch−¬ng tr×nh vÝ dô vÒ c¸ch dïng chuçi ®ã
Ch−¬ng tr×nh 2-6 :
#define true 1
#define clear "\x1B[2J"
#define erase "\x1B[K"
main()
{
int row=1,col=1;
printf(clear);
while(true)
{
printf("\x1B[23;1f");
printf(erase);
printf("Nhap vao so dong va so cot dang(20,40)");
scanf("%d%d",&row,&col);
printf("\x1B[%d;%df",row,col);
printf("*(%d,%d)",row,col);
}
}
§6. Tr×nh bµy chç bÊt k× trªn mµn h×nh
Sau ®©y lµ ch−¬ng tr×nh dïng chuçi ®Þnh vÞ cursor .Ch−¬ng tr×nh cung cÊp hai menu
®Þnh vÞ däc theo mµn h×nh .
Ch−¬ng tr×nh 2-7 :
#define size1 5
#define size2 4
#define clear "\x1B[2J"
main()
{
static char *menu1[]=
{
"Open",
"Close"
"Save"
"Print"
"Quit"
15
};
static char *menu2[]=
{
"Cut",
"Copy",
"Paste",
"Reformat"
};
void display(char *[],int ,int);
printf(clear);
display(menu1,size1,20);
display(menu2,size2,20);
getch();
}
void display(char *arr[],int size,int hpos)
{
int j;
for (j=0;j<size;j++)
{
printf("\x1B[%d",j+1,hpos);
printf("%s\n",*(arr+j));
}
}
C¸c môc cho tõng menu ®−îc cÊt gi÷ trong m¶ng c¸c con trá trá tíi chuçi . Sau ®ã
ch−¬ng tr×nh dïng hµm ®Ó hiÓn thÞ menu . Hµm ®Þnh vÞ con nh¸y nhê d·y ®Þnh vÞ ANSI.SYS
, lÊy sè hiÖu dßng tõ sè hiÖu cña môc trªn menu vµ sè hiÖu cét ®−îc ch−¬ng tr×nh chÝnh
truyÒn sang .
§7. C¸c thuéc tÝnh cña kÝ tù
Mçi kÝ tù hiÓn thÞ trªn mµn h×nh ®−îc cÊt gi÷ trong hai byte bé nhí . Mét byte lµ m·
th«ng th−êng cña kÝ tù vµ byte kia lµ thuéc tÝnh cña nã . Byte thuéc tÝnh Ên ®Þnh diÖn m¹o
cña kÝ tù nh− chíp nh¸y , ®Ëm , g¹ch d−íi , ®¶o mµu . Ta cã thÓ dïng chuçi escape cña
ANSI ®Ó Ên ®Þnh thuéc tÝnh cña kÝ tù . Theo sau chuçi kÝ tù escape vµ ngoÆc vu«ng lµ con sè
vµ ch÷ m . Sau ®©y lµ danh s¸ch c¸c sè t¹o hiÖu øng trªn mµn h×nh :
2,3,6 mµu tèi
0
1
4
5
7
8
t¾t thuéc tÝnh , th−êng lµ mµu tr¾ng trªn nÒn ®en
®Ëm
g¹ch d−íi
chíp nh¸y
®¶o mµu
kh«ng thÊy ®−îc
Chuçi escape cã d¹ng nh− sau :
Sè hex 1B cña kÝ tù escape
Sè cho biÕt kiÓu thuéc tÝnh
16
“ \ x 1 B [ 10 m”
Chuçi nµy ®−îc gëi trong tiÕn tr×nh hiÓn thÞ . Mçi khi bËt mét thuéc tÝnh , tÊt c¶ c¸c kÝ tù sÏ
hiÓn thÞ theo thuéc tÝnh míi cho ®Õn khi nã t¾t ®i . Sau ®©y lµ ch−¬ng tr×nh biÓu diÔn c¸c
thuéc tÝnh cña kÝ tù
Ch−¬ng tr×nh 2-8 :
#define NORMAL "\x1B[Om"
#define BOLD
#define UNDER
#define BLINK
"\x1B[1m"
"\x1B[4m"
"\x1B[5m"
#define REVERSE "\x1B[7m"
main()
{
printf("normal%s blink %s normal \n\n",BLINK,NORMAL);
printf("normal%s bold %s normal \n\n",BOLD,NORMAL);
printf("normal%s underline %s normal \n\n",UNDER,NORMAL);
printf("normal%s reversed %s normal \n\n",REVERSE,NORMAL);
printf("%s%s reversed and blink %s \n\n",BLINK,REVERSE,NORMAL);
}
§8. Menu
Ta x©y dùng mét ch−¬ng tr×nh gåm 5 môc menu lµ Open ,Close,Save,Print,Quit . C¸c
phÝm mòi tªn lªn xuèng sÏ di chuyÓn vÖt s¸ng ®Õn c¸c môc cÇn chän.PhÝm INS ®Ó chän vµ
thùc hiÖn c«ng viÖc t−¬ng øng . Môc Quit sÏ kÕt thóc ch−¬ng tr×nh .
Ch−¬ng tr×nh 2-9 :
#define true 1
#define num 5
#define clear "\x1B[2J"
#define erase "\x1B[K"
#define normal
#define reverse
#define home"\x1B[1;1f"
#define bottom "\x1B[20:1f"
u_arro 72
"\x1B[Om"
"\x1B[7m"
#define
#define color "\x1B[4m"
/*#define l_arro
#define r_arro
#define d_arro 80
#define insert83
main()
75
77*/
{
static char *item[num]=
{
"Open",
"Close",
"Save",
"Print",
"Quit"
};
17
int curpos;
int code;
void display(char *[],int,int);
int getcode(void);
void action(int);
printf(clear);
curpos=0;
while(true)
{
display(item,num,curpos);
code=getcode();
switch (code)
{
case u_arro:if (curpos>0)
--curpos;
break;
case d_arro:if (curpos<num-1)
++curpos;
break;
case insert:action(curpos);
break;
}
}
}
void display(char *arr[],int size,int pos)
{
int j;
printf(home);
for (j=0;j<size;j++)
{
if (j==pos)
printf(reverse);
printf("%s\n",*(arr+1));
printf("%s%5s",color,*(arr+j));
printf(normal);
printf("%s"," ");
printf(home);
}
}
int getcode()
{
int key;
while(getch()!=0)
;
return (getch());
}
void action(int pos)
18
{
switch(pos)
{
case 0: printf("Open");
break;
case 1: printf("Close");
break;
case 2: printf("Save");
break;
case 3: printf("Print");
break;
case 4: exit();
}
}
§9. G¸n phÝm chøc n¨ng b»ng ansi.sys
Nhê g¸n chuçi vµo phÝm chøc n¨ng ta cã thÓ cÊu h×nh l¹i bµn phÝm ®amg dïng .
D¹ng thøc cña chuçi g¸n phÝm chøc n¨ng nh− sau :
m· escape gåm 1xB[
byte thø nhÊt cña m· më réng cho phÝm chøc n¨ng
dÊu ;
byte thø hai cña m· më réng cho phÝm chøc n¨ng
dÊu ;
chuçi cÇn g¸n
dÊu ;
xuèng dßng
ch÷ p
\ x 1 B [ 0 ; 68 ; “s” ; 13 p
Ch−¬ng tr×nh 2-10:
main()
{
char str[81];
int key;
clrscr();
printf("Nhap vao mot so cua phim chuc nang :");
gets(str);
key=atoi(str);
printf("Nhap vao mot chuoi de gan phim nay : ");
gets(str);
printf("\x1B[0;%d;\"%s\";13p",key+58,str);
}
19
Ch−¬ng 3 : NhËp vµ xuÊt d÷ liÖu
§1. Kh¸i niÖm chung
1. Kh¸i niÖm :Tr−íc ®©y chóng ta ®· xÐt viÖc nhËp d÷ liÖu tõ bµn phÝm. Trong nhiÒu tr−êng
hîp thùc tÕ , ®Ó thuËn lîi , chóng ta ph¶i nhËp d÷ liÖu tõ c¸c tËp tin trªn ®Üa . C¸c hµm th−
viÖn cña C cho phÐp truy cËp tËp tin vµ chia lµ 2 cÊp kh¸c nhau :
- c¸c hµm cÊp 1 lµ c¸c hµm ë cÊp thÊp nhÊt , truy cËp trùc tiÕp ®Õn c¸c tËp tin trªn
®Üa.C kh«ng cung cÊp vïng nhí ®Öm cho c¸c hµm nµy
- c¸c hµm cÊp 2 lµ c¸c hµm truy xuÊt tËp tin cao h¬n , do chóng ®−îc C cung cÊp
vïng nhí ®Öm
§èi víi c¸c hµm cÊp 1 , tËp tin ®−îc xem lµ khèi c¸c byte liªn tôc do ®ã khi muèn
truy cËp mÉu tin cô thÓ th× ph¶i tÝnh to¸n ®Þa chØ cña mÉu tin vµ nh− vËy c«ng viÖc vÊt v¶
h¬n . Ngoµi ra ph¶i cung cÊp vïng nhí ®Öm cho kiÓu ®äc ghi nµy. §èi víi c¸c hµm cÊp hai
c«ng viÖc nhÑ nhµng h¬n do :
- tr×nh biªn dÞch tù ®éng cung cÊp vïng kÝ øc ®Öm cho chóng
- cã thÓ truy xuÊt c¸c mÉu tin mµ kh«ng gÆp khã kh¨n nh− víi c¸c hµm cÊp 1
Trong C , c¸c th«ng tin cÇn thiÕt cho c¸c hµm xuÊt nhËp cÊp 2 ®−îc ®Æt trong tËp tin
stdio.h cßn c¸c th«ng tin vÒ hµm nhËp xuÊt cÊp 1 th× ë trong tËp tin io.h
2. Stream vµ c¸c tËp tin : Ta ph¶i ph©n biÖt hai thuËt ng÷ lµ stream vµ file .HÖ thèng xuÊt
nhËp cña C cung cÊp mét kh«ng gian t−ëng t−îng gi÷a ng−êi lËp tr×nh vµ c¸c thiÕt bÞ ®−îc
dïng . CÊp trung gian t−ëng t−îng nµy gäi lµ stream vµ thiÕt bÞ cô thÓ lµ tËp tin .
a. C¸c streams : Trong m¸y tÝnh ta dïng 2 lo¹i stream : v¨n b¶n vµ nhÞ ph©n . Mét
stream v¨n b¶n lµ mét lo¹t kÝ tù ®−îc tæ chøc thµnh dßng mµ mçi dßng ®−îc kÕt thóc b»ng
kÝ tù xuèng dßng newline(“\n”) . Khi ghi , mét kÝ tù chuyÓn dßng LF(m· 10) ®−cî chuyÓn
thµnh 2 kÝ tù CR( m· 13) vµ LF . Khi ®äc 2 kÝ tù liªn tiÕp CR vµ LF trªn tËp tin chØ cho ta
mét kÝ tù LF .
Mét stream nhÞ ph©n lµ mét lo¹t c¸c byte .
a. C¸c tËp tin : Trong C ,mét tËp tin lµ mét kh¸i niÖm logic mµ hÖ thèng cã thÓ ¸p
dông cho mäi thø tõ c¸c tËp tin trªn ®Üa cho ®Õn c¸c terminal .
Khi b¾t ®Çu thùc hiÖn
ch−¬ng tr×nh , m¸y tÝnh më 3 stream v¨n b¶n ®· ®−îc ®Þnh nghÜa tr−íc lµ stdin , stdout vµ
stderr . §èi víi hÇu hÕt c¸c hÖ thèng , c¸c thiÕt bÞ nµy lµ console
§2. NhËp xuÊt chuÈn
1. NhËp xuÊt kÝ tù , chuçi kÝ tù , ®Þnh d¹ng vµ b¶n ghi : NhËp xuÊt cÊp 2(nhËp xuÊt chuÈn
) cung cÊp 4 c¸ch ®äc vµ ghi d÷ liÖu kh¸c nhau (ng−îc l¹i nhËp xuÊt c©p1 chØ dïng 1 trong 4
c¸ch nµy) .
Tr−íc hÕt d÷ liÖu cã thÓ ®äc ghi mçi lÇn mét kÝ tù , t−¬ng tù nh− c¸ch lµm viÖc cña
putchar() vµ getche() ®Ó ®äc d÷ liÖu tõ bµn phÝm vµ hiÓn thÞ lªn mµn h×nh .
Thø hai , d÷ liÖu cã thÓ nhËp xuÊt theo chuçi b»ng c¸c dïng c¸c hµm gets() vµ puts()
Thø ba , d÷ liÖu cã thÓ ®−îc nhËp vµ xuÊt theo khu«n d¹ng b»ng c¸c hµm fprintf() vµ
fscanf()
Thø t− , d÷ liÖu ®−îc ®äc vµ ghi theo khèi cã chiÒu dµi cè ®Þnh th−êng dïng l−u tr÷
m¶ng hay cÊu tróc b»ng c¸c hµm fread() vµ fwrite() . Tãm l¹i :
C¸c hµm dïng chung cho hai kiÓu nhÞ ph©n vµ v¨n b¶n
fopen : dïng më tËp tin
21
Tải về để xem bản đầy đủ
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lập trình Turbo C (Phần 1)", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
- giao_trinh_lap_trinh_turbo_c_phan_1_turbo_c_nang_cao_va_c.pdf