Создание определённой последовательности нулей и единиц в переменной типа 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, сигнализирующий о успешном завершении программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д