Vòng lặp for trong ngôn ngữ C/C++

Chào các bạn học viên đang theo dõi khóa học lập trình trực tuyến ngôn ngữ C++.

Trong các bài học trước, chúng ta đã cùng nhau tìm hiểu các cấu trúc điều khiển chương trình, trong đó có 2 bài học mình đề cập đến cấu trúc vòng lặp whiledo-while. Hai cấu trúc lặp này tuy có khác nhau, nhưng chúng đều được sử dụng khi chưa biết được số lần lặp lại công việc tại thời điểm run-time.

Trong bài học này, mình sẽ giới thiệu đến các bạn vòng lặp for (for loops), cũng là vòng lặp cơ bản cuối cùng trong ngôn ngữ lập trình C++.

Một số đặc điểm của vòng lặp for:
  • Vòng lặp for có cú pháp phức tạp hơn, nhưng ngắn gọn hơn các vòng lặp while hay do-while khi sử dụng.
  • Vòng lặp for hoàn toàn có thể thay thế vòng lặp while.
  • Vòng lặp for thường được sử dụng cho các trường hợp biết trước số lần lặp lại khối công việc.
Cú pháp vòng lặp for
for (variable_initialization; condition; variable_update)
{
	statements;
}

Mình lấy 1 ví dụ trước khi giải thích các thành phần của vòng lặp for:

for (int count = 1; count <= 10; count++)
{
	cout << "count = " << count << endl;
}

Vòng lặp for được định nghĩa bởi từ khóa for và được chia làm 3 phần chính, mỗi phần được ngăn cách bởi dấu chấm phẩy:

  • Variable initialization (phần khởi tạo biến)

    Khác với vòng lặp while và do-while, biến vòng lặp có thể được khai báo và khởi tạo giá trị ngay bên trong phần khởi tạo của vòng lặp for. Như ở ví dụ trên, biến count được khai báo và khởi tạo với giá trị 1.

    Phần khởi tạo biến được thực thi đầu tiên và chỉ thực thi 1 lần duy nhất trong vòng lặp for.

  • Condition (biểu thức điều kiện)

    Phần này tương tự như vòng lặp while, khối lệnh của vòng lặp for sẽ được thực hiện nếu biểu thức điều kiện cho giá trị đúng. Vòng lặp for kiểm tra biểu thức điều kiện trước khi thực hiện khối lệnh.

  • Variable update (cập nhật biến vòng lặp)

    Phần này sẽ được thực thi cuối mỗi lần lặp, sau khi khối lệnh của vòng lặp for được thực thi. Phần này thường chịu trách nhiệm thay đổi giá trị biến vòng lặp được sử dụng trong biểu thức điều kiện (nhằm tránh tình trạng lặp vô hạn). Sau khi thực thi xong phần cập nhật biến vòng lặp, chương trình quay trở lại đánh giá biểu thức điều kiện của vòng lặp for và cứ như thế.

Vậy chúng ta rút ra được các bước thực hiện vòng lặp for như sau:

initialize loop variables --> check condition expression --> execute statements --> update loop variables.

for (int count = 1; count <= 10; count++)
{
	cout << count << " ";
}

Ví dụ trên có thể được chuyển về dưới dạng vòng lặp while như sau:

int count = 1; //variable initialization
while (count <= 10) //condition
{
	cout << count << " "; //statements
	
	count++; //variable update
}

Nhìn có vẻ dài dòng hơn vòng lặp for, nhưng vẫn có đủ 3 thành phần: variable initialization, condition và variable update.

Những lập trình viên mới học đến vòng lặp for sẽ cảm thấy khó đọc hơn vòng lặp while. Tuy nhiên, khi sử dụng thành thạo, vòng lặp for có nhiều tiện ích hơn.

Một số ví dụ về vòng lặp for

Dưới đây là một ví dụ sử dụng vòng lặp for để in ra tất cả các số chẵn từ 0 đến 10. Chúng ta đã biết trước rằng biến vòng lặp sẽ đi từ 0 đến 10, nên việc sử dụng vòng lặp for là phù hợp.

for (int i = 0; i <= 10; i++)
{
	if (i % 2 == 0)
		cout << i << " ";
}

Mình vừa sử dụng vòng lặp for để cho biến i tăng giá trị từ 1 đến 10, cứ mỗi lần lặp, mình kiểm tra giá trị hiện tại của biến i, nếu giá trị hiện tại của i chẵn, mình thực hiện in biến i ra màn hình.

Vòng lặp này có thể được rút gọn lại như sau:

for (int i = 0; i <= 10; i += 2)
{
	cout << i << " ";
}

Chúng ta biết rằng số chẵn tiếp theo sẽ cách số chẵn trước đó 2 đơn vị, do đó, mình thực hiện cộng thêm 2 đơn vị cho biến i tại phần variable update. Nhờ đó, mình không cần thực hiện kiểm tra giá trị của biến i trong vòng lặp nữa.

Bây giờ, thay vì chúng ta thực hiện lặp từ 0 đến 10, chúng ta có thể đi ngược lại từ 10 về 0 như sau:

for (int i = 10; i >= 0; i -= 2)
{
	cout << i << " ";
}

Kết quả in ra sẽ là:

10 8 6 4 2 0
Multiple declarations

Trong một số trường hợp, vòng lặp của chúng ta cần sử dụng đồng thời nhiều biến khác nhau. Ngôn ngữ C++ hổ trợ cho chúng ta khai báo và khởi tạo nhiều biến bên trong phần variable initialization của vòng lặp for.

for (int hh = 0, mm = 0, ss = 0 ; true; ss++)
{
	if (ss >= 60)
	{
		ss = 0;
		mm++;
		if (mm >= 60)
		{
			hh++;
			if (hh >= 24)
			{
				hh = 0;
			}
		}
	}

	cout << hh << ":" << mm << ":" << ss << endl;

	_sleep(1000);
	system("cls");
}

Nếu các bạn đặt khai báo biến vòng lặp tại phần variable initialization của vòng lặp for, những biến này phải có cùng kiểu dữ liệu.

Lược bỏ một số thành phần trong vòng lặp for

Một đặc điểm nổi bật hơn so với các vòng lặp khác là vòng lặp for cho phép lập trình viên lược bỏ các thành phần nếu không cần sử dụng. Ví dụ:

int loop = 0
for ( ; loop <= 10; )
{
	cout << loop++ << " ";
}

Trong ví dụ trên, mình không cần sử dụng tới thành phần khởi tạo biến, cũng như thành phần cập nhật giá trị biến. Lúc này, vòng lặp này hoàn toàn giống với vòng lặp while.

Chúng ta có thể lược bỏ luôn cả 3 thành phần cơ bản của vòng lặp for:

for ( ; ; )
{
	// do something
}

Khi biểu thức điều kiện trong for được bỏ trống, nó đồng nghĩa với việc biểu thức điều kiện luôn luôn đúng. Vòng lặp for này tương đương:

while (true)
{
	// do something
}
Nesting for loops

Tương tự như vòng lặp while hay do-while, vòng lặp for có thể chứa nhiều vòng lặp khác trong khối lệnh của nó.

for (int i = 0; i < 5; i++)
{
	for(int j = 0; j < 10; j++)
	{
		cout << "* ";
	}
	cout << endl;
}

Kết quả của đoạn code này là:

* * * * * * * * * * 
* * * * * * * * * * 
* * * * * * * * * * 
* * * * * * * * * * 
* * * * * * * * * * 

Tổng kết

Vòng lặp for được sử dụng phần lớn trong các cấu trúc lặp trong ngôn ngữ C++ mà mình đã giới thiệu đến các bạn. Vòng lặp for phù hợp cho cả trường hợp biết trước số lần lặp lẫn không biết trước số lần lặp.

Bài tập cơ bản

1/ Viết chương trình tính giai thừa của một số nguyên n nhập từ bàn phím.

2/ Viết chương trình tính dân số của một thành phố sau 10 năm nữa, biết rằng dân số hiện tại là 500.000 người, và tỉ lệ tăng dân số hằng năm của thành phố này là 1.6%.

3/ Viết chương trình in ra bảng cửu chương.


P/s: Hẹn gặp lại các bạn trong bài học tiếp theo trong khóa học lập trình C++ hướng thực hành.

Mọi ý kiến đóng góp hoặc thắc mắc có thể đặt câu hỏi trực tiếp tại diễn đàn

www.daynhauhoc.com


Link Videos khóa học

https://www.udemy.com/c-co-ban-danh-cho-nguoi-moi-hoc-lap-trinh/learn/v4/overview

6 Likes

Giải bài tập:

Bài 1:

// Viet chuong trinh tinh giai thua cua so nguyen n

#include <iostream>;
using namespace std;

int main()
{
    int n; // so nguyen n nhap tu ban phim
    int giaithua = 1;
    cout << "nhap vao so nguyen n de tinh giai thua: ";
    cin >> n;
    if (n == 0) 
{
    giaithua = 1;
    cout << giaithua << endl;
}
   else
   {
   for ( int i = 1 ; i <=n; i++) 
   {
   giaithua = giaithua*i; 
   }
    cout << "giai thua so" << n << "la" << giaithua << endl;
   }    
return 0;
}

Bài 2:

// Viết chương trình tinh tổng dân số

#include
using namespace std;

int main()
{
   int dansohientai = 500000 ;
   for ( int i = 1; i <= 10; i++)
   {
       dansohientai = (dansohientai + (dansohientai * 0.016));
   }
   cout << "Tong dan so sau 10 nam: " << dansohientai << endl;
   
return 0;
}

Bài 3: (đang bí) :smiley: << tìm ra lời giải rồi , hihi, lười suy nghĩ :((

// Viết chương trình in ra bảng cửu chương 9

#include <iostream>;
using namespace std;

int main()
{
    int x; // luu gia tri i * j
    for ( int i = 1; i <= 9; i++)
        {
            for ( int j = 1; j <= 9; j++) 
            {
                x = i*j;
                cout << x << " ";
            }
            cout << endl;
        }
return 0;
}

P/s : @nguyenchiemminhvu thầy ơi không có ai vào chấm bài học viên ah. Sao biết bài tập trả lời đúng sai, phương pháp tối ưu chưa, hic hic :((

Đây là bản đọc của khóa học trên Udemy của team anh @ltd. Anh @ltd sẽ giải bài tập trên Udemy.

Bạn có chỗ quên dùng markdown kìa.

Không cần điều kiện này ! Chạy thử rồi biết .

Viết gọn lại như sau: Giaithua *= i

Viết tắt lại như sau: Dansohientai += Dansohientai * 0.016;

Không cần

Ghi thẳng luôn : cout 》》 i * j 》》 " ";

// Example program
#include <iostream>
#include <string>

using namespace std;

int main()
{
    cout << "Chuong trinh in ra bang cuu chuong" << endl;
    
    for (int i = 1; i < 10; i++)
    {
        cout << "Bang thu " << i << endl;
        
        for (int j = 1; j <= 10; j++)
        {
            cout << i << " nhan voi " << j << " bang " << i * j << endl;    
        }
        
        cout << endl;
    }
}

Tại sao bài 1 mình làm sao nó lại in ra sai. Đại loại là thế này:

Khi mình nhập giá trị bất kì (ngoài 0 và 1) thì nó ra kết quả thế này:

Đây là khi mình chọn giá trị là 4:

The factorial of 4 is 1
The factorial of 4 is 2
The factorial of 4 is 6
The factorial of 4 is 24

Còn đây là code của mình:

#include <iostream>

using namespace std;

int main() {

	int input;
	int factorial = 1;

	cout << "Type the number you want to know the result of it in factorial: ";
	cin >> input;

	if (input == 0)
	{
		factorial = 1;
		cout << "The factorial of " << input << " is: " << factorial << endl;
	}

	else
	{
		for (int i = 1 ; i <= input; i++)
		{
			factorial *= i;
			cout << "The factorial of " << input << " is: " << factorial << endl;
		}
	}
	system("pause");
	return 0;

}

Bỏ cái dòng cout << "The factorial of " << input << " is: " << factorial << endl; ra khỏi cặp dấu {} là được, như thế này:

for (int i = 1 ; i <= input; i++)
        {
            factorial *= i;
        }
 cout << "The factorial of " << input << " is: " << factorial << endl;
2 Likes

Ok, mình hiểu rồi, thanks

Đây là bài tập 1 của em. Em có chỉnh sửa đề một chút để tiết kiệm thời gian hơn khi tính giai thừa :))

// Example program
include <iostream>
include <string>
include <iomanip>
using namespace std;
int main() {
    int row,col;
    std::cout << "BANG CUU CHUONG" << std::endl;
    for(row=1;row<=10;row++) {
        for(col=1;col<=9;col++) {
            std::cout << setw(2) << col << " X " << setw(2) << row << " = " << setw(2) << row*col << "\t";
            if(col==9) std::cout << "\n";
            }
        }
    }

:slight_smile:

#include<iostream>
using namespace std;
int main()
{
	int n,giaithua;
	cout<<"nhap gia tri n \n";
	cin>>n;
        giaithua=n;
	for( ;n>1;n--)
	{
		
		giaithua=giaithua*(n-1);
	}
	cout<<"giai thua cua n "<<giaithua<<endl;
	return 0;
}
1 Like

Bài 1:

#include <iostream>

int main()
{
	int n;
	int giaithua = 1;
	std::cout << "Nhap n : "; std::cin >> n;
	std::cout <<std::endl;
	for (int i = 1; i <= n; i++)
	{
		giaithua *= i;
	}
	std::cout << "Giai thua cua " << n << " la : " << giaithua << std::endl;
	return 0;
}

Bài 2:

#include <iostream>

int main()
{
	int DanSo10;
	const int DSbaygio = 500000;
	DanSo10 = DSbaygio;
	for (int i = 1; i <= 10; i++)
	{
		DanSo10 = DanSo10 + (DanSo10*1.6/100);
	}
	std::cout << "Dan so sau 10 nam: " << DanSo10 <<" nguoi. "<< std::endl;
	return 0;
}

Bài 3:

#include <iostream>

int main()
{
	int a2, a3, a4, a5, a6, a7, a8, a9;
	std::cout << "Ban cuu chuong 2." << std::endl;
	for (int i = 0; i <= 9; i++)
	{
		a2 = 2 * i;
		std::cout << "2 x " << i << " = " << a2 << std::endl;
	}
	std::cout << "Ban cuu chuong 3." << std::endl;
	for (int i = 0; i <= 9; i++)
	{
		a2 = 3 * i;
		std::cout << "3 x " << i << " = " << a2 << std::endl;
	}
	std::cout << "Ban cuu chuong 4." << std::endl;
	for (int i = 0; i <= 9; i++)
	{
		a2 = 4 * i;
		std::cout << "4 x " << i << " = " << a2 << std::endl;
	}
	std::cout << "Ban cuu chuong 5." << std::endl;
	for (int i = 0; i <= 9; i++)
	{
		a2 = 5 * i;
		std::cout << "5 x " << i << " = " << a2 << std::endl;
	}
	std::cout << "Ban cuu chuong 6." << std::endl;
	for (int i = 0; i <= 9; i++)
	{
		a2 = 6 * i;
		std::cout << "6 x " << i << " = " << a2 << std::endl;
	}
	std::cout << "Ban cuu chuong 7." << std::endl;
	for (int i = 0; i <= 9; i++)
	{
		a2 = 7 * i;
		std::cout << "7 x " << i << " = " << a2 << std::endl;
	}
	std::cout << "Ban cuu chuong 8." << std::endl;
	for (int i = 0; i <= 9; i++)
	{
		a2 = 8 * i;
		std::cout << "8 x " << i << " = " << a2 << std::endl;
	}
	std::cout << "Ban cuu chuong 9." << std::endl;
	for (int i = 0; i <= 9; i++)
	{
		a2 = 9 * i;
		std::cout << "9 x " << i << " = " << a2 << std::endl;
	}
	return 0;
}

http://cpp.sh/
Xài compiler này thì k lỗi. Do mình đi làm thêm quán bida rảnh ngồi viết online

Bài 3:

#include <iostream>
using namespace std;
int main()
{
	int i, j;
	for (i = 0; i <= 9; i++)
	{
		for (j = 0; j <= 9; j++)
		{
			cout << i << "x" << j << " = " << i*j << endl;
		}
		cout << endl;
	}
	system("pause");
	return 0;
}

có cách nào cho bảng cửu chương nó ko bị cong vẹo khi xếp ra hàng ngang ko nhỉ

viet chuong trinh in ra bang cuu chuong

1 Like

Mình không giỏi toán lắm nên khi làm bài này toàn lây giấy viết ra ghi cả đống, xé nháp cả chục tấm giấy, sau đó nghĩ ra được và code chạy thử mới thấy nó dễ thế mà mình nghĩ không ra lúc đó…Mình ngu thật

Bảng cửu chương

#include <iostream>

int main() {
	std::cout << "\t\t\t  BANG CUU CHUONG" << std::endl;
	std::cout << "\t2\t3\t4\t5\t6\t7\t8\t9" << std::endl;
	for (int i = 1; i <= 9; i++) {
		for (int j = 1; j <= 9; j++) {
			std::cout << j * i << "\t";
		}
		std::cout << std::endl;
	}
	std::cout << std::endl;
	return 0;
}

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?