kiem tien, kiem tien online, kiem tien truc tuyen, kiem tien tren mang
Friday, October 28, 2011

CHƯƠNG 9: HÀM ( FUNCTION) VÀ LÊNH GÔP ( MACRO)

Tác dụng khi sử dụng chương trình con:
1)      Trong khi viết chương trình, chúng ta thường gặp những đoạn chương trình được lặp đi lặp lại nhiều lần ở những chỗ khác nhau. Để tránh rườm rà, ta thay thế các đoạn này bằng chương trình con tương ứng và khi cần, ta chỉ việc gọi chương trình con đó ra( với các tham số tương ứng cần thiết) mà không cần viết lại cả khúc chương trình đó.
2)      Một vấn đề lớn và phức tạp sẽ tương ứng với một chương trình có thể rất lớn và rất dài. Việc nhìn tổng quan cả chương trình cũng như việc gỡ rối, hiệu chỉnh sẽ rất khó khăn. Ta có thể phân tách vấn đề phức tạp thành các vấn đề nhỏ hơn ( tương ứng với các chương trình con, những khối, những modun) để dễ kiểm tra, gỡ rối từng khối một và sau đó ghép lại thành chương trình lớn. Việc lại dựa trên nguyên tắc “ chia để trị, chia để dễ điều khiển”.

Overloading functions: tạo thêm phương án mới cho hàm
Một ví dụ:
int ham_cua_toi ( int, int);
int ham_cua_toi ( long, long);
int ham_cua_toi ( long);
overloaded function có thể dịch là đa dạng hóa hàm, là định nghĩa thêm chức năng cho hàm. Overloaded function được hiểu là hàm nhiều phương án thực hiện, nhiều phương án tác chiến, để phân biệt với hàm đơn chỉ có duy nhất một tình huống thực hiện. Mỗi khi gọi đến tên hàm có nhiều phương án, chương trình dịch sẽ tìm đến phương án thực hiện thích hợp nhờ sự khác nhau giữa các dãy tham số.
Dùng hàm ( function ) hay macro?
Bên cạnh hàm, C/C++ còn có một loại giúp ta tránh khỏi sự rườm rà khi viết chương trình và tiết kiệm thời gian. Đó là macro.
Macro là tập hợp các lệnh và biểu thức được đại diện bằng 1 tên nào đó. Khi dịch, nếu C/C++ gặp các Macro này nó sẽ thay thế tên bằng tập hợp lệnh của nó.
#define tên_macro dãy _văn_ bản
Như vậy #define là chỉ dẫn đặt tên của C/C++

Điểm giống giữa macro và hàm:
Chỉ cần dùng tên hàm và tên macro là đã làm được nhiều việc. Do đó vừa tiết kiệm được thời gian, vừa tránh được sai sót , lại làm cho chương trình sáng sủa, dễ đọc, dễ nhìn…
Điểm khác:
1)      Chương trình viết với macro sẽ dài hơn vì tên của macro là cả một tập hợp các lệnh. Gọi n lần thì cần n lần bộ nhớ của tập hợp các lệnh của macro. Trong khi đó dùng hàm thì chương trình sẽ bé hơn. Dùng n lần gọi hàm thì bộ nhớ cũng chỉ tương đương xấp xỉ 1 lần.
2)      Chương trình chạy với macro sẽ chạy nhanh hơn một chút vì không phải mất thủ tục gọi hàm. Song đây không phải là ưu điểm mà bạn cần để ý.
3)      Chỉ nên dùng macro với các cụm lệnh đơn giản. Nếu cụm lệnh macro dài quá thì kém tác dụng.
4)      Macro được viết ra với sự thích nghi của các kiểu dữ liệu. Song macro không có tính đệ qui, không có tính modun hóa như hàm.

Một số hàm thông dụng:
Hàm tạo số ngẫu nhiên:
Hàm random ( num)
Là hàm tạo các số ngẫu nhiên nằm trong khoảng từ 0 tới num-1
Hàm rand() tạo số ngẫu nhiên nằm trong khoảng 0 đến 32767
Hàm randomize() tạo điểm xuất phát ngẫu nhiên cho các hàm rand() và random() nói trên.

//Example 9.18.cpp

#include<stdlib.h>
#include<iostream>
#include<time.h>

using namespace std;

// Output numbers random from 0 to 99

int main()
{
    srand(time(0));
    cout<<"Random number is from 0 to 99 : " << rand()%100
    ;
    cout<< endl;
    system("pause");
    return 0;
}


Vn đ sinh s ngu nhiên trong C++

I. Các th
ư vin liên quan đến vn đ sinh s ngu nhiên

1. Th
ư vin stdlib.h

Th
ư vin này bao gm các chc năng liên quan đến vic cp phát, gii phóng b nh; Chuyn đi các kiu d liu; Điu khin tiến trình; Sp xếp và tìm kiếm d liu; Mt s phép tính toán hc.

Trong b
ài viết này, ta ch làm vic vi 2 hàm rand() và srand() cùng vi hng s RAND_MAX trong thư vin stdlib.h

2. Th
ư vin time.h

Th
ư vin này cung cp các hàm làm vic vi thi gian.

Trong b
ài viết này, ta ch làm vic vi 2 hàm time() và kiu d liu time_t trong thư vin time.h

II. Các hàm, h
ng s và kiu d liu liên quan đến vn đ sinh s ngu nhiên

1. H
ng s RAND_MAX (nm trong thư vin stdlib.h)

H
ng s RAND_MAX là mt hng s nguyên, nó đi din cho giá tr ln nht mà có th được tr v t hàm rand(). Giá tr ca RAND_MAX = 7FFFH = 32767D

Đ
biết giá tr ca RAND_MAX ta có th s dng đon chương trình sau:

#include <stdlib.h>
#include <iostream.h>

void main()
{
cout << "Gia tri cua RAND_MAX la: " << RAND_MAX << endl;
}

2. Hàm rand() (n
m trong thư vin stdlib.h)

Cú pháp:
int rand();

Hàm rand() đ
ược s dng đ sinh ra mt s nguyên ngu nhiên nm trong khong t 0 đến RAND_MAX.

Ta s
dng đon chương trình sau đ sinh ra mt s nguyên ngu nhiên nm trong khong t 0 đến RAND_MAX.

#include <stdlib.h>
#include <iostream.h>

int main()
{
int so_nguyen_ngau_nhien = rand();
cout << so_nguyen_ngau_nhien << endl;
}

Nh
n xét: Ta nhn thy là mi khi chy li chương trình ta đu nhn được mt s nguyên ging nhau nm trong khong t 0 đến RAND_MAX. Đ gii quyết vn đ này ra s phi s dng hàm srand() khi bt đu chy chương trình (ta s tìm hiu hàm srand() phn dưới)

3. Ki
u d liu time_t (nm trong thư vin time.h)

Ki
u d liu time_t được khai báo trong time.h như sau:

typedef long time_t;

Ta th
y rng time_t là mt s nguyên kiu long và nó mô t s giây đã trôi qua được tính t đim mc là 0 gi 0 phút 0 giây ngày mùng 1 tháng 1 năm 1970.

Ta s
dng đon mã sau đ biết khong thi gian t 00:00:00 ngày 01/01/1970 đến thi đim hin ti là bao nhiêu giây:

#include <time.h>
#include <iostream.h>

void main()
{
time_t seconds;

time(&seconds);
cout << seconds << endl;
}

4. Hàm time() (nm trong thư vin time.h)

Cú pháp:
time_t time (time_t *timer);

Hàm time() đ
ược s dng đ ly s giây tính t 0 gi 0 phút 0 giây ngày 1 tháng 1 năm 1970 cho đến thi đim hin ti.

Ch
ú ý:
- N
ếu con tr timer bng NULL thì s giây s được tr v cho hàm.
- N
ếu con tr timer khác NULL thì s giây s được tr v cho c tham s là con tr timer và c cho hàm.

Ta th
y đon mã dưới hai biến seconds, my_seconds và return_seconds đu có giá tr như nhau và giá tr đó th hin khong thi gian t 00:00:00 ngày 01/01/1970 đến thi đim hin ti là bao nhiêu giây:

#include <time.h>
#include <iostream.h>

void main()
{
time_t seconds;
time_t my_seconds;
time_t return_seconds;

seconds = time(&my_seconds);
return_seconds = time(NULL);

cout << seconds << endl;
cout << my_seconds << endl;
cout << return_seconds << endl;
}

5. Hàm srand() (nm trong thư vin stdlib.h)

Cú pháp:
void srand (unsigned int seed);

Hàm này đ
ược s dng đ đt đim bt đu cho vic sinh s ngu nhiên ca hàm rand(). Tham s seed chính là đim bt đu đ sinh s ngu nhiên.

Ta th
y rng nếu dùng hàm rand() mà không s dng hàm srand() đ đt đim bt đu thì mi ln chy chương trình hàm rand() s sinh ra các con s tương t nhau. Đ gii quyết vn đ này ta s đt hàm srand() phía trên hàm rand() và thay đi giá tr ca tham s seed trong hàm srand() mi khi bt đu chy chương trình. Vic thay đi này, ta s s dng giá tr tr v ca hàm time() đ làm giá tr cho seed bi ti mi thi đim thì giá tr tr v ca hàm time() là khác nhau. Cách viết c th như sau: srand ( (unsigned) time(NULL) );

Ch
ú ý:
- N
ếu seed = 1 thì kết qu s ngu nhiên do rand() sinh ra tương t như không có hàm srand() phía trên.

- N
ếu seed là mt hng s nguyên không đi thì mi khi chy chương trình, mc dù có hàm srand() phía trên hàm rand() thì s ngu nhiên được sinh ra vn là mt con s ging nhau (Điu này được gii thích bi đim bt đu vào chương trình do hàm srand() xác đnh là như nhau)

Đon chương trình sau s sinh ra mt s ngu nhiên trong khong t 0 đến RAND_MAX và mi ln chy li thì chương trình s không sinh ra các s ging nhau na.

#include <stdlib.h>
#include <time.h>
#include <iostream.h>

void main()
{
srand((unsigned)time(NULL)); //unsigned đ
xác đnh là s không du
int random_integer = rand();
cout << random_integer << endl;
}

III. Sinh s
ngu nhiên trong mt khong xác đnh trước

1. Sinh s
nm trong khong t 0 cho đến n (vi n <= RAND_MAX)

#include <stdlib.h>
#include <time.h>
#include <iostream.h>

void main()
{
int random_integer;
int n;

cout << "Nhap so n voi n nho hon RAND_MAX: "; cin >> n;

srand((unsigned)time(NULL));

for(int index=0; index<20; index++)
{
random_integer = (rand() % n)+1;
cout << random_integer << endl;
}
}

2. Sinh s
nm trong khong [a, b] (vi 0 <= a <= b <= RAND_MAX)

#include <stdlib.h>
#include <time.h>
#include <iostream.h>

void main()
{
srand((unsigned)time(0));

int random_integer;
int a, b;

cout << "Nhap vao khoang [a, b]: "; cin >> a >> b;

int range=(b-a)+1;

for(int index=0; index<20; index++)
{
random_integer = a + int(range*rand()/(RAND_MAX + 1.0));
cout << random_integer << endl;
}
}

Các hàm thời gian
Đó là những hàm xác lập và đọc thời gian, xác lập và đọc ngày- tháng. Các hàm này nằm trong tệp <DOS.h>.
Ngày – tháng và thời gian được lưu trữ và vận hành nhờ một hệ thống đồng hồ và bộ nhớ thường trực trong máy. Vì vậy bạn có thể dùng nó như là một đồng hồ làm việc hàng ngày.

Tham khảo:
Ngôn ngữ lập trình C++  ( Quách Tuấn Ngọc)


0 comments:

Post a Comment

domain, domain name, premium domain name for sales

Popular Posts