Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.81
Денис199208
0 / 0 / 1
Регистрация: 29.05.2013
Сообщений: 73
#1

Найти сумму четных элементов массива целых чисел. Размерность массива – 20. Заполнение массива осуществить случайными числами от 100 до 200 - C#

29.09.2013, 06:57. Просмотров 4142. Ответов 32
Метки нет (Все метки)

Найти сумму четных элементов массива целых чисел. Размерность массива – 20. Заполнение массива осуществить случайными числами от 100 до 200
http://www.cyberforum.ru/csharp-beginners/thread816483.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.09.2013, 06:57
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Найти сумму четных элементов массива целых чисел. Размерность массива – 20. Заполнение массива осуществить случайными числами от 100 до 200 (C#):

Подсчитать сумму четных элементов одномерного массива целых чисел
Пользователем вводится одномерный массив целых чисел. Подсчитать сумму четных...

Дан массив 10 целых чисел. Найти количество четных элементов массива
Дан массив 10 целых чисел. Найти количество четных элементов массива.Элементы...

Заполнение массива случайными числами
const n = 10; type miniarr = array of integer; var a, b:...

Заполнение массива случайными числами
Вот есть код: using System; { class Program { static...

Заполнение массива случайными числами
Нужно создать массив и заполнить его рандомными числами

32
aleks_pilipenko
)))
606 / 286 / 55
Регистрация: 31.12.2009
Сообщений: 2,253
Записей в блоге: 3
29.09.2013, 07:39 #2
C#
1
2
3
4
5
6
7
8
9
10
11
            int[] massiv = new int[20];
            int sum = 0;
            Random rand = new Random();
            for (int i = 0; i < 20; i++)
            {
                massiv[i]=rand.Next(100,200);
            }
            for (int i = 0; i < 20; i++)
            {
                if (massiv[i] % 2 == 0) sum += massiv[i];
            }
0
Денис199208
0 / 0 / 1
Регистрация: 29.05.2013
Сообщений: 73
29.09.2013, 07:48  [ТС] #3
спасибо Вам за помощь!
0
_Mutex
Заблокирован
29.09.2013, 09:59 #4
C#
1
2
3
4
5
6
 Random rnd = new Random(DateTime.Now.Millisecond);
            var result = (from elem in ((int[])Array.CreateInstance(typeof(int),20)).Select(x => { return rnd.Next(100, 200); })
                          where elem % 2 == 0
                          select elem).Sum();
            Console.Write(result);
            Console.ReadLine();
1
aleks_pilipenko
)))
606 / 286 / 55
Регистрация: 31.12.2009
Сообщений: 2,253
Записей в блоге: 3
29.09.2013, 10:26 #5
Цитата Сообщение от _Mutex Посмотреть сообщение
(from elem in ((int[])Array.CreateInstance(typeof(int),20)).Select(x => { return rnd.Next(100, 200); })
* * * * * * * * * * * * * where elem % 2 == 0
* * * * * * * * * * * * * select elem).Sum();
Это где учат такую "коляску" рисовать?
0
Diman777
359 / 331 / 108
Регистрация: 12.02.2013
Сообщений: 653
29.09.2013, 10:39 #6
C#
1
2
3
4
5
6
7
8
9
10
11
12
    class Program
    {
        static void Main(string[] args)
        {
            Random rand = new Random();
            int[] mas = new int[20].Select(x => rand.Next(100, 200)).ToArray();
            int sum = mas.Where(x => x % 2 == 0).Sum();
            Console.WriteLine(sum);
 
            Console.ReadKey();
        }
    }
0
aleks_pilipenko
)))
606 / 286 / 55
Регистрация: 31.12.2009
Сообщений: 2,253
Записей в блоге: 3
29.09.2013, 10:45 #7
Цитата Сообщение от Diman777 Посмотреть сообщение
class Program
* * {
* * * * static void Main(string[] args)
* * * * {
* * * * * * Random rand = new Random();
* * * * * * int[] mas = new int[20].Select(x => rand.Next(100, 200)).ToArray();
* * * * * * int sum = mas.Where(x => x % 2 == 0).Sum();
* * * * * * Console.WriteLine(sum);
Console.ReadKey();
* * * * }
* * }
Чуть выше тоже самое, зачем дублировать?
0
Diman777
359 / 331 / 108
Регистрация: 12.02.2013
Сообщений: 653
29.09.2013, 10:54 #8
Цитата Сообщение от aleks_pilipenko Посмотреть сообщение
Чуть выше тоже самое, зачем дублировать?
никто и не дублировал
не мое это - дублировать)
У меня просто более проще выглядит, и поэтапно как-то...
отдельно объявил, заполнил, и отдельно вычислил сумму...
Можно хоть массив вывести, чтоб посмотреть из чего вообще сумма вычислялась
0
kolorotur
Эксперт .NET
9917 / 8302 / 2037
Регистрация: 17.09.2011
Сообщений: 14,285
29.09.2013, 10:58 #9
Цитата Сообщение от Diman777 Посмотреть сообщение
C#
1
new int[20].Select(x => rand.Next(100, 200)).ToArray();
Лишний массив только для генерации другого массива?
Не жирно?
0
Diman777
359 / 331 / 108
Регистрация: 12.02.2013
Сообщений: 653
29.09.2013, 11:05 #10
kolorotur, объясните... вы имеете ввиду метод ToArray() ? то что он создает копию?
0
kolorotur
Эксперт .NET
9917 / 8302 / 2037
Регистрация: 17.09.2011
Сообщений: 14,285
29.09.2013, 11:08 #11
Цитата Сообщение от Diman777 Посмотреть сообщение
объясните...
Ну смотрите, вы создаете массив из 20-и элементов:
Цитата Сообщение от kolorotur Посмотреть сообщение
C#
1
new int[20]
Потом делаете обход этого массива, и для каждого элемента х (которые все равны нулю), генерируете случайное число:
Цитата Сообщение от kolorotur Посмотреть сообщение
C#
1
.Select(x => rand.Next(100, 200))
После чего получившуюся последовательность переводите снова в массив, тем самым создавая еще один:
Цитата Сообщение от kolorotur Посмотреть сообщение
C#
1
.ToArray();
В результате на выходе у вас получается один массив на 20 элементов, заполненный нулями, который будет болтаться в памяти, пока его не подберет сборщик; и второй массив, заполненный случайными числами, который и будет использоваться в дальнейшем.

Замените new int[20] на Enumerable.Range(0, 20) и будет норм
2
Diman777
359 / 331 / 108
Регистрация: 12.02.2013
Сообщений: 653
29.09.2013, 11:31 #12
kolorotur,
C#
1
int[] mas = Enumerable.Range(0, 20).Select(x => rand.Next(100, 200)).ToArray();
а в этом случае как все происходит? Range генерирует последовательность чисел, далее получается, они заполняются случайными числами и метод ToArray() разве опять не создает копию? Разъясните поэтапно...
0
_Mutex
Заблокирован
29.09.2013, 11:48 #13
Цитата Сообщение от aleks_pilipenko Посмотреть сообщение
Это где учат такую "коляску" рисовать?
C#
1
2
3
4
5
 var result = (from elem in
                              from elem2 in new int[20]
                              select rnd.Next(100, 200)
                          where elem % 2 == 0
                          select elem).Sum();
Добавлено через 2 минуты
Цитата Сообщение от Diman777 Посмотреть сообщение
kolorotur,
C#
1
int[] mas = Enumerable.Range(0, 20).Select(x => rand.Next(100, 200)).ToArray();
а в этом случае как все происходит? Range генерирует последовательность чисел, далее получается, они заполняются случайными числами и метод ToArray() разве опять не создает копию? Разъясните поэтапно...
1 array -IEnumerabe (after Range)
2 array -IEnumerable (after select)
3 array -to Array()
0
kolorotur
Эксперт .NET
9917 / 8302 / 2037
Регистрация: 17.09.2011
Сообщений: 14,285
29.09.2013, 12:41 #14
Цитата Сообщение от Diman777 Посмотреть сообщение
а в этом случае как все происходит?
В этом случае будет цикл с перебором, без создания массива.
Собственно массив будет создан только при вызове ToArray.
Кстати, там будет создано несколько массивов, в зависимости от количества элементов, так что лучше этого метода избегать при больших перечислениях и заранее известном количестве элементов.

Цитата Сообщение от Diman777 Посмотреть сообщение
Range генерирует последовательность чисел, далее получается, они заполняются случайными числами и метод ToArray() разве опять не создает копию?
Метод ToArray — создает (причем, возможно, не одну).
Range — не создает.

Цитата Сообщение от _Mutex Посмотреть сообщение
1 array -IEnumerabe (after Range)
2 array -IEnumerable (after select)
Range и Select-то с какого перепугу массивы создают? Первый — простой итератор по циклу от а до б, второй — преобразователь по делегату.
1
_Mutex
Заблокирован
29.09.2013, 15:19 #15
Цитата Сообщение от kolorotur Посмотреть сообщение
Range и Select-то с какого перепугу массивы создают? Первый — простой итератор по циклу от а до б, второй — преобразователь по делегату.
Посмеялся с вашей тупости )))
Range - создает НОВЫЙ массив, причем его элементы заполнены по порядку 1,2,3,4,5,6...типа IEnumerable
Select - создает НОВЫЙ массив из существующего, проекцией каждого его элемента на новый, и возвращает (ты можешь создать любой массив из существующего и вернуть его, не обязательно тип int)
0
kolorotur
Эксперт .NET
9917 / 8302 / 2037
Регистрация: 17.09.2011
Сообщений: 14,285
29.09.2013, 15:30 #16
Цитата Сообщение от _Mutex Посмотреть сообщение
Посмеялся с вашей тупости
Сынок, не надо хамить незнакомым людям.

Итак, еще раз:

Цитата Сообщение от _Mutex Посмотреть сообщение
Range - создает НОВЫЙ массив, причем его элементы заполнены по порядку 1,2,3,4,5,6...типа IEnumerable
С какого перепугу Range создает массив?

Цитата Сообщение от _Mutex Посмотреть сообщение
Select - создает НОВЫЙ массив из существующего, проекцией каждого его элемента на новый, и возвращает (ты можешь создать любой массив из существующего и вернуть его, не обязательно тип int)
С какого перепугу Select создает массив?
0
Diman777
359 / 331 / 108
Регистрация: 12.02.2013
Сообщений: 653
29.09.2013, 15:53 #17
Цитата Сообщение от kolorotur Посмотреть сообщение
В этом случае будет цикл с перебором, без создания массива.
Собственно массив будет создан только при вызове ToArray.
Кстати, там будет создано несколько массивов, в зависимости от количества элементов, так что лучше этого метода избегать при больших перечислениях и заранее известном количестве элементов.
Спасибо, теперь будем знать
0
_Mutex
Заблокирован
29.09.2013, 16:30 #18
Цитата Сообщение от kolorotur Посмотреть сообщение
Сынок, не надо хамить незнакомым людям.

Итак, еще раз:


С какого перепугу Range создает массив?


С какого перепугу Select создает массив?
Я тебе не сынок.
С какого перепугу солнце светит на улице?
Читай Linq разбирайся тогда поймешь, если сможешь.
Можешь еще отмотать мне репутацию, коли ума не хватает а завидно!!!

ПС. прикольный тут форум черт возьми ))))

Добавлено через 5 минут
Такие как ты меня действительно смешат, когда цифры себе накрутят а по уму то не тянут ) И задают тупые вопросы.
0
kolorotur
Эксперт .NET
9917 / 8302 / 2037
Регистрация: 17.09.2011
Сообщений: 14,285
29.09.2013, 17:28 #19
_Mutex, то есть по делу сказать больше нечего?
Могли бы так и написать: "понятия не имею, почему эти два метода не создают массивы, но почему-то считаю, что создают". Вам бы сразу же на пальцах объяснили что и как там происходит на самом деле.
Вместо этого начинаете паясничать и выглядите глупо.

Конечно же, написать одну строчку в консольном приложении, чтобы убедиться — это слишком сложно, намного проще устраивать клоунаду на форуме.
C#
1
Console.WriteLine(Enumerable.Range(10, 20) is Array); // False
Итак, по делу.
Реализация метода IEnumerable.Range:
C#
1
2
3
4
5
IEnumerable<int> Range(int start, int count)
{
   for (int i = 0; i < count; i++)
      yield return start + i;
}
Массив, как видите, не создается, но есть непонятно слово yield.
Тот, кто все-таки читает не то, чтобы про 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
IEnumerable<int> Range(int start, int count)
{
   return new RangeEnumerable(start, count);
}
 
class RangeEnumerable : IEnumerable<int>
{
   private int _start, _count;
   public RangeEnumerable(int start, int count)
   {
      _start = start;
      _count = count;
   }
   public IEnumerator<int> GetEnumerator()
   {
      return new RangeIterator(start, count);
   }
 
   class RangeIterator : IEnumerator<int>
   {
      private int _first, _last;
 
      public RangeIterator(int start, int count)
      {
         _first = start;
         _last = start + count;
      }
      public int Current
      {
         get { return _first; }
      }
      public bool MoveNext()
      {
         if (_first < _last)
         {
            _first++;
            return true;
         }
         return false;
      }
      public void Dispose() {}
      public void Reset() { throw new NotSupportedException(); }
   }
}
Ну а сам цикл foreach будет развернут из такой конструкции:
C#
1
2
foreach (int a in Enumerable.Range(x, y))
   Console.WriteLine(a);
Вот в такую:
C#
1
2
3
4
5
6
7
IEnumerable<int> rangeEnumerable = Enumerable.Range(x, y);
using (var iter = rangeEnumerable.GetEnumerator())
   while (iter.MoveNext())
   {
      int current = iter.Current;
      Console.WriteLine(current);
   }
Точно то же самое происходит с методом Select, только там вместо инкремента вызывается делегат с параметром.
Как видите, нигде массивы не создаются, ибо не нужны.
2
_Mutex
Заблокирован
29.09.2013, 19:16 #20
Снова посмеялся. )))
C#
1
Console.WriteLine(Enumerable.Range(10, 20) is Array); // False
Он генерирует объект реализующий интерфейс IEnumerable. С чего ты решил, что это должен быть Array, Array это вообще отдельный тип.

Хахах, для тебя слово массив значит Array? А нет List, Map и тд.? Но даже Array, это ТОЖЕ объект, заметь и тоже массив!.
Все, что можно перечислить, можно отнести к массиву, возьми на заметку. И заметь ВСЕ они реализуют IEnumerable.

C#
1
2
3
4
5
IEnumerable<int> Range(int start, int count)
{
   for (int i = 0; i < count; i++)
      yield return start + i;
}
Мальчик забыл, что такое yield return похоже, или не знал. Ничего такое бывает, придется пояснить 1 раз.
Этот код ЗА КУЛИСАМИ, создает объект (генерирует ) реализующий интерфейс IEnumerable. Метод foreach просто получает готовый IEnumerable (сгенерированный) ,вызывает в нем GetEnumerator(), получает Enumerator, который и реализуется через yield return. Можно yield return не использовать , а делать все руками. Это абстракция, которая за кулисами создает готовый объект.


Ниже пишет, то же о чем я выше написал, сам понимая, что генерируется новый массив. Видимо думая что я не знаю ))).
Ниже код, где видно наглядно что генерируется новый массив IEnumerable в обоих случаях.
C#
1
2
3
 foreach (var elem in Enumerable.Range(0, 10)) Console.WriteLine(elem);
            int[] init = new int[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
            foreach(var elem2 in init.Select<int, bool>(elem => false))Console.WriteLine(elem2);
Про Select видимо, парень снова забыл для чего он нужен. Он не знает, что Select, это отображение (проекция) элемента на НОВЫЙ элемент массива, стало быть и массив должен быть новым, разве не так?

Мне отматывает репутацию, а себе клацает спасибки ))). Больше сюда не зайду.
0
29.09.2013, 19:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2013, 19:16
Привет! Вот еще темы с решениями:

Найти сумму четных элементов массива и найти произведение нечетных элементов массива
Вводим кол-во элементов массива, массив заполняется случайными числами, найти...

Формирование массива целых чисел из массива строк с числами
индекс выходит из границ массива, в комментариях я написал что и как......

Заполнение двухмерного массива случайными и неповторяющимися числами
Доброго времени суток. В задачке нужно заполнить двухмерный(трехмерный) массив...

Дан массив целых чисел. Найти сумму элементов массива, кратных А или В
2) В массиве хранятся сведения об оценках 25 учеников по химии. Определить...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru