Giáo trình Tin học cơ sở A (Ngôn ngữ lập trình C) - Đặng Bình Phương

Mục lục

CHƯƠNG 6. GIỚI THIỆU NGÔN NGỮLẬP TRÌNH C . 1

6.1 GIỚI THIỆU . 1

6.2 BỘ TỪ VỰNG CỦA C . 3

6.3 CẤU TRÚC MỘT CHƯƠNG TRÌNH C . 5

BÀI TẬP CUỐI CHƯƠNG . 7

CHƯƠNG 7. CÁC KIỂU DỮLIỆU CƠSỞ . 9

7.1 CÁC KIỂU DỮ LIỆU CƠ SỞ . 9

7.2 BIẾN, HẰNG, CÂU LỆNH VÀ BIỂU THỨC . 11

7.3 CÁC LỆNH NHẬP XUẤT . 21

BÀI TẬP CUỐI CHƯƠNG . 25

CHƯƠNG 8. CÂU LỆNH ĐIỀU KIỆN VÀ RẼNHÁNH . 26

8.1 CÂU LỆNH ĐIỀU KIỆN IF ELSE . 26

8.2 CÂU LỆNH RẼ NHÁNH SWITCH . 29

8.3 KINH NGHIỆM SỬ DỤNG CÂU LỆNH ĐIỀU KIỆN VÀ RẼ NHÁNH . 32

BÀI TẬP CUỐI CHƯƠNG . 33

CHƯƠNG 9. CÂU LỆNH LẶP . 34

9.1 CÂU LỆNH FOR . 34

9.2 CÂU LỆNH WHILE . 37

9.3 CÂU LỆNH DO WHILE. 40

9.4 KINH NGHIỆM SỬ DỤNG CÁC CÂU LỆNH LẶP . 42

BÀI TẬP CUỐI CHƯƠNG . 42

CHƯƠNG 10. HÀM . 44

10.1 KHÁI NIỆM . 44

10.2 CÚ PHÁP . 45

10.3 TẦM VỰC CỦA BIẾN VÀ HÀM . 47

10.4 THAM SỐ VÀ LỜI GỌI HÀM . 49

10.5 ĐỆQUY . 51

BÀI TẬP CUỐI CHƯƠNG . 52

CHƯƠNG 11. DỮLIỆU KIỂU MẢNG (ARRAY) . 53

11.1 KHÁI NIỆM . 53

11.2 KHAI BÁO . 53

11.3 TRUY XUẤT DỮ LIỆU KIỂU MẢNG . 56

11.4 TRUYỀN MẢNG CHO HÀM . 58

11.5 MỘT SỐ BÀI TOÁN TRÊN MẢNG MỘT CHIỀU . 59

BÀI TẬP CUỐI CHƯƠNG . 77

CHƯƠNG 12. MỘT SỐKIỂU DỮLIỆU NÂNG CAO . 79

12.1 KIỂU CHUỖI KÝ TỰ (STRING) . 79

12.2 KIỂU CẤU TRÚC (STRUCT) . 83

12.3 KIỂU TẬP TIN (FILE) VÀ KIỂU CON TRỎ (POINTER) . 86

BÀI TẬP CUỐI CHƯƠNG . 87

pdf92 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 2528 | Lượt tải: 4download
Tóm tắt nội dung Giáo trình Tin học cơ sở A (Ngôn ngữ lập trình C) - Đặng Bình Phương, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
ào thì sử dụng mảng? 
2. Tình bày các cách khai báo kiểu, biến, hằng mảng và cho 
ví dụ minh họa. 
3. Trình bày các thao tác truy xuất trên mảng. Cho ví dụ 
minh họa từng trường hợp. 
78 Chương 11. Dữ liệu kiểu mảng (array) 
Thực hành 
Thực hiện các thao tác sau trên mảng một chiều a gồm các số 
nguyên, số lượng phần tử phần tử là n. 
4. Các thao tác nhập xuất 
a. Nhập mảng. 
b. Xuất mảng. 
5. Các thao tác kiểm tra 
a. Mảng có phải là mảng toàn số chẵn? 
b. Mảng có phải là mảng tăng dần? 
6. Các thao tác tính toán 
a. Có bao nhiêu số chia hết cho 4 nhưng không chia 
hết cho 5. 
b. Tính tổng các số nguyên tố có trong mảng. 
7. Các thao tác tìm kiếm 
a. Tìm vị trí số nguyên tố đầu tiên trong mảng nếu có. 
b. Tìm số nhỏ nhất trong mảng. 
c. Tìm số dương nhỏ nhất trong mảng. 
8. Các thao tác xử lý 
a. Tách mảng trên thành hai mảng b và c, mảng b 
chứa các số nguyên dương, mảng c chứa các số 
còn lại. 
b. Sắp xếp mảng giảm dần. 
c. Sắp xếp mảng sao cho các số dương đứng đầu 
mảng giảm dần, kế đến là các số âm tăng dần, 
cuối cùng là các số 0. 
d. Sửa các số nguyên tố có trong mảng thành số 0. 
e. Chèn (thêm) số 0 đằng sau các số nguyên tố 
trong mảng. 
f. Xóa tất cả số nguyên tố có trong mảng. 
Chương 12. Một số kiểu dữ liệu nâng cao 79 
Chương 12. 
MỘT SỐ KIỂU DỮ LIỆU 
NÂNG CAO 
Chúng ta đã tìm hiểu các kiểu dữ liệu cơ sở của C bao gồm 
kiểu số nguyên, kiểu số thực, kiểu luận lý, kiểu ký tự (ở chương 
7) và kiểu dữ liệu mảng (ở chương 11). Chương này sẽ trình bày 
các kiểu dữ liệu nâng cao khác bao gồm kiểu chuỗi ký tự, kiểu 
cấu trúc (lưu trữ và xử lý dữ liệu phức tạp), kiểu tập tin (lưu trữ 
và xử lý thông tin trên đĩa) và kiểu con trỏ (quản lý bộ nhớ). 
12.1 Kiểu chuỗi ký tự (string) 
12.1.1 Khái niệm 
Như ta đã biết, dữ liệu kiểu char chỉ chứa được một ký tự, để 
có thể lưu trữ một chuỗi (nhiều ký tự) ta sử dụng mảng ký tự 
(Chương 11 – Dữ liệu kiểu mảng). 
12.1.2 Khai báo 
Kiểu dữ liệu chuỗi được khai báo theo cú pháp khai báo 
mảng một chiều với mỗi phần tử có kiểu char (ký tự). 
Ví dụ: 
 char s[10]; 
Biến s được khai báo như trên có thể chứa được một chuỗi có 
độ dài tối đa là 9 ký tự (không phải là 10) do trong C chuỗi được 
được xem là một loạt các ký tự kết thúc bởi ký tự rỗng (NULL), 
ký hiệu là \0. 
80 Chương 12. Một số kiểu dữ liệu nâng cao 
Giống như cách khởi tạo mảng thông thường, để khởi tạo cho 
chuỗi s giá trị “THCS A” ta thực hiện như sau: 
 char s[10] = {‘T’, ‘H’, ‘C’, ‘S’, ‘ ’, ‘A’, ‘\0’}; 
Tuy nhiên, ta có thể khởi tạo cho chuỗi ngắn gọn hơn bằng 
cách sử dụng chuỗi thường (chuỗi được bao bởi cặp dấu “ ”). Lúc 
này trình biên dịch tự động thêm vào ký tự kết thúc chuỗi (‘\0’). 
 char s[10] = “THCS A”; 
char s[] = “THCS A”; // Tu xac dinh do dai 
12.1.3 Nhập xuất chuỗi 
Để xuất chuỗi, ta có thể sử dụng hàm printf với đặc tả “%s” 
hoặc hàm puts như sau: 
Hàm xuất dữ liệu ra màn hình (#include ) 
int puts(const char *s); 
Hàm puts xuất chuỗi s ra màn hình và tự động xuống dòng. Nếu 
thành công sẽ trả về giá trị không âm, ngược lại sẽ trả về EOF. 
Ví dụ: 
 char ten[] = “THCS A”; 
printf(“%s”, ten); // Khong xuong dong 
puts(ten); // Tu dong xuong dong 
Để nhập chuỗi, ta có thể sử dụng hàm scanf( ) với đặc tả “%s” 
nhưng hàm này chỉ đọc các ký tự từ bàn phím đến khi gặp ký tự 
khoảng trắng. 
Ví dụ: 
 char ten[100; 
scanf(“%s”, &ten); 
puts(ten); 
Nếu nhập vào “THCS A” thì chỉ nhận được chuỗi “THCS” 
Chương 12. Một số kiểu dữ liệu nâng cao 81 
Để nhập được một chuỗi đầy đủ, ta sử dụng hàm sau: 
Hàm nhập dữ liệu từ bàn phím (#include ) 
char *gets(char *s); 
Hàm gets đọc tất cả các ký tự nhập từ bàn phím đến khi gặp ký 
tự sang dòng mới (khi ta nhấn enter). Hàm gets sẽ loại bỏ ký tự 
enter và thêm vào chuỗi ký tự kết thúc chuỗi ‘\0’. Hàm gets trả 
về địa chỉ của chuỗi nhận được. 
Ví dụ: 
 char ten[100]; 
gets(ten); 
puts(ten); 
12.1.4 Các thao tác trên dữ liệu kiểu chuỗi 
Chuỗi chính là mảng ký tự, do đó không thể gán dữ liệu giữa 
hai kiểu chuỗi. Thay vào đó ta sử dụng lệnh strcpy được định 
nghĩa trong string.h. 
Hàm sao chép chuỗi (#include ) 
char *strcpy(char *dest, const char *src); 
Sao chép chuỗi src sang chuỗi dest, kết thúc khi gặp ký tự kết 
thúc chuỗi. Hàm trả về địa chỉ chuỗi dest. 
 char s[100]; 
s = “Tin hoc co so A”; // Sai 
strcpy(s, “Tin hoc co so A”); // Dung 
Trong string.h còn cung cấp một số hàm khác thao tác trên 
dữ liệu kiểu chuỗi ký tự. Một vài hàm quan trọng như sau: 
Hàm chuyển chuỗi thành chuỗi thường (#include ) 
char *strlwr(char *s); 
Hàm strlwr chuyển chuỗi s thành chuỗi thường (các ký tự ‘A’, 
‘B’, …, ‘Z’ thành ‘a’, ‘b’, … ‘z’) và trả về địa chỉ của chuỗi s. 
82 Chương 12. Một số kiểu dữ liệu nâng cao 
Hàm chuyển chuỗi thành hoa (#include )
char *strupr(char *s); 
Hàm strupr chuyển chuỗi s thành chuỗi hoa (các ký tự ‘a’, ‘b’, 
…, ‘z’ thành ‘A’, ‘B’, … ‘Z’) và trả về địa chỉ của chuỗi s. 
Hàm đảo ngược chuỗi (#include ) 
char *strrev(char *s); 
Hàm đảo ngược thứ tự các ký tự trong chuỗi (trừ ký tự kết thúc 
chuỗi) và trả về địa chỉ của chuỗi kết quả. 
Hàm so sánh hai chuỗi (#include ) 
int *strcmp(const char *s1, const char *s2); 
Hàm trả về 0 nếu s1 > s2. 
Hàm nối hai chuỗi (#include ) 
char *strcat(char *dest, const char *src); 
Hàm nối chuỗi src và chuỗi dest và trả về địa chỉ của chuỗi đã 
được nối. 
Hàm tính độ dài chuỗi (#include ) 
size_t *strlen(const char *s); 
Hàm trả về độ dài chuỗi. 
Hàm tìm chuỗi này trong chuỗi kia (#include ) 
char *strstr(const char *s1, const char *s2); 
Hàm tìm vị trí xuất hiện đầu tiên của chuỗi s2 trong chuỗi s1. 
Hàm trả về địa chỉ của thành phần đầu tiên trong chuỗi s1 tìm 
được. Nếu không tìm được thì trả về null. 
Chương 12. Một số kiểu dữ liệu nâng cao 83 
12.2 Kiểu cấu trúc (struct) 
12.2.1 Khái niệm 
Cấu trúc (struct) là một dạng dữ liệu gồm nhiều thành phần 
khác kiểu. Mỗi thành phần được truy xuất bằng một định danh 
gọi là trường (field). 
12.2.2 Khai báo 
Kiểu dữ liệu cấu trúc được khai báo theo cú pháp như sau: 
Cú pháp khai báo kiểu cấu trúc 
struct 
{ 
 ; 
 ; 
 … 
 ; 
}; 
Ví dụ: 
 struct SinhVien 
{ 
 char hoten[30]; 
 float toan, ly, hoa; 
}; 
Khai báo biến có thể dựa trên khai báo kiểu (không tường 
minh) như sau: 
Cú pháp khai báo biến cấu trúc (không tường minh) 
struct 
{ 
 ; 
 ; 
 … 
 ; 
}; 
struct ; 
84 Chương 12. Một số kiểu dữ liệu nâng cao 
Hoặc khai báo biến trực tiếp (tường minh) như sau: 
Cú pháp khai báo biến cấu trúc (tường minh) 
struct 
{ 
 ; 
 ; 
 … 
 ; 
} ; 
Ví dụ: 
 struct SinhVien 
{ 
 char hoten[30]; 
 float toan, ly, hoa; 
} sv1, sv2, sv3; // Tuong minh 
struct SinhVien sv4, sv5; // Khong tuong minh 
Cách khai báo dạng tường minh cho ta dễ nhận thấy mối 
quan hệ giữa biến và trường. Tuy nhiên trong cấu trúc chương 
trình của C thường đòi hỏi khai báo tham số bằng định danh 
kiểu nên việc khai báo tường minh như trên ít được sử dụng. 
Để khởi tạo giá trị cho biến cấu trúc, ta sử dụng cách sau: 
Cú pháp khai báo biến bản ghi (tường minh) 
struct 
{ 
 ; 
 ; 
 … 
 ; 
} = {,…,}; 
Chương 12. Một số kiểu dữ liệu nâng cao 85 
Ví dụ: 
 struct SinhVien 
{ 
 char hoten[30]; 
 float toan, ly, hoa; 
} sv1 = {“Nguyen Van A”, 10, 7.5, 9}, sv2, td3; 
12.2.3 Truy xuất dữ liệu kiểu bản ghi 
Chúng ta không thể nhập xuất trực tiếp dữ liệu kiểu cấu trúc 
mà chỉ có thể nhập xuất thông qua các trường của cấu trúc đó. 
Để truy xuất đến trường của cấu trúc ta sử dụng toán tử chấm. 
Cú pháp truy xuất đến các trường của cấu trúc 
. 
Ví dụ 
 struct SinhVien sv; 
strcpy(sv.hoten, “Nguyen Van A”); 
sv.toan = 10; 
sv.ly = 7.5; 
sv.hoa = 9; 
printf(“Ho ten sinh vien: %s\n”, sv.hoten); 
printf(“DTB: %.2f”, (sv.toan + sv.ly + sv.hoa)/3); 
12.2.4 Gán dữ liệu kiểu bản ghi 
Đối với 2 dữ liệu bản ghi có cùng kiểu, chúng ta có thể thực 
hiện phép gán theo các cách sau đây: 
Thông qua các trường (tường minh) 
. := 
.;
. := 
.;
… 
86 Chương 12. Một số kiểu dữ liệu nâng cao 
Sử dụng lệnh gán 
 = ; 
Ví dụ: 
 struct SinhVien 
{ 
 char hoten[30]; 
 float toan, ly, hoa; 
} sv1 = {“Nguyen Van A”, 10, 7.5, 9}, sv2; 
sv2 = sv1; // Cach 1 
strcpy(sv2.hoten, sv1.hoten); // Cach 2 
sv2.toan = sv1.toan; 
sv2.ly = sv1.ly; 
sv2.hoa = sv1.hoa; 
12.3 Kiểu tập tin (file) và kiểu con trỏ (pointer) 
Các kiểu dữ liệu ta đã khảo sát đều hiện diện trong bộ nhớ 
RAM khi khởi động chương trình, nhưng khi chấm dứt chương 
trình các dữ liệu trên bị xóa mất, vì vậy việc lưu trữ dữ liệu lâu 
dài hoặc sử dụng lại nhiều lần không thể thực hiện được. C đã 
tạo một kiểu cho phép ta lưu trữ dữ liệu lâu dài trên đĩa mềm 
hoặc đĩa cứng gọi là dữ liệu kiểu file. Có hai loại tập tin là tập 
tin văn bản (text file) và tập tin nhị phân (binary file). 
Kiểu con trỏ (pointer) là một loại dữ liệu có kích thước 2 
byte, không dùng để chứa dữ liệu mà là chứa địa chỉ Segment và 
Offset của một biến khác hay nói cách khác biến con trỏ đang 
trỏ đến biến mà nó đang chứa địa chỉ. Biến con trỏ được sử dụng 
trong cách bài toán quy hoạch động… 
Trong khuôn khổ chương trình Tin học cơ sở A sẽ không 
bàn đến hai kiểu này. Sinh viên có thể tham khảo các tài liệu 
chương trình Tin học cơ sở A2 để tìm hiểu thêm.
Chương 12. Một số kiểu dữ liệu nâng cao 87 
Bài tập cuối chương 
Lý thuyết 
1. Trình bày khái niệm kiểu chuỗi? Mô tả cách khai báo và 
sử dụng nó. 
2. Trình bày khái niệm kiểu cấu trúc? Mô tả cách khai báo 
kiểu, biến, hằng bản ghi. Cho ví dụ minh họa. 
Thực hành 
3. Tập sử dụng các hàm trong thư viện string.h 
4. Để biết một thí sinh đậu hay rớt trong một kỳ tuyển sinh, 
ta cần lưu các thông tin như Họ tên thí sinh, khu vực (1, 
2, 3), nhóm (1, 2, 3), tổng điểm 3 môn. 
a. Nhập thông tin n thí sinh. 
b. Lập danh sách các thí sinh đậu với điểm chuẩn 
như bảng sau: 
 Khu vực 1 Khu vực 2 Khu vực 3 
Nhóm 1 18 17 16 
Nhóm 2 17.5 16.5 15.5 
Nhóm 3 17 16 15 
c. In danh sách đã sắp xếp theo điểm giảm dần. 

File đính kèm:

  • pdfGiáo trình Tin học cơ sở A (Ngôn ngữ lập trình C) - Đặng Bình Phương.pdf