Написать программу, которая в одномерном массиве, состоящем из n элементов, вычислит произведение элементов массива, расположенных между максимальным и минимальным элементами.
Нужна прямо самая простая программа с использованием цикла foreach, нигде не могу найти решения, колледж не учит, а только требует :с
C#
C# помогите написать простую прогу
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();
}
}
}
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();
}
}
}
да, думать надо,
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. В цикле вычисляется произведение элементов массива.
УТОЧНЯЮЩИЕ ВОПРОСЫ!
Вероника, максимум и минимум участвуют в произведении элементов или исключаются из него?
Вероника, максимум и минимум могут встретиться в массиве несколько раз. Какой из максимумов и какой из минимумов использовать???
На вопросы необходимо ответить!!!
— по этому адресу находим „рамочную” основу для программы; далее добавляем в цикл 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. В цикле вычисляется произведение элементов массива.
УТОЧНЯЮЩИЕ ВОПРОСЫ!
Вероника, максимум и минимум участвуют в произведении элементов или исключаются из него?
Вероника, максимум и минимум могут встретиться в массиве несколько раз. Какой из максимумов и какой из минимумов использовать???
На вопросы необходимо ответить!!!
"программа с использованием цикла foreach" - невозможно. Нужно либо два цикла, один из которых должен быть обычным for (второй может быть foreach, там не принципиально). Либо использовать LINQ. Ну, либо использовать foreach + внешний счётчик, но это полный бред...
...если только под "максимальным и минимальным элементами" не подразумеваются индексы массива, а не значения элементов.
...если только под "максимальным и минимальным элементами" не подразумеваются индексы массива, а не значения элементов.
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();
}
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();
}
Dmitriy Yershov
Что делать, если максимумов и минимумов в массиве несколько?
Dmitriy Yershov
Влад, а не проще ли всего один раз обменять значения indexMax и indexMin местами??? Тогда можно выбросить переменную elementCount, цикл вести от indexMin до indexMax, и в теле цикла индекс станет проще — только i.
Dmitriy Yershov
Влад, Вы использовали Array.IndexOf с двумя параметрами, а это находит только первое вхождение.
Вероника, всё-таки ответьте, что делать, если максимум и минимум встречаются в массиве несколько раз??? Ведь неизвестно, какой из промежутков следует выбрать!!!
Вероника, всё-таки ответьте, что делать, если максимум и минимум встречаются в массиве несколько раз??? Ведь неизвестно, какой из промежутков следует выбрать!!!
Похожие вопросы
- Помогите написать программу C#
- Помогите решить простую задачу на c#
- Помогите написать программу на C# По задачнику PascalABC Case20
- Помогите написать задачу на C#
- Помогите написать программу с массивом на C#
- C# Помогите сделать корректный вывод
- C# Помогите решить задачу! Нужен полный код!
- C#: помогите, пожалуйста, исправить код
- Unity C#. Помогите с управлением персонажа...
- C# Помогите с Текстовым редактором
Например, imin ^= imax; imax ^= imin; imin ^= imax;
Или Counter = imin; imin = imax; imax = Counter;
Вариант метода Swap рассматривается здесь: https://otvet.mail.ru/question/194469434