Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перевод длинного числа в двоичный вид, Си 
:(
    Опции темы
bncom
Дата 11.3.2006, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 2.11.2005

Репутация: нет
Всего: 1



Вот, написал программу по условию:
В длинном числе N поменять двоичные разряды в зеркальном порядке

Проанализируйте пожалуйста код. Может, где-то я что-то не так написал...
И еще: почему-то с введенными длинными числами программа не работает.

Код

#include <stdio.h>    // описание функций ввода-вывода
#include <conio.h>    // 
#include <string.h>    // описание функции обработки строк

void main(void)
{
      float isxodnoe_chislo;     // создаем переменную с плавающей точкой
      printf("Введите целое число и нажмите <ENTER>: ");
      scanf("%f",&isxodnoe_chislo);
        if  ((long long int)isxodnoe_chislo-isxodnoe_chislo)
            {
            printf("Введенное число не является целым.\n\n");
               printf("Продолжать нельзя!");
            getch();
              } 
            else    {
                printf("Введенное число является целым.\n\n");
                  printf("Можно продолжать...\n\n");
                }
    
    long long int new_isxodnoe_chislo; // создаем переменную
    // с помощью преобразования типов присваиваем одной переменной другую, учитывая при этом тип переменных
    new_isxodnoe_chislo = isxodnoe_chislo;
      int ostatok_ot_deleniya;    // переменная будет хранить остаток от деления числа
      char new_bin_chislo[17];    // представление полученного числа в двоичной системе
      int i;                // создаем вспомогательнную переменную

    // начинаем переводить исходное число из десятичной системы счисления в двоичную
    // делим исходное число на основание системы счисления до тех пор, пока остаток от деления больше основания системы счисления. Остаток от деления на каждом шаге - очередная цифра
    new_bin_chislo[16]='\0'; //записываем закрывающий ноль
    i = 15;
    do    {
             ostatok_ot_deleniya=new_isxodnoe_chislo%2; // делим исходное число по модулю 2, остаток от деления - очередная цифра
             new_isxodnoe_chislo=new_isxodnoe_chislo/2; // считаем целую часть от деления
             //printf("Очередная цифра:%d  Остаток:%d\n",ostatok,n);
             new_bin_chislo[i]=ostatok_ot_deleniya+48; // преобразовываем полученные цифры в символы для дальнейшего преобразования
             i--;
        } while(new_isxodnoe_chislo>0);
    // начинаем сдвигать в начало полученную строку символов
    i++;
      int j=0;            // создаем вспомогательная переменную
      while(new_bin_chislo[i]!=NULL)
         new_bin_chislo[j++]=new_bin_chislo[i++];
      new_bin_chislo[j]='\0';
    printf("Исходное десятичное число %f\n", isxodnoe_chislo);
    printf("Полученное двоичное число %s\n", new_bin_chislo);

      int chislo_razryadov;                // создаем вспомогательная переменную
    chislo_razryadov=strlen(new_bin_chislo);
    // strlen(new_bin_chislo) - возвращаем длину строки new_bin_chislo
      printf("Разрядов в данном числе: %d", chislo_razryadov);
    char temp[2];
      int p;
    int q;
      q=chislo_razryadov-1;
      for (p=0;p<q;p++)
        {
             temp[0]=new_bin_chislo[p];
             new_bin_chislo[p]=new_bin_chislo[q];
             new_bin_chislo[q]=temp[0];
             q--;
        }
      printf("\nЗеркальное отображение двоичного числа: %s", new_bin_chislo);        
      getch();
}

--------------------
"Мы никогда не живем, мы лишь надеемся, что будем жить." Вольтер 
PM MAIL   Вверх
Fixin
Дата 11.3.2006, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 5
Всего: 18



Цитата(bncom @ 11.3.2006, 20:04 Найти цитируемый пост)
почему-то с введенными длинными числами программа не работает.
если в 32 разряда не влезает, то соответственно ошибка. Для очень длинных чисел используйискуственный метод: оставляешь число в виде строки (проверяешь его на правильность: отсутствие точки, букв, знаков препинания и тп), преобразуешь в новую строку но уже в двоичном виде и потом записываешь эту строку в обратном порядке.

Это сообщение отредактировал(а) Fixin - 11.3.2006, 20:22
PM MAIL ICQ   Вверх
bncom
Дата 11.3.2006, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 2.11.2005

Репутация: нет
Всего: 1



Хорошо написали. было бы еще лучше, если на примере...
P.S. А вообще, программа у меня корректно написана?

Это сообщение отредактировал(а) bncom - 11.3.2006, 20:25
--------------------
"Мы никогда не живем, мы лишь надеемся, что будем жить." Вольтер 
PM MAIL   Вверх
Partizan
Дата 12.3.2006, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 67



=) напиши свой класс LongNum и перегрузи для него оператор извлечения из потока и оператор вставки в поток
Добавлено @ 01:58
вот пример...переводит длинное двоичное число в 10 систему счисления....

Код

//---------------------------------------------------------------------------
#include <iostream.h>
#include <conio.h>
#include <math.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
class BinaryNum{
 private:
    int len;
    bool *Num;
 public:
    BinaryNum();
    void ShowNum() {for (int i = 0; i < len; i++) cout << *(Num+i);cout << endl;};
    void ShowLen() {cout << len << endl;};
    bool GetNum(){return Num;};
    int GetLen(){return len;};
    unsigned long ToDec();
    friend istream& operator>> (istream& in, BinaryNum& ob);
};

BinaryNum :: BinaryNum()
{
 len = 0;
 Num = 0;
};

unsigned long BinaryNum :: ToDec()
{
unsigned long dec = 0;
   for (int i = 0; i < len; i++){
    *(Num + len - (i+1)) == 1 ? dec += pow(2,i) : dec += 0;
   }

}

istream& operator>>(istream& in, BinaryNum& ob)
{
int c;
char *str;
str = (char*)malloc(1*sizeof(char));
ob.Num = (bool*)malloc(1*sizeof(bool));
   while ( (c = getch()) != 13){
      if ((ob.len && (c == (int)'0' || c == (int)'1')) || (!ob.len && (c == (int)'1'))){
          cout << (char)c;
          *(str + ob.len) = (char)c;
          (char)c == '1' ? *(ob.Num + ob.len) = 1 : *(ob.Num + ob.len) = 0;
          ob.len++;
          str = (char*)realloc(str,(ob.len+1)*sizeof(char));
          ob.Num = (bool*)realloc(ob.Num,(ob.len+1)*sizeof(bool));
      }
   };
      str = (char*)realloc(str,(ob.len-1)*sizeof(char));
      ob.Num = (bool*)realloc(ob.Num,(ob.len-1)*sizeof(bool));
  return in;
};
//-----------------------------------------------------------------------------------------
void main()
{
  BinaryNum bin;
   cout << "Enter binary data:   ";
   cin >> bin;
   cout << endl;
   cout << bin.ToDec();
getch();

}
//---------------------------------------------------------------------------



--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Dov
Дата 13.3.2006, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



Цитата(bncom @ 11.3.2006, 19:21 Найти цитируемый пост)
Хорошо написали. было бы еще лучше, если на примере...

Ну, что-нибудь такое.
Код

#include <stdio.h>
#include <string.h>
#include <conio.h> 
   
void main(void)
{
    char isxodnoe_chislo[33];

    printf("Введите целое число и нажмите <ENTER>: ");
    scanf ("%s", isxodnoe_chislo);

    unsigned long new_isxodnoe_chislo = (unsigned long)atol(isxodnoe_chislo);

    printf("Исходное десятичное число %lu\n", new_isxodnoe_chislo);  
    printf("Полученное двоичное число %s\n", ltoa(new_isxodnoe_chislo, isxodnoe_chislo, 2));
    printf("Разрядов в данном числе: %d\n", strlen(isxodnoe_chislo));
    printf("Зеркальное отображение двоичного числа: %s\n", strrev(isxodnoe_chislo));        
 
    getch();
}


Это сообщение отредактировал(а) Dov - 13.3.2006, 00:29


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
bncom
Дата 13.3.2006, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 2.11.2005

Репутация: нет
Всего: 1



Dov , невероятно!
А я мучился, сделал, но намного длинее. Оказывается, есть очень даже подходящие для этого функции...
--------------------
"Мы никогда не живем, мы лишь надеемся, что будем жить." Вольтер 
PM MAIL   Вверх
Dov
Дата 14.3.2006, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



Цитата(bncom @ 13.3.2006, 19:18 Найти цитируемый пост)
Dov , невероятно!
А я мучился, сделал, но намного длинее. Оказывается, есть очень даже подходящие для этого функции...

bncom, ты хорошо сделал, молодец, мучился ты не зря, но функции тоже нужно учить, а главное - уметь ими пользоваться. И ещё мне понравилось, что много комментариев, хотя(имхо) есть и лишние,например такой
Цитата
int chislo_razryadov;                // создаем вспомогательная переменную
.
Зачем комментировать очевидные вещи. Лишние комментарии засоряют код и делают его трудночитаемым.



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
bncom
Дата 14.3.2006, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 2.11.2005

Репутация: нет
Всего: 1



Dov, это нас преподаватель требует комментарии подробные делать. И ничего тут уже не поделаешь!
--------------------
"Мы никогда не живем, мы лишь надеемся, что будем жить." Вольтер 
PM MAIL   Вверх
bncom
Дата 15.3.2006, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 2.11.2005

Репутация: нет
Всего: 1



А вот что делает strrev?
Как-то не могу найти про нее описание....
--------------------
"Мы никогда не живем, мы лишь надеемся, что будем жить." Вольтер 
PM MAIL   Вверх
Dov
Дата 15.3.2006, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



Цитата(bncom @ 15.3.2006, 19:34 Найти цитируемый пост)
А вот что делает strrev?
Реверс строки



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0503 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.