2016-04-14 7 views
1

私はTAFEで勉強していますが、クラスと自分自身は私の講師から全く助けを得ていません。c#テキストファイルを読むmin min average averageを探す

私はtxtファイルから読み込み、それから最小最大値と平均値を見つけてそれをコンソールに出力する必要があります。

以前の練習では、配列からmin max averageを得ることができましたが、これを書いても問題ありません。私はVS2012を使用しています。

私は、テキストファイルを読み込んでコンソールに出力するコードを書いていますが、min maxとaverageを見つけることができません。私は "オブジェクトのインスタンスに設定されていないオブジェクト参照"を取得します。私はプログラムを実行します。

配列からmin maxの平均値を求めるのに同じコードを使用していますが、これは問題だと感じていますが、私はそれを解決できません!!

はここで、配列のための私のコード...これが正常に動作述べたように

 static void Main(string[] args) 
     { 
      int[] hoursArray = { 1, 24, 9, 7, 6, 12, 10, 11, 23, 8, 2, 9, 8, 8, 9, 7, 9, 15, 6, 1, 7, 6, 12, 10, 11, 23, 1, 2, 9, 8 }; 
      for (int i = 0; i < hoursArray.Length; i++) 
      { 
       Console.WriteLine(hoursArray[i].ToString()); 
      } 

      { 

       { 
        int low = hoursArray[0]; 
        for (int index = 1; index > hoursArray.Length; index++) 
        { 
         if (hoursArray[index] < low) 
         { 
          low = hoursArray[index]; 
         } 
        } 

        Console.WriteLine("Lowest Hours Parked = " + low); 

       int high = hoursArray[0]; 
       for (int index = 1; index < hoursArray.Length; index++) 
       { 
        if (hoursArray[index] > high) 
        { 
         high = hoursArray[index]; 
        } 
       } 

       Console.WriteLine("Highest Hours Parked = " + high); 

        int total = 0; 
        double average = 0; 
        for (int index = 0; index < hoursArray.Length; index++) 
        { 
         total = total + hoursArray[index]; 
        } 

        average = (double)total/hoursArray.Length; 
        Console.WriteLine("Average Hours Parked =" + average.ToString("N")); 

        Console.ReadLine(); 
       } 
      } 
     } 
    } 
} 

です。今、私の問題... のために私は、ファイルの内容を読み込んでintにそれらを変換するために...

 static void Main(string[] args) 
    { 
     StreamReader hours = new StreamReader("hours.txt"); 
     string number = ""; 

     while (number != null) 
     { 
      number = hours.ReadLine(); 
      if (number != null) 
       Console.WriteLine(number); 
     } 
     //list of numbers above is all ok when running program 

     int total = 0; 
     double average = 0; 
     for (int index = 0; index < number.Length; index++) 
     { 
      total = total + number[index]; 
     } 
     average = (double)total/number.Length; 
     Console.WriteLine("Average = " + average.ToString("N2")); 

     int high = number[0]; 

     for (int index = 0; index < number.Length; index++) 
     { 
      if (number[index] > high) 
      { 
       high = number[index]; 
      } 
     } 

     Console.WriteLine("Highest number = " + high); 

     int low = number[0]; 

     for (int index = 0; index > number.Length; index++) 
     { 
      if (number[index] < low) 
      { 
       low = number[index]; 
      } 
     } 
     Console.WriteLine("Lowest number = " + low); 
     hours.Close(); 
       Console.ReadLine(); 
     } 
    } 
} 
+0

コードの2番目のチャンクでの問題は、あなたが数字で読むが、どこにでもそれらを格納いけないので、いいえ、あなたがそれらを使用するカント後で。あなたは数字にすべてを読み込みます(あなたのファイルの途中で誰も猫を書かなかったと仮定します)。しかし、配列やリストに入れないでください。これをヒントとして取り、これが助けになるかどうかを確認してください – BugFinder

+0

最初の数値のみを文字列変数に格納していて、その文字列の文字をループして合計値を計算します。代わりにリストを作成し、最初の行(条件は変更する必要があります)だけでなくすべての行を読み込み、各行の文字列を整数にキャストし、リスト(または配列)に整数を格納します。 –

答えて

0

使用File.ReadLinesを私のコメントと以下のとおりにテキストファイルからデータを表示するコードを書かれています単純なステートメントを使用して配列を作成します。

int[] hoursArray = File 
    .ReadLines("filepath") // Read all lines, 
    .SelectMany(s => s.Split(",").Select(int.Parse)) // Split by ',' and convert them to int. 
    .ToArray(); 

これを実行すると、残りのコードはそのまま動作するはずです。

また、もう1つの提案として、配列には、AverageMinMaxという所定のメソッド/関数があります。

あなただけでもできます。

var avg = hoursArray.Average(); 
var min = hoursArray.Min(); 
var max = hoursArray.Max(); 
+0

'File.ReadAllLines'の代わりに' File.ReadLines'を使うのが普通です。 –

+0

それは本当です。大きなファイルの場合は常に 'File.ReadLines'を使って更新することをお勧めします。ありがとう@DmitryBychenko –

+0

コードが短くなっていますが、@Dmitry Bychenkoが提供するソリューションは、必要なループが1つだけであるため、高速です。 – Abbas

0
string text = System.IO.File.ReadAllText("filePath"); 
     int[] hoursArray = (text.Split(' ').ToArray()).Select(x => Convert.ToInt32(x)).ToArray(); 
     int max = hoursArray.Max(); 
     int min = hoursArray.Min(); 
     double avg = hoursArray.Average(); 
+0

LinQコードは短いですが、@Dmitry Bychenkoによって提供されるソリューションは、必要なループが1つだけであるため、高速です。 – Abbas

3

私はLINQのを使用することをお勧め:

// First of all define the source - it can be an array, file - whatever: 
// var source = hoursArray; // e.g. source for the array 
var source = File 
    .ReadLines(@"C:\MyFile.txt")   //TODO: put actual file here 
    .SelectMany(line => line.Split(',')) //TODO: put actual separator here 
    .Select(item => int.Parse(item)); 

// having got source (IEnumerable<int>) let's compute min, max, average 

int max = 0; 
int min = 0; 
double sum = 0.0; // to prevent integer division: 7/2 = 3 when 7.0/2 = 3.5 
int count = 0; 
boolean firstItem = true; 

foreach (item in source) { 
    sum += item; 
    count += 1; 

    if (firstItem) { 
    firstItem = false; 
    max = item; 
    min = item; 
    } 
    else if (item > max) 
    max = item; 
    else if (item < min) 
    min = item; 
} 

// Finally, formatted output 
Console.Write("Min = {0}; Max = {1}; Average = {2}", min, max, sum/count); 
+0

これは正解です。 – Abbas