Задача 8 (8 баллов) Перевод в двоичную.
--------
Написать программу для перевода десятичного числа в двоичную систему
счисления. Полагать, что число по величине меньше длины алфавита
Корректора.

п р о в е р к а  к у р а т о р а

Команда 3104
------------
.\04\04.txt
Оценка: 0

Команда 3106
------------
.\06\06.txt
Оценка: 7

Алгоритм
--------
//Идея: Т.к. 1 в обеих системах имеет одно и тоже достоинство, то от
десятичного числа ее отнимаем,а к двоичному добавляем, учитывая
системы счисления, в которых записаны числа.

ЭТО Вход
 ВЛЕВО      //Слева от числа
 ПИШИ ПУСТО //пишем двоичный 0
 ВЛЕВО
 ПИШИ 0
 Программа
КОНЕЦ              //Меткой ф
                  //помечается
                  //десятичное
ЭТО Программа     //число, становясь
ПОКА НЕ ф          //нулем.
   {
      В_начало   //На первую цифру
                 //десятичного числа
      ЕСЛИ НЕ ф ТО Начало
         }
 ПИШИ ПУСТО  //Удаление символа ф
 ПОКА НЕ ЦИФРА
   {              //Это цикл
                  // устанавливает
      ВЛЕВО       //курсор на послед-
         }       //нюю цифру двоичного
                 //числа
 ПОКА НЕ ПУСТО
    {
     ВЛЕВО      //Этот- на первую
         }
ВПРАВО
КОНЕЦ

ЭТО Начало
   ПОКА НЕ ПУСТО
       {          //Уходим в конец
         ВПРАВО   //десятичного
            }     //числа
     Минус   //Выполняет вычитание 1
ВЛЕВО
ПОКА НЕ ПУСТО
   {              //Этот цикл ищет
     ВЛЕВО      //начало десятичного
        }       //числа

ПОКА НЕ ЦИФРА
      {
       ВЛЕВО    //Поиск начала
         }   //двоичного числа
Двоичная  //Производит сложение
          //уже имеющегося двоич-
          //ного числа и 1.
КОНЕЦ

ЭТО Минус
  ВЛЕВО
  ЕСЛИ  0 ТО  //Если цифра 0, то
         {       //пишем 9,
           ПИШИ 9
           Минус
                   }
                   ИНАЧЕ //иначе -1
                     МИНУС
       ЕСЛИ 0 ТО
          {         //Проверяем,
//начинается ли число на, если да,
//то выясняем, есть ли еще цифры
//справа (Проверка)
            ВЛЕВО
             ЕСЛИ ПУСТО ТО
                {
                    ВПРАВО
                    Проверка
                  }
          }
КОНЕЦ
ЭТО Проверка
          ВПРАВО
          ЕСЛИ НЕ ПУСТО ТО //Если
                 {  //справа есть
                   ВЛЕВО  //цифры, то
//смещаемся влево и убираем 0
                   ПИШИ ПУСТО
                       }
            ИНАЧЕ    //В противном
                 {   //случае заменяем
                  ВЛЕВО //его буквой
                  ПИШИ ф  //ф (финиш)
                  ВЛЕВО
                        }
КОНЕЦ

ЭТО Двоичная
    ПЛЮС          //+1 к двоичному
    ЕСЛИ 2 ТО //Если сумма =2, то
       {      //заменяем ее нулем
        ПИШИ 0
        ВЛЕВО  //и слева, если клетка
        ЕСЛИ ПУСТО ТО  //пустая,
                  ПИШИ 1 //пишем 1
//в противном случае продолжаем
//сложение
                  ИНАЧЕ Двоичная
                    }
КОНЕЦ

ЭТО В_начало
 ПОКА НЕ ПУСТО
      {        //Ход в конец
        ВПРАВО //двоичного числа
           }
 ПОКА ПУСТО
       {        //Ход в начало
         ВПРАВО //десятичного
           }
КОНЕЦ


ЭТО  Начало_числа_слева
    ПОКА НЕ ЦИФРА
        {
          ВПРАВО
             }
КОНЕЦ

ЭТО Конец_числа_слева
    ПОКА ЦИФРА
        {
          ВПРАВО
             }
КОНЕЦ

ЭТО Начало_числа_справа
  ПОКА ЦИФРА
    {
       ВЛЕВО
          }
КОНЕЦ

ЭТО Конец_числа_справа
     ПОКА НЕ ЦИФРА
         {
           ВЛЕВО
              }
КОНЕЦ

ЭТО Счет
  ОБМЕН
  ПЛЮС
  ОБМЕН
КОНЕЦ

к о м м е н т а р и й  к у р а т о р а
Описание алгоритма (идеи) не очень понятно, но программа работает
правильно за исключением числа 0 - выдается сообщение "Не могу".


Команда 3107
------------
.\07\07.txt
.\07\tur8.kor
Оценка: 8

Решение
-------
// Программа перевода числа из
// десятичной системы счисления
// в двоичную методом последова-
// тельного деления на 2
// Авторы решения: Втулкина М. и
// Лавренова Ю.                        
//                                     
ЭТО вход                               
  подготовка                           
  ПОКА НЕ ПУСТО
  {
  ОБМЕН ПИШИ 0 ОБМЕН // Обнуление сч.
  дели_на_2     // Деление числа на 2
  приведение    //Уборка первого нуля  
  }             //и сдвиг к знаку =
  уборка                               
КОНЕЦ                                  
// Модуль деления числа на 2           
ЭТО дели_на_2                          
 ПОКА НЕ ПУСТО                         
  {
 ЕСЛИ 0       // Анализ очер. цифры    
  ТО дели0    // и вызов соотв.        
  ИНАЧЕ       // стандартной программы 
 ЕСЛИ 1                                
  ТО    дели1                          
  ИНАЧЕ
 ЕСЛИ 2                                
  ТО   дели2                           
  ИНАЧЕ                                
 ЕСЛИ 3
  ТО    дели3
  ИНАЧЕ
 ЕСЛИ 4
  ТО    дели4
  ИНАЧЕ                                
 ЕСЛИ 5                                
  ТО    дели5                          
  ИНАЧЕ                                
 ЕСЛИ 6
  ТО    дели6                          
  ИНАЧЕ                                
 ЕСЛИ 7
  ТО    дели7                          
  ИНАЧЕ                                
 ЕСЛИ 8                                
  ТО    дели8                          
  ИНАЧЕ                                
   дели9  }
   запись2  // Запись остатка в        
            // двоичное число          
КОНЕЦ                                  
//-------------------------------------
// Разработка таблицы деления
// цифр на два с учетом единицы
// от старшего разряда
//
// Деление цифры 0                     
ЭТО дели0                              
 ЯЩИК-     // Анализ остатка от пред.  
 ЕСЛИ 0 ТО // разряда                  
   {
   ПИШИ 0  // Запись остатка от        
   ОБМЕН   // деления (можно ЯЩИК+)    
   ПИШИ 0  // Запись результата деления
   ВПРАВО  // К следующей цифре        
   }                                   
 ИНАЧЕ                                 
   {       // То же, но                
   ПИШИ 0  // с учетом остатка 1       
   ОБМЕН
   ПИШИ 5                              
   ВПРАВО                              
   }                                   
 КОНЕЦ
//-------------------------------------
// Деление цифры 1
ЭТО дели1
 ЯЩИК-
 ЕСЛИ 0 ТО                             
  {                                    
  ПИШИ 1 ОБМЕН ПИШИ 0 ВПРАВО           
  }                                    
ИНАЧЕ
  {                                    
  ПИШИ 1 ОБМЕН ПИШИ 5 ВПРАВО           
  }
 КОНЕЦ                                 
//-------------------------------------
// Деление цифры 2                     
ЭТО дели2                              
 ЯЩИК-                                 
 ЕСЛИ 0 ТО
  {                                    
   ПИШИ 0 ОБМЕН ПИШИ 1 ВПРАВО          
  }                                    
 ИНАЧЕ
  {
   ПИШИ 0 ОБМЕН ПИШИ 6 ВПРАВО
  }
 КОНЕЦ
//-------------------------------------
// Деление цифры 3                     
ЭТО дели3                              
 ЯЩИК-                                 
 ЕСЛИ 0 ТО
  {                                    
  ПИШИ 1 ОБМЕН ПИШИ 1 ВПРАВО           
  }
 ИНАЧЕ                                 
  {                                    
  ПИШИ 1 ОБМЕН ПИШИ 6 ВПРАВО           
  }                                    
 КОНЕЦ                                 
//-------------------------------------
// Деление цифры 4                     
ЭТО дели4                              
 ЯЩИК-                                 
 ЕСЛИ 0 ТО
  {
  ПИШИ 0 ОБМЕН ПИШИ 2 ВПРАВО
  }
 ИНАЧЕ
  {                                    
  ПИШИ 0 ОБМЕН ПИШИ 4 ВПРАВО           
  }                                    
КОНЕЦ                                  
//-------------------------------------
// Деление цифры 5                     
ЭТО дели5                              
 ЯЩИК-
 ЕСЛИ 0 ТО                             
  {                                    
  ПИШИ 1 ОБМЕН ПИШИ 2 ВПРАВО           
  }                                    
 ИНАЧЕ                                 
  {
  ПИШИ 1 ОБМЕН ПИШИ 7 ВПРАВО           
  }                                    
КОНЕЦ                                  
//-------------------------------------
// Деление цифры 6
ЭТО дели6
 ЯЩИК-
 ЕСЛИ 0 ТО
  {                                    
  ПИШИ 0 ОБМЕН ПИШИ 3 ВПРАВО           
  }                                    
 ИНАЧЕ                                 
  {
  ПИШИ 0 ОБМЕН ПИШИ 8 ВПРАВО           
  }                                    
КОНЕЦ
//-------------------------------------
// Деление цифры 7                     
ЭТО дели7                              
 ЯЩИК-                                 
 ЕСЛИ 0 ТО                             
  {
  ПИШИ 1 ОБМЕН ПИШИ 3 ВПРАВО           
  }                                    
 ИНАЧЕ                                 
  {
  ПИШИ 1 ОБМЕН ПИШИ 8 ВПРАВО
   }
КОНЕЦ
//-------------------------------------
// Деление цифры 8                     
ЭТО дели8                              
 ЯЩИК-                                 
 ЕСЛИ 0 ТО                             
  {
  ПИШИ 0 ОБМЕН ПИШИ 4 ВПРАВО           
  }                                    
 ИНАЧЕ
  {                                    
  ПИШИ 0 ОБМЕН ПИШИ 9 ВПРАВО           
  }                                    
 КОНЕЦ                                 
//-------------------------------------
// Деление цифры 9
ЭТО дели9                              
 ЯЩИК-                                 
 ЕСЛИ 0 ТО                             
  {
  ПИШИ 1 ОБМЕН ПИШИ 4 ВПРАВО
  }
 ИНАЧЕ
  {
  ПИШИ 1 ОБМЕН ПИШИ 9 ВПРАВО           
  }                                    
КОНЕЦ                                  
                                       
//-------------------------------------
// Установка первой значащей цифры     
// 10-числа справа от флага            
ЭТО приведение
  ЕСЛИ 0 ТО сдвиг                      
КОНЕЦ                                  
//-------------------------------------
// Убирание начального нуля и сдвиг    
// 10-числа к флагу =                  
ЭТО сдвиг  // стандартная программа
   ВПРАВО                              
   ЕСЛИ НЕ ПУСТО                       
    ТО                                 
     {
     ЯЩИК+
     ВЛЕВО
     ЯЩИК-
     ВПРАВО
     сдвиг                             
     }                                 
    ИНАЧЕ                              
    // Стирание последнего символа     
     {
     ВЛЕВО                             
     ПИШИ                              
     ПУСТО
     ВПРАВО                            
     }                                 
 ВЛЕВО // Отложенная команда.          
       // Возвращает окно на место     
КОНЕЦ                                  
//-------------------------------------
// Запись двоичной цифры               
//                                     
ЭТО запись2                            
  ВЛЕВО          // Переход в начало
  ПОКА НЕ ПУСТО
   ВЛЕВО           // записи
  ЯЩИК-            // Запись 2-цифры
  ПОКА НЕ = ВПРАВО  // Возврат в
  ВПРАВО           // начало числа     
КОНЕЦ                                  
//-------------------------------------
//  Установка флага                    
ЭТО подготовка
  ВЛЕВО   // Установка флага
  ПИШИ =  // слева от числа            
  ВПРАВО
КОНЕЦ                                  
//-------------------------------------
// Снятие флага =                      
ЭТО уборка                             
  ВЛЕВО        // Снятие флага         
  ПИШИ ПУСТО                           
КОНЕЦ                                  

к о м м е н т а р и й  к у р а т о р а
Программа работает правильно. Хотя код ее очень длинный, работает она
быстро.

Команда 3108
------------
.\08\08.txt
Оценка: 0

Команда 3110
------------
.\10\10.txt
.\10\1011.kor
Оценка: 0

Команда 3113
------------
.\13\13.txt
.\13\1321.kor
Оценка: 0

Команда 3114
------------
.\14\14.txt
.\14\1421.kor
Оценка: 1.5


Команда 3115
------------
.\15\15.txt
Оценка: 8

Автор решения : Кудрявцев Артём

Описание Алгоритма:
  Применен алгоритм, предложенный в сборнике задач по Корректору-2001.

Программа, описание программы
  
// Главная процедура
ЭТО Вход                               
  ЕСЛИ НЕ ПУСТО                        
   ТО ЕСЛИ НЕ 0                        
       ТО Превращение                  
       ИНАЧЕ СТОЯТЬ
   ИНАЧЕ Ошибка
КОНЕЦ // Вход                          

  Процедура Вход проверяет начальные данные на правильность и 
  в случае успеха переходит к процедуре Превращение.

//-------------------------------------
// Делит число на 2, запоминая остаток 
ЭТО Деление_на_2                       
  ПОВТОРИ 2 МИНУС                      
  ЕСЛИ 1                               
   ТО                                  
   {
     ЯЩИК+                             
     ПИШИ 0
   }                                   
  ЕСЛИ НЕ 0
   ТО Деление_на_2                     
  ПЛЮС                                 
КОНЕЦ // Деление_на_2                  

  Процедура Деление_на_2 рекурсивно вычисляет остаток от деления на два,
  а ответ записывает вместо десятичного числа.

//-------------------------------------
//                                     
ЭТО Проход                             
  ПОКА НЕ ПУСТО ВЛЕВО
  ЯЩИК-                                
  ПОКА НЕ ПУСТО ВПРАВО                 
  ВЛЕВО                                
КОНЕЦ // Проход                        

  Процедура Проход записывает самой правой цифрой двоичного числа.

//-------------------------------------
// Выдает сообщение о ошибке           
ЭТО Ошибка                             
  ПИШИ о
  ВПРАВО                               
  ПИШИ ш                               
КОНЕЦ // Ошибка                        

//-------------------------------------
// Переводит ленточное число в         
// двоичное                            
ЭТО Превращение                        
  ПОКА НЕ 0                            
  {                                    
    ЕСЛИ 1
     ТО                                
     {                                 
       ЯЩИК+                           
       Проход                          
       ПИШИ 0                          
     }                                 
     ИНАЧЕ                             
     {                                 
       ОБМЕН                           
       ПИШИ 0                          
       ОБМЕН
       Деление_на_2                    
       Проход                          
     }                                 
  }                                    
  ПИШИ ПУСТО
КОНЕЦ // Превращение                   

  Процедура Превращение переводит десятичное число в двоичное 
  путём деления на 2 пока число не станет равно 0.

к о м м е н т а р и й  к у р а т о р а
Нет замечаний к решению.
