Professional Documents
Culture Documents
KTLT 1 Mang Struct ConTro
KTLT 1 Mang Struct ConTro
1
Thông tin môn học
Ngôn ngữ : C.
• Nhập thông tin sinh viên từ bàn phím và hiện thông tin ra
màn hình.
VD: 1234-Nguyen Van A
3
Bài tập 1
4
Các bước chuẩn bị
5
C
Khai báo sử dụng thư viện
7
Nhập/xuất
Trong C hay bất cứ ngôn ngữ lập trình nào khác, việc nhập, xử
lý và xuất dữ liệu có thể được thực hiện theo hai cách:
Thông qua phương tiện nhập/xuất chuẩn (Standard
Input/Output).
Thông qua tập tin (File)
8
Nhập/xuất chuẩn
9
Hàm scanf()
Cú pháp:
scanf(“Chuỗi định dạng”, địa chỉ của các biến);
Chuỗi định dạng: dùng để qui định kiểu dữ liệu, cách biểu
diễn, độ rộng, số chữ số thập phân... Một số định dạng khi
nhập kiểu số nguyên, số thực, ký tự.
Địa chỉ của các biến: là địa chỉ (&) của các biến mà chúng
ta cần nhập giá trị cho nó. Được viết như sau: &<tên biến>
Khi nhập giá trị cho một biến thuộc kiểu dữ liệu dẫn xuất
(không phải thuộc bốn kiểu dữ liệu cơ bản char, int, float,
double), không sử dụng & trước tên biến.
10
Hàm scanf()
%d kiểu int
%ld kiểu long int
%c ký tự đơn
%s chuỗi ký tự không kết thúc
%f float hoặc double
%e tương tự như %f nhưng phần đánh dấu lũy thừa được sử
dụng
%g sử dụng cho %f hoặc %e
%x giá trị hệ cơ số 16 (base 16)
%o giá trị hệ cơ số 8 (base 8)
11
Hàm getchar(), getch() và getche()
12
So sánh scanf() và gets()
Hàm scanf khi nhập vào một chuỗi thì nó sẽ kết thúc khi
gặp một khoảng trắng, vì vậy hàm scanf rất khó lưu chuỗi
mà có chứa khoảng trắng.
Hàm gets sẽ chỉ kết thúc khi ta nhấn enter, có nghĩa là hàm
gets dễ dàng lưu được một chuỗi mà có chứa khoảng trắng.
fflush(stdin);
Lệnh xóa này sẽ cho phép tránh được cách ảnh hưởng do
quá trình nhập liệu bởi hàm gets() và scanf()
13
Hàm printf()
Cú pháp:
printf(“Chuỗi định dạng ”, Các biểu thức);
Chuỗi định dạng: dùng để qui định kiểu dữ liệu, cách biểu
diễn, độ rộng, số chữ số thập phân... Một số định dạng khi
đối với số nguyên, số thực, ký tự.
Các biểu thức: là các biểu thức mà chúng ta cần xuất giá trị
của nó lên màn hình, mỗi biểu thức phân cách nhau bởi dấu
phẩy (,).
14
Hàm puts(), putch(), putchar()
15
Ví dụ
16
Ví dụ
17
Bài tập 2
Bài tập 2: File input.txt chứa thông tin như sau:
Nguyen Van A
• Đọc file input.txt và đưa thông tin ra màn hình.
18
Các bước chuẩn bị đọc/ghi file
Tại vị trí lưu bài code -> tạo file đầu vào.
Mở file input điền thông tin “Nguyen Van A”, sau đó save
và đóng lại
Tại cửa sổ code -> Code các thư viện và hàm main()
19
Cấu trúc đọc/ghi file
Cú pháp:
FILE *f = fopen(“file”,“kiểu xử lý file”);
// Các câu lệnh xử lý khác
fclose(f);
"w": chế độ ghi text
20
Cấu trúc đọc/ghi file
Cú pháp đọc :
FILE *fi = fopen(“input.txt”,“r”); // mở file để đọc
// Các câu lệnh đọc nội dung file
fclose(fi);
Cú pháp ghi :
FILE *fo = fopen(“output.txt”,“w”); // mở file để ghi
// Các câu lệnh ghi nội dung file
fclose(fo);
21
Đọc/ghi file
22
Đọc/ghi file
23
Đọc/ghi file
Đọc một chuỗi ký tự từ một tập tin với kích thước tối đa cho
Ý nghĩa
phép, hoặc gặp ký tự xuống dòng.
char s[80];
Ví dụ
fgets(s, 80, fi);
24
Đọc/ghi file
char c;
Ví dụ
c = fgetc(fi);
25
Đọc/ghi file
fprintf(), fputs()
Ý nghĩa Ghi dữ liệu theo một định dạng nào đó vào tập tin.
Ví dụ fprintf(fo,“%d”,x);
26
Đọc/ghi file
fprintf(), fputs()
27
Đọc/ghi file
fread(), fwrite()
28
Đọc/ghi file
fread(), fwrite()
29
Bài tập 2
30
Bài tập 2
31
Đa dữ liệu
32
Mảng 1 chiều
Định nghĩa: Mảng là một tập hợp tuần tự các phần tử có cùng
kiểu dữ liệu và các phần tử được lưu trữ trong một dãy các ô
nhớ liên tục trên bộ nhớ. Các phần tử của mảng được truy cập
bằng cách sử dụng “chỉ số”. Mảng có kích thước N sẽ có chỉ
số từ 0 tới N – 1.
Ví dụ: Ví dụ, với N = 5, khi đó chỉ số mảng(tiếng anh là
index) sẽ có giá trị từ 0 tới 4(5-1) tương ứng với 5 phần tử.
33
Khai báo mảng 1 chiều
34
Nhập/xuất các phần tử mảng
Để nhập dữ liệu cho các phần tử trong mảng ta cần duyệt tới
từng phần tử trong mảng và tiến hành nhập bằng một vòng for
Việc xuất các phần tử trong mảng cũng được tiến hành tương
tự:
35
Bài tập 3
Bài tập 3: Dãy số nguyên a gồm 5 phần tử như sau:
5
13579
• Nhập thông tin từ bàn phím và hiện thông tin ra màn hình.
• Đọc thông tin từ file (tạo file chứa thông tin trên) và hiện
thông tin ra màn hình.
36
Bài tập 3
37
Bài tập
38
Kiểu cấu trúc - struct
Định nghĩa: Đối với mảng, chỉ có thể lưu nhiều thông tin có
cùng kiểu dữ liệu. Nhưng với kiểu cấu trúc ta có thể lưu thông
tin có nhiều kiểu dữ liệu khác nhau.
Mảng:
struct:
39
Kiểu cấu trúc - struct
Cấu trúc:
C1:
Ví dụ:
40
Kiểu cấu trúc - struct
41
Kiểu cấu trúc - struct
42
Kiểu cấu trúc - struct
Cấu trúc:
C2:
Ví dụ:
43
Bài tập 4
Bài tập 4: Thông tin của một sinh viên như sau:
• Nhập thông tin n sinh viên từ bàn phím và hiện thông tin ra
màn hình.
44
Bài tập 4
45
Bài tập 4
46
Ví dụ
47
Ví dụ
Trả lời
Mỗi biến mà bạn khai báo đều có địa chỉ riêng của nó và
giá trị mà nó đang lưu trữ. Để xem được địa chỉ của biến,
bạn thêm dấu & vào trước tên biến.
Để nhận giá trị địa chỉ là hexa, thay %d bằng %x là được.
48
Con trỏ
Định nghĩa:
Con trỏ cũng là một kiểu dữ liệu, dữ liệu này không phải số
hay kí tự, nó là kiểu dữ liệu địa chỉ
Về bản chất con trỏ cũng như một biến bình thường: nó
cũng có tên biến, giá trị của biến, địa chỉ của biến.Nhưng
có điểm khác là:
Những biến bình thường thì nó chỉ nằm cố định trong 1 ô
nhớ, còn biến con trỏ thì nó còn có thể trỏ đến các ô nhớ
khác nhau.
49
Con trỏ
50
Con trỏ
51
Con trỏ
52
Con trỏ
53
Ví dụ
54
Ví dụ
55
Ví dụ
56
Vùng nhớ
Code Segment: Lưu trữ mã máy
dạng nhị phân.Chỉ chịu sự chi phối
của HĐH, người lập trình không can
thiệp trực tiếp vào phân vùng này.
57
Bài tập
Chạy trình biên dịch sau:
58
Con trỏ và mảng
59
Con trỏ và mảng
60
Con trỏ và mảng
Địa chỉ của biến mảng chính là địa chỉ của phần tử đầu tiên
của mảng
Các phần tử liên tiếp có địa chỉ cách đều nhau, nên ta chắc
chắn các phần tử mảng được xếp cạnh nhau trong bộ nhớ.
Tóm lại, &a[i] tương đương với a+i và a[i] tương đương
với *(a+i).
61
Con trỏ và mảng
62
Cấp phát bộ nhớ
Trong lập trình C có 3 cơ chế cấp phát:
• malloc.
• calloc.
• realloc.
63
Cấp phát bộ nhớ - malloc.
malloc.
tên con trỏ = (kiểu con trỏ *) malloc (n*sizeof(kiểu con trỏ));
• Dùng hàm malloc() phải xác định rõ số byte của bộ nhớ cần cấp
phát. Hàm này trả về con trỏ kiểu void cho phép chúng ta có thể ép
kiểu về bất cứ kiểu dữ liệu nào.
• Kết quả trả về :Trả về địa chỉ byte đầu tiên của vùng nhớ đc cấp
phát, con trỏ null nếu cấp phát thất bại
64
Cấp phát bộ nhớ - malloc.
int *p;
• Trong vd trên thực hiện cấp phát cho việc lưu trữ 100 số nguyên.
Giả sử sizeof int là 4, khi đó lệnh dưới đây thực hiện cấp phát 400
bytes. Khi đó, con trỏ p sẽ có giá trị là địa chỉ của byte dữ liệu
đầu tiên trong khối bộ nhớ vừa cấp phát.
65
Cấp phát bộ nhớ - calloc.
calloc.
tên con trỏ = (kiểu con trỏ *) calloc (n, sizeof(kiểu con trỏ));
• Hàm calloc() nhận vào 2 tham số là số ô nhớ (số phần tử) muốn
khởi tạo và kích thước của 1 ô nhớ (kích thước mỗi phần tử).
• Kết quả trả về :Con trỏ sẽ trỏ tới vùng nhớ vừa được cấp phát
thành công, con trỏ null nếu cấp phát thất bại
66
Cấp phát bộ nhớ - calloc.
int *p;
• Trong ví dụ trên, hàm calloc() thực hiện cấp phát 100 ô nhớ liên
tiếp và mỗi ô nhớ có kích thước là số byte của kiểu int. Hàm này
cũng trả về con trỏ chứa giá trị là địa chỉ của byte đầu tiên trong
khối bộ nhớ vừa cấp phát.
67
Bài tập malloc - calloc.
Trình biên dịch
68
Bài tập malloc - calloc.
Kết quả
69
Bài tập malloc - calloc.
Nếu không quan tâm đến giá trị mặc định của vùng nhớ được cấp
thì dùng malloc.
Nếu muốn tất cả giá trị của toàn bộ ô nhớ sau khi được cấp là 0 thì
dùng calloc.
int *p=(int*)malloc(size(int));
memset(p,0,10*sizeof(int));
70
Cấp phát bộ nhớ - realloc.
realloc.
tên con trỏ = (kiểu con trỏ *) realloc (tên con trỏ, số lượng cần
cấp phát*sizeof(kiểu con trỏ));
• Khi cấp phát cho biến con trỏ 1 số lượng ô nhớ nào đó mà trong
quá trình làm việc ta thiếu hoặc cần cấp phát thêm thì ta sử dụng
realloc.
• Hàm realloc nhận 2 đối số : 1 là con trỏ trả về bởi malloc() hoặc
calloc, 2 là số byte cần cấp phát lại.
71
Bài tập malloc – calloc - realloc.
realloc:
72
Giải phóng bộ nhớ
Tại sao cần phải giải phóng bộ nhớ
• Bộ nhớ khi cấp phát cho con trỏ thuộc tâng 4 HEAP, nên nếu chúng
ta không giải phóng thì ô nhớ đó sẽ không bao giờ được giải phóng
-> Tràn bộ nhớ (máy tính mới mạnh ít gặp trường hợp này).
Nếu giải phóng thì giá trị con trỏ còn hay mất ?
• Mất :Nếu sau khi giải phóng có tiền trình khác chiếm hữu ô nhớ.
73
Giải phóng bộ nhớ
Bản chất của giải phóng bộ nhớ
• Là thông báo cho chương trình biết vùng nhớ đã sử dụng xong,
HĐH có thể dùng cho tiến trình khác.
Cú pháp
74
Con trỏ đến mảng 1 chiều
75
Con trỏ đến mảng 1 chiều
76
Con trỏ và Struct
Struct SinhVien Struct SinhVien
{ {
char hoten[20]; char hoten[20];
int tuoi; int tuoi;
float dtb; float dtb;
}sv; }*sv1;
77
Con trỏ và Struct
Để truy cập để lấy dữ liệu các thành phần của con trỏ cấu trúc ta có
3 cách sau:
• Cách 1: Mang[i].dtb;
• Cách 2: (*(Mang+i)).dtb;
78
Bài tập 2
79