質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

432閲覧

最短経路長を求めるプログラムにおいて、値が表示されない

katkey

総合スコア15

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/01/23 03:19

前提・実現したいこと

巡回セールスマン(最短経路長を求める)の問題において、最近傍法を用いたプログラムを作りたいです。
最近傍法とは以下の方法です。
(1)適当な地点を選ぶ。
(2)その地点から最も近い地点を選択する。
(3)訪れた地点がなくなるまで(2)を繰り返す。

発生している問題・エラーメッセージ

数字を選択するところまでは出来たのですが、
その先でプログラムが強制終了してしまいます。

pt[0]=(0.251534 0.744804) pt[1]=(0.045473 0.989166) pt[2]=(0.559954 0.325205) pt[3]=(0.047273 0.975524) pt[4]=(0.963530 0.012970) r[0][0]=0.000000 r[0][1]=0.319646 r[0][2]=0.520755 r[0][3]=0.308146 r[0][4]=1.021039 r[1][0]=0.319646 r[1][1]=0.000000 r[1][2]=0.839961 r[1][3]=0.013760 r[1][4]=1.340070 r[2][0]=0.520755 r[2][1]=0.839961 r[2][2]=0.000000 r[2][3]=0.828104 r[2][4]=0.510260 r[3][0]=0.308146 r[3][1]=0.013760 r[3][2]=0.828104 r[3][3]=0.000000 r[3][4]=1.328923 r[4][0]=1.021039 r[4][1]=1.340070 r[4][2]=0.510260 r[4][3]=1.328923 r[4][4]=0.000000 1~5までの数の中から1つを入力してください:3

#include<stdio.h> #include<stdlib.h> #include<math.h> #include<time.h> #define N 5 typedef struct xy{ double x; double y; }VTEX; int i,j,k,c,temp; VTEX pt[N]; double r[N][N]; double min,rmin; void ransuu(void){ srand((unsigned)time(NULL)); for(k=0;k<N;k++){ pt[k].x=(double)rand()/RAND_MAX; pt[k].y=(double)rand()/RAND_MAX; printf("pt[%d]=(%f %f)\n",k,pt[k]); } } void length(void){ for(i=0;i<N;i++){ for(j=0;j<N;j++){ r[i][j]=sqrt((pt[i].x-pt[j].x)*(pt[i].x-pt[j].x)+(pt[i].y-pt[j].y)*(pt[i].y-pt[j].y)); printf("r[%d][%d]=%f\n",i,j,r[i][j]); } } } void hantei(void){ //行が現在地点、列が目的地に対応する for(k=0;k<N;k++) r[k][k]=10.0; //同じところは訪れないよう経路の距離を大きな値に設定する printf("1~5までの数の中から1つを入力してください:"); scanf("%d",i); //今いる地点を地点iとする i=i-1; min=r[i][0]; for(k=0;k<N-1;k++){ for(j=0;j<N;j++) if(min>r[i][j]){min=r[i][j]; c=j;} //地点iからの最小距離を求め目的地をcとする for(k=0;k<N;k++) r[k][i]=10; //一度訪れた地点iに訪れないよう地点cに行くような経路の距離を大きい値にする temp=i; //i地点からc地点へ移動したので行列を入れ替える(c地点へ行く) i=c; c=temp; rmin=min++; //地点iから地点cまでの距離を加算していく printf("%f\n",rmin); } printf("最小経路長は%f\n",rmin); } int main(void){ ransuu(); length(); hantei(); return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

scanf("%d",i);

scanf("%d",&i);

に変更してください。

投稿2021/01/23 03:43

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問