1. Trang chủ
  2. » Luận Văn - Báo Cáo

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

15 516 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 15
Dung lượng 267,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

 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 1

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

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 2

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

Trang 3

Tài liệu tham khảo 14

Trang 4

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

Trang 5

2 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 6

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

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 7

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

 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 9

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++){

printf("\n phan tu thu %3d la: max[%3d]= %7.2f", i + 1, i,

mang1.max[i]);

}

Trang 10

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++){

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 12

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++){

if (mang1.max[i] == x){

cs[e] = i;

e++;

Ngày đăng: 16/05/2015, 13:10

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w