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