配列について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
かをこ

配列について

#1

投稿記事 by かをこ » 17年前

お初にお目にかかります。C言語初心者かをこと申します。
先日、学校にてC言語の課題をだされ自分なりに出来るところまで作成いたしました。
その課題が
「最も残金が多かった月だけでなく、少なかった月、最も収入の多かった月も表示するプログラムを作れ。また金額が等しかった場合にはその全ての月を表示せよ」
とのことで、最も収入の多かった月まで表示するプログラムは出来たのですが、金額が等しかった場合にはそのすべての月の表示の仕方がわかりません。
if(rest[n] > maxrest){
        maxrest = rest[n];
        maxn = n;
     }
この辺りを変更するのだろうとは思うのですが、どう変更すれば良いのかが手詰まりです。
解説して頂ければと…どなたか宜しく御願いします。

Mist

Re:配列について

#2

投稿記事 by Mist » 17年前

1.maxnを配列にする
2.maxnにいくつ記憶しているかを表す変数num_maxnを追加
3.判定ソース変更
if(rest[n] > maxrest){ // 超えている場合
    maxrest = rest[n];
    maxn[0] = n;
    num_maxn = 1;
} else if (rest[n] == maxrest){ // 同じ場合
    maxn[num_maxn] = n;
    num_maxn++;
}
どう表示するかは考えてみてください。

かをこ

Re:配列について

#3

投稿記事 by かをこ » 17年前

早速のご回答ありがとうございます。
お聞きしたいことがあるのですが、
num_maxn = 1;
の意味をご解説して頂けませんか?
代入という意味で捉えるのでしょうか?

Mist

Re:配列について

#4

投稿記事 by Mist » 17年前

> maxnにいくつ記憶しているかを表す変数num_maxn
と書いたとおりなんですが、最大の値が更新されたときmaxnにはひとつ分の月しか入っていませんね。
だからnum_maxnに1を入れています。
最大値が同じ月が二つ以上ある場合は、そのたびにmaxnに記憶する月が増えるので+1ずつしています。

これでわかりますか?

かをこ

Re:配列について

#5

投稿記事 by かをこ » 17年前

お早い解答ありがとうございます。
理解できました。本当にありがとうございます。

一旦解決とさせて頂きますが、わからないことがあると思うので、その時は宜しく御願いします。

かをこ

Re:配列について

#6

投稿記事 by かをこ » 17年前

すみません。
先日教えていただいた通りやったのですが。なぜが無効な間接参照としか表示されません。
それが、
maxn[0] = n;
部分と
maxn[num_maxn] = n;
の部分なんですが、どうすれば良いでしょうか…
解決策を教えていただけないでしょうか?

やそ

Re:配列について

#7

投稿記事 by やそ » 17年前

Mistさんはmaxnに月を”複数”格納出来るように配列で
maxn[0]
maxn[num_maxn]
と書かれています。
ので
宣言の段階でmaxnを maxn[13]とする必要があるのではないでしょうか。
(なんで12ではなく13なのかな?良く見てないけど^^;)

たいちう

Re:配列について

#8

投稿記事 by たいちう » 17年前

Mistさんの書いている、

> 1.maxnを配列にする

の部分の変更はしていますか?
しているなら、変更後のソースコードを載せてください。


別の方法を提示します。Mistさんの方法と両方を行う必要はありません。
(残金が多かった月についてのみ考える)

1.ループを回して残金の最大値を求める。それが何月かは今は問わない。
2.ループをもう一度回し、残高が最大値と等しい場合に出力する。


>(なんで12ではなく13なのかな?良く見てないけど^^;)

多分、次の書き方のためですね。

> printf("%d月の収入は?", n);
> scanf("%d", &income[n]);

やそ

Re:配列について

#9

投稿記事 by やそ » 17年前

>多分、次の書き方のためですね。

> printf("%d月の収入は?", n);
> scanf("%d", &income[n]);

I'm understand!!

そっか、[1]=1月としているからなのね^^;

やそ

Re:配列について

#10

投稿記事 by やそ » 17年前

Mistさんのソースをパクって作成^^;
int num_maxn=0, maxn[13];//他の変数宣言と同じ場所で

 ・
 ・
 ・

if(rest[n] >= maxrest){ // 同額か超えている場合
    maxrest = rest[n];
    maxn[num_maxn] = n;
    num_maxn++;
}
for(i=num_maxn;i>=0;i--){
    printf("\n最も残金の多かった月は %d月で、その金額は %d円です", maxn, maxrest);
}

同額の時もmaxrestにセットしているのでMistさんのより効率が悪いかもしれませんが、
見易さ優先で(笑)

Mist

Re:配列について

#11

投稿記事 by Mist » 17年前

ツッこむぜ!

> I'm understand!!

understandは動詞なのでbe動詞はいりません。
ついでに他動詞なので目的語が必要です。

I understand this question.

>if(rest[n] >= maxrest){ // 同額か超えている場合
> maxrest = rest[n];
> maxn[num_maxn] = n;
> num_maxn++;
>}
バグってないかな?
1月:100
2月:1000
3月:1000
4月:10000
の場合、上の判定だと正しく動かないと思う。

やそ

Re:配列について

#12

投稿記事 by やそ » 17年前

確かに!(笑)

やそは understandの使い方を覚えた!(ドラクエ風)

確かに!(笑)
金額が同じ場合にしか通用しないじゃないか!m(。。)m

最大残金を上回る残金が来たら最大残金配列の[0]にセットしなおさなきゃいけないね^^;

初歩的なミスだ(笑)
わはははー。(わらってごまかす)

かをこ

Re:配列について

#13

投稿記事 by かをこ » 17年前

皆様、ご回答のほうありがとうございます!
大変お勉強になります…!
かをこ宅にコマンドプロンプトがないため、学校でしか作動することができないので
明日、学校にて作成してみます。(課題が明日までという中でなんとか皆様のお力を頼りにやってみます。)

たいちうさんの言う、maxnを配列にしたかという問いには、私はしていませんでした…。
配列ということ自体が先生から詳しく教わっておらず、色々なサイトでみましたが、学校での内容とは違い、理解することが出来ませんでした。
その配列にするというのはどういうことか教えて頂けませんか?

また、やそさんのいう最大残金配列を[0]にし直さなければならないというのは、宣言のmaxn[13]を[0]にへの書き換えのことでしょうか?

本当、無知で申し訳ない気持ちでいっぱいです…

box

Re:配列について

#14

投稿記事 by box » 17年前

> 配列ということ自体が先生から詳しく教わっておらず

素朴な疑問が一つ。
習っていない概念を使うような課題って、出るものなのでしょうか。

かをこ

Re:配列について

#15

投稿記事 by かをこ » 17年前

大雑把な説明しか教えて頂いてないため、詳しいことは聞かされてないんです。
質問するにも、ここをこうすれば良いとかは教えて頂けなくて…
兄も昔、C言語をやっていたということでそのテキストを観たのですが、どうもそのテキストの言っていることが先生の説明とは違うし、観たこともないものもありまして…
全て言い訳に聞こえるかもしれませんが…。
決して習っていないというわけではないのです。

たいちう

Re:配列について

#16

投稿記事 by たいちう » 17年前

教える側がちゃんと教えたと認識している事と、
教わる側がちゃんと教えてもらったと認識している事は違います。

また、テキストや講師によって説明の仕方が違うこともありますが、
普通は違う表現をしているだけで、十分理解すれば同じ事を説明していたと
わかると思います。
(講師かテキストの著者がその資格が疑われるほど未熟だったりする場合もあるけど)

まー誰が悪いかは知りませんが、かをこさんが今しなければならないのは
配列を応用できる位に理解することだと思うのですが。
添付してあるソースコードも十分理解できていないのではないですか?

とりあえず初心者用にやさしい説明のある信頼できるサイトを紹介します。
テキストや講師の説明ともまた違うかもしれませんが、
少なくとも十分正しいです。
http://www9.plala.or.jp/sgwr-t/c/sec02.html#s2-3
『2-3.配列』の最後に演習もありますので、それもやると良いでしょう。

# 課題が増えてしまうようなものですが急がば回れです。
# もう少し配列について理解してから本来の課題を考えれば、
# いくつかの疑問は自然と解けるでしょう。

Mist

Re:配列について

#17

投稿記事 by Mist » 17年前

う~ん、最初に提示されたソースはかをこさんが一から作られたものではなかったのでしょうか?
最初のソースの時点ですでに配列をたくさん使われているので、あの説明で十分理解できるものと思ったのですが。

> また、やそさんのいう最大残金配列を[0]にし直さなければならないというのは、宣言のmaxn[13]を[0]にへの書き換えのことでしょうか?

盛大に勘違いされているようですので具体的に説明します。

例として各月の収入が以下のような場合

1月:100
2月:1000
3月:100
4月:1000
5月:10000
6月:10000

1月の時点(最初なのでそのままセット)
maxrest = 100, maxn[0] = 1, maxn_num = 1

2月の時点(最大が更新される)
maxrest = 1000, maxn[0] = 2, maxn_num = 1

3月の時点(最大ではないので更新しない)
maxrest = 1000, maxn[0] = 2, maxn_num = 2

4月の時点(最大と同じなので覚えている月の数を増やす)
maxrest = 1000, maxn[0] = 2, maxn[1] = 4, maxn_num = 2

5月の時点(最大が更新され、覚えている月の数もひとつに戻す)
maxrest = 10000, maxn[0] = 5, maxn_num = 1

6月の時点(最大と同じなので覚えている月の数を増やす)
maxrest = 10000, maxn[0] = 5, maxn[1] = 6, maxn_num = 2

というような感じになります。
見てもらえるとわかるとおり、maxnの配列にはその時点での最大収入の月を配列の0番目から順番に記憶するようにしています。
だから、最大収入が更新されたときは0番目から記憶しなおさなければならないということです。

やそさんのいう「最大残金配列」は「最大収入の月配列」のことだと思います。

かをこ

Re:配列について

#18

投稿記事 by かをこ » 17年前

お二方、ご回答のほうありがとうございます。

たいちうさん
そうですね…私はまだ十分にすべてを理解できていないので、それとなくしかソースを理解できていないんです。
サイト紹介のほうありがとうございます。お返事を書き次第、拝見します。

Mistさん
なるほど…そういうことだったんですね。
詳しい説明ありがとうございました。

現段階で、一応解決という風にさせていただきます。
これから紹介して頂いたところに行き、学んできますね。
わからないことがまたあると思うので、その時にはよろしくお願いします。

閉鎖

“C言語何でも質問掲示板” へ戻る