Создание определённой последовательности нулей и единиц в переменной типа 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;
}
Объяснение кода листинга программы
- Подключение необходимых библиотек: iostream, stdlib, assert
- Объявление переменных: a, b, i
- Проверка корректности ввода/вывода параметров программы
- Присваивание значения переменным a и b, полученным из аргументов командной строки
- Проверка условий на корректность значений переменных a и b
- Цикл, выполняющийся 64 раза
- Форматированная запись в консоль значения переменной i % ( a + b ) < a
- Перевод каретки в новую строку
- Возврат 0, сигнализирующий о успешном завершении программы