C#

C# помогите написать простую прогу

Написать программу, которая в одномерном массиве, состоящем из n элементов, вычислит произведение элементов массива, расположенных между максимальным и минимальным элементами.

Нужна прямо самая простая программа с использованием цикла foreach, нигде не могу найти решения, колледж не учит, а только требует :с
IS
Iwan Sa
534
using System;
using System.Linq;
namespace Answer {
class Program {
static void Main() {
Console.Write(" n: ");
var n = int.Parse(Console.ReadLine());
var box = new int[n];
var rand = new Random();
for (var i = 0; i < n; ++i) box[i] = rand.Next(1, 11);
foreach (var value in box) Console.Write($" {value} ");
Console.WriteLine();
var minIndex = Array.IndexOf(box, box.Min());
var maxIndex = Array.IndexOf(box, box.Max());
if (Math.Abs(minIndex - maxIndex) <= 1) Console.WriteLine(" Нет решений");
else {
var start = minIndex < maxIndex? minIndex : maxIndex;
var end = minIndex > maxIndex? minIndex : maxIndex;
++start;
var mult = 1.0;
for (var i = start; i != end; ++i) mult *= box[i];
Console.WriteLine($" Результат произведения: {mult}");
}
Console.ReadKey();
}
}
}
Алексей Малей
Алексей Малей
59 037
Лучший ответ
да, думать надо,
https://www.bestprog.net/ru/2019/11/30/c-the-foreach-loop-purpose-examples-of-use-ru/#q02_2
  — по этому адресу находим „рамочную” основу для программы; далее добавляем в цикл foreach внешний счётчик.

ЦИТИРУЮ ПРИМЕР С САЙТА:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// массив из 10 чисел типа int
int[] A = new int[10];
int max = 0; // искомое максимальное значение
bool f_first; // первый элемент в массиве
Random rnd_num = new Random(); // случайное число

// 1. Заполнить массив случайными числами
for (int i = 0; i < A.Length; i++)
{
A[i] = rnd_num.Next(0, 20);
}

// 2. Вывод массива для контроля
for (int i = 0; i < A.Length; i++)
Console.Write("{0} ", A[i]);
Console.WriteLine();

// 3. Цикл foreach
f_first = true; // признак первого элемента в массиве

foreach (int item in A)
{
if (f_first) // если первый элемент в массиве
{
max = item; // то запомнить его
f_first = false;
}
else
{
if (max < item)
max = item;
}
}

// 3. Вывод результата
Console.WriteLine("max = {0}", max);
Console.ReadKey();
}
}
}

  ДОБАВЛЯЮ ВНЕШНИЙ СЧЁТЧИК:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// массив из 10 чисел типа int
int[] A = new int[10];
int imax = 0; // не значение, а индекс максимального элемента!
int imin = 0; // не значение, а индекс минимального элемента!
Random rnd_num = new Random(); // случайное число
int Counter = 0; // внешний счётчик
// 1. Заполнить массив случайными числами
for (int i = 0; i < A.Length; i++)
{
A[i] = rnd_num.Next(0, 20);
}

// 2. Вывод массива для контроля
for (int i = 0; i < A.Length; i++)
Console.Write("{0} ", A[i]);
Console.WriteLine();

// 3. Цикл foreach

foreach (int item in A)
{
if (A[imax] < item)
imax = Counter;
if (A[imin] > item)
imin = Counter;
Counter++; // синхронное приращение счётчика
// Counter всегда индекс элемента item
}
// получили индексы максимального и минимального элементов
// 3. Вывод промежуточного результата
Console.WriteLine("max = {0}", A[imax]);
Console.WriteLine("min = {0}", A[imin]);
// на этом этапе задача о произведении элементов ещё НЕ решена!
Console.ReadKey();
}
}
}

  ТЕПЕРЬ НУЖНО СРАВНИТЬ ИНДЕКСЫ МАКСИМАЛЬНОГО И МИНИМАЛЬНОГО ЭЛЕМЕНТОВ. В СЛУЧАЕ, ЕСЛИ МАКСИМУМ ВСТРЕТИЛСЯ РАНЬШЕ МИНИМУМА, ПОМЕНЯТЬ ИХ МЕСТАМИ. То есть if (imin > imax) // меняем местами
Это необходимо для последующего цикла for от imin до imax. В цикле вычисляется произведение элементов массива.

    УТОЧНЯЮЩИЕ ВОПРОСЫ!

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

На вопросы необходимо ответить!!!
DY
Dmitriy Yershov
16 172
Dmitriy Yershov   Интересно, что обмен данными между двумя переменными можно реализовать несколькими способами: с помощью третьей переменной, с помощью симметричных операций, например, XOR, и даже с помощью кортежей (в версиях ранее 7.0 не поддерживается).

  Например, imin ^= imax; imax ^= imin; imin ^= imax;

  Или   Counter = imin; imin = imax; imax = Counter;

  Вариант метода Swap рассматривается здесь: https://otvet.mail.ru/question/194469434
"программа с использованием цикла foreach" - невозможно. Нужно либо два цикла, один из которых должен быть обычным for (второй может быть foreach, там не принципиально). Либо использовать LINQ. Ну, либо использовать foreach + внешний счётчик, но это полный бред...

...если только под "максимальным и минимальным элементами" не подразумеваются индексы массива, а не значения элементов.
Иван Kildozer
Иван Kildozer
7 947
Dmitriy Yershov Xttx, судя по всему именно этот случай — цикл foreach со внешним счётчиком — и задали Веронике. На всех форумах заявляют, что внутри цикла foreach определить индекс элемента средствами языка C# невозможно. Стало быть специфика задания в том и состоит, чтобы имитировать цикл со счетчиком (for) циклом с ключевым словом «foreach».
Держи решение, я, возможно, замудрил, но всё динамично и стабильно работает:

public static readonly Random rnd = new Random();
static void Main(string[] args)
{
Console.Write("Введите размерность массива: ");
int N = Convert.ToInt32(Console.ReadLine());
int[] mas = new int[N];

Console.WriteLine("\nМассив: ");
for (int i = 0; i < N; i++) //Заполняем массив
{
mas[i] = rnd.Next(0, 101);
Console.Write(mas[i] + " ");
}
int max = 0, min = mas[0], proizvedenie = 1;

foreach (int value in mas) //Определяем максимальный и минимальный элемент
{
if (value > max) { max = value; }
if (value < min) { min = value; }
}

int indexMax = Array.IndexOf(mas, max);
int indexMin = Array.IndexOf(mas, min);
int elementCount = (Math.Abs(indexMax - indexMin) - 1); //Число элементов между минимальным и максимальным

if (elementCount != 0)
{
for (int i = 0; i < elementCount; i++)
{
if (indexMax > indexMin)
{
proizvedenie *= mas[indexMin + (i + 1)];
}
else if (indexMax < indexMin)
{
proizvedenie *= mas[indexMax + (i + 1)];
}
}
Console.WriteLine("\nПроизведение элементов массива, расположенных между максимальным и минимальным элементами = " + proizvedenie);
}
else
{
Console.WriteLine("\nМежду максимальным и минимальным элементами массива нет элементов");
}

Console.ReadKey();
}
SB
Soulja Boy
1 146
Dmitriy Yershov Что делать, если максимумов и минимумов в массиве несколько?
Dmitriy Yershov Влад, а не проще ли всего один раз обменять значения indexMax и indexMin местами??? Тогда можно выбросить переменную elementCount, цикл вести от indexMin до indexMax, и в теле цикла индекс станет проще — только i.
Dmitriy Yershov Влад, Вы использовали Array.IndexOf с двумя параметрами, а это находит только первое вхождение.

Вероника, всё-таки ответьте, что делать, если максимум и минимум встречаются в массиве несколько раз??? Ведь неизвестно, какой из промежутков следует выбрать!!!