- Sử dụng kiểu dữ liệu 2 chiều
Để xác định thông số của mặt sàn gồm chiều dài và chiều rộng (d và r) em sử dụng kiểu dữ liệu 2 chiều, đồng thời khai báo một số hằng số xác định trƣớc:
// Các thông số cho trước
#define MAX_X d
#define MAX_Y r
#define chieucao z
#define SoTO m
#define vitriFDp //(= xF×r+yF)
44 struct Pos { int x; int y; }
- Xây dựng các hàm con phục vụ tính toán
Tạo hàm tính khoảng cách giữa 2 điểm Distance(Pos A, Pos B): Cách 1 tính theo khoảng cách Euclid
double Distance (Pos A, Pos B) {
return sqrt((double)(A.x-B.x)*(A.x-B.x)+(double)(A.y-B.y)*(A.y-B.y)); }
Cách 2 tính theo cách đi dây theo các trục của tòa nhà
double Distance(Pos A, Pos B) {
return (sqrt((double)(A.x-B.x)*(A.x-B.x))+sqrt((double)(A.y-B.y)*(A.y-B.y))+
2*chieucao); }
Tạo hàm tính khoảng cách từ FD tới các TO DistanceFDtoNode(Pos A, Pos ArrTOInput[SoTO]):
45
{
double result = 0;
for(int i = 0; i < SoTO; i++) {
result = result + Distance(A,ArrTOInput[i]); }
return result; }
Tạo hàm xác định vị trí FD FindPos(Arr [MAX_X*MAX_Y]):
int FindPos(double ArrFD [MAX_X * MAX_Y]) {
double result = ArrFD[0]; int pos = 0;
for (int index = 0;index < MAX_X * MAX_Y; index ++) { if(result > ArrFD[index]) { result = ArrFD[index]; pos = index; } }
46
return pos; }
- Xây dựng chƣơng trình chính:
+ Khai báo các thông số sẽ sử dụng:
void main() {
Pos ArrTOInput [SoTO]; Pos ArrFD [MAX_X * MAX_Y]; int x;
int y; int pos;
double result [MAX_X * MAX_Y]; int index = 0;
+ Yêu cầu nhập vào vị trí m nút mạng TO:
-> em có mảng m nút mạng TO: ArrTOInput[SoTO]
printf("\tNhap toa do cac nut mang TO \n"); for(int i = 0;i<SoTO;i++)
{
printf("\tNhap x%d: ",i); scanf("%d",&x);
47
printf("\tNhap y%d: ",i); scanf("%d",&y);
ArrTOInput[i].x = x; ArrTOInput[i].y = y; }
+ Tạo mảng các vị trí FD là toàn bộ các vị trí của mặt sàn gồm d×r vị trí: -> em có mảng các vị trí FD: ArrFD [MAX_X * MAX_Y]
for(int k = 0;k< MAX_X;k++) { for(int j = 0;j< MAX_Y; j++) { ArrFD[index].x = k; ArrFD[index].y = j; index++; } }
+ Sử dụng hàm tính tổng khoảng cách của từng FD tới các TO: -> xác đinh đƣợc tập các giá trị tổng khoảng cách
for(index = 0; index < MAX_X*MAX_Y;index++) {
48
result[index] = DistanceFDtoNode(ArrFD[index],ArrTOInput); }
+ Sử dụng hàm xác định vị trí FD tối ƣu và cho ra kết quả -> xác định đƣợc vị trí FD tối ƣu cần tìm trong mảng.
pos = FindPos(result);
printf("Vi tri FD toi uu trong mang la: %d \n",pos);
+ Yêu cầu xuất ra kết quả xác đinh đƣợc -> tọa độ FD trong mảng
-> tổng khoảng cách từ FD tới các nút mạng TO
printf("toa do FD toi uu can tim la: X = %d; Y = %d", ArrFD[pos].x,ArrFD[pos].y); printf("\nTong khoang cach tu FD toi uu toi cac TO la: %f m \n\n",result[pos]);
+ Với những trƣờng hợp chỉ định trƣớc vị trí FD(xF,yF), em sẽ gán vị trí FD trong mảng
-> chỉ ra vị trí FD trong mảng.
pos = vitriFD;
printf("Vi tri FD trong mang la: %d \n",pos);
+ Yêu cầu xuất ra kết quả xác đinh đƣợc -> tọa độ FD trong mảng
49
printf("toa do FD can tim la: X = %d; Y = %d", ArrFD[pos].x,ArrFD[pos].y); printf("\nTong khoang cach tu FD toi cac TO la: %f m \n\n",result[pos]); getch();
}
+ Tính thời gian chƣơng trình chạy
clock_t start, end; start = clock();
chương trình chạy …
end = clock();
50
CHƢƠNG III: ÁP DỤNG BÀI TOÁN THIẾT KẾ VÀO THỰC TẾ: DỰ ÁN NGÂN HÀNG NÔNG NGHIỆP VÀ PHÁT TRIỂN NÔNG THÔN CHI
NHÁNH HOÀNG QUỐC VIỆT