Tài liệu Đề cương bài giảng: Ngôn ngữ lập trình C: 1
Bài 1: Ngôn ngữ lập trình C
I. Các khái niệm cơ bản
1. Bảng ký tự sử dụng trong C
Bảng ký tự được sử dụng trong ngôn ngữ lập trình C bao gồm
- Nhóm các chữ cái: chữ in hoa A,B,C,Z và chữ in thường a,b,c,,z
- Nhóm các chữ số: 0,1,2,3,,9
- Nhóm các dấu: +,-,*,/,,&
Chú ý: ngôn ngữ C phân biệt chữ hoa và chữ thường do đó chúng ta phải
thận trọng khi sử dụng các chữ cái hoa và thường.
2. Tên và từ khoá
Tên là một dãy các chữ cái, chữ số và dấu gạch nối. tên phải bắt đầu
bằng chữ cái hoặc dấu gạch nối.
Ví dụ:
Tên đúng: baitap1,vidu1,
Tên sai: ha noi, viet%nam
Tên có thể do ngôn ngữ C sinh ra để nhằm hai mục đích: thứ nhất là
định danh các thành phần có sẵn, thứ hai viết các lệnh trong chương trình.
Tên chuẩn là những tên do ngôn ngữ lập trình C đặt ra để định danh các
thành phần.
Ví dụ: scanf,printf,getch()
Từ khoá (key word) là các tên do ngôn ngữ lập trình sinh ra để viết các
lệnh, để định danh các thành phần đặc biệt.
Ví dụ: for,while, i...
57 trang |
Chia sẻ: honghanh66 | Lượt xem: 1027 | Lượt tải: 0
Bạn đang xem trước 20 trang mẫu tài liệu Đề cương bài giảng: Ngôn ngữ lập trình C, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
1
Bài 1: Ngôn ngữ lập trình C
I. Các khái niệm cơ bản
1. Bảng ký tự sử dụng trong C
Bảng ký tự được sử dụng trong ngôn ngữ lập trình C bao gồm
- Nhóm các chữ cái: chữ in hoa A,B,C,Z và chữ in thường a,b,c,,z
- Nhóm các chữ số: 0,1,2,3,,9
- Nhóm các dấu: +,-,*,/,,&
Chú ý: ngôn ngữ C phân biệt chữ hoa và chữ thường do đó chúng ta phải
thận trọng khi sử dụng các chữ cái hoa và thường.
2. Tên và từ khoá
Tên là một dãy các chữ cái, chữ số và dấu gạch nối. tên phải bắt đầu
bằng chữ cái hoặc dấu gạch nối.
Ví dụ:
Tên đúng: baitap1,vidu1,
Tên sai: ha noi, viet%nam
Tên có thể do ngôn ngữ C sinh ra để nhằm hai mục đích: thứ nhất là
định danh các thành phần có sẵn, thứ hai viết các lệnh trong chương trình.
Tên chuẩn là những tên do ngôn ngữ lập trình C đặt ra để định danh các
thành phần.
Ví dụ: scanf,printf,getch()
Từ khoá (key word) là các tên do ngôn ngữ lập trình sinh ra để viết các
lệnh, để định danh các thành phần đặc biệt.
Ví dụ: for,while, if, int, float
Chú ý: tên do chúng ta đặt ra không được phép trùng với từ khoá, không
nên trùng với các tên chuẩn.
3. Các kiểu dữ liệu
Tên kiểu Miền giá trị độ lớn
char một trong 256 ký tự thuộc
bản mã ASCII
1 byte
int -32.768 đến 32.767 2 byte
float -3.4.E.38 đến 3.4.E38 4 byte
4. Khái niệm về hằng và biến nhớ
2
a, Hằng
Hằng(const) là một đại lượng không thay đổi giá trị trong toàn
chương trình.
Hằng có thể là số nguyên, số thực, ký tự hoặc chuỗi ký tự. để biểu
diễn các giá trị hằng ta viết như sau:
Đối với số nguyên : viết bình thường như trong toán học
Ví dụ: 100,150,350
Đối với số thực dùng dấu chấm để ngăn cách phần nguyên và phần
thập phân,
Ví dụ: 1.5, 2.3
Đối với kí tự: viết các ký tự vào trong hai nháy kép
Ví dụ: “ngay 20 tháng 12 nam 2009”
b, Biến nhớ
Là một đại lượng có thể thay đổi trong chương trình, biến nhớ được
sử dụng để lưu dữ liệu của chương trình, do vậy nó rất quan trọng trong
lập trình, nếu không có biến nhớ thì chúng ta không thể lập trình được
bởi vì không có chỗ chứa dữ liệu cho việc tính toán và sử lý.
5. Các phép toán
Các phép toán trong C gọi là các toán tử (operator), bao gồm:
a. Các phép toán số học
- Ký hiệu: +, -,*, /,%
- Ý nghĩa: cộng ,trừ, nhân, chia, chia dư
- Dữ liệu tác động: kiểu số nguyên hoặc số thực
- Kết quả: các phép toán số học cho kết quả là dữ liệu kiểu số
Ví dụ:
2+5, 5*6, 3/2
Chú ý: đối với phép chia(/) nếu hai vế dữ liệu là số nguyên thì máy
sẽ chia lấy phần nguyên, nếu một trong hai vế là số thực thì máy cho
kết quả chính xác.
Ví dụ:
7/4 sẽ cho kết quả là 1(là phần nguyên của 7 chia 4)
7.0/4 hoặc 7/4.0 sẽ cho kết quả là 1.75
7%4 sẽ cho kết quả là 3(là phân dư của 7 chia 4)
b. Các phép toán quan hệ
3
- Ký hiệu: >, =, <=, ==, !=
- Ý nghĩa : lớn hơn, nhỏ hơn, lớn hơn hoặc bằng, nhơ hơn hoặc
bằng, so sánh bằng, và khác
- Dữ liệu tác động: là các dữ liệu kiểu số và chữ, nếu là chữ thì máy
sẽ so sánh mã ASCII của các chữ đo.
- Kết quả: phép toán cho kết quả là loogic(đúng hoặc sai)
c. Các phép kết nối logic
- Ký hiệu: &&, ||, !
- Ý nghĩa và, hoặc, phủ định
- Kiểu dữ liệu tác động: là các dữ liệu có giá trị đúng hoặc sai(kiểu
logic)
- Kết quả: cho kết quả logic(đúng hoặc sai)
Bảng kết quả:
E1 E2 E1&&E2 E1|| E2 !E1
Đúng Đúng Đúng Đúng Sai
Đúng Sai Sai Đúng Sai
Sai Đúng Sai Đúng Đúng
Sai Sai Sai Sai Đúng
d. Phép gán
Phép gán thực hiện tính toán và chuyển dữ liệu vào biến nhớ
trong chương trình, cách thức như sau:
Vế_trái = vế_phải;
Máy sẽ thực hiện tính toán vế phải và đưa kết quả vào vế trái do
đó vế trái luôn luôn là một biến nhớ.
Ví dụ : a =1;
b =1+6;
6 Dòng chú thích (Comment)
Những chú thích thường được viết để mô tả công việc của một
lệnh đặc biệt, một hàm hay toàn bộ chương trình. Trình biên dịch sẽ
không dịch chúng. Trong C, chú thích bắt đầu bằng ký hiệu /* và kết
thúc bằng */. Trong trường hợp chú thích chỉ trên một dòng ta có thể
dùng //.
II. Biểu thức, câu lệnh, khối lệnh và chương trình
4
Biểu thức là sự kết hợp giữa các toán tử(phép toán ) và các dữ liệu để
thực hiện tính toán, khi máy thực hiện tính biểu thức sẽ tuân theo thứ tự ưu
tiên của phép toán cũng giống như toán học.
Ví dụ: (8+3*(2-4))/2 máy sẽ thực hiện phép trù trước, rồi đến
phép nhân,cộng, chia và kết quả là 1.
Để yêu cầu máy thực hiện các thao tác chúng ta phải viết ra các lệnh
tương ứng, bằng cách sử dụng các tên chuẩn và từ khóa kết hợp với viết
biểu thức. Kết thúc mỗi câu lệnh phải có dấu chấm phẩy(;)
Một câu lệnh được viết trên một dòng, và trên một dòng có thể viết được
nhiều câu lệnh.
Thồng thường một câu lệnh chưa đủ để thực hiện một chức năng hay
một thao tác nào đó được yêu cầu, do vậy chúng ta phải viết thành nhiều
câu lệnh và tạo thành một khối lệnh. Khối lệnh phải được viết vào trong
cặp dấu ngoặc nhọn { }
Ví dụ:
{
a = 5*4-2; b=2/3+5;
printf (“%d”,a+b);
}
III. Cấu trúc các thành phần một trương trình C
a. Nạp thư viện
b. Định nghĩa các hằng
c. Khai báo các kiểu dữ liệu mới
d. Khai báo các chương trình con
e. Khai bào các biến nhớ toàn cục
f. Viết chương trình chính
g. Viết các chương trình con
Trong đó
- Phần a dùng để lạp các thư viện cần sử dụng cho chương trình được
viết như sau:
#include
Ví dụ: include
- Phần b dùng để định nghĩa các giá trị hằng cách viết như sau
#define tên hằng giá_trị_cần đặt_cho_hằng
Ví dụ: #define myname “abc”
- Phần c khai báo biến nhớ trong chương trình thường được thực hiện ở
phần đầu trong chương trình(hàm main), tuy nhiên trong môi trường
TC3.0 có thể thực hiện bất cứ chỗ nào nhưng phải trước khi sử dụng
chúng.
5
Cú pháp: tên_kiểu_dữ_liệu tên_biến_nhớ;
Ví dụ: int a;
float b;
int a,b,c;
float a=2.5,b=3;
- Phần f viết trương trình chính, mỗi một chương trình có duy nhất một
chương trình chính và nó sẽ điều khiển toàn bộ các hoạt động của
chương trình. Chương trình chính được viết như sau:
Void main()
{
Các câu lệnh
}
Cấu trúc một chương trình C đơn giản
#include
#include
Void main()
{
Khai báo biến nhớ
Các câu lệnh
}
IV. Cách thực hiện một chương trình trên máy
Khi thực hiện chương trình thì máy tình sẽ thực hiện các câu lệnh trong
chương trình chính. Quá trình thực hiện sẽ tuần tự từ trên xuống dưới và từ
trái sang phải.
Ví dụ ta có chương trình sau
#include
#include
void main()
{
A1;
A2; B1;
B2; C1; A3;
}
Thì máy sẽ thực hiện các câu lệnh theo tuần tự sau: A1,A2,B1,B2,C1,A3
V. Môi trường lập trình TurboC
1 . Giới thiệu TurboC và khởi động
6
Sau khi cài đặt song ta có thư mục TC hoặc TC30 trong thư mục này có
các thư mục con sau.
Để khởi động chương trình này chúng ta chạy tệp tin TC.EXE trong
thư mục Bin của TurboC
Màn hình giao diện của TurboC có dạng sau:
2, Các thao tác lập trình trên TurboC
TC
BIN
INCLUDE
LIB
Chứa các tệp tin chính của chýõng trình trong đó có
tệp TC.EXE
Chứa các tệp tin khai báo thý viện ( *.h)
Chứa các tệp tin mã lệnh của các thý viện (*.LIB)
7
Tên phím Ý nghĩa
Alt + F Tạo một tệp chương trình mới
F2 Ghi lại chương trình lên tệp trên đĩa
F3 Mở một tệp chương trình đã lưu trên đĩa
Alt + X Thoát khỏi chương trình TC
Shift + các phím mũi
tên
Đánh dấu khối lệnh
Ctrl + insert Chép khối đang đánh dấu vào máy
Shift + insert Dán khối đã chép ở trong máy vào cị trí con trỏ trên màn
hình
Shift + Delete Cắt khối đang đánh dấu và đưa vào máy
F9 Dịch và kiểm tra lỗi chương trình
Ctrl + F9 Thực hiện chương trình
Alt + Backspace Hủy thao tác vừa thực hiện
F5 Phóng to hoặc thu nhỏ cửa sổ đang mở
F6 Chuyển đổi giữa các cửa sổ đang mở
Alt + F5 Hiển thị màn hình kết quả chương trình vừa chạy lần cuối
cùng
Alt + 0 Hiển thị tất cả các cửa sổ đang mở lên màn hình
Một số thông báo lỗi hay gặp khi lập trình bằng TC
Thông báo tiếng Anh Ý nghĩa tiếng Việt
Undefined symbol ‘’ Chưa khai báo tên trong nháy
Unable to open include file ’’ Không mở được tệp thư viện(có thể viết
sai tên thư viện hoặc đường dẫn đến thư
viện chưa đúng)
Undefined symbol_main in modul
c0.asm
Chưa viết chương trình chính hoặc viết tên
chương trình chính bị sai
Compound statement missing } Thiếu dấu đóng ngoặc của khối lệnh
Unexpected Thừa dấu đóng ngoặc của khối lệnh
Unterminated string or character Chưa có dấu nháy kép kết thúc viết hằng
8
constant chuỗi kí tự
Statement missing ; Thiếu dấu chấm phẩy kết thúc câu lệnh
Function call missing ) Thiếu đóng ngoặc khi viết lệnh
If statement mising ( Lệnh if thiếu dấu mở ngoặc
9
Bài 2: CẤU TRÚC LỆNH ĐIỀU KHIỂN
I. Các lệnh đơn giản
1. Lệnh hiện dữ liệu lên màn hình
- Cú pháp:
printf(“điều khiển”,các dữ liệu cần hiện);
Trong đó:
- Điều khiển : Là các cặp kí tự điều khiển để hiện dữ liệu lên màn hình và
phải được viết trong cặp dấu nháy kép, mỗi cặp kí tự điều khiển bao gồm
dấu “%” và sau đó là một ký tự định kiểu.
Cách viết Ý nghĩa
%d Hiện số nguyên
%c Hiện ký tự trong bảng mã
ASCII
%f Hiện số thực
%s Hiện chuỗi ký tự
- Dữ liệu cần hiện: Là các biểu thức dữ liệu cần hiện ra màn hình,các biểu
thức này cách nhau bởi dấu phẩy.
Để sử dụng được lệnh hiện dữ liệu lên màn hình ta phải nạp thư viện
Ví dụ:
printf(“%d”,65);
thì kết quả hiện ra màn hình sẽ là: 65
printf (“%c”,65);
thì máy sẽ hiện ra ký tự có mã là 65 và đó là: chữ A
Chú ý:
- Để hiện dữ liệu có xuống dòng trên màn hình ta sử dụng \n trong điều
khiển của lệnh printf
Ví dụ
printf(“yen bai \n ngày %d”,12);
màn hình sẽ hiện ra như sau:
yen bai
ngay 12
- Để cách một khoảng trên màn hình như bấm phím Tab ta sử dụng \t trong
điều khiển của lệnh printf.
10
Vidu: printf(“yen bai \n\t ngay %d”,12);
Màn hình sẽ hiện ra như sau:
Yen bai
ngay 12
2. Lệnh nhập dữ liệu từ bàn phím
Cú pháp :
scanf(“điều khiển”,& tên biến nhớ);
Trong đó
- điều khiển : Để quy định dữ liệu nhập vào dưới dạng nào, cách viết
như điều khiển trong lệnh printf .
- Tên biến nhớ: Dùng để lưu trữ dữ liệu nhập vào từ bàn phím, phải có
dấu & ở trước.
Để sử dụng được lệnh nhập dữ liệu từ bàn phím ta phải nạp thư viện
.
Ví dụ:
scanf(“%d”,&a);
Nhập một số nguyên từ bàn phím vào cho biến nhớ a.
Chú ý:
- Có thể nhập nhiều dữ liệu vào nhiều biến trong một lệnh scanf.Ta phải
điền vào các điều khiển nhập cùng với các biến nhớ tương ứng cách nhau
bởi dấu phẩy.
Ví dụ: scanf(“%d%f”,&a,&b);
Sẽ nhập số nguyên vào biến nhớ a, số thực vào biến nhớ b
- Có thể quy định độ rộng dữ liệu khi nhập, phải viết độ rộng đó vào
giữa dấu % và kí tự định kiểu tương ứng. Nếu gõ thừa máy sẽ tự
động cắt bỏ.
Ví dụ:
scanf(“%2d%5f”,&a,&b);
nhập một số nguyên vào biến nhớ a tối đa là 2 chữ số, nhập số thực
vào biến nhớ b, với độ rộng tối đa là 5 chữ số.
Bài tậpvận dụng:
Bài 2.1
Viết chương trình nhập vào từ bàn phím 2 số nguyên. Tính tổng
hai số đó, hiện kết quả ra màn hình.
#include
#include
Void main()
{
11
int a,b;
clrscr();
printf(“nhap so a =”);
scanf(“%d”,&a);
printf(“nhap so b =”);
scanf(“%d”,&b);
printf(“tong hai so %d va %d la: %d”,a,b,a+b);
getch();
}
Bài 2.2
Viết chương trình nhập vào từ bàn phím 5 số nguyên. Hiện 5 số
vừa hập ra màn hình và trung bình cộng 5 số đó.
#include
#include
void main()
{
int a1,a2,a3,a4,a5;
clrscr();
printf("nhap so thu nhat a1= ");scanf("%d",&a1);
printf("\nnhap so thu hai a2= ");scanf("%d",&a2);
printf("\nnhap so thu 3 a3= ");scanf("%d",&a3);
printf("\nnhap so thu 4 a4= ");scanf("%d",&a4);
printf("\nnhap so thu 5 a5= ");scanf("%d",&a5);
printf("5 so vua nhap la: %d\t%d\t%d\t%d\t%d\t",a1,a2,a3,a4,a5);
printf("\ntrung binh cong 5 so vua nhap la:%f",(a1+a2+a3+a4+a5)/5.0);
getch() ;
}
2. Các lệnh toán học
Các lệnh toán học cung cấp bởi thư viện do vậy phải khai
báo nạp thư viện ở đầu chương trình.
Tên lệnh Ý nghĩa
sin(E); Tính sin của E
cos(E); Tính cos của E
pow(E1,E2); Tính lũy thừa E2 của E1
sqrt(E); Tính căn bậc hai của E
abs(E); Tính trị tuyệt đối của E nguyên
fabs(E); Tính trị tuyệt đối của E thực
12
E là một biểu thức hay giá trị.
Ví dụ 1:
printf(“hay nhap vao mot so nguyen”);
scanf(“%d”,&a);
printf(“can bac hai cua %d la:%f”,a,sqrt(a));
Ví dụ 2:
Nhập x từ bàn phím, tính f(x), đưa kết quả ra màn hình.
)(3)(
3 xtgxxf
Nội dung chương trình
#include
#include
#include
Void main()
{
int x;
clrscr();
printf(“nhap so x =”);
scanf(“%d”,&x);
printf(“gia tri bieu thuc f(x) = %f ”,pow((x+3),1.0/3)+sin(x)/cos(x));
getch();
}
Bài tập
Lập chương trình đọc vào từ bàn phím tọa độ 3 điểm A,B,C. Tính độ
dài các đoạn thẳng AB, BC, CA.
#include
#include
#include
void main()
{
int xa,ya,xb,yb,xc,yc,xab,yab,xbc,ybc,xac,yac;
float ab,bc,ac;
clrscr();
printf("nhap toa do diem A:\n xa= ");scanf("%d",&xa);
13
printf("\n ya= ");scanf("%d",&ya);
printf("nhap toa do diem B:\n xb= ");scanf("%d",&xb);
printf("\n yb= ");scanf("%d",&yb);
printf("nhap toa do diem C:\n xc= ");scanf("%d",&xc);
printf("\n yc= ");scanf("%d",&yc);
xab=xa-xb;yab=ya-yb;
xbc=xb-xc;ybc=yb-yc;
xac=xa-xc;yac=ya-yc;
ab=sqrt(xab*xab+yab*yab);
bc=sqrt(xbc*xbc+ybc*ybc);
ac=sqrt(xac*xac+yac*yac);
printf("\ndo dai doan thang AB la: %f",ab);
printf("\ndo dai doan thang BC la: %f",bc);
printf("\ndo dai doan thang AC la: %f",ac);
getch() ;
}
3. Một số lệnh làm việc với màn hình và bàn phím
Để sử dụng được lệnh làm việc với màn hình và bàn phím ta phải lạp
thư viện ở đầu chương trình.
Tên lệnh Ý nghĩa
clrscr(); Xóa màn hình
textcolor(m); Đặt mầu chữ
textbackground(m) ; Đặt mầu nền cho chữ
getch(); Chờ bấm một phím không hiện nên màn hình
getche(); Chờ bấm một phím có hiện lên màn hình
wherex(); Cho biết tọa độ cột hiện thời của con trỏ nháy
wherey(); Cho biết tọa độ dòng hiện thời của con trỏ
nháy
textmode(m); Đặt chế độ văn bản hiển thị lên mà hình
Ví dụ:
textcolor(red);
14
printf (“Yen Bai ”);
textcolor(blue);
printf(“Ngay 12 thang 09 nam 2009”);
hiện lên màn hình dòng chữ “Yen Bai” mầu đỏ, dòng chữ “Ngay 12
thang 09 nam 2009” mầu xanh.
II. Lệnh rẽ nhánh
Lệnh rẽ nhánh cho phép chương trình thực hiện các khối lệnh tùy theo
từng trường hợp cụ thể. Ngôn ngữ C có các lệnh rẽ nhánh sau:
1. Lệnh if
Lệnh rẽ nhánh này cho phép rẽ hai nhánh ứng với trường hợp đúng
hoặc sai của biểu thức trọn, cách viết như sau:
Cú pháp: if(điều_kiện_lựa_trọn)
Hành_động_1;
else
hành_động_2;
Trong đó:
- Điều kiện lựa trọn: là biểu thức logic có giá trị đúng hoặc sai
- Hành động 1 và 2: là các khối lệnh để thực hiện cho trường hợp 1 và 2
tương ứng.
Sơ đồ khối:
Biểu_thức
lựa_Chọn
Hành động 1 Hành động 2
đúng sai
15
Chức năng: Máy sẽ thực hiện hành động 1 nếu điều kiện lựa chọn có giá
trị dúng, ngược lại máy sẽ thực hiện hành động 2
Ví dụ:
if(x%2 = =0)
printf(“ so x là so chan”);
else
printf(“so x la so le”);
Chú ý:
- Mỗi khối lệnh có thể có một hoặc nhiều lệnh, nếu nhiều lệnh phải có
cặp dấu đóng mở ngoặc nhọn { }
- Lệnh if này có thể không sử dụng hành động 2 và từ khóa else, khi đó
nếu biểu thức trọn có giá trị sai thì máy sẽ bỏ qua(không làm gì cả).
Bài tập:
Viết chương trình giải bất phương trình bậc nhất: ax + b > 0
#include
#include
void main()
{
int a,b;
clrscr();
printf("nhap he so a = ");scanf("%d",&a);
printf("nhap he so b = ");scanf("%d",&b);
if(a = =0)
{
if(b > 0) printf("\n BPT luon dung voi moi x");
else printf("\n BPT vo nghiem");
}
if(a > 0) printf("\n Nghiem cua BPT la: x > %f",-b*1.0/a);
if(a < 0) printf("\n Nghiem cua BPT la: x < %f",-b*1.0/a);
getch() ;
}
Viết chương trình giải phương trình bậc hai
16
#include
#include
#include
void main()
{
int a,b,c;
float d,x1,x2;
clrscr();
printf("nhap he so a= ");scanf("%d",&a);
printf("nhap he so b= ");scanf("%d",&b);
printf("nhap he so c= ");scanf("%d",&c);
if(a = = 0)
printf("\nkhong phai la phuong trinh bac hai ");
else
{
d=b*b-4*a*c;
if(d < 0)
printf("\nphuong trinh vo nghiem");
else
if(d = = 0)
printf("\nphuong trinh co nghiem kep x1,2 = %f",-b/2.0*a);
else
{
printf("\n Nghiem cua phuong trinh la:");
printf("\n x1= %f",(-b+sqrt(d))/2.0*a);
printf("\n x2= %f",(-b-sqrt(d))/2.0*a);
}
}
getch() ;
}
2. Lệnh switch
17
Lệnh switch cho phép rẽ nhiều nhánh với các trường hợp bằng xảy ra
khi so sánh biểu thức chọn với các giá trị trong từng trường hợp đó.
Cú pháp:
switch(biểu_thức_chọn)
{
case giá_trị_1: hành động 1;[break;]
case giá_trị_2: hành động 2;[break;]
.
case giá_trị_k: hành động k;[break;]
default: hành động x;
}
Trong đó:
- Biểu thức trọn: là biểu thức dạng đếm được có thể là số nguyên hoặc ký
tự, dùng để so sánh lựa trọn.
- Các giá trị 1,2,,k là các giá trị số nguyên hoặc ký tự để so sánh.
- Các hành động 1,2,,k là các khối lệnh để thực hiện ứng với từng
trường hợp trên.
- Từ khóa break sau mỗi hành động để kết thúc lệnh sau mỗi trường hợp
sẩy ra. Có thể có hoặc không có các từ khóa break này.
Sơ đồ khối:
18
Chức năng:
Máy sẽ so sánh biểu thức trọn lần lượt với các giá trị 1, giá trị 2, giá trị
3, giá trị k. Nếu gặp một giá trị i(i=1,2,..,k) nào đó bằng giá trị biểu thức
chọn thì máy sẽ thực hiện các hành động đứng sau giá trị i đó đến khi gặp
từ khóa break hoăc hết mọi hành động có trong lệnh switch. Nếu tất cả các
trường hợp từ 1 đến k không sẩy ra điều kiện bằng thì mặc định máy sẽ
thực hiện hành động X sau từ khóa default.
Chú ý:
- Lệnh switch có thể không có phần từ khóa default và khối lệnh x, khi
đó máy sẽ không làm gì trong trường hợp không xẩy ra điều kiện bằng
giữa biểu thức trọn và giá trị tương ứng của case.
19
Ví dụ:
switch(t)
{
case 1: printf(“chu nhat”);break;
case 2: printf(“thu 2”);break;
case 3: printf(“thu 3”);break;
case 4: printf(“thu 4”);break;
case 5: printf(“thu 5”);break;
case 6: printf(“thu 6”);break;
case 7: printf(“thu 7”);break;
default: printf(“khong la mot ngay trong tuan”);
}
Bài tập:
Viết chương trình đọc vào từ bàn phím một số nguyên n(1 n 10)
rồi đưa ra tiếng anh của số đó. Chẳng hạn ,nếu gõ vào n = 2 thì đưa ra: 2 ->
TWO
#include
#include
void main()
{
int so;
clrscr();
printf("hay nhap vao mot so:(tu 1->10): ");
scanf("%d",&so);
switch(so)
{
case 1:printf("\n so 1 tieng anh la ONE");break;
case 2:printf("\n so 2 tieng anh la TWO");break;
case 3:printf("\n so 3 tieng anh la THREE");break;
case 4:printf("\n so 4 tieng anh la FOUR");break;
case 5:printf("\n so 5 tieng anh la FIVE");break;
case 6:printf("\n so 6 tieng anh la SIX");break;
case 7:printf("\n so 7 tieng anh la SEVEN");break;
case 8:printf("\n so 8 tieng anh la EIGHT");break;
case 9:printf("\n so 9 tieng anh la NINE");break;
20
case 10:printf("\n so 10 tieng anh la TEN");break;
default: printf("\n nhap du lieu sai");
}
getch() ;
}
III.Lệnh lặp
Lệnh lặp cho phép máy thực hiện một hành động nào đó lặp lại nhiều lần,
mặc dù chúng ta chỉ viết một lần, ngôn ngữ C có các lệnh lặp sau đây.
1. Lệnh for
Cú pháp:
for (nhóm lệnh 1;biểu thức 2; nhóm lệnh3)
Hành động lặp;
Trong đó :
- Các nhóm lệnh 1,2,3 là các lệnh điều khiển trong quá trình lặp của for
- Hành động lặp là khối lệnh để máy tính thực hiện lặp lại nhiều lần.
Sơ đồ khối:
Chức năng:
Máy thực hiện nhóm lệnh 1 duy nhất một lần đầu tiên, sau đó thực hiện
tính biểu thức 2 và nếu kêt quả tương ứng với giá trị đúng thì máy thực hiện
hành đông lặp, tiếp theo máy thực hiện nhóm lênh 3, và lặp lại kiểm tra biểu
thức 2 cho đến khi kết quả tương ứng với giá trị sai.
21
Vi dụ:
For(i=1;i<5;i++)
printf(“\n i= %d”,i);
Sẽ hiện ra các số nguyên từ 1 đến 4 ra màn hình.
for (i = 4;i>=1;i--)
printf(“\n i = %d”,i);
sẽ hiện các số nguyên từ 4 xuống 1 ra màn hình.
Chú ý :
- Trong hành động lặp có thể có một lệnh hoặc nhiều lệnh, nếu có nhiều
lệnh thì phải có cặp dấu mở đóng ngoặc nhọn {} để tạo khối
- Trong lệnh này chỉ có nhóm lệnh 1 được thực hiện một lần đầu tiên,
còn lại các biểu thức 2 và nhóm lệnh 3 và hành động lặp, sẽ thực hiện
nhiều lần trong quá trình lặp.
- Các nhóm lệnh 1,3 và biểu thức 2 có thể không xuất hiện trong lênh for
nhưng phải có dấu chấm phẩy (;) khi đó nếu không có biểu thức 2 thì
máy sẽ xem như điều kiện lặp luôn luôn đúng và sẽ lặp vô tận.
- Trong mỗi nhóm lệnh 1 và 3 có thể có nhiều lệnh cách nhau bởi dấu
phẩy đối với biểu thức 2 có thể thay đổi bằng một nhóm lệnh và khi đó
máy sẽ lấy kết quả của lệnh cuối cùng làm điều kiện lặp hoặc dừng.
Bài tập
Nhập vào một số n từ bàn phím, hiện lên màn hình các số chẵn và lẻ từ 1
đến n (hiện hết số chẵn rồi mới hiện số lẻ).
#include
#include
void main()
{
int n,i;
clrscr();
printf("Nhap vao so n= ");scanf("%d",&n);
printf("\n Cac so chan tu 1 den %d la: ",n);
for(i=1; i<=n;i++)
if(i%2 = =0)printf(" %d",i);
22
printf("\n Cac so le tu 1 den %d la:",n);
for(i=1;i<=n;i++)
if(i%2!=0)printf(" %d",i);
getch() ;
}
Nhập n, tính tổng S=1+
n
1
...
4
1
3
1
2
1
(n số hạng)
#include
#include
void main()
{
int i, n;
float s = 0;
clrscr();
printf(“\n nhap n= ”); scanf(“%d”,&n);
for(i=1;i<=n;i++)
s = s + 1.0/i ;
printf(“\n Tong la: %f”,s);
printf(“\n nhan mot phim bat ki de thoat ”);
getch();
}
Lập chương trình xếp các dấu * thành một hình thoi n dòng với n nhập từ
bàn phím
#include
#include
void main()
{
int n,x=40,y=1;
clrscr();
printf("nhap so luong dong n= ");
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=0;j<=20;j++)
23
{
gotoxy(x,y) ;
printf("*");
x++;
}
x=40-y;
y++;
}
getch() ;
}
2. Lệnh While
Cú pháp
while (điều kiện lặp)
Hành động lặp;
Trong đó:
- Điều kiện lặp : là biểu thức so sánh hoặc biểu thức nguyên
- Hành động lặp: là các lệnh sẽ được thực hiện hiều lần trong quá trình
lặp, nếu có nhiều lệnh phải có dấu { } để đóng khối.
Sơ đồ khối
Chức năng:
Trong khi điều kiện lặp vẫn có giá trị đúng thì máy sẽ lặp thực hiện
khối lệnh, và sẽ dừng lại nếu điều kiện sai
Ví dụ:
x=1; y=10;
while(x<y)
{
Điều kiện
lặp
Hành động lặp
đúng
sai
24
Printf(“\n x = %d va y = %d”,x,y);
x +=2;y--;
}
Chú ý: nếu hành động sai ngay từ đầu thì máy sẽ không thực hiện hành động
lặp dù chỉ một lần.
3. Lệnh do- while
Cú pháp:
do{
hành động lặp;
}while(điều kiện lặp);
Trong đó: hành động lặp và điều kiện lặp giống như lệnh while ở trên
Sơ đồ khối
Chức năng: máy sẽ thực hiện hành động lặp nhiều lần cho đến khi điều kiện
lặp có giá trị sai.
Ví dụ:
x=1; y=10;
do{
printf(“\n x=%d và y=%d”,x,y);
x+=2;y--;
} while(x<y);
Điều kiện
lặp
Hành động lặp
đúng
sai
25
Chú ý:
- Hành động lặp ít nhất được thưc hiện một lần dù cho điều kiện lặp luôn
có giá trị sai vì máy kiểm tra điều kiện lặp sau khi thực hiện hành động
lặp, điều này khác với lệnh while.
Bài tập:
Lập chương trình nhập một dãy các số nguyên vào từ bàn phím cho
đến khi gặp số 0. tính tổng các số dương và trung bình cộng các số âm
#include
#include
void main()
{
int i=1,so,dem = 0;
float tong_duong = 0,tong_am = 0;
clrscr();
printf("\nnhap vao mot day cac so nguyen:");
do
{
printf("\nnhap so thu %d: ",i);
scanf("%d",&so);
if(so>0)tong_duong = tong_duong+so;
else
{
tong_am = tong_am + so;
if(so!=0)dem++;
}
i++;
}while(so!=0);
printf("\ntong cac so duong la: %f",tong_duong);
if(dem!=0)
printf("\nTBC cac so am la: %f",tong_am/dem);
getch() ;
}
26
Lập chương trình tìm các số có 3 chữ số sao cho số đó bằng tổng lập phương
các chữ số của nó
#include
#include
#include
void main()
{
int i =100, tram,chuc,donvi;
clrscr();
printf("cac so tim duoc la:\n");
do{
tram=i/100;
chuc=(i%100)/10;
donvi=(i%100)%10;
if(i==(pow(tram,3)+pow(chuc,3)+pow(donvi,3)))
printf(" %d",i);
i++;
}while(i<1000);
getch();
}
4. Lệnh break, continue, goto
lệnh break có tác dụng dừng vòng lặp (for ,while, do-while) trong mọi
trường hợp.
Lệnh continue làm cho chương trình bỏ qua phần còn lại của vòng lặp và
nhảy sang lần lặp tiếp theo. Những câu lệnh viết sau lệnh continue sẽ không
được thực hiện.
ví dụ:
for(i=0; i <10;i++)
{
printf(“%d”,i);
if(i>5) continue;
i++;
27
}
Lệnh goto: Lệnh này cho phép nhảy vô điều kiện tới bất kỳ điểm nào
trong chương trình.
Ví dụ:
Nhập vào từ bàn phím 1 số bất kì. Kiểm tra số đó là chẵn hay lẻ, hiện
kết quả lên màn hình. Sau khi hiện song hỏi người dùng có tiếp tục chương
trình không. Nếu có thì lập lại hành động trước đó. Nếu không thì kết thúc
chương trình.
#include
#include
void main()
{
int x;
char ch;
L:
clrscr();
printf("nhap mot so bat ki: ");
scanf("%d",&x);
if(x%2 = =0)printf(“\nso do la so chan”);
else printf(“\nso do la so le”);
printf("\n co tiep tuc truong trinh ko(c/k)?");
ch=getche();
if(ch = ='c')goto L;
getch()
}
Bài tập:
Nhập vào từ bàn phím 3 số bất kì. Hiện số lớn nhất trong 3 số đó lên
màn hình. Sau khi hiện song hỏi người dùng có tiếp tục chương trình không.
Nếu có thì lập lại hành động trước đó. Nếu không thì kết thúc chương trình.
#include
#include
void main()
{
int a1,a2,a3;
28
int max;
char ch;
L:
clrscr();
printf("nhap so thu nhat: ");
scanf("%d",&a1);
printf("nhap so thu hai: ");
scanf("%d",&a2);
printf("nhap so thu 3: ");
scanf("%d",&a3);
max = a1;
if(a2>max)max =a2;
if(a3>max)max =a3;
printf("\n so lon nhat la: %d",max);
printf("\n co tiep tuc truong trinh ko(c/k)?");
ch=getche();
if(ch = ='c')goto L;
getch() ;
}
29
Bài 4 CHƯƠNG TRÌNH CON
I. Khái niệm
Chương trình con là mô-đun chương trình độc lập, hoạt động dưới sự
điều khiển của một mô-đun chương trình khác.
Chương trình con được dùng để tôí ưu hóa việc tổ chức chương trình,
chia một chương trình lớn thành nhiều công việc độc lập nhỏ. Dùng chương
trình con thực hiện các công việc nhỏ, tạo thành mô-đun. Khi đó nhiệm vụ
chương trình chính chỉ là cung cấp dữ liệu đầu vào cho các mô-đun để hoàn
thành công việc của mình. Một chương trình viết theo cách này gọi là
chương trình cấu trúc.
Có thể minh họa chương trình con như hình sau :
Để nhận các dữ liệu đưa vào cho chương trình con và nếu có thể chứa
dữ liệu kết quả ra chúng ta phải sử dụng tham số (parameters) của chương
trình con.
Tham số tồn tại dưới hai hình thức đó là tham số thực và tham số hình
thức. Tham số hình thức là tham số để khai báo và xây dựng trương trình
con, còn tham số thực để xác định dữ liệu đưa vào khi gọi chương trình con.
Trong một số ngôn ngữ lập trình cung cấp hai loại chương trình con
riêng biệt đó là hàm(function) và thủ tục (procedures) nhưng trong C chỉ
cung cấp một loại đó là hàm
Để tạo một hàm chúng ta cần xác định
- Hàm tạo ra sẽ thực hiện công việc gì ?
- Sau khi thưc hiện song có cần trả về một dữ liệu hay nhiều dữ liệu
không ?
- Để thực hiện được công việc đó ta cần những dữ liệu nào ?
Chương trình
con thực hiện
công việc A
Dữ liệu đưa vào
để thực hiện
công việc A
Dữ liệu kết quả
của công việc A
30
II, Khai báo và xây dựng hàm
1. khai báo hàm
Khai báo hàm được thực hiện ở phần đầu chương trình, khai báo để chỉ
cho máy biết các thông tin về hàm bao gồm : kiểu dữ liệu trả về có hay
không ,tên hàm, các tham số bao gồm kiểu và tên của từng tham số.
Cú pháp khai báo như sau :
Tên_kiểu_trả_về tên_hàm(kiểu1 tham_số1,kiểu2 tham_số2 ..... ) ;
Trong đó :
- Tên kiểu trả về : là một tên kiểu dữ liệu quy định kết quả trả về là khiểu
gì.
- Tên hàm : tự đặt theo quy định đặt tên của ngôn ngữ C.
- Kiểu1 tham_số1 : xác định tên của tham số thứ nhất và kiểu của tham
số đó,...
Ví dụ :
int sum(int a , int b) ;
float max(float x, float y);
Nếu trong hàm không có dữ liệu trả về thì viết kiểu trả về là void nếu
không có tham số thì bỏ trống và phải có cặp dấu đóng mở ngoăc () sau tên
hàm.
Ví dụ:
void hien();
2. Xây dựng hàm
Sau khi khai báo xong hàm chúng ta có thể viết lệnh thực hiện công việc
đặt ra cho chương trình con.
Cú pháp:
Tên_kiểu_trả_về tên_hàm(kiểu1 tham_số1,kiểu2 tham_số2 ..... ) ;
{
Các câu lệnh thực hiện công việc đặt ra cho hàm.
}
Khi cần kết thúc thực hiện hàm và trả về dữ liệu nào đây, chúng ta viết
lệnh return vào vị trí cần thiết nhất trong hàm.
Cú pháp:
return giá-trị-dữ-liệu-trả-về;
Ví dụ:
31
int sum(int a, int b)
{
return a+b;
}
Hoặc
float max(float x, float y)
{
if(x>y)
return x;
else
return y;
}
Đối với hàm có kiểu void có thể không cần lệnh return
Ví dụ:
void hien()
{
printf(“ho va ten: Nguyen Van Nam”);
printf(“Ngay sinh :12\08\2009”);
printf(“que quan : Yen Bai”);
}
Chú ý:
Thông thường với những chương trình đơn giản có ít chương trình con thì
người ta viết lệnh cho hàm ngay tại nơi khai báo.
3. Lời gọi hàm
Khi thực hiện chương trình máy sẽ thực hiện các lệnh trong chương trình
chính(hàm main), do đó để yêu cầu máy thực hiện công việc của chương
trình con ta phải viết lệnh gọi chương trình con với cú pháp sau.
Tên-hàm(các-tham-số-thực-chuyền-vào);
Lời gọi này có thể là một câu lệnh độc lập hoặc đặt trong biểu thức, nếu
đặt trong biểu thức thì hàm đó phải có giá trị trả về để thực hiện tính toán
biểu thức đó.
Ví dụ:
printf(“Tong hai so 5 va 6 la: %d”,tong(5,6));
hoặc :
float x ;
x = max(a,b) ;
hoăc :
hien();
32
Chú ý: Thông thường lời gọi hàm được viết trong chương trình chính, tuy
nhiên có thể viết trong chương trình con khác. Các chương trình con có thể
gọi lẫn nhau.
4. Các vấn đề ở tham số
- Biến toàn cục và biến cục bộ
Biến toàn cục là biến nhớ được khai báo ở ngoài mọi hàm(thường được
khai báo ở trên cùng sau khai báo thư viện), có tác dụng đến toàn bộ
chương trình cả chương trình chính và chương trình con.
Biến cục bộ là biến nhớ được khai báo bên trong một chương trình con,
chỉ có tác dụng ở trong chương trình con đó. Bên ngoài chương trình con
đó thì biến đó không được sử dụng nữa.
Ví du:
#include
#include
int a,b;
int sum()
{
int c = a + b;
return c;
}
int tich()
{
int c ;
c =a*b;
return c;
}
void main()
{
clrscr();
printf(“nhap vao so a = ”); scanf(“%d”,&a);
printf(“nhap vao so b = ”);scanf(“%d”,&b);
printf(“\n tong hai so: %d”,sum());
printf(“\n tich hai so la: %d”,tich());
getch();
}
Trong ví dụ trên hai biến a và b là biến toàn cục được sử dụng trong cả 3
hàm sum, max và main. Trong hàm sum và max đều có biến cục bộ là c
33
nhưng biến c trong hàm sum sẽ độc lập và riêng biệt so với c trong hàm
max.
- Tham số hình thức và tham số thực
Tham số hình thức là tham số được khai báo khi xây dựng hàm, nó
mang ý nghĩa hình thức để nhận dữ liệu đầu vào cho một hàm.
Tham số thực là tham số được xác định khi chúng ta gọi hàm, đó là
các dữ liệu được truyền vào cho hàm thực hiện tính toán.
Ví dụ:
int sum(int a, int b)
{
return (a+b);
}
void main()
{
int x = 5;
printf(“tong hai so la:”, sum(5,x*2-1));
}
Trong ví dụ trên tham số a và b trong khai báo hàm sum là tham số
hình thức, còn lời gọi hàm sum(5,x*2-1) thì 5 và x*2-1 là tham số thực, đó
là các hằng số và biểu thức.
Bài tập:
Viết chương trình con tìm Max, Min 3 sô nguyên, chương trình chính
nhập vào 3 số nguyên, hiện số lớn nhất và nhỏ nhất ra màn hình.
#include
#include
int max(int a,int b,int c)
{ int max=a;
if(max<b)max=b;
if(max<c)max=c;
return max;
}
int min(int a, int b, int c)
{
int min=a;
if(min>b)min=b;
if(min>c)min=c;
return min;
34
}
void main()
{
int a,b,c;
clrscr();
printf("\nnhap vao 3 so nguyen:");
printf("\nso thu nhat: ");scanf("%d",&a);
printf("\nso thu hai: ");scanf("%d",&b);
printf("\nso thu ba : ");scanf("%d",&c);
printf("\n so lon nhat la: %d",max(a,b,c));
printf("\n so nho nhat la: %d",min(a,b,c));
getch() ;
}
35
Bài 5: KIỂU DỮ LIỆU MẢNG VÀ LIỆT KÊ
I, Khai báo kiểu mảng
1 khái niệm và ý nghĩa của mảng
Mảng là cấu trúc dữ liệu cho phép quản lý một danh sách hữu hạn các
dữ liệu cùng kiểu có kí tự
Ví dụ: Để chứa 5 dữ liệu số nguyên sau 10, 12, 25, 30, 40
Chúng ta có thể sử dụng 5 biến nhớ khác nhau
a = 10, b = 12, c = 25, d = 30, e = 40
tuy nhiên nếu số lượng dữ liệu tăng thì cách này không phù hợp, và chúng ta
sẽ sử dụng cấu trúc mảng, minh hoạ như sau:
10 12 25 30 40 ....
Các dữ liệu trong mảng phải cùng kiểu(số nguyên, số thực, ký tự ... ).
Mảng để chứa dữ liệu như trên là mảng 1 chiều, chúng ta có thể sử
dụng mảng 2 chiều hoặc mảng nhiều chiều.
Ví dụ về mảng 2 chiều:
10 2 5 ....
45 23 56 ....
8 5 20 ....
.... .... .... ....
Mảng hai chiều là một bảng các dữ liệu được xếp theo hàng và cột,
mỗi dữ liệu sẽ chứa trong ô được xác định bằng cách chỉ ra ở hàng nào và
cột nào.
2. Khai báo kiểu mảng và biến mảng
cú pháp:
tên_kiểu_dữ_liệu tên_mảng[số_lượng_phần_tử_tối_đa];
Trong đó:
Tên kiẻu dữ liệu qui định mảng có thể chứa được dữ liệu có kiểu như
thế nào(int, float, char...)
Tên mảng do chúng ta đặt theo quy định đặt tên của ngôn ngữ C
36
Ví dụ:
int a[20];
float b[50];
Để khai báo mảng hai hoặc nhiều chiều ta chỉ cần thêm kích thước(số phần
tử) ở chiều tiếp theo
Cách khai báo mảng hai chiều:
Tên_kiểu_dữ_liệu tên_mảng[kích_thước_hàng]
[kích_thước_cột];
int a[10] [15];
float b[100] [100];
3, Cách tổ chức dữ liệu mảng tên máy và truy nhập các phần tử
Đối với mảng một chiều các phần tử chứa dữ liệu được sắp xếp liên
tục trong bộ nhớ máy, và mỗi phần tử sẽ có một chỉ số (là số thứ tự) của
phần tử đó trong mảng.
Phần tử đầu tiên có chỉ số là 0, tiếp theo là 1 và tiếp tục cho đến hết,
vậy sẽ dừng lại ở chỉ số bằng số lượng phần tử -1.
Minh hoạ bằng hình sau:
10 25 15 30 .....
0 1 2 3 ....
Kích thước của mảng (tính bằng byte) sẽ là: số lượng phần tử của mảng
nhân với kích thước của kiểu dữ liệu của mảng đó.
Ví dụ:
int a[20];
Thì mảng sẽ chiếm kích thước bộ nhớ là: 20 x 2 = 40 byte
Để truy nhập đến các phần tử ta sử dụng tên và các chỉ số của phần tử
đó theo cú pháp sau:
Tên_mảng[chỉ_số_phần_tử_cần_truy_nhập];
Ví dụ:
a[0]=10;
Nếu là mảng hai chiều thì các dữ liệu của mảng được lưu trữ tuần tự
theo quy tắc ưu tiên hàng (lưu trữ hết hàng này đến hàng khác).
Các hàng và cột có chỉ số bắt đầu từ 0 theo chiều từ trên xuống theo
hàng và từ trái sang phải theo cột.
37
4 6 2 .... 0
8 9 45 .... 1
2 8 6 .... 2
6 9 2 .... 3
.... .... .... .... ....
0 1 2 ......
Để truy nhập đến các phần tử của mảng hai chiều ta sử dụng tên mảng và chỉ
số hàng và chỉ số cột theo cú pháp sau:
Tên_mảng_hai_chiều[chỉ_số_hàng] [chỉ_số_cột];
Ví dụ:
a[1][2] = 5;
Chú ý:
Số lượng dữ liệu lưu trong mảng có thê ít hơn số lượng phần tử đã
khai báo, nhưng không vượt quá số lượng phần tử đã khai báo đó. Thông
thường sử dụng mảng sẽ có một số nguyên n để lưu số lượng dữ liệu được
lưu trong mảng tương ứng.
Danh sách các dữ liệu lưu trong mảng phải liên tục nhau để quản lý và
sử lý dễ dàng.
II- Các xử lý trên mảng
1, Nhập dữ liệu vào mảng
chương trình:
printf("nhap so luong phan tu cho mang n = ");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("nhap du lieu a[%d]=",i);
scanf("%d",&a[i]);
}
2 , Hiện dữ liệu ra màn hình
chương chình:
38
printf("\n du lieu trong mang la:\n");
for(i=0;i<n;i++)
{
printf("%5d",a[i]);
}
chú ý: Nếu muốn hiển thị dữ liệu các phần tử mảng ra màn hình theo điều
kiện nào đó ta chỉ cần thêm điều kiện vào sau lệnh for
ví dụ:
printf("du lieu trong mang la:\n");
for(i=0;i<n;i++)
{
if(a[i]%2 = = 1)
printf("&5d",a[i]);
}
3 Tính toán trên các phần tử
Tính tổng:
Chương trình
int tong = 0;
for (i=0;i<n;i++)
{
tong = tong + a[i];
}
printf("Tong cua cac phan tu trong mang la: %d",tong);
Tính trung bình
float t_binh = 0;
for (i=0;i<n;i++)
{
t_binh = t_binh +a[i];
}
t_binh = t_binh /n;
printf("Trung binh cua cac phan tu trong mang la: %f",t_binh);
Chú ý:
Để tính toán các phần tử thoả mãn một điều kiện ta chỉ cần thêm lệnh if
vào trước khối lệnh tính
Ví dụ: tính tổng các số dương
int tong = 0;
39
for (i=0;i<n;i++)
if(a[i]>0)
tong = tong + a[i];
printf("tong cua cac so duong trong mang la: %d",tong);
4 Tìm kiếm các phần tử
Tìm min
Sơ đồ thuật toán
Chương trình
int min =0;
for (i = 0;i<n;i ++)
{
if(a[min] >a[i])
min = i;
}
printf("so nho nhat trong mang la :%d",a[min]);
Tìm max, tương tự như tìm min chỉ thay điều kiện so sánh lớn
hơn(a[min]>a[i]) bằng điều kiện nhỏ hơn (a[max]< a[i]).
5 sắp xếp các phần tử
- Sắp xếp các phần tử theo chiều tăng hoặc giảm
Chương trình
for( i = 0; i < n;i + +)
for(j = i+1;j<n-1;j++)
if(a[i]>a[j])
{
tg = a[i];
a[i] = a[j];
a[j] = tg;
}
Nếu chuyển thành sắp xếp không tăng(giảm dần) chỉ cần thay điều kiện sắp
xếp thành a[i] < a[j]
Bài tập:
Lập trình đọc vào từ bàn phím hai dãy số nguyên. Dãy A có n số, dãy B
có m số. Tính tổng của mỗi dãy, so sánh xem dãy nào có tổng lớn hơn. Đưa
kết quả ra màn hình bao gồm: dãy A, dãy B, tổng dãy A,B, so sánh.
40
#include
#include
void nhap(int n,int C[])
{ for(int i=0;i<n;i++)
{
printf("\n Nhap so thu %d ",i+1);
scanf("%d",&C[i]);
}
}
void hien(int n,int C[])
{
for(int i=0;i<n;i++)
{
printf(" %d",C[i]);
}
}
int tong(int n,int C[])
{ int sum=0;
for(int i=0;i<n;i++)
sum=sum+C[i];
return sum;
}
void main()
{
clrscr();
int A[100],B[100],m,n;
printf("\nnhap so luong phan tu day A: n= ");
scanf("%d",&n);
printf("\nnhap so luong phan tu day B: m= ");
scanf("%d",&m);
printf("\n Nhap gia tri cho day A:");
nhap(n,A);
printf("\n Nhap gia tri cho day B");
nhap(m,B);
printf("\n Day A vua nhap la:");
hien(n,A);
printf("\n Day B vua nhap la:");
hien(m,B);
printf("\n tong day A la: %d",tong(n,A));
printf("\n tong day B la: %d",tong(m,B));
41
printf("\n Day lon hon la: ");
if(tong(n,A)>tong(m,B)) printf("A");
else printf("B");
getch() ;
}
Nhập ma trận A có m hàng n cột đưa ra màn hình ma trận A vừa nhập để
kiểm tra.
#include
#include
void main()
{
int n,m,i,j,A[100][100];
clrscr();
printf("nhap so hang cua ma tran: n= ");
scanf("%d",&n);
printf("nhap so cot cua ma tran: m= ");
scanf("%d",&m);
//nhap gia tri cho ma tran
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
printf("A[%d][%d]= ",i+1,j+1);
scanf("%d",&A[i][j]);
}
}
// hien ma tran vua nhap
printf("\nMa tran ban vua nhap la:");
for(i=0;i<n;i++)
{ printf("\n");
for(j=0;j<m;j++)
{
printf("%d ",A[i][j]);
}
}
getch();
}
42
Nhập vào từ bàn phím một dãy số nguyên. Tìm số lớn nhất, nhỏ nhất và vị
trí của số đó trong mảng.
#include
#include
void main()
{
int i,n,A[100],max=0,min=0;
clrscr();
printf("nhap so luong phan tu cua day: ");
scanf("%d",&n);
//nhap gia tri cho day
for(i=0;i<n;i++)
{
printf("\n Nhap A[%d] = ",i+1);
scanf("%d",&A[i]);
}
//tim Max, Min
for(i=1;i<=n;i++)
{
if(A[max]<A[i]) max=i;
if(A[min]>A[i]) min=i;
}
printf("\nSo lon nhat trong day la: %d",A[max]);
printf("\t Vi tri so do la: %d",max+1);
printf("\nSo nho nhat trong day la: %d",A[min]);
printf("\t Vi tri so do la: %d",min+1);
getch();
}
Nhập và từ bàn phím một dãy số nguyên, xắp xếp dãy đó theo chiều tăng
dần và giảm dần. hiện lên màn hình: dãy số vừa nhập, dãy đã sắp xếp.
#include
#include
void nhap(int n,int C[])
{ for(int i=0;i<n;i++)
{
43
printf("\n Nhap so thu %d ",i+1);
scanf("%d",&C[i]);
}
}
void hien(int n,int C[])
{
for(int i=0;i<n;i++)
{
printf(" %d",C[i]);
}
}
void tang(int n, int C[])
{ int tg;
for(int i=0;i<n;i++)
for(int j=0;j<n-1;j++)
if(C[j] >C[j+1])
{
tg=C[j];
C[j]=C[j+1];
C[j+1]=tg;
}
}
void giam(int n, int C[])
{ int tg;
for(int i=0;i<n;i++)
for(int j=0;j<n-1;j++)
if(C[j] <C[j+1])
{
tg=C[j];
C[j]=C[j+1];
C[j+1]=tg;
}
}
void main()
{
clrscr();
int A[100],n;
printf("\nnhap so luong phan tu day : n= ");
scanf("%d",&n);
printf("\n Nhap gia tri cho day :");
44
nhap(n,A);
printf("\n Day vua nhap la:");
hien(n,A);
//hien day da xap xep tang dan
printf("\n Day da xap xep tang dan la:");
tang(n,A);
hien(n,A);
//hien day da xap xep giam dan
printf("\n Day da xap xep giam dan:");
giam(n,A);
hien(n,A);
getch() ;
}
45
Bài 6 QUẢN LÝ VÀ SỬ LÝ TRUỖI KÝ TỰ
I, Khái niệm
1, Khai báo biến chứa chuỗi ký tự
trong C không có kiểu xâu, do vậy ngôn ngữ C sử dụng mảng để lưu trữ
chuỗi ký tự, mỗi phần tử của mảng sẽ là một kiểu dữ liệu kiểu char
Cú pháp khai báo:
char biến_xâu[n];
với n là số nguyên dương bất kỳ (<64kb),chỉ số tối đa các ký tự của xâu.
Ví dụ:
char s[100];
sẽ khai báo mảng s để lưu chuỗi ký tự
2 Cách tổ chức lưu trữ chuỗi ký tự trong mảng
Các ký tự được lưu theo thứ tự từ trái sang phải của chuỗi và bắt đầu
bằng phần tử có chỉ số 0 cho đến hết chuỗi.
Kết thúc một chuỗi (ở sau ký tự cuối cùng) sẽ có dấu hiệu đặc biệt kết
thúc đó là ký tự '\0'. Và đó cũng là để xác định độ dài thực của chuỗi ký tự
có trong mảng.
Để truy nhập đến từng ký tự của xâu ta viết
biến_xâu[giá_trị_chỉ_số];
trong đó giá trị chỉ số xác định vị trí ký tự trong xâu
Vì kết thúc mỗi chuỗi lưu trong mảng có thêm ký tự ' \0' nên số ký tự
tối đa có thể lưu trong mảng sẽ là số phần tử của mảng -1.
Ví dụ:
char s[100];
thì mảng s sẽ lưu được 99 ký tự tối đa, còn phải trừ ra một phần tử
cuối để chứa '\0'
T R A N Y E N \0 ...
...
0 1 2 3 4 5 6 7 8 9 10 97 98 99
giả sử sâu s lưu chuỗi "TRAN YEN" thì sâu sẽ được tổ chức như hình trên,
các ký tự có chỉ số 0 đến hết trên mảng s.
46
giả sử ta có 4 lệnh sau:
s[0] = 'V';
s[1] = 'a';
s[2] = 'n';
s[3] = ' ';
thì sẽ thay chữ "TRAN" trong mảng thành chữ "Van "
II, Các sử lý trên chuỗi ký tự
Ngôn ngữ C cung cấp các lệnh sử lý xâu trong thư viện , do đó
ta phải khai báo thư viện này ở đầu chương trình
1, Nhập và hiện chuỗi ký tự
Chúng ta có thể sử dụng lệnh scanf() để nhập chuỗi, tuy nhiên lệnh này
chỉ thực hiện nhập chuỗi không dấu cách, để nhập chuỗi đúng đắn ta sử dụng
lệnh sau:
gets(tên_biến)
Ví dụ:
char s[100];
printf(“nhập một chuỗi ký tự:”);
gets(s);
Chú ý: Nếu trước lệnh nhập chuỗi có lệnh nhập số thì phải xóa vùng đệm
bàn phím trước khi nhập chuỗi bằng lệnh sau:
fflush(stdin);
Ví dụ
int n;
char s[50];
printf(“nhap so n =”);
scanf(“%d”,&n);
printf(“nhap chuoi s = ”);
fflush(stdin); gets(s);
Để hiện chuỗi kí tự ra màn hình ta có thể sử dụng một trong các lệnh sau:
printf(“%s”,xâu_cần_hiện);
puts(xâu_cần_hiện);
2, Các lệnh sử lý chuỗi ký tự
- Lệnh cho biết độ dài thực sự (số ký tự) của chuỗi ký tự lưu trong mảng
int strlen(s);
ví dụ:
char s[100] = “Ha Noi Viet Nam”;
int a = strlen(s);
47
sẽ trả về độ dài thực của sâu s gán vào biến nhớ a, cụ thể là a = 15
- Lệnh gán chuỗi từ sâu này vào sâu khác
strcpy(s1, s2 );
sẽ thưc hiện chép chuỗi ký tự trong sâu s2 vào s1.
Chú ý: Trong ngôn ngữ C không thể sử dung phép gán ( = ) để gán hai chuỗi
do đó phải sử dụng lệnh strcpy này.
Lệnh nối hai sâu lại với nhau
strcat( s1,s2);
sẽ thưc hiện nối sâu S2 vào sâu S1
ví dụ:
char s1[100] = “Ha Noi”;
char s2[100] =”Viet Nam”;
strcat (s1,s2);
kết quả xâu s1 sẽ thay đổi và đó là:”Ha NoiViet Nam”
- Lệnh chuyển sâu thành chữ hoa
strupr(s);
- Lệnh chuyển sâu thành chữ thường.
strlwr(s);
3, Đêm ký tự, đếm từ
Cho một chuỗi s và đếm xem trong chuỗi có bao nhiêu chữ thỏa mãn
một điều kiện nào đó:
dem = 0
for( i =0; i<strlen(s);i++)
if(s[i] thỏa mãn điều kiện) dem ++;
printf(“so ky tu dem duoc la: %d”,dem) ;
- Thuật toán đếm số từ co trong chuỗi s theo tiêu chuẩn nhận biết đầu từ( là
cặp ký tự thỏa mãn ký tự trước là dấu cách, ký tự sau khác dấu cách).
if(s[0] = = ‘ ’ ) dem = 0 ;
else dem = 1;
for( i = 1;i < strlen(s);i++ )
{
if(s[i] = =’ ’&& s[i+1]!=’ ’)
dem ++;
}
printf(“so tu dem duoc là: %d”,dem) ;
48
4. Chuẩn hóa chuỗi ký tự
Một chuỗi ký tự ở dạng chuẩn nếu không có dấu cách ở đầu , không
có dấu cách ở cuối và giữa hai từ có duy nhất một dấu cách.
Thuật toán chuẩn hóa được chia làm 3 bước như sau
Bước 1 : Xóa dấu cách ở đầu
int i = 0 ;
while (s[i] = =’ ’&&i < strlen(s)) i++ ;
strcpy(&s[0],&s[i]);
Bước 2: Xóa dấu cách thừa giữu hai từ
int i = 0;
while(i<strlen(s)-1)
{
if(s[i] = = ‘ ‘&& s[i+1] = = ‘ ‘ )
strcpy(&s[i],&s[i+1]);
else i++
}
Bước 3 xóa dấu cách ở cuối chuỗi
while(s[strlen(s)-1] = =’ ’ ) s[strlen(s)-1]= ‘\0’;
5 Tách từ
- Tách từ đầu tiên
i=0;
while(s[i] = =' ')i++;
for(j=0;(i<strlen(s))&&(s[i]!=' ');i++,j++)
tudau[j] = s[i];
tudau[j]='\0';
- Tách từ cuối cùng
i = strlen(s)-1;
while(s[i] = =' ')i--;
j=i;
while(s[i]!=' ')i--;
i++;
for(int x = 0;i<=j;i++)
49
{
tucuoi[x] = s[i];
x++;
}
tucuoi[x] = '\0';
Bài tập
Lập trình đọc vào một sâu. Đọc vào từ bàn phím một kí tự bất kì, rồi đếm
xem số lần xuất hiện ký tự này trong sâu. Báo kết quả ra màn hình.
#include
#include
#include
int dem(char s[ ],char a)
{
int d=0;//so ki tu
int l=strlen(s);
for(int i=0;i<l;i++)
{
if(s[i] = = a)
d++;
}
return d;
}
void main()
{
int i;
char s[100],ch;
clrscr();
printf("\n nhap vao mot cau: ");
fflush(stdin);gets(s);
printf("\n Nhap vao mot ki tu bat ki:");
ch = getche();
//dem so lan xuat hien cua ki tu
printf("\nki tu %c xuat hien %d lan trong xau ",ch,dem(s,ch));
getch();
}
50
Viết chương trình đọc vào một xâu. Đếm số từ của một sâu. Từ được hiểu là
xâu khác rỗng và không có dấu cách.
#include
#include
#include
int sotu(char S[])
{
int dem=0,n;
n=strlen(S);
if(S[0]!=' ')dem=1;
for(int i=1;i<n;i++)
{
if(S[i]= =' '&& S[i+1]!=' ')dem++;
}
return dem;
}
void main()
{
int i;
char s[100];
clrscr();
printf("\n nhap vao mot sau ki tu: ");
fflush(stdin);gets(s);
//dem so tu cua mot sau
printf("sau ban vua nhap co: %d tu",sotu(s));
getch();
}
Lập trình đọc vào một câu từ bàn phím rồi đưa ra màn hình dưới dạng một
cột. thí dụ đọc vào TIÊN HỌC LỄ HẬU HỌC VĂN kết quả đưa ra thành
TIÊN
HỌC
LỄ
HẬU
HỌC
VĂN
#include
51
#include
#include
void hien(char s[])
{
int l=strlen(s),n=0;
while(s[n]= =' ')n++;
for(int i = n ; i<l ; i++)
{ if(s[i]!=' ')
printf("% c",s[i]);
else
printf("\n");
}
}
void main()
{ int i;
char s[100];
clrscr();
printf("\n nhap vao mot cau: ");
fflush(stdin);gets(s);
printf("hien cau moi tu tren mot dong la:\n");
hien(s);
getch();
}
Nhập vào từ bàn phím họ tên của một người. Hiện tên và họ của người đó
lên màn hình.
#include
#include
#include
void main()
{
char s[100],ten[10],ho[10];
int i=0,j=0;
clrscr();
printf("\n nhap vao ten cua mot nguoi: ");
fflush(stdin);gets(s);
// tach ho
while(s[i]= =' ')i++;
52
do{
ho[j]=s[i];
i++; j++;
}while(s[i]!=' ');
ho[j]='\0';
printf("\n ho cua nguoi nay la: %s",ho);
// tach ten
j=0;
i=strlen(s);
while(s[i]= =' ')i--;
int i1=i;
while(s[i1]!=' ')i1--;
do{
ten[j]=s[i1];
i1++; j++;
}while(i1<=i);
ten[j]='\0';
printf("\n ten cua nguoi nay la: %s",ten);
getch();
}
53
Bai 7 BIẾN CON TRỎ
1. Biến trỏ là gì:
Biến trỏ là biến đặc biệt, dùng để lưu địa chỉ vùng nhớ của một biến
khác, chứ không lưu trữ giá trị của biến đó. Khích thước của biến trỏ phụ
thuộc vào cách khai báo. Được minh họa bằng hình sau.
Có hai kiểu biến trỏ: Biến trỏ có kiểu và biến trỏ không kiểu
Biến trỏ có kiểu : loại biến trỏ này chỉ chứa địa chỉ vùng nhớ của một
kiểu dữ liệu nào đó, kiểu dữ liệu này được xác định khi khai báo biến trỏ. Và
kiểu của biến trỏ xác định kích thước của vùng nhớ mà biến trỏ đến
Ví dụ biến trỏ kiểu int sẽ trỏ đến vùng nhớ có kích thước là 2 bytes, kiểu
floast sẽ trỏ đến vùng nhớ có kích thước là 4 bytes.
Biến trỏ không kiểu: loại biến trỏ này có thể chứa địa chỉ vùng nhớ có
kích thước bất kỳ.
Vùng nhớ động: là vùng nhớ được cấp phát khi cần và giải phóng khỏi bộ
nhớ khi sử dụng song. Để truy cập đến vùng nhớ động chúng ta phải dùng
biến trỏ.
2 khai báo biến trỏ:
- biến trỏ có kiểu
kiểu_dữ_liệu_mà_biến_trỏ_đến *tên_biến_trỏ;
- biến trỏ không kiểu:
void *tên_biến_trỏ
ví dụ:
54
int *p,*q;
float *a,*b;
void *i;
3 Các thao tác trên biến trỏ
Xác định địa chỉ của vùng nhớ(hoặc biến nhớ)
Ngôn ngữ C sử dụng toán tử & hoặc hàm để lấy địa chỉ vùng nhớ của
một biến
Cú pháp xác định địa chỉ vùng nhớ thông qua toán tử &.
&tên_biến_lấy_địa_chỉ
Hàm xác định địa chỉ.
FP_SEG(đối_tượng_lấy_địa_chỉ)
Ví dụ:
int a = 5,*p;
p = &a;
Truy nhập dữ liệu của vùng nhớ qua biến trỏ
Chúng ta sử dụng toán tử * để truy nhập dữ liệu trên vùng nhớ đang
được trỏ bởi biến trỏ như sau:
*tên-biến-trỏ
Ví dụ:
int a=5,*p;
p = &a;
a = *p+2;
kết quả a = 7.
Các phép toán
- Phép cộng trừ: +, -
- Phép tăng giảm: ++, - -, +=, - =
Phép tăng giảm tác động lên biến trỏ không thực hiện theo kiểu số học
đơn thuần, mà máy sẽ thực hiện chuyển nơi trỏ của biến trỏ đến ô nhớ
tiếp theo sau hoặc trước so với ô trỏ hiện tại.
Ví dụ:
55
P - -;
Sẽ cho biến trỏ P trỏ đến ô nhớ kế tiếp ô nhớ hiện tại.
- Phép so sánh:
,= =,>=, <=, !=
Phép so sánh trên biến trỏ sẽ thực hiện so sánh địa chỉ được lưu ở
trong biến trỏ và trả về kết quả dạng dúng hoặc sai tương ứng với
phép so sánh được sử dụng.
4 Cấp phát bộ nhớ
Để sử dụng bộ nhớ một cách tối ưu chúng ta thực hiện cấp phát động
vùng nhớ khi cần và giải phóng chúng khi không sử dụng nữa.
Cú pháp:
Tên_biến = (tên_kiểu*)malloc(số_byte);
Trong đó:
Số_byte = số lượng * sizeof(kiểu)
Ví dụ:
int *a =(int*)malloc(100*sizeof(int));
sẽ tạo ra một vùng nhớ để chứa 100 số nguyên và được trỏ bởi biến
trỏ a.
Hàm giải phóng vùng nhớ
free(tên_biến_trỏ);
Bài tập
Khai báo 1 biến nguyên a và biến trỏ kiểu nguyen p, cho p trỏ đến a.
in ra màn hình địa chỉ của a, nội dung trong p, địa chỉ của biến trỏ p.
#include
#include
#include
void main()
{
int a, *p;
clrscr();
p=&a;
printf("\nDia chi cua bien nho a= %x",&a);
printf("\nNoi dung cua bien tro p= %x",p);
printf("\n dia chi cu bien tro p= %x",&p);
getch();
56
}
Viết chương trình nhập vào từ bàn phím n số nguyên, cấp phát một vùng
nhớ động để lưu trữ n số nguyên đó, hiện các số vừa nhập, tính tổng, trung
bình cộng, max, min của dãy số đó.
#include
#include
#include
void main()
{
clrscr();
int *a,n ,i;
printf("\n nhap so luong phan tu n= ");
scanf("%d",&n);
// cap phat bo nho
a=(int*)malloc(n*sizeof(int));
//nhap du lieu
for(i=0;i<n;i++)
{
printf("\n Nhap so thu %d ",i+1);
scanf("%d",a+i);
}
// hien du lieu
printf("\n day so vua nhap la: ");
for(i=0; i<n; i++)
{
printf(" %d",*(a+i));
}
//tinh tong
int tong=0;
for(i=0; i<n; i++)
{
tong=tong+ *(a+i);
}
printf("\n tong cua day so do la: %d",tong);
//tinh tb cong
57
printf("\n Trung binh cong cua day do la: %f",tong/(n*1.0));
// tim max
int max= *a;
for(i=0; i<n; i++)
{
if(max< *(a+i))
max= *(a+i);
}
printf("\n so lon nhat la: %d",max);
//tim min
int min = *a;
for(i=0; i<n; i++)
{
if(min >*(a+i))
min = *(a+i);
}
printf("\n so nho nhat la: %d", min);
getch();
}
Các file đính kèm theo tài liệu này:
- de_cuong_ngon_ngu_c_827.pdf