Chương 2: Các kiểu dữ liệu và khai báo Chương 3: Phép toán và biểu thức Chương 4: Cấu trúc điều khiển Chương 5: Hàm Chương 6: Mảng một chiều Phần bài tập: cài đặt các bài tập để rèn luyệ
Trang 1Phần 1: Các nội dung trọng tâm của môn học
Nội dung lý thuyết của môn học cơ sở lập trình tóm tắt trong 6 chương:
Chương 1: Giới thiệu về lập trình
Chương 2: Các kiểu dữ liệu và khai báo
Chương 3: Phép toán và biểu thức
Chương 4: Cấu trúc điều khiển
Chương 5: Hàm
Chương 6: Mảng một chiều
Phần bài tập: cài đặt các bài tập để rèn luyện kỹ năng lập trình
Chương 1: Giới thiệu về lập trình 1.1 Các khái niệm:
Chương trình máy tính: hay chương trình là một dãy các chỉ thị (lệnh) được
viết để thực hiện một nhiệm vụ nhất đinh bằng máy tính Một tập hợp các chương trình máy tính và các dữ liệu liên quan thường được gọi là phần mềm
Ngôn ngữ lập trình: (tiếng Anh: programming language) là ngôn ngữ dùng
để viết chương trình dùng cho máy tính Đây là một dạng ngôn ngữ được thiết
kế và chuẩn hóa để truyền các chỉ thị cho máy tính (hoặc máy khác có bộ xử lí) Ngôn ngữ lập trình có thể được dùng để tạo ra các chương trình nhằm mục đích điều khiển máy tính hoặc mô tả các thuật toán để người khác đọc hiểu
Phân lớp các ngôn ngữ lập trình:
Ngôn ngữ cấp thấp: gần với máy tính, dễ hiểu đối với máy tính nhưng lại
khó hiểu với con người Bao gồm: Mã máy (Ngôn ngữ máy), Hợp ngữ (Assembly)
Ngôn ngữ cấp cao: gần với con người dễ hiểu với con người, nhưng khó
hiểu với máy Thông dụng: Pascal, Ngôn ngữ C, C++, Basic,
1.2 Lịch sử ngôn ngữ lập trình C/C++
Ngôn ngữ lập trình C là một ngôn ngữ mệnh lệnh được phát triển từ đầu thập niên 1970 bởi Ken Thompson và Dennis Ritchie dùng để viết hệ điều hành UNIX Từ đó ngôn ngữ này đã lan rộng ra nhiều hệ điều hành khác và trở thành một những ngôn ngữ phổ dụng nhất C là ngôn ngữ rất có hiệu quả
và được ưa chuộng nhất để viết các phần mềm hệ thống, mặc dù nó cũng được
Trang 2dùng cho việc viết các ứng dụng Ngoài ra, C cũng thường được dùng làm phương tiện giảng dạy trong ngành học máy tính
Bjarne Stroustrup của Bell Labs đã phát triển C++ trong suốt thập niên 1980 như là một bản nâng cao của ngôn ngữ C Những bổ sung nâng cao bắt đầu với sự thêm vào của khái niệm lớp, tiếp theo đó là các khái niệm hàm
ảo, chồng toán tử, đa kế thừa, tiêu bản, và xử lý ngoại lệ
C++ là một loại ngôn ngữ lập trình Đây là một dạng ngôn ngữ đa mẫu hình tự
do có kiểu tĩnh và hỗ trợ lập trình thủ tục, dữ liệu trừu trượng, lập trình hướng đối tượng, và lập trình đa hình Từ thập niên 1990, C++ đã trở thành một trong những ngôn ngữ thương mại phổ biến nhất
1.3 Các bước xây dựng chương trình
Xác định mục đích của chương trình
Xây dựng thuật toán phù hợp giải quyết bài toán (mã giả , lưu đồ, …)
Cài đặt thuật toán bằng C/C++
Biên dịch
Thực thi chương trình và kiểm thử
Bảo trì
1.4 Các bước phát triển chương trình
Dùng trình soạn thảo nhập mã nguồn (source code) file.cpp
Dùng chương trình biên dịch (compile) tập tin đối tượng file.obj
Các tập tin đối tượng file.obj được liên kết mã đối tượng của các hàm thư viện
tập tin thực thi file.exe
Thực thi file.exe và kiểm thử
Quá trình trên được lặp lại cho đến khi tập tin thực thi thực hiện đúng theo yêu cầu
1.5 Giai đoạn bảo trì
Trang 3Mô tả khi chương trình chạy đã dịch thành mã máy
Hỏi nhập giá trị a Nhập giá trị a
Hỏi nhập giá trị b Nhập giá trị b
In ra kết quả a + b
In ra câu chào
1.7 Cấu trúc của một chương trình C/C++
/* Mô tả mục đích của chương trình
Tác giả
Ngày viết */ (ghi chú khối trên nhiều dòng – không bắt buộc)
# include <fileName.h>
Khai báo prototype của hàm tự tạo (nếu có);
TypeName main() // TypeName: tên kiểu dữ liệu
{
Lệnh;
}
Cài đặt hàm tự tạo (nếu có)
1.8 Các tập tin thư viện thông dụng
Trang 4Là các tập tin chứa định nghĩa các hàm thông dụng khi lập trình C/C++ Để sử các hàm trong tập tin thư viện thì phải khai báo đầu chương trình
# include <FileName.h>
// FileName.h: tên hàm thư viện, các hàm thông dụng
iostream chứa các hàm liên quan đến xuất/nhập: cin, cout, …
math.h chứa các hàm toán học: abs(), sqrt(), log(), log10(), sin(), cos(),tan(), asin(), acos(), atan(), pow(),exp(),… dùng cho các số thực
iomanip.h chứa các hàm setw(n) nhảy đến n ký tự
stdlib.h chứa hàm: rand() tạo số ngẫu nhiên
Trang 5Chương 2: Các kiểu dữ liệu và khai báo Mục tiêu
Giúp cho sinh viên hiểu khái niệm danh hiệu, từ khóa cũng như cách đặt tên cho danh hiệu
Áp dụng kiểu dữ liệu, khai báo biến, hằng phù hợp với chương trình cụ thể
Sử dụng được một số hằng đã định nghĩa trước trong thư viện C++
Nội dung
Các kiểu dữ liệu cơ bản và miền trị
Danh hiệu và từ khóa
Biến
Hằng
Một số hằng định nghĩa trước trong thư viện C++
2.1 Các kiểu dữ liệu và khai báo
Mỗi ngôn ngữ lập trình đều định nghĩa sẵn các kiểu dữ liệu cơ bản
Dữ liệu trong chương trình phải thuộc một kiểu dữ liệu nhất định
Mỗi kiểu dữ liệu có tên kiểu, kích thước và phạm vi chứa dữ liệu
Dữ liệu sử dụng trong chương trình phải được khai báo trước
Các kiểu dữ liệu cơ bản (data types):
2.1.1.1 Kiểu số nguyên int:
Kích thước: kiểu int tùy thuộc váo máy tính cài hệ điều hành 32 bit (4 byte) hoặc 64 bit (8 byte)
Phạm vi: Kiểu int với n bit -2n-1 2n-1 -1
2.1.1.2 Những biến thể kiểu số nguyên
Dùng các từ khóa short, long, unsigned đứng trước int trong khai báo kiểu sẽ làm thay đổi phạm vi kiểu
Trang 6 Kiểu short int (hay short): dùng 4 byte
Kiểu long int (hay long): dùng 4 byte
Kiểu unsigned int (hay int): tùy thuộc vào hệ điều hành của máy tính 32 bit (hay 64 bit), là số nguyên không dấu có phạm vi từ: 0 2n -1 (n: số bit)
Qui ước khi viết các hằng số nguyên
Kiểu char: dùng 1 byte biểu diễn các ký tự trong bảng mã ASCII
Một số giá trị trong bảng mã ASCII
Trang 7 Kiểu luận lý trong Visual C++ là bool có giá trị true/false
2.2 Từ khóa và danh hiệu
2.2.2 Danh hiệu
Danh hiệu: là tên của các biến, hằng, hàm, …
Danh hiệu có thể là 1 hoặc nhiều ký tự, ký tự bắt đầu phải là chữ cái hoặc dấu _ (underscore) theo sau phải là chữ cái, số hoặc dấu _ ; nên đặt tên gợi nhớ
high_balance high balance
Lưu ý khi sử dụng danh hiệu
Danh hiệu phân biệt chữ thường và hoa:
count, Count, COUNT là 3 danh hiệu khác nhau
Danh hiệu không được trùng tên với từ khóa và các tên hàm trong thư viện
Trang 82.3 Biến
Biến: là một định danh của một vùng nhớ dùng để lưu trữ một giá trị, có thể
bị thay đổi bởi chương trình
Biến phải được khai báo trước khi sử dụng
2.3.1 Khai báo biến không khởi tạo giá trị
2.3.2 Khai báo biến khởi tạo giá trị
Cú pháp: kiểu_dữ_liệu <tên_biến> = giá_trị ;
#define tên_hằng giá_trị_hằng
hoặc: dùng từ khóa const;
const kiểu_dữ_liệu <tên_hằng> = giá_trị_hằng ;
Ví dụ:
#define SOSV 50
#define MAX 100
Trang 9Chương 3: Phép toán và biểu thức 3.1 Các phép toán số học:
Phép tính phần dư của phép chia số nguyên: %
3.2 Các phép toán: có kết quả là kiểu luận lý
Trang 10Ví dụ:
k = a+ ++b; tương đương với {b++; k=a+b}
k = a+ b++ tương đương với { k=a+b; b++ }
Ví du: x = (y=3, y+1);
Đầu tiên y=3, x =y+1 là 4
3.6 Chuyển đổi kiểu trong biểu thức
Khi các hằng và biến chứa trong biểu thức có các kiểu khác nhau Trình biên dịch sẽ thực hiện chuyển thành cùng kiểu của toán hạng có kiểu lớn nhất, trước khi các phép toán được thực hiện
Ví dụ:
Trang 113.7 Ép kiểu (casting)
Dùng để ép một biểu thức thành một kiểu theo mong muốn
Dạng tổng quát:
(type) expression hoặc type (expression)
Trong đó: type là tên một kiểu dữ liệu
Ví dụ:
float result;
result = 7/2; // chia nguyên result=3
result = (float)7/2; // result=3.5
result = float(7)/2; // result=3.5
3.8 Dạng viết tắt của câu lệnh gán
Các toán tử số học (+, -, *, /, %): viết tắt các lệnh +=, -=, *=, /=, %=
Dạng tổng quát:
bien = bien (toán tử số học) bieuthuc;
bien (toán tử số học) = bieuthuc;
* / % + -
<< >>
< <= > >=
Trang 13Chương 4: Cấu trúc điều khiển Mục tiêu
Hiểu được các cấu trúc điều khiển: cấu trúc tuần tự, cấu trúc lựa chọn và cấu trúc lặp
Áp dụng các cấu trúc điều khiển trong chương trình cụ thể có hiệu quả
1 Cấu trúc tuần tự (sequence): Thực hiện lệnh theo thứ tự từ trên xuống
2 Cấu trúc lựa chọn (selection): Dựa vào kết quả biểu thức luận lý, mà chọn
lựa lệnh tương ứng thực hiện: gồm if, switch
3 Cấu trúc lặp (loop): Lặp lại 1 hay nhiều lần khối lệnh cho đến khi biểu thức luận lý là sai; gồm: for, while, do … while
Trang 16cout << “Nhap so thu nhat “ ; cin >> a;
cout << “Nhap so thu hai “ ; cin >> b;
4.3.2 Cấu trúc lựa chọn switch
switch là cấu lựa chọn có nhiều nhánh, so sánh bằng char hoặc integer
Khi có nhiều lựa chọn thì đây là cấu trúc phù hợp; thay vì phải dùng nhiều if
… else lồng nhau
Trang 17}
Trong đó X so sánh với các giá trị X 1 , X 2 , , X n
Giải thích: cấu trúc lựa chọn switch
Trước tiên chương trình sẽ định giá trị X
Nếu giá trị X=X1 thực hiện S1, có break chương trình thoát cấu trúc switch; ngược lại: X so sánh X2, …., Xn (tương tự)
Nếu tất cả so sánh trên đều sai thực hiện S trong default (nếu có)
Lưu ý
Không bắt buộc phải có default
Thông thường trong mỗi case có lệnh break để thoát khỏi cấu trúc switch
Ví dụ: Nhập vào 2 số nguyên và phép toán thuộc về { +,-,*,/,%} Xuất ra kết quả của phép toán với hai số vừa nhập
Trang 18char PT;
cout << “Nhap a: “; cin >> a;
cout << “Nhap b: “; cin >> b;
cout << “Nhap phep toan : “; cin >> PT;
switch (PT) {
Trang 19b1 Exp1 được khởi tạo và chỉ được gán trị 1 lần
b2 Exp2 điều kiện được định trị
b3 Nếu Exp2 = true S được thực hiện, Exp3 được thực thi, rồi quay lại b2
Nếu Exp2 = false thoát khỏi for
Trang 20Lưu đồ Cấu trúc for
Ví dụ 1: Viết chương trình nhập vào số nguyên n tính tổng từ 1 đến n
cout <<“\nNhap so n = “ ; cin >> n;
for ( i=1; i <=n; i++)
Trang 21Giải thích
b1 btL được định trị
b2 Nếu btL = True S được thực hiện
Khi đó có thể thay đổi giá trị btL
Quay lên b1
b3 Nếu btL = False thoát vòng lặp while
Lưu ý
Nếu bắt đầu btL = False vòng lặp while không thực hiện S
Bên trong vòng lặp while phải buộc btL = False; nếu không sẽ lặp vô tận
Lưu đồ cấu trúc while
Ví dụ 1: Viết chương trình tính tổng các số nguyên từ 1 đến n
# include <iostream>
using namespace std;
Trang 22s = s + i; i++;
} cout << “Tổng: 1+ …+”<<n<<“ = “ <<s<<endl;
Trang 23b3 Nếu btL = True quay lên b1
Nếu btL = False thoát khỏi do …while
Lưu ý
Bắt đầu S thực hiện S được thực hiện ít nhất 1 lần
Quá trình thực hiện vòng lặp do … while phải buộc btL = False; nếu không
sẽ lặp vô tận
Lưu đồ cấu trúc do … while
Trang 24Ví dụ 1: Viết chương trình in các số nguyên từ 1 đến 10
Trang 254.5.1 Lệnh break
Thường dùng trong case của cấu trúc switch để thoát switch
Ngoài ra lệnh break còn dùng trong các cấu trúc lặp: for, while, do … while
để thoát vòng lặp sớm khi chưa đến cuối vòng lặp, thường đi kèm với lệnh if
Ví dụ 1: Viết chương trình tính tổng của n số nguyên dương nhập vào; chương
cout <<“Nhap vao so = “; cin >>n;
if (n < 0)
break;
s = s + n;
} cout << “\nTổng của các số = “ <<s;
}
Ví dụ 2: Viết chương trình tính tổng của n số nguyên dương nhập vào; chương
trình kết thúc khi nhập số âm, không dùng lệnh break
cout <<“Nhap vao so = “; cin >>n;
Trang 26Ví dụ: Viết chương trình nhập vào các số nguyên, chỉ tính tổng các số nguyên
dương và thoát khi nhập số 0
Trang 27Chương 5: Hàm 5.1 Đặt vấn đề:
Cho đến bây giờ, ta biết được các chỉ thị cơ bản:
Khai báo biến, các phép toán đơn giản, kiểm tra các điều kiện hay viết các vòng lặp…
Một chương trình viết từ đầu đến cuối trở nên rất khó hiểu với chiều dài của
Khi hàm được gọi thì khối lệnh trong hàm được thực thi
Hàm có thể trả về 1 giá trị hoặc không (thủ tục), hàm có thể được gọi từ chương trình chính (main()) hoặc từ hàm khác và có thể được gọi nhiều lần
Trang 28Ví dụ: Tìm min của 4 giá trị a, b, c, d
cout <<“Nhap a = “; cin>>a;
cout <<“Nhap b = “; cin>>b;
cout <<“Nhap c = “; cin>>c;
cout <<“Nhap d = “; cin>>d;
Trang 29 Danh sách các tham biến truyền cho nó
Phần thân hàm: là dãy các chỉ thị để thực hiện khi hàm được gọi
//Khai báo hàm: function prototype
kieu_tra_ve Ten_ham(ds cac_tham_bien);
Trang 305.4 Các qui tắc về phạm vi của hàm:
Hàm được xem như hộp đen, phần thân của hàm được thực thi khi hàm được gọi; mã và dữ liệu bên trong hàm không tương tác với mã và dữ liệu trong các hàm khác
Những khai báo biến bên trong hàm là biến cục bộ; những biến này được tạo
ra khi hàm được gọi và biến mất khi hàm thực thi xong
5.5 Tham số hình thức và tham số thực
Khi khai báo hàm là khai báo các tham số hình thức
Khi gọi hàm thực thi, ta cung cấp các giá trị thực tương ứng với tham số hình thức nên được gọi là tham số thực
Ví dụ:
minAB = min(17, 9) // Gọi hàm
int min(int a, int b) // Tham số hình thức
Trang 31doubleNum(a); // bien a trong hàm = 60
cout <<“\Biến a trong main = “<<a; // a= 30
5.5.2 Truyền tham biến (tham chiếu):
Trong cách này địa chỉ đối số được chép vào tham số hình thức Do đó những thay đổi trên tham số hình thức sẽ làm thay đổi trên đối số
Ví dụ 2: truyền tham biến
# include <iostream>
using manespace std;
void doubleNum(int *b); // prototype
// *b: lấy giá trị tại địa chỉ của biến b
void main()
{
int a = 40;
doubleNum(&a); // &a: lấy địa chỉ tại biến a
cout <<"\nBien a trong main = "<<a; // a= 80
Trang 32 Cách 1: dùng để kết thúc ngay hàm chứa nó và trả điều khiển về chương trình gọi hàm
Cách 2: dùng trả về giá trị cho chương trình gọi hàm
Ví dụ 1: In các phần tử của mảng, nếu gặp các phần tử có giá trị âm dùng return 0
t2 = total(a2, 6); // goi ham
cout <<“\nTong nang 1: “<<t1;
cout <<“\nTong nang 2: “<<t2;
}
int total(int a[ ], int size) // cai dat ham
{
int sum =0;
Trang 33sum = sum + a[i];
return sum;
}
Chương 6: Mảng một chiều Mục tiêu
Hiểu cấu trúc dữ liệu mảng (một chiều)
Áp dụng được các thao tác trên mảng: nhập, xuất, truyền mảng đến hàm, xếp thứ tự đơn giản, tìm kiếm
Nội dung
Hiểu cấu trúc dữ liệu mảng (một chiều)
Áp dụng được các thao tác trên mảng: nhập, xuất, truyền mảng đến hàm, xếp thứ tự đơn giản, tìm kiếm
6.1 Giới thiệu mảng
Mảng: tập hợp các biến có cùng kiểu dữ liệu được sắp kề nhau liên tục trong
bộ nhớ, được tham chiếu bởi tên chung (tên mảng)
Mỗi phần tử của mảng được tham chiếu thông qua chỉ mục Nếu mảng có n phần tử được đánh chỉ mục từ 0 (n-1)
Số phần tử trong mảng được gọi là kích thước của mảng Kích thước mảng là
cố định và phải khai báo trước, để trình biên dịch cấp phát bộ nhớ cho nó
Kích thước của mảng được tính bằng byte:
TotalSize = sizeof(type) * elements
Để tham chiếu đến phần tử thứ i của mảng M là: M[i]
Trang 34 Ví dụ: Khai báo mảng M có 10 phần tử có kiểu int
<tên kiểu> <tên mảng>[ ] = { dãy giá trị };
Trong đó:[] kích thước không khai báo, mà ngầm định là số phần tử trong {dãy giá trị}, mỗi phần tử cách dấu phẩy