Chủ Nhật, 3 tháng 1, 2016

Diễn đàn c

Cùng nhau trao đổi ngôn ngữ lập trình C và C++ - Câu lạc bộ sinh viên
Tên người dùng: Mật mã:
Câu lạc bộ sinh viên

TIN TỨC

Sách Bài giảng (ebook) các môn học đã có

Tra cứu điểm các môn học|Hướng dẫn

Các bài thi thử trắc nghiệm trực tuyến

Ngân hàng đề thi các môn học



Go Back   Câu lạc bộ sinh viên > Góc học tập > Thế giới CNTT > Lập trình

Gởi Ðề Tài Mới  Trả lời
 
Ðiều Chỉnh Xếp Bài
  #1  
Old 02-01-2007
thanhnt106cn375's Avatar
thanhnt106cn375 thanhnt106cn375 is offline
Moderator
 
Tham gia ngày: Sep 2006
Nơi Cư Ngụ: Vietnam
Bài gởi: 180
Thanks: 116
Thanked 220 Times in 168 Posts

Level: 12 [♥ Bé-Yêu ♥♥ Bé-Yêu ♥♥ Bé-Yêu ♥]
Life: 0 / 286
Magic: 60 / 7762

Experience: 47%

Send a message via Yahoo to thanhnt106cn375
Angry Cùng nhau trao đổi ngôn ngữ lập trình C và C++

vừa rồi môn tin làm phần đó kém lắm :36_1_32:
__________________

Trả Lời Với Trích Dẫn
  #2  
Old 02-02-2007
cqhung's Avatar
cqhung cqhung is offline
Senior Member
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Vietnam
Bài gởi: 929
Thanks: 7
Thanked 1,138 Times in 387 Posts

Level: 27 [♥ Bé-Yêu ♥♥ Bé-Yêu ♥♥ Bé-Yêu ♥]
Life: 0 / 653
Magic: 309 / 18874
Experience: 14%

Send a message via Yahoo to cqhung Send a message via Skype™ to cqhung
Default

Nếu tôi không nhầm thì bên công nghệ cũng sẽ phải học môn Kỹ thuật lập trình, môn đó sử dụng C chứ không dùng C++ tuy nhiên nếu bạn nào thạo C thì học C++ cũng rất đơn giản do thuật toán của chúng là giống nhau chỉ khác các câu lệnh nhập và xuất.
Theo tôi thấy các bạn nên ôn lại C đi, và tất nhiên nên ôn lại từ đầu bắt đầu từ câu lệnh điều kiện cho đến hết phần Dữ liệu có cấu trúc Struct
Sau khi thành thạo các thuật toán trên thì chuyển sang Hàm và nếu nghiên cứu sâu hơn thì học thêm các thuật toán về đồ họa và hệ thống ( nhúng ASM vào C để tác động vào phần cứng)
__________________
Chu Quang Hưng
Mobi: 0433560388; Fax: 0433560074
Email: chuquanghung@gmail.com

Trả Lời Với Trích Dẫn
  #3  
Old 02-05-2007
nghiapn106cn7011's Avatar
nghiapn106cn7011 nghiapn106cn7011 is offline
Moderator
 
Tham gia ngày: Dec 2006
Nơi Cư Ngụ: Vietnam
Bài gởi: 97
Thanks: 3
Thanked 60 Times in 31 Posts

Level: 8 [♥ Bé-Yêu ♥]
Life: 0 / 196
Magic: 32 / 5172
Experience: 84%

Send a message via Yahoo to nghiapn106cn7011
Default Chuyên Đề C/C++

Thể theo nhu cầu tìm hiểu của nhiều bạn mới học lập trình, tôi sẽ sưu tầm 1 số bài Căn bản về lập trình C/C++ của UFO (OurViet, HVA) và chỉnh sửa, bổ sung thêm để mọi người cùng tham khảo.
Các bài viết sẽ tập trung giới thiệu lập trình C/C++ trên nền DOS, do đó các bạn cần trang bị 1 bộ editor và biên dịch vd như Turbor C++ hoặc Borland C++ 7.0.
Các bạn đọc nếu có thắc mắc gì thêm hãy reply sau mỗi post nhé.

Bài 1: CẤU TRÚC MỘT CHƯƠNG TRÌNH C/C++

1. Hàm main:
Có lẽ một trong những cách tốt nhất để bắt đầu học một ngôn ngữ lập trình là bằng một chương trình. Vậy đây là chương trình đầu tiên của chúng ta :

CODE

// my first program in C++

#include <stdio.h>
#include <conio.h>

int main ()
{
printf("Hello World!");
return 0;
}


hoặc là:
CODE

// my first program in C++

#include <iostream.h>

int main ()
{
cout << "Hello World!";
return 0;
}


Kết quả khi thực hiện ctrình như sau:
CODE
Hello World!


Chương trình trên đây là chương trình đầu tiên mà hầu hết những người học nghề lập trình viết đầu tiên và kết quả của nó là viết câu "Hello, World" lên màn hình. Đây là một trong những chương trình đơn giản nhất có thể viết bằng C/C++ nhưng nó đã bao gồm những phần cơ bản mà mọi chương trình C có. Hãy cùng xem xét từng dòng một :

CODE
// my first program in C++


Đây là dòng chú thích. Tất cả các dòng bắt đầu bằng hai dấu sổ (//) hoặc đóng/mở bằng dấu /* và */ được coi là chút thích mà chúng không có bất kì một ảnh hưởng nào đến hoạt động của chương trình. Chúng có thể được các lập trình viên dùng để giải thích hay bình phẩm bên trong mã nguồn của chương trình. Trong trường hợp này, dòng chú thích là một giải thích ngắn gọn những gì mà chương trình chúng ta làm.

CODE
#include <iostream.h>

Các câu bắt đầu bằng dấu (#) được dùng cho pre-processor (kí hiệu tiền xử lý). Chúng không phải là những dòng mã thực hiện nhưng được dùng để báo hiệu cho trình dịch. Ở đây câu lệnh #include <iostream.h> báo cho trình dịch biết cần phải kèm thêm (include) thư viện iostream. Đây là một thư viện vào ra (input-output) cơ bản trong C++ và nó phải được "include" vì nó sẽ được dùng trong chương trình. Đây là cách cổ điển để sử dụng thư viện iostream

CODE
int main ()

Dòng này tương ứng với phần bắt đầu khai báo hàm main. Hàm main là điểm (còn gọi là program entry-point) mà tất cả các chương trình C++ bắt đầu thực hiện. Nó không phụ thuộc vào vị trí của hàm này (ở đầu, cuối hay ở giữa của mã nguồn) mà nội dung của nó luôn được thực hiện đầu tiên khi chương trình bắt đầu. Thêm vào đó, do nguyên nhân nói trên, mọi chương trình C++ đều phải tồn tại một hàm main.
Theo sau main là một cặp ngoặc đơn bởi vì nó là một hàm. Trong C++, tất cả các hàm mà sau đó là một cặp ngoặc đơn () thì có nghĩa là nó có thể có hoặc không có tham số (không bắt buộc). Nội dung của hàm main tiếp ngay sau phần khai báo chính thức được bao trong các ngoặc nhọn ( { } ) như trong ví dụ của chúng ta

CODE
cout << "Hello World";

Dòng lệnh này làm việc quan trọng nhất của chương trình. cout là một dòng (stream) output chuẩn trong C++ được định nghĩa trong thư viện iostream và những gì mà dòng lệnh này làm là gửi chuỗi kí tự "Hello World" ra standard output hay màn hình.
Lưu ý: lệnh cout được khai báo trong iostream.h dùng cho C++, bạn có thể dùng 1 hàm tương tự với C chuẩn là hàm printf được khai báo trong stdio.h

Chú ý rằng mỗi dòng kết thúc bằng dấu chấm phẩy ( ; ). Kí tự này được dùng để kết thúc một lệnh và bắt buộc phải có sau mỗi lệnh trong chương trình C++ của bạn (một trong những lỗi phổ biến nhất của những lập trình viên C++ là quên mất dấu chấm phẩy).

CODE
return 0;

Lệnh return kết thúc hàm main và trả về mã đi sau nó, trong trường hợp này là 0. Đây là một kết thúc bình thường của một chương trình không có một lỗi nào trong quá trình thực hiện. Như bạn sẽ thấy trong các ví dụ tiếp theo, đây là một cách phổ biến nhất để kết thúc một chương trình C++.

Chương trình được cấu trúc thành những dòng khác nhau để nó trở nên dễ đọc hơn nhưng hoàn toàn không phải bắt buộc phải làm vậy. Ví dụ, thay vì viết

CODE

int main ()
{
cout << " Hello World ";
return 0;
}


ta có thể viết
CODE
int main () { cout << " Hello World "; return 0; }


cũng cho một kết quả chính xác như nhau. Tuy nhiên các bạn chú ý đến cách thức bố trí mã nguồn sao cho dễ đọc và thuận tiện khi phân tích, chỉnh sửa. Trong C++, các dòng lệnh được phân cách bằng dấu chấm phẩy ( . Việc chia chương trình thành các dòng chỉ nhằm để cho nó dễ đọc hơn mà thôi.

2. Các chú thích:
Các chú thích được các lập trình viên sử dụng để ghi chú hay mô tả trong các phần của chương trình. Trong C++ có hai cách để chú thích:

// Chú thích theo dòng
/* Chú thích theo khối */

Chú thích theo dòng bắt đầu từ cặp dấu xổ (//) cho đến cuối dòng. Chú thích theo khối bắt đầu bằng /* và kết thúc bằng */ và có thể bao gồm nhiều dòng. Chúng ta sẽ thêm các chú thích cho chương trình :

CODE

/* my second program in C++
with more comments */

#include <iostream.h>

int main ()
{
cout << "Hello World! "; // says Hello World!
cout << "I'm a C++ programmer"; // says I'm a C++ program
return 0;
}

Kết quả khi chạy chương trình sẽ cho ra:

CODE
Hello World! I'm a C++ program


Nếu bạn viết các chú thích trong chương trình mà không sử dụng các dấu //, /* hay */, trình dịch sẽ coi chúng như là các lệnh C++ và sẽ hiển thị các lỗi.
__________________
Phạm Minh Nghĩa
NickYM: chinhphuc_computer
Emai:chinhphuc_computer@yahoo.com
Mobile: 0986588901
Trả Lời Với Trích Dẫn
Có 7 thành viên đã cảm ơn bài viết của nghiapn106cn7011:
  #4  
Old 02-06-2007
nghiapn106cn7011's Avatar
nghiapn106cn7011 nghiapn106cn7011 is offline
Moderator
 
Tham gia ngày: Dec 2006
Nơi Cư Ngụ: Vietnam
Bài gởi: 97
Thanks: 3
Thanked 60 Times in 31 Posts

Level: 8 [♥ Bé-Yêu ♥]
Life: 0 / 196
Magic: 32 / 5172
Experience: 84%

Send a message via Yahoo to nghiapn106cn7011
Default SƠ LƯỢC VỀ VỀ NGÔN NGỮ LẬP TRÌNH C

Để thực hành tốt môn Phương pháp tính các bạn đọc lại một số phần cơ bản về Ngôn ngữ C, sau đó các bạn tự làm các bài thực hành sau.


Ngôn ngữ C do Brian W.Kernighan và Dennis M.Ritchie phát triển vào đầu những năm 70 với mục đích ban đầu để phát triển hệ điều hành UNIX. Hiện nay trên 90% chương trình nguồn của UNIX được viết bằng C, chưa đầy 10% bằng hợp ngữ. Người ta ngày càng nhận ra sức mạnh của C trong việc xử lý các vấn đề hiện đại của tin học như xử lý số, xử lý văn bản, cơ sở dữ liệu, lập trình hướng đối tượng. Năm 1983 một tiểu ban của viện tiêu chuẩn quốc gia Mỹ (ANSI) được thành lập nhằm đề ra một chuẩn cho ngôn ngữ C. Năm 1988 chuẩn ANSI C được ban hành. Chuẩn này bao gồm các mô tả về ngôn ngữ K & R quy định các thư viện chuẩn của C, nhờ đó tăng tính khả chuyển của các chương trình viết bằng C.
Hiện nay có các hệ chương trình dịch C nổi tiếng là
Turbo C, Borland C của hãng Borland Inc.
MSC, VC của Microsoft Corp.
I.Bộ Ký Tự
Mọi ngôn ngữ lập trình đều được xây dựng từ một bộ ký tự nào đó. Các ký tự được nhóm lại theo nhiều cách khác nhau để lập nên các từ. Đến lượt mình các từ lại được liên kết theo một quy tắc (đó là cú pháp của ngôn ngữ lập trình) nào đó để tạo thành các câu lệnh. Một chương trình gồm nhiều câu lệnh để diễn đạt một thuật giải nào đó. Ngôn ngữ lập trình C được xây dựng trên bộ ký tự sau:
+ 26 chữ cái tiếng Anh in hoa A-Z và in thường a-z.
+ các chữ số của hệ thập phân 0,1,..,9
+ ký tự gạch nối _, dấu cách
+ các ký hiệu toán học thông dụng +, -, *,/, =, , ( )...
+ các ký hiệu đặc biệt như các dấu chấm câu và các dấu khác:
. , ; :[ ] ( ) ? % @ \ | ! & # $ '

II.Tên của đối tượng (identifier).

Các đối tượng trong chương trình (tên chương trình, hằng, biến..) được chỉ định qua tên gọi của nó. Đó là một dãy một hay nhiều chữ cái, chữ số, dấu $, dấu _. Ký hiệu đầu tiên của tên gọi phải là chữ cái hoặc là dấu gạch nối. Độ dài cực đại của tên mặc định là 32, nhưng có thể đổi lại bằng một giá trị từ 1 tới 32, trong lựa chọn Option-> Compile-> Source-> Identifier Length trong môi trường TC.
Chú ý:
 Nên đặt tên cho gợi ra ý nghĩa của đối tượng.
 Không đặt tên trùng với từ khoá.
 Khác TP, ngôn ngữ C phân biệt chữ in hoa với chữ in thường.
 Thông thường chữ hoa dùng để đặt tên cho các hằng, còn các chữ in thường để đặt tên cho các biến, các hàm, các cấu trúc,..

Iii. Từ khóa.
Từ vựng của TC trước hết gồm một số từ của riêng TC được gọi là từ khoá (key word). Các từ này người sử dụng phải dùng đúng với cú pháp, không được dùng chúng vào việc khác hoặc đặt tên mới trùng với các từ khoá. Đó là các từ:

asmchardoexterngotointerruptregistersizeoftypedefv olatile breakconstdoublefarhugelongreturnstaticunionwhile casecontinueelsefloatifnearshortstructunsigned cdecldefaultenumforintpascalsignedswitchvoid


iV.Cấu trúc chương trình trong C.
Ví dụ 1:

/* Hiện dòng chữ lên màn hình */#include <stdio.h>#include <conio.h> main() { printf(“Hello, my students \n”); getch(); }
Các bước để thực hiện chương trình:
1. Soạn thảo chương trình nguồn và đặt tên, hello.c, trên một bộ soạn thảo văn bản nào đó, chẳng hạn của Turbo C. Ghi tệp nguồn lên đĩa (nhấn F2).
2. Nhấn Crt+F9 để dịch và chạy chương trình.
3. Kết quả ta sẽ thấy xuất hiện trên màn hình dòng chữ:

Hello, my students

4. Nhấn một phím bất kỳ sẽ quay về màn hình soạn thảo.
Ví dụ 2: Tính diện tích hình tròn
#include <stdio.h>
#include <conio.h>
#define PI 3.14159 //khai báo hằng số PI
float Dien_tich (float ban_kinh); //Mẫu hàm: prototype
main()
{ float R, S;
printf(“\n Ban kinh R=”);
scanf(“%f”, &R); // doc vao ban kinh R
S = Dien_tich(R);
printf(“\n Dien tich hinh tron la: %f“, S);
return (0);
getch();
}
float Dien_tich (float r);
{
float a;
a= PI*r*r;
return (a);// tra lai gia tri a cho ham Dien_tich
}

Hàm và cấu trúc chương trình C.
Một chương trình C bao giờ cũng gồm một hay nhiều hàm. Các hàm của C tương tự như thủ tục và hàm trong TP, đảm nhận một số nhiệm vụ cụ thể nào đó. Tên hàm là do người lập trình đặt theo quy tắc đặt tên của một đối tượng. Tuy vậy main() là một hàm đặc biệt. Chương trình C luôn bắt đầu thực hiện tại điểm đầu của hàm này. Điều đó có nghĩa là mọi chương trình C đều có một và chỉ một hàm main(). Hàm main() thường gọi các hàm khác để thực hiện công việc của nó, một số trong các hàm này nằm trong chương trình, một số khác nằm trong thư viện các hàm chuẩn. Người ta truyền dữ liệu cho hàm thông qua danh sách các đối số đặt trong dấu ngoặc đơn, nếu không có đối số vẫn phải để các dấu ngoặc đơn này. Thân của hàm là các câu lệnh được bao quanh dấu { và dấu }.
Khai báo tệp tiêu đề.
Khi dùng các hàm trong thư viện chuẩn, chúng ta phải khai báo tệp tiêu đề chứa nguyên mẫu của hàm đó (prototype) theo mẫu: #include <tên tệp tiêu đề>
Dòng chú thích nằm giữa /* và */.
Dấu kết thúc câu lệnh. Mỗi câu lệnh được kết thúc bằng dấu chấm phẩy.
V. Các kiểu dữ liệu cơ bản.
Tất cả các biến trước khi dùng phải được khai báo và kiểu của chúng phải được mô tả ngay sau khi khai báo. Có 3 kiểu dữ liệu cơ bản chuẩn trong C là int, float và char.
1.Kiểu số nguyên
Kiểu nguyên là tập hợp các số nguyên có thể biểu diễn trong máy tính . Kiểu nguyên cơ bản nhất trong C là kiểu nguyên có dấu được định nghĩa với từ khóa int, chiếm 2 byte phạm vi của nó là từ -32768 đến +32767. Trong C còn định nghĩa nhiều kiểu nguyên khác với các phạm vi khác nhau.

Tên kiểu Từ khóa Số byte Phạm vi
IntegerShort integerUnsigned integerLong integerUnsigned long integer intshortunsigned intlong insigned long 22244 -32768 & 32767-32768 & 327670 & 65 535-2 147 483 648-->+21474836470-->4 294 967 395
2. Kiểu số thực
Kiểu số thực là tập hợp các số thực có thể biểu diễn được trong máy tính và được định nghĩa với các từ khóa float, double, long double

Một số float có độ chính xác là 6 chữ số sau dấu chấm thập phân. Còn số double được biểu diễn với độ chính xác tới 15 chữ số sau dấu chấm thập phân . Số long double được biểu diễn với độ chính xác tới 19 chữ số sau dấu chấm thập phân .

Tên ý nghĩa Số byte Phạm vi
float Số thực dấu phẩy động, độ chính xác đơn 4 ±3.4E-38 & ± 3.4E+38Độ chính xác khỏang 6 chữ số
double Số thực dấu phẩy động, độ chính xác kép. 8 ±1.7E-308 & ±1.7E+308Độ chính xác khỏang 15 chữ số
long double Số thực dài dấu phẩy động, độ chính xác kép. 10 ± 3.4E-4932 & ±3.4E+4932Độ chính xác khỏang 19 chữ số
3. Kiểu ký tự
Kiểu ký tự là một tập hợp hữu hạn các ký tự được sắp xếp có thứ tự. máy tính dùng tập các ký tự đó để trao đổi thông tin qua các thiết bị vào ra. Có nhiều cách sắp xếp bộ chữ khác nhau. Tuy vậy người ta thường dùng bộ mã các ký tự ASCII (Americain Standard Code for Information Interchange). Các ký tự được mã bằng một byte. Vì vậy bảng mã ký tự có thể mã tối đa 256 ký tự. Trong đó 128 ký tự đầu được chuẩn hóa, còn 128 ký tự sau gọi là phần mở rộng được dùng để mã hóa các ký tự riêng của từng ngôn ngữ , các ký tự toán học, các ký tự đồ họa.
Kiểu ký tự được khai báo bằng chữ char.
Chú ý: Kiểu char thực chất là kiểu ký tự, nhưng C cho phép dùng một ký tự như là một số nguyên. Đây là một sự mềm dẻo của C. Khi tính toán trong biểu thức số học thì một biến (hằng) kiểu char được sử dụng như một số nguyên (bằng giá trị mã của ký tự này trong bảng mã ASCII). Khi tính toán trong biểu thức ký tự thì nó lại là ký tự.
VI. Hằng.
Hằng là đại lượng mà giá trị của nó không thay đổi trong suốt quá trình thực hiện chương trình. Hằng có thể có tên và cũng có thể dùng trực tiếp mà không cần đặt tên. Hằng có tên được định nghĩa bằng 2 cách:
+Cách đầu dùng mẫu sau:
#define <tên_hằng> <xâu>

Cấu trúc này định nghĩa một hằng ký hiệu có tên là <tên_hằng> bằng xâu ký tự <xâu>. Trình biên dịch sẽ thay thế mỗi khi xuất hiện tên_hằng bằng xâu. Chẳng hạn #define MAX 1000.
+ Cách sau dùng từ khóa const với mẫu sau:
const tên_kiểu tên_hằng = gía_trị;
Ví dụ:
const int MAXLINE=100;
const char NEWLINE=’\n’;
const char KCNTT=”KHOA CONG NGHE THONG TIN”;
Trong C có các loại hằng:
Hằng nguyên là một số nguyên có giá trị nằm trong phạm vi của kiểu int. Có thể biểu diễn hằng nguyên dưới dạng thập phân, thập lục phân hay bát phân.Ví dụ :
34 , -123 trong hệ thập phân,
034 , 056 trong hệ bát phân, có số 0 ở đầu số.
0x1A trong hệ thập lục phân, có 0x ở đầu số.
Hằng nguyên dài long giống như hằng nguyên chỉ khác ở chỗ thêm L hay l ở sau hằng đó biểu thị đó là hằng thuộc kiểu long. Một số nguyên vượt ra ngoài phạm vi cho phép được ngầm hiểu là hằng long.
Ví dụ: -1234L hay 43421l
Hằng dấu phẩy động (kiểu float hay double) được viết theo 2 cách. Cách 1 là cách viết thông thường với dấu chấm thập phân. Trong cách viết theo ký pháp khoa học hằng được viết gồm hai phần: phần định trị là một số nguyên, thực dạng thập phân và phần mũ, được phân cách bằng chữ E, mũ cơ số 10. Bởi vì có thể tăng giảm giá trị của phần mũ và kéo theo việc dịch chuyển dấu chấm thập phân trong phần định trị, nên số thực viết dưới dạng này còn được gọi là số thực dấu phẩy động. Cách 1 được gọi là cách viết với dấu phẩy tĩnh.
Ví dụ: 345.67 123.0 .456 1234.
123.456E-4 = 12.3456E-3
0.123E3 = 1.23E2
Hằng ký tự là một ký hiệu trong bảng mã ASCII. Giá trị của hằng chính là mã ASCII của ký hiệu này.
Ví dụ: Hằng ‘A’ có giá trị 65;
Hằng ‘d’ có giá trị 100.
Hằng ‘0’ có giá trị 48.
Hằng ký tự còn được viết dưới dạng: \x1x2x3 trong đó x1x2x3 là số hệ 8 mà giá trị của nó bằng mã ASCII của ký tự cần biểu diễn. Ví dụ ‘a’=’\141’ hay ‘A’=’\101’.
Một số hằng đặc biệt được viết theo quy ước sau:

Cách viết Ký tự
‘\’’‘\”’‘\\’‘\n’‘\0’‘\t� ��‘\b’‘\r’ ‘“\\n chuyển dòng\0 ký tự nulTabBackspaceCR về đầu dòng

Chú ý:
 Hằng ký tự thực sự là một số nguyên, vì vậy lệnh
printf (“%d %d”,’A’,’B’) sẽ in ra 65 66.
 Ký tự ’0’ khác với ‘\0’. Hằng 0 ứng với chữ số 0 có giá trị mã 48, còn’\0’ là ký tự nul có mã bằng 0.

Hằng xâu ký tự là một dãy ký tự bất kỳ đặt trong hai dấu nháy kép “. Ví dụ: “Ha noi”, “Viet nam”. Trong máy xâu ký tự được lưu trữ dưới dạng một mảng với các phần tử là các ký tự. Trình biên dịch tự động thêm ký tự nul \0 vào cuối xâu, đó là dấu hiệu kết thúc xâu.

Chú ý: Cần phân biệt ‘a’ với “a”. ‘a’ là một ký tự được lưu trong 1 byte, còn “a” là 1 hằng xâu ký tự được lưu trữ trong 2 byte, byte đầu lưu chữ a byte sau lưu ký tự ‘\0’.

vII. Biến.

Biến là yếu tố cơ bản của bất kỳ ngôn ngữ lập trình nào. Biến là một vùng của bộ nhớ dành để lưu trữ một gía trị thuộc một kiểu dữ liệu nào đó và có thể đặt tên để tiện truy nhập. Tại những thời điểm khác nhau biến có thể cất giữ các giá trị khác nhau. Trước khi dùng một biến ta phải khai báo theo quy tắc sau:
Kiểu_dữ_liệu Tên_biến;
Có thể khai báo nhiều biến cùng kiểu trên cùng một hàng, các tên biến được phân cách bằng dấu phẩy. Các khai báo biến cần đặt ngay sau dấu {đầu tiên của thân hàm, đứng trước mọi câu lệnh khác. Như vậy sau câu lệnh gán chẳng hạn thì không được khai báo nữa. Việc khởi tạo cho các biến có thể được thực hiện cùng với khai báo bằng cách đặt dấu bằng = và một giá trị nào đó cùng kiểu. Mỗi biến được cấp phát một vùng nhớ gồm một số byte liên tiếp. Địa chỉ của byte đầu tiên chính là địa chỉ của biến. Để nhận địa chỉ của biến ta dùng phép toán: &tên_biến.

Ví dụ1./* Khai báo đúng */ main() { int bien1, bien2=0; float r; char ch; bien1=20; r =45.6; ch=’a’; .... } Ví dụ 2. /* Khai báo sai */ main() { int bien1, bien2; float r; char ch; bien1=20; double bien3; /*sai vị trí khai báo*/ r=45.6; .... }
ViiI. Biểu thức .

Biểu thức là một sự kết hợp các phép toán và các toán hạng để diễn đạt một công thức nào đó. Toán hạng có thể là các đại lượng có giá trị như hằng, biến hay một biểu thức con. Mỗi biểu thức có một giá trị thuộc kiểu nguyên hay thực. Chú ý các mệnh đề lô-gic có giá trị nguyên và khác không nếu đúng, còn bằng không tương ứng với mệnh đề sai (Trong C không có kiểu lô-gic như trong TP). Biểu thức được dùng trong:
 vế phải của lệnh gán,
 làm tham số thực sự khi gọi các hàm,
 làm chỉ số,
 các câu lệnh if, for, while, do while,
 các biểu thức phức tạp hơn.
Trong C người ta phân biệt các phép toán sau:

1) Các phép toán số học.
Phép toán ý nghĩa Ví dụ
- Đổi dấu một số thực hay nguyên -12, -A
+ Cộng hai số thực hoặc nguyên 12+13, A+B
- Trừ hai số thực hoặc nguyên 50- A, X-89
* Nhân hai số thực hoặc nguyên A*B, 12*C
/ Chia hai số thực hoặc nguyên a/b, 34/23=1
% Chia hai số nguyên lấy phần dư a%b, 13%4=1














Phép chia / hai số nguyên sẽ chặt cụt phần lẻ. Độ ưu tiên của các phép toán được hiểu theo nghĩa toán học thông thường.

2) Các phép toán quan hệ.

Trong C định nghĩa các phép toán so sánh (quan hệ) sau:

Phép toán ý nghĩa Ví dụ
> So sánh lớn hơn giữa các số thực hoặc nguyên a>b 3>7 có giá trị 0
>= So sánh lớn hơn hoặc bằng giữa các số thực hoặc nguyên a>=b5>=10 có giá trị 0
< So sánh nhỏ hơn giữa các số thực hoặc nguyên c<d5 <8 có giá trị 1
<= So sánh nhỏ hơn hoặc bằng giữa các số thực hoặc nguyên a<=7
== So sánh bằng nhau giữa các số thực hoặc nguyên a==b6==9 có giá trị 0
!= So sánh khác nhau giữa các số thực hoặc nguyên a!=b4!=5 có giá trị 1

Bốn phép toán đầu cùng mức ưu tiên, hai phép toán sau cùng mức nhưng thấp hơn mức của 4 phép trên. Các phép toán quan hệ có độ ưu tiên thấp so với các phép toán số học.
3) Các phép toán lô-gic.
Trong C sử dụng 3 phép tính lô-gic:
 phủ định một ngôi !
 phép “và” && (AND)
 phép “hoặc là” || (OR)

Hai phép && và || có độ ưu tiên thấp hơn so với các phép toán so sánh, tất cả chúng lại có mức ưu tiên thấp hơn so với phép phủ định một ngôi.

Bảng giá trị của các phép toán này như sau:

X Y !X X && Y X||Y
1 1 0 1 1
1 0 0 0 1
0 1 1 0 1
0 0 1 0 0

4) Các phép toán tăng, giảm.

C đưa ra hai phép toán một ngôi để tăng và giảm các biến thuộc kiểu nguyên hay thực. Toán tử tăng ++ sẽ cộng thêm 1 vào toán hạng còn toán tử - - giảm sẽ trừ đi 1 vào toán hạng của nó. Các dấu phép toán ++ và -- có thể đứng trước hay sau toán hạng. Ta có bảng sau:

Toán tử Trước khi dùng Sau khi dùng
Tăng 1 đ.v ++ n n ++
Giảm 1 đ.v -- n n --
Sự khác nhau giữa n++ và ++n là ở chỗ: trong phép n++ thì n được tăng sau khi giá trị của nó được sử dụng, còn trong phép ++n thì n được tăng trước khi giá trị của nó được sử dụng. Đối với n--và --n cũng như vậy.
Ví dụ: giả sử trước mỗi phép tính ta có m=3 và n=10.

Phép toán Tương đương Kết quả
m=++n n:=n+1; m=n m=11; n=11
m=n++ m=n; n=n+1 m=10; n=11
n++ n=n+1 n=11
m=++n + 5 n=n+1; m=n+5 m=16; n=11
m=n++ +5 m=n+5; n=n+1 m=15; n=11


5) Phép toán lấy địa chỉ của một biến.
Phép toán & tên_biến cho phép xác định địa chỉ của tên_biến, đó là địa chỉ của byte đầu tiên trong vùng nhớ của biến đó.

6) Phép toán chuyển đổi kiểu giá trị.

Việc chuyển đổi kiểu giá trị thường diễn ra một cách tự động trong 2 trường hợp:
- Khi biểu thức gồm các số hạng khác kiểu, các toán hạng có kiểu thấp hơn sẽ được chuyển đổi sang kiểu cao hơn trước khi thực hiện phép toán, tức là theo sơ đồ sau:
char --> int --> long --> float -->double --> long double.
- Khi gán một giá trị kiểu này cho một biến có kiểu khác. Giá trị của vế phải tự động chuyển sang giá trị có kiểu của vế trái. Kiểu int sang float và ngược lại từ kiểu float sang int bằng cách bỏ phần lẻ, kiểu double sang kiểu float bằng cách làm tròn.Ví dụ nếu n là biến nguyên thì sau câu lệnh n=15.7, nó sẽ nhận giá trị 15.
Tuy nhiên ta có thể chuyển một kiểu bất kỳ sang một kiểu mong muốn bằng phép ép kiểu:
(Kiểu) biểu_thức;
Ví dụ:
Phép toán (int)a cho giá trị kiểu int dù rằng a có kiểu gì chăng nữa. Chú ý rằng bản thân kiểu của a vẫn giữ nguyên.
Phép ép kiểu có cùng mức ưu tiên như các toán tử một ngôi.
Chú ý: + Muốn có giá trị chính xác hơn trong phép chia 2 số kiểu nguyên nên dùng phép ép kiểu: ((float) a)/b;
+ Đừng quên thứ tự ưu tiên:
(int) 3.4 *10 =3 *10 =30;
(int) (3.4 *10) = (int) 34.0 = 34.

7) Biểu thức gán. Toán tử gán có 2 dạng:

Biến = Biểu_thức Gán giá trị của biểu thức cho Biến.
Biến op= Biểu_thức hay tương đương Biến = (Biến) op (Biểu_thức);
trong đó op là một toán tử nào đó. Lấy giá trị của Biến thực hiện phép toán op với biểu thức rồi gán cho Biến. Có một số cách viết đặc biệt như sau:

Dạng viết thông thường Dạng viết thu gọn
i = i+ expr; i += expr;
i = i- expr; i -= expr;
i = i* expr; i *= expr;
i = i/ expr; i /= expr;
i = i% expr; i %= expr;

Nếu thêm dấu chấm phẩy vào sau biểu thức gán thì ta được câu lệnh gán. Biểu thức gán có thể được dùng trong các phép toán thông thường. Chẳng hạn
a = b = 10;
thì có nghĩa là gán 10 cho cả a và b. Kết quả a=10 và b=10. Câu lệnh
x = (a=5) * (b=10);
sẽ gán 5 cho a và 10 cho b sau đó gán tiếp 5*10=50 cho x.

8) Biểu thức điều kiện.
Biểu thức điều kiện có dạng:
expr1 ? expr2 : expr3
trong đó expr1, expr2, expr3 là các biểu thức nào đó. Nếu expr1 != 0 (tức là đúng) thì biểu thức điều kiện sẽ là expr2, trái lại nó sẽ nhận biểu thức expr3. Kiểu của biểu thức điều kiện sẽ là kiểu cao nhất trong các kiểu của expr2 và expr3.
Biểu thức điều kiện thực sự là một biểu thức và ta có thể dùng nó như các biểu thức khác. Ví dụ,
s = (a>b)? a:b;
sẽ gán giá trị cực đại của a và b cho s. Còn lệnh sau
s = a>b?(a>c?a:c): (b>c?b:c);
gán cho s giá trị lớn nhất trong ba giá trị a,b,c;

9) Thứ tự ưu tiên của các phép toán.
Thứ tự ưu tiên của các phép toán được trình bày trong bảng sau:

stt Phép toán Trật tự kết hợp
1234567891011121314 ( ) [] ->! ~ & * - ++ -- (type)sizeof* (nhân) / %+ -<< >>< <= > >=== !=&^|&&||? := += -= *= /= %= <<= >>= &= ^= |= Trái qua phải Phải qua tráiTrái qua phảiTrái qua phảiTrái qua phảiTrái qua phảiTrái qua phảiTrái qua phảiTrái qua phảiTrái qua phảiTrái qua phảiTrái qua phảiPhải qua tráiPhải qua trái
Các phép toán ở hàng trên có mức ưu tiên cao hơn, các phép toán cùng dòng có cùng mức ưu tiên. Trình tự tính toán theo cột trình tự kết hợp.
IX. các hàm số học chuẩn.
Trong C đã định nghĩa một số hàm với các đối số là các số thực hoặc nguyên. Các hàm này đẻ trong tệp <math.h> vì vậy ở đầu chương trình cần phải khai báo #include <math.h>. Một số hàm thường gặp được liệt kê trong bảng sau:

STT Hàm Kiểu giá trị nhận được Tác dụng
12345678910111213 abs(i)fabs(f)sin(f)cos(f)cosh(f)tan(f)exp(f)log(f) pow(f1,f2)floor(f)ceil(f)sqrt(f)srand(f) intdoubledoubledoubledoubledoubledoubledoubledoubl edoubledoubledoublevoid Trả giá trị tuyệt đối của số nguyên iTrả giá trị tuyệt đối của số thực fTrả giá trị hàm sinTrả giá trị hàm cosinTrả giá trị hàm cosin hyperbolicTrả giá trị hàm tang Trả giá trị hàm e mũTrả giá trị hàm log cơ số tự nhiên eTrả giá trị f1 mũ f2Trả giá trị hàm nền (làm tròn xuống)Trả giá trị hàm trần (làm tròn lên)Trả giá trị hàm căn bậc haiKhởi tạo bộ tạo số ngẫu nhiên
x Vào/ra dữ liệu.
Các chương trình C cung cấp cho người lập trình hai thư viện các hàm vào/ra . Danh sách các hàm này nằm trong các tệp tiêu đề studio.h và conio.h
1.Đưa kết quả lên màn hình.
Để đưa kết quả lên màn hình ta dùng câu lệnh (hàm):
printf(dòng_điều_khiển, bt1,bt2,...,btn);
trong đó bt1,bt2,..,btn là các biểu thức mà giá trị của chúng cần đưa ra màn hình.
Ví dụ:

/* Chương trình */main() {int x=12345;float r; char ch=’A’;r=12345.678;printf(“\nx=%7d\nr=%10.2\ nch=%2c”, x,r,ch); } /* Kết quả trên màn hình */ x= 12345r = 12345.68ch= A
Dòng_điều_ khiển là một hằng xâu ký tự bao gồm ba loại:
a) các ký tự điều khiển, ví dụ ‘\n’.
b) các ký tự đặc tả dùng để mô tả cách đưa các biểu thức thuộc các kiểu khác nhau ra màn hình, mỗi đặc tả ứng với một biểu thức. Chúng có dạng:
+) %[width]d đối với biểu thức nguyên, trong đó width là độ rộng tối thiểu dành cho trường đưa ra, nếu thiếu hoặc vắng mặt tham số này thì độ rộng trên màn hình sẽ là độ rộng thực tế cần cho biến này. (Xem ví dụ trên %7d, %10.2f, %2c).
+) %[width][.pp]f sẽ đưa ra màn hình một biểu thức thực theo khuôn dạng chiếm tối thiểu width chỗ trên màn hình trong đó phần thập phân chiếm pp chỗ.
+ %[width]c sẽ đưa một ký tự lên màn hình với độ rộng là width.
c) các ký tự hiển thị là các ký tự không thuộc một trong hai loại trên, chúng được đưa lên màn hình như đã được viết ra trong xâu điều khiển. Trong ví dụ trên đó là các ký tự x,=, r, =, ch, =.
2 Vào dữ liệu từ bàn phím.
Để đọc dữ liệu từ bàn phím vào các biến b1, b2, .., bn ta dùng hàm
scanf (dòng_điều_khiển ,&b1,&b2,..&bn));
Xét ví dụ sau.
main()
{
int a,b; float x,y;
printf(“\nHay nhap 2 gia tri nguyên va 2 gia tri thưc:”);
scanf(“%d%d%f%f”, &a,&b,&x,&y);
}

Xi các cấu trúc điều khiển
1. Câu lệnh đơn và câu lệnh ghép
Một biểu thức theo sau bằng dấu chấm phảy “;” trở thành câu lệnh đơn. Ví dụ: x=0; i++; printf();
Câu lệnh ghép là một khối các câu lệnh đặt trong dấu { và }. Về cú pháp ở đâu có thể đặt một câu lệnh đơn đều có thể đặt khối lệnh ở đó. Không bao giờ được đặt dấu ; sau một khối lệnh.

2.Toán tử if
Toán tử if cho phép lựa chọn một trong hai nhánh tùy thuộc vào sự bằng không hay khác không của một biểu thức, nó có 2 dạng:

If (biểu_thức) khối_lệnh_1 else khối_lệnh_2 If (biểu_thức) khối_lệnh_1
Chú ý: Biểu thức có thể nhận giá trị nguyên hay là thực. Trước tiên máy tính giá trị của Biểu_thức, nếu nó đúng (khác không ) thì khối_lệnh_1 được thực hiện, còn nếu biểu thức sai (có giá trị bằng 0) thì máy sẽ thực hiện khối_lệnh_2 hoặc không làm gì (dạng 2).
Ví dụ 1. Tính max của hai biến a và b.
#include <stdio.h>
main()
{
float a,b,max;
int k;
tt: printf(“\n Nhap vao hai so thuc bat ky a va b: ”);
scanf(“%f%f”,&a,&b);
if (a>b) max=a; else max=b;
printf(“\na = %8.2f\n b= %8.2f \n max= %8.2f”,a,b,max);
printf(“Co tiep tuc không -(C/K)”);
k=getch();
if ((k==’c’) || (k==’C’)) goto tt;
}

Chú ý:
 Trước else có dấu ;
 Câu lệnh if có thể lồng nhau. Khi một else bị bỏ qua trong một dãy các câu lệnh if lồng nhau, thì else được gắn với if không có else ở gần nhất trước đó.
Ví dụ 2: Giải phương trình bậc hai.

#include <stdio.h>
#include <math.h>
main()
{
float a,b,c,d, x1,x2;
printf(“\nNhap a,b,c :”);
scanf(“%f%f%f”,&a,&b,&c);
d=b*b-4*a*c;
i f (d<0.0)
print f(“Phuong trinh vo nghiem”);
el se
i f (d==0.0)
printf(“Phuong trinh co nghiem kep: %0.2f”,-b/(2*a));
el se
{
x1=(-b-sqrt(d))/(2*a); x2=(-b+sqrt(d))/(2*a);
printf(“\nx1 = %0.2f x2 = %0.2f”,x1,x2);
}
}

3. Toán tử swich.
Toán tử switch cho phép chương trình rẽ nhiều nhánh tùy theo giá trị của một biểu thức nguyên. Nó có dạng như sau:
switch (biểu_thức_nguyên)
{
case n1: Các câu lệnh; [break;]
case n2: Các câu lệnh; [break;]
. . . . . . . .
case nk: Các câu lệnh; [break;]
[default: Các câu lệnh; [break;]]
}
trong đó ni là giá trị nguyên,ký tự, biểu thức hằng.
Sự hoạt động của toán tử switch như sau:
 Khi giá trị biểu_thức_nguyên bằng ni thì máy nhảy tới câu lệnh có nhãn case ni.
 Khi giá trị biểu_thức_nguyên khác tất cả các ni thì nếu có default máy nhảy tới nhãn default còn nếu không có nhãn default máy ra khỏi toán tử switch.
 Bình thường sau khi thực hiện các câu lệnh sau nhãn case ni máy sẽ thực hiện các câu lệnh sau các nhãn tiếp theo cho tới khi gặp dấu } cuối cùng. Bởi vậy để ra khỏi switch sau khi thực hiện một câu lệnh sau một nhãn nào đó ta dùng lệnh break.
Ví dụ 3:
#include <stdio.h>
#include <conio.h>
main()
{
int thang, nam,so_ngay;
clrscr();
printf(“Nhap vao thang, nam: “);
scanf(“%d%d”,&thang,&nam);
switch (thang)
{
case 1: case 3: case 5: case 7:
case 8: case 10: case 12: so_ngay=31; break;
case 4: case 6: case 9: case 11: so_ngay=30; break;
case 2: if (nam %4 ==0 )so_ngay=29; else so_ngay=28; break;
}
printf(“\nThang %d nam %d co %d ngay”,thang,nam,so_ngay);
getch();
}
4. Toán tử goto và nhãn
Nhãn cũng có dạng như tên biến và có dấu “ :” đứng sau. Nhãn có thể gán cho bất cứ câu lệnh nào. Còn toán tử goto có dạng
goto nhan;
Khi gặp câu lệnh này máy sẽ nhảy tới câu lệnh sau nhan. Chú ý khi dùng nhãn:
 Goto và nhãn phải cùng nằm trong một hàm, t.l toán tử goto chỉ cho phép nhảy từ điểm này sang một điểm khác trong thân của cùng một hàm, không được nhảy từ hàm này sang hàm khác.
 Không dùng goto để nhảy từ ngoài vào trong một khối lệnh.
 Nói chung nên hạn chế dùng goto.
5.Toán tử for
Câu lệnh for có dạng:
for (biểu_thức_1; biểu_thức_2; biểu_thức_3)
Khối_lệnh; /* thân của chu trình*/
Như vậy toán tử này có 3 biểu thức và thân của for. Thân là một câu lệnh hay một khối câu lệnh. Bất kỳ biểu thức nào trong 3 biểu thức trên đều có quyền vắng mặt, nhưng phải giữ dấu chấm phẩy.
Ví dụ 4: In bảng cửu chương.
#include <stdio.h>
#include <conio.h>
main()
{
int hang,cot;
clrscr();
for ( hang=1; hang<11;hang++)
{
for (cot=1;cot<11;cot++)
printf(“%4d”,hang*cot);
printf(“\n”);
}
getch();
}

Thông thường biểu thức 1 là một toán tử gán để khởi tạo cho biến điều khiển, biểu thức 2 là một quan hệ lô-gic biểu thị điều kiện để tiếp tục chu trình, biểu thức 3 là toán tử gán để thay đổi giá trị của biến điều khiển.
Sự hoạt động của toán tử for như sau:
1) Xác định biểu thức 1.
2) Xác định biểu thức 2.
3) Tùy thuộc vào sự đúng sai của biểu thức 2 máy sẽ lựa một trong hai nhánh:
 Nếu biểu thức 2 có giá trị 0 (sai), máy ra khỏi vòng for.
 Nếu biểu thức 2 có giá trị khác không (đúng) máy thực hiện các câu lệnh trong thân của for. Khi gặp dấu } cuối cùng hay lệnh continue máy sẽ chuyển sang bước 4.
4) Tính biểu thức 3 rồi quay lại bước 2 bắt đầu một vòng lặp mới của chu trình.

Chú ý:
1) Biểu thức 1 chỉ được tính một lần, còn biểu thức 2 và 3 có thể lặp lại nhiều lần.
2) Khi biểu thức 2 vắng mặt nó luôn được xem là đúng. Khi đó việc ra khỏi vòng for phải nhờ các lệnh break, goto hoặc return.
3) Trong dấu ngoặc tròn sau từ khóa for có thể mỗi phần là một dãy biểu thức, phân cách bởi dấu phẩy.
4) for hay được dùng khi có sự khởi đầu và khởi đầu lại.

6. Toán tử while
Toán tử while dùng để thực hiện các chu trình, nó có dạng:
while (biểu_thức)
{ khối_lệnh }
Ví dụ 5: Tính tích vô hướng của hai vec-tơ có 5 thành phần thực.
#include <stdio.h>
float x[]={4,6.5,8,3.5}, y[]={2.5,2,3.5,4};
main()
{
float s=0; int i=0;
while ( i <4) { s +=x[i]*y[i]; i++;}
printf (“\n Tich vo huong = %8.2f”, s);
}

Sự hoạt động của toán tử while như sau:
1) Xác định giá trị của biểu_thức.
2) Tùy thuộc vào sự đúng sai của biểu_thức máy sẽ lựa một trong hai nhánh:
 Nếu biểu_thức có giá trị 0 (sai), máy ra khỏi chu trình.
 Nếu biểu_thức có giá trị khác không (đúng) máy thực hiện các câu lệnh trong thân của while. Khi gặp dấu } cuối cùng máy sẽ chuyển sang bước 1.
Chú ý:
1) Trong dấu ngoặc tròn sau từ khóa while có thể đặt một biểu thức hoặc một dãy biểu thức, phân cách bởi dấu phẩy. Tính đúng sai của dãy biểu thức là tính đúng sai của biểu thức cuối cùng trong dãy này.
2) Khi gặp break máy sẽ thoát khỏi toán tử while sâu nhất.

7. Toán tử do while
Trong toán tử while và for, việc kiểm tra điều kiện của chu trình đặt ở đầu. Ngược lại toán tử do while việc kiểm tra điều kiện kết thúc chu trình lại đặt ở cuối. Như vậy bản thân chu trình bao giờ cũng được thực hiện một lần. Dạng tổng quát của toán tử này như sau:

do
{
Khối lệnh /* Thân chu trình*/
} while (biểu_thức);
Sự hoạt động của toán tử do while như sau:
1) Thực hiện các câu lệnh trong thân do while.
2) Khi gặp dấu } cuối cùng trong thân do while máy sẽ xác định giá trị của biểu_thức sau từ khóa while.
3) Tùy thuộc vào sự đúng sai của biểu_thức máy sẽ lựa một trong hai nhánh:
 Nếu biểu_ thức có giá trị 0 (sai), máy ra khỏi chu trình.
 Nếu biểu_thức có giá trị khác không (đúng) máy sẽ chuyển về bước 1.
Ví dụ 6: Nhập vào một số nguyên dương hoặc âm), đổi số nguyên này ra xâu ký tự.
#include <stdio.h>
#include <conio.h>
main()
{
int n; char ch;
char st[10]; {xâu ký tự}
int i=0, j;
clrscr();
printf(“Hay nhap vao mot so nguyen: ”); scanf(“%d”,&n);
if(n<0)
{
st[i++]=’-‘;
n= -n;
}
do
{
st[i++]= n % 10 +’0’; n /=10;
} while (n >=10);
st[i++]=n+’0’;
st[i]=’\0’;
printf(“Dao nguoc cua xau ung voi so da nhap: st= ‘%s’”,st);
n=i;
for (i=st[0]==’-‘?1:0, j=n-1; i<j; i++,j--)
{
ch=st[i];
st[i]=st[j];
st[j]:=ch;
}
printf(“Xau ung voi so da nhap: st= ‘%s’”,st);
getch();
}
8. Câu lệnh break.
Câu lệnh break cho phép ra khỏi vòng for, while, do while và switch. Khi có nhiều chu trình lồng nhau, câu lệnh break sẽ đưa máy ra khỏi chu trình (hoặc switch) bên trong nhất chứa nó. Điều đó có nghĩa break có khả năng chuyển điều khiển ra khỏi một chu trình từ một điểm bất kỳ bên trong chu trình mà không cần đến điều kiện kết thúc chu trình. Mọi câu lệnh break có thể thay bằng goto với nhãn thích hợp.
Ví dụ 7. Chương trình sau để kiểm tra tính nguyên tố của một số nguyên dương n được nhập từ bàn phím.
#include <stdio.h>
#include <math.h>
main()
{
int i, n, is_ngto=1;
printf(“\n Hay nhap mot so nguyen: “);
scanf (“%d”,&n);
for (i=2; i<= sqrt(n); i++)
If ((n % i) ==0)
{
is_ngto=0; break;
}
If (is_ngto) printf(“%d là số nguyên tố”, n); else printf (“%d là hợp số.”, n);
}
XII Hàm trong C
12.1 Định nghĩa hàm.
Một chương trình C bao giờ cũng gồm một hay nhiều hàm. Các hàm của C tương tự như thủ tục và hàm trong TP, đảm nhận một số nhiệm vụ cụ thể nào đó. Trong số các hàm bao giờ cũng có một và chỉ một hàm chính main(). Thứ tự của các hàm trong chương trình có thể là tùy ý nhưng chương trình C luôn bắt đầu thực hiện tại điểm đầu của hàm main() này. Hàm main() thường gọi các hàm khác để thực hiện công việc của nó, một số trong các hàm này được xây dựng trong chương trình, một số khác có sẵn trong thư viện các hàm chuẩn.
Các hàm chuẩn trong thư viện C cung cấp rất nhiều các hàm để tính toán, các thao tác xử lý xâu, các thao tác ký tự, các thao tác vào/ra và nhiều thao tác thông dụng khác. Một số hàm trong thư viện toán học của C được cho trong Bảng 1.

Hàm Mô tả Hàm Mô tả
sqrt(x)exp(x)log(x)log10(x)fabs(x)ceil(x) Căn bậc 2 của số thực x hàm exlô-ga-rit cơ số e của xlô-ga-rit cơ số 10 của xgiá trị tuyệt đối của xlàm tròn số nguyên nhỏ nhất lớn hơn x pow(x,y)fmod(x,y)sin(x)cos(x)tan(x) floor(x) x mũ yphần dư của x chia cho yhàm sin hàm coshàm tanglàm tròn số nguyên lớn nhất nhỏ hơn x
Bảng 1.
Người lập trình có thể viết các hàm thực hiện các công việc xác định và chúng được dùng tại nhiều nơi trong chương trình. Chúng được gọi là các hàm do người dùng định nghĩa. Các hàm được gọi thực hiện bằng lời gọi hàm. Các lời gọi phải chỉ rõ tên hàm và cung cấp các thông tin (hay còn gọi là các tham số) theo đúng trình tự và số lượng khi khai báo hàm đó.
12.2 Xây dựng hàm và cách sử dụng.
a). Xây dựng hàm.
Trước khi xem xét cách xây dựng một hàm ta hãy xét ví dụ một chương trình có hai hàm. Đó là bài toán đơn giản: tìm giá trị lớn nhất của 3 số thực nhập vào từ bàn phím. Chương trình gồm hai hàm, hàm main và hàm mà ta đặt tên là hàm gtmax. Nhiệm vụ của hàm gtmax này là tính giá trị lớn nhất trong 3 số giả định là x,y,z. Nhiệm vụ của hàm main là nhận 3 giá trị thực từ bàn phím rồi gọi hàm gtmax để tính giá trị lớn nhất của 3 số vừa nhập vào và thông báo lên màn hình. Toàn văn chương trình như sau:

# include <stdio.h>
#include <conio.h>
float gtmax (float x,float y, float z); /* Nguyên mẫu của hàm */
main()
{
float a,b,c;
printf(“ \nHay nhap 3 so thuc: “);
scanf(“%f%f%f”,&a,&b,&c);
print f(“\na=%0.2f\nb=%0.2f\nc=%0.2f\n max=%0.2f”,a,b,c,gtmax(a,b,c));
getch();
}
float gtmax (float x,float y, float z)
{
float max; /*Biến cục bộ trong thân hàm}
max=x>y?x:y;
return (max>z?max:z);
}

Quan sát ví dụ trên ta thấy, để xây dựng hàm ta phải tiến hành khai báo kiểu hàm, đặt tên hàm, lựa chọn và khai báo các đối (các tham số hình thức) và đưa ra các câu lệnh cần thiết để thực hiện nhiệm vụ của hàm. Một hàm được viết theo mẫu sau:
type ten_ham (Khai báo các đối)
{
Khai báo các biến cục bộ;
Các câu lệnh;
[ return[biểu_thức];]
}
Khi xây dựng một hàm cần quán triệt các quy tắc sau.
1) Các hàm không được lồng vào nhau. Hàm là một đơn vị độc lập của chương trình. Các hàm có vai trò ngang nhau, vì vậy không cho phép xây dựng một hàm bên trong hàm khác.
2) Dòng tiêu đề là dòng đầu tiên chứa các thông tin về: kiểu hàm, tên hàm, kiểu và tên của đối. Ví dụ
float gtmax (float x,float y, float z)
Đây là cách khai báo hàm theo kiểu ANSI (American National Standards Institute).
3) Thân hàm sau dòng tiêu đề, bắt đầu từ dấu { và kết thúc bởi dấu }. Thân hàm chứa các câu lệnh cần thiết để giải quyết nhiệm vụ của hàm. Trong thân hàm có thể khai báo các biến cục bộ, biến max trong ví dụ trên. Những biến cục bộ chỉ có tác dụng trong hàm, nơi khai báo chúng, không có bất cứ một liên hệ nào với các biến của các hàm khác trong chương trình. Trái lại các đối (hay còn gọi là các biến hình thức) dùng để trao đổi dữ liệu giữa các hàm. Có hai loại đối. Loại thứ nhất gồm các đối dùng để chứa các thông tin vào gọi là đối vào, loại thứ hai để chứa các kết quả mới nhận được( các thông tin ra) gọi là các đối ra. Trong thân hàm có thể có một hay nhiều lần dùng toán tử return và cũng có thể không dùng câu lệnh này. Dạng tổng quát của nó là:
return [biểu_thức];
Khi đó giá trị của biểu_thức sẽ được gán cho tên hàm.
Chú ý:
1. Đối với các hàm không trả giá trị nào cả (giống như thủ tục trong PASCAL) thì trong dòng tiêu đề ta dùng kiểu void. Ví dụ hàm để hiển thị giá trị lớn nhất của ba đối thực có thể viết như sau:
void gtmax (float x,float y, float x)
{
float m; /*Biến cục bộ trong thân hàm}
m=x>y?x:y;
printf (“\nMax=%0.2f”, m>z?m:z);
}
Một ví dụ khác là hàm main() là một hàm không trả giá trị nào, nhưng đối với nó người ta có thể không viết tên kiểu void.
2. Hàm không đối thì ta dùng void để khai báo đối. Ví dụ hàm báo thức có thể viết như sau:
void bao_thuc (void);
{
int i;
for (i=0;i<10;i++)
{
delay(100); putch(7);
}
}
Khi gọi hàm không có đối ta viết tên_hàm ();

3. Khi gặp toán tử return có chứa biểu thức, thì giá trị của biểu thức được chuyển kiểu cho phù hợp với kiểu được gán cho tên hàm.
b) Sử dụng hàm.
Hàm được dùng thông qua lời gọi như sau:
tên_hàm (danh sách các tham số thực);
trong đó số tham số thực phải bằng số đối và theo đúng thứ tự đã được khai báo. Kiểu của tham số thực phải phù hợp với kiểu của đối tương ứng.
c). Cơ chế hoạt động của hàm.
Khi gặp một lời gọi hàm từ một chỗ nào đó trong chương trình thì máy sẽ tạm thời rời chỗ đó và chuyển đến hàm tương ứng. Tiếp theo nó cấp phát vùng nhớ cho các đối vào và các biến cục bộ. Sao chép giá trị của các tham số thực cho các đối vào tương ứng. Thực hiện các câu lệnh trong thân hàm. Khi gặp câu lệnh return hoặc dấu } cuối cùng của hàm thì máy sẽ xóa các biến cục bộ, các đối rồi thoát khỏi hàm trở về điểm gọi hàm. Nếu trở về từ câu lệnh return có chứa biểu thức thì giá trị của biểu thức được gán cho tên hàm.
Phạm vi và tuổi thọ của các biến cục bộ và các đối vào là như nhau, nên trong cùng một hàm tên của các đối và biến cục bộ không được trùng nhau. Nhưng tên của các biến cục bộ và của các đối có thể trùng với tên của bất kỳ đại lượng nào ngoài hàm. Trong thân hàm tên chung đó được hiểu là tên của đối hoặc của biến cục bộ. Khi có lời gọi hàm máy sẽ sao giá trị của các tham số thực cho các đối vào và chỉ làm việc với các đối (với các bản sao của tham số thực). Vì vậy các đối có thể bị thay đổi trong thân hàm, còn các tham số thực không hề bị thay đổi. Để nhận thông tin ra ta có hai cách, một là dùng biến toàn cục, hai là dùng các đối ra. Nói một cách chính xác hơn, nếu ta muốn truyền giá trị của một biến cho hàm mà không muốn hàm thay đổi giá trị của nó thì ta phải truyền giá trị này cho đối vào, nhưng nếu ta lại muốn nhận những thay đổi do hàm mang lại cho biến đó, thì nó phải được truyền cho hàm theo một cơ chế khác. Hàm sẽ thực hiện các thao tác không phải trên các bản sao của các biến này mà trực tiếp truy nhập tới các biến đó thông qua địa chỉ của chúng được gửi cho hàm. Đối của hàm phải có khả năng nhận được địa chỉ hay nói cách khác nó phải là các con trỏ. Tóm lại, đối ra phải là biến con trỏ. Chúng ta sẽ xem xét kỹ vấn đề truyền tham số cho hàm trong giáo trình Ngôn ngữ lập trình C.

Bài tập cuối chương 3.

Bài 1 Giả sử có khai báo như sau:
int n=10; p=4;
long q=2;
float x=1.75;
Hãy cho biết kiểu và giá trị của mỗi biểu thức sau:
a) n+qb) n+xc) n % p + qd) n <pe) n>=pf) n>q g) q+3*(n>p)h) q && ni) (q-2) && (n-10)j) x * (q ==2)k) x *(q==5)

Bài 2 Cho đoạn chương trình
int x=5;
float z, y=9.0;
z=y/x;
Hãy chọn phương án đúng.
Giá trị của z là:
a) 1
b) 1.8
c) 2
d) không câu nào ở trên là đúng
Bài 3
float z;
z=(int) 3.0 +(int) 4.8;
Hãy chọn phương án đúng.
Giá trị của z là:
a) 7.8
b) 7.0
c) 8.0
d) không câu nào đúng
Bài 4 Tìm câu trả lời sai:
a) Sử dụng chỉ dẫn #define nói chung sẽ giảm kích thước chương trình nguồn.
b) Chỉ dẫn #define được sử dụng để chương trình dễ đọc, dễ hiểu.
c) Sử dụng chỉ dẫn #define nói chung sẽ giảm kích thước chương trình chạy được (có đuôi .exe)
d) Chỉ dẫn #define không có dấu chấm phẩy ở cuối để kết thúc.

Bài 5. Hai cách viết sau cách nào đúng vì sao?
(100 > 76) && (‘B’ <’A’)
100>76 && ‘B’<’A’
Bài 6. Cho n có kiểu int . Hãy viết biểu thức nhận giá trị:
-1 nếu n là số âm
0 nếu n bằng 0
1 nếu n dương
Bài 7. Hãy cho biết kết quả của chương trình sau:
#include <stdio.h>
main()
{
int n=10, p=5, q=10;
clrscr();
printf("\n A: % d %d %d ", n, p,q);
n=p=q=5;
n +=p +=q;
printf("\n A: % d %d %d ", n, p,q);
q=n <p? n++: p++;
printf("\n A: % d %d %d ", n, p,q);
q=n>p? n++: p++;
printf("\n A: % d %d %d ", n, p,q);
getch();
}
Bài 8. Ban đầu các giá trị của các biến x,y,p,q bằng nhau. Sau khi thực hiện các lệnh:
p=x++;
q=++y;
hãy xem câu nào sau đây là đúng:
a) p và q đều có giá trị lớn hơn x và y
b) x,y và q có giá trị bằng nhau và đều lớn hơn p
c) Cả bốn giá trị bằng nhau
d) Không câu nào ở trên là đúng.
Bài 9. Hãy cho biết kết quả chương trình sau:
#include <stdio.h>
main()
{
int n=345;
int p=5;
float x=34.5678;
printf(“A: %d%f\n”, n,x);
printf(“B: %4d%10f\n”, n,x);
printf(“C: %2d%0.3f\n”, n,x);
}




bài thực hành chương 3

Bài 1. Lập trình thực hiện: Nhập từ bàn phím 2 ký tự sau đó in ký tự đó trên một dòng màn hình và sau đó trên dòng thứ hai in mã ASCII của nó .
Bài 2. Lập trình nhập từ bàn phím hai số thực cùng dấu sau đó in ra màn hình giá trị trung bình cộng và trung bình nhân của chúng.
Bài 3. Lập trình thực hiện: nhập 2 số thực từ bàn phím nếu chúng không tạo thành 3 cạnh của một tam giác thì thông báo còn không thì tính diện tích tam giác đó.
Bài 4. Nhập số có 4 chữ số. Xác định tổng các chữ số của nó.
Bài 5. Nhập hai số vào hai biến thực sau đó hãy tráo đổi giá trị của hai biến này.
Bài 6. Nhập ký tự từ bàn phím. Hãy lập trình cho biết ký tự vừa nhập là chữ cái, ký số hay ký tự loại khác.
Bài 7. Nhập một số nguyên. Hãy cho biết đó là số dương hay số âm, đó là số chãn hay lẻ.
Bài 8. Lập trình kiểm tra một số tự nhiên được nhập vào từ bàn phím có phải là số chính phương hay không.
Bài 9. Xác định min, max của hai số thực được nhập từ bàn phím
Bài 10. Xác định min, max của ba số thực được nhập từ bàn phím
Bài 11 .Nhập 3 số thực, in chúng ra màn hình theo thự tự tăng dần
Bài 12 In ra màn hình một bảng chữ nhật gồm 10 hàng 5 cột một phần tử là một chữ X.
Bài 13 Lập trình giải bài toán cổ:
Vừa gà vừa chó
Bó lại cho tròn,
Ba mươi sáu con
Một trăm chân chẵn.
Hỏi có mấy con gà , mấy con chó?
Bài 14. Lập trình giải bài toán cổ:
Trăm trâu trăm cỏ,
Trâu đứng ăn năm
Trâu nằm ăn ba
Còn lũ nghé hoa
Ba con một bó
Hỏi số trâu đứng, trâu nằm, nghé hoa?
Bài 15. Lập trình in ra màn hình các số nguyên tố nhỏ hơn số nguyên n được nhập từ bàn phím. Lưu ý lập hàm kiểm tra tính nguyên tố của một số nguyên, trong chương trình chính sẽ gọi ham trên để thực hiện.
Bài 16. Lập chương trình gồm các hàm:
 Nhập số nguyên từ bàn phím.
 Tìm UCLN của hai số nguyên dương.
 Hàm main() sẽ sử dụng để nhập và tính USCLN của 4 số nguyên nhập vào từ bàn phím.
Bài 17. Giải phương trình bậc hai, yêu cầu xây dựng các chương trình con: Nhập_hệ_số, Tính_nghiệm, In_kết quả.
__________________
Phạm Minh Nghĩa
NickYM: chinhphuc_computer
Emai:chinhphuc_computer@yahoo.com
Mobile: 0986588901
Trả Lời Với Trích Dẫn
Có 3 thành viên đã cảm ơn bài viết của nghiapn106cn7011:
  #5  
Old 02-07-2007
nghiapn106cn7011's Avatar
nghiapn106cn7011 nghiapn106cn7011 is offline
Moderator
 
Tham gia ngày: Dec 2006
Nơi Cư Ngụ: Vietnam
Bài gởi: 97
Thanks: 3
Thanked 60 Times in 31 Posts

Level: 8 [♥ Bé-Yêu ♥]
Life: 0 / 196
Magic: 32 / 5172
Experience: 84%

Send a message via Yahoo to nghiapn106cn7011
Default 101 ví dụ C#

ai thích C#thì down về
* http://rapidshare.de/files/25696809/csdnwznv.part4.rar 67.65 MB
* http://rapidshare.de/files/25697952/csdnwznv.part1.rar 95.78 MB
* http://rapidshare.de/files/25699173/csdnwznv.part2.rar 95.78 MB
* http://rapidshare.de/files/25700109/csdnwznv.part3.rar 95.78 MB

Password to Unrar: www.danawz.co.nr
__________________
Phạm Minh Nghĩa
NickYM: chinhphuc_computer
Emai:chinhphuc_computer@yahoo.com
Mobile: 0986588901
Trả Lời Với Trích Dẫn
  #6  
Old 02-07-2007
thanhnt106cn375's Avatar
thanhnt106cn375 thanhnt106cn375 is offline
Moderator
 
Tham gia ngày: Sep 2006
Nơi Cư Ngụ: Vietnam
Bài gởi: 180
Thanks: 116
Thanked 220 Times in 168 Posts

Level: 12 [♥ Bé-Yêu ♥♥ Bé-Yêu ♥♥ Bé-Yêu ♥]
Life: 0 / 286
Magic: 60 / 7762
Experience: 47%

Send a message via Yahoo to thanhnt106cn375
Default

anh nói rõ hơn đi em không hiểu cho lắm ak
Trả Lời Với Trích Dẫn
  #7  
Old 02-07-2007
hungdv106cn0543's Avatar
hungdv106cn0543 hungdv106cn0543 is offline
Moderator
 
Tham gia ngày: Nov 2006
Nơi Cư Ngụ: FH4VN
Bài gởi: 171
Thanks: 2
Thanked 37 Times in 26 Posts

Level: 12 [♥ Bé-Yêu ♥♥ Bé-Yêu ♥♥ Bé-Yêu ♥]
Life: 0 / 278
Magic: 57 / 7455
Experience: 13%

Send a message via ICQ to hungdv106cn0543 Send a message via MSN to hungdv106cn0543 Send a message via Yahoo to hungdv106cn0543 Send a message via Skype™ to hungdv106cn0543
Default


Trích:
Nguyên văn bởi thanhnt106cn375
anh nói rõ hơn đi em không hiểu cho lắm ak

Nói rõ cái gì hã bạn?
Bạn download 4 cái link trên về (nhớ là khi nhấp vào link thì phải chờ rồi gỏ mã kiểm tra và download). Download 4 part về cùng 1 thư mục, rồi giải nén. Password để giải nén là: www.danawz.co.nr
Đó là 101 Ví Dụ về ngôn ngữ lập trình C#
Mà hình như 4 link đó đã bị expired rồi. không download được nữa.
__________________
If the bore is everything I will be the richest person all over the world.
Tell:0948080988
Trả Lời Với Trích Dẫn
  #8  
Old 02-09-2007
thanhnt106cn375's Avatar
thanhnt106cn375 thanhnt106cn375 is offline
Moderator
 
Tham gia ngày: Sep 2006
Nơi Cư Ngụ: Vietnam
Bài gởi: 180
Thanks: 116
Thanked 220 Times in 168 Posts

Level: 12 [♥ Bé-Yêu ♥♥ Bé-Yêu ♥♥ Bé-Yêu ♥]
Life: 0 / 286
Magic: 60 / 7762
Experience: 47%

Send a message via Yahoo to thanhnt106cn375
Default

thầy HƯNG ơi?
thầy nói rõ hơn hộ em với ?
nói thật em chưa học cái này bao giờ cả nên rất khó hiểu , /
Trả Lời Với Trích Dẫn
  #9  
Old 02-09-2007
nghiapn106cn7011's Avatar
nghiapn106cn7011 nghiapn106cn7011 is offline
Moderator
 
Tham gia ngày: Dec 2006
Nơi Cư Ngụ: Vietnam
Bài gởi: 97
Thanks: 3
Thanked 60 Times in 31 Posts

Level: 8 [♥ Bé-Yêu ♥]
Life: 0 / 196
Magic: 32 / 5172
Experience: 84%

Send a message via Yahoo to nghiapn106cn7011
Default

qua đây anh cho em học
__________________
Phạm Minh Nghĩa
NickYM: chinhphuc_computer
Emai:chinhphuc_computer@yahoo.com
Mobile: 0986588901
Trả Lời Với Trích Dẫn
  #10  
Old 02-26-2007
thanhnt106cn375's Avatar
thanhnt106cn375 thanhnt106cn375 is offline
Moderator
 
Tham gia ngày: Sep 2006
Nơi Cư Ngụ: Vietnam
Bài gởi: 180
Thanks: 116
Thanked 220 Times in 168 Posts

Level: 12 [♥ Bé-Yêu ♥♥ Bé-Yêu ♥♥ Bé-Yêu ♥]
Life: 0 / 286
Magic: 60 / 7762
Experience: 47%

Send a message via Yahoo to thanhnt106cn375
Default


Trích:
Nguyên văn bởi nghiapn106cn7011
qua đây anh cho em học

that khong vay/
em khong hieu mon do' nhu the nao a?
chan thiet do'
hoc chi hieu duoc nhung phan co ban thoi
Trả Lời Với Trích Dẫn
Gởi Ðề Tài Mới  Trả lời


Ðiều Chỉnh
Xếp Bài

Quyền Sử Dụng Ở Diễn Ðàn
Bạn không được quyền gởi bài
Bạn không được quyền gởi trả lời
Bạn không được quyền gởi kèm file
Bạn không được quyền sửa bài

vB code đang Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt
Chuyển đến



Powered by: vBulletin Version 3.6.7 Copyright © 2000 - 2016, Jelsoft Enterprises Ltd.
Múi giờ GMT. Hiện tại là 11:55 PM.

0 nhận xét: