Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Sibar
4 / 4 / 0
Регистрация: 09.02.2011
Сообщений: 26
#1

задача на C++ - C++

18.12.2011, 17:17. Просмотров 946. Ответов 17
Метки нет (Все метки)

Написать программу, которая получает случайное целое типа int, выводит его двоичное представление на экран. Если в числе встречается последовательность битов 000, программа заменяет её на 0110 (лишние разряды сдвигает влево)
Писать всю программу не обязательно, нужно хотя бы приблизительное направление в котором работать.


Заранее спасибо.

Добавлено через 44 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    srand((unsigned)time(NULL));
    int k=256;
    int x = rand()%k-1; 
    cout<<x<< " "; //âûâîäèì
     
    for(int i = sizeof(int)*2 - 1; i >= 0; i--)
      cout <<((x >> i) & 1) <<' ';
    
return 0;
}
вывод в двоичной форме...
с остальным запара...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dima_c8
4 / 4 / 0
Регистрация: 17.12.2011
Сообщений: 148
18.12.2011, 17:33     задача на C++ #2
Я думаю что здесь нужно использовать инструкцыю "if"или "switch" но вполне возможно что я ошыбаюсь 50на50
Sibar
4 / 4 / 0
Регистрация: 09.02.2011
Сообщений: 26
18.12.2011, 17:37  [ТС]     задача на C++ #3
я больше к while склоняюсь

пока число не станет кратным 1000 (то есть 8)
сдвигать по битово в право
потом заменить числа 000 на 0110
и сбросить самый старший единичный бит
и все это скорее всего в цикле, на случай если у нас будет две последовательности 000
Sibar
4 / 4 / 0
Регистрация: 09.02.2011
Сообщений: 26
18.12.2011, 18:15  [ТС]     задача на C++ #4
циклический сдвиг вправо

C++
1
2
3
4
5
6
7
int shl(int a, int s) 
  {
     if (a>>7==0)
        return ((a<<s) | (a>>7-s)) & (~(1<<7));
     else
       return ((a<<s) | (a>>7-s)) | (1<<7);
  }
не хочет правда компилироваться
soon
2537 / 1302 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
18.12.2011, 18:50     задача на C++ #5
Что должно быть на выходе при num = 1000000b? 101100110b? Или 100110110b?
Sibar
4 / 4 / 0
Регистрация: 09.02.2011
Сообщений: 26
18.12.2011, 19:03  [ТС]     задача на C++ #6
она должна искать нули слева столько раз пока все последовательности 000 не исчезнут
то есть:
1 000 000 0 -> 1 0110 000 0 ->0110 000 0-> 0110 0110 0-> 11001100
число генерируются случайно в диапазоне от 0 до 255. (то есть 8 бит)
soon
2537 / 1302 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
18.12.2011, 19:16     задача на C++ #7
Вот на 2-й случай
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
#include <stdio.h>
 
int func(int num)
{
    int out = 0;
    int order = 0;
    while(num)
    {
        if((num & 0x7) == 0)
        {
            num <<= 1;
            num |= 0x6;
        }
        out |= ((num & 1) << order);
        num >>= 1;
        ++order;
    }
    return out;
}
 
int main(void)
{
    int a;
    scanf("%d", &a);
    printf("%d", func(a));
    return 0;
}
Добавлено через 13 минут
А почему не сначала ищем нули?
Sibar
4 / 4 / 0
Регистрация: 09.02.2011
Сообщений: 26
18.12.2011, 19:21  [ТС]     задача на C++ #8
если вместо ввода а с клавиатуры, вставлять код генерации случайного числа - не компилируется.
да и сам код довольно странно реагирует на числа.
или он в десятиричной выводит?

А почему не сначала ищем нули?
в условиях нет на счет этого ничего

сообразил с кодом. благодарю!

что на счет случайных чисел?
soon
2537 / 1302 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
18.12.2011, 19:25     задача на C++ #9
Имхо, задание составлено некорректно. Не указано, с какой стороны искать нули. Не сказано, как искать нули. Вот как минимум 4 случая
0000 0100 0000
0000 1000 0110
0001 0011 0110

0000 0100 0000
0000 1000 0110
0001 0110 0110

0000 0100 0000
0000 1011 0000
0001 0110 1100

0000 0100 0000
0000 1011 0000
0001 0110 0110
Sibar
4 / 4 / 0
Регистрация: 09.02.2011
Сообщений: 26
18.12.2011, 19:29  [ТС]     задача на C++ #10
00 000 1 000 000

я думаю всё-таки это оптимальный вариант
когда всё берется за один раз
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
18.12.2011, 19:34     задача на C++ #11
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
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <string>
 
int main( int argc, char *argv[] ) 
{
    int k = 256, x;
 
    std::string str, 
        str2 = "000", 
        str3 = "0110";
    std::string::size_type pos = 0;
 
    srand((unsigned)time(NULL));
 
    x = rand()%k-1; 
    std::cout << x << std::endl;
 
    char buf[2] = { 0 };
    for(int i = sizeof(int)*2 - 1; i >= 0; i--)
    {
        itoa(((x >> i) & 1), buf, 10);
        str.append(buf);
    }
 
    std::cout << std::endl << str << std::endl;
 
    pos = str.find(str2);
    while ( pos != std::string::npos )
    {
        str.erase(pos, str2.size());
        str.insert(pos, str3);
        str.erase(0, 1);
        pos = str.find(str2);
    }
    std::cout << str << std::endl;
 
    return 0;
}
Sibar
4 / 4 / 0
Регистрация: 09.02.2011
Сообщений: 26
18.12.2011, 19:34  [ТС]     задача на C++ #12
insolent спасибо, но не пойдет такой код
soon
2537 / 1302 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
18.12.2011, 19:36     задача на C++ #13
Ну и мы получим 102, или 0110 0110, если отбросить биты больше 8-го
Прототип примерно такой.
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 <stdio.h>
 
int func(int num)
{
    int out = 0;
    int order = 0;
    while(order < 8)
    {
        if((num & 0x7) == 0)
        {
            /*printf("find 3 zero out = %d num = %d order = %d\n", out, num, order);*/
            out |= (0x6 << order);
            order += 4;
            num >>= 3;
            /*printf("end out = %d num = %d order = %d\n", out, num, order);*/
        }
        else
        {
            /*printf("out = %d num = %d order = %d\n", out, num, order);*/
            out |= ((num & 1) << order);
            num >>= 1;
            ++order;
            /*printf("end out = %d num = %d order = %d\n", out, num, order);*/
        }
    }
    return out;
}
 
int main(void)
{
    int a;
    scanf("%d", &a);
    printf("%d", func(a));
    return 0;
}
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
18.12.2011, 19:38     задача на C++ #14
Sibar, чего не подойдет? Нужно на С?
Sibar
4 / 4 / 0
Регистрация: 09.02.2011
Сообщений: 26
18.12.2011, 19:41  [ТС]     задача на C++ #15
int main(void)
{
int a;
scanf("%d", &a);
printf("%d", func(a));
return 0;
}
Все прекрасно работает, но надо чтобы число случайным образом генерировалось. И нужно отобразить в двоичной системе.

как то так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream.h>
#include <stdlib.h>
#include <time.h>
int main()
{
        srand((unsigned)time(NULL));
        int k=256;
        int x = rand()%k-1; 
        cout<<x<< " "; //выводим
     
    for(int i = sizeof(int)*2 - 1; i >= 0; i--)
      cout <<((x >> i) & 1) <<' ';
    scanf("%d", &x);
    printf("%d", func(x));
return 0;
}
soon
2537 / 1302 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
18.12.2011, 19:47     задача на C++ #16
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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int func(int num)
{
    int out = 0;
    int order = 0;
    while(order < 8)
    {
        if((num & 0x7) == 0)
        {
            /*printf("find 3 zero out = %d num = %d order = %d\n", out, num, order);*/
            out |= (0x6 << order);
            order += 4;
            num >>= 3;
            /*printf("end out = %d num = %d order = %d\n", out, num, order);*/
        }
        else
        {
            /*printf("out = %d num = %d order = %d\n", out, num, order);*/
            out |= ((num & 1) << order);
            num >>= 1;
            ++order;
            /*printf("end out = %d num = %d order = %d\n", out, num, order);*/
        }
    }
    out &= 255;
    return out;
}
 
void printBin(int num)
{
    char str[8];
    int i;
    for(i = 0; i < 8; ++i, num >>= 1)
        str[7 - i] = '0' + (num & 1);
    printf("%s\n", str);
}
 
int main(void)
{
    srand(time(NULL));
    int a = rand() % 256;
    int b = func(a);
    printf("%d %d\n",a, b);
    printBin(b);
    return 0;
}
Sibar
4 / 4 / 0
Регистрация: 09.02.2011
Сообщений: 26
18.12.2011, 19:49  [ТС]     задача на C++ #17
результат работы программы http://*************/s/1pxMP
194 - случайное число
154 - число которое получилось после замены 000 на 0110
а вот 10011010А это двоичное представление числа 154. но что за стрелочка? о_О
soon
2537 / 1302 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
18.12.2011, 19:52     задача на C++ #18
Код
soon@bt:~/Desktop$ ./main 
194 154
10011010
soon@bt:~/Desktop$
Там еще откуда-то буква А взялась.
Yandex
Объявления
18.12.2011, 19:52     задача на C++
Ответ Создать тему
Опции темы

Текущее время: 21:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru