Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/29: Рейтинг темы: голосов - 29, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 69

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

07.04.2013, 18:44. Показов 5818. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
День добрый Товарищи.
Взялся на днях за задачу, но в процессе реализации уперся в стену (что именно - укажу ниже).
Собственно текст задачи.

Дан одномерный целочисленный массив из 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 и все )
Кто может, пожалуйста помогите.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.04.2013, 18:44
Ответы с готовыми решениями:

Работа с одномерными массивами (вычислить произведение отрицательных элементов массива.)
В одномерном массиве, состоящем из n вещественных элементов, вычислить: 1. Произведение отрицательных элементов массива.

Работа с двумерными массивами (Определить произведение элементов в тех строках, которые не содержат нулевых элементов)
Дана целочисленная прямоугольная матрица. Определить: 1. Произведение элементов в тех строках, которые не содержат нулевых элементов

Операции над массивами. Определить максимальное значение среди нечетных элементов массива и минимальное среди четных элементов массива
Дан одномерный массив А размерностью 16. Определить максимальное значение среди нечетных элементов массива и минимальное среди четных...

6
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
07.04.2013, 18:58
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;
}
1
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 69
07.04.2013, 21:06  [ТС]
а можно, пожалуйста вариант на основе моего кода (или указать на ошибки мне т.к. я хочу научиться а не тупо скопипастить)
Заранее спасибо.
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
08.04.2013, 08:06
Цитата Сообщение от iiyuijkhgfjf Посмотреть сообщение
а можно, пожалуйста вариант на основе моего кода
Это и был "вариант" на основе вашего кода. Причесанный, декомпозированный и без ввода с консоли.

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

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

Цитата Сообщение от iiyuijkhgfjf Посмотреть сообщение
z = z/10.0;
* * * * * * s++;
* * * * * * p+=k[i]%10;
Возможно, ваш код не работает, потому что вы сначала делите, а потом получаете последнюю цифру, но не уверен, что это единственное. Код плохо читаем из-за ничего не значащих переменных.
0
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 69
08.04.2013, 16:41  [ТС]
Вот, переделал немного (создал функцию подсчета суммы), НО:
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;
}
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
08.04.2013, 17:44
Цитата Сообщение от iiyuijkhgfjf Посмотреть сообщение
while (z>0)
* * {
* * * * z /= 10;
* * * * resultat += z % 10;
* * }
Вы сначала делите, потом добавляете последнюю цифру. Теряете же цифру.


Еще a, b, n и k назовите нормально и будет уже читаемый код.
0
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 69
09.04.2013, 21:20  [ТС]
Вот код (с комментариями к переменным а и 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;
}
Спасибо за помощь и (для меня это важно), что указали на ошибки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.04.2013, 21:20
Помогаю со студенческими работами здесь

Работа с массивами. Распределение элементов
Доброго времени суток! Подскажите пожалуйста, можно ли в Matlab задать распределение значений в массиве ячеек в виде эллипса? Т.е., есть...

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

Работа с массивами. Поиск различных элементов.
Здравствуйте. Прошу помощи в поиске и написании алгоритма для такого задания: &quot;Задана символьная матрица размером NxM. Определить...

Работа с массивами однотипных элементов управления
Всем здравствуйте. В VB-6 всё решалось индексированием. Одно имя, разный индекс. В VB.NET предлагается использовать один обработчик...

Работа с массивами. Поиск элементов с заданными свойствами
Задан массив из пяти строк и шести столбцов 1)Сформировать массив из первых попавшихся положительных элементов каждой строки и их...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru