Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/64: Рейтинг темы: голосов - 64, средняя оценка - 4.86
0 / -2 / 0
Регистрация: 26.09.2016
Сообщений: 34
1

Заменить все встречающиеся в тексте числа на эти же числа в двоичной системе счисления

19.07.2017, 13:02. Показов 12039. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Условие задачи:
На планете Роботов очень не любят десятичную систему счисления, поэтому они попросили Вас написать программу, которая заменяет все встречающиеся в тексте числа на эти же числа, но в двоичной системе счисления.

Входные данные
Единственная строка, состоящая из любых символов. Длина строки не превышает 255 символов. Гарантируется, что во всех числах нет ведущих нулей.

Выходные данные
Выведите преобразованную строку.

Примеры
входные данные
6^&678JKjdkdl;?.,lk879Pk1kdfl4839
выходные данные
110^&1010100110JKjdkdl;?.,lk1101101111Pk1kdfl1001011100111


Мой код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//http://informatics.mccme.ru/mod/statements/view3.php?id=248&chapterid=2805#1 (сайт с задачей)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void dectobin(int n){//Рекурсивная функция перевода числа из десятичной системы счисления в двоичную
    if (n>=2){
        dectobin( n/2 );
    }
    printf("%d", n % 2);
}
int main(void){
    system("chcp 1251>nul");
    int i,l,r,t;
    char str[1111],temp[1111];
    scanf("%[^\n]",str);
    i=0;
    while(i<strlen(str)){
        if ((str[i]>='0') && (str[i]<='9')){//Пытаемся найти число в строке
            l=i;//Левый край числа
            r=i;//Предположительный правый край числа
            while((str[r]>='0') && (str[r]<='9') && (r<strlen(str))){
                r++;
            }
            r--;//Правый край числа
            memset(temp,0,1111);//Обнуление строки temp
            //Нужная часть (число) из строки str (с определенных позиций)
                        //копируется в строку temp:
                        strncpy(temp,str+l,r-l+1);
            t=atoi(temp);//Строка->число
            dectobin(t);//Вызов функции перевода
            i=r+1;
        }
        else{
            printf("%c",str[i]);//Иначе печатаем символ и идем дальше
            i++;
        }
    }
    system("pause>nul");
    return 0;
}
 Комментарий модератора 
Перенесено из раздела "С++ для начинающих"
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.07.2017, 13:02
Ответы с готовыми решениями:

Заменить все встречающиеся в тексте числа на эти же числа, но в двоичной системе счисления
На планете Роботов очень не любят десятичную систему счисления, поэтому они попросили Вас написать...

Написать программу, которая заменяет все встречающиеся в тексте числа на эти же числа, но в двоичной системе счисления
Нужна помощь в доработке программы. При вводе двух- и более -значных чисел выдает ...

Дана строка - запись числа в двоичной системе счисления. Преобразуйте ее в строку - запись числа в шестнадцатеричной системе счисления
Дана строка, представляющая собой запись числа в двоичной системе счисления. Преобразуйте ее в...

Если строка является изображением целого числа в восьмеричной системе счисления, то перевести ее в целое число в двоичной системе счисления
Вводится строка символов. Если она является изображением целого числа в восьмеричной системе...

16
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
19.07.2017, 13:32 2
и что не так? если строго задаче вроде как все работает..

а так удобнее наверное было бы, отфильтрованные символы не выводить.
P.S. - И да, код у вас написан на Си, а раздел где Вы написали для С++
1
0 / -2 / 0
Регистрация: 26.09.2016
Сообщений: 34
19.07.2017, 13:44  [ТС] 3
Задача с сайта с автопроверкой (ссылка в самом верху кода).Программа не проходит некоторые тесты, а отфильтрованные символы, когда я прогонял собственные тесты,не выводил,но по условию это необходимо сделать.Извините, не увидел, что есть раздел C (но толку мало-там почти никто не сидит).
0
822 / 625 / 321
Регистрация: 24.02.2017
Сообщений: 2,205
21.07.2017, 00:30 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <string>
#include <iostream>
 using namespace std;
 
int main()
{
  string s = "6^&678JKjdkdl;?.,lk879Pk1kdfl4839";
  string s1,s2,s3,t1;
  int i=0,j=0;
  char t[33]="\0";
 ///////////////////
  while(s[i]!='\0')
  {
    if(s[i]>='0' && s[i]<='9')
      s1+=s[i];
 
    if(s[i]<'0' || s[i]>'9')
      s1+=' ';
    i++;
   }
 ////////////////////
   i=0;
   while(s[i]!='\0')
  {
   if(s[i]<'0'|| s[i]>'9')
     s2+=s[i];
   i++;
   }
//////////////////////////////
     i=0;
     while(s1[i]!='\0')
      {
       if(s1[i]!=32)
        {
          t1+=s1[i];
          if(s1[i+1]==32 || s[i+1]=='\0')
           {
             s3+= itoa(atoi(t1.c_str()),t,2);
             t1="";
           }
         }
        if(s1[i]==32)
          s3+=" ";
        i++;
       }
       s1=s3;
       s3="";
/////////////////////////
    i=0;
    while(s1[i]!='\0')
     {
       if(s1[i]!=32)
         s3+=s1[i];
       if(s1[i]==32)
        {
          s3+=s2[j];
          j++;
        }
       i++;
     }
     s=s3;
     cout<<s;
 
    system("pause>NULL");
    return 0;
}
0
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,053
21.07.2017, 01:45 5
Цитата Сообщение от assassinviktor Посмотреть сообщение
C
1
scanf("%[^\n]",str);
Не будет работать с пустой строкой. Откуда вообще пошла эта странная манера использовать scanf("%[^\n]"? Чем вам fgets не угодил?

Цитата Сообщение от assassinviktor Посмотреть сообщение
C
1
while((str[r]>='0') && (str[r]<='9') && (r<strlen(str))){
Не ошибка, но избыточная проверка на r<strlen(str)...

Цитата Сообщение от assassinviktor Посмотреть сообщение
Извините, не увидел, что есть раздел C (но толку мало-там почти никто не сидит).
Это как это? Радел "С для начинающих" весьма активен.

Я в условии задачи не увидел никаких ограничений на диапазон самих чисел. А вы смело используете atoi...
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12456 / 7480 / 1753
Регистрация: 25.07.2009
Сообщений: 13,759
21.07.2017, 03:04 6
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Откуда вообще пошла эта странная манера использовать scanf("%[^\n]"?
А что с ней не так? Просто использовать правильно надо - размер буфера указывать + возвращаемое значение проверять.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Чем вам fgets не угодил?
Символ перевода строки в хвост вставляет, а это не всегда удобно. Проверяй потом, есть он там, не, выковыривай, если есть...
0
822 / 625 / 321
Регистрация: 24.02.2017
Сообщений: 2,205
21.07.2017, 08:54 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <cstring>
#include <iostream>
 using namespace std;
 
int main()
{
  string s = "6^&678JKjdkdl;?.,lk879Pk1kdfl4839";
  string s1,s2;
  int i=0;
  char t[33]="\0";
 
  while(s[i]!='\0')
  {
    if(s[i]>='0' && s[i]<='9')
     {
          s1+=s[i];
          if(s[i+1]<'0' || s[i+1]>'9' || s[i+1]=='\0')
           {
             s2+= itoa(atoi(s1.c_str()),t,2);
             s1="";
 
           }
         }
 
    if(s[i]<'0' || s[i]>'9')
      s2+=s[i];
    i++;
   }
 
     s=s2;
     cout<<s;
 
    system("pause>NULL");
    return 0;
}
0
0 / -2 / 0
Регистрация: 26.09.2016
Сообщений: 34
21.07.2017, 14:12  [ТС] 8
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Не будет работать с пустой строкой
Спасибо, буду знать, что такая инструкция форматирования не подходит для пустых строк.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Откуда вообще пошла эта странная манера использовать scanf("%[^\n]"? Чем вам fgets не угодил?
Первый способ ввода строк по моему учебнику - scanf с такой строкой форматирования.И, кстати, в чем разница fgets и gets?
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Не ошибка, но избыточная проверка на r<strlen(str)...
В цикле же r увеличивается, вдруг за пределы строки выйдет?
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это как это? Радел "С для начинающих" весьма активен.
Видел онлайн 26 человек
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Я в условии задачи не увидел никаких ограничений на диапазон самих чисел. А вы смело используете atoi...
А в чем проблема? (Правда число длинной 255 не влезет в int )

Добавлено через 2 минуты
Цитата Сообщение от easybudda Посмотреть сообщение
А что с ней не так? Просто использовать правильно надо - размер буфера указывать + возвращаемое значение проверять.
Подскажите как
0
Заблокирован
21.07.2017, 14:28 9
Лучший ответ Сообщение было отмечено assassinviktor как решение

Решение

Цитата Сообщение от assassinviktor Посмотреть сообщение
число длинной 255
ну если есть чем проверить
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void dectobin(char *s,char *end)
{
    char *p,n;
    for(n=0,p=s; p<=end; p++)
    {
        n+=*p;
        *p=n/2;
        n=n%2*10;
    }
    if(!*s) s++;
    if(s<=end) dectobin(s,end);
    printf("%d",n/10);
}
int main(int argc,char* argv[])
{   
    char s[]="12345678901234567890";
    char *p;
 
    for(p=s; *p; p++) *p-='0';
    dectobin(s,p-1);
    printf("\n");
1
0 / -2 / 0
Регистрация: 26.09.2016
Сообщений: 34
21.07.2017, 14:46  [ТС] 10
Цитата Сообщение от MansMI Посмотреть сообщение
ну если есть чем проверить
Спасибо вам большое!
Один только вопрос : как использовать указатели в качестве лог выражений?
Когда они равны 0?
0
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,053
21.07.2017, 17:35 11
Цитата Сообщение от assassinviktor Посмотреть сообщение
Первый способ ввода строк по моему учебнику - scanf с такой строкой форматирования.И, кстати, в чем разница fgets и gets?
Тем, что никакого gets уже давно нет. Выпилили.

Цитата Сообщение от assassinviktor Посмотреть сообщение
В цикле же r увеличивается, вдруг за пределы строки выйдет?
Во-первых, если бы вы боялись, что r может выйти за пределы строки, то проверка r<strlen(str) должна была бы стоять первой в условии цикла, а не последней. Иначе ваши проверки (str[r]>='0') && (str[r]<='9') уже вылезали бы за пределы строки.

Во-вторых, не может r выйти за пределы строки. В конце строки стоит '\0'. Поэтому ваша проверка (str[r]>='0') && (str[r]<='9') автоматически остановит цикл при достижении этого '\0'. Поэтому проверка r<strlen(str) - избыточна.

Цитата Сообщение от assassinviktor Посмотреть сообщение
А в чем проблема? (Правда число длинной 255 не влезет в int )
Именно в этом и проблема.
1
0 / -2 / 0
Регистрация: 26.09.2016
Сообщений: 34
21.07.2017, 19:54  [ТС] 12
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Во-первых, если бы вы боялись, что r может выйти за пределы строки, то проверка r<strlen(str) должна была бы стоять первой в условии цикла, а не последней. Иначе ваши проверки (str[r]>='0') && (str[r]<='9') уже вылезали бы за пределы строки.
Во-вторых, не может r выйти за пределы строки. В конце строки стоит '\0'. Поэтому ваша проверка (str[r]>='0') && (str[r]<='9') автоматически остановит цикл при достижении этого '\0'. Поэтому проверка r<strlen(str) - избыточна.
Точно)

Добавлено через 16 секунд
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Во-первых, если бы вы боялись, что r может выйти за пределы строки, то проверка r<strlen(str) должна была бы стоять первой в условии цикла, а не последней. Иначе ваши проверки (str[r]>='0') && (str[r]<='9') уже вылезали бы за пределы строки.
Во-вторых, не может r выйти за пределы строки. В конце строки стоит '\0'. Поэтому ваша проверка (str[r]>='0') && (str[r]<='9') автоматически остановит цикл при достижении этого '\0'. Поэтому проверка r<strlen(str) - избыточна.
Точно)
0
Заблокирован
22.07.2017, 09:12 13
assassinviktor, количество пройденных тестов увеличилось?
1
0 / -2 / 0
Регистрация: 26.09.2016
Сообщений: 34
22.07.2017, 14:18  [ТС] 14
Цитата Сообщение от MansMI Посмотреть сообщение
количество пройденных тестов увеличилось?
Да, спасибо)
0
Заблокирован
22.07.2017, 14:24 15
открою страшную тайну, числовая прямая, у нее еще у влево счет ведется
0
0 / -2 / 0
Регистрация: 26.09.2016
Сообщений: 34
22.07.2017, 17:23  [ТС] 16
Цитата Сообщение от MansMI Посмотреть сообщение
открою страшную тайну, числовая прямая, у нее еще у влево счет ведется
По условию задачи отрицательных чисел нет,т.к. - будет считаться за символ
0
Заблокирован
23.07.2017, 03:07 17
а напрасно, отрицательные числа очень по другому выглядят
0
23.07.2017, 03:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.07.2017, 03:07
Помогаю со студенческими работами здесь

Вводится числа от 1 до 15. Вывести данные числа в двоичной системе счисления
Вводится числа от 1 до 15. Вывести данные числа в двоичной системе счисления.

Функция: вычислить значение числа по записи этого числа в двоичной системе счисления
Назначение: вычисляет десятичное значение целого числа по заданной строке символов s, который...

Проверить правильность ввода числа в двоичной системе счисления и перевести это число из двоичной системы в десятичную
Здравствуйте! Подскажите, пожалуйста, как исправить код, чтобы выполнялось задание. Делала на...

Запись числа в двоичной системе счисления
Ввести десятичное натуральное число. Получить строку, представляющую собой запись этого числа в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru