2016-10-11 15 views
0

こんにちは私は、私の学校プロジェクトとして原子シミュレーションアプリケーションを作成しようとしています。私は、シンボル番号Hに格納される原子番号が格納される原子番号のように格納する各要素の配列を作成します。ストリームリーダを使用してファイルを読み込んだが、各要素を正しい配列に読み込むのが難しい。行の文字列を挿入して各要素を異なる配列に挿入する方法

txtファイルは、ここで

1,H,Hydrogen,1,1+ 
3,Li,Lithium,7,1+ 
11,Na,Sodium,23,1+ 
19,K,Potassium,39,1+ 
37,Rb,Rubidium,85,1+ 
55,Cs,Casesium,133,1+ 
87,Fr,Francium,223,1+ 
4,Be,Beryllium,9,2+ 
12,Mg,Magnesium,24,2+ 
20,Ca,Calcium,40,2+ 
38,Sr,Strontium,88,2+ 
56,Ba,Barium,137,2+ 
88,Ra,Radium,226,2+ 
5,B,Boron,10,3+ 
13,Al,Aluminium,27,3+ 
31,Ga,Gallium,70,3+ 
49,In,Indium,115,3+ 
81,Tl,Thallium,204,3+ 
6,C,Carbon,12,0 
14,Si,Silicon,28,0 
32,Ge,Germanium,73,0 
50,Sn,Tin,119,0 
82,Pb,Lead,207,0 
7,N,Nitrogen,14,3- 
15,P,Phosphorus,31,3- 
33,As,Arsenic,75,3- 
51,Sb,Antimony,122,3- 
83,Bi,Bismuth,209,3- 
8,O,Oxygen,16,2- 
16,S,Sulfur,32,2- 
34,Se,Selenium,79,2- 
52,Te,Tellurium,128,2- 
84,Po,Polonium,209,2- 
9,F,Fluorine,19,1- 
17,Cl,Chlorine,35,1- 
35,Br,Bromine,80,1- 
53,I,Iodine,127,1- 
85,At,Astatine,210,1- 
2,He,Helium,4,0 
10,Ne,Neon,20,0 
18,Ar,Argon,40,0 
36,Kr,Kryoton,85,0 
54,Xe,Xenon,131,0 
86,Rn,Radon,222,0 

です。

struct TAtom 
{ 
    public int atomicNumber; 
    public string symbol; 
    public string name; 
    public int mass; 
    public string charge; 
} 

class Atom 
{ 
    static void Main(string[] args) 
    { 
     { 
      TAtom[] Atom = new TAtom[44]; 
      Atom[0].atomicNumber = 1; 
      TAtom[] Symbol = new TAtom[44]; 
      Symbol[1].symbol = ""; 
      TAtom[] Name = new TAtom[44]; 
      Name[2].name = ""; 
      TAtom[] Mass = new TAtom[44]; 
      Mass[3].mass = '1'; 
      TAtom[] Charge = new TAtom[44]; 
      Charge[4].charge = ""; 

      string[] words; 

      StreamReader File = new StreamReader(@"JUNK1.txt"); 
      while (File.EndOfStream == false) 
      { 
       string line = File.ReadLine(); 

       words = line.Split(','); 
       } 

      File.Close(); 
     } 

    } 
} 
+1

なぜ、すべての値を完全に別々の 'TAtom'オブジェクトの配列に格納していますか?それぞれの "記録"が単一のTAtomオブジェクトを表現するのではないでしょうか?尋ねられる質問については、何を試しましたか?あなたは 'words'変数で何もしていません。 – David

+0

何をしようとしているのは、テキストファイルから値を取得し、それを探しているものに対応する別々の配列に格納することです。例えば、私はすべての私の原子番号を原子番号、シンボルへのシンボルなどに格納する必要があります。これらの配列は後で特定の値を検索するために使用できます。私のtecherは構造体を使用することをお勧めしました。私はそれを使用することを知らないので、私はこのコードで今何をしているのか分かりません。 –

+0

そのアプローチは理にかなっていません。実際には、データの各行に対して1つの 'TAtom'インスタンスを構築する必要があります。車を駐車場に保管するというアナロジーを考えてみましょう。通常、個々のスペースには1台の完全な車があります。あなたがしていることは、すべてのステアリングホイール、すべてのタイヤのためのスペース、すべてのフロントガラスのためのスペースなどがあります。そして、あなたはガレージに入るごとに各車を分解し、スペースにコンポーネントを入れます。ガレージから出るごとに各車を再組み立てする計画です。それが「機能する」とはいえ、それはかなり非効率的でエラーを起こす傾向があります。 – David

答えて

1

この変数は、ファイル内の「行」(または「記録」)からのデータが含まれています

words = line.Split(','); 

そして、このような記録は次のようになります。

1,H,Hydrogen,1,1+ 

と仮定すると、データが一貫しているとします(そうでない場合は、さまざまな場所でエラーチェックを追加したいと考えています)。

01のように TAtomのインスタンスを作成できます
var atom = new TAtom 
{ 
    atomicNumber = int.Parse(words[0]), 
    symbol = words[1], 
    name = words[2], 
    mass = int.Parse(words[3]), 
    charge = words[4] 
}; 

潜在的なランタイムエラーは、これらに限定されない:int.Parse()から例外をもたらすint

  • 無効データ。代替手段としてint.TryParse()の使用を見てください。この1行のコードを複数の行に再構成し、入力を別々に読み取り、末尾にTAtomインスタンスを構築する必要があります。
  • 無効な「レコード」は、wordsの無効なインデックスにアクセスしようとすると例外になります。使用しようとする前に、wordsの長さを確認することがあります。

あなたのコードがデバッガで何をしているのかを見ておきましょう。実行中に各行のコードをステップ実行すると、変数に何が含まれているかを見ることができます。 wordsの実行時の内容を調べることは、TAtomインスタンスを構築する方法の最大の手掛かりです。

上記の​​変数にこのインスタンスがあると、そのインスタンスを任意の配列/リスト/コレクション/ etcに追加できます。あなたは好きです。 (あなたの全体的なデザインアプローチについて上記の質問に対する私のコメントを参照してください)

+0

ありがとうございます。私はこのアイデアを捨てようとしています。なぜなら私はこれでもう何をやっているのか分かりませんが、助けてくれてありがとう。 –

-1

私はあなたがやっているように、まずデータを読むでしょう。各行はTAtomなので、カンマ区切りの単語(行)配列の適切な記号に新しいTAtomを割り当て、各行に作成するアトムを配列またはarraylistに追加します。

List<TAtom> atomList = new List<TAtom>(); 
StreamReader File = new StreamReader(@"JUNK1.txt"); 
while (File.EndOfStream == false) 
    { 
     string line = File.ReadLine(); 
     TAtom tatom = new TAtom(); 
     words = line.Split(','); 
     tatom.atomicNumber=words[0] 
     tatom.symbol=words[1] 
     tatom.name=words[2] 
     tatom.mass=words[3] 
     tatom.charge=words[4] 
     //add the current line's atom to a data structure 
     atomList.Add(tatom); 
    } 
    File.Close(); 

今度は、atomListを通じてすべてのTAtom構造体にアクセスできます。

+0

これはうまくいくと思う.. – Rice

関連する問題