Nguyên m!u hàm (function prototypes)

Một phần của tài liệu Giáo trình phương pháp lập trình - ĐH CÔNG NGHI pot (Trang 93 - 127)

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 toàn c c (n u có)

- Ph(n khai báo các bi n toà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 toà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à toá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

Một phần của tài liệu Giáo trình phương pháp lập trình - ĐH CÔNG NGHI pot (Trang 93 - 127)