Как можно упростить данный код на с++?

160
30 апреля 2019, 23:40

Задача: В одномерном целочисленном массиве (размер массива (не больше 20) и значения его элементов вводить с клавиатуры) вычислить сумму элементов массива, расположенных после последнего элемента, равного нулю.

Сама задача была решена, но мне кажется ее можно написать горазде проще (не приходит в голову как).

int main()
{
int arr[20], len,nul, sum=0, b=0;
puts("input a array lenght");
scanf("%d", &len);
// filling the array with data
puts("input a array element");
for (int i = 0; i < len; i++)
    scanf("%d", &arr[i]);
for (int i = 0; i < len; i++)
    if (arr[i] != 0) {
        b++;
    } 
for (int i = len; i > 0; i--)
    if (arr[i] == 0) {
        nul = i;
        break;
    }
for (int i = nul; i < len; i++)
    sum += arr[i];

if (b == len)
    printf("not zero values");
else 
    printf("%d", sum);
return 0;
}
Answer 1

Вообще это делается в одну строку, просто массив надо просматривать с конца.

int sum = 0;
for (int i = len - 1; i >= 0 && arr[i] != 0; --i) sum += arr[i];
Answer 2
for (int i = len; i > 0; i--)
    if (arr[i] == 0) {
        nul = i;
        break;
    }

Здесь ошибка - выход за пределы массива. Можно исправить так:

for (int i = len; i > 0; ) {
    -- i ;
    if (arr[i] == 0) {
        nul = i;
        break; }    }

Ошибка вторая : не проверяются корректные данные размера len. Обязательно сделать примерно так :

scanf("%d", &len);
if(len<0 || len > 20) return 1;

Ошибка третья : переменная nul не иницилизирована никаким значением, там значение будет случайным. И при отсутствии нулей программа благополучно обрушится или будет результат неопределённый. Суммировать можно только после проверки, что нашли нуль какой-нибудь.

if (b == len)
    printf("not zero values");
else {
    for (int i = nul; i < len; i++)
        sum += arr[i];
    printf("%d", sum); }

Насчёт упрощения программы - ещё рано.

Answer 3
#include <iterator>
#include <algorithm>
#include <numeric>
#include <iostream>
int main()
{
  const int a[] = { 1, 2, 3, 4, 5, 0, 6, 7, 8, 9 };
  using RevIt = std::reverse_iterator<const int *>;
  RevIt rev_b(std::end(a)), rev_e(std::begin(a));
  RevIt rev_z = std::find(rev_b, rev_e, 0);
  if (rev_z != rev_e)
    std::cout << std::accumulate(rev_b, rev_z, 0) << std::endl;
  else
    std::cout << "No zeros" << std::endl;
}
Answer 4
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    vector<int> varr;// = { 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5 }; 
    for (int i = 0; i < 20; i++)
     { 
        int a;
        cin >> a;
        varr.push_back(a);
     }
    int result = 0;
    auto it = find_if(varr.rbegin(), varr.rend(), [&result](const int& a) -> bool {
        if (a == 0) return true;
        result += a;
        return false;
    });
    if (it == varr.rend())
        cout << "No zero values";
    else
        cout << result;
    return 0;
}
READ ALSO
Нужен полный аналог setScaledContents(true), как у QLabel, но только для QGraphicsView

Нужен полный аналог setScaledContents(true), как у QLabel, но только для QGraphicsView

Мне пришлось переписать связку QLabel-QPixmap на связку QGraphicsView-QGraphicsScene-QGraphicsPixmapItem-QPixmapИ вышло как-то совсем не очень

173
Преобразовать double в RGB(Qcolor)

Преобразовать double в RGB(Qcolor)

Необходимо значение double преобразовать в цвет, чтобы потом использовать в функции SetPixel(x,y,qRGB)Есть такой код преобразования, но по-моему он не работает

161
Перегрузка оператора [] C++

Перегрузка оператора [] C++

У меня есть односвязный списокВ нем надо перегрузить [] так, чтоб был доступ к элементу в заданной позиции

173