Bài giảng lập trình C
Chia sẻ bởi Nguyễn Văn Cao Thuan |
Ngày 19/03/2024 |
12
Chia sẻ tài liệu: Bài giảng lập trình C thuộc Công nghệ thông tin
Nội dung tài liệu:
Lập chương trình cho máy tính
Ngôn ngữ lập trình C - Giới thiệu
Lập trình C - CNTT2. 2002 - 2005
2
Tài liệu tham khảo
Bài giảng: Kỹ thuật lập trình. Lưu Nguyễn Kỳ Thư, Tân Hạnh. Khoa CNTT2, Học viện CNBCVT.
Ngôn Ngữ Lập Trình C. Quách Tuấn Ngọc. Nhà Xuất Bản Giáo Dục, 1998.
Efficient C programming. Mark Allen Weiss. Prentice Hall, 1998.
Introduction to Computing System, from Bits and Gates to C and Beoynd. Yale N. Patt, Sanjay J. Patel. McGrawHill, 1999.
Lập trình C - CNTT2. 2002 - 2005
3
Một số khái niệm
Computer program –chương trình máy tính là một tập các câu lệnh (instruction) hướng dẫn máy tính làm một số việc nhất định.
Programming language - Ngôn ngữ lập trình là ngôn ngữ để viết chương trình. Có nhiều loại ngôn ngữ lập trình.
Compiler – trình biên dịch, là phần mềm chịu trách nhiệm dịch chương trình viết bằng một ngôn ngữ lập trình sang dạng mã máy.
Lập trình C - CNTT2. 2002 - 2005
4
MACHINE CODE
ASSEMBLER LANGUAGES
HIGH-LEVEL
LANGUAGES
ForTran, COBOL, C, C++,
LISP, Pascal, Java, ...
4GLs
ORACLE, SEQUEL, INGRES, ...
5GLs
artificial intelligence
Các lớp Ngôn ngữ lập trình
Lập trình C - CNTT2. 2002 - 2005
5
Thuật toán - Algorithm
Tập các lệnh được tổ chức có thứ tự nhằm giải quyết một bài toán hoặc đạt đến một mục tiêu nào đó.
Ví dụ:
hướng dẫn chế biến một món ăn,
hướng dẫn sửa chữa xe máy,
cách giải một bài toán.
…
Algorithm –Thuật toán - Thuật giải
Lập trình C - CNTT2. 2002 - 2005
6
Thuật giải tốt
Một thuật giải tốt là thuật giải:
chính xác
rõ ràng
đúng
hiệu quả
và có thể bảo trì được.
Chúng ta có thể viết một thuật giải cho máy tính bằng ngôn ngữ bình thường nhưng có thể không rõ ràng. Thay vào đó, chúng ta sẽ dùng ngôn ngữ lập trình (hoặc một ngôn ngữ giả lập ngôn ngữ lập trình gọi là mã giả pseudocode)
Lập trình C - CNTT2. 2002 - 2005
7
Tính điểm trung bình môn học
Nhập: điểm thực hành Vật Lý, điểm bài tập, điểm bài kiểm tra giữa học kỳ, điểm bài kiểm tra cuối học kỳ.
Điểm hệ số
Thực hành : 8 2
bài tập: 9 2
KT giữa kỳ: 8 4
KT cuối kỳ: 8 6
Tổng cộng: TONG = 8*2 + 9*2 + 8*4 + 8*6
Điểm trung bình: TB = TONG/(2+2+4+6)
Lập trình C - CNTT2. 2002 - 2005
8
Sơ đồ xử lý
Sử dụng sơ đồ xử lý để minh họa quá trình xử lý một chương trình.
start,stop
condition expression
process
data
flow
Bài tập: dùng sơ đồ để biểu diễn bài toán nhập và tính điểm trung bình.
Lập trình C - CNTT2. 2002 - 2005
9
Ngôn ngữ lập trình C
có thể đọc và viết mã chương trình trên hầu hết các hệ thống.
chuyển lên C++ và có thể viết các kịch bản CGI (CGI script) cho các Website.
C là ngôn ngữ biên dịch (complied language).
Viết chương trình bằng ngôn ngữ C bằng các chương trình soạn thảo (Notepad, copy con, các công cụ viết chương trình)
Không dùng các chương trình soạn thảo văn bản (vd:Word, WordPad)
Hello
C
Compiler
Lập chương trình cho máy tính
Ngôn ngữ lập trình C – Khái niệm cơ sở
Biến, Hằng, Toán tử, Kiểu dữ liệu cơ sở, Các phép toán và Các từ khóa
Lê Hà Thanh
Học kỳ 2, 2004-2005
Lập trình C - CNTT2. 2002 - 2005
11
Chương trình C đầu tiên
#include
int main()
{
printf(“Hello ");
return 0;
}
Lập trình C - CNTT2. 2002 - 2005
12
Chương trình C
#include
khai báo sử dụng thư viện xuất/nhập chuẩn (standard I/O library). Các thư viện khác: string, time, math…
int main()
khai báo hàm main(). Chương trình C phải khai báo (duy nhất) một hàm main(). Khi chạy, chương trình sẽ bắt đầu thực thi ở câu lệnh đầu tiên trong hàm main().
{ … }
mở và đóng một khối mã.
printf
hàm printf() gửi kết xuất ra thiết bị xuất chuẩn (màn hình). Phần nằm giữa “…“ gọi là chuỗi định dạng kết xuất (format string)
return 0;
ngừng chương trình. Mã lỗi 0 (error code 0) – không có lỗi khi chạy chương trình.
Lập trình C - CNTT2. 2002 - 2005
13
Mở rộng 1
#include
int main()
{
int a, b, c;
a = 5;
b = 7;
c = a + b;
printf(“%d + %d = %d “, a, b, c);
return 0;
}
Lập trình C - CNTT2. 2002 - 2005
14
Biến (variable)
dùng để giữ các giá trị.
Khai báo: ;
vd: int b;
Gán giá trị vào biến:
= ;
vd: b = 5;
Sử dụng biến:
printf(“%d + %d = %d “, a, b, c);
Lập trình C - CNTT2. 2002 - 2005
15
Mở rộng 2
#include
int main()
{
int a, b, c;
printf(“Nhap so thu nhat: “);
scanf(“%d”, &a);
printf(“Nhap so thu hai: “);
scanf(“%d”, &b);
c = a + b;
printf(“%d + %d = %d “, a, b, c);
return 0;
}
Nhap so thu nhat:
Nhap so thu hai:
5 + 7 = 12
5
7
5
7
12
a
b
c
C:> tong.exe
C:>_
Lập trình C - CNTT2. 2002 - 2005
16
Chú ý
C phân biệt chữ hoa/chữ thường do đó phải viết đúng tên lệnh.
vd: printf chứ không phải là Printf, pRintf, PRINTF.
Trong câu lệnh scanf() để lấy giá trị vào biến, phải luôn dùng dấu & trước tên biến.
Khi gọi các hàm phải khai báo các tham số đúng vị trí và đầy đủ.
Phải khai báo biến trước khi sử dụng trong chương trình.
Lập trình C - CNTT2. 2002 - 2005
17
Các Toán tử
Lập trình C - CNTT2. 2002 - 2005
18
Các toán tử so sánh và toán tử logic
Lập trình C - CNTT2. 2002 - 2005
19
Các kiểu dữ liệu cơ bản
Integer: int (các giá trị nguyên 4-byte)
Floating point: float (các giá trị dấu chấm động 4-byte)
Character: char (ký tự 1-byte)
Double: double (dấu chấm động 8-byte)
Short: short (số nguyên 2-byte)
unsigned short (số nguyên không dấu)
unsigned int
Lập trình C - CNTT2. 2002 - 2005
20
Biến và hằng số
Biến số (variable) được dùng để giữ các giá trị và có thể thay đổi các giá trị mà biến đang giữ
Khai báo: varname;
Vd:
int i;
float x, y, z;
char c;
Gán giá trị cho biến: = ;
vd:
i = 4;
x = 5.4;
y = z = 1.2;
Lập trình C - CNTT2. 2002 - 2005
21
Hằng số
Hằng số (constant) giá trị không thay đổi trong quá trình sử dụng.
Khai báo hằng:
#define
vd:
#define TRUE 1
#define FALSE 0
Lập trình C - CNTT2. 2002 - 2005
22
Kiểu và chuyển kiểu (typecasting)
C cho phép chuyển đổi kiểu dữ liệu cơ bản trong khi đang tính toán.
ví dụ:
void main()
{
float a;
int b;
b = 10/3;
a = (float)10/3;
printf(“a = %f b = %d ”, a, b);
}
Chú ý: khi thực hiện chuyển kiểu có thể gây ra mất ý nghĩa dữ liệu
Lập trình C - CNTT2. 2002 - 2005
23
Định nghĩa kiểu (typedef)
Có thể định nghĩa các kiểu riêng bằng lệnh typedef.
vd:
#define TRUE 1
#define FALSE 0
typedef int boolean;
void main() {
boolean b;
b = FALSE;
/*...*/
}
Lập trình C - CNTT2. 2002 - 2005
24
Các phép toán số học
+ - / *
%: phép chia lấy phần dư trong số nguyên. (modulo).
i = i + 1; i++; ++i;
i = i – 1; i--; --i;
i = i + 3; i += 3;
i = i * j; i *= j;
Lập trình C - CNTT2. 2002 - 2005
25
Mở rộng 1
#include
int main()
{
int a, b, c;
a = 5;
b = 7;
c = a + b;
printf(“%d + %d = %d “, a, b, c);
return 0;
}
Lập chương trình cho máy tính
Các cấu trúc điều khiển
Lê Hà Thanh
Học kỳ 2, 2004-2005
Lập trình C - CNTT2. 2002 - 2005
27
Câu lệnh điều kiện if
if ()
{
/* cac lenh thuc hien neu dieu kien dung */
}
…
expression
statement(s)
Next statement
True
False
Lập trình C - CNTT2. 2002 - 2005
28
Ví dụ
#include
int main() {
int b;
printf("Enter a value:");
scanf("%d", &b);
if (b < 0)
printf("The value
is negative ");
return 0;
}
Lập trình C - CNTT2. 2002 - 2005
29
if … else …
if ()
{
/* cac lenh thuc hien neu dieu kien dung */
}
else
{
/* cac lenh thuc hien neu dieu kien sai */
}
…
expression
statement1
Next statement
True
False
statement2
Lập trình C - CNTT2. 2002 - 2005
30
Ví dụ
…
printf(“1/X is: “);
if(X)
printf(“ %f ”, 1/X);
else
printf(“ undefined ”);
…
Lập trình C - CNTT2. 2002 - 2005
31
Lỗi đơn giản nhưng dễ phạm
#include
int main() {
int b;
printf("Enter a value:");
scanf("%d", &b);
if (b == 5)
printf(“b is "); printf( “5 ”);
return 0;
}
Lập trình C - CNTT2. 2002 - 2005
32
Lỗi đơn giản nhưng dễ phạm
printf(“1/X is: “);
if(X < 0) ;
printf(“ X is negative ”);
…
Lập trình C - CNTT2. 2002 - 2005
33
Ví dụ: Kiểm tra nhiều điều kiện
#include
int main() {
int b;
printf("Enter a value:");
scanf("%d", &b);
if (b < 0)
printf("The value is negative ");
else if (b == 0)
printf("The value is zero ");
else
printf("The value is positive ");
return 0;
}
Bài tập: Viết chương trình giải phương trình bậc nhất:
ax + b = 0. Biện luận các điều kiện có nghiệm của phương trình.
Lập trình C - CNTT2. 2002 - 2005
34
Điều kiện lồng nhau
Câu lệnh if có thể được lồng vào nhau.
if ( X >= 0 ) {
if ( Y < 0 )
Y = Y + sqrt(X);
}
else
Y = Y + sqrt(-X);
Tuy nhiên, cần chú ý đến thứ tự các cặp lệnh if … else … khi lồng các lệnh if. Nếu không sẽ phát sinh lỗi.
if ( X >= 0 )
if ( Y < 0 )
Y = Y + sqrt(X);
else
Y = Y + sqrt(-X);
Bài tập: Viết chương trình giải phương trình bậc 2:
ax^2 + bx +c = 0. Chú ý các điều kiện có nghiệm.
Lập trình C - CNTT2. 2002 - 2005
35
Lặp - lệnh while
while (bieu thuc dieu kien)
{cac lenh}
Khi biểu thức điều kiện (expression) còn khác 0 (TRUE), lệnh (statement) tiếp tục được thực hiện. Nếu expression bằng 0 (FALSE), lệnh while dừng và chương trình sẽ gọi lệnh kế tiếp sau while.
Nếu lúc đầu expression bằng 0 thì (statement) trong while không bao giờ được gọi thực hiện.
expression
statement(s)
Next statement
True
False
Lập trình C - CNTT2. 2002 - 2005
36
Ví dụ
In bảng đổi nhiệt độ từ độ Fahrenheit (oF) sang độ Celcius (oC).
#include
int main() {
int a = 0;
while (a <= 100) {
printf("%4d degrees F = %4d degrees C ",a, (a - 32)*5/9);
a = a + 10;
}
return 0;
}
Lập trình C - CNTT2. 2002 - 2005
37
Lặp - lệnh for
for (initialization; test; adjustment)
{statement(s)}
Khởi động. Sau đó, nếu điều kiện (test) khác 0: lệnh (statement) được thi hành, lệnh điều chỉnh lại “biến đếm” được gọi thi hành.
test
statement(s)
Next statement
True
False
adjustment
initialization
Lập trình C - CNTT2. 2002 - 2005
38
Ví dụ
Bài toán đổi nhiệt độ. Yêu cầu: hiển thị nhiệt độ chính xác đến con số thập phân sau dấu phẩy.
#include
int main() {
float a = 0;
int i;
for(i=0; i<=100; i+=10) {
printf("%6.2f degrees F = %6.2f degrees C ",
a, (a - 32.0) * 5.0 / 9.0);
a = a + 10;
}
return 0;
}
Lập trình C - CNTT2. 2002 - 2005
39
Lặp - lệnh do while
do
{statement(s)}
while (expression) ;
Thực hiện lệnh (statement). Kiểm tra biểu thức điều kiện (expression). Nếu (expression) bằng 0, dừng. Nếu không, thực hiện (statement).
Lệnh do while thực hiện (statement) ít nhất một lần.
expression
statement(s)
Next statement
True
False
Lập trình C - CNTT2. 2002 - 2005
40
Ví dụ - giao diện chương trình
#include
#include
#define PTB1 1
#define PTB2 2
#define STOP 3
int main()
{
int i;
do {
clrscr(); // xoa man hinh
printf(“ Chuong trinh giai phuong trinh bac thap ”);
printf(“ 1. Giai phuong trinh bac 1: ax + b = 0 ”);
printf(“ 2. Giai phuong trinh bac 2 : ax^2 + bx + c = 0 ”);
Lập trình C - CNTT2. 2002 - 2005
41
printf(“ 3. Thoat chuong trinh ”);
printf(“ Chon muc so (1/2/3) ? “);
scanf(“%d”, &i);
if(i == PTB1)
printf(“Giai phuong trinh bac 1: hien chua co ”);
else if(i == PTB2)
printf(“Giai phuong trinh bac 2: chua cai dat ”);
} while (i != STOP);
return 0;
}
Bài tập: Ghép chương trình trên với hai chương trình trong bài tập 1 và 2
Lập trình C - CNTT2. 2002 - 2005
42
break
dùng để thoát khỏi vòng lặp giữa chừng.
cú pháp:
break;
Thường sử dụng cùng với lệnh if để kiểm tra điều kiện dừng trước khi dùng lệnh break.
Bài tập: Viết chương trình nhập vào một số rồi tìm số nguyên tố đầu tiên lớn hơn số vừa nhập
Lập trình C - CNTT2. 2002 - 2005
43
Tìm số nguyên tố lớn
#include
#define TRUE 1
main(void)
{
unsigned long int Divisor, PossiblePrime;
int FoundPrime;
printf(“Enter the starting number: “);
scanf(“%lu”, &PossiblePrime);
if(PossiblePrime <= 2)
PossiblePrime = 2;
else
if(PossiblePrime !=3 )
{
if(PossiblePrime %2 == 0)
PossiblePrime++; /* Need an odd number */
Lập trình C - CNTT2. 2002 - 2005
44
for( ; ; PossiblePrime += 2)
{
FoundPrime = !TRUE;
for(Divisor = 3;PossiblePrime % Divisor;Divisor += 2)
if(Divisor * Divisor > PossiblePrime)
{ FoundPrime = TRUE;
break;
}
if (FoundPrime)
break;
}
}
printf(“Next largest prime is %lu ”, PossiblePrime);
}
Lập trình C - CNTT2. 2002 - 2005
45
continue
bỏ qua các lệnh kế tiếp trong một vòng lặp và bắt đầu vòng lặp tiếp theo.
cú pháp:
continue;
chỉ áp dụng với lệnh lặp.
Bài tập: Viết chương trình nhập vào một số và tìm ra tất cả các thừa số nguyên tố của số đó.
Lập trình C - CNTT2. 2002 - 2005
46
Tìm thừa số nguyên tố
#include
main(void)
{
unsigned long NumberToFactor, PossibleFactor, UnfactoredPart;
printf(“Enter the number to factor: “);
scanf(“%lu”, &NumberToFactor);
PossibleFactor = 2;
UnfactoredPart = NumberToFactor;
while(PossibleFactor * PossibleFactor <= UnfactoredPart)
{
if(UnfactoredPart % PossibleFactor == 0)
Lập trình C - CNTT2. 2002 - 2005
47
{ /* Found a factor */
printf(“%lu”, PossibleFactor);
UnfactoredPart /= PossibleFactor;
continue;
}
/* No factor: try next factor */
if(PossibleFactor == 2)
PossibleFactor = 3;
else
PossibleFactor += 2;
}
/* print last factor */
printf(“%lu ”, UnfactoredPart);
}
Lập trình C - CNTT2. 2002 - 2005
48
Lệnh switch
Bài tập:
Viết chương trình lấy ngẫu nhiên 1000 số nguyên và đếm số lần xuất hiện ở hàng đơn vị các số chẵn (2, 4, 6, 8), số lẻ (1, 3, 5, 7, 9) và số 0.
Nếu chúng ta dùng cấu trúc lệnh if ... else ... if … thì phức tạp và có thể đòi hỏi nhiều phép thử.
Lý do: if ... else ... : rẽ nhánh hai chiều.
Thử cài đặt bài toán bằng if...else...
Lập trình C - CNTT2. 2002 - 2005
49
Lệnh switch
Dùng lệnh switch để cài đặt cơ chế rẽ nhánh nhiều chiều.
cú pháp:
switch()
{
case case1:
case case2:
;
break;
/* … */
case casen:
;
break;
default:
;
break;
}
Lập trình C - CNTT2. 2002 - 2005
50
Giải bài bằng switch
#include
#include
#include
int main(void)
{ int n;
int n_even = n_odd = n_zero = 0;
randomize();
for(int i=0; i<1000; i++)
{ n = random(1000);
switch (n%10) {
case 2:
case 4:
case 6:
case 8:
n_even++;
break;
Lập trình C - CNTT2. 2002 - 2005
51
case 1:
case 3:
case 5:
case 7:
n_odd++;
break;
case 0:
n_zero++;
break;
}
}
// print out the summary
printf(“Number of even_eding number: %d ”
Number of odd_ending number: %d ”
Number of zero_ending number: %d ”,
n_even, n_odd, n_zero);
return 0;
}
Lập trình C - CNTT2. 2002 - 2005
52
Một số toán tử và lệnh khác
Toán tử ‘,’ được dùng để khởi động nhiều biến trong vòng lặp.
Ví dụ:
for(i = 0, j = 0; i < 5; i++, j += i++)
printf(“i = %d, j = %d, i+j = %d ”, i, j, i+j);
Kết quả là: ????
Toán tử ba ngôi
? :
Ví dụ:
Max = (Y > Z) ? Y : Z;
Lập trình C - CNTT2. 2002 - 2005
53
Một số toán tử và lệnh khác
Lệnh goto cho phép nhảy không điều kiện đến bất kỳ nơi nào trong chương trình.
Cú pháp:
goto
Ngôn ngữ lập trình C - Giới thiệu
Lập trình C - CNTT2. 2002 - 2005
2
Tài liệu tham khảo
Bài giảng: Kỹ thuật lập trình. Lưu Nguyễn Kỳ Thư, Tân Hạnh. Khoa CNTT2, Học viện CNBCVT.
Ngôn Ngữ Lập Trình C. Quách Tuấn Ngọc. Nhà Xuất Bản Giáo Dục, 1998.
Efficient C programming. Mark Allen Weiss. Prentice Hall, 1998.
Introduction to Computing System, from Bits and Gates to C and Beoynd. Yale N. Patt, Sanjay J. Patel. McGrawHill, 1999.
Lập trình C - CNTT2. 2002 - 2005
3
Một số khái niệm
Computer program –chương trình máy tính là một tập các câu lệnh (instruction) hướng dẫn máy tính làm một số việc nhất định.
Programming language - Ngôn ngữ lập trình là ngôn ngữ để viết chương trình. Có nhiều loại ngôn ngữ lập trình.
Compiler – trình biên dịch, là phần mềm chịu trách nhiệm dịch chương trình viết bằng một ngôn ngữ lập trình sang dạng mã máy.
Lập trình C - CNTT2. 2002 - 2005
4
MACHINE CODE
ASSEMBLER LANGUAGES
HIGH-LEVEL
LANGUAGES
ForTran, COBOL, C, C++,
LISP, Pascal, Java, ...
4GLs
ORACLE, SEQUEL, INGRES, ...
5GLs
artificial intelligence
Các lớp Ngôn ngữ lập trình
Lập trình C - CNTT2. 2002 - 2005
5
Thuật toán - Algorithm
Tập các lệnh được tổ chức có thứ tự nhằm giải quyết một bài toán hoặc đạt đến một mục tiêu nào đó.
Ví dụ:
hướng dẫn chế biến một món ăn,
hướng dẫn sửa chữa xe máy,
cách giải một bài toán.
…
Algorithm –Thuật toán - Thuật giải
Lập trình C - CNTT2. 2002 - 2005
6
Thuật giải tốt
Một thuật giải tốt là thuật giải:
chính xác
rõ ràng
đúng
hiệu quả
và có thể bảo trì được.
Chúng ta có thể viết một thuật giải cho máy tính bằng ngôn ngữ bình thường nhưng có thể không rõ ràng. Thay vào đó, chúng ta sẽ dùng ngôn ngữ lập trình (hoặc một ngôn ngữ giả lập ngôn ngữ lập trình gọi là mã giả pseudocode)
Lập trình C - CNTT2. 2002 - 2005
7
Tính điểm trung bình môn học
Nhập: điểm thực hành Vật Lý, điểm bài tập, điểm bài kiểm tra giữa học kỳ, điểm bài kiểm tra cuối học kỳ.
Điểm hệ số
Thực hành : 8 2
bài tập: 9 2
KT giữa kỳ: 8 4
KT cuối kỳ: 8 6
Tổng cộng: TONG = 8*2 + 9*2 + 8*4 + 8*6
Điểm trung bình: TB = TONG/(2+2+4+6)
Lập trình C - CNTT2. 2002 - 2005
8
Sơ đồ xử lý
Sử dụng sơ đồ xử lý để minh họa quá trình xử lý một chương trình.
start,stop
condition expression
process
data
flow
Bài tập: dùng sơ đồ để biểu diễn bài toán nhập và tính điểm trung bình.
Lập trình C - CNTT2. 2002 - 2005
9
Ngôn ngữ lập trình C
có thể đọc và viết mã chương trình trên hầu hết các hệ thống.
chuyển lên C++ và có thể viết các kịch bản CGI (CGI script) cho các Website.
C là ngôn ngữ biên dịch (complied language).
Viết chương trình bằng ngôn ngữ C bằng các chương trình soạn thảo (Notepad, copy con, các công cụ viết chương trình)
Không dùng các chương trình soạn thảo văn bản (vd:Word, WordPad)
Hello
C
Compiler
Lập chương trình cho máy tính
Ngôn ngữ lập trình C – Khái niệm cơ sở
Biến, Hằng, Toán tử, Kiểu dữ liệu cơ sở, Các phép toán và Các từ khóa
Lê Hà Thanh
Học kỳ 2, 2004-2005
Lập trình C - CNTT2. 2002 - 2005
11
Chương trình C đầu tiên
#include
int main()
{
printf(“Hello ");
return 0;
}
Lập trình C - CNTT2. 2002 - 2005
12
Chương trình C
#include
khai báo sử dụng thư viện xuất/nhập chuẩn (standard I/O library). Các thư viện khác: string, time, math…
int main()
khai báo hàm main(). Chương trình C phải khai báo (duy nhất) một hàm main(). Khi chạy, chương trình sẽ bắt đầu thực thi ở câu lệnh đầu tiên trong hàm main().
{ … }
mở và đóng một khối mã.
printf
hàm printf() gửi kết xuất ra thiết bị xuất chuẩn (màn hình). Phần nằm giữa “…“ gọi là chuỗi định dạng kết xuất (format string)
return 0;
ngừng chương trình. Mã lỗi 0 (error code 0) – không có lỗi khi chạy chương trình.
Lập trình C - CNTT2. 2002 - 2005
13
Mở rộng 1
#include
int main()
{
int a, b, c;
a = 5;
b = 7;
c = a + b;
printf(“%d + %d = %d “, a, b, c);
return 0;
}
Lập trình C - CNTT2. 2002 - 2005
14
Biến (variable)
dùng để giữ các giá trị.
Khai báo:
vd: int b;
Gán giá trị vào biến:
vd: b = 5;
Sử dụng biến:
printf(“%d + %d = %d “, a, b, c);
Lập trình C - CNTT2. 2002 - 2005
15
Mở rộng 2
#include
int main()
{
int a, b, c;
printf(“Nhap so thu nhat: “);
scanf(“%d”, &a);
printf(“Nhap so thu hai: “);
scanf(“%d”, &b);
c = a + b;
printf(“%d + %d = %d “, a, b, c);
return 0;
}
Nhap so thu nhat:
Nhap so thu hai:
5 + 7 = 12
5
7
5
7
12
a
b
c
C:> tong.exe
C:>_
Lập trình C - CNTT2. 2002 - 2005
16
Chú ý
C phân biệt chữ hoa/chữ thường do đó phải viết đúng tên lệnh.
vd: printf chứ không phải là Printf, pRintf, PRINTF.
Trong câu lệnh scanf() để lấy giá trị vào biến, phải luôn dùng dấu & trước tên biến.
Khi gọi các hàm phải khai báo các tham số đúng vị trí và đầy đủ.
Phải khai báo biến trước khi sử dụng trong chương trình.
Lập trình C - CNTT2. 2002 - 2005
17
Các Toán tử
Lập trình C - CNTT2. 2002 - 2005
18
Các toán tử so sánh và toán tử logic
Lập trình C - CNTT2. 2002 - 2005
19
Các kiểu dữ liệu cơ bản
Integer: int (các giá trị nguyên 4-byte)
Floating point: float (các giá trị dấu chấm động 4-byte)
Character: char (ký tự 1-byte)
Double: double (dấu chấm động 8-byte)
Short: short (số nguyên 2-byte)
unsigned short (số nguyên không dấu)
unsigned int
Lập trình C - CNTT2. 2002 - 2005
20
Biến và hằng số
Biến số (variable) được dùng để giữ các giá trị và có thể thay đổi các giá trị mà biến đang giữ
Khai báo:
Vd:
int i;
float x, y, z;
char c;
Gán giá trị cho biến:
vd:
i = 4;
x = 5.4;
y = z = 1.2;
Lập trình C - CNTT2. 2002 - 2005
21
Hằng số
Hằng số (constant) giá trị không thay đổi trong quá trình sử dụng.
Khai báo hằng:
#define
vd:
#define TRUE 1
#define FALSE 0
Lập trình C - CNTT2. 2002 - 2005
22
Kiểu và chuyển kiểu (typecasting)
C cho phép chuyển đổi kiểu dữ liệu cơ bản trong khi đang tính toán.
ví dụ:
void main()
{
float a;
int b;
b = 10/3;
a = (float)10/3;
printf(“a = %f b = %d ”, a, b);
}
Chú ý: khi thực hiện chuyển kiểu có thể gây ra mất ý nghĩa dữ liệu
Lập trình C - CNTT2. 2002 - 2005
23
Định nghĩa kiểu (typedef)
Có thể định nghĩa các kiểu riêng bằng lệnh typedef.
vd:
#define TRUE 1
#define FALSE 0
typedef int boolean;
void main() {
boolean b;
b = FALSE;
/*...*/
}
Lập trình C - CNTT2. 2002 - 2005
24
Các phép toán số học
+ - / *
%: phép chia lấy phần dư trong số nguyên. (modulo).
i = i + 1; i++; ++i;
i = i – 1; i--; --i;
i = i + 3; i += 3;
i = i * j; i *= j;
Lập trình C - CNTT2. 2002 - 2005
25
Mở rộng 1
#include
int main()
{
int a, b, c;
a = 5;
b = 7;
c = a + b;
printf(“%d + %d = %d “, a, b, c);
return 0;
}
Lập chương trình cho máy tính
Các cấu trúc điều khiển
Lê Hà Thanh
Học kỳ 2, 2004-2005
Lập trình C - CNTT2. 2002 - 2005
27
Câu lệnh điều kiện if
if (
{
/* cac lenh thuc hien neu dieu kien dung */
}
…
expression
statement(s)
Next statement
True
False
Lập trình C - CNTT2. 2002 - 2005
28
Ví dụ
#include
int main() {
int b;
printf("Enter a value:");
scanf("%d", &b);
if (b < 0)
printf("The value
is negative ");
return 0;
}
Lập trình C - CNTT2. 2002 - 2005
29
if … else …
if (
{
/* cac lenh thuc hien neu dieu kien dung */
}
else
{
/* cac lenh thuc hien neu dieu kien sai */
}
…
expression
statement1
Next statement
True
False
statement2
Lập trình C - CNTT2. 2002 - 2005
30
Ví dụ
…
printf(“1/X is: “);
if(X)
printf(“ %f ”, 1/X);
else
printf(“ undefined ”);
…
Lập trình C - CNTT2. 2002 - 2005
31
Lỗi đơn giản nhưng dễ phạm
#include
int main() {
int b;
printf("Enter a value:");
scanf("%d", &b);
if (b == 5)
printf(“b is "); printf( “5 ”);
return 0;
}
Lập trình C - CNTT2. 2002 - 2005
32
Lỗi đơn giản nhưng dễ phạm
printf(“1/X is: “);
if(X < 0) ;
printf(“ X is negative ”);
…
Lập trình C - CNTT2. 2002 - 2005
33
Ví dụ: Kiểm tra nhiều điều kiện
#include
int main() {
int b;
printf("Enter a value:");
scanf("%d", &b);
if (b < 0)
printf("The value is negative ");
else if (b == 0)
printf("The value is zero ");
else
printf("The value is positive ");
return 0;
}
Bài tập: Viết chương trình giải phương trình bậc nhất:
ax + b = 0. Biện luận các điều kiện có nghiệm của phương trình.
Lập trình C - CNTT2. 2002 - 2005
34
Điều kiện lồng nhau
Câu lệnh if có thể được lồng vào nhau.
if ( X >= 0 ) {
if ( Y < 0 )
Y = Y + sqrt(X);
}
else
Y = Y + sqrt(-X);
Tuy nhiên, cần chú ý đến thứ tự các cặp lệnh if … else … khi lồng các lệnh if. Nếu không sẽ phát sinh lỗi.
if ( X >= 0 )
if ( Y < 0 )
Y = Y + sqrt(X);
else
Y = Y + sqrt(-X);
Bài tập: Viết chương trình giải phương trình bậc 2:
ax^2 + bx +c = 0. Chú ý các điều kiện có nghiệm.
Lập trình C - CNTT2. 2002 - 2005
35
Lặp - lệnh while
while (bieu thuc dieu kien)
{cac lenh}
Khi biểu thức điều kiện (expression) còn khác 0 (TRUE), lệnh (statement) tiếp tục được thực hiện. Nếu expression bằng 0 (FALSE), lệnh while dừng và chương trình sẽ gọi lệnh kế tiếp sau while.
Nếu lúc đầu expression bằng 0 thì (statement) trong while không bao giờ được gọi thực hiện.
expression
statement(s)
Next statement
True
False
Lập trình C - CNTT2. 2002 - 2005
36
Ví dụ
In bảng đổi nhiệt độ từ độ Fahrenheit (oF) sang độ Celcius (oC).
#include
int main() {
int a = 0;
while (a <= 100) {
printf("%4d degrees F = %4d degrees C ",a, (a - 32)*5/9);
a = a + 10;
}
return 0;
}
Lập trình C - CNTT2. 2002 - 2005
37
Lặp - lệnh for
for (initialization; test; adjustment)
{statement(s)}
Khởi động. Sau đó, nếu điều kiện (test) khác 0: lệnh (statement) được thi hành, lệnh điều chỉnh lại “biến đếm” được gọi thi hành.
test
statement(s)
Next statement
True
False
adjustment
initialization
Lập trình C - CNTT2. 2002 - 2005
38
Ví dụ
Bài toán đổi nhiệt độ. Yêu cầu: hiển thị nhiệt độ chính xác đến con số thập phân sau dấu phẩy.
#include
int main() {
float a = 0;
int i;
for(i=0; i<=100; i+=10) {
printf("%6.2f degrees F = %6.2f degrees C ",
a, (a - 32.0) * 5.0 / 9.0);
a = a + 10;
}
return 0;
}
Lập trình C - CNTT2. 2002 - 2005
39
Lặp - lệnh do while
do
{statement(s)}
while (expression) ;
Thực hiện lệnh (statement). Kiểm tra biểu thức điều kiện (expression). Nếu (expression) bằng 0, dừng. Nếu không, thực hiện (statement).
Lệnh do while thực hiện (statement) ít nhất một lần.
expression
statement(s)
Next statement
True
False
Lập trình C - CNTT2. 2002 - 2005
40
Ví dụ - giao diện chương trình
#include
#include
#define PTB1 1
#define PTB2 2
#define STOP 3
int main()
{
int i;
do {
clrscr(); // xoa man hinh
printf(“ Chuong trinh giai phuong trinh bac thap ”);
printf(“ 1. Giai phuong trinh bac 1: ax + b = 0 ”);
printf(“ 2. Giai phuong trinh bac 2 : ax^2 + bx + c = 0 ”);
Lập trình C - CNTT2. 2002 - 2005
41
printf(“ 3. Thoat chuong trinh ”);
printf(“ Chon muc so (1/2/3) ? “);
scanf(“%d”, &i);
if(i == PTB1)
printf(“Giai phuong trinh bac 1: hien chua co ”);
else if(i == PTB2)
printf(“Giai phuong trinh bac 2: chua cai dat ”);
} while (i != STOP);
return 0;
}
Bài tập: Ghép chương trình trên với hai chương trình trong bài tập 1 và 2
Lập trình C - CNTT2. 2002 - 2005
42
break
dùng để thoát khỏi vòng lặp giữa chừng.
cú pháp:
break;
Thường sử dụng cùng với lệnh if để kiểm tra điều kiện dừng trước khi dùng lệnh break.
Bài tập: Viết chương trình nhập vào một số rồi tìm số nguyên tố đầu tiên lớn hơn số vừa nhập
Lập trình C - CNTT2. 2002 - 2005
43
Tìm số nguyên tố lớn
#include
#define TRUE 1
main(void)
{
unsigned long int Divisor, PossiblePrime;
int FoundPrime;
printf(“Enter the starting number: “);
scanf(“%lu”, &PossiblePrime);
if(PossiblePrime <= 2)
PossiblePrime = 2;
else
if(PossiblePrime !=3 )
{
if(PossiblePrime %2 == 0)
PossiblePrime++; /* Need an odd number */
Lập trình C - CNTT2. 2002 - 2005
44
for( ; ; PossiblePrime += 2)
{
FoundPrime = !TRUE;
for(Divisor = 3;PossiblePrime % Divisor;Divisor += 2)
if(Divisor * Divisor > PossiblePrime)
{ FoundPrime = TRUE;
break;
}
if (FoundPrime)
break;
}
}
printf(“Next largest prime is %lu ”, PossiblePrime);
}
Lập trình C - CNTT2. 2002 - 2005
45
continue
bỏ qua các lệnh kế tiếp trong một vòng lặp và bắt đầu vòng lặp tiếp theo.
cú pháp:
continue;
chỉ áp dụng với lệnh lặp.
Bài tập: Viết chương trình nhập vào một số và tìm ra tất cả các thừa số nguyên tố của số đó.
Lập trình C - CNTT2. 2002 - 2005
46
Tìm thừa số nguyên tố
#include
main(void)
{
unsigned long NumberToFactor, PossibleFactor, UnfactoredPart;
printf(“Enter the number to factor: “);
scanf(“%lu”, &NumberToFactor);
PossibleFactor = 2;
UnfactoredPart = NumberToFactor;
while(PossibleFactor * PossibleFactor <= UnfactoredPart)
{
if(UnfactoredPart % PossibleFactor == 0)
Lập trình C - CNTT2. 2002 - 2005
47
{ /* Found a factor */
printf(“%lu”, PossibleFactor);
UnfactoredPart /= PossibleFactor;
continue;
}
/* No factor: try next factor */
if(PossibleFactor == 2)
PossibleFactor = 3;
else
PossibleFactor += 2;
}
/* print last factor */
printf(“%lu ”, UnfactoredPart);
}
Lập trình C - CNTT2. 2002 - 2005
48
Lệnh switch
Bài tập:
Viết chương trình lấy ngẫu nhiên 1000 số nguyên và đếm số lần xuất hiện ở hàng đơn vị các số chẵn (2, 4, 6, 8), số lẻ (1, 3, 5, 7, 9) và số 0.
Nếu chúng ta dùng cấu trúc lệnh if ... else ... if … thì phức tạp và có thể đòi hỏi nhiều phép thử.
Lý do: if ... else ... : rẽ nhánh hai chiều.
Thử cài đặt bài toán bằng if...else...
Lập trình C - CNTT2. 2002 - 2005
49
Lệnh switch
Dùng lệnh switch để cài đặt cơ chế rẽ nhánh nhiều chiều.
cú pháp:
switch(
{
case case1:
case case2:
break;
/* … */
case casen:
break;
default:
break;
}
Lập trình C - CNTT2. 2002 - 2005
50
Giải bài bằng switch
#include
#include
#include
int main(void)
{ int n;
int n_even = n_odd = n_zero = 0;
randomize();
for(int i=0; i<1000; i++)
{ n = random(1000);
switch (n%10) {
case 2:
case 4:
case 6:
case 8:
n_even++;
break;
Lập trình C - CNTT2. 2002 - 2005
51
case 1:
case 3:
case 5:
case 7:
n_odd++;
break;
case 0:
n_zero++;
break;
}
}
// print out the summary
printf(“Number of even_eding number: %d ”
Number of odd_ending number: %d ”
Number of zero_ending number: %d ”,
n_even, n_odd, n_zero);
return 0;
}
Lập trình C - CNTT2. 2002 - 2005
52
Một số toán tử và lệnh khác
Toán tử ‘,’ được dùng để khởi động nhiều biến trong vòng lặp.
Ví dụ:
for(i = 0, j = 0; i < 5; i++, j += i++)
printf(“i = %d, j = %d, i+j = %d ”, i, j, i+j);
Kết quả là: ????
Toán tử ba ngôi
Ví dụ:
Max = (Y > Z) ? Y : Z;
Lập trình C - CNTT2. 2002 - 2005
53
Một số toán tử và lệnh khác
Lệnh goto cho phép nhảy không điều kiện đến bất kỳ nơi nào trong chương trình.
Cú pháp:
goto