Поменять в файле местами минимальное и максимальное значения среди четных и нечетных элементов - C#
Формулировка задачи:
Дан бинарный файл целых чисел. Поменять в нем местами
минимальное и максимальное значения среди четных элементов.
То же самое выполнить для нечетных элементов
Решение задачи: «Поменять в файле местами минимальное и максимальное значения среди четных и нечетных элементов»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication3
{
class Program
{
private static Stream _stream;
static void Main(string[] args)
{
var fileName = @"E:\Документы\numbers.bin";
using (_stream = new FileStream(fileName, FileMode.Create,
FileAccess.Write, FileShare.None))
{
WriteIntegers(5, 4, 1, 3, 6, 8);
}
Console.WriteLine("Исходные данные из файла " + fileName);
PrintToConsole(fileName);
using (_stream = new FileStream(fileName, FileMode.Open,
FileAccess.ReadWrite, FileShare.None))
{
ExchangeMinMax(true); // true для четных
ExchangeMinMax(false); // false для нечетных
}
Console.WriteLine();
Console.WriteLine("Измененные данные из файла " + fileName);
PrintToConsole(fileName);
Console.ReadKey();
}
private static void PrintToConsole(string fileName)
{
using (_stream = File.OpenRead(fileName))
{
var values = ReadIntegers();
foreach (var value in values)
{
Console.WriteLine(value);
}
}
}
public static IEnumerable<int> ReadIntegers()
{
using (var br = new BinaryReader(_stream, Encoding.Default, true))
{
var list = new List<int>();
br.BaseStream.Seek(0, 0);
while (br.BaseStream.Position != br.BaseStream.Length)
{
list.Add(br.ReadInt32());
}
return list;
}
}
public static void WriteIntegers(params int[] values)
{
using (var bw = new BinaryWriter(_stream, Encoding.Default, true))
{
bw.Seek(0, 0);
foreach (var i in values)
{
bw.Write(i);
}
}
}
private static void ExchangeMinMax(bool evenOnly)
{
var minPos = 0;
var minVal = int.MaxValue;
var maxPos = 0;
var maxVal = int.MinValue;
var pos = -sizeof(int);
var count = 0;
using (var br = new BinaryReader(_stream, Encoding.Default, true))
{
br.BaseStream.Seek(0, 0);
while (br.BaseStream.Position != br.BaseStream.Length)
{
var value = br.ReadInt32();
pos += sizeof(int);
var flag = evenOnly ? value % 2 == 0 : value % 2 != 0;
if (flag) {
count++;
if (value > maxVal)
{
maxVal = value;
maxPos = pos;
}
if (value < minVal)
{
minVal = value;
minPos = pos;
}
}
}
}
if (count > 0 && maxVal != minVal)
{
using (var bw = new BinaryWriter(_stream, Encoding.Default, true))
{
bw.Seek(minPos, 0);
bw.Write(maxVal);
bw.Seek(maxPos, 0);
bw.Write(minVal);
}
}
}
}
}