Tải bản đầy đủ (.doc) (15 trang)

Tài liệu phát triển chương trình phần mềm Đề tài Tạo một ADT có tên Array.h và viết một chương trình CheckArray.c để kiểm tra

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (327.31 KB, 15 trang )

Trường Đại học Bách Khoa Hà Nội
Viện Công nghệ thông tin và truyền thông
Tài liệu phát triển
chương trình phần mềm
Đề tài : Tạo một ADT có tên Array.h
và viết một chương trình CheckArray.c để kiểm tra
Hà Nội, 2013
1

Giảng viên hướng dẫn : TS. Vũ thị Hương Giang
Nhóm sinh viên thực hiện : Vũ Văn Bảo
Trần Trung Hiếu
Nguyễn Minh Tiến
Nguyễn Văn Tùng
Nguyễn Hồng Vinh
Lớp : KSCLC – K55
Năm học : 2012 - 2013
Mục lục
Mục lục 2
I.Phân tích bài toán 3
1.Yêu cầu bài toán 3
2.Biểu đồ IPO 4
II.Thiết kế giải pháp 5
A.Thiết kế ADT có tên Array 5
1.Cấu trúc của ADT 5
2.Thao thác nhập dữ liệu cho cấu trúc củaADT 5
3.Thao tác hiển thị dữ liệu của cấu trúc của ADT 5
4.Thao tác sắp xếp dữ liệu của ADT theo thuật toán sắp xếp nổi bọt 5
5.Thao tác sắp xếp dữ liệu của ADT theo thuật toán sắp xếp chèn 5
6.Thao tác sắp xếp dữ liệu của ADT theo thuật toán sắp xếp chọn 6
7.Thao tác tìm phần tử giá trị lớn nhất và các vị trí của nó 6


8.Thao tác tìm phần tử có giá trị nhỏ nhất và các vị trí của nó 6
9.Thao tác tính giá trị trung bình của các phần tử 6
10.Thao tác tính độ lệch về giá trị giữa hai phần tử 6
11.Thao tác tính độ lệch trung bình giữa các phần tử 7
12.Thao tác tìm kiếm tuần tự phần tử có giá trị cho trước 7
13.Thao tác tìm kiếm nhị phân phần tử có giá trị cho trước 7
14.Thao tác hiển thị độ phức tạp thuật toán và thời gian thực tế 7
B.Thiết kế chương trình CheckArray cung cấp các chức năng để kiểm tra ADT
Array 8
III.Cài đặt thiết kế 8
A.Cài đặt ADT Array 8
1.Nhập, nhập lại dữ liệu 8
2.Hiển thị dữ liệu 8
3.Sắp xếp bằng giải thuật sắp xếp nổi bọt 9
4.Sắp xếp bằng giải thuật sắp xếp chèn 9
5.Sắp xếp bằng giải thuật sắp xếp chọn 9
6.Tìm giá trị lớn nhất và các vị trí của nó 10
7.Tìm giá trị nhỏ nhất trong mảng 10
8.Tìm giá trị trung bình giữa các phần tử 10
9.Tìm độ lệch giữa 2 phần tử 11
10.Tìm độ lệch trung bình giữa các phần tử 11
11.Tìm phần tử có giá trị cho trước băng thuật toán tìm kiếm tuần tự 11
12.Tìm phần tử có giá tri cho trước bằng thuật toán tìm kiếm nhị phân 12
13.Biểu diễn độ phức tạp thuật toán và thời gian thực hiện 12
B.Cài đặt chương trình CheckArray 12
2
Tài liệu tham khảo 14
I. Phân tích bài toán
1. Yêu cầu bài toán.
• Tạo một ADT có tên là Array và lưu trữ trong file Array.h.

 ADT này bao gồm hai thành phần thông tin:
- Max[]: mảng các giá trị thực
- Count: số lượng các phần tử trong mảng Max[]
 ADT này cho phép thực hiện một số thao tác trên mảng số thực:
1) Nhập mảng
2) Hiển thị mảng
3) Sắp xếp các phần tử của mảng theo thuật toán sắp xếp nổi bọt
4) Sắp xếp các phần tử của mảng theo thuật toán sắp xếp chèn
5) Sắp xếp các phần tử của mảng theo thuật toán sắp xếp chọn
6) Tìm giá trị lớn nhất và vị trí các phần tử có giá trị lớn nhất
7) Tìm giá trị nhỏ nhất và vị trí các phần tử có giá trị nhỏ nhất
8) Tính giá trị trung bình của các phần tử trong mảng
9) Tìm độ lệch về giá trị giữa hai phần tử có vị trí bất kì
10) Tính độ lệch trung bình về giá trị của các phần tử trong mảng
11) Tìm kiếm tuyến tính phần tử của mảng có giá trị là x,nếu tìm thấy thì đưa
ra vị trí, nếu không thì trả về 0
12) Tìm kiếm nhị phân phần tử của mảng có giá trị là x,nếu tìm thấy thì
thông báo là có phần tử x trong mảng, nếu không thì thông báo là không thấy
13) Biểu thị độ phức tạp thuật toán theo big O và hiển thị thời gian tính toán
thực tế bằng micro giây
• Viết một chương trình cung cấp các chức năng để kiểm tra ADT này.
3
2. Biểu đồ IPO
Input Process Output
Số nguyên
Dãy các số thực
Đọc từ bàn phím Giá trị count
Giá trị của các phần tử
trong mảng
Số lượng phần tử Count

Mảng các giá trị thực
Max[]
Xuất ra màn hình Dãy các số thực
Số lượng phần tử Count
Mảng các giá trị thực
Max[]
Sắp xếp nổi bọt Dãy các số thực có thứ tự
Số lượng phần tử Count
Mảng các giá trị thực
Max[]
Sắp xếp chèn Dãy các số thực có thứ tự
Số lượng phần tử Count
Mảng các giá trị thực
Max[]
Sắp xếp lựa chọn Dãy các số thực có thứ tự
Số lượng phần tử Count
Mảng các giá trị thực
Max[]
Tìm giá trị lớn nhất trong
mảng và so sánh các
phần tử mảng với giá trị
lớn nhất đó
Giá trị lớn nhất trong
mảng
Vị trí của các phần tử có
giá trị lớn nhất
Số lượng phần tử Count
Mảng các giá trị thực
Max[]
Tìm giá trị nhỏ nhất

trong mảng và so sánh
các phần tử mảng với giá
trị nhỏ nhất đó
Giá trị nhỏ nhất trong
mảng
Vị trí của các phần tử có
giá trị nhỏ nhất
Số lượng phần tử Count
Mảng các giá trị thực
Max[]
Tính giá trị trung bình Giá trị trung bình
Số lượng phần tử Count
Mảng các giá trị thực
Max[]
Vị trí của hai phần tử
Trừ cho nhau Độ lệch
Số lượng phần tử Count
Mảng các giá trị thực
Max[]
Tính độ lệch trung bình Độ lệch trung bình
Số lượng phần tử Count
Mảng các giá trị thực
Max[]
Giá trị cần tìm kiếm
Tìm tuần tự Vị trí của giá trị cần tìm
kiếm
4
Số lượng phần tử Count
Mảng các giá trị thực
Max[]

Giá trị cần tìm kiếm
Tìm nhị phân Thông báo có hay không
Các thao tác Tính thời gian Thời gian
II. Thiết kế giải pháp
A. Thiết kế ADT có tên Array
1. Cấu trúc của ADT
Trong chương trình này, tạo cấu trúc ADT này có tên là mang, bao gồm 2 filed:
• Filed thứ nhất tên count có kiểu dữ liệu int, để lưu trữ số lượng phần tử
của mảng max.
• Filed thứ 2 là mảng max có kiểu dữ liệu là float, có số phần tử là count,
và ở đây giới hạn số phần tử tối đa của mảng là 1000.
2. Thao thác nhập dữ liệu cho cấu trúc củaADT
• Chọn cách nhập dữ liệu từ bàn phím.
• Sử dụng lệnh printf để thông báo nhập, và lệnh scanf để nhập dữ liệu.
• Khi nhập dữ liệu, chú ý đến giới hạn của field count, và các kiểu dữ liệu
của các filed trong cấu trúc.
 Nếu đúng thì thông báo nhâp thành công.
 Nếu sai tì cho phép nhập lại.
• Sau khi nhập xong thì sẽ trả về giá trị của cấu trúc ADT vừa mới nhập.
3. Thao tác hiển thị dữ liệu của cấu trúc của ADT
• Lấy dữ liệu là một biến có cấu trúc mang.
• Sử dụng các lệnh printf để in dữ liệu ra màn hình.
4. Thao tác sắp xếp dữ liệu của ADT theo thuật toán sắp xếp nổi bọt
• Lấy dữ liệu đầu vào là biến có kiểu mang.
• Sử dụng thuật toán bubbleSort để chúng ta sắp xếp lại dữ liệu trong mảng
Bắt đầu từ đầu dãy, thuật toán tiến hành so sánh mỗi phần tử với phần tử
đi sau nó và thực hiện đổi chỗ, nếu chúng không theo đúng thứ tự. Quá
trình này được lặp đi lặp lại cho đến khi gặp lần duyệt từ đầu dãy đến cuối
dãy mà không phải thực hiện đổi chỗ. Cách làm này đã đẩy phần tử lớn
nhất xuống cuối dãy, trong khi đó phần tử có giá trị nhỏ hơn được dịch

chuyển về đầu dãy.
• Sau đó trả về giá trị có kiển mang.
5. Thao tác sắp xếp dữ liệu của ADT theo thuật toán sắp xếp chèn
• Lấy dữ liệu đầu vào là 1 biến kiểu mang.
• Sử dụng thuật toán insertionSort để sắp xếp lại dữ liệu.
5
• Trả về giá trị có kiểu mang.
6. Thao tác sắp xếp dữ liệu của ADT theo thuật toán sắp xếp chọn
• Lấy dữ liệu đầu vào là 1 biến kiểu mang.
• Sử dụng thuật toán selectionSort để sắp xếp lại dữ liệu.
 Tìm phần tử nhỏ nhất đưa vào vị trí dầu tiên.
 Tìm phần tử nhỏ tiếp theo đưa vào vị trí 2.
 Tìm phần tử nhỏ tiếp theo đưa vào vị trí 3.
 ……
• Trả về giá trị có kiểu mang.
7. Thao tác tìm phần tử giá trị lớn nhất và các vị trí của nó
• Lấy dữ liệu vào là 1 biến kiểu mảng.
• Sử dụng thuật toán tìm giá trị lớn nhất trong 1 mảng, để in ra màn hình
giá trị của phần tử có giá trị lớn nhất.
Gán max = phần tử đầu tiên, so sánh max với phần tử tiếp theo, nếu max
mà nhỏ hơn phần tử tiếp theo thì max lại được gắn bang giá trị phần tử
đó, quá trình kết thúc khi so sánh max với phần tử cuối cùng.
• Từ giá trị lớn nhất đó, sử dụng thuật toán tìm kiếm để in ra các vị trí của
phần tử lớn nhất (phần tử ở vị trí thứ mấy trong mảng).
8. Thao tác tìm phần tử có giá trị nhỏ nhất và các vị trí của nó
• Lấy dữ liệu đầu vào là một biến kiểu mang.
• Sử dụng thuật toán tìm kiếm giá trị nhỏ nhất trong 1 mảng, để in ra giá trị
của phần tử có giá trị nhỏ nhất .
Gán min = phần tử đầu tiên, so sánh max với phần tử tiếp theo, nếu max
mà lớn hơn phần tử tiếp theo thì min lại được gắn bang giá trị phần tử đó,

quá trình kết thúc khi so sánh max với phần tử cuối cùng.
• Từ giá trị nhỏ nhất đó, sử dụng thuật toán tìm kiếm tuần tự để in ra màn
hình các vị trí của các phần tử có giá trị nhỏ nhất.
9. Thao tác tính giá trị trung bình của các phần tử
• Lấy dữ liệu đầu vào là 1 biến kiểu mang.
• Sử dụng câu lênh for để tính tổng các phần tử trong mảng.
• Sau đó tính giá trị trung bình bằng cách lấy tổng chia cho số phaabf tử
của mảng la count, rồi trả về giá trị đó, giá trị bày sẽ có kiểu float.
10.Thao tác tính độ lệch về giá trị giữa hai phần tử
• Lấy dữ liệu đầu vào là 1 biến kiểu mang, hai biến kiểu i,jint biểu thị cho
vị trí của các phần tử cần tính độ lệch.
• Kiểm tra xem các vị trí đấy có tồn tại trong mảng không.
• Nếu không thì trả về các giá trị tương ứng:
 Nếu không có phần tử thứ i: trả về giá trị là -1.
6
 Nếu không có phần tử thứ j: trả về giá trị là -2.
 Nếu không có cả hai phần tử: trả về giá trị là -3.
• Nếu có cả hai vị trí, thì trả về giá trị là độ lớn của độ chênh lệch giữa hai
phần tử này, giá trị này sẽ có kiểu float.
11.Thao tác tính độ lệch trung bình giữa các phần tử
• Lấy đầu vào là 1 biến kiểu mang.
• Tính giá trị trung bình của các phần tử avg.
• Sử dụng công thức tính độ lệch trung bình.
dltb = căn bậc hai củatổng bình phương của hiệu các phần tử với giá trị
trung bình.
• Trả về giá trị vừa tính được, giá trị này sẽ có kiểu float.
12.Thao tác tìm kiếm tuần tự phần tử có giá trị cho trước
• Lấy đầu vào là 1 biến kiểu mang, và 1 biến x kiểu float là giá trị cần tìm
kiếm.
• Sử dụng thuật toán tìm kiếm tuần tự, để tìm kiếm.

Duyệt tùng phần tử, nếu giá trị phần tử bằng giá trị cần tìm thì lưu lại chỉ
số đó.
• Nếu tìm thấy thì in ra màn hình thông báo là tìm thấy phần tử này, và in
ra các chỉ số của phần tử này.
• Nếu không tìm thấy thì in ra màn hình số 0.
13.Thao tác tìm kiếm nhị phân phần tử có giá trị cho trước
• Lấy đầu vào là một biến kiểu mang, và một biến x kiểu float biểu diễn
cho giá trị cần tìm kiếm.
• Sắp xếp lại mảng, dùng thuật toán sắp xếp chèn.
• Sử dụng thuật toán tìm kiếm nhị phân để lưu lại các vị trí tìm được ở
phía sau vị trí đầu tiên nếu tìm được.
Thuật toán nhị phân là chia bài toán lớn thành bài toán nhỏ.
• Sử dụng thuật toán tìm kiếm nhị phân để lưu lại các vị trí tìm được ở phía
trước vị trị đầu tiên nếu tìm được.
• Nếu tim thấy thì in ra màn hình các chỉ số.
• Nếu không tìm thấy thì in ra màn hình là không tìm thấy.
14.Thao tác hiển thị độ phức tạp thuật toán và thời gian thực tế
• Lấy đầu vào là 1 biến kiểu mang, và 1 biến y_c kiểu int biểu diễn yêu
cầu cần tính thời gian.
• Sử dụng switch … case… kiểm tra các yêu cầu để thực hiện.
• Ở mỗi giá trị sau case thì đăt thời điểm bắt đầu thực hiện và thời điểm kết
thúc của thao tác.
7
• In ra màn hình thông báo độ phức tạp của thuật toán, và thời gian thực
hiện sẽ bằng thời điểm kết thúc trừ thời điểm bắt đầu
B. Thiết kế chương trình CheckArray cung cấp các chức năng để kiểm tra
ADT Array
• Tạo dữ liệu ban đầu cho mảng.
• Tạo menu lựa chọn, sử dụng lệnh printf để in ra các danh mục menu.
• Từ menu lựa chọn sử dụng câu lệnh điều khiển switch …case …để thực

hiện các menu.
• Ở mỗi sự lựa chọn sử dụng các thao tác đã cài đặt trên ADT Array, để kiểm
tra các thao tác này.
• Cho phép thực hiện tiếp các 1 trong các thao trên: Khi đó tất cả các lệnh sẽ
được đặt trong 1 vòng do… while.
III. Cài đặt thiết kế
A.Cài đặt ADT Array
1. Nhập, nhập lại dữ liệu
Cài đặt hàm: mang nhap();
mang nhap(){
do{
printf("\n Nhap so luong phan tu cua mang count = ");
scanf("%d", &c);
if((c < 1) || (c > 1000)) printf("\n Du lieu nhap khong dung, hay
nhap lai; ");
}while ((c < 1) || (c > 1000));
mang1.count = c;
for (i = 0; i < mang1.count; i++){
printf("\n nhap phan tu thu %3d max[%3d]= ", i + 1, i);
scanf("%f", &g_t);
fflush(stdin);
mang1.max[i] = g_t;
}
printf("\n Ban da nhap du lieu thanh cong !!");
return (mang1);
}
2. Hiển thị dữ liệu
Cài đặt thủ tục: void hien(mang mang1);
void hien(mang mang1){
printf("\n So luong phan tu count = %3d",mang1.count);

for(i=0;i<mang1.count;i++){
8
printf("\n phan tu thu %3d la: max[%3d]= %7.2f", i + 1, i,
mang1.max[i]);
}
3. Sắp xếp bằng giải thuật sắp xếp nổi bọt.
Cài đặt hàm: mang bubbleSort(mang mang1);
mang bubbleSort(mang mang1){
for (i = mang1.count - 1; i >= 0; i ){
for (j = 1; j <= i; j++){
if (mang1.max[j - 1] > mang1.max[j]){
float temp = mang1.max[j-1];
mang1.max[j - 1] = mang1.max[j];
mang1.max[j] = temp;
}
}
}
return (mang1);
}
4. Sắp xếp bằng giải thuật sắp xếp chèn.
Cài đặt hàm: mang insertionSort(mang mang1);
mang insertionSort(mang mang1){
for( i = 1;i < mang1.count; i++){
last = mang1.max[i];
for (j = i - 1;j >= 0; j ){
if (mang1.max[j] > last)
mang1.max[j + 1] = mang1.max[j];
else break;
}
mang1.max[j + 1] = last;

}
return (mang1);
}
5. Sắp xếp bằng giải thuật sắp xếp chọn.
Cài đặt hàm: mang selectionSort(mang mang1);
mang selectionSort(mang mang1);
for (i = 0; i < mang1.count - 1; i++){
min = i;
for (j = i + 1;j < mang1.count; j++){
if (mang1.max[j] < mang1.max[min]) min = j;
}
9
temp = mang1.max[i];
mang1.max[i] = mang1.max[min];
mang1.max[min] = temp;
}
return (mang1);
}
6. Tìm giá trị lớn nhất và các vị trí của nó.
Cài đặt thủ tục: void finMax(mang mang1);
void findMax(mang mang1){
float mmax = mang1.max[0];
int i;
for(i = 1; i < mang1.count; i++){
if (mmax < mang1.max[i]) mmax = mang1.max[i];
}
printf("\n Phan tu lon nhat cua mang co gia tri %13.5f", mmax);
printf("\n Phan tu lon nhat la phan tu thu: ");
for(i = 0; i < mang1.count; i++){
if (mmax == mang1.max[i]) printf("\n %3d", i + 1);

}
}
7. Tìm giá trị nhỏ nhất trong mảng.
Cài đặt thủ tục: void finMin(mang mang1);
void findMin(mang mang1)
{
float min = mang1.max[0];
int i;
for(i = 1; i < mang1.count; i++){
if (min > mang1.max[i]) min = mang1.max[i];
}
printf("\n Phan tu nho nhat cua mang co gia tri %13.5f", min);
printf("\n Phan tu nho nhat la phan tu thu: ");
for(i = 0;i < mang1.count; i++){
if (min == mang1.max[i]) printf("\n %3d", i + 1);
}
}
8. Tìm giá trị trung bình giữa các phần tử
Cài đặt hàm: float avgMax(mang mang1);
float avgMax(mang mang1)
{
10
int i;
float sum = 0, avg;
for (i = 0;i < mang1.count; i++){
sum = sum + mang1.max[i];
}
avg = sum/((float)(mang1.count));
return (avg);
}

9. Tìm độ lệch giữa 2 phần tử.
Cài đặt hàm float dolech(mang mang1, int i, int j);
float dolech(mang mang1, int i, int j){
float do_lech;
if (((i > mang1.count)||(i < 1))&&((j > mang1.count)||(j < 1)))
return (-3);
else if ((i > mang1.count)||(i < 1))
return(-1);
else if((j > mang1.count)||(j < 1))
return(-2);
else{
do_lech = fabs(mang1.max[j-1] - mang1.max[i-1]);
return (do_lech);
}
}
10.Tìm độ lệch trung bình giữa các phần tử.
Cài đặt hàm: float dolectb(mang mang1);
float dolechtb(mang mang1){
float avg,s = 0;
int i;
avg = avgMax(mang1);
for (i = 0; i < mang1.count; i++)
s = pow(mang1.max[i] - avg, 2) + s;
return (sqrt(s));
}
11.Tìm phần tử có giá trị cho trước băng thuật toán tìm kiếm tuần tự.
Cài đặt thủ tục: void sequentialSearch(mang mang1, float x);
void sequentialSearch(mang mang1, float x){
int i, e = 0;
int cs[mang1.count];

for (i = 0; i < mang1.count; i++){
11
if (mang1.max[i] == x){
cs[e] = i;
e++;
}
}
if (e == 0) printf("\n %3d", e);
else {
printf("\n Chi so cua phan tu co gia tri %7.3f tim theo giai thuat
sequentialSearch la: ", x);
for (i = 0; i < e; i++)
printf("%3d", cs[i]); // in ra cac chi so can tim
}
}
12.Tìm phần tử có giá tri cho trước bằng thuật toán tìm kiếm nhị phân.
Cài đặt thủ tục: void binarySearch(mang_input, float giatri);
13.Biểu diễn độ phức tạp thuật toán và thời gian thực hiện.
Cài đặt thủ tục: void getTime(mang mang_input, int y_c);
B.Cài đặt chương trình CheckArray
int main()
{
Khai báo các biến.
Thông báo nhập và nhập dữ liệu lần đầu.
do{
print danh mục menu.
switch(yc){
case 2:
gọi hàm nhap();
gọi thủ tục hien() để hiển thị kết quả kiểm tra.

case 3:
goi hàm bubble();
gọi thủ tục hien() để hiển thị kết quả kiểm tra.
case4:
gọi hàm insertionSort();
goi thủ tục hien() để hiển thị kết quả kiểm tra.
case 5:
gọi hàm selectinSort();
goi thủ tục hien() để hiển thị kết quả kiểm tra.
case 6:
gọi thủ tục finMax();
12
case 7:
goi thủ tục finMin();
case 8:
gọi hàm avgMax();
in ra kết quả để kiểm tra.
case 9:
nhập 2 sô nguyên
gọi hàm dolech();
dựa vào giá trị in ra kết quả.
case 10:
gọi hàm dolechtb();
in ra kết quả để kiểm tra.
case 11:
nhập vào số thực cần tìm kiếm.
gọi thủ tục sequentialSearch();
case 12:
nhập vào số thực tìm kiếm.
gọi thủ tục binary();

case 13:
nhập vào yêu cầu cần tính thời gian.
Gọi thủ tục getTime().
defaut
thông báo không có yêu cầu.
}
Nhập vào số nguyên tiep để hỏi có thực hiện tiếp không.
while (tiep ==0);
}
13
Tài liệu tham khảo
[1] Slide bài giảng KTLT-Vũ Thị Hương Giang
[2] Code complete A Practical Handbook ofd Software Construction của
tác giả Steve Mc Connell
14

×