Thông báo

Icon
Error

HỌC LẬP TRÌNH C/C++ HIỆU QUẢ NHẤT !!!
kisuhatavt Offline
#1 Đã gửi : 03/10/2011 lúc 03:15:51(UTC)
Danh hiệu: Ma mới

Nhóm: Registered
Gia nhập: 29-09-2011(UTC)
Bài viết: 1
Đến từ: tpHCM

Được cảm ơn: 1 lần trong 1 bài viết

HỌC LẬP TRÌNH C/C++

Phần I: Phong cách lập trình

Phần II: Những lỗi cơ bản thường gặp khi biên dịch chương trình viết bằng ngôn ngữ C/C++

Phần III: Các thư viện trong C++

Lưu ý: các hướng dẫn và các đoạn code mẫu dưới đây hướng dẫn dựa trên ngôn ngữ C. Hai hàm printf() và scanf()

NỘI DUNG CHI TIẾT

Phần I: Phong cách lập trình

I. Mục tiêu của tài liệu này:

Bạn đang học lập trình, vậy bạn nghĩ về một chương trình máy tính như thế nào?

Một chương trình máy tính có thể xem như một tác phẩm (như bài báo, một câu truyện, một cuốn tiểu thuyết, …) bởi vì nó được đọc bởi bạn (có thể bây giờ, mà cũng có thể là 10 năm sau!), và bởi những lập trình viên khác sau bạn (để phát triển, sửa chửa, cập nhật, …). Chính vì lẽ đó, một chương trình máy tính nên đáp ứng cả 3 yêu cầu sau: đúng, dễ đọc và dễ hiểu.

Mục tiêu của tài liệu này là cung cấp cho bạn:

1. Một tập hợp các chuẩn trình bày chương trình thông dụng.

2. Một thói quen để từ đó bạn có một phong cách lập trình tương đối chuyên nghiệp.

Tuy nhiên, tài liệu này không có tham vọng đề cập đến toàn bộ các khía cạnh của một phong cách lập trình. Nó chỉ nói đến những gì cần thiết để cho bạn, một sinh viên, khi chưa tìm được một phong cách phù hợp tạo được những thói quen tốt ngay từ đầu.



II. Một số nguyên tắc cần tuân thủ khi lập trình:

A. Trình bày tổng thể chương trình:

1. Môđun hóa chương trình của bạn

Chương trình của bạn nên được tách thành nhiều môđun, mỗi môđun thực hiện một công việc và càng độc lập với nhau càng tốt. Điều này sẽ giúp bạn dễ bảo dưỡng chương trình hơn và khi đọc chương trình, bạn không phải đọc nhiều, nhớ nhiều các đoạn lệnh nằm rải rác để hiểu được điều gì đang được thực hiện.

Khi muốn chuyển thông tin cho các chương trình con, bạn nên sử dụng các tham số. Tránh sử dụng các biến toàn cục để chuyển thông tin giữa các chương trình con. làm như vậy bạn sẽ triệt tiêu tính độc lập giữa các chương trình con và rất khó khăn khi kiểm soát giá trị của chúng khi chương trình thi hành. (Chú ý, bạn nên phân biệt giữa biến toàn cục và hằng số toàn cục)



2. Cách trình bày chương trình nên nhất quán

Chương trình của bạn càng nhất quán, thì nó sẽ càng dễ đọc và dễ hiểu. Hơn nữa, bạn sẽ càng mất ít thời gian nghĩ về cách viết chương trình, và như vậy bạn sẽ có nhiều thời gian hơn để nghĩ về các vấn đề cần giải quyết.



3. Chương trình nên giữ được tính đơn giản và rõ ràng trong hầu hết các tình huống.

Việc sử dụng các mẹo lập trình chỉ thể hiện sự khéo léo của lập trinh viên và làm tăng hiệu quả chương trình lên một chút, trong khi điều đó sẽ đánh mất đi tính đơn giản và rõ ràng của chương trình.

Ví dụ:

a[i++] = 1;

nên được viết là:

a[i] = 1;

i++;

Hoặc:

if (doSomeThing() == false) …

nên được viết là:

bool result = doSomeThing();

if (result == false) …



4. Mã lệnh mà bạn viết phải thể hiện đúng cấu trúc chương trình của bạn.

Ví dụ:

Dòng lệnh:

if (count == 0) printf(``No data.n'');

nên được viết là:

if (count == 0)

printf(``No data.n'');

Và như vậy, theo bạn, dòng lệnh sau có thể hiện đúng cấu trúc chương trình không?

if (count != 0)

printf(``%dn'', count);

average = total/count;



5. Chương trình của bạn nên thực hiện như một dòng chảy từ trên xuống dưới, không nên có những thay đổi bất chợt. Để có được điều này, bạn không nên sử dụng goto hay continue.



B. Khai báo biến và hàm

1. Một câu lệnh nên được đặt riêng trên một dòng, điều này sẽ giúp bạn rất nhiều trong quá trình debug.

Ví dụ:

Nếu bạn viết:

while (i < 100) i++;

bạn sẽ không biết được vòng lặp trên được thực hiện bao nhiêu lần khi debug..

Cũng tương tự:

if (i < 100) i++;

bạn sẽ không biết được lệnh if có được thực hiện hay không trong quá trình debug (trừ khi bạn phải theo dõi giá trị của i).



2. Các dấu {} bao các khối lệnh phải được canh thẳng hàng.

Có 2 cách thường được chấp nhận để canh thẳng các dấu {}:
a. Cách 1:
if (...)
{
.
.
.
}
else
{
.
.
.
}
while (...)
{
.
.
.
}
b. Cách 2:
if (...)

 {
.
.
.
}
else {
.
.
.
}
while (...) {
.
.
.
}






Và như vậy, khi viết các khối lệnh nằm trong một cặp ngoặc {}, bạn nên viết cặp ngoặc trước rồi mới viết các lệnh vào giữa, làm như vậy bạn sẽ tránh trường hợp thiếu các dấu ngoặc này.



3. Biến nên được khai báo ở gần vị trí mà nó bắt đầu được sử dụng, như vậy bạn sẽ tránh được việc khai báo một loạt các biến dư thừa ở đầu hàm hay chương trình.



4. Mỗi biến nên khai báo trên một hàng nhằm dễ chú thích về ý nghĩa của mỗi biến.

Ví dụ:

int level = 0; // indentation level
int size = 0; // size of symbol table
int lines = 0; // lines read from input

5. Tên biến nên đặt sao cho đủ nghĩa, có thể là là các từ hoàn chỉnh hoặc viết tắt nhưng phải dễ đọc (dễ phát âm).

Ví dụ:

wages = hoursWorked * hourlyRate;
rõ ràng hơn là
w = h * r;
Ngoại lệ: Các biến sử dụng để chạy các vòng lặp nên đặt đơn giản là: i, j, k, …



6. Tên của một hàm nên phản ánh công việc hoặc giá trị trả về của nó.

Ví dụ:

CheckForErrors() thay vì ErrorCheck()

DumpDataToFile() thay vì DataFile().



7. Bạn nên sử dụng hợp lý các ký tự hoa và thường khi đặt tên biến, điều này sẽ giúp chương trình dễ đọc hơn, một số gợi ý như sau:

· Tên biến được viết bằng chữ thường, viết hoa chữ các đầu tiên của từ thứ hai trong tên biến (kiểu camelBack), ví dụ: totalHouseWorked.

· Tên hằng số được viết hoa toàn bộ, các từ viết cách nhau bằng dấu gạch dưới, ví dụ: TAX_RATE.

· Các kiểu dữ liệu do người dùng định nghĩa được viết hoa toàn bộ hoặc viết hoa các ký tự đầu, ví dụ: BIGINT hay BigInt.

· Tên các hàm được viết hoa chữ cái đầu từ, có thể bắt đầu từ từ thứ nhất hay thứ hai, ví dụ: DisplayInfo() hoặc displayInfo().



8. Các hằng số không nên viết trực tiếp vào chương trình.

Thay vì thế, người ta thường sử dụng lệnh #define hay const để đặt cho những hằng số này những tên có ý nghĩa. Điều này sẽ giúp lập trình viên dễ kiểm soát những chương trình lớn vì giá trị của hằng số khi cần thay đổi thì chỉ phải thay đổi một lần duy nhất ở giá trị định nghĩa (ở #define hay const).

Ví dụ:

popChange = (0.1758 - 0.1257) * population;
nên được viết là:
const double BIRTH_RATE = 0.1758,
DEATH_RATE = 0.1257;
...
popChange = (BIRTHRATE - DEATH_RATE) * population;
Ghi chú: bạn không nên dùng #define thường xuyên để định nghĩa các hằng số, bởi vì trong quá trình debug, bạn sẽ không thể xem được giá trị của một hằng số định nghĩa bằng #define.



9. Khi khai báo con trỏ, dấu con trỏ nên được đặt liền với tên, nhằm tránh trường hợp sau:

char* p, q, r; // ß q, r không là con trỏ

Trong trường hợp này nên viết là:

char *p, *q, *r;

(luật này cũng được dùng khi khai báo tham chiếu với dấu &)



C. Trình bày dòng lệnh:

1. Các biến không nên được sử dụng lại với nhiều nghĩa khác nhau trong cùng một hàm.

Ví dụ:

Không nên sử dụng biến như sau:

for (i = 0; i < n; i++) // ß n mang ý nghĩa là số lần lặp

. . .



for (i = 0; i < 10; i++)

for (n = 0; n < 10; n++) //ß n sử dụng như biến điều khiển lặp

. . .



2. Các toán tử và toán hạng trong một biểu thức nên được tách rời nhau nhằm làm biểu thức dễ đọc hơn.

Ví dụ:

mass = volume * density;

Thay vì:

mass=volume*density;

Ngoại lệ: không chèn khoảng trắng vào giữa toán hạng và toán tử ++ và –



3. Nên có khoảng trắng ngăn cách giữa dấu phẩy hay chấm phẩy với các tham số.



4. Nên có khoảng trắng giữa từ khóa và dấu ‘(’, nhưng không nên có khoảng trắng giữa tên hàm và dấu ‘(‘.

Ví dụ:

// no space between 'strcmp' and '(',
// but space between 'if' and '('
if (strcmp(input_value, "done") == 0)
return 0;

5. Nên sử dụng các dấu ( ) khi muốn tránh các lỗi về độ ưu tiên toán tử.

Ví dụ:

// No!
int i = a >= b && c < d && e <= g + h;
// Better
int j = (a >= b) && (c < d) && (e <= (g + h));


6. Nên dùng các dòng trắng để phân chia các hàm trong một tập tin, các đoạn lệnh trong một hàm như: đoạn nhập xuất dữ liệu, các đoạn tương ứng với các bước xử lý khác nhau,

7. Mỗi dòng lệnh không nên dài quá 80 ký tự, điều này giúp việc đọc chương trình dễ dàng hơn khi không phải thực hiện các thao tác cuộn ngang mang hình.



8. Một dòng lệnh quá dài nên được tách thành nhiều dòng.

Ví dụ:

if (foo->next == NULL
&& totalcount < needed && needed <= MAX_ALLOT
&& server_active(current_input))
{
...
}
Hoặc:

for (curr = *listp, trail = listp;
curr != NULL;
trail = &(curr->next), curr = curr->next)
{
...
}

Hoặc:

int myComplexFunction( unsigned unsignedValue,
int intValue,
char *charPointerValue,
int *intPointerValue,
unsigned *unsignedPointerValue);


D. Chú thích chương trình:

1. Khi đặt các chú thích, bạn nên sử dụng dấu // vì dấu này sẽ không có ảnh hưởng khi bạn sử dụng cặp ký hiệu /* */ để vô hiệu hóa một đoạn lệnh trong quá trình sửa lỗi chương trình. Bạn nên nhớ rằng trong C/C++ không cho phép các cặp dấu /* */ lồng nhau.



2. Với các chú thích ngắn, bạn đặt nó trên cùng dòng lệnh cần chú thích. Với các chú thích dài hơn, hoặc chú thích cho cả một đoạn lệnh, bạn đặt câu chú thích trên một dòng riêng ngay phía trên câu lệnh cần chú thích.

Ví dụ:

Chú thích ngắn:

if (a == 2)
return(TRUE); // special case
else
return(isprime(a)); // works only for odd a
...
Chú thích dài:

if (argc > 1) {
// Get input file from command line.
if (freopen(argv[1], "r", stdin) == NULL)
error("can't open %sn", argv[1]);
}

3. Không nên lạm dụng chú thích.

Ví dụ:

i++; // tăng i lên 1 đơn vị

Chú thích như trên là không cần thiết vì bản thân dòng lệnh đã nói lên mục tiêu của nó. Thay vì vậy, bạn nên cố gắng giữ cho chương trình của bạn dễ đọc, dễ hiểu qua việc trình bày chương trình rõ ràng, đơn giản và cách đặt tên hợp lý.

II. Ví dụ:

/***********************************************
*     Program        : Equation solving

************************************************/
#include <conio.h>
#include <stdio.h>
#define     NO_SOL         1     //no solution

#define     ONE_SOL        2     //one solution
#define MULTI_SOL     3     //undefined solution
 

// Function name     : Input
// Description             : get coefficients
// Return type      : void
// Argument              : int *a
// Argument              : int *b
 

void Input(int *a, int *b)
{
    printf("a = ");
    scanf("%d", a);
    printf("b = ");
    scanf("%d", b);
}

// Function name     : Output
// Description             : print result
// Return type      : void
// Argument              : int nSol -- solution type
// Argument              : float x -- the solution

void Output(int nSol, float x = 0)
{
    switch (nSol)
    {
         case NO_SOL:
              printf("No solution!n");
              break;
         case ONE_SOL:
              printf("One solution: %fn", x);
              break;
         case MULTI_SOL:
              printf("Undefined solution!n");
              break;
    }
}
void main()
{
    int a, b;     // coefficients
    int nSol;     // solution type
    float x;     // the solution
    Input(&a, &b);
    if (a == 0)
    {
         if (b == 0)
              nSol = MULTI_SOL
         else
              nSol = NO_SOL;
    }
    else
    {
         nSol = ONE_SOL;
         x = -(float)b/a;
    }
    Output(nSol, x);
   getch();
}

 

 

Phần II: Các lỗi cơ bản thường gặp khi biên dịch chương trình

1.Undefined symbol “cout” hoặc “cin”: chương trình ko hiểu được các ký tự: cout và cin. Đây chính là hai hàm nhập xuất trong C++

=> include thiếu thư viện <iostream.h>

 

2.Function “getch” should have a prototype: hàm getch nên có một nguyên mẫu.

=>include thiếu thư việc của hàm getch(): <conio.h>

 

3. Function “hàm của bạn” should have a prototype: nguyên nhân là do “hàm của bạn” được định nghĩa và khai báo không giống nhau: tên hàm khác nhau, chữ hoa chữ thường, số lượng biến truyền vào hàm hoặc do gọi hàm trong hàm main không giống với hàm đuộc định nghĩa và khai báo.

 

Lưu ý:

-         Tên hàm không được có khoảng trống, liền sau hàm là một dấu mở ngoặc (

 

4.Statement missing ; : trình bày thiếu ;. Thông thường lỗi này sẽ báo cho bạn biết ngay tại vị trí thiếu.

 

5.Declaration terminate incorrectly: khai báo dấu thoát không đúng . Đây là lỗi do bạn để dấu ; ngay sau tên hàm trong khi định nghĩa hàm.

=> Bỏ dấu ;

Lưu ý:

-         Trong khi khai báo hàm (trước hàm main) thì tên hàm phải có ; nhưng khi định nghĩa hàm không có dấu ;. Nếu hàm được định nghĩa luôn trước hàm main thì ko cần dấu ;

-         Hàm main() ko có dấu ; đi sau nó.

6. Declaration syntax error: lỗi cú pháp. Xem lại cú pháp sử dụng biến và các câu lệnh cơ bản.

 

7. Illegal charater ‘\’: lỗi khi bạn muốn thực hiện kí hiệu trong phép chia. Phép chia có kí hiệu đúng là ‘/’.

 

8. “tên_hàm(các đối số)” cannot return a value: hàm không thể trả ra giá trị: kiểm tra lại kiểu giá trị trả về của hàm. Nếu hàm trả ra giá trị void thì ko sử dụng hàm return.

 

9. Unable  to open include  file “IOSTREAM.h”…: lỗi do bộ cài thiếu thư viện hoặc đặt sai đường dẫn thư mục chứa bộ chạy Turbo C

=> Vào Option/Directories đặt được đường dẫn <Tên Ổ>:\TC\INCLUDE và <Tên Ổ>:\TC\LIB trong đó <Tên Ổ> là tên ổ đĩa trên máy bạn nơi có chứa thư mực TC.

 

10. Unterminated string or character constant: không hiểu được chuỗi kết thúc hay hằng kí tự: lỗi do khi bạn xuất một xâu ra màn hình bằng cout nhưng chỉ có dấu nháy kép “ đầu chuỗi mà chưa đóng chuỗi

=> Thêm dấu “ vào cuối chuỗi

 

Phần 3: Các thư viện chuẩn trong C (ngôn ngữ mà C++ thừa kế).

Một số thư viện chuẩn hay dùng

#include<stdio.h> //thư viện chứa các hàm chuẩn vào ra
#include<conio.h> //dùng hàm getch()
#include<math.h>// chỉ dùng trong trường hợp dùng các hàm toán học
#include<string.h>// các hàm xử lí string
#include<ctype.h>// dùng các hàm chuyển đổi chuỗi từ thường-> hoa và ngược lại
#include<dos.h>// dùng hàm exit();
#include<stdlib.h>// thư viện chuẩn
#include<graphics.h>// hàm dùng trong chế độ đồ họa

1 người cảm ơn kisuhatavt cho bài viết.
vdhong trên 03-10-2011(UTC) ngày
Quảng cáo
Liên hệ quảng cáo vdhong2007@yahoo.com
tamnb030 Offline
#2 Đã gửi : 23/08/2014 lúc 11:48:40(UTC)
Danh hiệu: Ma mới

Nhóm: Registered
Gia nhập: 05-04-2013(UTC)
Bài viết: 6

HỌC KINH NGHIỆM LẬP TRÌNH C/C++ TẠI STANFORD - DẠY KINH NGHIỆM THỰC TẾ.

Ngôn ngữ lập trình C là một ngôn ngữ mệnh lệnh được phát triển từ đầu thập niên 1970 bởi Ken Thompson và Dennis Ritchie để dùng trong hệ điều hành UNIX. Ngôn ngữ C++ được phát triển từ ngôn ngữ C. C++ không phải là ngôn ngữ hướng đối tượng hoàn toàn mà là ngôn ngữ "đa hướng". Vì C++ hỗ trợ cả lập trình hướng hành động và lập trình hướng đối tượng.

 

Mục tiêu của C++ là tiếp cận những ý tưởng của phương pháp luận hướng đối tượng và trừu tượng dữ liệu. C++ là một ngôn ngữ lập trình tiến tiến, mạnh trong các ngôn ngữ lập trình hiện nay, nó được sử dụng bởi hàng triệu lập trình viên trên thế giới. Các đặc tính của C ++ cho phép người lập trình xây dựng những thư viện phần mềm có chất lượng cao phục vụ những đề án lớn. C++ là ngôn ngữ thích hợp cho việc xây dựng những chương trình lớn như các hệ soạn thảo, chương trình dịch, các hệ quản trị cơ sở dữ liệu, các hệ truyền thông…Nó là một trong những ngôn ngữ phổ biến để viết các ứng dụng máy tính – và ngôn ngữ thông dụng nhất để lập trình games.

 

Hiện nay, ngôn ngữ này đã lan rộng ra nhiều hệ điều hành khác và trở thành một những ngôn ngữ phổ dụng nhất ngôn ngữ rất có hiệu quả và được ưa chuộng nhất để viết các phần mềm hệ thống, mặc dù nó cũng được dùng cho việc viết các ứng dụng.

 

Là đơn vị tiên phong trong lĩnh vực đào tạo các lập trình viên phát triển phần mềm ứng dụng, Công ty CP Stanford – Đào tạo và phát triển công nghệ luôn mong muốn mang tới các học viên chương trình đào tạo tối ưu nhất giúp các bạn dễ dàng học tập và có thể lựa chọn chương trình học phù hợp nhất với khả năng của mình.

Vậy ngôn ngữ C++ có gì nổi bật hơn những ngôn ngữ khác? Hãy tham gia khóa học kinh nghiệm lập trình C/C++ tại Stanford - Dạy kinh  nghiệm lập trình; chúng tôi tự tin trong 6 tháng sẽ giúp bạn giải đáp hết các thắc mắc, thành thạo C++ và thành công.

Khóa học C/C+ từ cơ bản đến nâng cao tại StanfordDạy kinh nghiệm thực tế chia thành 3 level chính:

 

-         C/C++ for Base: dành cho các học viên chưa có kiến thức hoặc chưa nắm chắc kiến thức cơ bản về ngôn ngữ lập trình C/C++.

 

-         C/C++ for Developer: dành cho các học viên đã nắm chắc kiến thức cơ bản về ngôn ngữ lập trình C/C++ và muốn học nâng cao để trở thành lập trình viên C/C++ hoặc tự phát triển ứng dụng của mình.

 

-         C/C++ for Advanced: dành cho các học viên đã nắm chắc kiến thức nâng cao và muốn học chuyên sâu hơn để trở thành chuyên gia về C/C++.

 

Nội dung chi tiết của khóa học, bạn tham khảo tại khóa học kinh nghiệm lập trình C/C++ của Stanford. Ngoài ra, khi tham gia khóa học tại StanfordDạy kinh nghiệm lập trình bạn sẽ tìm thấy những điểm đặc biệt mà không ở đâu có được đó là:

 

-         Không đào tạo đại trà, mỗi lớp học sẽ có từ 5-12 học viên để đảm bảo chuyên gia có thể dạy và hỗ trợ tốt nhất cho bạn trong quá trình theo học tại Stanford.

-         Bố trí phòng học theo kiểu phòng họp, làm việc nhóm giống như tại các công ty phần mềm hiện nay để tăng tính tương tác giữa thầy và trò.

-         Bạn sẽ được học kiến thức mới và nắm chắc nó qua những buổi thực hành. Được các chuyên gia chia sẻ, truyền đạt kinh nghiệm về xây dựng và phát triển dự án thực tế.

-         Sử dụng thành thạo các công cụ lập trình, quản lý mã nguồn như Visual Studio, NetBean, eclipse, Visual Source safe, Team Foundation, SVN,…Các công cụ đang được sử dụng tại các công ty hiện nay.

-         Được cung cấp đầy đủ tài liệu từ Slide bài giảng, video quay lại từng buổi học của chuyên gia để bạn tiện ôn tập lại, bài tập, sourcecode demo và các tài liệu liên quan khác độc quyền mang thương hiệu của Stanford – dạy kinh nghiệm lập trình.

-         Phát triển kỹ năng làm việc nhóm và có cơ hội tham gia các dự án đang phát triển tại công ty chúng tôi.

-         Hỗ trợ trong suốt quá trình làm việc sau này khi gặp khó khăn cũng như giới thiệu việc làm và cấp chứng chỉ hoàn thành khóa học kinh nghiệm tại Stanford.

 

Và còn rất rất nhiều điểm thú vị khác nữa đang chờ bạn khám phá khi tham gia học kinh nghiệm lập trình tại Stanford. Chi tiết xem tại: các chương trình ưu đãi dành cho học viên tại Stanford

 

Nào, hãy liên hệ ngay với chúng tôi theo Hotline: 0936 172 315 - 0963 723 236 hoặc 04 6275 2212 để được gọi lại tư vấn chi tiết hoặc xem tại website: www.stanford.com.vn.

 

Cảm ơn bạn đã quan tâm đến khóa học của Stanford! Hy vọng sẽ sớm được đón tiếp và làm việc với bạn tại Trụ sở chính của Stanford tại địa chỉ: Tầng 2, số 20 ngõ 678đường Láng (hoặc ngõ 100 Nguyễn Chí Thanh), Đống Đa, Hà Nội.

 

Ai đang xem chủ đề này?
Guest
Di chuyển  
Bạn không thể tạo chủ đề mới trong diễn đàn này.
Bạn không thể trả lời chủ đề trong diễn đàn này.
Bạn không thể xóa bài của bạn trong diễn đàn này.
Bạn không thể sửa bài của bạn trong diễn đàn này.
Bạn không thể tạo bình chọn trong diễn đàn này.
Bạn không thể bỏ phiếu bình chọn trong diễn đàn này.

Phát triển bởi VDH | Vũ Hồng © 2011, diễn đàn Thấy Hông?
Thời gian xử lý trang này hết 0.227 giây.