Ch ng 5 : CONTR
9. Nguyên m!u hàm (function prototypes)
Trong C/C++, t t c các hàm ph i #c khai báo tr c khi chúng #c s d ng. Vi c này th c hi n b ng cách khai báo nguyên m!u c a hàm. Nguyên m!u hàm cho phép C/C++ cung c p ch c n$ng ki m tra s h#p l c a tham s khi nh ngh+a c)ng nh khi g i hàm. Khi biên d ch, trình biên d ch s d a vào nguyên m!u hàm ki m tra xem có s khơng h#p l nào c a các i s khi g i hàm và ki u c a các tham s hình th c trong nh ngh+a hàm. Nó c)ng ki m tra xem s i s cung c p khi g i hàm có phù h#p v i s tham s hình th c c a hàm.
D ng t ng quát c a m t nguyên m!u hàm:
type functionName(type parameter1, type parameter2, ...);
type: ki u d li u tr v b"i hàm
functionName: tên hàm
parameter1, parameter2,... : danh sách các tham s hình th c và
ki u c a chúng.
L u ý: Khai báo nguyên m!u hàm ph i có d u ch m ph y " cu i. Nh ng khi nh ngh+a hàm thì khơng có.
10. C$u trúc c a m t ch ng trình vi t d i d!ng hàm
- Ph(n khai báo các th vi n
- Ph(n khai báo các h ng tồn c c (n u có) - Ph(n khai báo các bi n tồn c c (n u có)
- Ph;n khai báo các nguyên m:u hàm (prototype)
- Ph(n hàm main (s g i các hàm th c hi n)
- Ph;n nh ngh.a các hàm ã 9c khai báo prototype
Ví d : Vi t ch ng trình nh p vào 2 s nguyên a,b và xu t ra màn
hình s l n nh t trong 2 s (s d ng hàm)
#include <iostream.h>// Khai báo th vi n iostream.h #include <conio.h>// Khai báo th vi n conio.h
int max(int x, int y);// khai báo nguyên m u hàm max
void main()//hàm main (s g i các hàm th c hi n)
{
int a, b;// khai báo bi n
cout<<” Nhap vao 2 so a, b "; cin>>a>>b;
cout<<”so lon nhat la:”<< max(a,b); getche();
}
int max(int x, int y)// nh ngh a hàm max(a,b)
{
return (x>y) ? x:y; }
BÀI T P CH NG 6
Vi t l i t t c bài t p ch ng 3 và 4 d i d ng hàm.
Ch ng 7
CHU I KÝ T
(Strings)
1. Gi i thi%u Chu,i
Trong C/C++, m t chu i là m t m ng ký t v i ký t null " cu i chu i. Ký t null (‘\0’ ) là ký t dùng k t thúc chu i. Nh v y, m t chu i bao g*m các ký t t o nên chu i và theo sau là ký t null. Khi khai báo m t m ng ký t dùng ch a chu i, ta c(n khai báo nó dài h n 1 byte ch a ký t null.
Ví d : khai báo m t m ng str ch a chu i có dài 10 ký t , ta ph i khai báo nh sau: char str[11];
H ng chu i là chu i #c bao quanh b"i c p d u nháy ơi. Ví d : "Hello" là m t h ng chu i. Ta không c(n thêm ký t null vào sau chu i vì trình biên d ch s làm i u này t ng.
2. Khai báo và kh7i t!o chu,i
Có 2 cách khai báo và kh"i t o chu i. Gi s khai báo và kh"i t o chu i “ Hello” .
Cách 1: Dùng m ng m t chi u char str[] = {‘H’ ,’ e’ ,’ l’ ,’ l’ ,’ o’ ,’ \0’ };
L u ý: trong tr %ng h#p này, ta phái thêm ký t null vào cu i. ho c
char str[] = “ Hello” ;
L u ý không cung c p ký t null.
Chu i trên #c l u tr trong b nh nh sau:
‘H’ ‘e’ ‘l’ ‘l’ ‘o’ ‘\0’
str[0] str[1] str[2] str[3] str[4] str[5]
Cách 2: Dùng con tr char *str = “ Hello” ;
3. Nh p chu,i
nh p d li u cho bi n chu i, ta dùng hàm gets() c a th vi n stdio.h. Hàm này có cú pháp sau:
char *gets(char *s);
Hàm gets() c các ký t t bàn phím (stdin) vào trong m ng tr n b"i s cho n khi nh n Enter. Ký t null s #c t sau sau ký t cu i cùng c a chu i nh p vào trong m ng.
Ho c ta có th dùng cin (Console INput). Cú pháp nh sau:
cin >> s;
4. Xu$t chu,i
xu t chu i ra màn hình, ta dùng hàm puts() c a th vi n stdio.h. Hàm này có cú pháp sau:
int puts(const char *s);
Ho c ta có th dùng cout (Console OUTput). Cú pháp nh sau:
cout << s;
5. M t s( hàm th vi%n thao tác trên chu,i
s d ng các hàm này, ta ph i khai báo dòng l nh sau: #include <string.h>
strcpy(s1, s2) Sao chép chu i s2 vào s1 strcat(s1, s2) N i chu i s2 vào cu i chu i s1 strlen(s1) Tr v dài c a chu i
strcmp(s1, s2) Tr v 0 n u s1 và s2 gi ng nhau, giá tr nh h n 0 n u s1<s2 và giá tr l n h n 0 n u s1>s2 strchr(s1, ch) Tr v con tr n v trí xu t hi n (u tiên c a ký t ch trong chu i s1 strstr(s1, s2) Tr v con tr n v trí xu t hi n (u tiên c a chu i s2 trong s1 6. M t s( ví d& v+ chu,i Ví d& 1: #include <stdio.h> #include <iostream.h> #include <string.h> void main() { char s1[80], s2[80];
cout << “Input the first string: “; gets(s1);
cout << “Input the second string: “; gets(s2);
cout << "Length of s1= “ << strlen(s1) << endl; cout << "Length of s2= “ << strlen(s2) << endl; if(!strcmp(s1, s2))
cout << "These strings are equal\n"; strcat(s1, s2);
cout << “s1 + s2: “ << s1 << endl;; strcpy(s1, "This is a test.\n"); cout << s1 << endl;
if(strchr("hello", 'e')) cout << "e is in hello\n"; if(strstr("hi there", "hi")) cout << "found hi"; }
Ví d& 2: Nh p m t chu i str, nh p m t ký t ch. Cho bi t ch xu t
hi n bao nhiêu l(n trong chu i str. #include <stdio.h> #include <iostream.h> #include <string.h> void main() { char str[80], ch; int num=0; cout << “Input str: “; gets(str); cout << “Input ch: “; cin >> ch;
for(int i=0 ; i<strlen(str) ; i++) if(str[i] == ch) num++;
cout << ch << “ is appeared “ << num << “ times.”; }
7. M ng các chu,i
t o m t m ng các chu i, dùng m t m ng ký t hai chi u. Kích th c c a ch, m c th nh t là s chu i và kích th c c a ch, m c th hai xác nh chi u dài l n nh t c a m i chu i.
an mã d i ây khai báo m t m ng c a 5 chu i, m i chu i có chi u dài t i a là 79 ký t .
char str[5][80];
nh p d li u cho chu i th nh t t bàn phím, ta dùng l nh: gets(str[0]);
cin >> str[0] //Tuong duong voi lenh tren
xu t chu i th hai ra màn hình, ta dùng l nh: puts(str[1]);
Khai báo và kh"i t o m ng các chu i
char arrayList[][length] = { constantString1, constantString2, ...
constantStringN};
arrayList: Tên c a m ng chu i
constantString1, ..., constantStringN : Các h ng chu i
Ví d : khai báo m t m ng danh sách các ngơn ng l p trình thơng d ng, ta khai báo nh sau:
char listOfPL[][10] = {“ Pascal” , “ C/C++” , “ CSharp” , “ Java” , “ VB” };
Câu l nh trên s khai báo m ng listOfPL g*m 5 chu i. M ng chu i trên #c l u tr trong b nh nh sau:
P a s c a l ‘\0’ C / C + + ‘\0’ C S h a r p ‘\0’ J a v a ‘\0’ V B ‘\0’ L u ý v trí c a các ký t null Ví d :
Nh p tên c a 5 ng %i dùng m ng char hai chi u, in chúng ra màn hình.
#include <stdio.h> #include <iostream.h> #include <string.h> void main()
{
char name[5][20];
for(int i=0 ; i<5 ; i++) {
cout << “Input name “ << i+1 <<”: “; cin >> name[i];
}
cout << “List of names: “; for(int i=0 ; i<5 ; i++)
cout << name[i] << “, “; }
8. M ng con tr8 n các chu,i
Ngoài cách dùng m ng ký t hai chi u l u tr m ng các chu i, ta có th dùng m ng c a các con tr . M i con tr s ch a a ch, c a chu i.
C)ng ví d nh ph(n trên, ta dùng m ng con tr
char *listOfPL[] = {“Pascal”, “C/C++”, “CSharp”, “Java”, “VB”};
M ng con tr trên có th #c l u tr trong b nh nh sau:
Giá tr 120 145 189 210 272 a ch, b nh 65514 65516 65518 65520 65522
listOfPL[0] listOfPL[1] listOfPL[2] listOfPL[3] listOfPL[4]
P a s c a l ‘\0’ 120 C / C + + ‘\0’ 145 J a v v ‘\0’ 210 C S h a r p ‘\0’ 189 V B ‘\0’ 172
Ví d : Nh p tên c a 5 ng %i dùng m ng con tr , in chúng ra màn hình. #include <stdio.h> #include <iostream.h> #include <string.h> #include <stdlib.h> void main() { char *name[5];
for(int i=0 ; i<5 ; i++)
name[i] = (char *)malloc(20); for(int i=0 ; i<5 ; i++)
{
cout << "Input name " << i+1 <<": "; gets(name[i]);
}
cout << "List of names: "; for(int i=0 ; i<5 ; i++)
cout << name[i] << ", "; }
BÀI T P CH NG 7
1. Vi t ch ng trình nh p m t chu i ký t t bàn phím, xu t ra màn hình mã ASCII c a t ng ký t v a nh p vào (m i ký t trên m t dòng).
2. Vi t ch ng trình nh p m t chu i ký t t bàn phím, xu t ra màn hình o ng #c c a chu i ó. Ví d o c a “ abcd egh” là “ hge dcba” .
3. Vi t ch ng trình nh p m t chu i ký t và ki m tra xem chu i ó có i x ng khơng.
Ví d : ABCDEDCBA là i x ng.
4. Nh p vào m t chu i ký t b t k/, hãy m s l(n xu t hi n c a m i lo i ký t .
5. Vi t ch ng trình nh p vào m t chu i ký t .
a) In ra màn hình t bên trái nh t và ph(n cịn l i c a chu i. Ví d : “ Nguy-n V$n Minh” in ra thành: Nguy-n V$n Minh b) In ra màn hình t bên ph i nh t và ph(n cịn l i c a chu i. Ví d : “ Nguy-n V$n Minh” in ra thành: Minh Nguy-n V$n
6. Vi t ch ng trình nh p vào m t chu i r*i xu t chu i ó ra màn hình d i d ng m i t m t dòng. Ví d : “ Nguy-n V$n Minh” In ra : Nguy-n V$n Minh 7. Vi t ch ng trình nh p vào m t chu i, in ra o ng #c c a chu i ó theo t ng t .
Ví d : “ Nguy-n V$n Minh” o thành “ Minh V$n Nguy-n” 8. Vi t ch ng trình i s ti n t s thành ch .
9. Vi t ch ng trình nh p vào h và tên c a m t ng %i, c t b các kho ng tr ng không c(n thi t (n u có), tách tên ra kh i h và tên, in tên lên màn hình. Chú ý n tr %ng h#p c h và tên ch, có m t t .
10. Vi t ch ng trình nh p vào h và tên c a m t ng %i, c t b các kho ng tr ng bên ph i, trái và các kho ng tr ng khơng có ngh+a trong . In ra màn hình tồn b h tên ng %i ó d i d ng ch hoa, ch th %ng.
11. Vi t ch ng trình nh p vào m t danh sách h và tên c a n
ng %i theo ki u ch th %ng, i các ch cái (u c a h , tên và ch
lót c a m i ng %i thành ch hoa. In k t qu lên màn hình.
12. Vi t ch ng trình nh p vào m t danh sách h và tên c a n
ng %i, tách tên t ng ng %i ra kh i h và tên r*i s p x p danh sách
Ch ng 8
STRUCTURES – ENUM - typedef
Ngôn ng C/C++ a ra 5 cách t o nên m t ki u d li u tùy
bi n (custom data types).
1. Ki u c u trúc (structure): Là m t nhóm c a các bi n #c nh ngh+a d i m t tên. Ki u này còn g i là ki u d li u ph c h#p
(compound data types).
2. bit-field: là m t bi n th c a ki u structure và cho phép d- dàng truy c p n t ng bit riêng r .
3. Union: cho phép cùng m t m!u b nh #c nh ngh+a nh hai hay nhi u ki u bi n khác nhau.
4. Enumeration: là danh sách c a c a các tên h ng nguyên.
5. T khóa typedef: nh ngh+a m t tên khác cho m t ki u d li u ã có.
Trong ph(n này ch, th o lu n structures, enumerations, và typedef.
1. Structures
M t c u trúc là m t t p các bi n #c tham chi u thông qua m t tên chung. M t khai báo c u trúc hình thành m t khuôn m!u
(template) mà có th dùng t o nên các bi n c u trúc có cùng
ki u. Nh ng bi n mà t o nên c u trúc #c g i là các thành viên
(members).
Nói chung, t t c các thành viên c a m t c u trúc v m t logic là có liên quan v i nhau. Ví d sau ây khai báo m t c u trúc address g*m các thông tin v m t a ch,. T khóa struct dùng khai báo m t c u trúc. Xem xét khai báo sau:
struct addr
{ char name[30]; char street[40]; char city[20]; char state[3];
unsigned long int zip; };
T i th%i i m này, ta m i ch, có khai báo m t c u trúc. khai báo m t ho c nhi u bi n có ki u address, ta dùng tên c u trúc nh b t k/ ki u d li u nào. Ví d , khai báo 2 bi n ki u address, ta khai báo nh sau:
address addr1, addr2;
Khi m t bi n c u trúc #c khai báo, trình biên d ch t ng c p phát b nh cho t t c thành viên c a c u trúc.
1.1. D!ng t/ng quát c a m t khai báo c$u trúc
struct structureName { type member1; type member2; ... type memberN; .. . } varNames; structureName: Tên c a c u trúc type: Ki u d li u c a thành viên t ng ng
member1, member2, ..., memberN: Tên các bi n thành viên c a
c u trúc
varNames: Tên các bi n c u trúc phân cách nhau b ng d u ph y.
1.2. Truy c p các thành viên c a bi n c$u trúc
Toán t d u ch m (dot operator) dùng truy c p (access) các thành viên c a m t bi n c u trúc. D ng t ng quát truy c p m t thành viên c a m t bi n c u trúc là:
structureName.memberName
struct coordXY { int x;
int y; } diemA, diemB;
gán giá tr t a cho diemA, ta dùng các l nh sau: diemA.x = 100;
diemA.y = 200;
in t a i m A, ta dùng l nh sau:
cout < “A(“ << diemA.x << “,” << diemA.y << “)”;
1.3. L%nh gán c$u trúc
N i dung trong 1 bi n c u trúc có th gán cho m t bi n c u trúc khác có cùng ki u dùng m t câu l nh gán. Ví d , gán n i dung bi n c u trúc pointA cho bi n pointB, ta th c hi n l nh sau:
pointB = pointA;
Sau câu l nh này, bi n pointB có cùng n i dung nh bi n pointA. Tuy nhiên, ta c)ng có th sao chép t ng thành viên nh sau:
pointB.x = pointA.x; pointB.y = pointA.y;
Ví d : Khai báo, nh p và xu t c u trúc book g*m các thông tin title, author, pages, price.
#include <iostream.h> #include <stdio.h> void main()
{ struct book { char title[30]; char author[20]; int pages;
float price; };
cout << “Input book information:” << endl; cout << “Title: “; gets(b.title);
cout << “Author: “; gets(b.author);
cout << “Number of pages: “; cin >> b.pages; cout << “Price: “; cin >> b.price;
cout << “Information of this book is:” << endl; cout << “Title: “ << b.title << endl;
cout << “Author: “ << b.author << endl; cout << “Pages: “ << b.pages << endl; cout << “Price: “ << b.price << endl; }
1.4. M ng các c$u trúc
khai báo m t m ng các c u trúc, (u tiên ta khai báo c u trúc, sau ó khai báo m t m ng c a c u trúc ó. Ví d , khai báo m ng points có 100 ph(n t , ta khai báo nh sau:
coordXY points[100];
truy c p (access) n t ng thành viên c a t ng ph(n t c a
m ng, ta dùng ch, m c c a ph(n t và tốn t thành viên (.). Ví d , gán t a x,y cho ph(n t th 10, ta dùng các l nh:
points[9].x = 100; points[9].y = 200;
1.5. Truy+n các c$u trúc vào hàm
a. Truy+n các thành viên c a bi n c$u trúc vào hàm
Khi ta truy n m t thành viên c a m t c u trúc vào m t hàm, ta th t s truy n giá tr c a thành viên ó cho tham s hình th c c a hàm (truy n tham tr ). N u mu n truy n a ch, c a thành viên cho hàm (truy n tham chi u) ta t phía tr c d u &.
Ví d : Gi s ta có hàm int distanceAB(int x1, int y1, int x2, int y2) tính kho ng cách gi a 2 i m. tính kho ng cách gi a 2 i m nào ó, ta truy n t a x,y c a 2 i m t ng ng. Ta dùng l nh sau:
length1 = distance(pointA.x, pointA.y, pointB.x, pointB.y); L nh trên g i hàm distance và truy n t a x,y c a hai i m A,B. K t qu th c hi n hàm tr v gán cho bi n length1.
truy n a ch, c a thành viên c a c u trúc vào hàm dùng toán t & t phía tr c tên bi n c u trúc ch không t tr c tên c a thành viên c a bi n c u trúc.