質問するログイン新規登録

質問編集履歴

1

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

2020/07/21 10:13

投稿

rft3
rft3

スコア7

title CHANGED
File without changes
body CHANGED
@@ -1,11 +1,11 @@
1
- C言語、距離関数を使った問題が分からず困っています。
1
+ C言語、距離関数を使ったプログラムの実装方法が分からず困っています。
2
- 都市名name,緯度lat,経度lngをメンバに持つCity構造体の配列citiesを作成し、八王子市(35.67,139.32)との距離が近い市3位までを求めるプログラムを実装せよ、とうもなのですが、条件参考に書いてみても実行すらできず八方塞がりになっています。どうかご教授お願いいたします。
2
+ 都市名name,緯度lat,経度lngをメンバに持つCity構造体の配列citiesを作成し、八王子市(35.67,139.32)との距離が近い市3位までを求めるプログラムを実装したいのですが、「2都市間の距離求めいうおそくポインタを使うあろうコードの書方がわからず八方塞がりになっています。どうかご教授お願いいたします。
3
3
 
4
4
  [条件]
5
5
  ・3つの距離関数を定義し,各距離定義に基づき近い市を求める
6
6
  ・各距離関数は,2つのCity構造体を引数として受け取るようにする
7
7
  ・原点(0,0)からの距離を求める関数ではなく,2都市間の距離を求める必要がある点に注意する.
8
- ・実装した距離関数へのポインタを使用すること
8
+ ・実装した距離関数へのポインタを使用する
9
9
 
10
10
 
11
11
  ---
@@ -29,39 +29,47 @@
29
29
  ---
30
30
 
31
31
  ```C
32
+
32
33
  #include <stdio.h>
33
34
  #include <stdlib.h>
34
35
  #include <time.h>
35
36
  #include <math.h>
36
37
 
37
- struct City{
38
+ typedef struct{
38
-
39
39
  char name;
40
- int lat;
40
+ double lat;
41
- int lng;
41
+ double lng;
42
- }
42
+ }City;
43
43
 
44
+ City *cities;
44
45
 
46
+
47
+
45
48
  void monte_simu(int n, double (*distance)(double, double)){
46
- int m = 0;
49
+ int m = 0;
47
- for(int i = 0; i < n; i++){
50
+ for(int i = 0; i < n; i++){
48
- double x = 1.0*rand()/RAND_MAX;
51
+ double x = 1.0*rand()/RAND_MAX;
49
- double y = 1.0*rand()/RAND_MAX;
52
+ double y = 1.0*rand()/RAND_MAX;
50
- if(distance(x, y) < 1.0) m += 1;
53
+ if(distance(x, y) < 1.0) m += 1;
51
54
  }
52
- //printf(":4*%d/%d = %f\n", m, n, 4.0*m/n);
55
+ printf("1番目に近い都市:%d = %f\n", m);
56
+  printf("2番目に近い都市:%d = %f\n", m);
57
+ printf("3番目に近い都市:%d = %f\n", m);
53
58
  }
54
59
 
60
+ double euclid(double x, double y){ return sqrt(x*x + y*y); }
61
+ double manhattan(double x, double y){ return fabs(x)+fabs(y); }
62
+ double chebyshev(double x, double y){ return (x > y)? x : y; }
55
63
 
56
-
57
64
  int main(int argc, char *argv[]){
58
65
  srand((unsigned) time(NULL));
59
66
  int N = atoi(argv[1]);
60
67
  printf("マンハッタン距離ランキング:\t"); monte_simu(N, manhattan);
61
- printf("ユークリッド距離ランキング:\t"); monte_simu(N, euclid);
68
+ printf("ユークリッド距離ランキング:\t"); monte_simu(N, euclid );
62
69
  printf("チェビシェフ距離ランキング:\t"); monte_simu(N, chebyshev);
63
70
  }
64
71
 
72
+
65
73
  ```
66
74
 
67
75
  ---