Chỉ thị tiền xử lý Preprocessor directive Các chỉ thị tiền xử lý là những dòng được đưa vào trong mã của chương trình phía sau dấu #.. Những dòng này không phải là lệnh của chương t
Trang 2Mục tiêu
Giới thiệu các khái niệm cơ bản về ngôn ngữ C
Cấu trúc của một chương trình và cách trình bày chương trình
Lệnh nhập/ xuất trong C/ C++
Giới thiệu công cụ lập trình và các chức năng liên quan
2
Trang 3Lịch sử ra đời
Ngôn ngữ C do Dennis Ritchie xây dựng từ năm 1972 tại phòng thí nghiệm Bell Telephone với mục đích tạo ngôn ngữ để viết HĐH UNIX Song nhờ có các tính năng ưu việt và tính mềm dẻo nên được giới tin học chấp nhận
“The C programming language” do Kernighan và Ritchie viết năm 1978
3
Trang 4Lịch sử ra đời
C++ dựa trên ngôn ngữ lập trình C
C++ được phát minh bởi Bijarne Stroustroup, bắt đầu năm 1979
Các trình biên dịch phổ biến: Borland C++, Microsoft Visual C++
4
Trang 55
Trang 6Khuyết điểm
Cú pháp thuộc loại lạ và khó học Nếu người lập trình đã học qua một ngôn ngữ khác thì sẽ dễ dàng tiếp cận
Một số ký hiệu có nhiều nghĩa khác nhau Ví dụ: dấu “*”
là toán tử nhân, là khai báo con trỏ, là toán tử thay thế,
… Việc sử dụng đúng nghĩa các toán tử phụ thuộc vào ngữ cảnh sử dụng
Việc truy nhập tự do vào dữ liệu, việc trộn lẫn các kiểu
dữ liệu… làm cho chương trình có phần bất ổn
6
Trang 7Ví dụ chương trình C++
7
//Viết bằng VC++2003 //hoặc 2005, 2008, …
#include <iostream >
using namespace std;
void main() {
cout<<"Xin chao cac ban"; }
//Viết bằng VC++6.0 //hoặc BC++3.1
#include <iostream h>
void main() {
cout<<"Xin chao cac ban";
Trang 8Chỉ thị tiền xử lý ( Preprocessor directive )
Các chỉ thị tiền xử lý là những dòng được đưa vào trong
mã của chương trình phía sau dấu #
Những dòng này không phải là lệnh của chương trình
nhưng chỉ thị cho tiền xử lý
Tiền xử lý kiểm tra mã lệnh trước khi biên dịch thực sự
và thực hiện tất cả các chỉ thị trước khi thực thi mã lệnh của các câu lệnh thông thường
8
Trang 9Chỉ thị tiền xử lý ( Preprocessor directive )
Đặc điểm:
1 Mô tả trên một dòng, không có dấu ;
2 Trường hợp cần mô tả trên nhiều dòng dùng dấu \ ở
cuối mỗi dòng
9
Trang 10Chỉ thị tiền xử lý ( Preprocessor directive )
Các chỉ thị:
1 Định nghĩa macro (macro definitions): #define - #undef
2 Kết hợp với điều kiện (conditional inclusions): #ifdef,
#ifndef, #if, #endif, #else và #elif
3 Điều khiển dòng lệnh (line control): #line
4 Chỉ thị lỗi (error directive): #error
5 Kết hợp file nguồn (source file inclusion): #include
6 Chỉ thị pragma (pragma directive): #pragma
10
Trang 11Chỉ thị tiền xử lý ( Preprocessor directive )
1 Macro definitions: #define – Cú pháp
#define “định danh” “thay thế”
Mục đích: Thay thế bất kỳ sự xuất hiện của “định danh”
trong phần còn lại của các mã lệnh bằng “thay thế”
“Thay thế”: có thể là một biểu thức hoặc một lệnh
11
Trang 12Chỉ thị tiền xử lý ( Preprocessor directive )
Trang 13Định nghĩa thay thế một hàm có tham số
#include <iostream>
using namespace std;
#define getmax(a,b) ((a)>(b)?(a):(b))
Chỉ thị tiền xử lý ( Preprocessor directive )
1 Macro definitions – Ví dụ
13
void main() {
Trang 14Chỉ thị tiền xử lý ( Preprocessor directive )
1 Macro definitions: #define – Cú pháp
#undef “định danh” # “tham số thay thế”
Mục đích: “tham số thay thế” là một chuỗi ký tự (không cần
đặt trong dấu ngoặc kép “”)
#define str(x) # x
cout << str(test);
14
cout << “test”;
Trang 15Chỉ thị tiền xử lý ( Preprocessor directive )
1 Macro definitions: #define – Cú pháp
#undef “định danh” “đối số 1” # “đối số 2”
Mục đích: Nối đối số “đối số 1” với “đối số 2”
#define glue(a, b) a ## b
glue(c,out) << "test";
15
cout << “test”;
Trang 16Chỉ thị tiền xử lý ( Preprocessor directive )
1 Macro definitions: #undef – Cú pháp
Trang 17Chỉ thị tiền xử lý ( Preprocessor directive )
2 Kết hợp với điều kiện (conditional inclusions):
#ifdef – Cú pháp
#ifdef “định danh”
lệnh;
Mục đích: Cho phép chương trình biên dịch nếu “định
danh” được định nghĩa.
Trang 18Chỉ thị tiền xử lý ( Preprocessor directive )
2 Kết hợp với điều kiện (conditional inclusions):
Trang 19Chỉ thị tiền xử lý ( Preprocessor directive )
2 Kết hợp với điều kiện (conditional inclusions):
Trang 20Chỉ thị tiền xử lý ( Preprocessor directive )
2 Kết hợp với điều kiện (conditional inclusions):
#if, #else, #elif … #endif – Cú pháp
Mục đích: Chỉ thị #if, #else và #elif dùng để chỉ định một số điều kiện
để thực hiện mã lệnh Điều kiện là một biểu thức hằng số
Trang 21Chỉ thị tiền xử lý ( Preprocessor directive )
2 Kết hợp với điều kiện (conditional inclusions):
#if, #else, #elif … #endif – Ví dụ
Trang 22Chỉ thị tiền xử lý ( Preprocessor directive )
3 Điều khiển dòng lệnh ( line control ): #line – Cú pháp
22
#line number "filename"
Mục đích: Chỉ thị #line cho phép kiểm soát số dòng trong
tập tin mã lệnh cũng như tên tập tin muốn hiển thị khi xảy
ra lỗi
“filename” có thể là một chuỗi ký tự bất kỳ cần hiển thị.
Trang 23Chỉ thị tiền xử lý ( Preprocessor directive )
4 Chỉ thị lỗi ( error directive ): #error – Cú pháp
Trang 24Chỉ thị tiền xử lý ( Preprocessor directive )
5 Kết hợp file nguồn ( source file inclusion ):
#include – Cú pháp
24
Mục đích: Chỉ thị này sẽ thay thế toàn bộ nội dung của
header (thư viện có sẵn – dùng cặp dấu < >) hay một tập tin
“file” (tự định nghĩa thêm – dùng cặp dấu nháy kép “ ”).
#include <header>
hoặc
#include "file"
Trang 25Chỉ thị tiền xử lý ( Preprocessor directive )
25
Mục đích: Chỉ thị này được sử dụng để xác định các lựa
chọn khác nhau cho các trình biên dịch Các tùy chọn này được cụ thể cho các platform và trình biên dịch sử dụng
Trang 26Các khái niệm
Lệnh Lệnh thực hiện một chức năng nào đó (khai báo, gán, xuất, nhập, …) và được kết thúc bằng dấu chấm phẩy (;)
Khối lệnh Khối lệnh gồm nhiều lệnh và được đặt trong cặp dấu ngoặc { }
26
Trang 2727
Trang 28 Các ký hiệu đặc biệt như: , ; [] {} ? ! \ & | % #
Không được dùng các ký hiệu như: α, φ, Ω, π, … hoặc tiếng việt có dấu: â, ă, ô…
28
Trang 29Từ khóa (keyword)
29
auto break case char const
continue default do double else
enum extern float for goto
if int long register return
short signed sizeof static struct
switch typedef union unsigned void
volatile while bool catch class
delete friend inline new namespace operator private protected public template
this throw try
Trang 30Một biến đại diện cho một vùng nhớ hay tập các vùng nhớ trên bộ nhớ chính của máy tính Tên biến được dùng
để tham khảo đến những vùng nhớ này
Biến để lưu trữ các giá trị do người dùng nhập vào hoặc các giá trị tạm thời trong quá trình tính toán
Mỗi biến sẽ có tên và kiểu dữ liệu tương ứng Kiểu dữ liệu của biến xác định những giá trị kiểu nào có thể được lưu trong biến (ví dụ số hay chữ…)
PHẢI khai báo BiẾN trước khi sử dụng
30
Trang 31Dùng những kiểu cơ sở để xây dựng thành những kiểu
dữ liệu mới cho phù hợp với bài toán
31
Trang 32Kiểu số nguyên
2 unsigned char Số nguyên dương 1 byte
4 unsigned short Số nguyên dương 2 bytes
6 unsigned int Số nguyên dương 4 bytes
8 unsigned long Số nguyên dương 4 bytes
32
Trang 33STT TÊN KIỂU GHI CHÚ KÍCH THƯỚC
1 bool Gồm 2 giá trị: true hoặc false
Kiểu luận lý
Trang 34Qui tắc đặt tên
Dùng để đặt tên biến, tên hằng, tên hàm, …
Bắt đầu bằng một ký tự
Các ký tự trong tên biến chỉ có thể là các ký tự chữ, số
hoặc dấu gạch dưới (_)
Không được trùng với các từ khoá
Không được trùng với phạm vi khai báo
Tên dễ hiểu, súc tích và gợi nhớ
Phân biệt chữ hoa và thường
34
Trang 35Các định danh nào sau đây là không hợp lệ?
Trang 36Khai báo biến
Khai báo nhiều biến cùng kiểu
<Kiểu dữ liệu> tênbiến1, tênbiến2, tênbiến3;
Ví dụ:
int a, x, y;
36
Trang 37Khai báo và khởi gán giá trị ban đầu cho biến
<Kiểu dữ liệu> tênbiến = giá trị;
Trang 38 Biến hằng được định nghĩa nhờ từ khoá const với cú pháp như sau:
const <kiểu_dữ_liệu> <tên_biến> = <giá_trị>;
Ví dụ:const int MAX = 100;
Tên hằng số nên viết bằng chữ in HOA
38
Trang 39Các loại hằng số
Hằng số: Đó là các giá trị xác định, một hằng số có thể là
nguyên (có kiểu dữ liệu int, hay long int) hay thực (có
kiểu dữ liệu là float, double, long double)
Hằng ký tự: Được đặt trong dấu nháy đơn Ví dụ: 'A', 'a' tương ứng với giá trị nguyên 65, 97 trong bảng mã ASCII
Hằng chuỗi: Là tập hợp các ký tự được đặt trong cặp dấu nháy kép " " Ví dụ: “Lap trinh C"
Chú ý: Một hằng chuỗi được trữ tận cùng bằng ký tự null (\0)
39
Trang 40Ký hiệu các phép toán
STT TOÁN PHÉP Ý NGHĨA GHI CHÚ
PHÉP TOÁN SỐ HỌC
4 / Chia Đối với 2 số nguyên thì kết quả là chia lấy phần nguyên
5 % Chia lấy phần dư Chỉ áp dụng cho 2 số nguyên
PHÉP TOÁN QUAN HỆ
Trang 41PHÉP TOÁN LOGIC
2 && AND
TOÁN TỬ TĂNG GIẢM
1 ++ Tăng 1 Nếu toán tử tăng giảm đặt
trước thì tăng giảm trước rồi tính biểu thức hoặc ngược lại.
Trang 42Thứ tự ưu tiên phép toán
Toán tử Độ ưu tiên Trình tự kết hợp
! ~ ++ - + * & sizeof 2 Từ phải qua trái
42
Trang 44Cho biết kết quả của đoạn chương trình sau:
int a, b;
b=a%2 + a/2 + a;
Với a = 17 Kết quả: a = ?; b = ? Với a = 3 Kết quả: a = ?; b = ? - int a, b;
b=a/3 + a ;
Với a = 8 Kết quả: a = ?; b = ? Với a =21 Kết quả: a = ?; b = ?
44
Trang 45Toán tử điều kiện
(ĐK)?<BT cho trường hợp đúng>:<BT cho trường hợp sai>
Trang 46Hàm nhập xuất
Thư viện hàm: iostream.h hoặc namespace std của iostream (trên Net)
Hàm nhập giá trị từ bàn phím: cin>>tênbiến;
Ví dụ: int a;
cin>>a; //Người dùng nhập giá trị từ phím sẽ lưu vào biến a
Hàm xuất giá trị ra màn hình: cout<<tên biến/ chuỗi ký tự;
Ví dụ: int a = 5;
cout<<“Gia tri cua a = “<<a;
Các biến và chuỗi cách nhau bởi dấu <<
(chuỗi nằm trong cặp dấu nháy kép “” )
46
Trang 495.3 5.339
cout<<setprecision(n);
Xuất số thập phân gồm n-1 chữ số lẻ (phần thập phân)
Trang 51Xuất có định dạng – Ví dụ
51 Viết chương trình nhập vào hai số nguyên a và b, in ra
thương của a và b (xuất 2 số lẻ phần thập phân).
Trang 52Hàm nhập xuất của C
Thư viện <stdio.h>
Xuất:
printf(“hằng chuỗi”);
Vd: printf(“Xin chao cac ban”);
printf(“chuỗi định dạng”, đối số 1, đối số 2);
Trang 54Chuỗi định dạng
KIỂU LIÊN TỤC (SỐ THỰC)
Trang 56\b Xuất lùi về sau cout<<"xyz\t\bzyx”;
Kết quả: xyzzyx
\n hoặc endl Xuống dòng
cout<<"xyz\nzyx”;Kết quả: xyz
zyx
\r Về đầu dòng cout<<"xyz\rzyx”;
Kết quả: zyx
56
Trang 57Cách trình bày chương trình
Lệnh quá dài có thể được viết thành nhiều dòng sao cho mỗi lệnh phải được quan sát trọn vẹn trong pham vi cửa sổ lệnh.
57
Trang 58Cách trình bày chương trình (tt)
ngay cả các khai báo biến, nếu các biến có khác kiểu cũng nên đặt trên các dòng khác nhau.
từng cột
58
Trang 59Các lỗi thường gặp khi viết chương trình
KHÔNG khai báo các biến sử dụng trong chương trình
Lưu một giá trị vào một biến nhưng KHÔNG cùng kiểu
dữ liệu với biến
Sử dụng biến trong một biểu thức khi CHƯA có giá trị
59
Trang 60Các lỗi thường gặp khi viết chương trình
Dùng phép chia KHÔNG ép kiểu cho số nguyên
Trang 61 Cho biết những chỗ sai và sửa lại cho đúng
Trang 62Mô tả giải thuật bằng lưu đồ và viết các chương trình sau:
Nhập vào giờ phút và giây, đổi ra giây và xuất kết quả
ra màn hình
Nhập vào 3 số nguyên a, b và c, tính giá trị trung bình
cộng của 3 số trên và xuất kết quả ra màn hình
62
Trang 63 Viết chương trình cho phép nhập vào một số đo nhiệt độ
theo độ Fahrenheit và xuất ra nhiệt độ tương đương của
nó theo độ Celsius, sử dụng công thức chuyển đổi:
Viết chương trình nhập vào 3 số nguyên a, b và c, cho
biết 3 số vừa nhập có thứ tự tăng dần (a<b<c) không? Và
xuất kết quả
63
) 32
( 9
Trang 64Hướng dẫn tạo mới Project trong MS Visual Studio 2013
64
B1 Chạy chương trình MS Visual Studio 2013
Trang 65Hướng dẫn tạo mới Project trong MS Visual Studio 2013
65
B2 Tạo mới Project: Chọn File, New, Project…
Trang 66Hướng dẫn tạo mới Project trong MS Visual Studio 2013
Trang 67Hướng dẫn tạo mới Project trong MS Visual Studio 2013
67
B4 Nhấn nút Next
(Không chọn nút
Finish)
Trang 68Hướng dẫn tạo mới Project trong MS Visual Studio 2013
68
B5 Check vào mục
Empty project trước
khi nhấn nút Finish
Trang 69Hướng dẫn tạo mới Project trong MS Visual Studio 2013
69
B6 Click phải vào mục Source Files, Add, New Item…
Trang 70Hướng dẫn tạo mới Project trong MS Visual Studio 2013
70
B7 Nhấn nút Add (không thay đổi những mục chọn sẵn)
Trang 71Hướng dẫn tạo mới Project trong MS Visual Studio 2013
71
B8 Viết code, biên dịch và thực thi chương trình: nhấn phím Ctrl+F5
Trang 7272