質問編集履歴

1

コードに進捗があったため修正しました。

2020/07/21 10:13

投稿

rft3
rft3

スコア7

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,6 @@
1
- C言語、距離関数を使った問題が分からず困っています。
1
+ C言語、距離関数を使ったプログラムの実装方法が分からず困っています。
2
-
2
+
3
- 都市名name,緯度lat,経度lngをメンバに持つCity構造体の配列citiesを作成し、八王子市(35.67,139.32)との距離が近い市3位までを求めるプログラムを実装せよ、とうもなのですが、条件参考に書いてみても実行すらできず八方塞がりになっています。どうかご教授お願いいたします。
3
+ 都市名name,緯度lat,経度lngをメンバに持つCity構造体の配列citiesを作成し、八王子市(35.67,139.32)との距離が近い市3位までを求めるプログラムを実装したいのですが、「2都市間の距離求めいうおそくポインタを使うあろうコードの書方がわからず八方塞がりになっています。どうかご教授お願いいたします。
4
4
 
5
5
 
6
6
 
@@ -12,7 +12,7 @@
12
12
 
13
13
  ・原点(0,0)からの距離を求める関数ではなく,2都市間の距離を求める必要がある点に注意する.
14
14
 
15
- ・実装した距離関数へのポインタを使用すること
15
+ ・実装した距離関数へのポインタを使用する
16
16
 
17
17
 
18
18
 
@@ -60,6 +60,8 @@
60
60
 
61
61
  ```C
62
62
 
63
+
64
+
63
65
  #include <stdio.h>
64
66
 
65
67
  #include <stdlib.h>
@@ -70,37 +72,69 @@
70
72
 
71
73
 
72
74
 
73
- struct City{
75
+ typedef struct{
74
-
75
-
76
76
 
77
77
  char name;
78
78
 
79
+ double lat;
80
+
81
+ double lng;
82
+
83
+ }City;
84
+
85
+
86
+
87
+ City *cities;
88
+
89
+
90
+
91
+
92
+
93
+
94
+
95
+ void monte_simu(int n, double (*distance)(double, double)){
96
+
79
- int lat;
97
+ int m = 0;
80
-
98
+
81
- int lng;
99
+ for(int i = 0; i < n; i++){
100
+
101
+ double x = 1.0*rand()/RAND_MAX;
102
+
103
+ double y = 1.0*rand()/RAND_MAX;
104
+
105
+ if(distance(x, y) < 1.0) m += 1;
106
+
107
+ }
108
+
109
+ printf("1番目に近い都市:%d = %f\n", m);
110
+
111
+  printf("2番目に近い都市:%d = %f\n", m);
112
+
113
+ printf("3番目に近い都市:%d = %f\n", m);
82
114
 
83
115
  }
84
116
 
85
117
 
86
118
 
87
-
119
+ double euclid(double x, double y){ return sqrt(x*x + y*y); }
88
-
120
+
89
- void monte_simu(int n, double (*distance)(double, double)){
121
+ double manhattan(double x, double y){ return fabs(x)+fabs(y); }
122
+
90
-
123
+ double chebyshev(double x, double y){ return (x > y)? x : y; }
124
+
125
+
126
+
91
- int m = 0;
127
+ int main(int argc, char *argv[]){
128
+
92
-
129
+ srand((unsigned) time(NULL));
130
+
93
- for(int i = 0; i < n; i++){
131
+ int N = atoi(argv[1]);
94
-
95
- double x = 1.0*rand()/RAND_MAX;
132
+
96
-
97
- double y = 1.0*rand()/RAND_MAX;
98
-
99
- if(distance(x, y) < 1.0) m += 1;
100
-
101
- }
102
-
103
- //printf(":4*%d/%d = %f\n", m, n, 4.0*m/n);
133
+ printf("マンハッタン距離ランキング:\t"); monte_simu(N, manhattan);
134
+
135
+ printf("ユークリッド距離ランキング:\t"); monte_simu(N, euclid );
136
+
137
+ printf("チェビシェフ距離ランキング:\t"); monte_simu(N, chebyshev);
104
138
 
105
139
  }
106
140
 
@@ -108,24 +142,6 @@
108
142
 
109
143
 
110
144
 
111
-
112
-
113
- int main(int argc, char *argv[]){
114
-
115
- srand((unsigned) time(NULL));
116
-
117
- int N = atoi(argv[1]);
118
-
119
- printf("マンハッタン距離ランキング:\t"); monte_simu(N, manhattan);
120
-
121
- printf("ユークリッド距離ランキング:\t"); monte_simu(N, euclid);
122
-
123
- printf("チェビシェフ距離ランキング:\t"); monte_simu(N, chebyshev);
124
-
125
- }
126
-
127
-
128
-
129
145
  ```
130
146
 
131
147