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

Доделать заполнение динамического массива вручную - C++

Восстановить пароль Регистрация
 
niikiita
3 / 3 / 0
Регистрация: 29.05.2013
Сообщений: 223
25.05.2014, 14:52     Доделать заполнение динамического массива вручную #1
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
#include "stdafx.h"
#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
    char bvector1[11]={0,1,1,1,1,1,1,1,1,1,1};
    char bvector2[11]={0,1,0,0,0,0,0,0,0,0,0};
    char rezult[11];
    int i;
    char carry,sum;
    i=10;
    carry=0;
    while (i>=0)
    {
       sum=bvector1[i]-bvector2[i]+carry;
       rezult[i--]=sum&1;
       carry=sum>>1;
    }
    printf("\n");
    for (i=0; i<11; i++)
    printf("%d",(int)rezult[i]);
    system("Pause");
}
Вот код программы, складывающей двоичные числа. Вопрос следующий: как переделать, чтобы можно было вручную вводить числа? Попробовал с помощью динамических массивов, не пойму почему не работает:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
char *bvector1 = new char [9];
    char *bvector2 = new char [9];
    cin >> bvector1 >> bvector2;
    char rezult[9];
    int i;
    char carry,sum;
    i=8;
    carry=0;
    while (i>=0)
    {
       sum=bvector1[i]+bvector2[i]+carry;
       rezult[i--]=sum&1;
       carry=sum>>1;
     }
 printf("\n");
 for (i=0; i<9; i++)
     printf("%d",(int)rezult[i]);
    system("Pause");
    delete [] bvector1;
    delete [] bvector2;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2014, 14:52     Доделать заполнение динамического массива вручную
Посмотрите здесь:

C++ Заполнение динамического массива случайными числами
Заполнение динамического массива числами от -50 до 50! C++
C++ заполнение динамического двумерного массива
C++ Динамическая матрица, заполнение динамического массива.
C++ Создание, заполнение объектами и удаление динамического массива. Выдает run time error
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,206
Завершенные тесты: 1
25.05.2014, 15:44     Доделать заполнение динамического массива вручную #2
Вводятся коды цифр, и вам надо из них получить числа:
C++
1
2
3
4
5
6
7
8
9
10
11
char bvector1[100];
    char bvector2[100]; 
cin >> bvector1 >> bvector2;
for(int i=0;i<strlen(bvector1);i++)
{
   bvector1[i]-='0';
}
for(int i=0;i<strlen(bvector2);i++)
{
   bvector2[i]-='0';
}
niikiita
3 / 3 / 0
Регистрация: 29.05.2013
Сообщений: 223
25.05.2014, 16:40  [ТС]     Доделать заполнение динамического массива вручную #3
Цитата Сообщение от zss Посмотреть сообщение
Вводятся коды цифр, и вам надо из них получить числа:
А как задать так, чтобы нулевой элемент массива был изначально равен нулю?

Добавлено через 22 минуты
Цитата Сообщение от zss Посмотреть сообщение
Вводятся коды цифр, и вам надо из них получить числа:
Я не пойму, вот вводим мы число, например 11110101. Потом мы от числа отнимает код нуля: 1 - '0' - в чем смысл этого?
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,206
Завершенные тесты: 1
25.05.2014, 16:56     Доделать заполнение динамического массива вручную #4
Цитата Сообщение от niikiita Посмотреть сообщение
вот вводим мы число, например 11110101
Т.к. массивы bvector1 bvector2 имеет тип char, то Вы вводите буквы.
Соответственно, если введена буква '1', то '1'-'0' Даст число 1, а '0'-'0' - число 0

Добавлено через 1 минуту
Цитата Сообщение от niikiita Посмотреть сообщение
как задать так, чтобы нулевой элемент массива был изначально равен нулю?
можно, конечно написать bvector1[0]=0; только зачем? cin>>bvector1; его затрет.
niikiita
3 / 3 / 0
Регистрация: 29.05.2013
Сообщений: 223
25.05.2014, 17:17  [ТС]     Доделать заполнение динамического массива вручную #5
Цитата Сообщение от zss Посмотреть сообщение
Т.к. массивы bvector1 bvector2 имеет тип char, то Вы вводите буквы.
Соответственно, если введена буква '1', то '1'-'0' Даст число 1, а '0'-'0' - число 0
Это понятно. А как мне дальше,например в массиве char rezult[9]; определить, количество этих введённых символов?
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
char bvector1[100];
    char bvector2[100]; 
    cin >> bvector1 >> bvector2;
    for(int i=0;i  <strlen(bvector1); i++)
    {
        bvector1[i]-='0';
    }
    for(int i=0;i < strlen(bvector2); i++)
    {
        bvector2[i]-='0';
    }
    int q;
    strlen(bvector2) == q;
    char rezult[q];
    int i;
    char carry,sum;
    i=q-1;
    carry=0;
    while (i>=0)
    {
       sum=bvector1[i]+bvector2[i]+carry;
       rezult[i--]=sum&1;
       carry=sum>>1;
     }
 printf("\n");
 for (i=0; i<q; i++)
     printf("%d",(int)rezult[i]);
    system("Pause");
Пытался так, но выдает что выражение должно иметь константное значение
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,206
Завершенные тесты: 1
25.05.2014, 17:46     Доделать заполнение динамического массива вручную #6
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
   cin >> bvector1 >> bvector2;
     int L1=strlen(bvector1);
    for(int i=0;i  <L1; i++)
    {
        bvector1[i]-='0';
    }
    int L2=strlen(bvector2);
    for(int i=0;i < L2; i++)
    {
        bvector2[i]-='0';
    }
    int q=L2; // !!!!! нет гарантии, что L1 равно L2
    char rezult[100];
    int i;
    char carry,sum;
    i=q-1;
    carry=0;
    while (i>=0)
    {
       sum=bvector1[i]+bvector2[i]+carry;
       rezult[i--]=sum&1;
       carry=sum>>1;
     }
 printf("\n");
 for (i=0; i<q; i++)
     printf("%d",(int)rezult[i]);
    system("Pause");
niikiita
3 / 3 / 0
Регистрация: 29.05.2013
Сообщений: 223
25.05.2014, 18:40  [ТС]     Доделать заполнение динамического массива вручную #7
Цитата Сообщение от zss Посмотреть сообщение
[CPPchar bvector1[9]={0,1,0,1,0,1,1,1,1};
char bvector2[9]={0,1,0,1,1,0,1,0,1};
char rezult[9];
int i;
char carry,sum;

i=8;
carry=0;
while (i>=0) {
sum=bvector1[i]+bvector2[i]+carry;
rezult[i--]=sum&1;
carry=sum>>1;
}
printf("\n");
for (i=0; i<9; i++)
printf("%d",(int)rezult[i]);
[/CPP]
Вы не могли бы объяснить, как работает этот кусок кода?
sum=bvector1[i]-bvector2[i]+carry;// '1' + '1' + '0' = ??
rezult[i--]=sum&1;// выделение следующего бита так?
carry=sum>>1;// сдвиг на следующий бит, но каким образом? '0' = сдвигу. Как это?
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,206
Завершенные тесты: 1
25.05.2014, 18:47     Доделать заполнение динамического массива вручную #8
Цитата Сообщение от niikiita Посмотреть сообщение
sum=bvector1[i]+bvector2[i]+carry;
В арифметических выражениях char интерпретируется как int,
так что там после вычитания кода буквы ноль ('0') получается не
'1'+'1'+0, а 1+1+0
niikiita
3 / 3 / 0
Регистрация: 29.05.2013
Сообщений: 223
25.05.2014, 19:13  [ТС]     Доделать заполнение динамического массива вручную #9
Цитата Сообщение от zss Посмотреть сообщение
В арифметических выражениях char интерпретируется как int,
так что там после вычитания кода буквы ноль ('0') получается не
'1'+'1'+0, а 1+1+0
1+1+0=2, в чем смысл этой строки? carry=sum>>1;
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,206
Завершенные тесты: 1
25.05.2014, 19:26     Доделать заполнение динамического массива вручную #10
Цитата Сообщение от niikiita Посмотреть сообщение
1+1+0=2
2 - в двочной системе 10, если сдвинуть на 1 разряд, то получим 1.
niikiita
3 / 3 / 0
Регистрация: 29.05.2013
Сообщений: 223
25.05.2014, 19:37  [ТС]     Доделать заполнение динамического массива вручную #11
Цитата Сообщение от zss Посмотреть сообщение
2 - в двочной системе 10, если сдвинуть на 1 разряд, то получим 1.
Как переписать программу, чтобы она считала с разными длинами? вот например:
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
char bvector1[100];
    char bvector2[100]; 
        cin >> bvector1 >> bvector2;
    int L1=strlen(bvector1);
    for(int i=0;i  <L1; i++)
    {
       bvector1[i]-='0';
    }
    int L2=strlen(bvector2);
    for(int i=0;i < L2; i++)
    {
       bvector2[i]-='0';
    }
    int G = L1;
    if(L2 > L1){ L2 = G;}
 
    int q=G; 
    char rezult[100];
    int i;
    char carry,sum;
    i=q-1;
    carry=0;
    while (i>=0)
    {
       sum=bvector1[i]+bvector2[i]+carry;
       rezult[i--]=sum&1;
       carry=sum>>1;
     }
 printf("\n");
 for (i=0; i<q; i++)
     printf("%d",(int)rezult[i]);
    system("Pause");
но ответы не верные получаются
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2014, 20:24     Доделать заполнение динамического массива вручную
Еще ссылки по теме:

C++ Заполнение динамического масива
Заполнение динамического массива через указатели C++
C++ Заполнение двумерного динамического массива числами из диапазона от -10 до 10

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

Или воспользуйтесь поиском по форуму:
niikiita
3 / 3 / 0
Регистрация: 29.05.2013
Сообщений: 223
30.05.2014, 20:24  [ТС]     Доделать заполнение динамического массива вручную #12
Цитата Сообщение от zss Посмотреть сообщение
Вводятся коды цифр, и вам надо из них получить числа:
Код C++
1
2
3
4
5
6
7
8
9
10
11
char bvector1[100];
* * char bvector2[100];
cin >> bvector1 >> bvector2;
for(int i=0;i<strlen(bvector1);i++)
{
* *bvector1[i]-='0';
}
for(int i=0;i<strlen(bvector2);i++)
{
* *bvector2[i]-='0';
}
А зачем мне из букв получать числа? До этого в символьном виде все считалось.
Yandex
Объявления
30.05.2014, 20:24     Доделать заполнение динамического массива вручную
Ответ Создать тему
Опции темы

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