Создание определённой последовательности нулей и единиц в переменной типа double - C (СИ)

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

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

Доброго время суток, кто-нибудь подскажите как можно реализовать следующее задание : Пользователь вводит два числа ( a > 0, b > 0 ). А на экран выводится вещественное число из 64 нулей и единиц. Например: a = 4, b = 5. На выходе : 1111000001111000001111000001111000001111000001111000001111000001 Честно говоря, я написал говнокод...иначе ничего не придумал.. Программа вылетает из-за того, что после всех условий изменяется i и дальше она не проверяется и возникают ситуации когда например: i = 6, а posledovetelnost[t] = 1 и в следующий цикл for() не могу начать т.к. 6 > 1.Я же не могу ВСЕГДА проверять эти значения.. Любые предложения по решению принимаются с большим желанием..
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <cstring>
#include <math.h>
 
using namespace std;
 
typedef union U U;
 
union U
{
  char c[sizeof(double)];
  double d;
} num, buf;
 
void display( U num );
U ones( U num );
 
int main()
{
    num.d = 0;
    int a, b, g, s = 0;
 
    cout << "                      Input two positive value: " << endl;
    cin >> a >> b;
 
    if ( a == 0)
    {
       display(num);
       cout << num.d << endl;
       return 0;
    }
 
    if ( b == 0)
    {
 
        display(ones(num));
        buf = ones(num);
        cout << buf.d;  // RETURN : NAN - IT' IS NOT NUMBER
        return 0;
    }
 
    display(num);

    int sum = 0, buffer = a, j = 0, i = 0, t = 0, q = 0; bool y = 1;
 
    int *posledovetelnost = new int [sizeof(num)*8];

    for(int i = 0; i < ((sizeof(num)*8-1)); i++)
    {
        buffer = buffer + sum;
        posledovetelnost[i] = buffer;
        sum = a + b;
 
    }
 
    while(j < sizeof(num))
    {
       for(t ; t < sizeof(num)*8-1; t++)
       {
           if(posledovetelnost[t] > (7 + (8 * j)))
           {
               j++;
           }
           posledovetelnost[t] = posledovetelnost[t] - (8 * j);
       }
    }

    for(int i = 0; i <(sizeof(num)*8-1); i++)
    {
        cout << posledovetelnost[i] <<" ";
    }
cout <<" ---------------------------------"<<endl;

t = 0; j = 0; i = 0; bool z = 0;
 
     while( j < sizeof(num) )
    {
 
         for( i ; i < posledovetelnost[t]; i++)
         {
            cout <<"#####"<<i<<" "<<posledovetelnost[t]<<endl;
            z = 0;

            if( (i + 1) != posledovetelnost[t] )
            {
                y = 0;
            }
            else
            {
                y = 1;
            }

            if( posledovetelnost[t + 1] < posledovetelnost[t] )
            {
               if( i > posledovetelnost[t])
               {
                 for(i; i < 8; i++)
                 {
                     num.c[j] ^= (1 << i);
                 }
 
                   i = -1;
                   j++;
                   z = 1;
                   cout<< "???1  "<<i<<" "<<posledovetelnost[t]<<endl;
               }
 
               if( ( posledovetelnost[t] + b) > 7 )
               {
                 for(i; i < posledovetelnost[t]; i++)
                 {
                     num.c[j] ^= (1 << i);
                 }
                  j++;
                  z = 1;
                  i = posledovetelnost[t + 1] - a - 1;
                  cout<< "???2  "<<i<<" "<<posledovetelnost[t]<<endl;
               }

               if( ( i >= posledovetelnost[t + 1] ) && ( (i + b) < 7 ) )
               {
 
                 for(i; i < posledovetelnost[t]; i++)
                 {
                     num.c[j] ^= (1 << i);
                 }
 
                 i = i + b;
 
                 for(i; i < 8; i++)
                 {
                     num.c[j] ^= (1 << i);
                 }
 
                   i = 0;
                   j++;
                   t++;
 
                 for(i; i < posledovetelnost[t]; i++)
                 {
                     num.c[j] ^= (1 << i);
                 }
 
                   i = posledovetelnost[t] + b - 1;
 
                   z = 1;
 
                   cout<<"???3  "<<i<<" "<<posledovetelnost[t]<<endl;
               }
              }

             if( z == 0 )
             {
                num.c[j] ^= (1 << i);
 
                if( y == 0 )
                {
                    t--;
                }
                else
                {
                   i = i + b;
                }
 
             }
 
             t++;
 
             cout <<"!!!!"<<i<<" "<<posledovetelnost[t]<<endl;
             display(num);
 
             if(posledovetelnost[t] > 65) break;
 
        }
}

    display(num);
    cout << num.d;

    return 0;
}

void display( U num )
{
    int ptr;
    cout << "---------------------------------------------------" << endl;
 
    for(int i = 0; i < sizeof(double); i++)
    {
        ptr = num.c[i];
 
        for(int j = 0; j < (sizeof(char)*8); j++)
        {
            cout << ((ptr >> j) & 1);
        }
 
        cout<<"  ";
     }
     cout << "---------------------------------------------------" << endl;
 
}

U ones( U num )
{
    int ptr;
 
    for(int i = 0; i < sizeof(double); i++)
    {
        ptr = num.c[i];
 
        ptr = ~ptr;
 
        num.c[i] = ptr;
 
     }
     return num;
}

/*

if( ( i > posledovetelnost[t + 1] ) && ( (i + b) < 7 ) )
               {
 
                 for(i; i < posledovetelnost[t]; i++)
                 {
                     num.c[j] ^= (1 << i);
                 }
 
                 i = i + b;
 
                 for(i; i < 8; i++)
                 {
                     num.c[j] ^= (1 << i);
                 }
 
                   i = posledovetelnost[t + 1] + b - 1;
                   j++;
                   z = 1;
                   t++;
                   cout<<"****"<<i<<" "<<posledovetelnost[t]<<endl;
               }

*/

/*
 
             if( posledovetelnost[t + 1] < posledovetelnost[t] )
         {
             if( (num.c[j] << 7) & 1 )
             {
                 for(i; i < 8; i++)
                 {
                     num.c[j] ^= (1 << i);
                 }
 
                 i = 0;
                 j++;
                 z = 1;
             }
         }
         else
         {
            j++;
            z = 1;
            i = posledovetelnost[t + 1] - a;
         }

*/

Решение задачи: «Создание определённой последовательности нулей и единиц в переменной типа double»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
 
int main(int argc, char ** argv) {
    int a, b, i;
    
    assert( argc == 3 );
    a = atoi(argv[1]);
    b = atoi(argv[2]);
    assert( a > 0 && b > 0 && a + b < 64 );
    
    for ( i = 0; i < 64; ++i )
        printf("%d", ( i % ( a + b ) < a ));
    printf("\n");
    
    return 0;
}

Объяснение кода листинга программы

  1. Подключение необходимых библиотек: iostream, stdlib, assert
  2. Объявление переменных: a, b, i
  3. Проверка корректности ввода/вывода параметров программы
  4. Присваивание значения переменным a и b, полученным из аргументов командной строки
  5. Проверка условий на корректность значений переменных a и b
  6. Цикл, выполняющийся 64 раза
  7. Форматированная запись в консоль значения переменной i % ( a + b ) < a
  8. Перевод каретки в новую строку
  9. Возврат 0, сигнализирующий о успешном завершении программы

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


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

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

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