Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2015, 11:10   #1
Obey177
Форумчанин
 
Регистрация: 29.08.2010
Сообщений: 159
По умолчанию Переоформление кода

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

Задача

Петя успевает по математике лучше всех в классе, поэтому учитель задал ему сложное домашнее задание, в котором нужно в заданном наборе целых чисел найти сумму всех положительных элементов, затем найти где в заданной последовательности находятся максимальный и минимальный элемент и вычислить произведение чисел, расположенных между ними. Так же известно, что минимальный и максимальный элемент встречаются в заданном множестве чисел только один раз. Поскольку задач такого рода учитель дал Пете около ста, то Петя как сильный программист смог написать программу, которая по заданному набору чисел самостоятельно находит решение. А Вам слабо?

Входные данные

В первой строке входного файла INPUT.TXT записано единственное число N – количество элементов массива. Вторая строка содержит N целых чисел, представляющих заданный массив. Все элементы массива разделены пробелом. Каждое из чисел во входном файле не превышает 102 по абсолютной величине.

Выходные данные

В единственную строку выходного файла OUTPUT.TXT нужно вывести два числа, разделенных пробелом: сумму положительных элементов и произведение чисел, расположенных между минимальным и максимальным элементами. Значения суммы и произведения не превышают по модулю 3*104.

Моё решение
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace ConsoleApplication9
{
    class Program
    {
        static void Main(string[] args)
        {
            int minmaxproizv = 1;
            string[] str_arr = File.ReadAllLines("Input.txt");
            string[] Spl = str_arr[1].Split(' ');
            int[] intstr=new int[Spl.Length];
            for(int i=0;i<=Spl.Length-1;i++)
            {
                intstr[i] = Convert.ToInt32(Spl[i]);
            }
            int min = posmin(intstr);
            int max = posmax(intstr);
            int sumpos = sumpositive(intstr);
            if (min < max)
            {
                for (int i = min + 1; i <= max - 1; i++)
                {
                    minmaxproizv = minmaxproizv * intstr[i];
                }
                string otvet = sumpos + " " + minmaxproizv;
                File.WriteAllText("Output.txt", otvet);
            }
            else
            {
                for (int i = max + 1; i <= min - 1; i++)
                {
                    minmaxproizv = minmaxproizv * intstr[i];
                }
                string otvet = sumpos + " " + minmaxproizv;
                File.WriteAllText("Output.txt", otvet);
            }
        }
        
        static int sumpositive(int[] splint)
        {
            int sum = 0;
            for(int i=0;i<=splint.Length-1;i++)
            {
                if(splint[i]>0)
                {
                    sum = sum + splint[i];
                }
            }
            return sum;
        }
        
        static int posmin(int[] splint)
        {
            int min=splint[0];
            int pos = 0;
            for(int i=1;i<=splint.Length-1;i++)
            {
                if (min > splint[i])
                {
                    min = splint[i];
                    pos = i;
                }
            }
            return pos;
        }
        
        static int posmax(int[] splint)
        {
            int max = splint[0];
            int pos = 0;
            for (int i = 0; i <= splint.Length - 1; i++)
            {
                if (max < splint[i])
                {
                    max = splint[i];
                    pos = i;
                }
            }
            return pos;
        }
    }
}
Obey177 вне форума Ответить с цитированием
Старый 17.04.2015, 11:40   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Не самый оптимальный вариант, зато короткий :
Код:
using System;
using System.IO;
using System.Linq;

namespace ConsoleApplication
{
    class Program
    {
        static void Main()
        {
            var numbers = File.ReadAllLines("input.txt")[1].Split(' ').Select(int.Parse).ToList();

            int positiveSum = numbers.Where(n => n > 0).Sum();

            int maxPos = numbers.IndexOf(numbers.Max());
            int minPos = numbers.IndexOf(numbers.Min());

            int prod = numbers.GetRange(Math.Min(maxPos, minPos) + 1, Math.Abs(minPos - maxPos) - 1).Aggregate(1, (acc, val) => acc * val);

            File.WriteAllText("output.txt", positiveSum + " " + prod);
        }
    }
}
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 17.04.2015 в 11:46.
Alex11223 вне форума Ответить с цитированием
Старый 17.04.2015, 13:22   #3
Obey177
Форумчанин
 
Регистрация: 29.08.2010
Сообщений: 159
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Не самый оптимальный вариант, зато короткий :
Код:
using System;
using System.IO;
using System.Linq;

namespace ConsoleApplication
{
    class Program
    {
        static void Main()
        {
            var numbers = File.ReadAllLines("input.txt")[1].Split(' ').Select(int.Parse).ToList();

            int positiveSum = numbers.Where(n => n > 0).Sum();

            int maxPos = numbers.IndexOf(numbers.Max());
            int minPos = numbers.IndexOf(numbers.Min());

            int prod = numbers.GetRange(Math.Min(maxPos, minPos) + 1, Math.Abs(minPos - maxPos) - 1).Aggregate(1, (acc, val) => acc * val);

            File.WriteAllText("output.txt", positiveSum + " " + prod);
        }
    }
}
а расписать можно?
Obey177 вне форума Ответить с цитированием
Старый 17.04.2015, 13:40   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А чего тут расписывать?

LINQ используется, чтоб не писать самому циклы и т.д., изучайте его и станет понятно.

Для получения индексов мин/макс сначала ищутся сами их значения, а потом ищется индекс элемента с этим значением https://msdn.microsoft.com/en-us/lib...vs.110%29.aspx
Конечно можно оптимизировать, чтоб два прохода не делать, но влом и смысл был в краткости и простоте http://stackoverflow.com/questions/4...ray-using-linq

List<T>.GetRange https://msdn.microsoft.com/en-us/lib...vs.110%29.aspx для получения указанной части списка.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 17.04.2015 в 13:42.
Alex11223 вне форума Ответить с цитированием
Старый 19.04.2015, 09:41   #5
Obey177
Форумчанин
 
Регистрация: 29.08.2010
Сообщений: 159
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А чего тут расписывать?

LINQ используется, чтоб не писать самому циклы и т.д., изучайте его и станет понятно.

Для получения индексов мин/макс сначала ищутся сами их значения, а потом ищется индекс элемента с этим значением https://msdn.microsoft.com/en-us/lib...vs.110%29.aspx
Конечно можно оптимизировать, чтоб два прохода не делать, но влом и смысл был в краткости и простоте http://stackoverflow.com/questions/4...ray-using-linq

List<T>.GetRange https://msdn.microsoft.com/en-us/lib...vs.110%29.aspx для получения указанной части списка.
Вот эти команды распишите пожалуйста

Aggregate(1, (acc, val) => acc * val);
Select(int.Parse).ToList();
Obey177 вне форума Ответить с цитированием
Старый 19.04.2015, 10:21   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Говорю ж, изучайте LINQ и станет понятно.

1 произведение всех чисел списка
http://stackoverflow.com/questions/7...ithm-explained
https://msdn.microsoft.com/en-us/lib...vs.100%29.aspx
http://www.dotnetperls.com/aggregate

2 преобразование списка строк в список чисел. То есть каждый элемент исходного списка превращается в то, что вернул метод int.Parse.
https://msdn.microsoft.com/en-us/lib...vs.100%29.aspx
http://www.dotnetperls.com/select
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Компиляцию кода MAtlab в C++Builder и использование преобразованного кода .м в C++Builder Leg1oner C++ Builder 0 07.01.2014 18:15
Оптимизация кода LatuSerge Общие вопросы Delphi 10 27.12.2011 01:51
Распознавание Аски кода и скан кода MyLastHit Общие вопросы Delphi 8 06.12.2010 18:34
Переоформление проекта GUI Form1 DENSHER Помощь студентам 0 30.03.2010 15:37
Выдернуть куски кода из html-кода trafbite Помощь студентам 7 18.08.2007 13:51