Задача: В одномерном целочисленном массиве (размер массива (не больше 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;
}
Вообще это делается в одну строку, просто массив надо просматривать с конца.
int sum = 0;
for (int i = len - 1; i >= 0 && arr[i] != 0; --i) sum += arr[i];
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); }
Насчёт упрощения программы - ещё рано.
#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;
}
#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;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Мне пришлось переписать связку QLabel-QPixmap на связку QGraphicsView-QGraphicsScene-QGraphicsPixmapItem-QPixmapИ вышло как-то совсем не очень
Необходимо значение double преобразовать в цвет, чтобы потом использовать в функции SetPixel(x,y,qRGB)Есть такой код преобразования, но по-моему он не работает
У меня есть односвязный списокВ нем надо перегрузить [] так, чтоб был доступ к элементу в заданной позиции