Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/34: Рейтинг темы: голосов - 34, средняя оценка - 4.59
4 / 4 / 0
Регистрация: 07.09.2009
Сообщений: 190

Покритикуйте код по задаче со структурами

02.02.2012, 01:45. Показов 6836. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Выполнял задачу по структурам. Вроде выполнил правильно, но вышел достаточно кривой код. Прошу дать замечания по коду и проверить правильность выполнения мною задания.

Задание:
1. В задаче подразумевается, что исходная информация хранится в текстовом файле input.txt, каждая строка которого содержит полную информацию о некотором объекте, результирующая информация должна быть записана в файл output.txt.
2. Для хранения данных внутри программы организовать массив структур.
3. В типе структура реализуется метод CompareTo интерфейса IComparable, перегружается метод ToString базового класса object и необходимые операции отношения, поля данных и дополнительные методы продумайте самостоятельно.

На основе данных входного файла составить багажную ведомость камеры хранения, включив следующие данные: ФИО пассажира, количество вещей, общий вес вещей. Вывести в новый файл информацию о тех пассажирах, средний вес багажа которых превышает заданный, отсортировав их по количеству вещей, сданных в камеру хранения

Входной файл:
Anton, 6, 42
Nina, 5, 11
Vasa, 2, 34
Lusa, 3, 48
Выходной файл:
ФИО Vasa, количество вещей в багаже 2, вес багажа 34
ФИО Lusa, количество вещей в багаже 3, вес багажа 48
ФИО Anton, количество вещей в багаже 6, вес багажа 42
Код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
namespace упражнения_2.Интерфейсы
{
    
    struct BagageList : IComparable
    {
        string Name;
        int CountOfThings;
        public static double Weight;
        double AverageWeight;
        
        public BagageList(string Name, int CountOfThings, double AverageWeight) : this()
        {
            this.Name = Name;
            this.CountOfThings = CountOfThings;
            this.AverageWeight = AverageWeight;
        }
 
        public bool checkWeight()
        {
            if (AverageWeight > Weight)
                return true;
 
            else
                return false;
        }
 
        public int CompareTo(object obj)
        {
            BagageList person = (BagageList) obj;
            return this.CountOfThings.CompareTo(person.CountOfThings);
        }
 
        public override string ToString()
        {
            return String.Format("ФИО {0}, количество вещей в багаже {1}, вес багажа {2}\n", Name, CountOfThings, AverageWeight);
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            BagageList[] passanger = new BagageList[4];
            string[] fileData =  new string[3];
            string[] fileData2 = new string[4];
            int i = 0;
            int newSize = 0;
            string data = string.Empty;
            StreamReader file = new StreamReader(@"c:\passanger.txt");
            Console.WriteLine("Считывание из файла.");
            while ((data = file.ReadLine()) != null)
            {
                string name = string.Empty;
                int things = 0;
                double weight = 0;
                fileData = data.Split(", ".ToCharArray());
                
                name = fileData[0];
                things = Convert.ToInt32(fileData[2]);
                weight = Convert.ToDouble(fileData[4]);
                   
                passanger[i] = new BagageList(name, things, weight);
                i++;
            }
 
            foreach (BagageList p in passanger)
            {
                Console.Write(p.ToString());
            }
            
            Console.WriteLine();
            
            Array.Sort(passanger);
            BagageList.Weight = 30;
 
            for (int j = 0; j < fileData2.Length; j++)
            {
                if (!passanger[j].checkWeight())
                {
                    continue;
                }
                
                fileData2[j] = passanger[j].ToString();
 
                if (!(fileData2[j] == null))
                {
                    newSize++;
                }
            }
 
            for (int j = 0; j < fileData2.Length - 1; j++)
            {
                string temp;
                if (fileData2[j] == null)
                {
                    temp = fileData2[j + 1];
                    fileData2[j + 1] = fileData2[j];
                    fileData2[j] = temp;
                }
            }
 
            Array.Resize(ref fileData2, newSize);
            File.WriteAllLines(@"c:\passanger2.txt", fileData2);
            Console.WriteLine("Запись в файл завершенна.");
        }
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.02.2012, 01:45
Ответы с готовыми решениями:

Описать новый структурный тип. Описать требуемые в задаче функции для работы со структурами. Продемонстрироват
УСЛОВИЕ : Описать новый структурный тип. Описать требуемые в задаче функции для работы со структурами. Продемонстрировать выполнение...

Покритикуйте код
https://github.com/wwall/wtf/tree/master/src Критику желательно конструктивную. Проект только в самом начале. Добавлено через 39...

Покритикуйте код
Добрый день. Пытался устроиться на работу (C# junior программист, зп 15-20к). По результатам выполнения задания, на работу не взяли....

15
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
02.02.2012, 07:32
1.
Цитата Сообщение от ArniLand Посмотреть сообщение
C#
1
2
3
4
5
6
7
public bool checkWeight()
 {
 if (AverageWeight > Weight)
 return true;
else
 return false;
 }
можно заменить на
C#
1
2
3
4
        public bool checkWeight()
        {
            return (AverageWeight > Weight);
        }
2. вы постоянно объявляете локальные переменные, инициализируете, а потом затираете. Чтобы код проще читался, стОит объявлять переменные, как можно ближе к месту использования.
к примеру
Цитата Сообщение от ArniLand Посмотреть сообщение
C#
1
2
3
4
5
6
7
string name = string.Empty;
 int things = 0;
 double weight = 0;
 fileData = data.Split(", ".ToCharArray());
name = fileData[0];
 things = Convert.ToInt32(fileData[2]);
 weight = Convert.ToDouble(fileData[4]);
можно заменить на
C#
1
2
3
4
 fileData = data.Split(", ".ToCharArray());
string name = fileData[0];
int things = Convert.ToInt32(fileData[2]);
double weight = Convert.ToDouble(fileData[4]);
3. есть шанс словить InvalidCastException в CompareTo методе - нужно добавить проверку типа.
4. Вы считываете файл до конца, но у вас массив всего из 4-х элементов. используйте List<BagageList>
5. почему вы назвали структуру BagageList? Ведь это только 1 багаж, а не коллекция
5.
Цитата Сообщение от ArniLand Посмотреть сообщение
C#
1
Console.Write(p.ToString());
toString() - лишний тут
6.
Цитата Сообщение от ArniLand Посмотреть сообщение
C#
1
if (!(fileData2[j] == null))
используйте !=, лишние скобочки не нужны тогда
7. не используйте русские имена
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
02.02.2012, 12:06
Цитата Сообщение от ArniLand Посмотреть сообщение
средний вес багажа которых превышает заданный
Задача решена неправильно, так как не выполнено это условие. (:
Поясняю:
Цитата Сообщение от ArniLand Посмотреть сообщение
BagageList.Weight = 30;
Это было сделано очень зря.

В общем, в программе очень много багов таких, как не закрытый файл для чтения, и неправильных алгоритмов (ака костылей).
Без использования Linq (через себя) написал бы так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using System;
using System.IO;
using System.Text;
 
struct Baggage : IComparable<Baggage>
{
    private string _name;
    private int _countOfThings;
    private double _weight;
 
    public Baggage(string name, int countOfThings, double weight)
    {
        _name = name;
        _countOfThings = countOfThings;
        _weight = weight;
    }
 
    public double Weight
    {
        get { return _weight; }
    }
 
    public bool CheckWeight(double averageWeight)
    {
        return averageWeight < _weight;
    }
 
    public int CompareTo(Baggage value)
    {
        return _countOfThings.CompareTo(value._countOfThings);
    }
 
    public override string ToString()
    {
        return string.Format("ФИО {0}, количество вещей в багаже {1}, вес багажа {2}", _name, _countOfThings, _weight);
    }
}
 
class Program
{
    static Baggage[] ReadFile(string path)
    {
        string[] fileData = File.ReadAllLines(path, Encoding.Default);
        Baggage[] bags = new Baggage[fileData.Length];
        for (int i = 0; i < bags.Length; i++)
        {
            string[] info = fileData[i].Split(new[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries);
            bags[i] = new Baggage(info[0], int.Parse(info[1]), double.Parse(info[2]));
        }
        return bags;
    }
 
    static void SaveFile(string path, Baggage[] bags, double averageWeight)
    {
        StringBuilder result = new StringBuilder();
        foreach (Baggage baggage in bags)
            if (baggage.CheckWeight(averageWeight))
                result.AppendLine(baggage.ToString());
        File.WriteAllText(path, result.ToString(), Encoding.Default);
    }
 
    static double AverageWeightBuggage(Baggage[] bags)
    {
        double sum = 0;
        foreach (Baggage baggage in bags)
            sum += baggage.Weight;
        return sum / bags.Length;
    }
 
    static void Main()
    {
        Console.WriteLine("Считывание из файла.");
        Baggage[] bags = ReadFile("input.txt");
        Array.Sort(bags);
        foreach (Baggage baggage in bags)
            Console.WriteLine(baggage);
 
        double averageWeight = AverageWeightBuggage(bags);
        Console.WriteLine("Средний вес багажа = {0}", averageWeight);
 
        SaveFile("output.txt", bags, averageWeight);
        Console.WriteLine("Запись в файл завершенна.");
    }
}
P.S. Задача у вас выполнена неправильно хотя бы потому, что:
Цитата Сообщение от ArniLand Посмотреть сообщение
хранится в текстовом файле input.txt
Цитата Сообщение от ArniLand Посмотреть сообщение
должна быть записана в файл output.txt
0
4 / 4 / 0
Регистрация: 07.09.2009
Сообщений: 190
02.02.2012, 17:49  [ТС]
Blood-Angel,
1. очень принципиально какие названия имеют текстовые файлы?
2. Условие в задаче средний вес багажа которых превышает заданный. Weight это заданный(общий) вес багажа, а AverageWeight это средний вес багажа каждого пассажира. Вот и сравниваю условие (AverageWeight > Weight) в методе checkWeight . Если значение true, то в ношу в выходной файл информацию о пассажире, а если false то не вношу. Поясните, пожалуйста, почему не выполняется условие?
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
02.02.2012, 18:09
1. Принципиально выполнять задание так, как требуется.

Цитата Сообщение от ArniLand Посмотреть сообщение
Weight это заданный(общий) вес багажа, а AverageWeight это средний вес багажа каждого пассажира.
Да ну? То, как вы это сейчас написали, не отражено в вашем коде. И переменные нормально называть надо!
Вопрос на сообразительность! Что здесь не так:
Цитата Сообщение от ArniLand Посмотреть сообщение
C#
1
public BagageList(string Name, int CountOfThings, double AverageWeight)
Цитата Сообщение от ArniLand Посмотреть сообщение
C#
1
2
weight = Convert.ToDouble(fileData[4]);
passanger[i] = new BagageList(name, things, weight);
0
4 / 4 / 0
Регистрация: 07.09.2009
Сообщений: 190
02.02.2012, 18:18  [ТС]
Для чего подсчитывать средний вес всего багажа, если в задаче требует сравнивать средний вес каждого багаж каждого пасажжира, а не всех вместе?
C#
1
2
3
4
5
6
static double AverageWeightBuggage(Baggage[] bags)
    {
        double sum = 0;
        foreach (Baggage baggage in bags)
            sum += baggage.Weight;
        return sum / bags.Length;
Добавлено через 3 минуты
Blood-Angel, названия переменным не правильно даны.
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
02.02.2012, 18:22
Цитата Сообщение от ArniLand Посмотреть сообщение
Anton, 6, 42
Nina, 5, 11
Vasa, 2, 34
Lusa, 3, 48
Тогда скажи мне, где здесь средний вес багажа? (:
Вот только не надо говорить, что последнее число.
0
4 / 4 / 0
Регистрация: 07.09.2009
Сообщений: 190
02.02.2012, 18:24  [ТС]
Последнее число. Я подумал, что достаточно просто указать средний вес в файле.
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
02.02.2012, 18:26
Цитата Сообщение от ArniLand Посмотреть сообщение
включив следующие данные: ФИО пассажира, количество вещей, общий вес вещей.
Тогда несостыковочка получается. (:
Какого черта тогда выводим средний вес в конце строки, если он не общий?
Цитата Сообщение от ArniLand Посмотреть сообщение
ФИО Vasa, количество вещей в багаже 2, вес багажа 34
ФИО Lusa, количество вещей в багаже 3, вес багажа 48
ФИО Anton, количество вещей в багаже 6, вес багажа 42
И это не объясняет волшебное число 30.
0
4 / 4 / 0
Регистрация: 07.09.2009
Сообщений: 190
02.02.2012, 18:38  [ТС]
что за волшебное число 30?
Наверное моя ошибка, просто записывать общий вес багажа в таком случае в файле всех пассажиров?
Не пойму смысл сравнивать средний вес багажа всех пассажиров с заданным и вносить в файл. Если средний вес всех пассажиров будет меньше заданного, файл будет пустой. Поэтому там и пишут каждого пассажира.
.
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
02.02.2012, 18:54
Цитата Сообщение от ArniLand Посмотреть сообщение
что за волшебное число 30?
Цитата Сообщение от ArniLand Посмотреть сообщение
C#
1
BagageList.Weight = 30;
Халтурить не хорошо.

Цитата Сообщение от ArniLand Посмотреть сообщение
Не пойму смысл сравнивать средний вес багажа всех пассажиров с заданным и вносить в файл.
Сделал вывод на основе этого предложения:
Цитата Сообщение от ArniLand Посмотреть сообщение
Вывести в новый файл информацию о тех пассажирах, средний вес багажа которых превышает заданный
Это что-то у вас неправильная логика, мне вот лично непонятно как вы из этой строки:
Цитата Сообщение от ArniLand Посмотреть сообщение
Anton, 6, 42
сможете найти общий вес багажа? Замечу то, что багаж у пассажира один, а вещей в багаже 6.
Задача 2-3 класса по математике: нахождение среднего веса багажа, зная вес багажа каждого пассажира.

Цитата Сообщение от ArniLand Посмотреть сообщение
Поэтому там и пишут каждого пассажира.
Там слово "каждого" не фигурирует.
0
4 / 4 / 0
Регистрация: 07.09.2009
Сообщений: 190
02.02.2012, 18:59  [ТС]
что за волшебное число 30? Вспомнил, это заданный вес.
Вывести в новый файл информацию о тех пассажирах, средний вес багажа которых превышает заданный
Ну фигурирует слово о тех пассажирах. Разве это не означает, что нужно проверят вес каждого отдельного пассажира, а не всех вместе?
Есть же разница между понятиями общий и средний?
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
02.02.2012, 19:03
Цитата Сообщение от ArniLand Посмотреть сообщение
что за волшебное число 30? Вспомнил, это заданный вес.
Это все равно халтура. В задаче ничего не говорилось о 30 (почему не 20, 15, 100500? - а ответ-то совсем другой получится). И это уже признак не детерминированного решения: на одни и те же входные данные, разные выходные. Я очень сильно сомневаюсь, что так задумывалось в такого рода сложности задачи.

Цитата Сообщение от ArniLand Посмотреть сообщение
Разве это не означает, что нужно проверят вес каждого отдельного пассажира, а не всех вместе?
Вы мне общий вес посчитайте багажа так, чтобы он совпадал с примером входного/выходного файла в первом посте. Тогда я соглашусь с этим сомнительным мнением.

Цитата Сообщение от ArniLand Посмотреть сообщение
Есть же разница между понятиями общий и средний?
На удивление есть. Это абсолютно не одно и тоже. (:
Пример: имеем числа 1, 2, 3, 4, 5.
Задача: Найти общее и среднее.
Решение:
Общее = 1 + 2 + 3 + 4 + 5 = 15
Среднее = Общее / Количество = 15 / 5 = 3
0
4 / 4 / 0
Регистрация: 07.09.2009
Сообщений: 190
02.02.2012, 19:26  [ТС]
Blood-Angel, я просто сам указал вес, можно дать пользователю возможность его указывать.
Про общий и средний вес - это был риторический вопрос, я пошутил вообще то
А зачем общему весу багажа всех пассажиров, совпадать в обеих файлах? Значение среднего багажа не меняется.
В условие
Вывести в новый файл информацию о тех пассажирах, средний вес багажа которых превышает заданный, отсортировав их по количеству вещей, сданных в камеру хранения
Я не пойму зачем проверять средний вес всех пассажиров. Какой смысл в этом условие тогда, если пассажиры не пройдут проверку, то выходной файл будет пустой.
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
02.02.2012, 19:34
Цитата Сообщение от ArniLand Посмотреть сообщение
если пассажиры не пройдут проверку, то выходной файл будет пустой.
Замените в вашей программе 30 на 49.

Цитата Сообщение от ArniLand Посмотреть сообщение
Я не пойму зачем проверять средний вес всех пассажиров.
Пока вы мне не скажите то, как вы считаете общий вес (так, чтобы совпадал с примером в первом посте), я больше не отвечу на этот тред.
0
4 / 4 / 0
Регистрация: 07.09.2009
Сообщений: 190
02.02.2012, 19:39  [ТС]
Просто про суммирую весь вес каждого багажа.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.02.2012, 19:39
Помогаю со студенческими работами здесь

Покритикуйте код
Есть класс Студенты (реализован через односвязный список), хотел бы услышать критику по поводу его улучшения, если кому не лень разбираться...

Покритикуйте код
class AutoLotDal { private const string _connectionStr = @&quot;Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\autolot.accdb&quot;; ...

Покритикуйте код
Код использует Direct2D и WIC, и преобразует изображение (поворот, масштабирование, зеркальное отображение, формат, монохромность)....

Покритикуйте код
В продолжение моей прошлой темы. Накидал тут игрушку на swing 2048, воспользовался советом который дали другому пользователю. Раньше я уже...

Покритикуйте код
Здравствуйте. Начинаю изучать jquery. Пожалуйста просмотрите код для сайта http://www.training.od.ua/. Хотелось бы узнать ваше мнение о...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru