二つの配列を対応(?)させたい。(C言語)
- 評価
- クリップ 0
- VIEW 2,759
一つの配列を並び替えた時、もう一つの配列もそれに対応して並び変える方法はありませんか。
例えば、一週間の体重を記録するとします。
int day[7]={3,5,4,2,6,1,7};
int weight[7]={56,54,58,52,53,60,50};
dayは何日目かを表し、weight[i]がday[i]の体重を表しているとして、
dayを昇順に並べ替えた時、それに対応してweightも並べ替えたいです。
どうすればよいでしょうか。知恵を拝借したいです。
昇順の並べ替えはfor文を使っています。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+5
day[], weight[] という別々の配列を作るというやり方があまりC言語的でありません。
struct record {
int day;
int weight;
};
という構造体を作り、この構造体の配列をソートする(dayを基準に)というのがC言語でのやり方になります。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+2
先の方が解答されている内容どちらも正しいと思います。
ただ、一般的にはyubaさんの解答が保守性、拡張性、可読性といった点でベターだとはおもいます。
(そして、オブジェクト指向言語っぽい考え方も身につきます)
考え方としては、下記のような違いがあります。
・日付の配列、体重の配列をそれぞれ用意し、日付の配列のソートに合わせて体重の配列をソートする。
・1つのレコード(日付、体重)を配列に格納し、日付でソートする。
後者であれば、レコードに身長や、脈拍なども追加したい。。。といったときに改修が簡単です。
ソートを意識しなくても、レコードに追加すれば、自動的にソートされるからです。
struct record {
int day;
int weight;
int height;
int pulse;
};
// 構造体の初期化は下記のようにできます。
struct record rec[5] = { { 3, 56, 170.2, 54.3 }.
{ 5, 54, 170.1, 52.8 }.
{ /* 略 */ }.
{ /* 略 */ }.
{ /* 略 */ } };
// 日付を取得するときは下記のようにします。
printf(“%d \n”, rec[0].day );
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
こんにちは。
単純には、dayを並び替える時にdayに施すのと同じ操作をweightにも施します。
例えば、day[5]とday[3]を入れ替えて、先頭に1を持ってくる時、一緒にweight[5]とweight[3]も入れ替えるということです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
/* スタンダードなのは出てるようなので… */
int idx[7]={0,1,2,3,4,5,6};
こんなのを用意して、ソート結果はこいつに反映させます。
で、dayやweightを参照する際はidxを介しておこなう、と。
メリットは配列(dayやweight)の入れ替えが発生しないとこ。
デメリットは処理がちょぃと複雑になるってとこでしょか。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
質問文の状況なら、"ソートをする必要は無い" と思います。
day の配列と wieght の配列から、次の配列をつくることにするのです。
dayWeigt の配列
(配列の添字を日付けにして、値を体重にする。体重の記録がなければ 値は -1 などとする。)
問題文のデータからなら次の配列を生成します。
dayWeight[0] = -1
dayWeight[1] = 60
dayWeight[2] = 52
dayWeight[3] = 56
dayWeight[4] = 58
dayWeight[5] = 54
dayWeight[6] = 53
dayWeight[7] = 50
dayWeight[8] = -1
....
作成方法例:
* dayWeight としてサイズ 31 の配列を用意して、全部の要素の値を -1 に初期設定する。
* for ループで dayWeight を埋めていく。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
同じfor文の中で処理をかけばイイのでは?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.37%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる