Hanoi – Aptech: 8 lỗi mà các lập trình viên thường hay mắc phải

08/04/2013
admin
FacebookTwitterDeliciousStumbleuponDiggMyspaceLinkedInZingmegovnlinkhay

Học lập trình là một việc khá khó khăn, điều này chỉ cần hỏi bất kì ai đã từng học. Thật may mắn khi tôi đã được học và trải nghiệm nghề nghiệp này rất nhiều. Và tôi tổng hợp lại thành 8 vấn đề phổ biến nhất mà các lập trình viên mới thường hay mắc phải.

1. Không khai báo biến

int main()

{

cin>>x;

cout<<x;

}

“Hừm!?! Tại sao mình lại làm sai?”

Lý do gì khi viết như vậy khi chạy chương trình bị lỗi . Đó là vì trình biên dịch của bạn không hiểu x là cái gì, vì thế bạn cần khai báo biến x như thế này:

int main()

{

int x;

cin>>x;

cout<<x;

}

2. Chưa khởi tạo giá trị cho biến

int count;

while(count<100)

{

cout<<count;

}

“Tại sao chương trình của mình không thể chạy theo vòng lặp?”

Trong ngôn ngữ C++, biến không được khởi tạo bằng 0. Trong dòng mã trên, biến có thể là giá trị bất kỳ nào trong dãy các số nguyên (int). Nó có thể là 586 chẳng hạn, vậy thì nó sẽ không vào trong vòng lặp và khiến cho kết quả chương trình bị sai. Có thể đầu ra của chương trình sẽ được in ra kết quả rác từ -1000 đến 99.

Hãy nhớ để khởi tạo giá trị cho các biến của bạn trước khi thực hiện phép toán.

3. Thiết lập một biến với giá trị chưa khởi tạo

int a, b;

int sum=a+b;

cout<<”Enter two numbers to add: “;

cin>>a;

cin>>b;

cout<<”The sum is: “<<sum;

When Run:

Enter two numbers to add: 1 3

The sum is: -1393

 “Có chuyện gì xảy ra với chương trình của tôi vậy?”

Lập trình viên thường tin rằng các biến làm việc giống như phương trình – nếu bạn chỉ định một biến bằng kết quả của một toán tử trên biến khác mà bất cứ khi nào những thay đổi biến (trong ví dụ này là a và b), giá trị của biến số sẽ thay đổi. Trong ngôn ngữ C + +, phép gán không làm việc theo cách này: đó là một cách đối phó. Một khi bạn gán một giá trị cho một biến, nó có giá trị cho đến khi bạn gán một giá trị khác. Trong chương trình ví dụ trên, bởi vì a và b không được khởi tạo nên tổng của chúng sẽ bằng một số ngẫu nhiên, không liên quan gì đến các yếu tố đầu vào.

Để sửa lỗi này, cần bổ sung các bước sau ở đầu vào:

int a, b;

int sum;

cout<<”Enter two numbers to add: “;

cin>>b;

cin>>a;

sum=a+b;

cout<<”The sum is: “<<sum;

4. Sử dụng dấu bằng trong phép so sánh

char x=’Y’;

while(x=’Y’)

{

//…

cout<<”Continue? (Y/N)”;

cin>>x;

}

“Tại sao vòng lặp của tôi không bao giờ kết thúc?”

Nếu bạn sử dụng một dấu bằng trong phép so sánh, chương trình của bạn thay vì so sánh 2 bên thì sẽ gán giá trị ở bên phải của biểu thức vào biến ở phía bên tay trái, và kết quả được trả về gí trị TRUE. Trong trường hợp này, ‘Y’ là giá trị TRUE. Vì vậy, vòng lặp sẽ không bao giờ kết thúc. Hãy sử dụng dấu bằng để thực hiện phép so sánh; hơn nữa, để tránh sự so sánh ngẫu nhiên, đặt các biến ở phía bên tay phải của biểu thức để cho chương trình báo lỗi.

Có thể viết lại như sau:

char x=’Y’;

while(‘Y’==x)

{

//…

cout<<”Continue? (Y/N)”;

cin>>x;

}

5. Không khai báo hàm con

int main()

{

menu();

}

void menu()

{

//…

}

“Chương trình đã xảy ra lỗi gì?”

Trình biên dịch không biết hàm menu () được viết tắt là gì cho đến khi bạn giải trình với nó, và nếu bạn chờ đợi cho đến khi sử dụng nó để nói với nó rằng có một hàm đơn tên là menu, nó sẽ bị lẫn lộn. Hãy luôn luôn nhớ dùng một khai báo nguyên mẫu cho các hàm hoặc định nghĩa toàn bộ các hàm khi lần đầu tiên bạn sử dụng.

Chẳng hạn:

void menu();

int main()

{

menu();

}

void menu()

{

}

6. Thừa dấu chấm phẩy

int x;

for(x=0; x<100; x++);

cout<<x;

“Tại sao output chương trình lại là 100?”

Bạn đã bị thừa một dấu chấm phẩy. Hãy nhớ rằng, dấu chấm phẩy không đi cùng các định nghĩa, vòng lặp hoặc các hàm. Nếu bạn đặt thừa một dấu chấm phẩy ở bất kỳ vị trí nào trong chương trình thì chương trình sẽ hoạt động không đúng.

Có thể viết lại đoạn chương trình trên như sau:

int x;

for(x=0; x<100; x++)

cout<<x;

7. Vượt quá giới hạn của mảng

int array[10];

//…

for(int x=1; x<=10; x++)

cout<<array[x];

“Tại sao chương trình không cho các kết quả chính xác?”

Một mảng khi khai báo sẽ bắt đầu từ phần tử 0 và kết thúc sẽ là độ dài của mảng khai báo trừ đi 1. Chẳng hạn, nếu bạn có một mảng 10 phần tử thì phần tử đầu tiên trong mảng là phần tử 0 và phần tử cuối cùng là 9.

Chương trình trên có thể sửa lại như sau:

int array[10];

//…

for(int x=0; x<10; x++)

cout<<array[x];

8. Lạm dụng các toán tử && và || 

int value;

do

{

//…

value=10;

}while(!(value==10) || !(value==20))

“Mặc dù giá trị của vòng lặp là 10. Tại sao vậy?”

Hãy nhớ lại kiến thức về công thức của hàm Boolean là: !(A || B) tương đương với !A && !B. (Hãy thử nó và xem, bạn có thể đọc thêm về quy tắc này trên Wikipedia: Luật DeMorgan)!

Có thể viết lại chương trình như sau:

int value;

do

{

//…

value=10;

}while(!(value==10) && !(value==20))

Tác giả Alex Allain

Theo cprogramming.com

(Ảnh: st)

Viết bình luận mới

[Member Login]