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
à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:
- Giáo trình Tin học cơ sở A (Ngôn ngữ lập trình C) - Đặng Bình Phương.pdf