fuyu-fuyu
@fuyu-fuyu (ゆ ふ)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

基礎100本ノック No,54

Q&A

Closed

解決したいこと

まずデータの個数を入力させ、次にデータの個数だけ整数値を入力させる。この入力データの中で最大値と最小値を求め表示するプログラムを作成せよ。データの個数は100個までとする。なお、データの個数とデータはファイルからリダイレクトで入力させればよいので、入力のためのメッセージは不要である(実行例を参照すること)。という問題をWindowsフォームアプリケーションで作成したいです。この後どう行動すればいいですか??

実行例

実行例
```【実行例、データファイルは下のリンクから取得せよ】
$ ./knock54 < small.data
最小値 = 128, 最大値 = 962
$ ./knock54 < middle.data
最小値 = 20, 最大値 = 988
$ ./knock54 < large.data
最小値 = 5, 最大値 = 996
$

該当するソースコード

ソースコードを入力
```OpenFileDialog ofDialog = new OpenFileDialog();
   if(ofDialog.ShowDialog() == DialogResult.OK)
   {
      MessageBox.Show(ofDialog.FileName);

      FileStream fs;
      fs = new FileStream(ofDialog.FileName,FileMode.Open);
      StreamReader r = new StreamReader(fs);

      string s;
      while((s = r.ReadLine()) != null)
      {
        MessageBox.Show(s);
      }
      List<string> a = new List<string>();
      a.Add(s);
      int b = s.Length;
      int i,c;
      for(i = 1;i < b;i++)
      {
        c = int.Parse(a[b]);
      }
   }
0

1Answer

基本的な方法は、以下のようなやり方になると思います。
最大値・最小値を保持する変数を用意して、現状の最大値を超えればmaxを更新するというようなやりかたです。
変数maxは十分小さな値、変数minは十分大きな値で初期化しておく必要があります。

string s;
List<string> a = new List<string>();
while ((s = r.ReadLine()) != null)
{
    a.Add(s);
}

int b = a.Count;
int i, c;
int max = int.MinValue, min = int.MaxValue;
for (i = 1; i < b; i++)
{
    c = int.Parse(a[i]);

    //現状の最大値を超える場合、maxを更新
    if (c > max)
    {
        max = c;
    }

    //現状の最小値を超える場合、minを更新
    if (c < min)
    {
        min = c;
    }
}

MessageBox.Show(string.Format("max:{0} min:{1}", max.ToString(), min.ToString()));

※元のソースから以下のような修正をしています。

//リストの長さを保持したいので修正
- int b = s.Length;
+ int b = a.Count;

//リストの各要素を取得したいので修正
- c = int.Parse(a[b]);
+ c = int.Parse(a[i]);

//1行ずつデータをリストに追加したいので修正
- string s;
- while((s = r.ReadLine()) != null)
- {
-     MessageBox.Show(s);
- }
- List<string> a = new List<string>();
- a.Add(s);
+ string s;
+ List<string> a = new List<string>();
+ while ((s = r.ReadLine()) != null)
+ {
+     a.Add(s);
+ }

応用的な方法として、LINQという機能を使えば最大値・最小値を簡単に取得することができます。 LINQとはコレクション(データの集合)に対する操作を拡張するものです。 今回はLINQメソッドのMax、Minを使用しました。
using System.Linq;

string s;
List<int> a = new List<int>();

bool isFirstRow = true;
while ((s = r.ReadLine()) != null)
{
    //1行目はデータの個数なので、リストに追加しない
    if (isFirstRow)
    {
        isFirstRow = false;
        continue;
    }
    a.Add(int.Parse(s));
}

MessageBox.Show(string.Format("max:{0} min:{1}", a.Max().ToString(), a.Min().ToString()));


ちなみにfor文は、変数をあらかじめ用意せず以下のような書き方が一般的です。
for(int i = 1; i <= a.Count; i++)
{
}
0Like

Comments

  1. @fuyu-fuyu

    Questioner

    今回もわかりやすい説明ありがとうございます!!

Your answer might help someone💌