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

динамический массив чисел - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
rudeeeboy
14 / 14 / 1
Регистрация: 08.11.2010
Сообщений: 172
29.09.2011, 17:58     динамический массив чисел #1
Целое число, представленное в виде динамического массива байтов. .Каждый байт хранит 2 цифры числа (часть числа в диапазоне 0..99). Знак числа представлен отдельно.
Как хранить две цифры в одном байте?
в виде двумерного массива?
типо n[0][1]={4,9}?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
29.09.2011, 18:48     динамический массив чисел #2
Попробую объяснить)
ну вам надо хранить 2 цифры в 1 байте.
1 байт = 8 бит.
Цифры бывают от 0 до 9, представим цифру числом. Самое большое число-чифра - 9, представляется как 1001 в двоичном коде, в этом не трудно убедиться:
9 / 2 = 4 + 1
4 / 2 = 2 + 0
2 / 2 = 1 + 0
1 / 2 = 0 + 1
Таким образом чтобы хранить цифру, нам необходимо 4 бита, т.к. самое большое число-цифра это 9
Для второй цифры понадобиться еще 4 бита. Таким образом мы можем записать 2 цифры в 8 бит(1 байт). Познакомьтесь с понятиями "маска", "побитовые операции", "сдвиг", "побитовое или/и". Я думаю вам станет все понятно)
PS: Достаточно одномерного массива типа char, чтобы хранить числа от 0 до 99
rudeeeboy
14 / 14 / 1
Регистрация: 08.11.2010
Сообщений: 172
29.09.2011, 19:23  [ТС]     динамический массив чисел #3
если первая цифра ноль?
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
29.09.2011, 19:29     динамический массив чисел #4
Цитата Сообщение от rudeeeboy Посмотреть сообщение
если первая цифра ноль?
А в чем сложность?
например вы хотите представить такие сделущие числа:
97, 5, 10, 0
1001 0111, 0000 0101, 0001 0000, 0000 0000
rudeeeboy
14 / 14 / 1
Регистрация: 08.11.2010
Сообщений: 172
29.09.2011, 20:18  [ТС]     динамический массив чисел #5
а если 2002?
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
29.09.2011, 20:31     динамический массив чисел #6
Цитата Сообщение от rudeeeboy Посмотреть сообщение
а если 2002?
Да я, блин, не понимаю вашего вопроса!

2002 - это цифра или это число, явно не цифра, может быть это в троичной системе счисления или ваш год рождения? О_о

Задавайте вопрос яснее
Gepar
29.09.2011, 20:35
  #7

Не по теме:

У меня есть подозрение что rudeeeboy, сам не понимает задание до конца.

rudeeeboy
14 / 14 / 1
Регистрация: 08.11.2010
Сообщений: 172
29.09.2011, 20:39  [ТС]     динамический массив чисел #8
дано число, к примеру 2002 в десятичной, мне надо записать ег ов динамический массив, и вывести, по две цифры в байт
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
29.09.2011, 20:45     динамический массив чисел #9
Цитата Сообщение от Gepar Посмотреть сообщение
У меня есть подозрение что rudeeeboy, сам не понимает задание до конца.

Не по теме:

А у меня есть подозрение, что я угадал год рождения ТС....................2002



Цитата Сообщение от rudeeeboy Посмотреть сообщение
дано число, к примеру 2002 в десятичной, мне надо записать ег ов динамический массив, и вывести, по две цифры в байт
так и выводите по две цифры в байт!!! 2 байта надо тогда
rudeeeboy
14 / 14 / 1
Регистрация: 08.11.2010
Сообщений: 172
29.09.2011, 20:54  [ТС]     динамический массив чисел #10
так и вопрос был в этом как это прописать?
а про год рождения если бы мне было 10 лет и я занимался программированием что в том плохого?
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
29.09.2011, 21:18     динамический массив чисел #11
Цитата Сообщение от rudeeeboy Посмотреть сообщение
Как хранить две цифры в одном байте?
Хранить цифры можно но только до 1111 ~ 0x0F ~ (15) , и так следует что один байт представлен двумя тетрадами значить в байте можно хранить два значения если они только 0 <= N <= 15, вот примерчик набросал.
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
#include <stdio.h>
 
char t_pack(char a, char b) {
   return (a << 4) | b; 
}
 
char t_unpack(char ch,  int i) {
   return (ch >> (i*4)) & 0x0F;
}
 
int main () {
   char arr[16];
   for(int f = 0; f < 16; f++)
       arr[f] = t_pack(f, 0x0F - f);
 
   for(int i = 0; i < 16; i++) {
        for(int j = 1; j >= 0; j--)
             printf("%d\t", t_unpack(arr[i], j));
        putchar('\n');
   }
   char ch = t_pack(15, 15); // это максимум полная 4-ка тетрады
   char a, b;
   a = t_unpack(ch, 0);
   b = t_unpack(ch, 1);
   printf("\n%d = %d\n%02X = %02X\n", a, b, a, b);
 
   getchar();
   return 0;
}
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
29.09.2011, 21:28     динамический массив чисел #12
Цитата Сообщение от rudeeeboy Посмотреть сообщение
так и вопрос был в этом как это прописать?

Не по теме:

Общаюсь с вами только потому, что искренне верю, что вы всетаки 2002 года рождения, и что я непонятно объясняю, а еще потому что настроение хорошее



rudeeeboy, ну я же все написал. Вы хотите чтобы я за вас все сделал?


Цитата Сообщение от xAtom Посмотреть сообщение
Хранить цифры можно но только до 1111 ~ 0x0F ~ (15) , и так следует что один байт представлен двумя тетрадами значить в байте можно хранить два значения если они только 0 <= N <= 15, вот примерчик набросал.

Не по теме:

xAtom, какой вы злой человека после этого!)) я такое удовольствие получал от беседы
Теперь ТС уже не вернуть он забрал код и ушел с форума) где мне его искать?)

alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
29.09.2011, 23:52     динамический массив чисел #13
задача не тривиальная, я понимаю замешательство ТС
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <errno.h>
#include <string.h>
 
#define not(a) ((abs(a) == 1 || a == 0) ? 0 : 1)
 
typedef char __byte;
const int dec = 10;
 
int znak_ (int tmp){
    int retu_rn = (tmp >> (sizeof(int) * 8 - 1));
    return retu_rn;
}
 
int number_mass(int number){
    int tmp = number, retu_rn = 0;
 
    while(tmp > 0){
        tmp /= dec; ++retu_rn;
    }
    return retu_rn;
}
 
void numeric_out(int number, int ves, __byte* arr){
    int tmp = number, i = ves - 1;
 
    for(i; i >= 0; --i){
        arr[i] = (tmp % dec);
        tmp /= dec;
    }
}
 
int double_group(__byte* arr, int iter){
    int i = 1, j, tmp = iter;
    for (i; i < tmp; ++i){
 
        arr[i] += (dec * arr[i - 1]);
 
        for (j = i - 1; j < tmp - 1; ++j){
            arr[j] = arr[j + 1];
        }
 
        --tmp;
        arr = realloc(arr, iter * sizeof(__byte));
    }
    return tmp;
}
 
int main(){
 
    __byte *array;
    int number, count = 0, i, tmp, znak;
    scanf("%d", &number);
 
    znak = ~znak_(number) + 1;
    if(znak) number = ~(number - 1) | (~number + 1);
 
    if (not(number)){
 
        count = tmp = number_mass(number);
        array = (__byte*) malloc (tmp * sizeof(__byte));
        numeric_out(number, tmp, array);
        
        for(i = 0; i < count; ++i)
            printf(" %d", (int)array[i]);
 
        printf("\n\n");
        count = tmp = double_group(array, tmp);
 
        printf("бит знака: %d\n", znak);
        for(i = 0; i < count; ++i)
            printf("байт %d: %d\n", (count - i), array[i]);
            
        free(array);
    }
    else if (znak)
        printf("знаковый бит: %d\nчисло: %d\n", znak, ~number + 1);
    else if (!number)
        printf("нуль йопт");
    else
        printf("знаковый бит: %d\nчисло: %d\n", znak, number);
 
    return 0;
}
вывод
123456789
1 2 3 4 5 6 7 8 9

бит знака: 0
байт 5: 12
байт 4: 34
байт 3: 56
байт 2: 78
байт 1: 9
rudeeeboy
14 / 14 / 1
Регистрация: 08.11.2010
Сообщений: 172
16.10.2011, 12:12  [ТС]     динамический массив чисел #14
спасибо
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2011, 20:42     динамический массив чисел
Еще ссылки по теме:

Задан динамический массив целых чисел Z C++
Двумерный динамический массив вещественных чисел C++

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

Или воспользуйтесь поиском по форуму:
rudeeeboy
14 / 14 / 1
Регистрация: 08.11.2010
Сообщений: 172
27.10.2011, 20:42  [ТС]     динамический массив чисел #15
не могу исправить ошибку в ф-ях Double_group и Numeric_out
ошибка 63 `num' undeclared (first use this function)
num это число с клавиатуры
листинги

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
#include "stdlib.h"
#include "malloc.h"
#include "stdio.h"
#include <iostream.h>
#include <iomanip>
#include "chislo.h"
#include <math.h>
#include <errno.h>
#include <string.h>
 
Chislo::Chislo()
{
     ch=new int(n);
}
void Chislo::Dlina(){
    int j;
    j=num;
    n=0;
    while(j!=0)
    {
        j/=10;
        n++;
    }
} 
void Chislo::Znak(){
    if(num<0)
    {
        sign='-';
        num=num*(-1);
    }
    else sign='+';
} 
 
int Chislo::Not ()
{
    int a;
    a=num;
    return (abs(a) == 1 || a == 0) ? 0 : 1;
}
void Numeric_out(int ves){
    int tmp, i=ves-1;
    tmp=num;
    for(i; i >= 0; --i){
        ch[i] = (tmp % dec);
        tmp /= dec;
    }
}
int Double_group(int iter){
    int i = 1, j, tmp = iter;
    for (i; i < tmp; ++i){
 
        ch[i]+=(dec*ch[i-1]);
 
        for (j=i-1;j<tmp-1;++j){
            ch[j]=ch[j+1];
        }
        --tmp;
    }
    return tmp;
}
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
#ifndef _Chislo
#define _Chislo
const int dec = 10;
class Chislo
{            
 
      //const int dec = 10;
      public:
      char sign;
      int *ch;
      int n;
      int num;
      Chislo();
      void Predst(int n1, int chp[]);
      void Dlina();
      void Znak();
      int Preobr();
      //void Show();
      int Not();
      void Numeric_out(int);
      int Double_group(int);
      //int Number_mass();
      ~Chislo(){delete []ch;}
      
};
#endif
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 "stdlib.h"
#include "malloc.h"
#include "stdio.h"
#include <iostream.h>
#include <iomanip>
#include "chislo.h"
#include <math.h>
#include <errno.h>
#include <string.h>            
int main(){
    int i,tmp;
    Chislo p;
    cout << " Vvedite chislo \n";
    cin >>(p.num);
    p.Znak();
    p.Dlina();
    Chislo();
    tmp=p.n;
    if (p.Not()){
        p.Numeric_out(tmp);
        
        for(i=0;i<p.n;++i)
            printf(" %d", p.ch[i]);
 
        printf("\n\n");
        p.n=tmp=p.Double_group(tmp); 
        printf("byte znaka: %d\n", p.sign);
        for(i = 0; i < p.n; ++i)
        printf("byte %d: %d\n",(p.n-i),p.ch[i]);
    }
    else if (p.sign)
        printf("znakovi byte: %d\n chislo: %d\n", p.sign, ~p.num + 1);
    else if (!p.num)
        printf("nool");
    else
        printf("znakovi byte: %d\n chislo: %d\n", p.sign, p.num);
    //p.Preobr();
    //p.Show();
    system("PAUSE");
}
Yandex
Объявления
27.10.2011, 20:42     динамический массив чисел
Ответ Создать тему
Опции темы

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