2

だから私は架空の国勢調査データをtxtからソートするこのコードを持っています。ファイル:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

class Program
{
    const int SIZE = 900;
    const int SIZEDISTRICT = 22;
    const int RANGE = 5;
    static void Main()
    {   
        //These arrays will hold the split data from a text file.
        int[] districtDataD = new int[900];
        string[] districtDataG = new string[900];
        string[] districtDataM = new string[900];
        int[] districtDataA = new int[900];

        //countDistrict will hold how many hypothetical people in each hypothetical district and 
        //ages will hold how many hypothetical people between certain hypothetical ages.
        int[] countDistrict = new int[SIZEDISTRICT];
        int[] ages = new int[RANGE] { 0, 18, 30, 45, 65};


        //Modules
        ReadFile(districtDataD, districtDataG, districtDataM,districtDataA);
        CountPopulation(districtDataD, countDistrict);
        AgeRanges(districtDataA, ages);
        DisplayData(districtDataD, districtDataA, ages);
    }//End Main


    //This module splits and inserts the data into the four first arrays
    static void ReadFile(int[] districtDataD, string[] districtDataG, string[] districtDataM, int[] districtDataA)
    {
        string[] lines = File.ReadAllLines("census.txt");
        int i = 0;

        while (i < SIZE && i < districtDataD.Length)
        {
            foreach (string line in File.ReadAllLines("census.txt"))
            {
                string[] parts = line.Split(',');

                districtDataD[i] = int.Parse(parts[0]);
                districtDataG[i] = parts[1];
                districtDataM[i] = parts[2];
                districtDataA[i] = int.Parse(parts[3]);
                i++;
            }
        }
    }
    //This module counts how many hypothetical people are in each fictional district
   static void CountPopulation(int[] districtDataD, int[] countDistrict)
    {
        int i = 0;
        for (i = 0; i < districtDataD.Length; i++)
        {
            if (districtDataD[i] > 0 && districtDataD[i] < districtDataD.Length)
            {
                countDistrict[districtDataD[i]]
                    ++;
            }
        }
    }


    //This module sorts the ages into 0-18, 19-30, 31-45, 46-65, and 65 and up
     private static void AgeRanges(int[] districtDataA, int[] ages)
     {
         int idx = 0;
         for (idx = 0; idx < districtDataA.Length && ages[idx] > districtDataA[idx]; idx++)
         {

             ages[idx] = districtDataA[idx];
         }
     }


    //This module displays the data
     static void DisplayData(int[] countDistrict, int[] ageDistrict, int[] ages)
    {
        int index = 0;
        for (index = 0; index < countDistrict.Length; index++)
        {
            Console.WriteLine(" District {0}: {1}", index + 1, countDistrict[index]);
        }

        int x = 0;
        for (x = 0; x < ageDistrict.Length; x++)
        {
            Console.WriteLine("Ages under {0} : {1}", ages[x], ageDistrict[x]);
        }
    }
}

範囲外のインデックス エラーが表示されますが、どこでどのように検索するのかわかりません。

txt。ファイルは現在このようになっていますが、約 100 程度の追加を含むように拡張されます。900 は上限として使用されます。

21、f、s、14

41、女、女、22

12、メートル、秒、12

11、f、s、8

29, メートル, メートル, 4

6、メートル、秒、12

9、f、s、2

30、f、s、1

4

2 に答える 2

1

配列の長さが分からない場合は、代わりにコレクションを使用してください。これにより、ファイル サイズの長さに依存しなくなります。配列を使用して、配列の長さを設定する必要があります。これは、私が理解しているように、ファイルに応じて変更される可能性があります。これにより、適切な実装がないと、インデックスが範囲外になるという問題が常に発生します。コレクションを使用すると、これらの問題を回避できます

List<int> districtDataD = new List<int>();

次に、次のようにこのコレクションにアイテムを追加できます。

districtDataD.Add(1);
于 2013-04-08T06:42:15.213 に答える
1

ほとんどの場合、次の場所でエラーが発生しています。

            string[] parts = line.Split(',');
            districtDataD[i] = int.Parse(parts[0]);
            districtDataG[i] = parts[1];
            districtDataM[i] = parts[2];
            districtDataA[i] = int.Parse(parts[3]);

parts.Length使用前に確認してください。どの行にも 3 つのコンマ (',') が含まれていない可能性があります。

エラーの別の考えられる原因は次のとおりです。

countDistrict[districtDataD[i]]
于 2013-04-08T06:53:49.947 に答える