Консультация № 187205
14.03.2013, 15:45
266.49 руб.
0 5 1
Здравствуйте уважаемые эксперты! Помогите пожалуйста решить следующую задачу с помощью среды разработки Visual C# Express Edition 2010.

Задача.
В одномерном массиве, состоящем из n целочисленных элементов, вычислить: номер максимального элемента массива; произведение элементов массива, расположенных между первым и вторым нулевыми элементами. Преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в нечетных позициях, а во второй половине элементы, стоявшие в четных позициях.

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

Заранее благодарен.



Обсуждение

давно
Профессор
399103
482
14.03.2013, 17:30
общий
это ответ
Здравствуйте, alekseyvg!

Индексация везде с нуля. Т.о. элементы на нечётных позициях в {5,4,3,2} есть {4, 2}.

Код:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
// Загружаем целые числа из файла data.txt
int[] numbers = loadFromFile("data.txt");

// Вывод массива
Console.WriteLine("Исходный массив: ");
printNumbers(numbers);

Console.WriteLine("Индекс максимального элемента: {0}", maxIndex(numbers));
Console.WriteLine("Произведение между первыми нулями: {0}", multBetweenFirstAndSecondZeros(numbers));

Console.WriteLine("Преобразованный массив:");
transformNumbers(numbers);
printNumbers(numbers);
}

// Загружает числа из файла
// Подразумеваются, что числа разделены пробелами или переводами строки
// Возвращает массив чисел
static int[] loadFromFile(string fileName)
{
List<int> ns = new List<int>();
using (TextReader reader = File.OpenText(fileName))
{
string text = reader.ReadToEnd();
char[] separators = { ' ', '\n' }; // разделители
string[] rawNums = text.Split(separators); // делим спложной текст на токены
foreach (string s in rawNums)
{
int x = int.Parse(s); // из текста в число
ns.Add(x); // добавляем число в список
}
}

return ns.ToArray();
}

static void printNumbers(int[] xs)
{
foreach (int x in xs)
{
Console.Write(x);
Console.Write(' ');
}
Console.WriteLine();
}

// Поиск индекса максимального элемента
// возвращает -1, если массив пуст
static int maxIndex(int[] xs)
{
if (xs.Length == 0)
return -1;

int maxi = 0;
for (int i = 0; i < xs.Length; ++i)
{
if (xs[i] > xs[maxi])
{
maxi = i;
}
}

return maxi;
}

// Возвращает произведение чисел между первым и вторым нулями в массиве.
// Если таковых нет, возвращает 0
static int multBetweenFirstAndSecondZeros(int[] xs)
{
// Ищем индекс первого нуля
int firstZeroIndex = Array.IndexOf(xs, 0);
// И второго
int secondZeroIndex = Array.IndexOf(xs, 0, firstZeroIndex+1);

if (firstZeroIndex == -1 || secondZeroIndex == -1)
return 0;

int mult = 1;
for (int i = firstZeroIndex + 1; i < secondZeroIndex; ++i)
{
mult *= xs[i];
}

return mult;
}

static void transformNumbers(int[] xs)
{
// Заводим временный массив
int[] ys = new int[xs.Length];

int yi = 0; // индекс в ys
// нечётные позиции
for (int xi = 1; xi < xs.Length; xi += 2, ++yi)
{
ys[yi] = xs[xi];
}
// чётные позиции
for (int xi = 0; xi < xs.Length; xi += 2, ++yi)
{
ys[yi] = xs[xi];
}

// Копируем ys в xs
Array.Copy(ys, xs, xs.Length);
}
}
}


Пример содержимого data.txt:
1 2 3 4 5
6 7 8

Соответствующий вывод:
Исходный массив:
1 2 3 4 5 6 7 8
Индекс максимального элемента: 7
Произведение между первыми нулями: 0
Преобразованный массив:
2 4 6 8 1 3 5 7
.
Неизвестный
15.03.2013, 01:44
общий
Источник массива нужно взять с внешнего файла. И можно еще блок-схему алгоритма решения.
давно
Профессор
399103
482
15.03.2013, 04:20
общий
15.03.2013, 04:20
Про файл добавил. А блок-схема чего интересует? Формально можно сказать, что блок-схема такова:
{блок начало}(наша программа) ->
{блок ввода-вывода}(загрузка массива) ->
{блок ввода-вывода}(вывода исходного массива) ->
{блок действия}(поиск индекса максимального элемента) -> {блок ввода-вывода}(вывод индекса максимального элемента) ->
{блок действия}(поиск произведения между первыми нулями) -> {блок ввода-вывода}(вывод яроизведения между первыми нулями) ->
{блок действия}(преобразование массива) -> {блок ввода-вывода}(вывод преобразованного массива) ->
{блок конец}(всё).
Неизвестный
15.03.2013, 15:42
общий
Спасибо все работает, подскажите новичку еще как сделать чтобы показывал в консоле цифры, а то как показать то их если окно сразу закрывается.
давно
Профессор
399103
482
15.03.2013, 19:00
общий
Тут, как я понимаю, вопрос идентичен вопросу о прошлой программе. Ответил там.
Форма ответа