Tải bản đầy đủ
III. Thiết kế cấu trúc dữ liệu

III. Thiết kế cấu trúc dữ liệu

Tải bản đầy đủ

Các trường mẫu tin được liệt kê và phân biệt vào các biến thành viên của
struct HangNhap, mỗi biến tương ứng với các dữ liệu riêng phù hợ với đặc trưng
từng biến.
Cấu trúc dữ liệu hàng nhập trong một tháng:
Tên trường

Khai báo

Kiểu dữ liệu

Mã hàng

maHang

char[7]

Tên hàng

ten

char[50]

Đơn vị hàng

donVi

char[40]

Ngày nhập

ngayNhap

Int

Số lượng

soLuong

Int

Đơn giá

donGia

Int

Thành tiền

thanhTien

Int

Thực hiện khai báo:
typedef char MaHang[7];
typedef char Ten[50];
typedef char DonVi[40];
typedef int Ngay;
typedef int SoLuong;
typedef int DonGia;
typedef int ThanhTien;
typedef struct HangNhap
{
MaHang maHang;
Ten ten;
DonVi donVi;
Page 6

Ngay ngayNhap;
SoLuong soLuong;
DonGia donGia;
ThanhTien thanhTien;
} HN;
Tạo danh sách hàng nhập là một mảng danh sách đặc (danh sách đặc là danh
sách mà các phần tử được lưu trữ kế tiếp nhau trong bộ nhớ, phần tử thứ i được
lưu trữ ngay sau phần tử thứ i-1 giống như một mảng).
Khai báo mảng danh sách với số danh sách tối đa là MAXLIST = 100:
#define MAXLIST
HN A[MAXLIST];
Các biến liên quan khác:
int n; // là biến chứa nội dung là số phần tử thực trong danh sách hàng nhập
int ct; // Biến điều khiển các mục thực hiện chương trình (hiển thị, thống kê, tìm
kiếm,vv...)

Page 7

IV. Các giải thuật và tính độ phức tạp
1. Đọc dữ liệu từ file đưa và struct

File HangNhap.txt là file lưu trữ dữ liệu trong quá trình thực thi và sử dụng lâu
dài. Nó cũng như là một cơ sở dữ liệu đơn giản.
Hàm đọc file:
- Input: Dữ liệu trong file “HangNhap.txt”.
- Output: Dữ liệu đã được gia công trong struct và giá trị n các mẫu tin hàng
nhập.
- Cài đặt:
void read(HN A[], int &n){
char strHang[150]; // mảng lưu 1 dòng chuỗi khi đọc
int i = 0;
FILE *f = fopen("HangNhap.txt", "r");
fgets(strHang, 100, f); /* Đọc để loại bỏ dòng tiêu đề ban đầu của
file*/
// đọc và xử lý tách xâu từng dòng của file
while (!feof(f))

{ /* trong khi file chưa đọc hết thì còn thực hiện */

fgets(strHang, 100, f); // đọc 1 dòng đưa vào strHang
// tách chuỗi ra từng phần đưa vào các thành viên struct
strcpy(A[i].maHang, strtok(strHang, " "));
strcpy(A[i].ten, strtok(NULL, " "));
strcpy(A[i].donVi, strtok(NULL, " "));
A[i].ngayNhap = atoi(strtok(NULL, " "));
A[i].soLuong = atoi(strtok(NULL, " "));
A[i].donGia = atoi(strtok(NULL, " "));
A[i].thanhTien = atof(strtok(NULL, " "));
i++;
}
fclose(f); // sau khi đọc đóng file lại
n = i;
Page 8

}
- Tính độ phức tạp:
Nếu không kể các hàm xử lý xâu của thư viện “string.h” thì độ phức tạp của
giải thuật đọc dữ liệu là số hàng: O(n)
2. Ghi dữ liệu vào file

Các dữ liệu trong struct hiện hành được lưu vào trong file “HangNhap.txt”.
- Input: danh sách hàng nhập sau khi thực hiện các thao tác như nhập, bổ

sung, xóa
- Output: lưu lại các thay đổi vừa thự hiện vào file “HangNhap.txt”.
- Cài đặt:

void write(HN A[], int n){
int i;
FILE *f = fopen("HangNhap.txt", "w"); // mo file de ghi
if (f == NULL) thongBaoKhongLoadFile(); // neu file khong ton tai
// Ghi du lieu vao file
fprintf(f, "%3s%15s%10s%10s%10s%10s%10s",
"ID","TenHang", "DonVi", "NgayNhap", "SoLuong", "DonGia", "ThanhTien");
for (i = 0; i < n; i++) fprintf(f, "\n%3s%15s%10s%10d%10d%10d%10d",
A[i].maHang, A[i].ten, A[i].donVi, A[i].ngayNhap, A[i].soLuong, A[i].donGia,
A[i].thanhTien);
fclose(f);

// Dong file

}

- Tính độ phức tạp:
Thuật toán ghi file chỉ đơn giản là ghi n dòng từ ngăn xếp vào file và có độ
phức tạp là: O(n)
Page 9