Информатика, вопрос задал Afradita123 , 2 года назад

Вычислите с помощью пользовательского метода сумму всех трехзначных чисел, кратных 7 в Visual Studio (С#). (СРОЧНО ПОЖАЛУЙСТА!!!!)(БАЛЛОВ НЕТ ПРОСТИТЕ.БЫЛО БЫ БОЛЬШЕ ОТДАЛА БЫ ВСЕ)

Ответы на вопрос

Ответил KnowsUser1
2

Ответ:

=== C# 7.3 ===

using System;

using System.Collections.Generic;

using System.Linq;

namespace CSLear

{

   class Program

   {

       static void Main(string[] args)

       {

           IEnumerable<int> TripleDigit = SeqGen(101, 100, x => x + 1);

           Console.WriteLine($"Sum: {SeqSum(TripleDigit, x => x % 7 == 0)}");

           Console.ReadKey();

       }

       public static int SeqSum(IEnumerable<int> Seq, Func<int, bool> Filter)

       {

           int Sum = 0;

           foreach(var item in Seq)

           {

               if (Filter(item)) Sum += item;

           }

           return Sum;

       }

       public static IEnumerable<T> SeqGen<T>(int n, T first, Func<T, T> next)

       {

           yield return first;

           T cur = first;

           for (int seqlen = 0; seqlen < n - 1; seqlen++)

           {

               cur = next(cur);

               yield return cur;

           }

       }

   }

}


KnowsUser1: с SeqGen[T] всё чуть чуть сложнее. Generic-метод SeqGen в данной программе - генератор числовой (хотя, при желании можно заставить работать с любым типом, на то он и Generic) последовательности (тип возвращаемого значения IEnumerable[T] указывает на то, что метод является итератором, то есть возвращает значения по одному).
KnowsUser1: Принимает на вход 3 параметра - длину последовательности, её первый элемент, и некую функцию (Func[T,T]), работающую с тем же типом, что и первый элемент, которая на основе этого элемента будет возвращать последующие
KnowsUser1: Использую квадратные скобки вместо угловых, ибо угловые скобки почему то удаляются
KnowsUser1: То есть логика SeqGen[T] В принципе проста как топор - принять на вход длину, первый элемент и логику для создания следующих, при первой итерации в цикле (напомним, что SeqGen - итератор) вернуть этот самый первый элемент, а дальше, запоминая значения предыдущего возвращённого, на каждой следующей итерации по одному возвращать объекты, полученные в результате вызова некой функции Func[T,T]
KnowsUser1: Как уж проще объяснить в текстовом варианте, я даже не знаю
Afradita123: Объясните пожалуйста оставшиеся 5 последних строчек
KnowsUser1: Я пересказал чуть не на пальцах всю логику работы. Какие 5 последних строчек? Скобки закрывающиеся?
Afradita123: yield return first; T cur = first;
for (int seqlen = 0; seqlen < n - 1; seqlen++)
cur = next(cur);
yield return cur;
KnowsUser1: описание того, как это работает, начинается со слов "То есть логика SeqGen[T] проста как топор - " и далее по тексту я как раз рассказал, что тут происходит. Если не понимаете, что такое yield return и как работают итераторы - зайдите в интернет, в той же официальной документации MS.NET довольно понятно описан механизм их работы
Afradita123: Извините, большое спасибо вы мне очень помогли.
Новые вопросы