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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Строки 
:(
    Опции темы
Ursa
Дата 17.3.2012, 16:14 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здесь идёт преобразования из двоичной в 16теричную систему,помогите пожалуйста сделать,чтобы из 10тиричной в восьмиричную.
Код:

Код

#include <stdio.h>
#include <math.h>

int main(int argc, char *argv[])
{
    printf("Vvedite v stroku chislo v 2-noi sisteme schislenia: ");
    char s[51], strout[15];
    int tmp=0;
    gets(s);
    int len=0;
    for (int i=0; s[i]!=0; i++) {
        len++;
    }
    int x=len-len/4*4, i=0, n=0, z;
    if(x==0) {x=4;}
    while (s[i]!=0) {
         for(int j=4-x; j<4; j++){
             switch (s[i]) {
                 case '0': {z=0; break;}
                 case '1': {z=1; break;}
             }
             tmp += z*pow(10,fabs(j-3));
             i++;
         }
         x=4;
         switch (tmp){
             case 0: {strout[n]='0';break;}
             case 1: {strout[n]='1';break;}
             case 10: {strout[n]='2';break;}
             case 11: {strout[n]='3';break;}
             case 100: {strout[n]='4';break;}
             case 101: {strout[n]='5';break;}
             case 110: {strout[n]='6';break;}
             case 111: {strout[n]='7';break;}
             case 1000: {strout[n]='8';break;}
             case 1001: {strout[n]='9';break;}
             case 1010: {strout[n]='A';break;}
             case 1011: {strout[n]='B';break;}
             case 1100: {strout[n]='C';break;}
             case 1101: {strout[n]='D';break;}
             case 1110: {strout[n]='E';break;}
             case 1111: {strout[n]='F';break;}
         }
        n++;
        tmp=0;
    }
        
    strout[n]=0;
    printf("Eto chislo v 16-noi sisteme schislenia: ");
    puts(strout);
    
    return 0;
}



Это сообщение отредактировал(а) Daevaorn - 17.3.2012, 18:38
PM MAIL   Вверх
Cheloveck
Дата 17.3.2012, 17:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



Цитата(Ursa @  17.3.2012,  17:14 Найти цитируемый пост)
Здесь идёт преобразования из двоичной в 16теричную систему

Нет, здесь идёт бред сивой кобылы.


--------------------
user posted image
PM Jabber   Вверх
Ursa
Дата 17.3.2012, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Cheloveck @ 17.3.2012,  17:25)
Цитата(Ursa @  17.3.2012,  17:14 Найти цитируемый пост)
Здесь идёт преобразования из двоичной в 16теричную систему

Нет, здесь идёт бред сивой кобылы.

Почему? Всё работает.
PM MAIL   Вверх
Randajad
Дата 17.3.2012, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Потому что писал человек ума недалекого.

#include <stdio.h>

int convert(long long n, char p) {
   int ret = 0;
   for(int k = 1; n; n /= 10, k *= p)
      ret += (n % 10) * k;
   return ret;
}

int main() {
   long long n;
   scanf("%lld", &n);
   printf("\nres %d", convert(n, 8));
}

Так лучше. convert() переводит из любой системы число и возвращает десятичное. Первый параметр - число. Второй - система отсчета. Для перевода из десятичной в какую-либо другую и в строку - itoa. А еще можно (s)scanf, (s)printf с %o, %d, %x.

Это сообщение отредактировал(а) Randajad - 17.3.2012, 19:53
PM MAIL   Вверх
Ursa
Дата 17.3.2012, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я это как бы понимаю,но так получается не по условию задания. 

PM MAIL   Вверх
borisbn
Дата 17.3.2012, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(Randajad @  17.3.2012,  19:34 Найти цитируемый пост)
 convert() переводит из любой системы число и возвращает десятичное

Ерунду (мягко говоря) написал. Число - оно и в Африке число. Посмотри на свои руки. Сколько там пальцев? От того, как ты отображаешь это количество - 12(oct), A(hex), 1010(bin) - оно не изменится (хирургию сейчас не рассматриваем).
Можно говорить только о строковом представлении числа (нет не так - ЧИСЛА) в какой-то системе исчисления.

Ursa, ты ж уже задавал(а) точно такой же вопрос. Тебе там уже ответили

Добавлено через 4 минуты и 3 секунды
Ursa, и ещё. ИМХО такого рода вопросы стОит задавать в разделе для новичков, а не в общих вопросах в общих вопросах


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 17.3.2012, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(borisbn @  17.3.2012,  23:33 Найти цитируемый пост)
Тебе там уже ответили 

borisbn, там слишком круто написано. Нужно написать в стиле первого сообщения. Чтобы ни у кого не возникло сомнений в авторстве   smile 
PM MAIL   Вверх
borisbn
Дата 17.3.2012, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



volatile,  smile 
Не смотрел первое сообщение. После того, как Вы обратили внимание, глянул... Вполне себе приличный неработающий индокод. Интересно, если б нужно было бы преобразовать в base64 - было бы 64 case'а?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Randajad
Дата 18.3.2012, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Это был как вариант с консольным приложением-переводчиком чисел из разных систем счисления. Задачу свою оно выполняет. Что не так-то? Почему должны быть строки? С ними и работать медленнее.
base64 - кодирование информации, к сведению.

Это сообщение отредактировал(а) Randajad - 18.3.2012, 10:24
PM MAIL   Вверх
borisbn
Дата 18.3.2012, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Randajad, повторю - числа не могут быть в какой-либо системе исчисления. Числа - это количество. А вот представление числа/количества может быть в любой системе исчисления.
Цитата(Randajad @  18.3.2012,  10:22 Найти цитируемый пост)
Что не так-то?

Попробуй своей функцией преобразовать в 16-тиричную систему и всё поймёшь

Цитата(Randajad @  18.3.2012,  10:22 Найти цитируемый пост)
base64 - кодирование информации, к сведению.

с какого перепугу? HEX тогда тоже кодирование?
Цитата
Base64 буквально означает — позиционная система счисления с основанием 64

отсюда



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Randajad
Дата 18.3.2012, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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




Действительно, как-то про что-то более 10 не подумал.

Ну тогда:

Код

int convert(const char *str, char base) {
   int ret = 0;
   for(int k = 1; *str; k *= base, str++) {
      char c = *str;
      if(c >= '0' && c <= '9')
         c -= '0';
      else if(c >= 'a' && c <= 'z')
         c -= 'a' - 10;
      else if(c >= 'A' && c <= 'Z')
         c -= 'A' - 10;
         
     ret += c * k;   
   }
   
   return ret; 
}


Это сообщение отредактировал(а) Randajad - 18.3.2012, 12:09
PM MAIL   Вверх
borisbn
Дата 18.3.2012, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(Randajad @  18.3.2012,  12:08 Найти цитируемый пост)
c -= 'a' - 10;

- 10 то зачем ? наверное, ты хотел + 10  smile 
и строка на входе должна быть перевёрнутая

Это сообщение отредактировал(а) borisbn - 18.3.2012, 12:16


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Randajad
Дата 18.3.2012, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пардон.
Вот так лучше!

Код

int convert(const char *str, char base) {
   int ret = 0;
   for(; *str; str++) {
      char c = *str;
      if(c >= '0' && c <= '9')
         c -= '0';
      else if(c >= 'a' && c <= 'z')
         c -= 'a' - 10;
      else /// A..Z
         c -= 'A' - 10;
     
     ret *= base;    
     ret += c;   
   }
   
   return ret; 
}


Именно - 10. Потому что c = c - 'a' + 10 будет именно как c -= 'a' - 10. smile

Это сообщение отредактировал(а) Randajad - 18.3.2012, 12:36
PM MAIL   Вверх
Ursa
Дата 18.3.2012, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо всем.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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