Содержание
ВНИМАНИЕ | Для получения программы своего варианта пишите на наш электронный адрес proglabs@mail.ru |
Общая постановка задания
Выполнить упражнения из раздела «Одномерные массивы«, оформив каждый пункт задания в виде шаблона функции. Все необходимые данные для функций должны передаваться им в качестве параметров. Использование глобальных переменных в функциях не допускается. Привести примеры программ, использующих эти шаблоны для типов int, float и double.
Образец выполнения (вариант №11)
Условие задачи
В одномерном массиве, состоящем из $n$ элементов, вычислить:
Сжать массив, удалив из него все элементы, величина которых находится в интервале $[a,\ b]$. Освободившиеся в конце массива элементы заполнить нулями. |
Реализация задачи на языке С++
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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 | #include <iostream> // для консольного ввода-вывода #include <iomanip> // для форматированного вывода #include <string> // для работы со строками // подключаем стандартное пространство имен using namespace std; // заполнение элементов массива вводом с клавиатуры template < class T > void Fill( T values[], const size_t N, const string data_type ) { cout << "Вам предстоит ввести с клавиатуры " << N << " элементов массива типа данных " << data_type << "." << endl; for ( size_t i = 0; i < N; i++ ) { cout << "\t- введите элемете №" << ( i + 1 ) << ": "; cin >> values[ i ]; } } // выводим элементы массива на экран (в строку) template < class T > void Print( const T const values[], const size_t N, const char* const message ) { cout << message; for ( size_t i = 0; i < N; i++ ) cout << setw( 10 ) << values[ i ]; cout << endl; } // получение номера минимального по модулю элемента template < class T > size_t Get_number_min_abs_element( const T values[], const size_t N ) { // изначально предполагаем, что 1ый элемент массива является минимальным по модулю size_t index_min_abs_element = 0; for ( size_t i = 1; i < N; i++ ) // если модуль текущего элемента меньше текущего минимального по модулю, то if ( abs( values[ i ] ) < abs( values[ index_min_abs_element ] ) ) // запоминаем индекс нового минимального по модулю элемента index_min_abs_element = i; // в качестве ответа возвращаем номер минимального по модулю элемента // порядковый номер больше индекса на 1 return ( index_min_abs_element + 1 ); } // получение индекса первого отрицательного элемента // необходимо учитывать случай, когда в массиве нет ни одного отрицательного элемента template < class T > int Get_index_first_minus_element( const T values[], const size_t N ) { // изначально предполагаем, что в массиве нет ни одного отрицательного элемента int index = -1; // перебираем последовательно все элементы массива for ( size_t i = 0; i < N; i++ ) // если встретился отрицательный элемент (это 1ый минусовой элемент), то if ( values[ i ] < 0 ) { // запоминаем его индекс и досрочно прерываем цикл index = i; break; } // возвращаем индекс 1ого отрицательного элемента // если в массиве нет ни одного отрицательного элемента, то вернется -1 return index; } // нахождение суммы модулей элементов массива, // расположенных после первого отрицательного элемента template < class T > T Get_sum_elements_after_first_minus( const size_t index_first_minus_element, const T values[], const size_t N ) { T sum = 0; for ( size_t i = index_first_minus_element + 1; i < N; i++ ) sum += abs( values[ i ] ); return sum; } // сжатие массива удалением всех элементов, величина которых находится на отрезке [a, b] // освободившиеся в конце массива элементы заполняются нулями template < class T > void Press_vector( T values[], const size_t N, const T a, const T b ) { // хранит количество элементов, попадающих на отрезок [a, b] size_t count_deleted_values = 0; // хранит количество обработанных элементов массива size_t count_visited_values = 0; for ( size_t i = 0; i < N; i++ ) { if ( count_visited_values == N ) break; // если текущий элемент массива подлежит удалению, то if ( ( values[ i ] >= a ) && ( values[ i ] <= b ) ) { // сдвигаем все элементы массива влево на 1 позицию до текущего элемента for ( size_t j = i; j < N - 1; j++ ) values[ j ] = values[ j + 1 ]; count_deleted_values++; i--; } count_visited_values++; } // после сжатия массива необходимо занулить хвостовые элементы for ( size_t i = 1; i <= count_deleted_values; i++ ) values[ N - i ] = 0; } // процессинговая функция template < class T > void Process( T values[], const size_t N, const string data_type ) { system( "CLS" ); // заполняем массив числами вводом с клавиатуры Fill( values, N, data_type ); // выводим содержимое исходного массива // также выводим справочную информацию (номер минимального по модулю элемента, номер 1ого отрицательного элемента) Print( values, N, "\nИсходный массив имеет вид: \n" ); cout << "Номер минимального по модулю элемента: " << Get_number_min_abs_element( values, N ) << endl; int index_first_minus_element = Get_index_first_minus_element( values, N ); if ( index_first_minus_element == -1 ) cout << "В исходном массиве нет ни одного отрицательного элемента! Расчет суммы модулей невозможен." << endl; else { cout << "Номер первого отрицательного элемента: " << index_first_minus_element + 1 << endl; cout << "Сумма модулей элементов, расположенных после 1-ого отрицательного: " << Get_sum_elements_after_first_minus( index_first_minus_element, values, N ) << endl; } T a, b; cout << endl << "Введите через пробел 2 числа, соответствующие границам отрезка [a, b] для сжатия массива: "; cin >> a >> b; Press_vector( values, N, a, b ); Print( values, N, "Массив после сжатия имеет вид: \n" ); cout << endl << endl; // задержка программы, чтобы у пользователя была возможность просмотреть результат system( "pause" ); } // главная функция программы (точка входа) int main( void ) { // русификация диалогов программы setlocale( LC_ALL, "Russian" ); // количество элементов массива const size_t N = 6; // объявляем одномерный статический массив типа данных int, состоящий из N элементов int int_values[ N ]; Process( int_values, N, "int" ); // объявляем одномерный статический массив типа данных float, состоящий из N элементов float float_values[ N ]; Process( float_values, N, "float" ); // объявляем одномерный статический массив типа данных double, состоящий из N элементов double double_values[ N ]; Process( double_values, N, "double" ); return EXIT_SUCCESS; } |
Результаты работы программы
ВНИМАНИЕ | Для получения программы своего варианта пишите на наш электронный адрес proglabs@mail.ru |
Добавить комментарий