Chương 1Các kiến thức bổ trợ Khái niệm Thông tin - Tin học Đơn vị đo thông tin Các hệ cơ số đếm Thuật toán - Biểu diễn thuật toán Khái niệm ngôn ngữ lập trình Khái niệm chương trình
Trang 1Giảng viên: TS Cao Thanh Sơn
Khoa CNTT - Trường Đại học Vinh
(Dựa theo bài giảng của NCS Trần Thị Kim Oanh
Phó trưởng khoa CNTT - Trường Đại học Vinh)
Tài liệu
Bài giảng điện tử
Trần Thị Kim Oanh, Cao Thanh Sơn, Giáo trình Ngôn
Chương 6: Dữ liệu kiểu cấu trúc
Chương 7: Dữ liệu kiểu tệp
2
Trang 2Chương 1Các kiến thức bổ trợ
Khái niệm Thông tin - Tin học
Đơn vị đo thông tin
Các hệ cơ số đếm
Thuật toán - Biểu diễn thuật toán
Khái niệm ngôn ngữ lập trình
Khái niệm chương trình
Lỗi lập trình
Tự học
3
Khái niệm Thông tin – Tin học
Khái niệm thông tin: Là những yếu tố mang đến cho ta sự hiểu
biết về một đối tượng nào đó
Tính chất của thông tin: Tính quy luật, tính tổ chức, tính mới
mẻ, tính thời sự, tính bất ổn định
Khái niệm tin học: Là bộ môn khoa học chuyên nghiên cứu
cách thu thập, tổ chức, lưu trữ và xử lý thông tin bằng các thiết
Trang 3Các hệ cơ số đếm
Hệ cơ số 2: Sử dụng 2 ký hiệu 0, 1 để biểu diễn các số
Hệ cơ số 8: Sử dụng 8 ký hiệu 0, 1, 2, 3, 4, 5, 6, 7 để biểu diễn
Chuyển đổi giữa các hệ cơ số đếm
Chuyển đổi các số từ hệ cơ số 10 sang hệ cơ số 2, 8, 16
Chuyển đổi số từ hệ cơ số 2, 8, 16 sang hệ cơ số 10
Các phép toán trên các hệ cơ số đếm
8
Trang 4Thuật toán
Thuật toán được hiểu là một dãy hữu hạn các thao tác để giải
quyết một lớp các bài toán sao cho khi có dữ liệu vào xác định
thì cho kết quả ra xác định
Có nhiều cách biểu diễn thuật toán nhưng cách trực quan nhất là
sử dụng lưu đồ thuật toán, nghĩa là sử dụng các khối để biểu
diễn thuật toán
9
Thuật toánCác khối dùng trong lưu đồ:
Điều kiện
Khối bắt đầu/kết thúc
Khối nhập/xuất dữ liệu
sai đúng
10
Khối tính toán
Khối gọi chương trình con
Khối điều kiện
Mũi tên liên kết các khối
Trang 5Chương trình
Ngôn ngữ dùng để mô tả thuật toán sao cho máy tính có thể hiểu
được thì gọi là ngôn ngữ lập trình
Dùng ngôn ngữ lập trình để diễn tả thuật toán thì được chương
trình, chương trình này được gọi là chương trình nguồn Chương
trình dịch sẽ phải dịch chương trình nguồn ra chương trình mã
máy
12
Chương trình dịch
Chương trình mã mãy Chương trình nguồn
13
Lỗi lập trìnhKhi biên dịch và chạy chương trình có thể xuất hiện 2 loại lỗi làLỗi
cú phápvàLỗi thuật toán
Lỗi cú pháp (Syntax Error): Lỗi thuộc quy định về mặt cú
pháp của ngôn ngữ lập trình: lỗi về từ khoá, lỗi về tên, lỗi về cấu
trúc lệnh, lỗi về kiểu dữ liệu,…Tất cả những lỗi này sẽ được
máy phát hiện khi dịch chương trình
Lỗi thuật toán (Logic Error): Là những lỗi thuộc trách nhiệm
của người lập trình mà máy không thể phát hiện được Do vậy,
yêu cầu khi chương trình chạy và cho kết quả, người lập trình
phải biện luận lại kết quả xem đã chính xác hay chưa
Tự học
1 Chuyển số thực từ hệ đếm cơ số 10 sang hệ đếm cơ số 2, 8, 16
2 Chuyển trực tiếp một số từ hệ đếm cơ số 2 sang hệ đếm cơ số 8,
16; hệ đếm cơ số 8, 16 sang hệ đếm cơ số 2 không thông qua
trung gian hệ 10
3 Phép nhân, chia các số ở hệ đếm cơ số 2, 8, 16
4 Vẽ lưu đồ một số thuật toán: Giải phương trình bậc hai, tìm
max, min hai số, tìm max, min ba số
5 Tìm hiểu bảng mã chuẩn ASCII
14
Trang 6Chương 2 Một số khái niệm cơ bản của NNLT C
Giới thiệu NNLT C
Ký pháp NNLT C
Cấu trúc chương trình viết bằng NNLT C
Một số ví dụ đơn giản
Soạn thảo, dịch và chạy chương trình viết bằng NNLT C
Các kiểu dữ liệu cơ sở
Biến - Hằng - Lệnh gán đơn giản
Biểu thức và các phép toán
Khối lệnh
Một số hàm số học xây dựng sẵn
Giới thiệu ngôn ngữ lập trình C
- Ngôn ngữ lập trình C do Dennis Ritchie đưa ra vào năm
1972
- Ông đã tham khảo nhiều ngôn ngữ B, do đó ông đặt tên
ngôn ngữ lập trình của ông là ngôn ngữ lập trình C
Lịch sử ra đời:
16
Giới thiệu ngôn ngữ lập trình C
- NNLT C là ngôn ngữ mạnh và linh hoạt, được sử dụng trong
Trang 7Giới thiệu ngôn ngữ lập trình C
- Là ngôn ngữ lập trình bậc cao nhưng NNLT C lại có những
đặc điểm của ngôn ngữ lập trình bậc thấp Assembly và chạy
nhanh gần bằng Assembly
- NNLT C có rất nhiều hàm xây dựng sẵn, được khai báo trong
các thư viện chuẩn
asm, break, case, char, const, continue, default, do, double,
else, enum, extern, far, float, for, goto, huge, if, int, long, near,
pascal, register, return, short, static, struct, signed, nzeof, switch,
typedef, union, unsigned, void, volatile, while, include, define,
Các từ khoá:
Lưu ý:
Trong chương trình từ khoá luôn luôn phải viết thường
Ngôn ngữ lập trình C phân biệt chữ hoa và chữ thường
Ký pháp ngôn ngữ lập trình C
Trang 8• Ký tự đầu tiên của tên phải là chữ cái hoặc dấu gạch nối.
• Tên không được trùng với từ khoá
Ví dụ về cách đặt tên:
- Các tên đúng: x1, a_1, delta, _delta
- Các tên sai: 3x, r#3, f(x), case, del ta
Các chương trình con này được gọi là các hàm
Số lượng các hàm trong một chương trình là không hạn chế
nhưng bắt buộc phải có một hàm chính với tên quy định làmain
Cấu trúc của một chương trình C bao gồm 4 phần sau:
<1> Khai báo các thư viện
<2> Định nghĩa các kiểu, biến tổng thể
<3> Định nghĩa các hàm
<4> Định nghĩa hàm main
Cấu trúc của chương trình viết bằng NNLT C
23
Trang 9Lưu ý:
Đối với những chương trình đơn giản thì phần <2> và phần
<3> có thể không có nhưng phần <1> và phần <4> luôn
luôn phải có trong bất cứ chương trình nào
Việc khai báo các thư viện thường đặt ở đầu chương trình
theo cú pháp:#include <tên thư viện>
Thư viện chuẩn là các tệp*.h
Cấu trúc của chương trình viết bằng NNLT C
24
25
Một số ví dụ đơn giản đầu tiên
Ví dụ 1: In ra màn hình câu chào Hello
#include <stdio.h>
#include <conio.h>
int main() //ham chinh
{
printf("hello"); //ham xuat du lieu ra man hinh
getch(); //ham dung man hinh ket qua
return 0; //lenh tra ve gia tri cho ham main
Trang 10Các kiểu dữ liệu cơ bản
1 char (signed char) 1 -128 127
Các kiểu dữ liệu cơ bản
Kiểu số thực
Biến - Hằng - Lệnh gán đơn giản
Biến: Biến là một cấu trúc ghi nhớ dữ liệu
Cách khai báo: Kiểu Danh sách biến;
Trang 11Biến - Hằng - Lệnh gán đơn giản
Biến có thể được khai báo ở một trong ba vị trí sau trong
Biến - Hằng - Lệnh gán đơn giản
Hằng: Hằng là đại lượng mà giá trị của nó không thay đổi
trong quá trình tính toán
• Hằng số nguyên: Các hằng loại này có thể khai báo dưới
dạng cơ số 2, cơ số 8, cơ số 10 hay cơ số 16
- Là một ký tự được viết trong
cặp dấu nháy đơn, chẳng hạn
Trang 12Biến - Hằng - Lệnh gán đơn giản
• Hằng xâu ký tự:
Là dãy ký tự bất kỳ đặt trong cặp dấu nháy kép
Chẳng hạn: "Nguyen Van An"
"" /*xâu rỗng*/
Xâu ký tự được lưu trữ trong máy dưới dạng một mảng một
chiều, mỗi phần tử là một ký tự của xâu Trình biên dịch tự động
thêm ký tự NULL vào cuối mỗi xâu để báo hiệu kết thúc xâu
Lưu ý: Cần phân biệt giữa 'a' và "a"
'a' : Là hằng ký tự được lưu trữ trong 1 byte
"a": Là hằng xâu ký tự được lưu trữ trong 2 bytes
Là sự kết hợp giữa phép toán và toán hạng nhằm diễn đạt một
công thức toán học nào đó Trong đó, toán hạng có thể là biến,
Trang 13Biểu thức và các phép toán
• Các phép toán quan hệ: > >= < <= == !=
Các phép toán quan hệ dùng để tạo các biểu thức quan hệ
Nếu biểu thức đúng thì giá trị của biểu thức là 1, ngược lại, giá trị
của biểu thức là 0
Ví dụ: a = (5>10) /* a == 0 */
b = (4>-1) /* b == 1*/
Lưu ý: Các biểu thức quan hệ có thể tham gia vào các phép
toán đối với số nguyên
& Phép Và theo bit
| Phép Hoặc theo bit
^ Phép Hoặc loại trừ theo bit
~ Phép Lấy phần bù theo bit
Trang 14• Các phép chuyển đổi kiểu giá trị:
- Phép chuyển đổi kiểu trong biểu thức:
Hai toán hạng trong một phép toán có kiểu khác nhau thì kiểu
thấp hơn sẽ chuyển thành kiểu cao hơn và đó chính là kiểu kết quả
Ví dụ: 1.5 * (8/3) == 3.0
- Phép chuyển đổi kiểu thông qua phép gán:
Giá trị vế phải được chuyển sang kiểu của vế trái, đó là kiểu
• Các phép toán tăng giảm:
Để tăng biến a lên 1 đơn vị ta viết : a++hoặc ++a
Để giảm biến a xuống 1 đơn vị ta viết: a hoặc a
Biểu thức và các phép toán
Trang 15Lưu ý:
a++: Sử dụng a sau đó mới tăng a 1 đơn vị
++a: Tăng a lên 1 đơn vị rồi mới sử dụng
a : Sử dụng a sau đó mới giảm a 1 đơn vị
a: Giảm a xuống 1 đơn vị rồi mới sử dụng
Gán gộp a = 2; b = 3; c = a* b; c = (a = 2) * (b = 3);
Trang 16• Biểu thức điều kiện:
Cú pháp: biến = điều kiện? biểu thức 1: biểu thức 2;
Ý nghĩa:
- Nếu điều kiện đúng thì biến nhận giá trị của biểu thức 1
- Ngược lại, biến nhận giá trị của biểu thức 2
Biểu thức và các phép toán
Ví dụ: Tìm max 2 số a, b
max = a > b?a : b;
Tìm max 3 số a, b, cmax1=a > b? a : b;
max = max1 > c? max1: c;
46
Thứ tự ưu tiên của các phép toán
TT ưu tiên Các phép toán Thứ tự kết hợp
1 () [] -> trái qua phải
2 ! * & ~ ++ + - (type) sizeof phải qua trái
5 << >> trái qua phải
6 < <= > >= trái qua phải
11 && trái qua phải
14 = *= /= %= += -= <<= >>= &= |= ^= phải qua trái
47Khối lệnh
Là dãy các lệnh được đặt giữa cặp dấu ngoặc nhọn { và }
Trang 17Một số hàm số học xây dựng sẵn
nguyên a
stdlib.h
đoạn văn bản Đoạn văn bản dùng để làm sáng tỏ ý nghĩa kết quả
hiện ra Mã định dạng dùng để xác định số mục và cách biểu thị giá
trị các mục này lên màn hình
- Các mục cần đưa ra màn hình có thể là một hay nhiều mục
cách nhau dấu phẩy, mỗi mục có thể là các biến, hằng, hàm, phần tử
Trang 18printf("So nguyen n = %5d\nSo thuc x = %5.2f",n,x);
Kết quả hiện lên màn hình
Trang 19Ý nghĩa: Tương tự hàm getchar chỉ khác ký tự đưa vào bằng
hàm getch không cho hiện lên màn hình
2 Viết chương trình nhập vào từ bàn phím 2 số thực a và b Hãy
tính và in ra màn hình chu vi và diện tích hình chữ nhật có chiều
rộng và chiều dài là a và b
Trang 20Chương 3Các cấu trúc lập trình
công việc
sai
59
Trang 21Cấu trúc rẽ nhánhThuật toán tìm max 3 số
Ví dụ: Kiểm tra 3 số thực a, b, c có thể là độ dài 3 cạnh của một tam
giác hay không Nếu đúng tính chu vi, diện tích tam giác đó,
ngược lại có thông báo
điều kiện đúng
sai
Sơ đồ hoạt động:
61
Cấu trúc rẽ nhánhThuật toán kiểm tra tạo tam giác
điều kiện
Trong đó, điều kiện = ((a+b>c) && (b+c>a) && (a+c>b))
62
Trang 22case n2: công việc 2; break;
case nk: công việc k; break;
[default: công việc k+1;]
• thành phần default: công việc k+1; có thể có hoặc không
• sau mỗi công việc i đều phải có câu lệnh break;
bt=n1
đúng
công việc 1
bt=n2 sai
đúng công việc 2
bt=nk đúng công việc k
sai
công việc k+1
65
Trang 23Cấu trúc tuyển chọn
Ví dụ: Cho biết số ngày của một tháng bất kỳ của một năm bất kỳ
Quy luật tính số ngày của một năm bất kỳ:
+ Ngược lại có 28 ngày Những năm chia hết
100 nhưng không chia hết cho 400, chẳng hạn như năm 1700, 1800,
Cấu trúc tuyển chọnThuật toán
songay=30
t=2 đúng sai
®iÒu kiÖn
songay=28
songay=29 đúng
sai nhập t, n
điều khiển Biến điều khiển là biến mà giá trị của nó quyết
định đến việc câu lệnh lặp tiếp tục lặp hay dừng lại
lệnh lặp
Trang 24Câu lệnh lặp for
Sơ đồ hoạt động:
phần 1
phần 2 đúng công việc
Bất kỳ phần nào trong ba phần trên đều có thể vắng mặt nhưng phải giữ
dấu chấm phẩy.
Khi phần 2 vắng mặt thì nó luôn có giá trị bằng 1 Trong trường hợp
này việc ra khỏi câu lệnh lặp phải nhờ vào một trong các câu lệnh
break, goto, return trong thân câu lệnh lặp.
Mỗi phần trong ba phần trên có thể có một biểu thức hoặc nhiều biểu
thức cách nhau bởi dấu phẩy Các biểu thức trong mỗi phần được tính
từ trái qua phải.
Biến điều khiển của câu lệnh lặp có thể có kiểu ký tự, kiểu số nguyên
hoặc kiểu số thực.
Biển điều khiển có thể được thay đổi bởi một giá trị tùy ý.
Đối với những câu lệnh lặp for có thân đơn giản, ta có thể kết hợp thân
vào phần 3 để tạo câu lệnh lặp for rỗng Lúc này phải có dấu chấm
Câu lệnh lặp for
Ví dụ: Tính tổng s = 1 + 2 + … + n theo các cách sau:
Cách 1: Sử dụng câu lệnh lặp for đầy đủ
Cách 2: Sử dụng câu lệnh lặp for rỗng
Cách 3: Sử dụng câu lệnh lặp for khuyết một phần
Cách 4: Sử dụng câu lệnh lặp for khuyết hai phần
Cách 5: Sử dụng câu lệnh lặp for khuyết cả ba phần
71
Trang 25Câu lệnh lặp while
Cú pháp:
while (điều kiện)
Trang 26Câu lệnh lặp do while
Sơ đồ hoạt động:
công việc
điều kiện đúng
Ví dụ: Tính tổng s = 1 + 3 + 5+ …+ (2*n -1), với n nguyên dương
Một số chú ý về cấu trúc lặp
Các câu lệnh lặp for, while, do while có thể thay thế cho nhau
Trong thân câu lệnh lặp có thể:
- Sử dụng câu lệnhbreakđể thoát khỏi thân câu lệnh lặp
- Sử dụng câu lệnhgotođể nhảy ra khỏi thân câu lệnh lặp đến
một vị trí nào đó
- Sử dụng câu lệnhreturnđể trả giá trị về cho một hàm nào đó
Trong thân câu lệnh lặp có thể dùng câu lệnhcontinueđể chuyển
đến đầu một vòng mới mà bỏ qua tất cả các lệnh trong thân câu
lệnh lặp nhưng nằm saucontinue
Trang 27Không cho phépgotonhảy từ ngoài vào trong một khối lệnh
nhưng được phép nhảy từ trong một khối lệnh ra ngoài.78
}
79
80
Tự học
1 Sử dụng câu lệnh lặp while, do while để tính tổng s=1+2+ +n
2 Lấy ví dụ về việc sử dụng câu lệnh continue trong thân câu lệnh
lặp
3 Viết chương trình tính tổng s=1*2 + 2*3 + + (n-1)*n, với n
nguyên dương nhập từ bàn phím, sử dụng câu lệnh lặp for theo
các cách khác nhau: câu lệnh lặp for đầy đủ, câu lệnh lặp for
không thân, câu lệnh lặp for khuyết 1 phần, câu lệnh lặp for
khuyết 2 phần, câu lệnh lặp for khuyết 3 phần
Trang 28Chương 4Con trỏ và mảng
Dữ liệu kiểu con trỏ
Dữ liệu kiểu mảng một chiều
Con trỏ: là loại biến đặc biệt dùng để chứa địa chỉ Có các loại
địa chỉ khác nhau nên cũng có các loại con trỏ tương ứng
Khai báo: kiểu *biến_trỏ;
float *y, b;
khi đó các phép gán sau là đúng x=&a; y=&b;
các phép gán sau là sai: x=a;y=b;x=&b;y=&a;
83
Dữ liệu kiểu con trỏToán tử *:
biến_trỏ: Chứa địa chỉ vùng nhớ mà biến_trỏ đang trỏ tới
*biến_trỏ: Là giá trị vùng nhớ mà biến_trỏ đang trỏ tới
Cách thay đổi biến trỏ:
biến_trỏ = biến_trỏ + n; biến_trỏ = biến_trỏ - n;
biến_trỏ++; ++biến_trỏ; biến_trỏ ; biến_trỏ;
với n là số nguyên không âm
Trang 29Dữ liệu kiểu con trỏ
Ý nghĩa
biến_trỏ++; ++biến_trỏ; Cho biến_trỏ trỏ tới vùng nhớ kế
sau vùng nhớ hiện tại
biến_trỏ ; biến_trỏ; Cho biến_trỏ trỏ tới vùng nhớ kế
trước vùng hiện tại
+ sizeof(kiểu): số byte của kiểu của con trỏ
+ n*sizeof(kiểu): tổng số byte được cấp phát cho con trỏ
86
Dữ liệu kiểu con trỏ
Ví dụ: int *p;
p=(int*)malloc(5*sizeof(int));
lệnh trên cấp phát 5 ô nhớ liên tiếp nhau, mỗi ô 2 bytes và
cho con trỏ p trỏ vào ô đầu tiên
p
2000 2002 2004 2006 2008
Trang 30Dữ liệu kiểu con trỏ
Ví dụ: Dùng con trỏ nhập vào từ bàn phím 5 số nguyên sau đó in ra
màn hình theo thứ tự xuôi và ngược
/*Khai bao va cap phat vung nho cho con tro*/
Sau khi in xuôi:
/*Dua p ve phan tu cuoi*/
Sau khi in ngược:
Giải phóng ô nhớ cho con trỏ:
Cú pháp: free(biến_trỏ);
Trang 31Dữ liệu kiểu mảng một chiều
Dữ liệu kiểu mảng một chiều
- Các phần tử của mảng có thể được xác định thông qua chỉ số
mảng hoặc thông qua con trỏ Chỉ số mảng được bắt đầu từ 0
- Truy nhập đến phần tử thứ i của mảng bằng chỉ số ta viết
Dữ liệu kiểu mảng một chiều
Ví dụ: Viết chương trình nhập và xem mảng một chiều sử dụng chỉ
Trang 32Dữ liệu kiểu mảng một chiều
• Tên mảng là một hằng địa chỉ và nó là địa chỉ của phần tử đầu
tiên của mảng
Chẳng hạn: Với mảng int a[5], ta có:
a tương đương địa chỉ a[0]
a+1 tương đương địa chỉ a[1]
a+i tương đương địa chỉ a[i]
*(a+i) tương đương a[i]
93
Dữ liệu kiểu mảng một chiều
Truy nhập đến các phần tử mảng một chiều nhờ con trỏ: khai
báo một con trỏ cùng kiểu với mảng, sau đó gán con trỏ bằng
tên mảng Khi này, con trỏ và mảng gần tương đương nhau
Dữ liệu kiểu mảng một chiều
Ví dụ: Viết chương trình nhập và xem mảng một chiều sử dụng
con trỏ
/*Nhap mang nho con tro*/
int a[5], i,*p;