Новый год все ближе и ближе, а с ним, как студентоте знакомо, приходит и сессия. Ну, а так, как каждый третий сейчас ощущает себя мега-хацкером и идет в ИТ, а там, преподают достаточно говняно (некоторые субъекты даже не стараются что-то понять и выучить) то я решил создать тему с решением одних из самых простых задач по программированию на С++ (те кто сдает на Си, замените cout на printf, а cin на scanf, есть еще пара нюансов но я думаю, что вы напряжете свои мозги и оптимизируете под свои нужды). Сумма/Произведение элементов матрицы: #include <iostream> using namespace std; int main() { int linii, kolony,i,j, suma=0, proizvedenie=1; int a[10][10]; cout << "Vvedite kolichestvo linii: " << endl; cin>>linii; //Вводим количество линий матрицы cout << "Vvedite kolichestvo stolbtev: " << endl; cin>>kolony; //Вводим количество столбцов матрицы for(i=0;i<linii;i++) for(j=0;j<kolony;j++) { cout<<"Vvedite element arr["<<i<<"]["<<j<<"]: "<<endl; cin>>a[i][j]; //Вводим элементы матрицы } for(i=0;i<linii;i++) for(j=0;j<kolony;j++) { suma = suma + a[i][j]; //Высчитываем сумму всех элементов матрицы } cout<<"Suma chisel = "<<suma; //Выводим на экран сумму элементов матрицы for(i=0;i<linii;i++) for(j=0;j<kolony;j++) { proizvedenie = proizvedenie*a[i][j]; //Высчитываем произвидение всех элементов матрицы } cout<<"\n Proizvedenie chisel = "<<proizvedenie; //Выводим на экран произвидение return 0; } } Код #include <iostream> using namespace std; int main() { int linii, kolony,i,j, suma=0, proizvedenie=1; int a[10][10]; cout << "Vvedite kolichestvo linii: " << endl; cin>>linii; //Вводим количество линий матрицы cout << "Vvedite kolichestvo stolbtev: " << endl; cin>>kolony; //Вводим количество столбцов матрицы for(i=0;i<linii;i++) for(j=0;j<kolony;j++) { cout<<"Vvedite element arr["<<i<<"]["<<j<<"]: "<<endl; cin>>a[i][j]; //Вводим элементы матрицы } for(i=0;i<linii;i++) for(j=0;j<kolony;j++) { suma = suma + a[i][j]; //Высчитываем сумму всех элементов матрицы } cout<<"Suma chisel = "<<suma; //Выводим на экран сумму элементов матрицы for(i=0;i<linii;i++) for(j=0;j<kolony;j++) { proizvedenie = proizvedenie*a[i][j]; //Высчитываем произвидение всех элементов матрицы } cout<<"\n Proizvedenie chisel = "<<proizvedenie; //Выводим на экран произвидение return 0; } } Если задача состоит в том, чтобы считать сумму и произвидение для: четных столбцов / линий, то наш for будет выглядеть именно так: Для линий: for(i=0;i<linii;i++) if(i%2==0) //ставим условие, чтобы только для четных линий, для нечетных используем != вместо == for(j=0;j<kolony;j++) { suma = suma + a[i][j]; //Высчитываем сумму всех элементов матрицы } Код for(i=0;i<linii;i++) if(i%2==0) //ставим условие, чтобы только для четных линий, для нечетных используем != вместо == for(j=0;j<kolony;j++) { suma = suma + a[i][j]; //Высчитываем сумму всех элементов матрицы } Для колонн: for(i=0;i<linii;i++) for(j=0;j<kolony;j++) { if(j%2==0)//ставим условие, чтобы только для четных столбцов, для нечетных используем != вместо == suma = suma + a[i][j]; //Высчитываем сумму всех элементов матрицы } Код for(i=0;i<linii;i++) for(j=0;j<kolony;j++) { if(j%2==0)//ставим условие, чтобы только для четных столбцов, для нечетных используем != вместо == suma = suma + a[i][j]; //Высчитываем сумму всех элементов матрицы } Сумма положительных/отрицательных элементов матрицы: for(i=0;i<linii;i++) for(j=0;j<kolony;j++) { if(a[i][j]>0) //ставим условие, чтобы высчитывалась сумма только для положительных элементов, для отрицательных заменяем >0 на < 0 suma = suma + a[i][j]; //Высчитываем сумму всех элементов матрицы } Код for(i=0;i<linii;i++) for(j=0;j<kolony;j++) { if(a[i][j]>0) //ставим условие, чтобы высчитывалась сумма только для положительных элементов, для отрицательных заменяем >0 на < 0 suma = suma + a[i][j]; //Высчитываем сумму всех элементов матрицы } Сумма/Производение элементов матрицы с главной диагонали: for(i=0;i<linii;i++) for(j=0;j<kolony;j++) { if(i==j) //Выбираем только элементы с главной диагонали suma = suma + a[i][j]; //Высчитываем сумму всех элементов матрицы } Код for(i=0;i<linii;i++) for(j=0;j<kolony;j++) { if(i==j) //Выбираем только элементы с главной диагонали suma = suma + a[i][j]; //Высчитываем сумму всех элементов матрицы } Сумма/Производение элементов матрицы с побочной диагонали: for(i=0;i<linii;i++) { suma = suma + a[i][kolony-i-1]; //Высчитываем сумму только для побочной диагонали } Код for(i=0;i<linii;i++) { suma = suma + a[i][kolony-i-1]; //Высчитываем сумму только для побочной диагонали } На этом этапе закончу первую тему. Если зайдет пользователям, а также если мне не будет лень, запилю еще. P.S. Дорогие топ кодеры ЛЗТ, автор самоучка, пожалуйста, не бейте его, а если и бить, то желательно не сильно. Спасибо DSTR2 за исправление ошибки в коде.
SeroeDaBeloe, училка одна была, она мне объяснила основы с++ а дальше свободное плаванье. Если еще что-то интересует приглашаю в ЛС, чтобы не засорять тему.
Будем бить, но не сильно. Молодец, что стараешься, работать есть над чем. Сумму всех элементов ты подсчитал правильно. А вот дальше — плохо. Никогда не писал статей(?), хочу попробовать. Итак, пусть нам необходимо найти сумму/произведение чётных столбцов матрицы. В примере автор ищет сумму всех этих элементов. Но дело в другом. Его код: for (i = 0; i<linii; i++) if (i % 2 == 0) //ставим условие, чтобы только для четных линий, для нечетных используем != вместо == for (j = 0; j<kolony; j++) { suma = suma + a[i][j]; //Высчитываем сумму всех элементов матрицы } Код for (i = 0; i<linii; i++) if (i % 2 == 0) //ставим условие, чтобы только для четных линий, для нечетных используем != вместо == for (j = 0; j<kolony; j++) { suma = suma + a[i][j]; //Высчитываем сумму всех элементов матрицы } Как следовало сделать правильно? Итак, автор на каждой итерации первого цикла каждый раз проверяет: а чётный ли индекс? Но ведь все детишки знают: каждый второй - чётный! Покажу чуть другой пример, от чего суть не изменится. for (std::size_t i = 0; i < size; i += 2) { //Понятно, что индексы идут ЛИНЕЙНО: от 0 до n. Тогда зачем каждый раз проверять на чётность int sum(0); //если мы знаем, что каждый второй всегда чётный? Будем к i всегда прибавлять двойку: 0 -> 2 -> 4 -> 6 ... -> n for (std::size_t j = 0; j < size; ++j) //Опускаемся вниз по строках. sum += vec[j][i]; std::cout << "Column " << i << ". Sum = " << sum << std::endl; } Код for (std::size_t i = 0; i < size; i += 2) { //Понятно, что индексы идут ЛИНЕЙНО: от 0 до n. Тогда зачем каждый раз проверять на чётность int sum(0); //если мы знаем, что каждый второй всегда чётный? Будем к i всегда прибавлять двойку: 0 -> 2 -> 4 -> 6 ... -> n for (std::size_t j = 0; j < size; ++j) //Опускаемся вниз по строках. sum += vec[j][i]; std::cout << "Column " << i << ". Sum = " << sum << std::endl; } Для нечетных первый цикл начинаем не с 0, а 1: 1 -> 3 -> 5 -> 7 ... -> n А теперь рассмотрим сумму главной диагонали матрицы. Пример автора: for (i = 0; i<linii; i++) for (j = 0; j<kolony; j++) { if (i == j) //Выбираем только элементы с главной диагонали suma = suma + a[i][j]; //Высчитываем сумму всех элементов матрицы } Код for (i = 0; i<linii; i++) for (j = 0; j<kolony; j++) { if (i == j) //Выбираем только элементы с главной диагонали suma = suma + a[i][j]; //Высчитываем сумму всех элементов матрицы } Вы замечаете что-нибудь очень похожее в этом примере? К примеру, зачем тут два цикла, если мы знаем, что если проходить по главной диагонали матрицы, то строка всегда будет равнятся столбцу (что и сравнивает автор). Но зачем сравнивать? Можно же записать проще и эффективнее: //Сумма элементов на головной диагонали: int sumMainDiagonal(0); for (std::size_t i = 0; i < size; ++i) sumMainDiagonal += vec[i][i]; //Исходя из правила, что в главной диагонали строка всегда равна столбцу. Ведь проще? std::cout << sumMainDiagonal; Код //Сумма элементов на головной диагонали: int sumMainDiagonal(0); for (std::size_t i = 0; i < size; ++i) sumMainDiagonal += vec[i][i]; //Исходя из правила, что в главной диагонали строка всегда равна столбцу. Ведь проще? std::cout << sumMainDiagonal; Сумма побочной диагонали: Код автора: for (i = 0; i<linii; i++) { suma = suma + a[i][kolony - j + 1]; //Высчитываем сумму только для побочной диагонали } Код for (i = 0; i<linii; i++) { suma = suma + a[i][kolony - j + 1]; //Высчитываем сумму только для побочной диагонали } Тут почти всё правильно, но чтобы найти сумму необходимо записывать [column - index - 1], а не плюс (+1): int sumSideDiagonal(0); for (std::size_t i = 0; i < size; ++i) sumSideDiagonal += vec[i][size - i - 1]; std::cout << std::endl << sumSideDiagonal; Код int sumSideDiagonal(0); for (std::size_t i = 0; i < size; ++i) sumSideDiagonal += vec[i][size - i - 1]; std::cout << std::endl << sumSideDiagonal;