BỘ CÔNG NGHIỆP
TRƯỜNG CAO ĐẲNG CÔNG NGHIỆP HÀ NỘI
--- ---
ĐỀ CƯƠNG CHI TIẾT
MƠN HỌC
KỸ THUẬT LẬP TRÌNH
(Tài liệu giảng dạy)
Biên soạn: ThS. Nguyễn Mạnh Cường
(lưu hành nội bộ)
HÀ NỘI – 8/2004
ĐỀ CƯƠNG CHI TIẾT
MƠN HỌC: KỸ THUẬT LẬP TRÌNH
Đề cơng chi tiết
Kỹ thuật lập trình
Ti liu tham kho
1. Ngơn ngữ lập trình C++ - GS. TS. Phạm Văn Ất.
2. C++ và lập trình Hướng đối tượng - GS. TS. Phạm Văn Ất.
3. Kỹ thuật lập trình - Nguyễn Tiến Huy – Trần Hạnh Nhi.
4. Ngơn ngữ lập trình C++ - Ngơ Trung Việt.
….
CHƯƠNG I. GIỚI THIỆU VỀ NGƠN NGỮ LẬP TRÌNH C++
1. Mơi trường lập trình C++
Ngơn ngữ lập trình C++ là một sự mở rộng của ngơn ngữ lập trình C,
trong đó, chủ yếu đưa thêm vào ngơn ngữ C khả năng lập trình hướng đối
tượng và loại bỏ những phức tạp không cần thiết của ngôn ngữ .
Để vào mơi trường soạn thảo chương trình của C++ ta thực hiện:
+ Cài đặt chương trình soạn thảo mã lệnh C++ vào máy tính.
+ Vào thư mục TC30\ BIN, chọn TC.Exe.
Khi đó, mơi trường soạn thảo C++ đã sẵn sàng.
- Các thao tác khi soạn thảo chương trình:
[1]. Mở một file mới: Chọn File\ New hoặc bấm phấm F3 sau đó gõ tên file
vào.
[2]. Lưu file: Chọn File\ Save hoặc bấm phím F2. Nếu file chưa được đặt tên
bởi người lập trình hãy đặt tên.
[3]. Mở một file có sẵn: Chọn File\ Open hoặc bấm phím F3. Chọn file cần mở
và bấm Enter.
[4]. Soạn thảo chương trình: Chương trình được soạn thảo trong cửa sổ soạn
thảo. Nói chung, khi soạn thảo thường thực hiện những thao tác sau:
- Di chuyển con trỏ: dùng các phím mũi tên, phím Page Up, Page Down.
phím Home đưa con trỏ về đầu dịng, phím End đưa con trỏ về cuối dịng.
- Sao chép:
Giữ Shift và phím mũi tên để bơi đen đoạn cần sao chép.
Đưa con trỏ tới nơi đặt đoạn sao chép và bấm tổ hợp phím Ctrl + K + C
dỏn.
Biên soạn: Nguyễn Mạnh Cờng
Trang
2
Đề cơng chi tiết
Kỹ thuật lập trình
- Di chuyn khi: Nếu bấm tổ hợp phím Ctrl + K + V sẽ cho phép di chuyển
đoạn mã được bôi đen.
- Bỏ bôi đen khối: Đưa con trỏ lên trên đoạn bôi đen và bấm tổ hợp phím Ctrl
+ K + K để bỏ bôi đen
Chú ý: Khác với ngôn ngữ Pascal, ngơn ngữ C++ có phân biệt chữ hoa
và chữ thường.
Để ghi các dịng chú thích, sử dụng dấu // tại đầu dịng hoặc đặt đoạn
chú thích như sau: /* đoạn chú thích */
[5]. Dịch chương trình: Bấm phím F9 để dịch chương trình. Nếu chương trình
có lỗi, chương trình dịch sẽ báo lỗi. Chương trình chỉ thực thi được nếu khơng
có lỗi.
[6]. Thực thi chương trình: Bấm tổ hợp phím Ctrl + F9 để thực thi chương
trình.
[7]. Đặt đường dẫn tới các thư viện: Trong một chương trình viết bằng ngôn
ngữ C++ thường sử dụng các hàm trong các thư viện khác nhau. Thông thường,
các thư viện đặt trong các thư mục TC\INCLUDE hoặc TC\ LIB. Mơi trường
lập trình C++ tự thiết đặt đường dẫn tới các thư viện này. Tuy nhiên, trong
trường hợp đường dẫn bị thay đổi, ta cần phải thiết đặt lại.
B1: Trong Menu chính, chọn Option\ Directories.
B2: Trong Include, đặt đường dẫn tới các thư viện có đi .h. Trong
Libraries, đặt đường dẫn tới các thư viện đuôi .lib.
2. Các kiểu dữ liệu cơ bản trong C++
Trong C++ có sử dụng một số kiểu dữ liệu cơ bản sau:
a. Kiểu số: bao gồm
+ Số nguyên ngắn int: là kiểu dữ liệu có độ dài 2 byte, dùng để khai báo
các biến nguyên có giá trị trong khoảng –32768 -> 32767
+ Số nguyên ngắn không dấu: unsign int: độ dài 2 byte, khai báo các biến
nguyên có giá trị từ 0 tới 65535.
+ Số nguyên dài long: là kiểu dữ liệu có độ dài 4 byte, dùng khai báo các
biến nguyên có giá trị trong khoảng – 2.147.483.648 -> 2.147.483.647.
Biên soạn: Nguyễn Mạnh Cờng
Trang
3
Đề cơng chi tiết
Kỹ thuật lập trình
+ S nguyờn di không dấu: unsign long: độ dài 4 byte, khai báo các biến
có giá trị từ 0 tới 4.294.967.295.
+ Số thực (dấu phảy động) float: kích thước 4 byte khai báo các biến thực
từ 3.4*10-38 -> 3.4*1038.
+ Số thực double: kích thước 8 byte, có phạm vi từ 1.7*10-308 - > 1.7*10308
+ Số thực (dấu phảy động, độ chính xác kép) dài: long double: kích thước
10 byte, khai báo các biến từ 3.4 * 10-4932 tới 1.1 * 104932.
b. Kiểu ký tự: bao gồm
+ Kiểu ký tự char: khai báo biến chứa một ký tự.
+ Kiểu con trỏ ký tự char *: tương đương với chuỗi ký tự.
3. Biến và cách khai báo biến
Để khai báo biến trong C++ ta dùng cú pháp sau:
<kiểu dữ liệu> <tên biến> <;>
Trong đó:
- <Kiểu dữ liệu>: có thể là một trong các kiểu dữ liệu chuẩn, có thể là các
kiểu tự định nghĩa.
- <Tên biến>: được đặt tuân theo quy tắc đặt tên biến trong ngơn ngữ lập
trình Pascal.
- Các biến cách nhau bởi dấu phảy, các khai báo cách nhau bởi dấu chấm
phảy.
VD:
int a, b, c;
long so;
char * s;
Chú ý: có thể khai báo biến tại bất kỳ đâu trong chương trình và trước
khi sử dụng.
4. Cấu trúc một chương trình đơn giản
Một chương trình đơn giản trong C++ thường có cấu trúc như sau:
//Khai báo các thư viện sử dụng trong chương trỡnh.
#include <Tờn th vin>
.
main() //tờn hm chớnh
{
Biên soạn: Nguyễn Mạnh Cêng
Trang
4
Đề cơng chi tiết
Kỹ thuật lập trình
// Nhp d liu
// Tính tốn
// In các kết quả
}
VD1. xét đoạn trình sau:
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
main()
{
clrscr();
int a, b; //khai báo hai biến nguyên a, b
cout<<”nhập số nguyên a “;
cin>>a;
cout<<“nhập số nguyên b”;
cin>>b;
int c;
c = a+b;
cout<<”Tổng của a + b là “<
getch();
return 0;
}
Trong ví dụ trên, ta có:
- Các câu lệnh #include <tên thư viện.h>: khai báo một số thư viện sẽ sử
dụng. Các thư viện này có chứa sẵn các hàm sẽ sử dụng trong chương trình.
Chẳng hạn thư viện iostream.h chứa các hàm cout, cin…
- Từ khóa main() để bắt đầu thân chương trình chính.
- Các ký tự {, } để bắt đầu và kết thúc một khối lệnh trong chương trình. Các
ký tự này tương tự các từ khóa này Begin và End trong Pascal.
- clrscr(); là một lời gọi hàm xóa màn hình. Hàm nãy đã có sẵn trong thư viện
stdio.h. Cần lưu ý cách gọi hàm không đối, khác với Pascal.
- Các lệnh cout, cin có sẵn trong thư viện iostream.h cho phép in lên màn
hình câu thơng báo và nhận giá trị nhập vào từ bàn phím cho hai biến a, b.
chúng tương tự như lệnh Write và Read trong Pascal.
- Lệnh getch() có trong thư viện conio.h cho phép dừng màn hình lại để xem
kết quả. Màn hình sẽ dừng cho tới khi một phím bất kỳ được bấm.
- Lệnh return 0; dùng để chỉ ra kết qu tr v ca hm.
Biên soạn: Nguyễn Mạnh Cờng
Trang
5
Đề cơng chi tiết
Kỹ thuật lập trình
VD2. Vit chng trỡnh nhập vào hai số nguyên a, b sau đó in ra màn
hình tổng, hiệu, tích, thương của hai số ngun đó.
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
main()
{
clrscr();
int a, b; //khai báo hai biến nguyên a, b
cout<<”nhập số nguyên a “;
cin>>a;
cout<<“nhập số nguyên b”;
cin>>b;
int T, H, TI, TH;
T = a+b;
H = a-b;
TI = a*b;
TH= a/b;
cout<<”Tổng của a + b là “<
cout<<”Hiệu của a + b là “<
cout<<”Tích của a + b là “<
cout<<”Thương của a + b là “<
| getch();
return 0;
}
Chú ý: Trong C++, thương của hai số nguyên là một số nguyên.
5. Các lệnh nhập xuất
a. Các lệnh nhập xuất trong IOStream.h
- Lệnh xuất: Cú pháp
cout<< <Nội dung cần xuất>;
Trong đó:
<<: được gọi là tốn tử xuất.
<Nội dung cần xuất>: có thể là Hằng ký tự, Hằng xâu ký tự, Biến, Hàm,
phương thức định dạng.
VD: cout<<”Sin(x) = “;
cout<
Chú ý: - có thể sử dụng liên tiếp nhiều tốn tử xuất trên một dịng cout.
Biªn so¹n: Ngun M¹nh Cêng
Trang
6
Đề cơng chi tiết
Kỹ thuật lập trình
VD: cout<
Các lệnh cout, cin chỉ thích hợp cho việc nhập xuất các biến kiểu số. Với
các biến kiểu xâu ký tự thì xâu nhập, xuất phải khơng chứa dấu cách.
• Định dạng dữ liệu trước khi xuất:
Ta có thể sử dụng một trong 2 cách sau:
Cách 1: sử dụng toán tử định dạng
cout.width(int n): chỉ định số vị trí tối thiểu dành cho giá trị xuất là n vị
trí.
+ Nếu giá trị xuất chiếm ít hơn n vị trí thì mặc định là các ký tự trống sẽ
chèn vào phía trước.
+ Nếu giá trị xuất chiếm nhiều hơn n vị trí, số vị trí dành cho giá trị xuất
đó sẽ được tăng lên sao vừa đủ thể hiện giá trị xuất.
cout.fill(char ch): Chỉ định ký tự ch sẽ được điền vào những vị trí trống
(nếu có).
cout.precision(int n): chỉ định độ chính xác của giá trị số khi xuất là n ký
tự sau dấu phảy.
VD:
float a = 123.4523.
nếu muốn xuất a ra màn hình dưới dạng: |000123.45| ta có thể định dạng
như sau:
cout.width(9);
cout.fill(‘0’);
cout.precision(2);
cout<
Cách 2: sử dụng các hàm định dạng:
Tương tự như các phương thức định dạng, các hàm định dạng tương ứng là:
setw(int n) – tương tự như cout.width(int n).
setfill(char ch) – tương tự như cout.fill(char ch).
setprecision(int n) – tương tự như cout.precision(int n).
Cách dùng: sử dụng các hàm định dạng ngay trên các dòng cout, trước
khi đưa ra giá trị xuất.
VD: Với ví dụ trên, ta có th vit:
Biên soạn: Nguyễn Mạnh Cờng
Trang
7
Đề cơng chi tiết
Kỹ thuật lập trình
cout<
- Lnh nhp: Cỳ pháp
cin >> <Biến>;
Trong đó:
>>: được gọi là tốn tử nhập.
Dịng cin dùng để nhập các giá trị (thông thường là) từ bàn phím vào các
biến.
VD: cout<<”Nhập giá trị của a”;
cin>>a;
Chú ý: có thể dùng liên tiếp nhiều tốn tử nhập trên một dòng cin để
nhập giá trị cho nhiều biến.
cin>>a>>b>>c;
Bài tập ví dụ: Viết chương trình nhập vào một số thực x, in ra màn hình
giá trị của F(x) = sin2(x) + cos(x) với độ chính xác 2 chữ số sau dấu phảy.
#include <conio.h>
#include <math.h>
#include <iostream.h>
void main()
{
clrscr();
float x, F;
cout<<”nhập số thực a “;
cin>>x
cout.precision(2);
cout<<”Giá trị F(“<
getch();
}
b. Các lệnh nhập xuất trong Stdio.h
Lệnh xuất: printf.
Cú pháp: printf(“ chuỗi cần xuất “, <Biến 1>, <Biến 2>…);
Trong đó: “ Chuỗi cần xuất” có thể là:
- Hằng ký tự, hằng xâu ký tự: Là các ký tự cần in lên màn hình.
- Các đặc tả hay ký tự đại diện, bao gồm:
%d: đại diện cho biến nguyên.
%f: đại diện cho biến thc.
Biên soạn: Nguyễn Mạnh Cờng
Trang
8
Đề cơng chi tiết
Kỹ thuật lập trình
%c: i din cho biến kiểu ký tự (mặc định).
…
- Mỗi biến cần đưa ra màn hình cần có một đặc tả tương ứng tại vị trí muốn
đưa ra.
VD: Cần đưa ra các giá trị của các biến a, b, c kiểu nguyên, ta viết:
printf (“ Giá trị của a b c la %d %d %d, a, b, c);
Lệnh nhập: scanf.
Cú pháp: scanf(“chuỗi các đặc tả”, <&Biến 1>, <&biến 2>…);
Trong đó, mỗi biến cần phải có một đặc tả tương ứng. Lệnh scanf nhập
giá trị vào các biến thông qua địa chỉ của biến.
c. Các lệnh nhập xuất trong Conio.h
Lệnh xuất: puts.
Cú pháp:
puts(p);
Trong đó p là một con trỏ, trỏ tới một ký tự hoặc hằng xâu ký tự. Nếu p
là biến chứa 1 ký tự thì p phải có kiểu char *, nếu p là kiểu char thì phải là một
mảng kiểu char.
Lệnh puts sẽ đưa các ký tự được con trỏ p trỏ tới lên màn hình.
VD:
char * p = “a”;
puts(p);// đưa ký tự a ra màn hình
char q[100] = “Ha Noi”;
puts(q);// đưa Ha Noi ra màn hình.
Lệnh nhập: gets().
Cú pháp:
gets(p);
Trong đó, p là biến con trỏ ký tự, như vậy, p phải có kiểu char * . Nếu p
là biến kiểu char thì phải là một biến mảng kiểu char. (char * p hoặc char p[])
Các lệnh gets, puts thích hợp cho việc nhập xuất các biến kiểu xâu ký tự.
6. Biểu thức trong C++
Một biểu thức thông thường được cấu thành từ hai thành phần: các toán
tử và các toán hạng.
a. Các tốn tử: được tạm chia làm 3 loại
Biªn so¹n: Ngun M¹nh Cêng
Trang
9
Đề cơng chi tiết
Kỹ thuật lập trình
Cỏc toỏn t s học
Trong C++ sử dụng các toán tử số học cho trong bảng sau:
Stt
1
2
3
4
5
6
7
8
Tốn tử
Ngơn ngữ Pascal
Cộng
+
Trừ
Nhân
*
Chia
/
Đồng dư
mod
Tăng 1 đơn vị
+1
Giảm 1 đơn vị
-1
Gán
:=
Ngôn ngữ C++
+
*
/
%
++
-=
VD:
int a, b;
int T, H, TI, TH, D;
a=8;
b=3;
T = a+b;
H = a-b;
TI = a*b;
TH = a/b;
D = a%b;
a++;
b--;
Các toán tử Logic
Trong C++ sử dụng các toán tử Logic cho trong bảng sau:
Stt
Tốn tử
Ngơn ngữ Pascal Ngơn ngữ C++
1
Và
And
&&
2
Hoặc
Or
||
3
Phủ định
Not
!
Các toán tử so sánh
Trong C++ sử dụng các tốn tử So sánh cho trong bảng sau:
Stt
Tốn tử
Pascal
Ngơn ngữ C++
1
Lớn hơn
>
>
2
Nhỏ hơn
<
<
3
Lớn hơn hoặc bằng
>=
>=
4
Nhỏ hơn hoặc bằng
<=
<=
5
Bằng
=
==
6
Không bng
<>
!=
Biên soạn: Nguyễn Mạnh Cờng
Trang
1
0
Đề cơng chi tiết
Kỹ thuật lập trình
b. Cỏc toỏn hng: có thể là hằng, biến hoặc hàm.
VD: Trong biểu thức 3*X+2+sin(x), các toán tử + và * được sử dụng.
Toán hạng bao gồm: Hằng (3 và 2), biến (X) và hàm (sin(x)).
c. Thứ tự ưu tiên các phép toán
Trong một biểu thức có sử dụng nhiều tốn tử, thứ tự ưu tiên các toán tử
như sau (theo chiều từ trái qua phải, từ trên xuống dưới):
!
++
--
*
/
%
+
-
<
<=
>
>=
==
!=
&&
||
VD: Viết biểu thức toán học sau bằng ngôn ngữ C++ (nếu cần) và cho
biết thứ tự thực hiện các phép toán.
5x 6 +2/7 + (6 mod 3)
i + j ++
(i+j)++
Biên soạn: Nguyễn Mạnh Cờng
Trang
1
1
Đề cơng chi tiết
Kỹ thuật lập trình
CHNG II. CC CU TRÚC ĐIỀU KHIỂN TRONG C++
1. Giới thiệu chung
Một phần rất quan trọng trong một ngơn ngữ lập trình là các cấu trúc
điều khiển.
Trong Pascal ta đã làm quen với 3 loại cấu trúc điều khiển: Chọn, Rẽ
nhánh, Lặp. Ta sẽ lần lượt xem xét các loại cấu trúc điều khiển đó trong ngơn
ngữ C++. Ta tạm thời chia các cấu trúc điều khiển trong C++ theo cây thứ bậc
sau:
Cấu trúc điều khiển
Cấu trúc
chọn
Cấu trúc
rẽ nhánh
Cấu trúc
lặp
Cấu trúc
lặp với số
lần lặp xác
định
Cấu trúc lặp
với số lần
lặp không
xác định
Cấu trúc lặp
kiểm tra
điều kiện
trước
Cấu trúc lặp
kiểm tra
điều kiện
sau
2. Cấu trúc rẽ nhánh
Trong thực tế, khi giải quyết một công việc thường ta phải lựa chọn
nhiều phương án giải quyết khác nhau. Người ta thường biểu diễn vấn đề này
bằng mệnh đề:
- [1]. Nếu … thì …;
- [2]. Nếu … thì … ngược lại thì…
Để mơ phỏng hai mệnh đề đó, trong ngơn ngữ lập trình C++ đưa ra cấu
trúc rẽ nhánh.
Cấu trúc rẽ nhánh có hai dạng như trong sơ đồ khối dưới õy.
Biên soạn: Nguyễn Mạnh Cờng
Trang
1
2
Đề cơng chi tiết
Kỹ thuật lập trình
BTK ỳng?
BTK
ỳng?
N
Thc hin lnh
Thc hiện
Y
lệnh1
Thực hiện lệnh
N 2
Y
a). Mô tả mệnh đề [1]
b) Mô tả mệnh để [2]
Cú pháp:
(mô phỏng mệnh đề 1)
if (<biểu thức điều kiện>)
<Lệnh>;
(Mô phỏng mệnh đề 2)
if (<biểu thức điều kiện>)
<Lệnh 1>;
else
<Lệnh 2>;
Ý nghĩa:
[1]. nếu <biểu thức điều kiện> nhận giá trị đúng, sẽ thực hiện <Lệnh>,
ngược lại, bỏ qua lệnh if.
[2]. nếu <biểu thức điều kiện> nhận giá trị đúng, sẽ thực hiện <Lệnh 1>,
ngược lại, nếu <biểu thức điều kiện> nhận giá trị sai sẽ thực hiện <Lệnh 2>.
Chú ý:
- Biểu thức điều kiện được đặt giữa hai dấu ngoặc đơn “(“ “)”.
- Câu lệnh trước else có dấu “;”.
- <Lệnh 1> và <Lệnh 2> có thể là một khối lệnh. Các khối lệnh được
đặt trong hai dấu { }.
Biên soạn: Nguyễn Mạnh Cờng
Trang
1
3
Đề cơng chi tiết
Kỹ thuật lập trình
VD: Lp chng trỡnh nhập vào một số nguyên. Kiểm tra tính chẵn lẻ
của số đó và thơng báo ra màn hình.
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
main()
{
clrscr(); int a;
cout<< “nhập số nguyên a ”;
cin>>a;
if (a%2 = = 0)
cout<<”số “<
else
cout<<”số “<
getch();
}
Các lệnh if có thể lồng nhau theo nghĩa: Các câu lệnh bên trong một
mệnh đề if lại có thể là các mệnh đề if. Các mệnh đề if lồng nhau tương đương
với một mệnh đề if mà biểu thức điều kiện của nó là sự kết hợp biểu các biểu
thức điều kiện của các mệnh để if lồng nhau theo phép và (AND).
Mỗi lệnh if đủ sẽ cho phép lựa chọn 2 khả năng để thực hiện. Trong
trường hợp có n khả năng lựa chọn, ta có thể sử dụng n-1 lệnh if đủ lồng nhau.
VD: Viết chương trình thực hiện việc nhập vào số tiền của khách hàng
phải trả. Nếu số tiền từ 300000 tới 400000, khuyến mại 20%. Nếu số tiền từ
400000 trở lên, khuyến mại 30%. Các trường hợp khác không được khuyến
mại. Tính và in số tiền khuyến mại của khách lên màn hình.
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
main()
{
clrscr();
int T, km;
cout<<”Nhập số tiền “;
cin>>T;
if (T>=300000 && T <=400000)
km = 20*T/100;
else
if (T>40000)
km = 30*T/100;
else
Biên soạn: Nguyễn Mạnh Cờng
Trang
1
4
Đề cơng chi tiết
Kỹ thuật lập trình
km = 0;
cout<
getch();
}
Nếu các khả năng là loại trừ nhau thì khơng khi đó có thể sử dụng các
lệnh if lồng nhau hoặc có thể sử dụng n lệnh if rời nhau cho n khả năng lựa
chọn. Trường hợp ngược lại, thì nhất thiết phải sử dụng các lệnh if rời nhau.
VD: Viết chương trình nhập vào điểm tổng kết và xếp loại đạo đức của
một sinh viên. Sau đó tính số tiền học bổng cho sinh viên đó như sau:
Nếu tổng kết >=7.00 thì được 300000.
Nếu điểm tổng kết >=9.00 và đạo đức = “T” thì được cộng thêm 100000.
Xét đoạn trình sau:
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
main()
{
clrscr();
float tk;
char * hk;
long T;
cout<<”Nhap điểm tong ket”;
cin>>tk;
cout<<”Nhap hanh kiem”;
cin>>hk;
T=0;
if (tk >= 7.0)
T = 30000;
else
if (tk>=9.0 && hk = = “T”)
T += 100000;
cout<<”Học bổng ” <
getch();
}
Đoạn trình trên sẽ cho kết quả sai trong trường hợp sinh viên tổng kết
>=9.0 và đạo đức tốt. Lý do là sử dụng hai lệnh if lồng nhau khi các khả năng
khơng loại trừ nhau.
Đoạn trình trên có th c vit li nh sau:
#include <conio.h>
#include <stdio.h>
Biên soạn: Nguyễn M¹nh Cêng
Trang
1
5
Đề cơng chi tiết
Kỹ thuật lập trình
#include <iostream.h>
main()
{
clrscr();
float tk;
char * hk;
long T;
cout<<”Nhap điểm tong ket”;
cin>>tk;
cout<<”Nhap hanh kiem”;
cin>>hk;
T=0;
if (tk >= 7.0)
T = 30000;
if (tk>=9.0 && hk = = “T”)
T += 100000;
cout<<”Học bổng ” <
getch();
}
3. Cấu trúc chọn
Trong trường hợp có quá nhiều khả năng lựa chọn và các khả năng loại
trừ nhau, nếu sử dụng nhiều lệnh if lồng nhau sẽ làm cho chương trình phức
tạp, khó kiểm sốt. Vì vậy C++ cung cấp một cấu trúc điều khiển khác sử dụng
trong trường hợp này, đó là cấu trúc chọn.
Cú pháp:
switch (<Biến nguyên>)
{
case <GT 1><:>
Lệnh 1;
break;
case <GT 2><:>
Lệnh 2;
break;
…
case <GT n><:>
Lệnh n;
break;
[default:
<Lnh mc nh>;]
}
Biên soạn: Nguyễn Mạnh Cờng
Trang
1
6
Đề cơng chi tiết
Kỹ thuật lập trình
í ngha:
Nu <Bin nguyờn> nhận giá trị GT1, thực hiện <Lệnh 1>
Nếu <Biến nguyên> nhận giá trị GT2, thực hiện <Lệnh 2>…
Nếu <Biến nguyên> nhận giá trị GTn, thực hiện <Lệnh n>
Nếu có thành phần [default:], thực hiện <lệnh mặc định> khi biến
nguyên không nhận giá trị nào trong các giá trị trên.
-
Sơ đồ khối:
Biến =
GT1
Lệnh 1
Biến =
GT2
Lệnh 2
…
Biến =
GTn
Lệnh n
Lệnh mặc định
Chú ý:
- Lệnh switch chỉ thực hiện trên biến nguyên.
- Mỗi từ khoá case chỉ lựa chọn 1 trường hợp.
- Các câu lệnh <Lệnh 1>, <Lệnh 2>… có thể là một khối lệnh. Sau đó
bắt buộc phải có từ khóa
.
- Thành phần [deffault:] là khơng bắt buộc. Nếu có thành phần này,
<Lệnh mặc định> sẽ được được thực hiện sau khi tất cả các trường
hợp case đều khơng thỏa mãn.
Biªn so¹n: Ngun M¹nh Cêng
Trang
1
7
Đề cơng chi tiết
Kỹ thuật lập trình
VD1: Vit chng trỡnh nhập vào một tháng của một năm nào đó. In số
ngày của tháng đó ra màn hình.
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
main()
{
clrscr();
int T, N;
cout<<”Nhập tháng”;
cin>>T;
cout<<”Nhập năm “;
cin>>N;
switch (T)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
cout<<”Tháng có 31 ngày”;
break;
case 4:
case 6:
case 9:
case 11:
cout<<”Tháng có 30 ngày”;
break;
case 2:
if (N%4 = = 0)
cout<<”Tháng có 28 ngày”;
else
cout<<”Tháng có 29 ngày”;
break;
}
getch();
}
VD2: Viết chương trình nhập vào mã học vị (là một số nguyên) của một
nhân viên. In ra học vị tương ứng với quy định:
Mã =1: Cử nhõn.
Mó =2: K s.
Biên soạn: Nguyễn Mạnh Cờng
Trang
1
8
Đề cơng chi tiết
Kỹ thuật lập trình
Mó =3: Thc s.
Mó =4: Tiến sỹ.
Các mã khác: Không xếp loại học vị.
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
main()
{
clrscr();
int M;
cout<<”Nhập mã học vị”;
cin>>M;
switch (M)
{
case 1:
cout<<”Cử nhân”;
break;
case 2:
cout<<”Kỹ sư”;
break;
case 3:
cout<<”Thạc sỹ”;
break;
case 4:
cout<<”Tiến sỹ”;
break;
default:
cout<<”Không xếp loại học vị”;
}
getch();
}
Chuyển đổi giữa cấu trúc chọn và rẽ nhánh:
Với cấu trúc rẽ nhánh, các biến trong biểu thức điều kiện có thể có kiểu
bất kỳ. Ngược lại, với cấu trúc chọn, chỉ lựa chọn các trường hợp của biến
nguyên. Do vậy, việc chuyển đổi từ cấu trúc chọn sang cấu trúc rẽ nhánh bao
giờ cũng thực hiện được, điều ngược lại không đúng.
Để chuyển đổi một cấu trúc rẽ nhánh mà biểu thức điều kiện có các biến
khơng phải kiểu ngun sang cấu trúc chọn cần sử dụng thêm một biến ngun
để mã hố các trường hợp của nó, sau đó ta ỏp dng cu trỳc chn trờn bin
nguyờn ny.
Biên soạn: Ngun M¹nh Cêng
Trang
1
9
Đề cơng chi tiết
Kỹ thuật lập trình
4. Cu trỳc lp
a. Vòng lặp với số lần lặp xác định
Là vòng lặp mà người lập trình ln biết trước số lần lặp của lệnh lặp.
Trong quá trình lặp, ta thường sử dụng một biến để kiểm soát số lần lặp
gọi là “Biến chạy”.
Biến chạy thường nhận các giá trị từ cận dưới (n1) tới cận trên (n2) và số
lần lặp bằng n2 – n1.
Cú pháp:
for (<Biểu thức 1>;<Biểu thức 2>;<Biểu thức 3>)
<Lệnh lặp>;
Trong đó:
<Biểu thức 1>: thơng thường có có dạng: <Biến chạy> = <Cận dưới>.
<Biểu thức 2>: thơng thường có dạng: <Biến chạy> <Tốn tử so sánh>
<cận trên>.
<Biểu thức 3>: thơng thường là một biểu thức để tang hoặc giảm biến
chạy.
Trong C++, vịng lặp có số lần lặp xác định cũng có nguyên lý hoạt động
tương tự trong Pascal.
Ý nghĩa:
B1: Thực hiện <Biểu thức 1>
B2: Kiểm tra <Biểu thức 2>. Nếu sai, thốt khỏi vịng for. Ngược
lại, sang B3.
B3: Thực hiện <Lệnh lặp>.
B4: Thực hiện <Biểu thức 3>. Quay lại B2.
Sơ đồ khối:
Xác định BT1
Kiểm tra BT2
Thực hiện lệnh
thân vòng for
Kiểm tra BT3
Biên soạn: Nguyễn Mạnh Cờng
Trang
2
0
Đề cơng chi tiết
Kỹ thuật lập trình
Chỳ ý:
- Cỏc biu thức đặt cách nhau bởi dấy “;”.
- <Lệnh lặp> có thể là một khối lệnh.
- Các biểu thức có thể khuyết nhưng các dấu “;” phải được giữ nguyên.
VD1: Viết chương trình tính n! (n ngun)
Cách 1: Cách thơng thường
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
void main()
{
clrscr();
int n; long GT=1;
cout<<”Nhap n “; cin>>n;
for (int i=2;i<=n; i++)
GT*=i;
cout<getch();
}
Cách 2: Viết thiếu <biểu thức 3>
void main()
{
clrscr();
int n; long GT=1;
cout<<”Nhap n “; cin>>n;
for (int i=2;i<=n; )
{
GT*=i;
i++;
}
cout<getch();
}
Các cách thoát khỏi vũng lp for.
Biên soạn: Nguyễn Mạnh Cờng
Trang
2
1
Đề cơng chi tiết
Kỹ thuật lập trình
-
Thoỏt t nhiờn: Khi <Biểu thức 2> nhận giá trị sai, chương trình tự động
thốt khỏi vịng for và chuyển tới lệnh tiếp theo.
-
Thốt cưỡng bức:
+ Cách 1: sử dụng lệnh break;
Khi gặp lệnh break; trong thân vịng for, chương trình sẽ lập tức thốt
khỏi vịng lặp for và chuyển tới lệnh tiếp theo bất kể <Biểu thức 2> vẫn nhận
giá trị đúng.
+ Cách 2: sử dụng lệnh goto
Lệnh goto có dạng: goto <Nhãn>. Trong đó,<Nhãn> có dạng:
<Tên nhãn> <:>
<Tên nhãn> tuỳ ý đặt theo quy ước đặt tên trong C.
Khi gặp lệnh goto <Nhãn>, chương trình sẽ nhảy tới vị trí đặt nhãn. Nếu
nhãn đặt ngồi vịng for, chương trình sẽ thốt khỏi vòng for.
Cần chú ý trong trường hợp 2 lệnh for lồng nhau, khi đó lệnh break chỉ
làm cho chương trình thốt khỏi vịng for gần nhất chứa lệnh break. Do vậy, để
thốt khỏi cả 2 vịng for lồng nhau, ta sử dụng lệnh goto.
VD2: xét ví dụ 1 trong trường hợp thiếu biểu thức 1 và/ hoặc biểu thức 2.
Cách 3: Viết thiếu <Biểu thức 2> và <Biểu thức 3> sử dụng break.
void main()
{
clrscr();
int n; long GT=1;
cout<<”Nhap n “; cin>>n;
for (int i=2;;)
{
if (i==n)
break;
GT*=i;
i++;
}
cout<getch();
}
Cách 4: Viết thiếu <Biểu thức 2> và <Biểu thức 3> sử dụng goto.
void main()
Biên soạn: Nguyễn Mạnh Cờng
Trang
2
2
Đề cơng chi tiết
Kỹ thuật lập trình
{
clrscr();
int n; long GT=1;
cout<<Nhap n “; cin>>n;
for (int i=2;;)
{
if (i==n)
goto Ex; // nhãn là Ex, tên tự đặt.
GT*=i;
i++;
}
Ex:
cout<getch();
}
Cách 5: Viết thiếu cả 3 biểu thức.
void main()
{
clrscr();
int n; long GT=1;
cout<<”Nhap n “; cin>>n;
int i=2;
for (;;)
{
if (i==n)
break;
GT*=i;
i++;
}
cout<getch();
}
Vì độ phức tạp của chương trình tỷ lệ thuận với số lệnh goto sử dụng
trong chương trình, vì vậy nên hạn chế sử dụng goto.
VD2: Cho dãy số nguyên x[] = { 1, 4, 5, 7, 3, 2}. Viết chương trình đảo
ngược dãy số trên và in kết quả lên màn hình.
Để giải quyết bài tốn trên, có thể có nhiều cách. Cách giải sau minh hoạ
cách viết khác của các biểu thức trong cú pháp vịng for.
#include "conio.h"
#include "iostream.h"
#include "stdio.h"
Biªn so¹n: Ngun M¹nh Cêng
Trang
2
3
Đề cơng chi tiết
Kỹ thuật lập trình
void main()
{
clrscr();
int x[] = {1, 4, 5, 7, 3, 2}, n;
n=sizeof(x)/ sizeof(int);
for (int i=0, j=n-1; i{
int tg = x[i];
x[i]=x[j];
x[j]=tg;
}
for (i=0; icout<getch();
}
Nhận xét: Các biểu thức 1, 2, 3 trong cú pháp của vịng for có thể bao
gồm một dãy các biểu thức con, cách nhay bởi dấu phảy. Khi đó, sự đúng/ sai
của biểu thức “mẹ” là sự đúng/ sai của biểu thức con đầu tiên trong dãy. Như
vậy vịng for trên có thể viết như sau:
void main()
{
clrscr();
int x[] = {1, 4, 5, 7, 3, 2}, n;
n=sizeof(x)/ sizeof(int);
int tg;
for (int i=0, j=n-1; i{
}
for (i=0; icout<getch();
}
b. Vòng lặp với số lần lặp khơng xác định
Trong C++, ta chia vịng lặp với số lần lặp không xác định ra làm hai
loại:
Lặp kiểm tra điều kiện trước: Trước tiên, kiểm tra biểu thức điều kiện.
Nếu biểu thức điều kiện còn đúng, sẽ thực hiện lệnh lặp. Nếu biểu thức điều
kiện sai, ra khỏi vòng lp.
+ S khi:
BTK
Biên soạn: Nguyễn Mạnh Cờng
ỳng?
Y
N
Thc hin lnh
Trang
lp
2
4
Đề cơng chi tiết
Kỹ thuật lập trình
Nh vy: Lnh lp có thể khơng được thực hiện lần nào.
+ Cú pháp:
while (<Biểu thức điều kiện>)
<Lệnh lặp>
Ý nghĩa:
B1: Kiểm tra biểu thức điều kiện. Nếu biểu thức điều kiện sai, thoát ra
khỏi vòng lặp. Nếu biểu thức điều kiện đúng, chuyển qua bước 2.
B2: Thực hiện <Lệnh lặp>. Quay lại B1.
Chú ý:
- Biểu thức điều kiện phải đặt trong dấu “(“ “)”.
- <Lệnh lặp> có thể là một khối lệnh.
- Cần tránh các trường hợp lặp vơ hạn.
VD1: Viết chương trình tìm số lũy thừa 2 đầu tiên lớn hơn 1000.
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
main()
{
clrscr();
int So=2;
while (So <=1000)
So *=2;
cout<<”Số cần tìm là ”<getch();
}
VD2: Viết chương trình nhập vào điểm đạo đức của một học sinh (thang
điểm 100, nguyên) và số ngày đi học muộn của học sinh đó. Nếu học sinh đi
học muộn 1 ngày, trừ 1 điểm. Tính và in số điểm cũn li ca hc sinh.
#include <conio.h>
#include <stdio.h>
Biên soạn: Nguyễn Mạnh Cêng
Trang
2
5