🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1084閲覧

配列が書き換わる理由

gh_pockey

総合スコア5

C

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/11/12 14:44

######C言語で以下の問題に取り組んでいたのですが、どうも帰ってくる値が間違っています。

###DPコンテストCの問題

引用テキスト明日から太郎君の夏休みが始まります。 太郎君は夏休みの計画を立てることにしました。

夏休みはN日からなります。各i(1≤i≤N) について、
i日目には太郎君は次の活動のうちひとつを選んで行います。
A: 海で泳ぐ。 幸福度a_iを得る。
B: 山で虫取りをする。 幸福度 b_iを得る。
C: 家で宿題をする。 幸福度 c_iを得る。
太郎君は飽き性なので、2日以上連続で同じ活動を行うことはできません。
太郎君が得る幸福度の総和の最大値を求めてください。
入力は以下の形式で標準入力から与えられる。
N
a_1 b_1 c_1
a_2 b_2 c_2
...
a_N b_N c_N

###自分の回答

C

1#include <stdio.h> 2#include <math.h> 3 4int n; 5 6int main() { 7 scanf("%d", &n); 8 double a[2][n];//入力される値 9 //n日目にA,B,C(0,1,2であらわす)を選択したときの幸福度の最大 10 double score[2][n]; 11 for (size_t i = 0; i < n; i++) { 12 scanf("%lf%lf%lf", &a[0][i], &a[1][i], &a[2][i]); 13 } 14 15 //scoreを0で埋める 16 for (size_t i = 0; i < n; i++) { 17 for (size_t j = 0; j < 3; j++) { 18 score[j][i] = 0; 19 } 20 } 21 //n日目からn+1日目を出す 22 for (size_t i = 0; i < n; i++) { 23 printf("1:%d / %d / %d // %d / %d / %d\n", (int)score[0][i + 1], (int)score[1][i + 1], (int)score[2][i + 1], (int)score[0][i], (int)score[1][i], (int)score[2][i]); 24 score[0][i + 1] = fmax(score[1][i],score[2][i]) + a[0][i]; 25 printf("2:%d / %d / %d // %d / %d / %d\n", (int)score[0][i + 1], (int)score[1][i + 1], (int)score[2][i + 1], (int)score[0][i], (int)score[1][i], (int)score[2][i]); 26 score[1][i + 1] = fmax(score[0][i],score[2][i]) + a[1][i]; 27 printf("3:%d / %d / %d // %d / %d / %d\n", (int)score[0][i + 1], (int)score[1][i + 1], (int)score[2][i + 1], (int)score[0][i], (int)score[1][i], (int)score[2][i]); 28 score[2][i + 1] = fmax(score[1][i],score[0][i]) + a[2][i]; 29 printf("4:%d / %d / %d // %d / %d / %d\n", (int)score[0][i + 1], (int)score[1][i + 1], (int)score[2][i + 1], (int)score[0][i], (int)score[1][i], (int)score[2][i]); 30 } 31 printf("%d\n", (int)fmax(score[0][n], fmax(score[1][n], score[2][n]))); 32 return 0; 33}

試したこと

ところどころに書いてあるprintfで、配列の値がどう変化しているのか見てみました。
すると本来書き換わってほしくないscore[1][0],score[2][0]などが書き換わっていてこれが原因であることは分かりましたが、なぜこれらの値が書き換わっているのかわかりません。ご教授お願い致します。

#####入力

1 100 10 1

出力

1:0 / 0 / 0 // 0 / 0 / 0 2:200 / 0 / 0 // 0 / 200 / 0 3:200 / 100 / 0 // 0 / 200 / 100 4:200 / 100 / 210 // 0 / 200 / 100 210

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

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

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

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

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

guest

回答1

0

ベストアンサー

double a[2][n];//入力される値
scanf("%lf%lf%lf", &a[0][i], &a[1][i], &a[2][i]);

範囲外アクセスしています

double score[2][n];

こっちの方も範囲外アクセスとなってます
よく確認しましょう

投稿2019/11/12 14:50

編集2019/11/12 14:57
y_waiwai

総合スコア88038

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

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

gh_pockey

2019/11/12 15:11

配列について正しく理解出来ていませんでした。ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問