Поменять в файле местами минимальное и максимальное значения среди четных и нечетных элементов - 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);
                }
            }
        }
 
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы