Простой File I / O - Читать новую строку - PullRequest
1 голос
/ 09 ноября 2009

У меня есть файл, в котором хранятся результаты экзаменов для класса учащихся. Я пытаюсь написать программу, которая успешно открывает файл, считывает результаты экзаменов, находит среднюю оценку, самую высокую оценку и самую низкую оценку и распечатывает их. Средний балл должен быть напечатан с 2 цифрами после десятичной точки.

Это то, что я имею до сих пор:

static void Main()
{
    string myData = "";
    int temp = 0;
    int max = 0;
    int min = 0;
    double average = 0;
    StreamReader fileReader = new StreamReader("data.txt");

    do
    {
        myData = fileReader.ReadLine();

        if (myData != null)
        {
            max = int.Parse(myData);
            temp = int.Parse(myData);

            if (temp > max)
                temp = max;
        }

    } while (myData != null);

    fileReader.Close();
    Console.ReadLine();
}//End Main()

Я точно не знаю, как поступить. Как мне прочитать в новой строке и назначить его для временного? Я не думаю, что я делаю это правильно.

Ответы [ 9 ]

7 голосов
/ 09 ноября 2009

Вот один из способов огорчить вашего учителя: P

static void Main(string[] args)
{
    var file = new StreamReader("scores.txt");
    var split = file.ReadToEnd().Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);            

    IEnumerable<int> ints = split.Select(x => int.Parse(x));

    Console.WriteLine("Total Scores:" + ints.Count());
    Console.WriteLine("Max:" + ints.Max());
    Console.WriteLine("Min:" + ints.Min());
    Console.WriteLine("Average:" + ints.Average().ToString("0.00"));
    Console.ReadLine();
}

Хотя это технически правильно, это непродуктивно для понимания алгоритмов (какими бы базовыми они ни были), и я предлагаю вам взглянуть на другие ответы. Но это демонстрирует, насколько универсален .NET Framework.

<3 LINQ </p>

4 голосов
/ 09 ноября 2009

Первая ошибка, которую я обнаружил, состоит в том, что max всегда будет в точности равным temp, поскольку вы присваиваете им одинаковое значение, поэтому if никогда не будет истинным:

max = int.Parse(myData);
temp = int.Parse(myData);

if (temp > max)
2 голосов
/ 09 ноября 2009

Неплохо. Вот некоторый псевдокод:

  1. File.ReadAllLines для получения массива строк (вызовите эти строки)
  2. Строка Foreach в строках
    1. Синтаксический анализ двойного числа (? Гарантированно, что каждая строка будет int?)
    2. если max <проанализировано, max = проанализировано </li>
    3. если min> проанализировано, min = проанализировано
    4. сумма + = разобрано
  3. Распечатка min, max, (sum / lines.count) .ToString ("000.00")

Предполагается, что файл выглядит следующим образом:

25
12
33,5
100
75
...

1 голос
/ 09 ноября 2009

Я так понимаю, это основная суть вашего задания. Вы должны быть осторожны при копировании этого кода.

double count = 0.0;
double min = double.MaxValue;
double max = double.MinValue;
double total = 0.0;
using(StreamReader sr = new StreamReader(@"c:\data.txt"))
{
    while (!sr.EndOfStream)
    {
        String line = sr.ReadLine();
        double value = double.Parse(line.Trim());
        if (value < min) min = value;
        if (value > max) max = value;
        total += value;
        count++;
    }
}

Console.WriteLine("Min: {0}", min);
Console.WriteLine("Max: {0}", max);
Console.WriteLine("Avg: {0}", (total / count).ToString("0.00"));
Console.ReadLine();
1 голос
/ 09 ноября 2009

Как насчет того, чтобы выделить процессы? Сделайте чтение и заполните список целых чисел содержимым файла. Затем выполните обработку для мин / макс и затем усредните.

Изоляция проблем поможет вам сосредоточиться на них. Мне нравится называть это шумоподавлением. Как подрядчик, я работаю над большим количеством грязного кода, и одна из причин, по которым их трудно понять, заключается в том, что в то же время происходит слишком много работы. Если вы упростите то, что происходит, код почти сам напишет. Это также называется разделением интересов. Это очень важный принцип программирования.

После того, как вы изолировали проблемы и получили работающий код, вы можете попытаться снова собрать все это вместе, чтобы процесс стал более эффективным (если вы сделаете это inline с чтением файла, то вы будете держать только одну строку в памяти одновременно).

1 голос
/ 09 ноября 2009

Поскольку это домашнее задание, я просто дам вам несколько подсказок.

Прямо сейчас вы устанавливаете «макс» каждый раз в цикле. Попробуйте только установить темп и посмотреть, что произойдет. Возможно, вы захотите рассмотреть значение по умолчанию max (при его создании) очень маленьким числом вместо 0.

Кроме того, вам нужно сделать что-то похожее для «min», но по умолчанию это очень большое число.

int max = int.MinValue;
int min = int.MaxValue;

Чтобы получить среднее значение, вам необходимо иметь сумму и счет и отслеживать их. Затем, в конце, используйте double для вычисления среднего и напечатайте. Чтобы получить 2 знака после запятой, вы можете использовать среднее значение. ToString ("N") - формат "N" делает красиво отформатированное число с 2 знаками после запятой по умолчанию.

1 голос
/ 09 ноября 2009

Для начала вам нужно избавиться от строки "max = int.Parse (myData)". В противном случае вы продолжите перезаписывать max текущим значением.

0 голосов
/ 10 ноября 2009

Привет всем, кто помогал и предлагал предложения, вот моя последняя реализация кода (без использования массивов)

using System;
using System.IO;

class Program
{
static void Main()
{
    string line = "";
    int value = 0;
    int max = 0;
    int min = 100;
    int total = 0;
    double count = 0.0;
    double average = 0;

    StreamReader fileReader = new StreamReader(@"data.txt");

    do
    {
        line = fileReader.ReadLine();

        if (line != null)
        {
            value = int.Parse(line);

            if (value > max)
                max = value;

            if (value < min)
                min = value;

            total += value;
            count++;
        } 
    } while (line != null);

    average = total / count;

    Console.WriteLine("Max: {0}", max);
    Console.WriteLine("Min: {0}", min);
    Console.WriteLine("Avg: {0:f2}", average); 

    Console.ReadLine();
}//End Main()
}//End class Program
0 голосов
/ 09 ноября 2009
static void Main(string[] args)
{
    const string filename = @"data.txt";
    bool first = true;
    int min=0, max=0, total=0;

    var lines = File.ReadAllLines(filename);

    foreach (var line in lines)
    {
        var score = int.Parse(line.Trim());
        if (first)
        {
            min = max = total = score;
            first = false;
            continue;
        }
        if (score < min)
            min = score;
        if (score > max)
            max = score;
        total += score;
    }

    if (first)
    {
        Console.WriteLine("no input");
        return;
    }

    var average = (double)total/lines.Length;
    Console.WriteLine(string.Format("Min: {0}, Max: {1}, Average: {2:F2}", min, max, average));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...