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:
Trang 1Trườ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
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
Trang 2Mụ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
Trang 3Tài liệu tham khảo 14
Trang 4I 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
Trang 52 Bi u đ IPO ểu đồ IPO ồ IPO
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ử
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
Trang 6Số 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
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
Trả về giá trị có kiểu mang.
Trang 76 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
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
Trang 8 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
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
Trang 9B 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++){
printf("\n phan tu thu %3d la: max[%3d]= %7.2f", i + 1, i,
mang1.max[i]);
}
Trang 103 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++){
for (j = i + 1;j < mang1.count; j++){
if (mang1.max[j] < mang1.max[min]) min = j;
} temp = mang1.max[i];
mang1.max[i] = mang1.max[min];
mang1.max[min] = temp;
Trang 11}
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)
{
int i;
float sum = 0, avg;
for (i = 0;i < mang1.count; i++){
Trang 12sum = 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++){
if (mang1.max[i] == x){
cs[e] = i;
e++;