dポイントプレゼントキャンペーン実施中!

C#で台形の面積を求めるプログラムを作成しています。
プログラムの手順としては、
①台形の面積を求めたいことを宣言する。
②テキストファイルのファイル名を入力してもらう。
③入力されたテキストファイルを読み込む。(テキストファイルには上底、下底、高さの数値が記入されている。
④テキストファイルの数値を式に代入し台形の面積を求める。
という流れになっています。

①②③はできたのですが、④の操作をどうすればよいかわかりません。
いろいろ調べてはみたのですが、よくわかりませんでした。
④の操作をどうすればよいか教えてください。

自分なりに作ったプログラムは下記の通りです。
よろしくお願いします。

using System;
using System.IO;

class Test
{
public static void Main()
{
try
{
//台形の面積を求めたいことを宣言する
Console.WriteLine("台形の面積Sを計算します。");
Console.ReadLine();

//読み込みたいファイル名を入力してもらう。
//テキストファイルには上底、下底、高さの数値が入力されている。
Console.Write("読み込むファイル名を入力してください。(拡張子も含む)→");

var str = Console.ReadLine();
string filePath = Path.GetFileName(str);

Console.WriteLine(filePath);
Console.ReadKey();

//ファイルを読み込む
using (StreamReader sr = new StreamReader(str))
{
string line;
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
Console.Read();
}
catch (Exception e)
{
Console.WriteLine("ファイルを読み取れませんでした:");
Console.WriteLine(e.Message);
Console.Read();

//読み込んだテキストファイルの上底、下底、高さの数値から台形の面積を求める。
Console.Write("台形の面積Sは");




}
}
}

質問者からの補足コメント

  • 文字列を数字に変換しようと思いいろいろ試しましたがよくわかりませんでした。

      補足日時:2020/05/08 17:59
  • double d = double.Parse(str);
    Console.WriteLine(d);
    Console.ReadKey();
    Console.Write("台形の面積Sは");
    double S;
    S = (d + d) * d / 2.0;
    Console.WriteLine(S);
    Console.ReadLine();

    double型に変換したいと思い、上記のようなプログラムを追加しましたがうまくいきませんでした。

      補足日時:2020/05/09 00:05
  • また、読み取るテキストファイルには、上から、
    上底=2
    下底=3
    高さ=4
    と書いてあります。

    テキストファイルは、
    上底=2
    下底=3
    高さ=4
    のすべてを一気に読み取るのですが、それも問題なのでしょうか?

      補足日時:2020/05/09 00:06
  • ファイルを一気に読み取るというのは、テキストファイル名を入力するとテキストファイルに書いてある文を全て読み取ります。
    また、追加プログラムを加えてやると結果が面が画像のようになります。

    「C#のプログラムについての質問」の補足画像4
      補足日時:2020/05/09 09:49
  • kmeeさんの言う通りです。
    テキストファイルには
    2
    3
    4
    とだけ書いてあって、
    それを
    文字列変数line読み込んで、
    double a = double.Parse(line) 等と数値にして台形の面積を計算するプログラムを作成したいです。

    ・次のReadLine() より前に、現在の行の文字列から数値を取り出し記録する。
    ・別の変数(配列、List等を含む)に読み出した全てを記憶させ、後で各数値を取り出す。というのはどうすれば良いでしょうか?

      補足日時:2020/05/10 13:18

A 回答 (4件)

○どの変数が、ある時点で、何を記憶しているか、を整理しましょう。



例えば、 変数line は Readline()でファイルから1行読み込んだものを記憶しています。
ですが、ループで同じ変数を使い回しているので、2行目を読み込んでしまったら、1行目の内容は忘れてしまいます。

各行から後で使うための値を取得するなら、次のいずれかの方法を使う必要があります
・次のReadLine() より前に、現在の行の文字列から数値を取り出し記録する。
・別の変数(配列、List等を含む)に読み出した全てを記憶させ、後で各数値を取り出す


○ double.Parse(string s) に指定する文字列 s は、「数値を表現した文字列」である必要があります。

現在テキストファイル読み込んだ文字列は、1行全て、つまり「上底=2」等となっています。
これは「上底=」という余計な文字列が付いているので、「数値を表現した文字列」ではありません。
よって、Parseはエラー(例外)になります。

Parseする前に、数字の部分だけ抜き出す必要があります。
方法はいくつかあります。
・ "=" を探して、それ以降をSubStringで取り出す
・数字を抜き出すような正規表現を使う
・"=" で Split して数字の部分を使う



初心者向け入門書の課題のようなプログラム内容と、文字列から数字の部分を抜き出すというやや高度な操作とが、ちぐはぐな気がします。
テキストファイルの内容は、本当にそれであっているのですか?

テキストファイルには
2
3
4
とだけ書いてあって、
それを
・文字列変数line読み込んで
・double a = double.Parse(line) 等と数値にして
・確認用に Console.WriteLine("上底=" + a.ToString()) ; みたいに出力する
ということなのでは?
    • good
    • 0

もっと具体的に書いてほしいんだけどなぁ.... 例えば「うまくいきませんでした」というのは, なにがどうなって「うまくいきませんでした」と判断した? 「うまくいかない」ときにどうなるか, ちゃんと理解してから使ってる?



あと「すべてを一気に読み取る」ってどういうこと? ReadLine でそれだけ全部読み込んだってこと?
    • good
    • 0

その「いろいろ試しましたがよくわかりませんでした」のところ, 具体的にはどのようなことを試してなにがどう「よくわからなかった」んで

すか?
    • good
    • 0

ファイルから文字列を読み込むのができているんだったら, その文字列を数字に変換すればいい.



「台形の面積」の計算方法は知ってるよね?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!