ả
à tập hợp của các biến cùng kiểu gọi là kiểu ph tử được xếp liên tiếp nhau trong bộ nhớ trong. Kiểu phần tử có thể là có các kiểu bất kỳ: ký tự số bản
a) Cách khai báo mảng Kiểu phần_tử Tên_ mảng [
Ở đây là một biểu thức xác định số phần tử trong mảng và phải định ra một trị nguyên dương.
là số chi âi của mảng, k>=1. Khi k=1 ta có mảng I chỉ âi, k=2 ta có mảng 2 chỉ âi...
dụ
Ví dụ 2: Các khai báo :
sẽ xác định 4 mảng và ý nghĩa của chúng như sau :
Thứ Kiểu
2 2 Số chỉ âi
tự mang mang thước Các phẦn tử
Bảng 4.1. Ví dụ một số mảng
Các phần tử của mang được cấp phát các khoảng nhớ liên tiếp nhau trong bộ nhớ. Nói cách khác các phần tử của mảng có địa chỉ liên tiếp nhau.
Chỉ số mảng:
Một phẦn tử cụ thể của mảng được xác định nhở các chỉ số của nó. Chỉ số của mả phải có giá trị int không vượt quá kích thước tương ứng và bất đầi tử 0. Số chỉ số phải bằng số chi cha mang. Gia str a y đã được khai báo như trên và giả sử ¡ j là các biến nguyên trong đó i=2 Khi đó :
Mảng có bao nhiêu chỉ âi thì ta phải viết nó có bấy nhiêu chỉ số. Vì thế nếu ta viết như sau sẽ là sai : y[ù] Vỡ y là mảng 2 chi õn
Biểu thức dùng làm chỉ số có thể thực. Khi đó phẦn nguyên của biểu thức thực sẽ là chỉ số mảng.
Ví dụ :
Khi chỉ số vượt ra ngoài kích thước mảng máy sẽ vẫn không báo lỗi nhưng nó sẽ truy cập đến một vùng nhớ bên ngoài mảng và có thể làm rối loạn chương trình.
Bài tập 1: Xây dựng ct nhập và xuất mảng 1 chí âi có n phần tử
Cách 2: (sử dụng hàm nhập xuất)
Khởi đâi cho mảng.
Các phẦn tử trong mảng có thể được khởi tạo giá trị ban đầu theo quy tắc sau:
Sử dụng phép gán để khởi đầi
Nếu không được khởi đi máy sẽ gán cho chúng giá trị 0.
Có thể không c3 chỉ ra kích thước số ph tử của mảng
Đối với mảng hai chiâi có thể khởi đần với số giá trị khởi đầi của mỗi hàng có thể
Ví dụ:
Mảng nhỉ âu chỉ âi (2 chỉ âi 3 chi ât...)
Chúng ta đã biết thế nào là mảng một chỉ âu. Đi âi này có nghĩa là các mảng chi có một chỉ số. Các mảng có thể có nhi âi hơn một chỉ âi. Các mảng đa chỉ âi giúp dễ dàng trình bày các đối tượng đa chi âi chẳng hạn một đ`ồ thị với các dòng và cột hay tọa độ màn hình của máy tính. Các mảng đa chỉ `âi được khai báo giống như các mảng một chi âi ngoại trừ có thêm một cặp dấu ngoặc vuông [ ] trong trưởng hợp mảng hai chỉ âi. Một mảng ba chi a sé cH ba cặp ngoặc vuông...
Bài tập 2. Nhập xuất mảng 2 chỉ âi các số nguyên
printf(“Nhap ph %h tử ở hàng %d cột %d: ”
n ’)
ự
Xâu ký tự trong C là mộ mảng các ký tự Khai bdo: char ten_xau[d6 dài]
Vi du: char str[30]
C cung cấp một số hàm làm việc với xâu ký tự các hàm này nằm trong thư viện
Tác dụng
Nhập xâu từ bàn phím Nhập giá trị cho biến xâu ký tự name từ bàn phím chấp nhận cả dấu cách
Sao chép nội dung xâu s†2 vào xâu stl Giá trị trả v`êlà 0
Lấy độ dài Cho giá trị là độ dài xâu stl
Nối 2 xâu Nối xâu s2 vào cuối st1 kết quả đặt vào stl
Tìm vị trí đầi tiên của s2 trong stl
Tìm kiếm
a ộ ố `
& ỏ
Khái niệm con trỏ và địa chỉ
Mỗi biến trong ngôn ngữ C đầu có I tên và tượng ứng với nó là một vùng nhớ dùng để chứa giá trị của nó. Tuỳ theo biến mà vùng nhớ dành cho biến có độ dài khác nhau. Địa chỉ của biến là số thứ tự của byte đầi tiên tương ứng với biến đó. Địa chỉ của biến có kiểu khác
hau đõi là số nguyờn. Địa chỉ và biến kiểu int liờn tiếp cỏch nhau 2 byte biến kiểu ủoat là 4
Con trỏ là biến dùng để chứa địa chỉ của biến khác hoặc có thể là một h nhỉ 'âi loại địa chỉ nên cũng có nhi 'âi loại biến con trỏ. Con trỏ kiểu int dùng để chứa địa chỉ
của kiểu int. Con trỏ kiểu float dùng để chứa địa chỉ kiểu float.
Muốn sử dụng được con trỏ trước tiên phải có được địa chỉ của biến mà ta cần quan âm bằng phép toán lấy địa chỉ & . Kết quả của phép lấy địa chi & sé lA 1 ph % te hang.
Ví dụ => &num là địa chỉ của num.
là 1 pointer chỉ đến một int pnum chứa địa chỉ biến int num
giả sử do * là toán tử nội dung
Hai câu lệnh sau đây là tương đương
‹ * Z tas 2 sad ~ tA ^ tas 2
Quy tac khai báo biến con trỏ < kiểu dữ liệu> * < tên biến con trỏ >
Ví dụ 2
ọ sử địa chỉ của a là < 106 >
// phép gán đúng
tương đương scanf ính toán trên biến con trỏ
a/ Hai biến con trỏ cùng kiểu có thể gán cho nhau Ví dụ 1
/ đúng // sai do khác kiểu
đúng nhờ ép kiểu con trỏ nguyên v`êkiểu float Ví dụ 2
iéu
đúng
b/ Một biến pointer có thể được cộng trừ với một số để cho kết quả là một pointer.
Ví dụ
Ví dụ mảng 10 phân tử
gán giá trị ¡ cho ph tử mà p đang trỏ đến p được tăng lên 1 để chỉ đến ph tử kế tiếp
kết quả V[0]
c/ Phép trừ 2 pointer cho kết quả là một số int biểu thị khoảng cách số phần tử giữa 2 pointer đó.
hép cộng 2 pointer là không hợp lệ pointer không được nhân chia voi 1 số nguyên hoặc nhân chia vơi nhau. `
là con trỏ p không trỏ đến đâu cả.
không được sử dụng biến con trỏ khi chưa được khởi gán Ví dụ
=> thay bằng các lệnh if ding
6 a
Mang 1 chỉ ầi và con trỏ
Trong ngôn ngữ CÐ giữa mảng và con trỏ có mối quan hệ chặt chẽ. Các phần tử của mảng có thể xác định nhờ chỉ số hoặc thông qua con trỏ.
Ví dụ
mảng A được bố trí 5 ô nhớ liên tiếp mỗi ô chiếm 2 byte
mảng là 1 hằng địa chỉ không thay đổi được chính là địa chỉ của phần tử đầi tiên. => A tương đương với &A[0]
tương đương với &A[i]
tương đương với A[i]
p trỏ tới phẦn tử A[0]) tương đương với
=>bốn cách viết như sau là tương đương Ví dụ 2
sai vì địa chỉ của a là hằng.
Các lệnh (1) (4) tương đương nhau.
Ví dụ3 Nhập 5 số nguyên vào l mảng gìn 5 phần tử a[5]) sau đó sắp xếp tăng dần ra số lớn nhất vf nhỏ nhất và tính tổng của 5 số đó.
Sấp xếp tăng dần
n số lớn nhất là %d "
" số nhỏ nhất la %d
Con trỏ va mang nhỉ chỉ âi
Phép toán lấy địa chỉ & chỉ áp dụng được với mảng 2 chi`âi kiểu nguyên. Các kiểu hác không được.
Ví dụ 1
đúng Ví dụ 2
Mảng 2 chỉ ân a[2][3] => g Gm 2 x 3 = 6 phần tử có 6 địa chỉ liên tiếp theo thứ tự sau Ph % tur
Dia chi
Ngôn ngữ C quan niệm mảng 2 chiâi là mảng một chi@ ctia mang a[2][3] tương đương không phẦn tử mà mỗi ph tử của nó g ân 3 số nguyên nên a trỏ tới hàng thứ nhất
a+1 trỏ tới hàng thứ hai
Do đó để duyệt các phần tử của mảng a[2][3] ta dùng con trỏ theo cách sau
=> ta có công thức a[i][J] = trong đó con trỏ a địa chỉ a
số cột.
chú ý lệnh này khi đó p trỏ tới a[0][0]
p+ 1 trẻ tới a[0][1]
P+2 trỏ tới a[0][2]
p+ 5 trẻ tới a[1][2]
* Tổng quát trong đóN số cột
Kết luận Mả 2 chỉ'âi có thể chuyển thành mảng 1 chỉ `ât nhờ con trỏ.
* Ví dụ để nhập một số liệu vào mảng 2 chỉ âi kiểu float a[2][3] ta có thể dùng các cách
lưu ý lệnh này
là địa chỉ
Sửa lệnh như sau
hoặc lệnh scanf
sử dụng biến trung gian
Khái niệm Cấu trúc là một kiểu dữ liệu kiểu bản ghi(record) cho phép nhí ân loại dữ liệu được nhóm lại với nhau. Khái niệm cấu trúc trong C tương tự như P
Khai báo kiểu cấu trúc tên kiểu _cấu trúc
Khai báo các thành phn của cấu trúc Trong đó :
OD struct 1a tu khoá
tên_kiểu _cấu_ trúc là một tên bất kỳ do người lập trình tự đặt theo qui tấc đặt tên Thành ph n của cấu trúc có thể là : biến mảng cấu trúc khác đã được định nghĩa trước đó vv..
Ví dụ 1:
Đoạn chương trình :
mô tả một kiểu cấu trúc có tên là gần có ba thành phần : Biến nguyên mảng và biến nguyên
Ví dụ 2:
tạo ra kiểu cấu trúc có tên là gồm có năm thành ph. Ba thành phần đầi không có gì cần nói thêm. Chỉ có hai thành phần còn lại là các cấu trúc
được xây dựng theo cấu trúc được định nghĩa trong ví dụ 1.
Định nghĩa cấu trúc bằng typedef :
Có thể dùng toán tử typedef để định nghĩa các kiểu cấu trúc ở trên như sau :
.5.2. Truy nhập đến các thành ph cấu trúc :
Việc xử lý một cấu trúc bao giờ cũng phải được thực hiện thông qua các thành ph n của nó. Để truy cập đến một thành phần cơ bản là biến hoặc mảng của một cấu trúc ta sử dụng một trong các cách viết sau biến_cấu_trúc.tên_ thành_ph n
Ví dụ:
//biến x và mảng a là các biến có kiểu cấu trúc nhancong x.ten //truy cập đến thành ph % ten của biến cấu trúc x
x.bacluong // truy cập đến thành phần bacluong của biến cấu trúc x
a[i].ten // truy cập đến thành ph ten của biến cấu trỳc a[ù]
i].ngaysinh.ngaythu // truy cập đến thành phần ngaythu của thành phẦn ngaysinh của
Với biến cấu trúc là con trỏ thì ta viết
Tén_con_trd >Tén_thanh_ph% hoac (*Tén_con_trd).Tén_thanh_ph Vi du:
//biến p là biến con trỏ có kiểu cấu trúc
>t†en //truy cập đến thành ph ten của biến cấu trúc p
>bacluong // truy cập đến thành phần bacluong của biến cấu trúc p hoặc
(*p).ten //truy cập đến thành phẦn ten của biến cấu trúc p
bacluong // truy cập đến thành phần bacluong của biến cấu trúc p .3. Bài toán cơ bản
Thông tin của sinh viên gầm: tên (xâu ký tự) mã số (số nguyên) điểm môn Toán (số thực) điểm môn tin đại cương(số thực) điểm môn tiếng Anh (số thực) Viết chương trình thực hiện các công việc sau:
Khai báo cấu trúc mô tả thông tin trên Nhập n sinh viên
Hiển thị danh sách đó.
Tìm các sinh viên có điểm trung bình thỏa mãn một tiêu chuẩn nào đó (ví dụ điểm điểm trung bình là tổng điểm 3 môn chia 3
Sắp xếp danh sách sv theo mã sinh viên
//khai báo cấu tric SV
//nhập thông tin cho I sv
/Hính điểm trung binh cho 1 sv //nhập 1 danh sách n sv
//hiển thị thông tin của l sv
/iển thị toàn bộ danh sách n sinh viên
//liệt kê các sinh viên điểm trung bình >=7.0
/lsấp xếp danh sách sinh viên theo mã
//gọi hàm nhập danh sách
a a
1. Đếm số lần xuất hiện của các số nguyên dương trong mảng Ichi âi hoặc 2 chỉ âi 2. Tính tổng tẩt cả các phần tử không âm trong mảng
3. Nhập vào một chuỗi ký tự
Chuyển toàn bộ các chữ cái hoa v`êchữ thưởng và ngược lại
Cat các dấu cách thừa giữa các từ sao cho đi và cuối chuỗi không có dấu cách giữa hai tử chỉ có một dấu cách
Chuyển chuỗi họ tên về dạng tên riêng. Ví dụ: NgueyN AnH vAn chuyển thành
4. Thông tin của công nhân g Gm: họ tên (xâu ký tự) năm sinh (số nguyên) lương (số thực). Viết chương trình thực hiện các công việc sau:
Khai báo cấu trúc mô tả thông tin trên Nhập n công nhân
Hiển thị danh sách các công nhân có lương >5 triệu Sấp xếp danh sách công nhân tăng d3 theo lương.
In ra cỏc số nguyờn tố trong mảng ứ ồn n số nguyờn.
Tìm số lớn nhất trong mảng các số thực có n ph tử.
7. Nhập vào một mảng các số nguyên. Chuyển các số lẻ lên đt, các số chắn xuống cuối mảng. In kết quả ra màn hình. Ví dụ: đầu vào là 2, 13, 15, 22, 16, 18, 3. Kết quả là 13,
CHƯƠNG .... DƯ LIỆU KIỂU TỆP ệ tệ
Tệp tin hay tệp dữ liệu là một tập hợp các dữ liệu có liên quan với nhau và có cùng một kiểu được nhóm lại với nhau thành một dãy. Chúng thưởng được chứa trong một thiết bị nhớ ngoài của mấy tính (đĩa mềân đĩa cứng ..) đưới một cái tên nào đó. Đây cũng là một loại dữ liệu có cấu trúc.
Tệp được chứa trong bộ nhớ ngoài đi'âi đó có nghĩa là tệp được lưu trữ để dùng nhi`âi Lần và tần tại ngay cả khi chương trình kết thúc hoặc mất điện. Chính vì lý do trên những dữ liệu nào cần lưu trữ như h`sơ chẳng hạn) thì ta nên dùng đến tệp.
Tệp là một kiểu dữ liệu có cấu trúc. Định nghĩa tệp có phần nào giống mảng ở chỗ chúng đt là tập hợp của các phần tử dữ liệu cùng kiểu song mảng thưởng có số phần tử cố định số phần tử của tệp không được xác định trong định nghĩa.
các thao tác tệp được thực hiện nhở các hàm thư viện. Các hàm này được chia nhóm 1 và nhóm 2. Các hàm cấp | 1a các hàm nhập / xuất hệ thống thực hiện việc đọc ghi như DOS. Các hàm cấp 2 làm việc với tệp thông qua một biến con trỏ tệp.
Do các hàm cấp 2 có nhi êi kiểu truy xuất và dễ dùng hơn so với các hàm cấp 1 nên trong các chương trình viết trong C các hàm cấp 2 hay được sử dụng hơn.
Một tệp tin dù được xây dựng bằng cách nào đi nữa cũng chỉ đơn giản là một dãy các byte ghi trên đĩa (có giá trị từ 0 đến 255). Số byte của dấy chính là độ dài của tệp.
Khai báo sử dụng tệp:
Để khai báo sử dụng tệp ta dùng lệnh sau: FILE biến_con_ trỏ tệp
Trong đó biến con trỏ tệp có thể là biến đơn hay một danh sách các biến phân cách nhau bởi dấu phảy (dấu
Ví dụ: /¡ Khai báo hai biến con trỏ tệp
ấ ạ Ệ
Có hai kiểu nhập xuất dữ liệu lên tệp Nhập xuất nhị phân và nhập xuất văn bản.
Nhập xuất nhị phân
Dữ liệu ghi lên tệp theo các byte nhị phân như bộ nhớ trong quá trình nhập xuất dữ liệu không bị biến đổi.
LH Khi đọc tệp nếu gặp cuối tệp thì ta nhận được mã kết thúc tệp EOE được định nghĩa trong stdio.h bằng 1) và hàm feof cho giá trị khác 0.
Nhập xuất văn bản:
H Kiểu nhập xuất văn bản chỉ khác kiểu nhị phân khi xử lý ký tự chuyển dòng và ký tự mã 26. Đối với các ký tự khác hai kiểu đâu đọc ghi như nhau.
L1 Mã chuyển dòng một ký tu LF (ma 10) được chuyển thành 2 ky ty CR (ma Khi doc 2 ky ty lién tiép CR va LF trén tép chi cho ta mét ky tu LF
Mã kết thúc tệp
Trong khi đọc nếu gặp ký tự có mã 26 hoặc cuối tệp thì ta nhận được mã kết thúc tệp bằng àm feof(fp) cho giá trị khác 0 bằng 1).
ạ ệpđể do ữ ệ Mở tệp
Cấu trúc ngữ pháp của hàm FILE *fopen(const char *tên tệp const char *kiểu) Trong đó Đối thứ nhất là tên tệp đối thứ hai là kiểu truy nhập.
Ví dụ:
Công dụng Hàm dùng để mở tệp. Nếu thành công hàm cho con trỏ kiểu FILE ứng với tệp vừa mở. Các hàm cấp hai sẽ làm việc với tệp thông qua con trỏ này. Nếu có lỗi hàm sẽ trả v égi4 tri NULL.
Bảng sau chỉ ra các giá trị của kiểu
Tên kiểu nghĩa
Mở một tệp để đọc theo kiểu văn bản. Tệp c n đọc phải đã tần tại nếu không sé có lỗi
Mở một tệp để ghi theo kiểu văn bản. Nếu tệp đã tôn tại thì nó sẽ bị xoá.
Mở một tệp để ghi bổ xung theo kiểu văn bản. Nếu tệp chưa tần tại thì tạo tệp mới.
Mở một tệp để đọc theo kiểu nhị phân. Tệp ca đọc phải đã tần tại nếu không sẽ có lỗi.
Mở một tệp mới để ghi theo kiểu nhị phân. Nếu tệp đã tô tại thì nó sẽ bị xoá.
Mở nột tệp để ghi bổ xung theo kiểu nhị phân. Nếu tệp chưa tồn tại thì tạo tệp mới.
Mở một tệp để đọc/ghi theo kiểu văn bản. Tệp cần đọc phải đã tần tại nếu không sẽ có lỗi
Mở một tệp để đọc/ghi theo kiểu văn bản. Nếu tệp đã tôn tại thì nó sẽ bị xoá.
Mở một tệp để đọc/ghi bổ xung theo kiểu văn bản. Nếu tệp chưa tồn tại thì tạo tệp mới.
Mở một tệp để đọc/ghi theo kiểu nhị phân. Tệp cần đọc phải đã tần tại nếu không sẽ có lỗi.
Mở một tệp mới để đọc/ghi theo kiểu nhị phân. Nếu tệp đã tôn tại thì nó sẽ bị
Mở một tệp để đọc/ghi bổ xung theo kiểu nhị phân. Nếu tệp chưa tồn tại thì tạo
tệp mới.
Bảng 5.1. Các kiểu truy cập tệp tin
Trong các kiểu đọc ghi m sạch vùng đệm trước khi chuyển từ đọc sang ghi hoặc ngược lại. Ta sẽ đ'êcập đến các hàm với tính năng xoá sau này. AL
Đóng tệp
Cấu trúc ngữ pháp của hàm
Trong đó fp là con trỏ ứng với tệp c3n đóng.
Công dụng Hàm dùng để đóng tệp khi kết thúc các thao tác trên nó. Khi đóng tệp thực hiện các công việc sau
L] Khi đang shi dữ liệu thì máy sẽ đẩy dữ liệu còn trong vùng đệm lên đĩa L1 Khi đang đọc dữ liệu thì máy sẽ xoá vùng đệm
LH Giải phóng biến trỏ tệp.
L1 Nếu lệnh thành công hàm sẽ cho giá trị 0 trái lại nó cho hàm EOE.
Ví dụ
Đóng tất cả các tệp đang mở Cấu trúc ngữ pháp của hàm
Công dụng để đóng tất cả các tệp đang mở. Nếu lệnh thành công hàm sẽ cho giá trị bằng số là số tệp được đóng trái lại nó cho hàm
Ví dụ
Ghi các mẫu tin lên tệp