Загрузка...

Примеры программ. #1

Тема в разделе C/C++ создана пользователем kosolapka 26 ноя 2018. 360 просмотров

Загрузка...
  1. kosolapka
    kosolapka Автор темы 26 ноя 2018 Слишком ленивый, чтобы писать. 797 2 янв 2018
    Новый год все ближе и ближе, а с ним, как студентоте знакомо, приходит и сессия. Ну, а так, как каждый третий сейчас ощущает себя мега-хацкером и идет в ИТ, а там, преподают достаточно говняно (некоторые субъекты даже не стараются что-то понять и выучить) то я решил создать тему с решением одних из самых простых задач по программированию на С++ (те кто сдает на Си, замените 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;
    }

    }

    Если задача состоит в том, чтобы считать сумму и произвидение для: четных столбцов / линий, то наш 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++)
    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(i==j) //Выбираем только элементы с главной диагонали
    suma = suma + a[i][j]; //Высчитываем сумму всех элементов матрицы
    }
    Сумма/Производение элементов матрицы с побочной диагонали:
    Код

    for(i=0;i<linii;i++)
    {
    suma = suma + a[i][kolony-i-1]; //Высчитываем сумму только для побочной диагонали
    }

    На этом этапе закончу первую тему. Если зайдет пользователям, а также если мне не будет лень, запилю еще.
    P.S. Дорогие топ кодеры ЛЗТ, автор самоучка, пожалуйста, не бейте его, а если и бить, то желательно не сильно.
    Спасибо DSTR2 за исправление ошибки в коде.
     
    26 ноя 2018 Изменено
  2. SeroeDaBeloe
    поставил бы симпу если бы мог за старания,а где ты с++ учил?у меня вопросы есть
     
  3. kosolapka
    kosolapka Автор темы 26 ноя 2018 Слишком ленивый, чтобы писать. 797 2 янв 2018
    SeroeDaBeloe, училка одна была, она мне объяснила основы с++ а дальше свободное плаванье. Если еще что-то интересует приглашаю в ЛС, чтобы не засорять тему.
     
  4. Lisni
    Lisni 27 ноя 2018 Заблокирован(а) 1 14 янв 2018
    Помоему самой сложной ето начало кокда ничего не понимаеш
     
  5. DSTR2
    DSTR2 28 ноя 2018 ? 49 19 май 2017
    Будем бить, но не сильно. Молодец, что стараешься, работать есть над чем.

    Сумму всех элементов ты подсчитал правильно.

    А вот дальше — плохо.
    Никогда не писал статей(?), хочу попробовать.

    Итак, пусть нам необходимо найти сумму/произведение чётных столбцов матрицы.
    В примере автор ищет сумму всех этих элементов. Но дело в другом.
    Его код:
    Код


    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;
    }
    Для нечетных первый цикл начинаем не с 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]; //Высчитываем сумму всех элементов матрицы
    }

    Вы замечаете что-нибудь очень похожее в этом примере?
    К примеру, зачем тут два цикла, если мы знаем, что если проходить по главной диагонали матрицы, то строка всегда будет равнятся столбцу (что и сравнивает автор).
    Но зачем сравнивать? Можно же записать проще и эффективнее:
    Код

    //Сумма элементов на головной диагонали:
    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]; //Высчитываем сумму только для побочной диагонали
    }
    Тут почти всё правильно, но чтобы найти сумму необходимо записывать [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;
     
  6. kosolapka
    kosolapka Автор темы 28 ноя 2018 Слишком ленивый, чтобы писать. 797 2 янв 2018
    Спасибо за коммент. Пример с побочной диагональю проредактировал.
     
Top