Các cấu trúc lặp

Một phần của tài liệu Lập trình C cộng cộng - Phần 1 pps (Trang 25 - 80)

1/- Cấu trúc while:

a)- Cú pháp:

while (Biểu thức ĐiềuKiện) {

NhómLệnh; }

b)- Giải thích:

Biểu thức ĐiềuKiện phải được đặt trong cặp ngoặc đơn.

NhómLệnh bên dưới biểu thức ĐiềuKiện sẽ được thực hiện lặp đi lặp lại khi mà biểu thức ĐiềuKiện vẫn có giá trị khác không. Như vậy tất nhiên ở đâu đó trong đoạn lệnh của while phải có một lệnh làm thay đổi giá trị của biểu thức ĐiềuKiện.

Câu lệnh bên dưới ĐiềuKiện phải là một lệnh duy nhất hoặc là một lệnh ghép (nhiều lệnh đặt vào trong {})

c)- Hoạt động của while như sau:

Kiểm tra giá trị của biểu thức ĐiềuKiện.

Nếu biểu thức ĐiềuKiện có giá trị khác không.

• Thực hiện lệnh bên dưới.

• Quay lại kiểm tra biểu thức ĐiềuKiện.

Ngược lại: kết thúc cấu trúc while.

Hình minh họa tiến trình hoạt động của while.

d)- Cấu trúc while thường được dùng khi:

Cần thực hiện nhiều lần (lặp đị, lặp lại) một nhóm lệnh.

Trước khi cho nhóm lệnh thực hiện, cần kiểm tra một số điều kiện. Điểm vào vòng lặp while

Kiểm Tra giá trị của BTDK Giá trị của BTĐK bằng 0 (sai) Kết thúc vòng lặp while Giá trị của BTĐK khác 0 (đúng) Thực hiện NhómLệnh của while Quay lại kiểm tra BTĐK

2/- Cấu trúc for : a)- Công dụng:

Cũng có chức năng giống như while là lặp đi lặp lại một đoạn lệnh nào đó nhưng theo một mẫu khác.

Trong các trường hợp số lần lặp của vòng lặp là cố định thì việc sử dụng for sẽ thuận lợi và dễ dàng hơn. Ví dụ chương trình in n số nguyên dương đầu tiên lên màn hình (với n là một số nguyên) thì dùng for phù hợp hơn.

b)- Cú pháp:

for (các lệnh khởi tạo ; biểu thức điều kiện ; các lệnh tác động đến điều kiện)

{ NhómLệnh;

}

Các thành phần trong ngoặc của for đểu có thể vắng mặt tuy nhiên phải để dấu ;

c)- Hoạt động của for:

d)- Cấu trúc for thường được dùng khi:

Cần thực hiện nhiều lần (lặp đị, lặp lại) một nhóm lệnh.

Số lần lặp đã được xác định trước.

3/- Cấu trúc do-while:

a)- Công dụng:

Cả hai vòng lặp while và for điều kiểm tra BTĐK trước khi bắt đầu thực hiện lệnh của vòng lặp. Vì vậy, có khả năng lệnh của vòng lặp không được thực

Thực hiện các lệnh khởi tạo

Kiểm Tra giá trị của BTDK Giá trị của BTĐK bằng 0 (sai) Kết thúc vòng lặp for Giá trị của BTĐK khác 0 (đúng) Thực hiện NhómLệnh của for Quay lại kiểm tra BTĐK

Điểm vào vòng lặp for

Thực hiện các lệnh tác động đến BTĐK

Lê Văn Hạnh – Nguyễn Việt Hùng - Trần Đình Nghĩa - Ngô Tân Khai Feb09 26 Ví dụ: #include <iostream.h> #include <iomanip.h> void main() { char tiep; int so; tiep=’c’;

while (tiep==’c’ || tiep==’C’) { cout <<”Nhap mot so : ”; cin >>so;

if (so%2==0) cout <<”\nso vua nhap la so chan”; else cout <<”\nso vua nhap la so le”;

cout <<“\nco nhap so khac hay khong (c/k): “; cin >>tiep;

} }

Chương trình trên do dùng vòng lặp while ta phải có lệnh tiep=’c’ trước vòng lặp để bảo đảm vòng lặp sẽ thực hiền được một lần. Muốn bỏ lệnh này thì việc kiểm tra BTĐK phải được thực hiện ở cuối vòng lặp và vòng lặp

do – while là vòng lặp có đặc tính trên. b)- Cú pháp: do

{

NhómLệnh;

}while (biểu thức điều kiện);

c)- Hoạt động của do – while:

Điểm vào vòng lặp do - while

Kiểm Tra giá trị của BTDK Giá trị của BTĐK bằng 0 Kết thúc vòng lặp do-while Giá trị của BTĐK khác 0

Thực hiện lệnh của do-while

Quay lại lệnh đầu tiên ngay sau từ khóa do

d)- Cấu trúc do-while thường được dùng khi:

Cần thực hiện nhiều lần (lặp đị, lặp lại) một nhóm lệnh.

Việc kiềm tra điều kiện chỉ thực hiện sau khi người dùng cung cấp một số thông tin nhất định (có trong điều kiện kiểm tra).

4/- Các cấu trúc lồng nhau:

Toàn bộ một cấu trúc while, for, do-while được xen như một câu lệnh vì vậy ta có thể lồng ghép các cấu trúc này vào nhau.

Ví dụ: in các bảng cửu chương 2,3,4 lên màn hình

• Cách 1:

void main() { int i,j;

for (i=1;i<=9;i++) { for (j=2;j<=4;j++)

cout <<setw(3)<<j<<" * " <<setw(2)<<i<<"="<< setw(4)<<i*j; cout <<endl; } } • Cách 2: void main() { int i=1,j; while (i<=10) { for (j=2;j<=4;j++)

cout <<setw(3)<<j<<" * " <<setw(2)<<i<<"="<< setw(4)<<i*j; cout <<endl; i++; } } 5/- Lệnh break và continue: a)- break:

Công dụng: Thoát khỏi các cấu trúc switch, while, for, do-while tại thời điểm

break được gọi thi hành mà không cần kiểm tra kết quả của BTĐK.

Cú pháp : break;

Ví dụ: Viết chương trình tính tổng các số nguyên được nhập từ bàn phím chương trình kết thúc khi có một số âm được nhập.

Lê Văn Hạnh – Nguyễn Việt Hùng - Trần Đình Nghĩa - Ngô Tân Khai Feb09 28 #include <iostream.h> #include <conio.h> void main() { int so,tong=0; clrscr(); while (1)

{ cout <<"Nhap mot so nguyen: "; cin >>so;

if (so<0) break;

tong +=so; // tương đương với tong = tong +so

}

cout <<"\nTong cac gia tri da nhap la: "<<tong; getch();

}

Chương trình trên nếu không dùng break thì có thể viết như sau:

so=0;

while (so>=0)

{ cout <<"Nhap mot so nguyen: "; cin >>so;

if (so>=0) tong +=so;

}

b)- continue:

Công dụng: được sử dụng trong các vòng lặp như while, for ,do-while. Khi lệnh continue được gọi thì chương trình sẽ quay trở về đầu vòng lặp để bắt đầu lần lặp mới. Nếu có các lệnh còn lại (cùng trong vòng lặp) đặt sau

continue sẽ không được thực hiện.

Ví dụ: Viết chương trình tính tổng các số nguyên dương được nhập từ bàn phím chương trình kết thúc khi có một số =0 được nhập.

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

void main() { int so,tong=0; while (1)

{ cout <<"Nhap mot so nguyen>=0: "; cin >>so;

if (so=0) break; if (so<0)

{ cout <<”Du lieu khong hop le”; continue;

}

tong +=so;

}

cout <<"\nTong cac gia tri da nhap la: "<<tong; getch();

6/- Các lỗi thường gặp:

Lưu ý đến phần khởi tạo giá trị và phần biểu thức điều kiện tránh tình trạng vòng lặp có thể thực hiện thiếu hoặc dư một lần.

Ví dụ: for (i=1; i<11 ; i++) // sẽ thực hiện 10 lần for (i=1; i<=10 ; i++) // cũng thực hiện 10 lần for (i=0; i<11 ; i++) // thực hiện 11 lần

Sử dụng toán tử gán (=) thay vì toán tử quan hệ bằng (==) trong các biểu thức điều kiện, hay ngược lại với biểu thức khởi tạo trong for.

Sử dụng dấu phẩy (,) ngăn cách giữa 3 nhóm lệnh trong ngoặc của for thay vì chấm phẩy (;).

Lê Văn Hạnh – Nguyễn Việt Hùng - Trần Đình Nghĩa - Ngô Tân Khai Feb09 30

HAØM ( Function ) 3

I. TỔ CHỨC CHƯƠNG TRÌNH CÓ NHIỀU HAØM:

1/- Giới thiệu:

Trong thực tế, một chương trình mang tính chuyên nghiệp cần được thiết kế, viết chương trình và kiểm tra rất kỹ. Vấn đề đặt ra là làm thế nào để việc viết chương trình, kiểm tra chương trình được thuận lợi đạt hiệu quả cao, cũng như việc phát triển chương trình khi cần thiết sẽ dễ dàng. Điều này phụ thuộc ở khâu thiết kế tổ chức chương trình.

2. Khái niệm

Hàm là một đoạn chương trình độc lập thực hiện trọn vẹn một công việc nhất định sau khi thực hiện xong, hàm có thể sẽ trả về giá trị cho chương trình gọi nó.

3. Mục đích khi sử dụng các hàm con

Một chương trình thông thường sẽ có nhiều chức năng ta nên thiết kế mỗi chức năng như vậy là một hàm. Trong mỗi hàm này có thể sẽ được chia nhỏ thành nhiều hàm nữa . . . Khi các hàm chức năng đã được xây dựng hoàn chỉnh tất cả những hàm này sẽ được kết nối bởi hàm main, tại thời điểm này chúng ta sẽ không quan tâm đến chi tiết của các hàm chức năng nữa mà chỉ cần biết đầu ra (kết quả thực hiện) của những hàm này.

Tóm lại:

• Khi có một công việc giống nhau cần thực hiện ở nhiều vị trí.

• Khi cần chia một chương trình lớn phức tạp thành các đơn thể nhỏ (hàm con) để chương trình được trong sáng, dễ hiểu trong việc xử lý, quản lý việc tính toán và giải quyết vấn đề.

Lưu ý: khi tạo một hàm trong C++ chúng ta phải quan tâm hai điều:

• Nội dung của hàm.

• Sự tương tác của nó với những hàm khác, bao gồm việc truyền dữ liệu chính xác vào trong hàm khi gọi hàm thực hiện và giá trị mà hàm sẽ trả về khi thực hiện xong.

4. Cấu trúc một chương trình C++

a. Khối khai báo: Bao gồm các khai báo về:

• Sử dụng thư viện.

• Hằng số sẽ sử dụng trong chương trình.

• Hàm con (các nguyên mẫu hàm - prototype).

• Các biến toàn cục .

• Các kiểu dữ liệu tự định nghĩa.

Khối khai báo Hàm main() Các hàm con (nếu có)

b. Hàm chính (main())

Chứa các biến, các lệnh và các lời gọi hàm cần thiết trong chương trình.

c. Các hàm con:

• Được sắp xếp riêng rẽ, mỗi hàm nằm trên 1 đoạn riêng

• Các hàm nằm rời nhau Không đặt nội dung của hàm này chứa trong hàm khác, hoặc nội dung của 2 hàm có phần giao nhau.

• Không cần quan tâm thứ tự sắp xếp trước/sau của các hàm. 5. Ví dụ

//Khai báo thư viện hàm #include<conio.h> #include<stdio.h> #include<string.h> #include<dos.h> #include<process.h>

//Khai báo biến toàn cục và nguyên mẫu hàm void ThayThe(char * S, char *St );

void Doc1Sector(int vt); void Ghi1Sector(int vt); //Hàm chính

void main()

{ unsigned char buf[512]; char S[20], St[20];

cout<<"Nhap chuoi can tim: "; gets(S);

cout<<"Nhap chuoi thay the:"; gets(St) ;

cout<<"\nXin cho…"; TimVaThayThe(S,St,buf); cout<<"\n Thanh cong."; getch();

}

//Cài đặt các hàm con

void ThayThe(char * S, char *St ) { int l=strlen(St);

for(int i=0;i<l;i++) S[i]=St[i]; }

Lê Văn Hạnh – Nguyễn Việt Hùng - Trần Đình Nghĩa - Ngô Tân Khai Feb09 32

void Doc1Sector(int vt, char buf[512]) { if(absread(0,1,vt,buf))

{ cout<<"\n loi doc dia, nhan enter thoat"; getch();

exit(1); }

}

void Ghi1Sector(int vt, char buf[512]) { if(abswrite(0,1,vt,buf))

{ cout<<"\n loi ghi dia, nhan enter thoat"; getch();

exit(1); }

}

void TimVaThayThe(char * S, char *St, unsigned char buf[]) { for(int i=33;i<=500;i++) { Doc1Sector(i, buf); char * p=strstr(buf, S); if(p) { ThayThe(p, St); Ghi1Sector(i, buf); } } }

II.TRIỂN KHAI CÁC HAØM TRONG CHƯƠNG TRÌNH:

1/- Đặt tên cho hàm:

Mỗi hàm có một tên để phân biệt, tên hàm trong C++ được đặt theo quy tắc sau:(cũng là quy tắc đặt tên cho các danh định sau này)

Chỉ được dùng chữ cái, chữ số hoặc dấu _ để đặt tên hàm.

Ký tự đầu tiên phải là một chữ cái hoặc dấu _.

Tên hàm không được trùng tên với từ khóa.

Có phân biệt chữ hoa, chữ thường. Thông thường ta dùng chữ thường để đặt tên cho hàm, biến và chữ hoa đặt tên cho hằng.

Số ký tự tối đa là 31.

2/- Khai báo nguyên mẫu hàm (prototypes):

a)- Công dụng:

Nguyên mẫu của hàm dùng để mô tả :

• Kiểu dữ liệu trả về của hàm.

• Tên hàm.

• Trật tự của các tham số.

• Kiểu dữ liệu của những tham số mà nó sẽ nhận khi được gọi thực hiện.

Ngoại trừ hàm main tất cả các hàm khác (không phải hàm có sẵn của C++) có trong chương trình đều phải khai báo nguyên mẫu. Điều này giúp cho trình biên dịch phát hiện ra các lỗi sai sót về kiểu dữ liệu trả về của hàm cũng như số giá trị và kiểu dữ liệu của các giá trị truyền cho hàm khi nó được gọi thực hiện.

b)- Cú pháp khai báo một nguyên mẫu:

<Kiểu dữ liệu của hàm> Tên hàm ([ danh sách các tham số]); c)- Lưu ý:

Nguyên mẫu hàm thực chất là dòng đầu của hàm thêm dấu chấm phẩy (;)

vào cuối, tuy nhiên tham số trong nguyên mẫu hàm có thể bỏ phần tên.

Khi một hàm có nhiều tham số thì danh sách kiểu dữ liệu các tham số phải có dấu phẩy giữa hai kiểu.

Các prototype thường được khai báo ở đầu chương trình sau các dòng

#include. d)- Ví dụ:

int fmax(int, int); // phải có dấu chấm phẩy cuối khai float swap(int, char, char, double); // báo của mỗi hàm.

void display(double, double);

3/- Cách xây dựng một hàm con

a. Kiểu dữ liệu của hàm

Xác định dựa vào kết quả của bài toán (Output). Gồm 2 loại :

• void: Hàm không trả về giá trị. Những hàm loại này thường rơi vào những

nhóm chức năng: Nhập / xuất dữ liệu , thống kê, sắp xếp, liệt kê. void Tên_hàm (danh sách các tham số)

{ Khai báo các biến cục bộ

Các câu lệnh / khối lệnh hay lời gọi đến hàm khác.

}

• Kiểu dữ liệu cơ bản (rời rạc/ liên tục) hay kiểu dữ liệu có cấu trúc: Kiểu

dữ liệu tùy theo mục đích của hàm cần trả về giá trị gì thông qua việc phân tích bài toán. Những hàm loại này thường được sử dụng trong các trường hợp: Đếm, kiểm tra, tìm kiếm, tính trung bình, tổng, tích, . . .

<Kiểu dữ liệu> Tên_hàm ([danh sách các tham số])

{ <Kiểu dữ liệu> kq;

Lê Văn Hạnh – Nguyễn Việt Hùng - Trần Đình Nghĩa - Ngô Tân Khai Feb09 34

b. Lưu ý

Đối với những hàm trả về nhiều loại giá trị cho từng trường hợp cụ thể (chẳng hạn như kiểm tra: đúng hay sai, so sánh: bằng, lớn hơn hay nhỏ hơn, . . .) thì cần ghi chú rõ giá trị trả về là gì cho từng trường hợp đó.

4/- Định nghĩa hàm:

Định nghĩa hàm là viết nội dung của hàm đó. Mỗi hàm sẽ được định nghĩa một lần trong chương trình và có thể được gọi thực hiện bởi một hàm khác có trong chương trình.

Giống như hàm main mỗi hàm trong C++ gồm hai phần: phần tiêu đề của hàm (Function Header) và phần thân hàm (Function Body).

Nên đặt tên hàm theo quy ước đặt tên trong C sao cho tên gọi đúng với chức năng hay mục đích thực hiện của hàm và gợi nhớ.

Data_type function_name(parameter list) D(ịnh nghĩa hàm (không có dấu ; ở cuối)

{

Statements; nội dung chứa trong hàm

}

Ví dụ: Các khai báo nguyên mẫu hàm và tiêu đề hàm tương ứng;

• int fmax(int , int);

int fmax(int x, int y)

• void display(double , char ); void display(double m, char s)

• void mess(void); hoặc void mess(); void mess(void)

Nhận xét:

• Tiêu đề của một hàm thì gần tương tự như nguyên mẫu chỉ khác là ở cuối dòng không có dấu ; và danh sách các tham số trong tiêu đề phải có tên tham số.

• Tên các tham số hình thức do người lập trình đặt, và nó dùng để nhận các giá trị truyền từ bên ngoài vào khi hàm thực hiện.

Thân hàm: Bao gồm các lệnh các phép toán sẽ tác động lên các giá trị được truyên cho hàm thông qua các tham số hình thức, để tạo ra kết quả.

tên tham số hình thức

Ví dụ: Xem xét chương trình sau, chương trình in lên màn hình giá trị lớn nhất của hai số nguyên được nhập từ bàn phím, trong chương trình có một hàm findmax dùng để tìm giá trị lớn nhất trong hai số:

#include <iostream.h>

int findmax(int, int); //prototype void main()

{

int num1, num2;

cout <<”Nhập số thứ nhất: “; cin >>num1;

cout <<”Nhập số thứ 2: “; cin >> num2;

cout <<”Giá trị lớn nhất rong hai số vừa nhập là: “ <<findmax(num1,num2) <<endl;

}

int findmax(int x, int y) // Function Header {

if (x>=y) return x; // Function body else return y; // Function body }

5/- Lời gọi hàm:

Lời gọi hàm giống như một lệnh, nó xuất hiện trong chương trình khi có yêu cầu gọi thực hiện một hàm nào đó thực hiện. Lời gọi hàm bao gồm tên hàm các dữ liệu truyền cho hàm được gọi. Nếu nguyên mẫu của hàm có tham số thì khi gọi hàm phải truyền giá trị.

Trong ví dụ trên dòng lệnh findmax(num1,num2) trong hàm main là một lời gọi hàm. Trong đó:

• findmax : Tên hàm được gọi.

• num1,num2 :Dữ liệu truyền cho hàm.

Số lượng dữ liệu truyền cho hàm phải bằng số lượng tham số khi khai báo nguyên mẫu và đúng thứ tự đã khai báo (cùng kiểu dữ liệu của tham số).

III. PHÂN LOẠI THAM SỐ TRUYỀN CHO HAØM:

1/- Sử dụng tham số của hàm là tham trị

Tham số dạng này chỉ mang ý nghĩa là dữ liệu đầu vào.

Đặc điểm của cách dùng tham số này là: Khi hàm gọi truyền giá trị cho

các tham số của hàm được gọi (trực tiếp bằng hằng hoặc thông qua các biến), thì những tham số này sẽ nhận giá trị được truyền cho nó và lưu ở một vị trí khác trong bộ nhớ. Do đó việc tác động lên các tham số của

Lê Văn Hạnh – Nguyễn Việt Hùng - Trần Đình Nghĩa - Ngô Tân Khai Feb09 36

• Hàm gọi (chẳng hạnï như hàm main trong ví dụ trên) có thể dùng hằng hoặc biến để truyền giá trị cho tham số của chương trình được gọi, ví dụ như ta có thể gọi hàm findmax như sau: findmax(10,5) (giá trị truyền cho tham số x,y là hằng).

Một phần của tài liệu Lập trình C cộng cộng - Phần 1 pps (Trang 25 - 80)

Tải bản đầy đủ (PDF)

(80 trang)