Trong khoa học máy tính, cấu trúc dữ liệu là cách lưu dữ liệu trong máy tính sao cho nó có thể sử dụng được một cách hiệu quả. Cấu trúc dữ liệu được triển khai bằng các kiểu dữ liệu, các tham chiếu và các phép toán trên đó được cung cấp bởi một ngôn ngữ lập trình. Để giải quyết bài toán ta có thế nhiều thuật toán khác nhau, giải thuật ra đời. giải thuật là các câu lệnh chặt chẽ, rõ rang xác định một trình tự các thao tác trên một đối tượng nào đó. Khi đã xác định được cấu trúc dữ liệu thích hợ, người lập trình sẽ bắt đầu tiến hành xây dựng giải thuật tương ứng theo yêu cầu của đề bài đặt ra trên cơ sở của cấu trúc dữ liệu đã được chọn. để giải quyết một vấn đề có thể có nhiều phương pháp do vậy sự lựa chọn phương pháp phù hợp là rất quan trọng.
Trang 1Lời Mở Đầu
Trong khoa học máy tính, cấu trúc dữ liệu là cách lưu dữ liệu trong máy tính sao cho nó có thể sử dụng được một cách hiệu quả Cấu trúc dữ liệu được triển khai bằng các kiểu dữ liệu, các tham chiếu và các phép toán trên đó được cung cấp bởi một ngôn ngữ lập trình
Để giải quyết bài toán ta có thế nhiều thuật toán khác nhau, giải thuật ra đời giải thuật là các câu lệnh chặt chẽ, rõ rang xác định một trình tự các thao tác trên một đối tượng nào đó
Khi đã xác định được cấu trúc dữ liệu thích hợ, người lập trình sẽ bắt đầu tiến hành xây dựng giải thuật tương ứng theo yêu cầu của đề bài đặt ra trên cơ
sở của cấu trúc dữ liệu đã được chọn để giải quyết một vấn đề có thể có nhiều phương pháp do vậy sự lựa chọn phương pháp phù hợp là rất quan trọng
Giải thuật phản ánh các phép xử lý còn đối tượng xử lý của giải thuật lại
là dữ liệu, chính dữ liệu chứa đựng các thông tin để giải thuật để xác định được giải thuật phù hợp cần thiết phải biết nó tác động đến loại dữ liệu nào Như vậy, giải thuật và cấu trúc dữ liệu có mối quan hệ mật thiết với nhau được thể hiện qua công thức:
Như vậy, khi đã có cấu trúc dữ liệu mà chưa tìm ra giải thuật thì không thể có chương trình và ngược lại không thể có thuật giải khi chưa có cấu trúc
dữ liệu một chương trình máy tính chỉ có thể được hoàn thiện khi có đầy đủ cả cấu trúc dữ liệu để lưu trữ dữ liệu và giải thuật để xử lý dữ liệu theo yêu cầu bài toán đặt ra
Chúng em cám ơn thầy Trương Công Đoàn đã giúp chúng em hoàn thiện bài tập, tìm hiểu và hiểu biết hơn về bộ môn này
Cấu trúc dữ liệu + Giải thuật = Chương trình
Trang 2I.GIỚI THIỆU PHÂN TÍCH ĐỀ TÀI
1 Đề bài :
- Xây dựng chương trình quản lý hàng hóa gồm có các thuộc tính: tên hàng, số lượng, đơn giá, ngày sản xuất Sử dụng mảng cấu trúc để lưu trữ:
Thêm các thuật toán như: tìm kiếm tuần tự để tìm 1 sản phẩm trong danh sách hàng hóa
Thêm thuật toán sắp xếp nổi bọt để sắp xếp hàng hóa theo đơn giá
Các yêu cầu khác như: lưu danh sách hàng hóa vào file text
Xác định menu cho chương trình để người dùng sử dụng
Xác định thêm các chức năng khác như: thống kê theo đơn giá
Xác định chức năng tìm kiếm theo tên hàng( cho phép người dùng nhập gần đúng tên hàng có thể tìm được)
2 Xác định dữ liệu cần lưu trữ trong đề tài
- Yêu cầu: Liệt kê các thành phần dữ liệu cần quản lý, chỉ rõ kiểu tương ứng
và đưa ra một bộ giá trị mẫu
Các thành phần dữ liệu cần quản lý
Bộ giá trị mẫu
Tensp: Samsung s4
Soluong: 100
Dongia: 15 000 000
Ngaysx: 12/12/2013
3 Xác định chức năng cần thực hiện
- Yêu cầu: Liệt kê các chức năng cần thực hiện và vẽ thành sơ đồ khối
Trang 34 Thiết kế menu
- Yêu cầu: Chương trình bao gồm các menu gì?
BANG MENU CHUC NANG
-1.Nhap danh sach hang hoa
2.Tim san pham trong danh sach
3.Sap xep hang hoa theo don gia
4.Thong ke san pham theo don gia 5.Cho phep tim ten hang gan dung
De thoat chuong trinh xin moi nhap 0:
MENU CHÍNH
VÀO CHƯƠNG
NHẬP
DANH
SÁCH HH
TÌM KIẾM SẢN PHẨM
SẮP XẾP HH THEO ĐƠN GIÁ
THỐNG KÊ SẢN PHẨM THEO ĐƠN GIÁ
TÌM TÊN GẦN ĐÚNG HH
Trang 4II PHÂN TÍCH CHƯƠNG TRÌNH
1 Các thư viện cần khai báo
<stdio.h> : Thư viện chứa các hàm vào/ ra chuẩn (standard input/output).
Gồm các hàm printf(), scanf(), getc(), putc(), gets(), puts(), fflush(), fopen(), fclose(), fread(), fwrite(), getchar(), putchar(), getw(), putw()…
- Khai báo : #include <stdio.h>
<conio.h> : Thư viện chứa các hàm vào ra trong chế độ DOS (DOS
console) Gồm các hàm clrscr(), getch(), getche(), getpass(), cgets(), cputs(), putch(), clreol(),…
- Khai báo : #include <conio.h>
<string.h>: Để điều chỉnh nhiều loại dãy kí tự.
- Khai báo : #include <string.h>
<stdlib.h> : Dùng để xúc tiến nhiều phép toán, bao gồm sự chuyển đổi,
các số giả ngầu nhiên, cấp phát vùng nhớ, kiểm soát quá trình, môi trường, tín hiệu, tìm kiếm, và xếp thứ tự
- Khai báo : #include <stdlib.h>
2 Khai báo mảng cấu trúc sử dụng trong chương trình
Khai báo kiểu cấu trúc là struct với tên cấu trúc là QL
struct QL Cấu trúc thông tin hàng hóa:
Tên hàng hóa: kiểu char, tối đa 20 ký tự
Số lượng: kiểu int
Đơn giá: kiểu int
Ngày sản xuất: kiểu char, tối đa 10 ký tự
char tensp[20];
int soluong;
int dongia;
char ngaysx[10];
3 Các giải thuật về sắp xếp
Yêu cầu: Trình bày thuật toán sắp xếp được sử dụng để cài đặt trong bài (nếu có) Thuật toán gồm có: ý tưởng, các bước, cài đặt, ví dụ minh họa tương ứng
Sử dụng thuật toán nổi bọt để sắp xếp hàng hóa tang dần theo đơn giá
Trang 5- Ý tưởng : Duyệt nhiều lần từ cuối lên đầu dãy, tiến hành đổi chỗ 2
phần tử liên tiếp nếu chúng ngược thứ tự Đến một bước nào đó, khi không có phép đổi chỗ nào xảy ra thì toàn bộ dãy đã được sắp xếp
- Mô tả và các bước :
n-số phần tử mảng
a[]- mảng chứa các phần tử cần sắp xếp
a[] – mảng đã được sắp xếp
B1.i=0 B2.j=n-1 Trong khi j>I thực hiện : + Nếu a[j]<a[j-1] thì hoán đổi 2 phần tử + j=j-1
B3.i=i+1 Nếu i>n-1 = > hết dãy và dừng thuật toán
Ngược lại lặp lại bước 2
- Cài đặt : code của hàm.
void BubbleSort(QL a[],int n) {
int i,j;
QL tg;
for(i=0;i<n-1;i++)
for(j=n-1;j>i;j ) if(a[j].dongia<a[i].dongia) {
tg=a[j];
a[j]=a[j-1];
a[j-1]=tg;
} }
Trang 6- Ví dụ minh họa tương ứng :
4 Các giải thuật về tìm kiếm
Yêu cầu: Trình bày thuật toán tìm kiếm được sử dụng để cài đặt trong bài (nếu có) Thuật toán gồm có: ý tưởng, các bước, cài đặt, ví dụ minh họa tương ứng
Sử dụng thuật toán tìm kiếm tuần tự để tìm kiếm sản phẩm cần tìm theo tên của sản phẩm
- Ý tưởng : Dùng thuật toán tìm kiếm để tìm kiếm một phần tử cho
trước trong một danh sách bằng cách duyệt lần lượt từng phần tử của danh sách đó cho đến lúc tìm thấy giá trị mong muốn hay đã duyêt qua toàn bộ danh sách
- Các bước thực hiện:
Bước 1: Cần phải tạo một mảng kiểu kí tự để lưu trữ thông tin Tên
sản phẩm cần tìm do người dùng nhập vào sau đó tạo lên yêu cầu nhập vào Tên sản phẩm cần tìm:
k=0;
char namesp[20];
printf("\nXin moi nha ten san pham can tim:");
Dùng hàm Search đưa vào một chuỗi có tên “namesp” tối đa gồm
20 ký tự
Bước 2 : Tạo vòng lặp - Dùng lệnh “for(int i=0;i<n;i++)” để tìm
kiếm lặp đi lặp lại, duyệt từ đầu đến hết danh sách
Dùng lệnh “strcmp” để so sánh duyệt tìm tất cả các ký tự từ trái qua phải Nếu như: “tên sản phẩm=namesp” thì in ra thông tin sản phẩm cần Nếu duyệt đến cuối danh sách mà ko thấy thì sẽ ra khỏi vòng lặp, báo không tìm thấy sau đó thoát ra khỏi hàm
Trang 7- Cài đặt: code của hàm.
int Search(QL a[],int n,int k) {
k=0;
char namesp[20];
printf("\nXin moi nhap ten san pham can tim:");
fflush(stdin);
gets(namesp);
system("cls");
for(int i=0;i<n;i++) {
if(strcmp(a[i].tensp,namesp)==0) {
printf("thong tin san pham can tim la :\n\n "); tieude();
xuatsp(a[i],k);
} }
- Kết quả minh họa :
5 Hàm nhập xuất dữ liệu
Trang 8a) Nhập dữ liệu:
Để lưu các thông tin của nhiều sản phẩm cần phải sử dụng một mảng một chiều kiểu dữ liệu là cấu trúc quản lý sản phẩm.Và yêu cầu từ người dùng khai báo số phần tử cần thêm vào
void nhapds(QL a[],int &n) {
printf("\nNHAP SO LUONG SAN PHAM : ");
fflush(stdin);
scanf("%d",&n);
for(int i=0; i<n; i++) {
printf("\nNhap thong tin san pham thu: %d \n",i+1); nhapsp(a[i]);
} }
Sau đó sử dụng vòng lặp “for(int i=0; i<n; i++)” để thực hiện n bước nhập cho n phần tử
Bước nhập phần tử gồm: tên hàng hóa, số lượng, đơn giá, ngày sản xuất được thực hiện theo hàm sau:
void nhapsp(QL &p) {
printf(" +) Nhap ten san pham : ");
fflush(stdin); gets(p.tensp);
printf(" +) Nhap so luong : ");
fflush(stdin);scanf("%d",&p.soluong);
printf("\n +) Nhap don gia : ");
fflush(stdin); scanf("%d",&p.dongia);
printf("\n +) Nhap ngay san xuat : ");
fflush(stdin); gets(p.ngaysx);
}
Trang 9b) Xuất dữ liệu:
Xây dựng hàm để hiện thị tiêu đề của các sản phẩm
void tieude()
{
printf(" STT | Ten san pham | So luong | Don gia | Ngay san xuat\n");
printf(" -\n"); }
Xây dựng hàm xuất từng sản phẩm một
void xuatsp(QL p,int &k)
{
k++;
Trang 10printf("%-10d%-20s%-15d%-15d%-15s\n",k,p.tensp,p.soluong, p.dongia,p.ngaysx);
}
Xây dựng hàm xuất cả danh sách sản phẩm
void xuatds(QL a[],int n,int k)
{
k=0;
tieude();
for (int i=0;i<n;i++)
xuatsp(a[i],k);
}
- Hình ảnh minh họa :
Trang 116 Các hàm khác.
a Ghi danh sách mặt hàng vào tệp
void ghitep (QL a[], int &n) {
FILE *f;
f=fopen("danh sach san pham.txt","w+b");
if(f==NULL) {
printf("Loi mo tep !");
getch();
return;
} for(int i=0;i<n;i++)
fwrite(&a[i],sizeof(a[i]),1,f);
fclose(f);
}
b Đọc danh sách mặt hàng từ tệp
void doctep (QL a[], int &n) {
FILE *f;
f=fopen("danh sach san pham.txt","r+b");
if(f==NULL) {
printf("Loi mo tep!");
getch();
return;
} int i=0;
while(fread(&a[i],sizeof(a[i]),1,f)!=0)
i++;
n=i;
fclose(f);
}
Trang 12c Xây dựng menu cho người dùng sử dụng
Đưa ra bản menu chức năng để cho người sử dụng chọn các chức năng của chương trình đã được xây dựng
Code
void menu()
{
printf("\n\n BANG MENU CHUC NANG \n\n");
printf(" - ");
printf("\n 1.Nhap danh sach hang hoa \n");
printf("\n 2.Tim san pham trong danh sach \n");
printf("\n 3.Sap xep hang hoa theo don gia.\n");
printf("\n 4.Thong ke san pham theo don gia \n");
printf("\n 5.Cho phep tim ten hang gan dung \n");
printf("\n De thoat chuong trinh xin moi nhap 0 \n");
printf(" - ");
printf("\n Xin moi ban chon :");
}
Trang 13d Thống kê theo đơn giá
Thống kê các sản phẩm trong danh sách theo đơn giá
void thongke(QL a[],int n,int k)
{
int x;
tieude();
k=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++) {
if(a[j].dongia==a[i].dongia&&a[j].dongia!=0) {
xuatsp(a[j],k);
printf("\n");
x=1;
} }
if(x==1)
printf("\n -\n"); x=0;
for(int j=i+1;j<n;j++)
if(a[j].dongia==a[i].dongia)
a[j].dongia=0;
}
}
- Hình ảnh minh họa.
Trang 14e Xây dựng chức năng tìm kiếm gần đúng theo tên hàng
Code chương trình
void timgandung(QL a[],int n,int k)
{
char s2[20];
k=0;
printf("\nNhap ten gan dung cua san pham can tim: ");
fflush(stdin); gets(s2);
system("cls");
printf("thong tin cac san pham can tim la : \n");
tieude();
for(int i=0;i<n;i++)
if(strstr(a[i].tensp,s2)!=NULL)
xuatsp(a[i],k);
} Các bước thực hiện
Bước 1:
Tạo 1 mảng kiểu ký tự để lưu trữ thông tin Tên sản phẩm cần tìm do người dùng nhập vào sau đó tạo lên yêu cầu nhập vào Tên gần đúng của sản phẩm cần tìm:
char s2[20];
k=0;
printf("\nNhap ten gan dung cua san pham can tim: ");
Trang 15Bước 2: dùng vòng lặp “for(int i=0;i<n;i++)” duyệt từ đầu mảng đến cuối
mảng
Bước 3:
Dùng lệnh “ strstr” để tìm kiếm tên gần đúng của sản phẩm
Nếu tên sản phẩm mình nhập trùng với tên sản phẩm có trong bài thì đưa ra kết quả chi tiết của sản phẩm đó dùng lệnh “if(strstr(a[i].tensp,s2)!=NULL)”
Và ngược lại đưa ra kết quả là không tìm thấy
Trang 167 Chương trình chính
Chức năng :
- Gọi và thực hiện các hàm chức năng khi người sử dụng nhập yêu cầu
chức năng
Code chương trình chính
main()
{
int n,k;
QL ds[100],x[1];
int chon;
do
{
system("cls");
menu();
scanf("%d",&chon);
if(chon>=0&&chon<=5) switch(chon)
{ case 0: exit(1);
case 1:
system("cls");
printf("\n1 Nhap danh sach san pham.");
nhapds(ds,n);
ghitep(ds,n);
system("cls");
printf("\n");
printf("\n Danh sach san pham:\n.");
doctep(ds,n);
xuatds(ds,n,k);
printf("\nNhap phim bat ki de tro ve menu chinh :");
Trang 17break;
case 2:
system("cls");
printf("\n2 Tim san pham trong danh sach.\n");
doctep(ds,n);
Search(ds,n,k);
printf("\n\nNhap phim bat ki de tro ve menu chinh :"); getch();
break;
case 3:
system("cls");
printf("\n3 Sap xep hang hoa theo don gia.\n");
doctep(ds,n);
BubbleSort(ds,n);
ghitep(ds,n);
doctep(ds,n);
xuatds(ds,n,k);
getch();
printf("\nNhap phim bat ki de tro ve menu chinh :"); getch();
break;
case 4:
system("cls");
printf("\n4 Thong ke san pham theo don gia.\n\n"); doctep(ds,n);
thongke(ds,n,k);
printf("\nNhap phim bat ki de tro ve menu chinh :"); getch();
break;
case 5:
system("cls");
printf("\n5 Cho phep tim ten hang gan dung.");
doctep(ds,n);
timgandung(ds,n,k);
printf("\nNhap phim bat ki de tro ve menu chinh :"); getch();
Trang 18default:printf("\nBan nhap khong hop le, xin moi nhap lai:"); printf("\nNhap phim bat ki de tro ve menu chinh :");
getch();
break;
}
else
{
printf("\nBan da nhap sai, chuong trinh se thoat:");
exit(1);
} }
while(chon!=0);
getch();
}
Trang 19Lời Mở Đầu 2
I.GIỚI THIỆU PHÂN TÍCH ĐỀ TÀI 3
1 Đề bài : 3
2 Xác định dữ liệu cần lưu trữ trong đề tài 3
3 Xác định chức năng cần thực hiện 3
4 Thiết kế menu 4
II PHÂN TÍCH CHƯƠNG TRÌNH 5
1 Các thư viện cần khai báo 5
2 Khai báo mảng cấu trúc sử dụng trong chương trình 5
3 Các giải thuật về sắp xếp 5
4 Các giải thuật về tìm kiếm 7
5 Hàm nhập xuất dữ liệu 9
a) Nhập dữ liệu: 9
b) Xuất dữ liệu: 10
6 Các hàm khác 12
a Ghi danh sách mặt hàng vào tệp 12
b Đọc danh sách mặt hàng từ tệp 12
c Xây dựng menu cho người dùng sử dụng 13
d Thống kê theo đơn giá 14
e Xây dựng chức năng tìm kiếm gần đúng theo tên hàng 15
7 Chương trình chính 17