1. Trang chủ
  2. » Địa lý lớp 12

Lập trình hướng đối tượng - Hàm trong C++

7 12 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Nội dung

[r]

(1)

chương 2

Hàm C++

Chương trình b y nh ng kh m i c a C++ vi cầ ữ ả ủ ệ xây d ng s d ng hàm Đó là:ự ụ

+ Ki u tham chi u vi c truy n d li u cho hàm b ng thamể ế ệ ề ữ ệ ằ chi u.ế

+ Đ i tham chi u h ng (const)ố ế ằ + Đ i có giá tr m c đ nhố ị ặ ị + Hàm tr c nự ế

+ Vi c đ nh nghĩa ch ng hàmệ ị + Vi c đ nh nghĩa ch ng toán tệ ị

§ Bi n tham chi u (Reference variable)ế ế

1.1 Hai lo i bi n dùng Cạ ế

Trước nói đ n bi n tham chi u, nh c l i lo iế ế ế ắ ạ bi n g p C là:ế ặ

Bi n giá tr dùng đ ch a d li u (nguyên, th c, ký t , )ế ị ể ứ ữ ệ ự ự Bi n tr dùng đ ch a đ a chế ỏ ể ứ ị ỉ

Các bi n đ u đế ề ược cung c p b nh có đ a ch Ví dấ ộ ị ỉ ụ câu l nh khai báo:ệ

double x , *px;

s t o bi n giá tr ki u double x bi n tr ki u double px.ẽ ế ị ể ế ỏ ể Bi n x có vùng nh byte, bi n px có vùng nh byte (n u dùngế ế ế mơ hình Large) Bi n x dùng đ ch a giá tr ki u double, ví dế ể ứ ị ể ụ l nh gán:ệ

x = 3.14;

s ch a giá tr 3.14 vào bi n x Bi n px dùng đ ch a đ a ch c aẽ ứ ị ễ ế ể ứ ị ỉ ủ m t bi n th c, ví d câu l nh:ộ ế ự ụ ệ

px = &x ;

s l u tr đ a ch c a bi n x vào tr px.ẽ ữ ị ỉ ủ ễ ỏ

1.2 Bi n tham chi u ế ế

Trong C++ cho phép s d ng lo i bi n th ba bi n thamử ụ ế ứ ế chi u So v i lo i bi n quen bi t nói trên, bi n có nh ngế ế ế ế ữ đ c m sau:ặ ể

+ Bi n tham chi u không đế ế ược c p phát b nh , khơng có đ aấ ộ ị ch riêng.ỉ

+ Nó dùng làm bí danh cho m t bi n (ki u giá tr ) nóộ ế ể ị s d ng vùng nh c a bi n Ví d câu l nh:ử ụ ủ ế ụ ệ

float u, v, &r = u ;

t o bi n th c u, v bi n tham chi u th c r Bi n r khôngạ ế ự ế ế ự ế c p phát b nh , m t tên khác (bí danh) c a u nóấ ộ ộ ủ dùng chung vùng nh c a bi n u ủ ế

Thu t ng : ậ Khi r bí danh (alias) c a u ta nói r tham chi uủ ế đ n bi n u Nh v y thu t ng đế ế ậ ậ ữ ược hi u nh nhau.ể

ý nghĩa: Khi r bí danh c a u r dùng chung vùng nh c a u,ủ ủ dó :

+ Trong m i câu l nh, vi t u hay vi t r đ u có ý nghĩa nhọ ệ ế ế ề nhau, đ u truy nh p đ n m t vùng nh ề ậ ế ộ

+ Có th dùng bi n tham chi u đ truy nh p đ n m t bi n ki uể ế ế ể ậ ế ộ ế ể giá tr ị

Ví d :ụ

int u, v, &r = u; r = 10 ; // u=10

cout << u ; // in s 10ố r++ ; // u = 11 ++ u ; // r = 12 cout << r ; // in s 12ố v = r ; // v=12

(2)

& r ; // Cho đ a ch c a uị ỉ ủ

Công d ng:ụ Bi n tham chi u ế ường s d ng làm đ iử ụ ố c a hàm đ cho phép hàm truy nh p đ n tham s bi n trongủ ể ậ ế ố ế l i g i hàm.ờ ọ

Vài ý v biề ến tham chi u: ế

a Vì bi n tham chi u khơng có đ a ch riêng, ch bí danhế ế ị ỉ ỉ c a m t bi n ki u giá tr nên khai báo ph i ch rõ thamủ ộ ế ể ị ả ỉ chi u đ n bi n Ví d n u khai báo:ế ế ế ụ ế

double &x ;

thì Trình biên d ch s báo l i: ị ẽ ỗ

Reference variable ‘x’ must be initialized

b Bi n tham chi u có th tham chi u đ n m t ph n t m ng,ế ế ể ế ế ộ ầ ả ví d :ụ

int a[10] , &r = a[5]; r = 25 ; // a[5] = 25

c Không cho phép khai báo m ng tham chi uả ế

d Bi n tham chi u có th tham chi u đ n m t h ng Khi nóế ế ể ế ế ộ ằ s s d ng vùng nh c a h ng có th làm thay đ i giá trẽ ụ ủ ằ ể ổ ị ch a vùng nh này.ứ

Ví dụ n u khai báo:ế int &s = 23 ;

thì Trình biên d ch đ a c nh báo (warning):ị ả Temporary used to initialize 's'

Tuy nhiên chương trình v n làm vi c Các câu l nh dẫ ệ ệ ưới v n th c hi n cho k t qu nh sau: ẫ ự ệ ế ả

s++;

cout << "\ns= " << s; // In s=24

Chương trình minh ho cách dùng bi n tham chi uạ ế ế đ n m t ph n t m ng c u trúc đ nh p d li u th c hi n cácế ộ ầ ả ấ ể ậ ữ ệ ự ệ phép tính trường c a ph n t m ng c u trúc.ủ ầ ả ấ

#include <iostream.h> #include <conio.h> struct TS

{

char ht[25]; float t,l,h,td; } ;

void main() {

TS ts[10],&h=ts[1]; // h tham chi u đ n ts[1]ế ế cout << "\n Ho ten: " ;

cin.get(h.ht,25) ;

cout << "Cac diem toan, ly, hoa: "; cin >> h.t >> h.l >> h.h ;

h.td = h.t + h.l + h.h ;

cout << "\n Ho ten: " << ts[1].ht; cout << "\n Tong diem: " << ts[1].td; getch();

}

1.3 H ng tham chi u (const)ằ ế

H ng tham chi u đằ ế ược khai báo theo m u:ẫ int n = 10 ;

const int &r = n;

Cũng gi ng nh bi n tham chi u, h ng tham chi u có th thamố ế ế ằ ế ể chi u đ n m t bi n ho c m t h ng Ví d :ế ế ộ ế ặ ộ ằ ụ

(3)

int n = 10 ;

const int &r = n ; // H ng tham chi u r tham chi u đ n bi n nằ ế ế ế ế const int &s=123 ; //H ng tham chi u s tham chi u đ n h ngằ ế ế ế ằ 123

S khác gi a bi n h ng tham chi u ch : Không choự ữ ế ằ ế ỗ phép dùng h ng tham chi u đ làm thay đ i giá tr c a vùng nhằ ế ể ổ ị ủ mà tham chi u.ế

Ví d :ụ

int y = 12, z ;

const int &py=y; // H ng tham chi u py tham chi u đ n bi n yằ ế ế ế ế y++; // Đúng

z = 2*py ; // Đúng z = 26

cout << y <<" "<< py; // In ra: 13 13

py=py+1; // Sai, Trình biên d ch thơng báo l i:ị ỗ // Cannot modify a const object

Cách dùng: H ng tham chi u cho phép s d ng giá tr ch aằ ế ụ ị ứ m t vùng nh , nh ng không cho phép thay đ i giá tr này.ộ ổ ị

H ng tham chi u thằ ế ường s d ng làm đ i c a hàm đử ụ ố ủ ể cho phép hàm s d ng giá tr c a tham s l i g i hàm,ử ụ ị ủ ố ọ nh ng tránh không làm thay đ i giá tr c a tham s ổ ị ủ ố

§ Truy n giá tr cho hàm theo tham chi uề ế

2.1 Hàm C

Trong C ch có m t cách truy n d li u cho hàm theo giá tr :ỉ ộ ề ữ ệ ị + C p phát vùng nh cho đ i.ấ ố

+ Gán giá tr tham s l i g i hàm cho đ i sau đóị ố ọ ố hàm làm vi c vùng nh c a đ i ch khơng liên quan gìệ ủ ố ứ đ n tham s ế ố

Nh vây chư ương trình s t o b n (các đ i) c a cácẽ ả ố ủ tham s hàm s thao tác b n này, ch không làmố ẽ ả ứ

vi c tr c ti p v i tham s Phệ ự ế ố ương pháp có nhược mể chính:

T n v th i gian b nh ph i t o b n sao.ố ề ộ ả ả Không thao tác tr c ti p tham s , v y khơng làm thayự ế ố ậ đ i đổ ược giá tr tham s ị ố

2.2 Truy n giá tr cho hàm theo tham chi uề ế

Trong C++ cung c p thêm cách truy n d li u cho hàm theoấ ề ữ ệ tham chi u b ng cách dùng đ i bi n tham chi u ho c đ i làế ằ ố ế ế ặ ố h ng tham chi u Cách có u m:ằ ế ể

Không c n t o b n c a tham s , ti t ki mầ ả ủ ố ế ệ b nh th i gian ch y máy.ộ

Hàm s thao tác tr c ti p vùng nh c a tham s , đóẽ ự ế ủ ố d dàng thay đ i giá tr tham s c n ễ ổ ị ố ầ

2.3 M i quan h gi a đ i tham s l i g i hàmố ệ ữ ờ ọ

N u đ i bi n ho c h ng tham chi u ki u K tham sế ố ế ặ ằ ế ể ố (trong l i g i hàm) ph i bi n ho c ph n t m ng ki u K Víờ ọ ả ế ặ ầ ả ể d :ụ

+ Đ i bi n ho c h ng tham chi u ki u double, tham s làố ế ặ ằ ế ể ố bi n ho c ph n t m ng ki u doubleế ặ ầ ả ể

+ Đ i bi n ho c h ng tham chi u ki u c u trúc, tham số ế ặ ằ ế ể ấ ố bi n ho c ph n t m ng ki u c u trúcế ặ ầ ả ể ấ

2.4 Các chương trình minh hoạ /*

Chương trình sau đượ ổc t ch c thành hàm:ứ Nh p d y s doubleậ ẫ ố

Hoán v bi n doubleị ế

S p x p d y s double theo th t tăng d nắ ế ẫ ố ứ ự ầ

Chương trình s nh p m t d y s in d y sau s p x pẽ ậ ộ ẫ ố ẫ ắ ế */

(4)

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

void nhapds(double *a, int n) {

for (int i=1; i<= n ; ++i) {

cout << "\nPhan tu thu " << i << " : " ; cin >> a[i] ;

} }

void hv(double &x, double &y) {

double tg=x; x=y; y= tg; }

void sapxep(double * a, int n) {

for (int i=1; i <= n-1 ;++i) for (int j=i+1 ; j<=n ;++j)

if (a[i] > a[j]) hv(a[i],a[j]); }

void main() {

double x[100]; int i, n;

cout <<"\n N= "; cin >> n;

nhapds(x,n); sapxep(x,n); for (i=1;i<=n;++i)

printf("\n%0.1lf",x[i]); getch();

} /*

Chương trình sau g m hàm:ồ

- Nh p d y c u trúc (m i c u trúc ch a d li u m t thí sinh)ậ ẫ ấ ỗ ấ ứ ữ ệ ộ - Hoán v bi n c u trúcị ế ấ

- S p x p d y thí sinh theo th t gi m c a t ng mắ ế ẫ ứ ự ả ủ ổ ể - In m t c u trúc (in h tên t ng m)ộ ấ ọ ổ ể

Chương trình s nh p d li u m t danh sách thí sinh, nh pẽ ậ ữ ệ ộ ậ m chu n in danh sách thí sinh trúng nể ẩ ể

*/

#include <iostream.h> #include <iomanip.h> #include <conio.h> struct TS

{

char ht[20]; float t,l,h,td; } ;

void ints(const TS &ts) {

cout << setiosflags(ios::showpoint) << setprecision(1) ;

cout << "\nHo ten: " << setw(20) << ts.ht << setw(6) << ts.td ; }

(5)

void nhapsl(TS *ts,int n) {

for (int i=1;i<=n;++i) {

cout << "\n Thi sinh " << i ; cout << "\n Ho ten: " ; cin.ignore(1);

cin.get(ts[i].ht,25) ;

cout << "Cac diem toan, ly, hoa: "; cin >> ts[i].t >> ts[i].l >> ts[i].h ; ts[i].td = ts[i].t + ts[i].l + ts[i].h ; }

}

void hvts(TS &ts1, TS &ts2) {

TS tg=ts1; ts1=ts2; ts2=tg; }

void sapxep(TS *ts,int n) {

for (int i=1;i<=n-1;++i) for (int j=i+1;j<=n;++j)

if (ts[i].td < ts[j].td) hvts(ts[i],ts[j]); }

void main() {

TS ts[100]; int n,i; clrscr();

cout << " So thi sinh: " ; cin >> n ;

nhapsl(ts,n); sapxep(ts,n) ; float dc;

cout << " Diem chuan: " ; cin >> dc;

cout << "\n\nDanh sach trung tuyen\n" ; for (i=1;i<=n;++i)

if (ts[i].td >= dc) ints(ts[i]); else

break; getch(); }

/*

Chương trình sau g m hàm:ồ Nh p m t ma tr n th c c p mxnậ ộ ậ ự ấ In m t ma tr n th c dộ ậ ự ướ ại d ng b ngả

Tìm ph n t l n nh t ph n t nh nh t c a d y s th c;ầ ấ ầ ỏ ấ ủ ẫ ố Chương trình s nh p m t ma tr n, in ma tr n v a nh p inẽ ậ ộ ậ ậ ậ ph n t l n nh t nh nh t m i hàng c a ma tr nầ ấ ỏ ấ ỗ ủ ậ */

#include <iostream.h> #include <iomanip.h>

(6)

tg = x.a[k][k] ; for (j=1 ; j<=n ; ++j)

{

x.a[k][j] /= tg; y.a[k][j] /= tg; }

/* Khu cot k : lam cho a[i,k] = voi i != k */ for (int i=1; i<= n ; ++i)

if (i != k) {

tg = x.a[i][k] ; for (j=1 ; j<=n ; ++j)

{

x.a[i][j] -= tg*x.a[k][j] ; y.a[i][j] -= tg*y.a[k][j] ; }

} } return y; }

void main() {

MT x,y,r,s; VT u,v; clrscr();

cout <<"\nNhap ma tran X " ; cin >> x; cout <<"\nNhap ma tran Y " ; cin >> y; cout <<"\nNhap ma tran R " ; cin >> r;

cout <<"\nNhap ma tran S " ; cin >> s; cout <<"\nNhap vec to u " ; cin >> u; v = !((x+y)*(r-s))*u ;

cout << "\nVec to v = xu " << v ; getch();

}

(7)

Ngày đăng: 10/03/2021, 14:05