Giáo trình Cơ sở lập trình: Phần 2
Số trang: 114
Loại file: pdf
Dung lượng: 2.36 MB
Lượt xem: 28
Lượt tải: 0
Xem trước 10 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Giáo trình "Cơ sở lập trình" được biên soạn làm giáo trình cho sinh viên hệ đại học chuyên ngành Quản trị hệ thống thông tin thị trường và thương mại; đồng thời là tài liệu tham khảo cho các giáo viên trong quá trình giảng dạy môn học. Giáo trình kết cấu gồm 5 chương và chia thành 2 phần, phần 2 trình bày những nội dung về: mảng, xâu ký tự và con trỏ; hàm; kiểu dữ liệu có cấu trúc;... Mời các bạn cùng tham khảo!
Nội dung trích xuất từ tài liệu:
Giáo trình Cơ sở lập trình: Phần 2 Chương 3 MẢNG, XÂU KÍ Tự VÀ CON TRỎ 3.1. MẢNG VÀ XÂU 3.1.1. Mảng Để giải quyết các trường hợp cần phải làm việc với một số lượng lớn các biến có cùng kiểu dữ liệu với nhau, ngôn ngữ c cung cấp một loại biến đặc biệt gọi là mảng. Màng là một dãy các phần tử có cùng kiểu dữ liệu được đặt liên tiếp trong bộ nhớ và có thể truy xuất đến từng phần tử thông qua chỉ số mảng. Chỉ số màng là thành phần được đặt trong cặp [ ] và đứng sau tên của mảng. Điều này có nghĩa là, chúng ta có thể lưu 5 giá trị kiểu int mà không cần phải khai báo 5 biến khác nhau.Ví dụ, một mảng chứa 5 giá trị nguyên kiểu int có tên là a có thể được biểu diễn như sau: 0 i 2 3 4 2B 2B 2B 2B 2B Trong đó mỗi một ô trống biểu diễn một phần tử của mảng, trong trường hợp này là các giá trị nguyên kiểu int. Chúng được đánh số từ 0 đến 4 vì phần tử đầu tiên của mảng luôn là 0 bất kể độ dài của nó là bao nhiêu. Như vậy với một mảng được hiểu như sau: - Tập hợp các phần tử cùng kiểu. - Các phần tử phân biệt bởi chi số mảng - Mỗi phần tử như một biến đơn có địa chỉ liên tiếp trong ô nhớ - Kiểu mảng là kiểu các phần tử Thông tin về mảng sẽ phải bao gồm: - Kiểu mảng. Ví dụ như int 77 - Tên mảng. Ví dụ như a. Tên mảng được đặt cũng phải tuân thủ theo qui tắc đặt tên. - Số các phần tử hay kích thước của mảng. Như ví dụ trên thì số các phần tử của mảng là 5. Cú pháp chung nhất khi khai báo một mảng được định nghĩa như sau: [sizel][[size2][...[sizeN]]]; Trong đó: Kiểu dữ liệu là các kiểu dữ liệu cơ sở như đà định nghĩa ở trên; Tên mảng là tên được đặt cho mảng. Sizel, size2,.., sizeN là các số qui định kích cỡ của mảng hoặc số phần tử ưong mảng, số lượng thành phần [] được đặt sau tên mảng sẽ qui định chiều của mảng đó. Ví dụ int a[10] ; a là mảng một chiều kiểu nguyên gồm có 10 phần từ là a[0], a[l],.., a[8], a[9] hoặcint arr[2][3]; arr là mảng hai chiều kiểu nguyên gồm có 2x3 = 6 phần tử. arr[0][0], arr[0][l], arr[0][2], arr[l][0]> arr[l][l], arr[l][2]. Chú ý: Các lỗi thường gặp: int n,m; int a[n][m]; //n, m chưa xác định Chú ý: sizel,size2..sizeN của biến màng ở bên trong cặp ngoặc n phải là một giá trị hằng khi khai báo một mảng, vì mảng là một khối nhớ tĩnh có kích cỡ xác định và trình biên dịch phải có khả năng xác định xem cần bao nhiêu bộ nhớ để cấp phát cho mảng trước khi các lệnh có thể được thực hiện. Vì thế các câu lệnh viết như trên là sai, chương trình sẽ báo các lỗi như: 78 expected constant expression (cần một biểu thức hằng) cannot allocate an array of constant size 0 (không thể cấp phát một mảng kích thước 0) 'a': unknown size (a: không biết kích cỡ) 3.1.1.1. Khởi tạo mảng Khi khai báo một màng với tầm hoạt động địa phương (trong một hàm), theo mặc định nó sẽ không được khởi tạo, vì vậy nội dung của nó là không xác định cho đến khi chúng ta lưu các giá trị lên đó. Nếu chúng ta khai báo một màng toàn cục (bên ngoài tất cả các hàm) nó sẽ đựợc khởi tạo và tất cà các phần tử được đặt băng 0 nếu là mảng có dữ liệu kiểu số và NULL nếu màng có dữ liệu kiểu con trỏ. Vì vậy nếu chúng ta khai báo mảng toàn cục: char a[5]; thì mọi phần tử của a sẽ được khởi tạo là 0: 0 12 3 4 00000000 00000000 00000000 00000000 00000000 Tuy nhiên, khi khai báo một mảng, chúng ta có thể gán các giá trị khởi tạo cho từng phần tử của nó. Ví dụ: char a[5] = {0,1,4,3,2}; lệnh trên sẽ khai báo một màng như sau: 0 12 3 4 00000000 00000001 00000100 00000011 00000010 Hay nếu viết theo giá trị thập phân sẽ là: 0 12 3 4 0 1 4 3 2 79 Điều này tương đương với khi khởi tạo a[0] =0, a[l] = 1, a[2] = 4, a[3] = 3,a[4] = 2 Tuy nhiên, khi khỏi tạo, có thể không cần khởi tạo hết tất cả các phần tử của mảng. Có thể tổng quát như sau. Với mảng 1 chiều'. [size]={gtl,gt2,gt3,..,gtk}; (k [sizel] [size2] ={ {an,ai2,ai3,...}, {a2i,a22,a23,—}, ••• }; Khi đó: aỊ ] ,a12,a23,... là giá trị khởi đầu của hàng đầu tiên của mảng. 321,322,323,... là giá trị khởi đầu của hàng thứ hai của mảng. Ở đây số giá trị khởi đầu của mỗi hàng không yêu cầu phải giống nhau. Và giá trị khởi đầu cùa các phần tử trong mỗi hàng sẽ được gán đứng vị trí của chúng trong màng. Ví dụ int a[][4]={ {0},{l,3,5}, {2,4,6,8} } Lúc này: a[0] [0] =0 a[l][0]=l, a[l][l]=3, a[l][2]=5, và a[2][0]=2, a[2][l]=4, a[2][2]=6, a[2][3]=8 Ngoài ra mảng hai chiều còn có cách khởi tạo khác như sau: [sizel][size2] ={gtl, gt2,..,gtk}; (k Ví dụ a[3][2]={l,2,3,4,5,6}; Hoặc: [] [size2J ={gtl, gt2,..,gtk}; thì mảng có được sẽ được cấp phát cho số dòng là sizel = [k/m] +1 và các phần tử của mảng lại được khởi tạo theo đúng qui trình lần lượt hết các phần tử ở dòngl, rồi đến dòng2,.. đến dòng k. 3.1.1.2. Truy xuất đến các phần tử của mảng Ờ bất kì điểm nào của chương trình trong tầm hoạt động của mảng, chúng ta có thể truy xuất từng phần tử của mảng để đọc hay chỉnh sửa như là đối với một biến bình thường, ...
Nội dung trích xuất từ tài liệu:
Giáo trình Cơ sở lập trình: Phần 2 Chương 3 MẢNG, XÂU KÍ Tự VÀ CON TRỎ 3.1. MẢNG VÀ XÂU 3.1.1. Mảng Để giải quyết các trường hợp cần phải làm việc với một số lượng lớn các biến có cùng kiểu dữ liệu với nhau, ngôn ngữ c cung cấp một loại biến đặc biệt gọi là mảng. Màng là một dãy các phần tử có cùng kiểu dữ liệu được đặt liên tiếp trong bộ nhớ và có thể truy xuất đến từng phần tử thông qua chỉ số mảng. Chỉ số màng là thành phần được đặt trong cặp [ ] và đứng sau tên của mảng. Điều này có nghĩa là, chúng ta có thể lưu 5 giá trị kiểu int mà không cần phải khai báo 5 biến khác nhau.Ví dụ, một mảng chứa 5 giá trị nguyên kiểu int có tên là a có thể được biểu diễn như sau: 0 i 2 3 4 2B 2B 2B 2B 2B Trong đó mỗi một ô trống biểu diễn một phần tử của mảng, trong trường hợp này là các giá trị nguyên kiểu int. Chúng được đánh số từ 0 đến 4 vì phần tử đầu tiên của mảng luôn là 0 bất kể độ dài của nó là bao nhiêu. Như vậy với một mảng được hiểu như sau: - Tập hợp các phần tử cùng kiểu. - Các phần tử phân biệt bởi chi số mảng - Mỗi phần tử như một biến đơn có địa chỉ liên tiếp trong ô nhớ - Kiểu mảng là kiểu các phần tử Thông tin về mảng sẽ phải bao gồm: - Kiểu mảng. Ví dụ như int 77 - Tên mảng. Ví dụ như a. Tên mảng được đặt cũng phải tuân thủ theo qui tắc đặt tên. - Số các phần tử hay kích thước của mảng. Như ví dụ trên thì số các phần tử của mảng là 5. Cú pháp chung nhất khi khai báo một mảng được định nghĩa như sau: [sizel][[size2][...[sizeN]]]; Trong đó: Kiểu dữ liệu là các kiểu dữ liệu cơ sở như đà định nghĩa ở trên; Tên mảng là tên được đặt cho mảng. Sizel, size2,.., sizeN là các số qui định kích cỡ của mảng hoặc số phần tử ưong mảng, số lượng thành phần [] được đặt sau tên mảng sẽ qui định chiều của mảng đó. Ví dụ int a[10] ; a là mảng một chiều kiểu nguyên gồm có 10 phần từ là a[0], a[l],.., a[8], a[9] hoặcint arr[2][3]; arr là mảng hai chiều kiểu nguyên gồm có 2x3 = 6 phần tử. arr[0][0], arr[0][l], arr[0][2], arr[l][0]> arr[l][l], arr[l][2]. Chú ý: Các lỗi thường gặp: int n,m; int a[n][m]; //n, m chưa xác định Chú ý: sizel,size2..sizeN của biến màng ở bên trong cặp ngoặc n phải là một giá trị hằng khi khai báo một mảng, vì mảng là một khối nhớ tĩnh có kích cỡ xác định và trình biên dịch phải có khả năng xác định xem cần bao nhiêu bộ nhớ để cấp phát cho mảng trước khi các lệnh có thể được thực hiện. Vì thế các câu lệnh viết như trên là sai, chương trình sẽ báo các lỗi như: 78 expected constant expression (cần một biểu thức hằng) cannot allocate an array of constant size 0 (không thể cấp phát một mảng kích thước 0) 'a': unknown size (a: không biết kích cỡ) 3.1.1.1. Khởi tạo mảng Khi khai báo một màng với tầm hoạt động địa phương (trong một hàm), theo mặc định nó sẽ không được khởi tạo, vì vậy nội dung của nó là không xác định cho đến khi chúng ta lưu các giá trị lên đó. Nếu chúng ta khai báo một màng toàn cục (bên ngoài tất cả các hàm) nó sẽ đựợc khởi tạo và tất cà các phần tử được đặt băng 0 nếu là mảng có dữ liệu kiểu số và NULL nếu màng có dữ liệu kiểu con trỏ. Vì vậy nếu chúng ta khai báo mảng toàn cục: char a[5]; thì mọi phần tử của a sẽ được khởi tạo là 0: 0 12 3 4 00000000 00000000 00000000 00000000 00000000 Tuy nhiên, khi khai báo một mảng, chúng ta có thể gán các giá trị khởi tạo cho từng phần tử của nó. Ví dụ: char a[5] = {0,1,4,3,2}; lệnh trên sẽ khai báo một màng như sau: 0 12 3 4 00000000 00000001 00000100 00000011 00000010 Hay nếu viết theo giá trị thập phân sẽ là: 0 12 3 4 0 1 4 3 2 79 Điều này tương đương với khi khởi tạo a[0] =0, a[l] = 1, a[2] = 4, a[3] = 3,a[4] = 2 Tuy nhiên, khi khỏi tạo, có thể không cần khởi tạo hết tất cả các phần tử của mảng. Có thể tổng quát như sau. Với mảng 1 chiều'. [size]={gtl,gt2,gt3,..,gtk}; (k [sizel] [size2] ={ {an,ai2,ai3,...}, {a2i,a22,a23,—}, ••• }; Khi đó: aỊ ] ,a12,a23,... là giá trị khởi đầu của hàng đầu tiên của mảng. 321,322,323,... là giá trị khởi đầu của hàng thứ hai của mảng. Ở đây số giá trị khởi đầu của mỗi hàng không yêu cầu phải giống nhau. Và giá trị khởi đầu cùa các phần tử trong mỗi hàng sẽ được gán đứng vị trí của chúng trong màng. Ví dụ int a[][4]={ {0},{l,3,5}, {2,4,6,8} } Lúc này: a[0] [0] =0 a[l][0]=l, a[l][l]=3, a[l][2]=5, và a[2][0]=2, a[2][l]=4, a[2][2]=6, a[2][3]=8 Ngoài ra mảng hai chiều còn có cách khởi tạo khác như sau: [sizel][size2] ={gtl, gt2,..,gtk}; (k Ví dụ a[3][2]={l,2,3,4,5,6}; Hoặc: [] [size2J ={gtl, gt2,..,gtk}; thì mảng có được sẽ được cấp phát cho số dòng là sizel = [k/m] +1 và các phần tử của mảng lại được khởi tạo theo đúng qui trình lần lượt hết các phần tử ở dòngl, rồi đến dòng2,.. đến dòng k. 3.1.1.2. Truy xuất đến các phần tử của mảng Ờ bất kì điểm nào của chương trình trong tầm hoạt động của mảng, chúng ta có thể truy xuất từng phần tử của mảng để đọc hay chỉnh sửa như là đối với một biến bình thường, ...
Tìm kiếm theo từ khóa liên quan:
Cơ sở lập trình Giáo trình Cơ sở lập trình Xâu ký tự Khai báo biến con trỏ Cấu trúc tổng quát của hàm Khai báo mảng cấu trúc Dữ liệu kiểu enumGợi ý tài liệu liên quan:
-
Bài giảng cơ sở lập trình nâng cao - Chương 8
37 trang 31 0 0 -
114 trang 30 0 0
-
Bài giảng Lập trình nâng cao (Advanced Programming) - Chương 7: Con trỏ
56 trang 30 0 0 -
Bài giảng Cơ sở lập trình 2: Chương 2 - Lê Quý Tài
47 trang 27 0 0 -
Bài giảng Cơ sở lập trình - ĐH Thương Mại
0 trang 27 0 0 -
Tài liệu học tập môn Tin cơ sở: Phần 2 - Phùng Thị Thu Hiền
80 trang 26 0 0 -
107 trang 26 0 0
-
Bài giảng Cơ sở lập trình: Struct (Kiểu cấu trúc) - Trịnh Tấn Đạt
35 trang 26 0 0 -
Bài giảng Cơ sở lập trình 2: Chương 6 - Lê Quý Tài
14 trang 24 0 0 -
Giáo trình Cơ sở lập trình: Phần 1
77 trang 23 0 0