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

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

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

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

Q&A

解決済

2回答

3161閲覧

勝手にほかの配列の値が代入される原因(C)

kami2718

総合スコア6

C

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

0グッド

0クリップ

投稿2020/08/10 15:03

編集2020/08/10 15:07

前提・実現したいこと

巡回セールスマン問題を解くためにプログラムを作成しました。
(出発点が'A'で'B','C','D','E'を経由したのち再び'A'に戻ってくるときの経路を表示するプログラム)
無事に解くことができ、最短経路が分かったのですが、地名(点の名前)を配列に入れていましたが、ほかの配列の値が代入されてしまいました。
初めは配列nameはchar型で{'B','C','D','E'}としていましたが、文字化けしていたので、int型の{1,2,3,4}にしてみたところ今回の配列distanceの値が配列nameに代入されていることが判明しました。

該当のソースコード

C

1#include <stdio.h> 2 3int main(void) { 4 int i1,i2,i3,i4; //ループ変数の宣言 5 int name[4] = {1,2,3,4}; //地名(点の名前) 初めはchar型で{'B','C','D','E'}としていた 6 7 int distance[5][5] = {0}; //すべての距離を0で初期化 8 9 //各距離の設定(distance[A][B]とは、地点Aから地点Bまでの距離を表す) 10 distance[0][1] = 5; distance[0][2] = 3; distance[0][3] = 10; distance[0][4] = 6; 11 distance[1][2] = 7; distance[1][3] = 14; distance[1][4] = 9; 12 distance[2][3] = 7; distance[2][4] = 3; 13 distance[3][5] = 5; 14 15 //逆のルートの距離の設定(A→Bの距離をB→Aにも適用) 16 for(i1=0;i1<6;i1++) { 17 for(i2=0;i2<6;i2++) { 18 distance[i2][i1] = distance[i1][i2]; 19 } 20 } 21 22 for(i1=0;i1<4;i1++) { 23 for(i2=0;i2<4;i2++) { 24 for(i3=0;i3<4;i3++) { 25 for(i4=0;i4<4;i4++) 26 if(!(i1==i2||i1==i3||i1==i4||i2==i3||i2==i4||i3==i4)) { //重複組み合わせを排除 27 printf("%d,%d,%d,%d:",name[i1],name[i2],name[i3],name[i4]); //通ったルートの表示 28 printf(" %d\n",distance[i1][i2] + distance[i2][i3] + distance[i3][i4] + distance[0][i1] + distance[i4][0]); //距離の表示 29 } 30 } 31 } 32 } 33 34 return 0; 35} 36

###実行結果

5,3,10,6: 29 5,3,6,10: 29 5,10,3,6: 34 5,10,6,3: 29 5,6,3,10: 34 5,6,10,3: 29 3,5,10,6: 30 3,5,6,10: 30 3,10,5,6: 35 3,10,6,5: 29 3,6,5,10: 35 3,6,10,5: 29 10,5,3,6: 35 10,5,6,3: 35 10,3,5,6: 35 10,3,6,5: 34 10,6,5,3: 30 10,6,3,5: 29 6,5,3,10: 35 6,5,10,3: 35 6,3,5,10: 35 6,3,10,5: 34 6,10,5,3: 30 6,10,3,5: 29

試したこと

・地名を格納した配列をchar型からint型に変更してみた。
・どこで地名が上書きされたのかのチェック。
・配列nameの宣言を「配列distanceの逆ルート設定」の後(21行目)に移動させたら、きちんと代入され、

1,2,3,4: 29 1,2,4,3: 29 1,3,4,2: 34

となりました。

補足情報(FW/ツールのバージョンなど)

>gcc --version gcc (MinGW.org GCC Build-20200227-1) 9.2.0 Copyright (C) 2019 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

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

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

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

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

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

guest

回答2

0

C

1int distance[5][5] = {0};

の部分は、要素数は6×6なので

C

1int distance[6][6] = {0};

とすべきでした。

投稿2020/08/10 15:26

kami2718

総合スコア6

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

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

0

ベストアンサー

とりあえず、パッと見で。

int distance[5][5];という定義であるなら、添え字は4までですので、
distance[3][5] = 5;はエリアを飛び出しちゃってます。
(distance[4][0] = 5;になる。)

//逆のルートの距離の設定(A→Bの距離をB→Aにも適用) for(i1=0;i1<6;i1++) { for(i2=0;i2<6;i2++) { distance[i2][i1] = distance[i1][i2]; } }

ここも同様に、distance[5][5]までアクセスしてしまってます。

投稿2020/08/10 15:10

amiya

総合スコア1218

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

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

kami2718

2020/08/10 15:28

ご指摘ありがとうございます。 int distance[6][6] = {0}; にしたらすべてうまくいきました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問