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

Работа с массивами, замена элементов массива - C++

Восстановить пароль Регистрация
 
iiyuijkhgfjf
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 69
07.04.2013, 18:44     Работа с массивами, замена элементов массива #1
День добрый Товарищи.
Взялся на днях за задачу, но в процессе реализации уперся в стену (что именно - укажу ниже).
Собственно текст задачи.

Дан одномерный целочисленный массив из N элементов, заданных случайными числами на промежутке [a; b). Заменить все элементы массива, кратные 3, на сумму их цифр.

И код.

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
#include <iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;
 
int main()
{
    double z=0;
    double p=0;
    //double y=0;
    //double u=0;
    int s=0;
    int a;
    int b;
    double x=0;
    cout << "Wwedite a ";
    cin >> a;
    cout << "Wwedite b ";
    cin >> b;
    int k[10];
    const int n=10;
    for(int i=0; i<n; i++)
    {
          k[i]=rand()%(b-a)+a;
          cout << k[i] << endl;
    }
    for(int i=0; i<n; i++)
    {
        if ((k[i]%3)==0)
        {
           z=k[i];
           while(z>1)
           {
            z = z/10.0;
            s++;
            p+=k[i]%10;
            //s+=k[i]%10;
            //s=k[i]%10+k[i]/10;
            //s=z;
            cout << "Z=" << z << endl;
           // cout << "S=" << s << endl; //определяет скольки значное число.
            cout << "P=" << p << endl;
           }
     s=0;
         }
     }
     return 0;
}
Вот в чем загвостка. Скажем, число 597 - оно делится на 3 поэтому я его должен заменить на сумму цифр этого числа 5+9+7=21 т.е. 597 заменяется на 21 и так для всех чисел, которые делятся на 3.
Я точно уверен в том, что и-тое число матрицы (которое делится на 3) нужно делить на 10, тем самым чтобы разбить число (то же 597) на его составляющие (5, 9, 7).
Я все делю, как пишу выше, НО считает программа сумму у меня не правильно (прибавляет, например, из того же числа 597 его остаток от деления 7 и все )
Кто может, пожалуйста помогите.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.04.2013, 18:44     Работа с массивами, замена элементов массива
Посмотрите здесь:

Сразу три 1.анализ функции, 2.замена элементов массива, 3.максимальный элемент массива C++
C++ Работа с одномерными массивами (вычислить произведение отрицательных элементов массива.)
Работа с двумерными массивами (Определить произведение элементов в тех строках, которые не содержат нулевых элементов) C++
C++ Работа с массивами. Реализовать заполнение массива двумя вариантами
C++ Работа с массивами в С++ . Поиск общих элементов двух массивов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
07.04.2013, 18:58     Работа с массивами, замена элементов массива #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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <ctime>
#include <cstdlib>
 
int sumOfDigits(int n) {
  int result = 0;
  while (n > 0) {
    result += n % 10;
    n /= 10;
  }
  return result;
}
 
int getRandomNumber(int min, int max) {
  return min + rand() % (max - min);
}
 
int main(int argc, char *argv[]) {
  srand(time(0));
  
  int arraySize = 10 + rand() % 5;
  int min = 100;
  int max = 1000;
  
  int *array = new int[arraySize];
 
  for (int i = 0; i < arraySize; ++i) {
    std::cout << (array[i] = getRandomNumber(min, max)) << " ";
  }
  std::cout << std::endl;
 
  for (int i = 0; i < arraySize; ++i) {
    if (!(array[i] % 3)) {
      array[i] = sumOfDigits(array[i]);
    }
  }
 
  for (int i = 0; i < arraySize; ++i) {
    std::cout << array[i] << " ";
  }
  std::cout << std::endl;
 
  delete [] array;
  
  std::cin.get();
  return 0;
}
iiyuijkhgfjf
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 69
07.04.2013, 21:06  [ТС]     Работа с массивами, замена элементов массива #3
а можно, пожалуйста вариант на основе моего кода (или указать на ошибки мне т.к. я хочу научиться а не тупо скопипастить)
Заранее спасибо.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
08.04.2013, 08:06     Работа с массивами, замена элементов массива #4
Цитата Сообщение от iiyuijkhgfjf Посмотреть сообщение
а можно, пожалуйста вариант на основе моего кода
Это и был "вариант" на основе вашего кода. Причесанный, декомпозированный и без ввода с консоли.

Цитата Сообщение от iiyuijkhgfjf Посмотреть сообщение
или указать на ошибки мне т.к. я хочу научиться а не тупо скопипастить
Это прекрасно, я считаю.

Несколько советов:
1. Выделите из кода хотя бы функцию, считающую сумму цифр. Декомпозиция сильно облегчает понимание.
2. Перестаньте использовать однобуквенные переменные, кроме цикла for, в котором это уместно. Однобуквеные и другие бессмысленные переменные серьезно затрудняют чтение программы и, соответственно, поиск ошибок.
3. Избегайте вложенности операторов. Уровень вложенности операторов больше второго -- повод задуматься о создании функции.

Цитата Сообщение от iiyuijkhgfjf Посмотреть сообщение
z = z/10.0;
* * * * * * s++;
* * * * * * p+=k[i]%10;
Возможно, ваш код не работает, потому что вы сначала делите, а потом получаете последнюю цифру, но не уверен, что это единственное. Код плохо читаем из-за ничего не значащих переменных.
iiyuijkhgfjf
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 69
08.04.2013, 16:41  [ТС]     Работа с массивами, замена элементов массива #5
Вот, переделал немного (создал функцию подсчета суммы), НО:
1) те числа, которые по идее программа должна считать - не считает (выводит нуль)
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;
int Summa(int z)
{
    int resultat=0;
    while (z>0)
    {
        z /= 10;
        resultat += z % 10;
    }
}
 
int main()
{
    int a;
    int b;
    cout << "Wwedite a ";
    cin >> a;
    cout << "Wwedite b ";
    cin >> b;
    int k[10];
    const int n=10;
    for(int i=0; i<n; i++)
    {
          k[i]=rand()%(b-a)+a;
          cout << k[i] << endl;
    }
    for(int i=0; i<n; i++)
    {
        if ((k[i]%3)==0)
        {
           k[i]=Summa(k[i]);
        }
     //s=0;
 
    }
    for(int i=0; i<n; i++)
    {
        cout << "Summa=" << k[i] << endl;
    }
    return 0;
}
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
08.04.2013, 17:44     Работа с массивами, замена элементов массива #6
Цитата Сообщение от iiyuijkhgfjf Посмотреть сообщение
while (z>0)
* * {
* * * * z /= 10;
* * * * resultat += z % 10;
* * }
Вы сначала делите, потом добавляете последнюю цифру. Теряете же цифру.


Еще a, b, n и k назовите нормально и будет уже читаемый код.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2013, 21:20     Работа с массивами, замена элементов массива
Еще ссылки по теме:

C++ Работа с массивами в С++ . Поиск отличающихся элементов двух массивов
Работа с массивами в С++ . Поиск отличающихся элементов двух строковых массивов C++
Работа с одномерными массивами: удаление, добавление, перестановка элементов C++

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

Или воспользуйтесь поиском по форуму:
iiyuijkhgfjf
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 69
09.04.2013, 21:20  [ТС]     Работа с массивами, замена элементов массива #7
Вот код (с комментариями к переменным а и b)
Переменная к[i] - итый элемент массива.
Переменная n - кол-во элементов в массиве (размер его).
Ниже код (опять же я не совсем понимаю что мне нужно в нем поправить)
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
#include <iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;
int Summa(int z)
{
    int resultat=0;
    while (z>0)
    {
 
        resultat += z % 10;
        z /= 10;
    }
}
 
int main()
{
    int a; //нижняя граница элементов
    int b; //верхняя граница элементов
    cout << "Wwedite a ";
    cin >> a;
    cout << "Wwedite b ";
    cin >> b;
    int k[10];
    const int n=10;
    for(int i=0; i<n; i++)
    {
          k[i]=rand()%(b-a)+a;
          cout << k[i] << endl;
    }
    for(int i=0; i<n; i++)
    {
        if ((k[i]%3)==0)
        {
           k[i]=Summa(k[i]);
        }
     //s=0;
 
    }
    for(int i=0; i<n; i++)
    {
        cout << "Summa=" << k[i] << endl;
    }
    return 0;
}
Добавлено через 1 час 2 минуты
Пожалуйста, направьте страждущего на путь истинный...

Добавлено через 1 час 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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;
int Summa(int z)
{
    int resultat=0;
    while (z>0)
    {
 
        resultat += z % 10;
        z /= 10;
    }
    return resultat;
}
 
int main()
{
    int a; //нижняя граница элементов
    int b; //верхняя граница элементов
    cout << "Wwedite a ";
    cin >> a;
    cout << "Wwedite b ";
    cin >> b;
    int k[10];
    const int n=10;
    for(int i=0; i<n; i++)
    {
          k[i]=rand()%(b-a)+a;
          cout << k[i] << endl;
    }
    for(int i=0; i<n; i++)
    {
        if ((k[i]%3)==0)
        {
           k[i]=Summa(k[i]);
        }
     //s=0;
 
    }
    cout << "Rezultat:" << endl;
    for(int i=0; i<n; i++)
    {
        cout << k[i] << endl;
    }
    return 0;
}
Спасибо за помощь и (для меня это важно), что указали на ошибки.
Yandex
Объявления
09.04.2013, 21:20     Работа с массивами, замена элементов массива
Ответ Создать тему
Опции темы

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