Объясните, что происходит в части кода - C#

Узнай цену своей работы

Формулировка задачи:

Алгоритм сортировки простым слиянием Шаг 1. Исходный файл A разбивается на два вспомогательных файла B и C. Шаг 2. Вспомогательные файлы B и C сливаются в файл A, при этом одиночные элементы образуют упорядоченные пары. Шаг 3. Полученный файл A вновь обрабатывается, как указано в шагах 1 и 2. При этом упорядоченные пары переходят в упорядоченные четверки. Шаг 4. Повторяя шаги, сливаем четверки в восьмерки и т. д., каждый раз удваивая длину слитых последовательностей до тех пор, пока не будет упорядочен целиком весь файл (как на фото) Весь код
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
 
namespace Файловая_сортировка
{
    class Program
    {
        public static void generator(int n)
        {
            StreamWriter sw1 = new StreamWriter("A.txt");
            Random rnd = new Random();
            for (int i = 0; i < n-1; i++)
            {
               sw1.WriteLine(rnd.Next(-100,100)); 
            };
            sw1.Write(rnd.Next(-100,100));
            sw1.Close();
        }
        public static void razdel(int p, int n)
        {
            StreamReader sr1 = new StreamReader("A.txt");
            StreamWriter sw2 = new StreamWriter("B.txt");
            StreamWriter sw3 = new StreamWriter("C.txt");
            for (int i = 0; i < n; i++)
            {
                string Value = sr1.ReadLine();
                if ((i / p) % 2 == 0) 
                    sw2.WriteLine(Value);
                else 
                    sw3.WriteLine(Value);
            };
            sr1.Close();
            sw2.Close();
            sw3.Close();
        }
 
        public static void sliyanie(int p, int n)
        {
            int x, y;//считываемые x-A  y-C числа
            int c, d;//индексы
            int p1=p, p2;//длинна отрезка
            int o; //для корректной обработки последнего захода
            StreamWriter sw1 = new StreamWriter("A.txt");
            StreamReader sr2 = new StreamReader("B.txt");
            StreamReader sr3 = new StreamReader("C.txt");
            int i = 0;
            while (sr3.EndOfStream == false) // если не пустой
            {
                x = Int32.Parse(sr2.ReadLine());
                y = Int32.Parse(sr3.ReadLine());
                c = 0;
                d = 0;
                
                if ((i == n / (2 * p)) && (n % (2 * p)!= 0)) 
                { o = n % (2 * p); p2=o%p;}
                else
                { o = p * 2; p2 = p; }
                do
                {
                    if ((x < y) && (c < p1))
                    {
                        sw1.WriteLine(x);
                        c++;
                        if((c < p1)&&(sr2.EndOfStream==false)) 
                            x = Int32.Parse(sr2.ReadLine());
                    }
                    else
                        if (d < p2)
                        {
                            sw1.WriteLine(y);
                            d++;
                            if((d<p2)&&(sr3.EndOfStream==false)) 
                                y = Int32.Parse(sr3.ReadLine());
                        }
                        else
                        {
                            sw1.WriteLine(x);
                            c++;
                            if((c<p1)&&(sr2.EndOfStream==false)) 
                                x = Int32.Parse(sr2.ReadLine());
                        }
                } while ((c + d) != o);
                i++;
            }
            while (sr2.EndOfStream == false) 
               sw1.WriteLine(Int32.Parse(sr2.ReadLine()));
            sw1.Close();
            sr2.Close();
            sr3.Close();
        }
        static void Main(string[] args)
        {
            int n=20;
            generator(n);
            for (int p = 1; p < n; p*=2)
            {   
                razdel(p, n);
                sliyanie(p, n);
            }
        }
    }
}
Подскажите , что происходит в этой части кода:
if ((i == n / (2 * p)) && (n % (2 * p)!= 0)) 
                { o = n % (2 * p); p2=o%p;}
                else
                { o = p * 2; p2 = p; }

Решение задачи: «Объясните, что происходит в части кода»

textual
Листинг программы
if ((i == n / (2 * p)) // если   i == n / (2 * p)
                && (n % (2 * p)!= 0)) // И   n % (2 * p) != 0)   - остаток от деления n на (2 * p) не равен нулю
            {                       // тогда
                o = n % (2 * p); // о присваивается остаток от деления n на (2 * p)
                p2 = o % p; // о присваивается остаток от деления o на p
            }
            else // иначе ... дальше все должно быть понятно
            {
                o = p * 2;
                p2 = p;
            }

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

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