Ngôn ngữ lập trình C++
Trang 1Trờng cao đẳng công nghiệp hà nội
-đề cơng chi tiếtmô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
(lu 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 Tài liệu tham khảo
Trang 2Chơ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.ã 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++ đã lệnh C++ vào máy tính 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] Lu file: Chọn File\ Save hoặc bấm phím F2 Nếu file cha đợc đặt tên
bởi ngời lập trình hã lệnh C++ vào máy tính.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:
Down phím Home đa con trỏ về đầu dòng, phím End đa con trỏ vềcuối dòng
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
chuyển đoạn mã lệnh C++ vào máy tính đợc bôi đen
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ếukhông có lỗi
Trang 3[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ó đuô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áocá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
+ Số nguyên dài 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íchthớ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 đó:
Trang 4- <Kiểu dữ liệu>: có thể là một trong các kiểu dữ liệu chuẩn, có thể
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.
- 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.
Trang 5- 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 trongPascal
- clrscr(); là một lời gọi hàm xóa màn hình Hàm nã lệnh C++ vào máy tính.y đã lệnh C++ vào máy tính có sẵn trong
th viện stdio.h Cần lu ý 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 haibiế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ỳ đợcbấm
- Lệnh return 0; dùng để chỉ ra kết quả trả về của hàm
VD2 Viết chơng 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ố nguyên đó
Trang 6<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<<Sin(x);
Chú ý: - có thể sử dụng liên tiếp nhiều toán tử xuất trên một dòng
cout
VD: cout<<”Giá trị của a[“<<i<<”] là “<<a[i];
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ấucá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:
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
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).
Trang 7Cá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ể viết:
Chú ý: có thể dùng liên tiếp nhiều toá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ànhình giá trị của F(x) = sin2(x) + cos(x) với độ chính xác 2 chữ số sau dấuphảy
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à:
%d: đại diện cho biến nguyên
%f: đại diện cho biến thực
%c: đại diện cho biến kiểu ký tự (mặc định)
Trang 8muố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 scanfnhậ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 * phoặ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ểuxâu ký tự
Trang 9b Các toán hạng: 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 toán tử, thứ tự u tiên cáctoán tử nh sau (theo chiều từ trái qua phải, từ trên xuống dới):
Trang 10! ++ - - * / % +
-< <= > >= == != && | | 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)++
Trang 11Chơng II Các cấu 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ấutrúc điều khiển
Trong Pascal ta đã lệnh C++ vào máy tính 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:
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ọnnhiề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 racấ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
Cấu trúc điều khiển
Cấu trúc
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
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
Trang 12nế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ựchiệ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 { }
VD: Lập chơng trình nhập vào một số nguyên Kiểm tra tính chẵn
Trang 13Các lệnh if có thể lồng nhau theo nghĩa: Các câu lệnh bên trongmộ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ếthợp biểu các biểu thức điều kiện của các mệnh để if lồng nhau theophé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
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 đó nhsau:
Trang 14Đ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
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 soát Vì vậy C++ cung cấp một cấu trúc điềukhiể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>)
{
Trang 15- Sơ đồ khối:
Chú ý:
Biến = GT1
Biến = GT2
Biến = GTn
Trang 16- 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 <break;>
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ã lệnh C++ vào máy tính.n.
VD1: Viết chơng trình nhập vào một tháng của một năm nào đó In
VD2: Viết chơng trình nhập vào mã lệnh C++ vào máy tính 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ã lệnh C++ vào máy tính =1: Cử nhân
Mã lệnh C++ vào máy tính =2: Kỹ s
Trang 17Mã lệnh C++ vào máy tính =3: Thạc sỹ.
Mã lệnh C++ vào máy tính =4: Tiến sỹ
Các mã lệnh C++ vào máy tính khác: Không xếp loại học vị
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ủabiế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 nguyên sang cấu trúc chọn cần sử dụng thêmmột biến nguyên để mã lệnh C++ vào máy tính hoá các trờng hợp của nó, sau đó ta áp dụngcấu trúc chọn trên biến nguyên này
4 Cấu trúc lặp
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 luôn 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ầnlặp gọi là “Biến chạy”
Trang 18Biến chạy thờng nhận các giá trị từ cận dới (n1) tới cận trên (n2)
<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> <Toán tử sosá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ảmbiế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
Kiểm tra BT3
Trang 19Các cách thoát khỏi vòng lặp for.
- Thoát tự nhiên: Khi <Biểu thức 2> nhận giá trị sai, chơng trình tự
động thoát khỏi vòng for và chuyển tới lệnh tiếp theo
+ 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ứcthoá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ã lệnh C++ vào máy tính.n> Trong đó,<Nhã lệnh C++ vào máy tính.n> có dạng:
<Tên nh n> <:>ã lệnh C++ vào máy tính
<Tên nhã lệnh C++ vào máy tính.n> tuỳ ý đặt theo quy ớc đặt tên trong C
Khi gặp lệnh goto <Nhã lệnh C++ vào máy tính.n>, chơng trình sẽ nhảy tới vị trí đặt nhã lệnh C++ vào máy tính.n.Nếu nhã lệnh C++ vào máy tính.n đặt ngoài vòng for, chơng trình sẽ thoát khỏi vòng for
Cần chú ý trong trờng hợp 2 lệnh for lồng nhau, khi đó lệnh breakchỉ làm cho chơng trình thoát khỏi vòng for gần nhất chứa lệnh break
Do vậy, để thoát khỏi cả 2 vòng for lồng nhau, ta sử dụng lệnh goto
Trang 20VD2: xÐt vÝ dô 1 trong trêng hîp thiÕu biÓu thøc 1 vµ/ hoÆc biÓuthøc 2.
C¸ch 3: ViÕt thiÕu <BiÓu thøc 2> vµ <BiÓu thøc 3> sö dông
Trang 21VD2: Cho dã lệnh C++ vào máy tính.y số nguyên x[] = { 1, 4, 5, 7, 3, 2} Viết chơng trình
đảo ngợc dã lệnh C++ vào máy tính.y số trên và in kết quả lên màn hình
Để giải quyết bài toán trên, có thể có nhiều cách Cách giải sauminh 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"
void main() {
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ã lệnh C++ vào máy tính.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êntrong dã lệnh C++ vào máy tính.y Nh vậy vòng for trên có thể viết nh sau:
void main() {
Trang 22Lặ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ểuthức điều kiện sai, ra khỏi vòng lặp
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.
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ếuhọc sinh đi học muộn 1 ngày, trừ 1 điểm Tính và in số điểm còn lại củahọc sinh
#include <conio.h>
BTĐK
đúng?
Thực hiện lệnh lặpY
N
Trang 23Lặp kiểm tra điều kiện sau: Tơng tự nh vòng lặp kiểm tra điều
kiện trớc, chỉ khác ở chỗ biểu thức điều kiện đợc kiểm tra mỗi khi đã lệnh C++ vào máy tính.thực hiện lệnh lặp Nh vậy, lệnh lặp luôn đợc thực hiện ít nhất một lần
B2: Kiểm tra <Biểu thức điều kiện> Nếu <Biểu thức điều kiện
đúng, quay lại B1 Ngợc lại, thoát khỏi vòng lặp
Chú ý:
- <Lệnh lặp> có thể là một khối lệnh
- <Biểu thức điều kiện> phải đợc đặt trong dấu “(“ “)”;
VD1: Viết chơng trình tìm số nguyên x đầu tiên lớn hơn 5 mà thỏa
mã lệnh C++ vào máy tính.n sin(x) = 1
BTĐK
đúng?
Thực hiện lệnh lặp
YN
Trang 24VD2: Viết chơng trình nhập vào một số nguyên x Kiểm tra xem số
đó đã lệnh C++ vào máy tính lớn hơn 10 hay cha Nếu cha, yêu cầu nhập lại cho tới khi số nhậpvào lớn hơn 10 Kiểm tra xem số đó có phải là số nguyên tố không, inkết luận lên màn hình
Trang 25Để thoát khỏi vòng lặp không xác định, ta cũng có thể sử dụngbreak hoăck goto Tuy nhiên, các trờng hợp này ít xảy ra do đặc thù củavòng lặp.
Chuyển đổi giữa các cấu trúc lặp:
Từ vòng lặp xác định (for), ta có thể chuyển sang vòng lặp khôngxác định (while hoặc do/ while) bằng cách sử dụng thêm một biến đếmkiểu nguyên trong thân vòng lặp không xác định Trớc khi lặp ta khởigán giá trị của biến đếm này bằng 0 Mỗi khi thực hiện một lần lặp, tatăng giá trị của biến đếm này lên 1
Để chuyển đổi ngợc lại (từ cấu trúc lặp không xác định sang cấutrúc lặp xác định) thì nói chung, ta phải sử dụng các vòng for khuyếtbiểu thức 2, dới dạng:
for (<Biểu thức 1> ; ; <biểu thức 3>)
bởi vì ta không biết chắc số lần lặp của cấu trúc Khi đó bắt buộcphải sử dụng lệnh break và goto trong thân vòng for để thoát cỡng bức
5 Các ví dụ minh họa
VD1: Viết chơng trình nhập vào một số nguyên n, sau đó tính tổng
các số nguyên tố thuộc đoạn [1 n] Cho biết có bao nhiêu số nguyên tốthuộc đoạn trên?
Tong +=i;
Dem++;
} }
cout<<”Tổng các số nguyên tố “<<Tong;
cout<<” Có “<<Dem<<số nguyên tố trong đoạn 1 n”;
getch();
}
VD2: Viết chơng trình nhập vào một số nguyên n và một số thực x,
sau đó tính giá trị biểu thức:
Trang 260
chẵn n Nếu 3
x 3
x 3
x
n 2
3 2
cout<<”Giá trị của biểu thức “<<F;
Khi viết một chơng trình, chúng ta có thể triển khai theo hai cách:
Cách 1: Toàn bộ các lệnh của chơng trình đợc viết trong hàm
main Các lệnh đợc viết theo trình tự để giải quyết bài toán đặt ra
Cách 2: Chơng trình đợc tạo thành từ nhiều đơn thể khác nhau.
Các đơn thể thực hiện những nhiệm vụ tơng đối độc lập và đợc “lắpghép” lại thành chơng trình thông qua những lời gọi đơn thể trong hàmmain
u nhợc điểm:
nhỏ Toàn bộ thuật toán đợc thể hiện trong một đoạn mã lệnh C++ vào máy tính từ trênxuống dới Tuy nhiên, cách này không phù hợp với các chơng trìnhlớn do:
+ Kích thớc chơng trình cồng kềnh, khó kiểm soát, chỉnh sửa.
Trang 27+ Các đoạn m có thể lặp đi lặp lại, chã lệnh C++ vào máy tính ơng trình dài không cần thiết.
đợc hai nhợc điểm cơ bản trên Đặc biệt phù hợp với các chơng trình
có kích thớc lớn
Trong C++, ta có hai loại đơn thể sau:
[1] Các lớp đối tợng: Chơng trình bao gồm một số đoạn mã lệnh C++ vào máy tính mô tả
các lớp các đối tợng nào đó sẽ sử dụng trong chơng trình chính Loại
đơn thể này đợc nghiên cứu trong nội dung môn học “Lập trình hớng đốitợng”
[2] Các hàm: Chơng trình đợc cấu tạo từ các hàm Mỗi hàm thực
thi một nhiệm vụ tơng đối độc lập, trong đó có một hàm main đóng vaitrò nh chơng trình chính để sử dụng các hàm khác
Trong phạm vi môn học, ta chỉ xem xét các đơn thể dới dạng cáchàm
2 Các đặc trng của hàm
Một hàm trong C++ có các đặc trng sau:
- Tên hàm: do ngời lập trình tự đặt và có những đặc điểm sau:
+ Tên hàm thờng mang tính đại diện cho công việc mà hàm sẽ
đảm nhiệm
+ Tên hàm không đợc chứa dấu cách và các ký tự đặc biệt (trừdấu gạch dới)
- Kiểu giá trị trả về của hàm: Nếu hàm trả về một giá trị nào đó thì
giá trị đó phải thuộc một kiểu dữ liệu nào đó mà ta gọi là kiểu giá trịtrả về của hàm Kiểu giá trị trả về của hàm có thể là các kiểu dữ liệuchuẩn
- Kiểu và tên các đối của hàm: Nếu hàm sử dụng các đối thì các
đối phải thuộc một kiểu dữ liệu nào đó Khi thiết lập một hàm, ta cầnchỉ ra danh sách các đối của hàm và kiểu dữ liệu của mỗi đối
- Thân hàm: là nội dung chính của hàm, chứa toàn bộ các lệnh của
hàm
3 Phân loại hàm
Trong pascal, ta có hai loại chơng trình con: thủ tục (procedure) vàhàm (function) Trong C++, chúng ta có duy nhất một loại “chơng trìnhcon” (mà ta gọi là đơn thể), đó là hàm
Một chơng trình trong C++ đợc cấu tạo từ các hàm, trong đó hàmmain là hàm bắt buộc phải có, đóng vai trò nh chơng trình chính
Khác với trong Pascal, tất cả các hàm đều trả về một giá trị nào
Trang 28- Hàm không có giá trị trả về: Là hàm chỉ có chức năng thực hiện
một công việc nào đó mà ta không quan tâm tới giá trị trả về củahàm
- Hàm có giá trị trả về: Ngoài việc thực hiện một công việc nào đó,
ta còn quan tâm tới giá trị thu đợc sau khi hàm thực thi để dùng trongnhững đoạn trình tiếp theo
Tùy theo nguồn gốc của hàm ngời ta phân ra:
- Các hàm có sẵn: Là các hàm chứa trong các th viện của C++, đã lệnh C++ vào máy tính.
đợc định nghĩa từ trớc Ngời lập trình chỉ việc sử dụng thông qua cácchỉ thị: #include <Tên th viện chứa hàm>
- Các hàm tự định nghĩa: Là các hàm do ngời lập trình tự định nghĩa.
Các hàm này cũng có thể đợc tập hợp lại trong một file h để dùng
nh một th viện có sẵn
II Định nghĩa và sử dụng hàm
1 Định nghĩa hàm
a Cấu trúc một hàm:
Một hàm thờng có cấu trúc nh sau:
<Kiểu hàm> <Tên hàm> <([kiểu đối] [tên đối])>
- <([kiểu đối] [tên đối])>: liệt kê danh sách các đối của hàm và
kiểu dữ liệu của đối (nếu có)
VD1: hàm tính n! đợc viết nh sau:
long GT(int n) {
long kq=1;
if (n==0 | | n==1) kq=1;
else for (int i=1; i<=n; i++)
kq *=i;
return kq;
}
Chú ý:
Trang 29- Mỗi đối cần đi kèm với kiểu đối, mỗi cặp [kiểu đối] [tên đối] cáchnhau bởi dấu phảy.
- Nếu hàm có giá trị trả về thì cần có câu lệnh <return Biểu_thức>
để gán giá trị của Biểu_Thức cho tên hàm Tuyệt đối không đợc gán
Chơng trình ngoài hàm main còn có các hàm khác thì đợc viếttheo cấu trúc sau:
Thân hàm main;
} Hoặc:
Trang 30void main() {
}
<Kiểu hàm> <Tên Hàm 2> <([kiểu đối] [Danh sách các
đối]>
{ Thân hàm 2;
}
….
VD1: Viết chơng trình kiểm tra một số nguyên n có phải là số
nguyên tố không, nếu n là số nguyên tố, hã lệnh C++ vào máy tính.y tính n!
Trang 31cout<<”Số “<<a<<” là số nguyên tố”;
cout<<” Giai thừa của “<<a<<” là “<<GT(a);
B2: Viết hàm main() trong một tệp riêng Để hàm main() có thể sửdụng các hàm viết trong file th viện đã lệnh C++ vào máy tính tạo trong B1, cần thêm chỉ thị:
#include <[ đờng dẫn] <Tên th viện.h>
Chú ý: nếu đặt th viện trên trong th mục TC\ Include thì trong chỉ
thị #include không cần thêm đờng dẫn Ngợc lại, cần thêm đầy đủ đờngdẫn tới file th viện nói trên
VD: Tạo file h với nội dụng sau, VD file “TV.h”:
Trang 32int a;
cout<<”Nhập a”;
cin>>a;
if (NT(a) == 0) cout<<”Số “<<a<<” Không phải nguyên tố”;
else
{
cout<<”Số “<<a<<” là số nguyên tố”;
cout<<” Giai thừa của “<<a<<” là
“<<GT(a);
} getch();
đầy đủ các tham số cho hàm
kèm tên hàm: <Tên hàm> <()>
Ngợc lại, nếu hàm không có giá trị trả về, tên hàm đợc sử dụng nhmột lệnh
3 Phạm vi của biến
Theo phạm vi hoạt động của biến, ta chia ra:
- Biến toàn cục:
Phạm vi hoạt động trong toàn bộ chơng trình, kể từ vị trí khai báo biến