Tác giả phạm hồng thái bài giảng ngôn ngữ LẬp trình c/C++



tải về 1.98 Mb.
trang16/55
Chuyển đổi dữ liệu07.07.2016
Kích1.98 Mb.
1   ...   12   13   14   15   16   17   18   19   ...   55

Lối ra của vòng lặp: break, continue

Lệnh break


Công dụng của lệnh dùng để thoát ra khỏi (chấm dứt) các câu lệnh cấu trúc, chương trình sẽ tiếp tục thực hiện các câu lệnh tiếp sau câu lệnh vừa thoát. Các ví dụ minh hoạ bạn đọc có thể xem lại trong các ví dụ về câu lệnh switch, for, while.

Lệnh continue


Lệnh dùng để quay lại đầu vòng lặp mà không chờ thực hiện hết các lệnh trong khối lệnh lặp.

: Giả sử với mỗi i từ 1 đến 100 ta cần thực hiện một loạt các lệnh nào đó trừ những số i là số chính phương. Như vậy để tiết kiệm thời gian, vòng lặp sẽ kiểm tra nếu i là số chính phương thì sẽ quay lại ngay từ đầu để thực hiện với i tiếp theo.

int i ;

for (i = 1; i <= 100; i++) {



if (i là số chính phương) continue;

{ // dãy lệnh khác



.

.

.

}

}



(Để kiểm tra i có là số chính phương chúng ta so sánh căn bậc hai của i với phần nguyên của nó. Nếu hai số này bằng nhau thì i là số chính phương. Cụ thể nếu sqrt(i) = int(sqrt(i)) thì i là số chính phương. Ở đây sqrt(x) là hàm trả lại căn bậc hai của x. Để sử dụng hàm này cần phải khai báo file nguyên mẫu math.h.)

So sánh cách dùng các câu lệnh lặp


Thông qua các ví dụ đã trình bày bạn đọc có thể thấy rằng về mặt thực chất để tổ chức một vòng lặp chúng ta có thể chọn một trong các câu lệnh goto, for, while, do … while, có nghĩa về mặt khả năng thực hiện các câu lệnh này là như nhau. Tuy nhiên, trong một ngữ cảnh cụ thể việc sử dụng câu lệnh phù hợp trong chúng làm cho chương trình sáng sủa, rõ ràng và tăng độ tin cậy lên cao hơn. Theo thói quen lập trình trong một số ngôn ngữ có trước và dựa trên đặc trưng riêng của từng câu lệnh, các lệnh lặp thường được dùng trong các ngữ cảnh cụ thể như sau:

FOR thường được sử dụng trong những vòng lặp mà số lần lặp được biết trước, nghĩa là vòng lặp thường được tổ chức dưới dạng một (hoặc nhiều) biến đếm chạy từ một giá trị nào đó và đến khi đạt được đến một giá trị khác cho trước thì dừng. Ví dụ dạng thường dùng của câu lệnh for là như sau:

for (i = gt1 ; i <= gt2 ; i++) … tức i tăng từ gt1 đến gt2 hoặc

for (i = gt2 ; i >= gt1 ; i--) … tức i giảm từ gt2 xuống gt1

Ngược lại với FOR, WHILE và DO … WHILE thường dùng trong các vòng lặp mà số lần lặp không biết trước, chúng thường được sử dụng khi việc lặp hay dừng phụ thuộc vào một biểu thức lôgic.

WHILE được sử dụng khi khả năng thực hiện khối lặp không xảy ra lần nào, tức nếu điều kiện lặp có giá trị sai ngay từ đầu, trong khi đó DO … WHILE được sử dụng khi ta biết chắc chắn khối lệnh lặp phải được thực hiện ít nhất một lần.


MẢNG DỮ LIỆU

Mảng một chiều

Ý nghĩa


Khi cần lưu trữ một dãy n phần tử dữ liệu chúng ta cần khai báo n biến tương ứng với n tên gọi khác nhau. Điều này sẽ rất khó khăn cho người lập trình để có thể nhớ và quản lý hết được tất cả các biến, đặc biệt khi n lớn. Trong thực tế, hiển nhiên chúng ta gặp rất nhiều dữ liệu có liên quan đến nhau về một mặt nào đó, ví dụ chúng có cùng kiểu và cùng thể hiện một đối tượng: như các toạ độ của một vectơ, các số hạng của một ma trận, các sinh viên của một lớp hoặc các dòng kí tự của một văn bản … Lợi dụng đặc điểm này toàn bộ dữ liệu (cùng kiểu và cùng mô tả một đối tượng) có thể chỉ cần chung một tên gọi để phân biệt với các đối tượng khác, và để phân biệt các dữ liệu trong cùng đối tượng ta sử dụng cách đánh số thứ tự cho chúng, từ đó việc quản lý biến sẽ dễ dàng hơn, chương trình sẽ gọn và có tính hệ thống hơn.

Giả sử ta có 2 vectơ trong không gian ba chiều, mỗi vec tơ cần 3 biến để lưu 3 toạ độ, vì vậy để lưu toạ độ của 2 vectơ chúng ta phải dùng đến 6 biến, ví dụ x1, y1, z1 cho vectơ thứ nhất và x2, y2, z2 cho vectơ thứ hai. Một kiểu dữ liệu mới được gọi là mảng một chiều cho phép ta chỉ cần khai báo 2 biến v1 và v2 để chỉ 2 vectơ, trong đó mỗi v1 hoặc v2 sẽ chứa 3 dữ liệu được đánh số thứ tự từ 0 đến 2, trong đó ta có thể ngầm định thành phần 0 biểu diễn toạ độ x, thành phần 1 biểu diễn toạ độ y và thành phần có số thứ tự 2 sẽ biểu diễn toạ độ z.

Tóm lại, mảng là một dãy các thành phần có cùng kiểu được sắp kề nhau liên tục trong bộ nhớ. Tất cả các thành phần đều có cùng tên là tên của mảng. Để phân biệt các thành phần với nhau, các thành phần sẽ được đánh số thứ tự từ 0 cho đến hết mảng. Khi cần nói đến thành phần cụ thể nào của mảng ta sẽ dùng tên mảng và kèm theo số thứ tự của thành phần đó.

Dưới đây là hình ảnh của một mảng gồm có 9 thành phần, các thành phần được đánh số từ 0 đến 8.






























0

1

2

3

4

5

6

7

8



Khai báo


[số thành phần] ; // không khởi tạo

[số thành phần] = { dãy giá trị } ; // có khởi tạo

[ ] = { dãy giá trị } ; // có khởi tạo

Tên kiểu là kiểu dữ liệu của các thành phần, các thành phần này có kiểu giống nhau. Thỉnh thoảng ta cũng gọi các thành phần là phần tử.

Cách khai báo trên giống như khai báo tên biến bình thường nhưng thêm số thành phần trong mảng giữa cặp dấu ngoặc vuông [] còn được gọi là kích thước của mảng. Mỗi tên mảng là một biến và để phân biệt với các biến thông thường ta còn gọi là biến mảng.

Một mảng dữ liệu được lưu trong bộ nhớ bởi dãy các ô liên tiếp nhau. Số lượng ô bằng với số thành phần của mảng và độ dài (byte) của mỗi ô đủ để chứa thông tin của mỗi thành phần. Ô đầu tiên được đánh thứ tự bởi 0, ô tiếp theo bởi 1, và tiếp tục cho đến hết. Như vậy nếu mảng có n thành phần thì ô cuối cùng trong mảng sẽ được đánh số là n - 1.

Dạng khai báo thứ 2 cho phép khởi tạo mảng bởi dãy giá trị trong cặp dấu {}, mỗi giá trị cách nhau bởi dấu phảy (,), các giá trị này sẽ được gán lần lượt cho các phần tử của mảng bắt đầu từ phần tử thứ 0 cho đến hết dãy. Số giá trị có thể bé hơn số phần tử. Các phần tử mảng chưa có giá trị sẽ không được xác định cho đến khi trong chương trình nó được gán một giá trị nào đó.

Dạng khai báo thứ 3 cho phép vắng mặt số phần tử, trường hợp này số phần tử được xác định bởi số giá trị của dãy khởi tạo. Do đó nếu vắng mặt cả dãy khởi tạo là không được phép (chẳng hạn khai báo int a[] là sai).

Ví dụ:

Khai báo biến chứa 2 vectơ a, b trong không gian 3 chiều:



float a[3] , b[3] ;

Khai báo 3 phân số a, b, c; trong đó a = 1/3 và b = 3/5:

int a[2] = {1, 3} , b[2] = {3, 5} , c[2] ;

ở đây ta ngầm qui ước thành phần đầu tiên (số thứ tự 0) là tử và thành phần thứ hai (số thứ tự 1) là mẫu của phân số.

Khai báo mảng L chứa được tối đa 100 số nguyên dài:

long L[100] ;

Khai báo mảng dong (dòng), mỗi dòng chứa được tối đa 80 kí tự:

char dong[80] ;

Khai báo dãy Data chứa được 5 số thực độ chính xác gấp đôi:

double Data[] = { 0,0,0,0,0 }; // khởi tạo tạm thời bằng 0


Cách sử dụng


Để chỉ thành phần thứ i (hay chỉ số i) của một mảng ta viết tên mảng kèm theo chỉ số trong cặp ngoặc vuông []. Ví dụ với các phân số trên a[0], b[0], c[0] để chỉ tử số và a[1], b[1], c[1] để chỉ mẫu số của 3 phân số a,b,c.

Tuy mỗi mảng biểu diễn một đối tượng nhưng chúng ta không thể áp dụng các thao tác lên toàn bộ mảng mà phải thực hiện thao tác thông qua từng thành phần của mảng. Ví dụ chúng ta không thể nhập dữ liệu cho mảng a[10] bằng câu lệnh:

cin >> a ; // sai

mà phải nhập cho từng phần tử từ a[0] đến a[9] của a. Dĩ nhiên trong trường hợp này chúng ta phải cần đến lệnh lặp for:

int i ;

for (i = 0 ; i < 10 ; i++) cin >> a[i] ;



Tương tự, giả sử chúng ta cần cộng 2 phân số a, b và đặt kết quả vào c.

Không thể viết:

c = a + b ; // sai

mà cần phải tính từng phần tử của c:

c[0] = a[0] * b[1] + a[1] * b[0] ; // tử số

c[1] = a[1] * b[1] ; // mẫu số

Để khắc phục nhược điểm này, trong các chương sau C++ cung cấp một kiểu dữ liệu mới gọi là lớp, và cho phép NSD có thể định nghĩa riêng phép cộng cho 2 mảng tuỳ ý, khi đó có thể viết một cách đơn giản và quen thuộc c = a + b để cộng 2 phân số.

Ví dụ minh hoạ


: Tìm tổng, tích 2 phân số.

void main()

{

int a[2], b[2], tong[2], tich[2] ;



cout << "Nhập a. Tử = " ; cin >> a[0] ; cout << "mẫu = " ; cin >> a[1] ;

cout << "Nhập b. Tử = " ; cin >> b[0] ; cout << "mẫu = " ; cin >> b[1] ;

tong[0] = a[0]*b[1] + a[1]*b[0] ; tong[1] = a[1] * b[1] ;

tich[0] = a[0]*b[0]; tich[1] = a[1] * b[1] ;

cout << "Tổng = " << tong[0] << '/' << tong[1] ;

cout << "Tích = " << tich[0] << '/' << tich[1] ;

}
: Nhập dãy số nguyên, tính: số số hạng dương, âm, bằng không của dãy.

void main()

{

float a[50], i, n, sd, sa, s0; // a chứa tối đa 50 số



cout << "Nhập số phần tử của dãy: " ; cin >> n; // nhập số phần tử

for (i=0; i> n;

for (i=0; i

}
: Nhập và sắp xếp tăng dần một dãy số. Thuật toán được tiến hành bằng cách sắp xếp dần từng số hạng bé nhất lên đầu dãy. Giả sử đã sắp được i-1 vị trí, ta sẽ tìm số bé nhất trong dãy còn lại (từ vị trí thứ i đến n-1) và đưa số này lắp vào vị trí thứ i. Để thực hiện, chúng ta so sánh a[i] lần lượt với từng số a[j] trong dãy còn lại (tức j đi từ i+1 đến n), nếu gặp a[j] bé hơn a[i] thì đổi chỗ hai số này với nhau.

void main()

{

float a[100], i, j, n, tam;



cout << "Cho biết số phần tử n = " ; cin >> n ;

for (i=0; i1   ...   12   13   14   15   16   17   18   19   ...   55



Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2016
được sử dụng cho việc quản lý

    Quê hương