C++ Ввод массива с пробелами
Где 1 — первый элемент массива, 12 — второй и т.д. В моём коде массив вводится по элементам (после каждого числа нажимается энтер). Что необходимо изменить?
int input_mas(int mas_f[], int& a_f) < cout >(mas_f[i])) || (cin.peek() != '\n'))) < cin.clear(); while (cin.get() != '\n'); cout >
Заранее спасибо.
Отслеживать
задан 16 июн 2020 в 17:05
11 1 1 серебряный знак 2 2 бронзовых знака
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Понимаете, проблема в том, что если вы вводите строку целиком, то ее обработка начнется после нажатия Enter, и как-то глупо потом пояснять — измените пятое число, вы там ошиблись. 🙂 — придется просить переввести всю строку целиком.
Но если идти на это и весь массив вводится в одной строке — то можно примерно так:
void input_mas(int mas_f[], int a_f) < cout > mas_f[i]) < fail = true; break; >> if (fail) < cin.clear(); while (cin.get() != '\n'); cout else break; > >
Как реализовать ввод данных через пробел в C++?
Как считать значения через пробел в вектор в C++.
в первой строке даётся число равное количеству символов сколько будет считано, а во второй строке эти сами числа.
Пример ввода:
5
1 2 3 4 5
Как реализовать такой ввод на C++, чтобы эти числа попадали в вектор?
- Вопрос задан более трёх лет назад
- 8030 просмотров
Комментировать
Решения вопроса 2
Roman @myjcom Куратор тега C++
Ребят, я нашёл самое элегантное решение этой задачи
vector v(n); copy_n(istream_iterator(cin), n, v.begin()); copy_n(v.begin(), n, ostream_iterator(cout, " "));
generate_n(v.begin(), n, []> x; return x;>);
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
badproger12years @badproger12years Автор вопроса
Ребят, я нашёл элегантное решение этой задачи
#include #include using namespace std; int main() < int n; cin >> n; vector v(n); for (auto& it : v) cin >> it; for(auto& i:v) < cout>
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ответы на вопрос 1
System Integrator
Реализуйте свой split().
Берёте строку и в цикле от первого и последнего символа проверяете, является ли символ пробелом. Если нет — добавляете этот символ во временную строку. Если да, то добавляете эту строку в динамический массив строк, а временную строку очищаете. В конце возвращаете динамический массив. Fini.
Или вообще на Qt переходите.
Ответ написан более трёх лет назад
Комментировать
Нравится 2 Комментировать
Информатика. 10 класс (Повышенный уровень)
Для того чтобы работать с массивом, необходимо задать начальные значения элементов массива. Сделать это можно несколькими способами:
1) определение элементов массива как констант;
2) ввод элементов массива с клавиатуры;
3) использование случайных чисел для определения значений;
4) использование функций (собственных или стандартных) для определения значений;
5) ввод элементов массива из текстового файла.
Элементам массива можно задать значения при описании (примеры 11.11, 11.12). В этом случае количество элементов не задается, а определяется автоматически.
При вводе элементов массива с клавиатуры каждый элемент должен вводится отдельно. Если количество вводимых элементов определено, то можно воспользоваться циклом for (пример 11.13).
При описании вектора его размер может быть задан переменной. Важно, чтобы значение этой переменной было определено до описания вектора. Это значение может быть задано с помощью команды присваивания или введено с клавиатуры (пример 11.14).
При вводе строк нужно помнить, что пробел используется как разделитель. Если использовать для ввода команду cin , то элементами массива могут быть только отдельные слова строки ( пример 11.15). Если нужно, чтобы элементами массива были строки с пробелами, то для ввода необходима команда getline (пример 11.16).
Иногда бывает удобно задавать элементы массива случайным образом. Для этого используется функция rand(), которая генерирует случайное целое число из промежутка [0 ; 32768). Если элементы массива должны принадлежать отрезку [a ; b], то можно определить значение элемента массива как a[i]= rand() % (b – a + 1) + a ; (пример 11.17).
Вещественное случайное число в промежутке [0, 32.768) можно получить так: a[i]= 1. * rand() / 1000 ;
Выводить элементы массива можно в строку (пример 11.18) или в столбец (пример 11.19). Если элементы массива выводятся в строку, то между ними нужно выводить символ-разделитель (чаще всего используют пробел), иначе все числа будут распечатаны подряд как одно число с большим количеством цифр. Выводить элементы массива можно не только в прямом порядке, но и в обратном (пример 11.20).
Пример 11.21. Написать программу, которая сформирует массив из n четных чисел из отрезка [20, 70] случайным образом. Записать числа из массива в текстовый файл. Вывести на экран k -й элемент массива.
Этапы выполнения задания
I. Исходные данные: количество элементов n и массив a.
II Результат: искомый элемент.
III. Алгоритм решения задачи.
1. Ввод исходных данных.
2. Генерация массива.
2.1. Для того чтобы элементы массива были только четными, необходимо каждый полученный элемент умножать на 2.
2.2. Поскольку элементы умножаются на два, границы исходного отрезка нужно уменьшить в два раза.
2.3. Вывод массива по элементам.
3. Ввод значения k и вывод результата.
IV. Описание переменных:
n, k – int, a – vector .
Пример 11.22. Написать программу, которая прочитает из текстового файла список фамилий учащихся, запишет их в массив и выведет из списка фамилии с номерами от k1 до k2 .
Этапы выполнения задания
I. Исходные данные: массив s и количество учащихся n, номера фамилий – k1 и k2 .
II. Результат: список заданных фамилий.
III. Алгоритм решения задачи.
Ввод исходных данных.
2. Вывод результата.
IV. Описание переменных:
n, k1, k2 – int, a – vector .
Если для тестирования программы используются фамилии, написанные кириллицей, то важно сохранить текстовый файл в той же кодировке, которая устанавливается для консоли. По умолчанию для Блокнота может быть установлена кодировка UTF-8.
Пример 11.11. Описание числового массива, элементы которого являются константами.
vector < int > simple_numb = < 2 , 3 , 5 , 7 , 11 >; |
Пример 11.12. Описание массива, элементы которого являются строковыми константами.
vector < string > c_rgb = < " red» , » green » , «blue » >; |
Пример 11.13. Ввести элементы массива a с клавиатуры.
for ( int i = 0 ; i < 10 ; i ++)
Пример 11.14. Ввести заданное количество элементов массива a .
for ( int i = 0 ; i < n ; i ++)
Пример 11.15. Ввод массива строк (без пробелов):
for ( int i = 0 ; i < n ; i ++)
Пример 11.16. Ввод массива строк (с пробелами):
for ( int i = 0 ; i < n ; i ++)
getline ( cin , s [ i ]);
Пример 11.17. Случайным образом задать n элементов массива А. Каждый элемент — число из отрезка [-20; 20] .
for ( int i = 0 ; i < n ; i ++)
a [ i ] = rand () % 41 — 20 ;
Пример 11.18. Вывод элементов массива в строку (через пробел):
for ( int i = 0 ; i < n ; i ++)
Если элементы массива задаются случайным образом, то после генерации их нужно вывести. Это необходимо для проверки правильности работы, иначе непонятно, с какими данными работает программа.
Пример 11.19. Вывод элементов массива в столбец (по одному в строке):
for ( int i = 0 ; i < n ; i ++)
Пример 11.20. Вывод элементов массива в строку (в обратном порядке):
for ( int i = n — 1 ; i >= 0 ; i —)
Пример 11.21.
Как ввести элементы массива через пробел
Часто в задачах приходится хранить прямоугольные таблицы с данными. Такие таблицы называются матрицами или двумерными массивами. В языке программирования Питон таблицу можно представить в виде списка строк, каждый элемент которого является в свою очередь списком, например, чисел. Например, приведём программу, в которой создаётся числовая таблица из двух строк и трех столбцов, с которой производятся различные действия.
a = [[1, 2, 3], [4, 5, 6]] print(a[0]) print(a[1]) b = a[0] print(b) print(a[0][2]) a[0][1] = 7 print(a) print(b) b[2] = 9 print(a[0]) print(b)
Здесь первая строка списка a[0] является списком из чисел [1, 2, 3] . То есть a[0][0] == 1 , значение a[0][1] == 2 , a[0][2] == 3 , a[1][0] == 4 , a[1][1] == 5 , a[1][2] == 6 .
Для обработки и вывода списка, как правило, используют два вложенных цикла. Первый цикл перебирает номер строки, второй цикл бежит по элементам внутри строки. Например, вывести двумерный числовой список на экран построчно, разделяя числа пробелами внутри одной строки, можно так:
a = [[1, 2, 3, 4], [5, 6], [7, 8, 9]] for i in range(len(a)): for j in range(len(a[i])): print(a[i][j], end=' ') print()
Однажды мы уже пытались объяснить, что переменная цикла for в Питоне может перебирать не только диапазон, создаваемый с помощью функции range() , но и вообще перебирать любые элементы любой последовательности. Последовательностями в Питоне являются списки, строки, а также некоторые другие объекты, с которыми мы пока не встречались. Продемонстрируем, как выводить двумерный массив, используя это удобное свойство цикла for :
a = [[1, 2, 3, 4], [5, 6], [7, 8, 9]] for row in a: for elem in row: print(elem, end=' ') print()
Естественно, для вывода одной строки можно воспользоваться методом join() :
for row in a: print(' '.join([str(elem) for elem in row]))
Используем два вложенных цикла для подсчета суммы всех чисел в списке:
a = [[1, 2, 3, 4], [5, 6], [7, 8, 9]] s = 0 for i in range(len(a)): for j in range(len(a[i])): s += a[i][j] print(s)
Или то же самое с циклом не по индексу, а по значениям строк:
a = [[1, 2, 3, 4], [5, 6], [7, 8, 9]] s = 0 for row in a: for elem in row: s += elem print(s)
2. Создание вложенных списков
Пусть даны два числа: количество строк n и количество столбцов m . Необходимо создать список размером n × m , заполненный нулями.
Очевидное решение оказывается неверным:
a = [[0] * m] * n
В этом легко убедиться, если присвоить элементу a[0][0] значение 5 , а потом вывести значение другого элемента a[1][0] — оно тоже будет равно 5. Дело в том, что [0] * m возвращает ccылку на список из m нулей. Но последующее повторение этого элемента создает список из n элементов, которые являются ссылкой на один и тот же список (точно так же, как выполнение операции b = a для списков не создает новый список), поэтому все строки результирующего списка на самом деле являются одной и той же строкой.
В визуализаторе обратите внимание на номер id у списков. Если у двух списков id совпадает, то это на самом деле один и тот же список в памяти.
n = 3 m = 4 a = [[0] * m] * n a[0][0] = 5 print(a[1][0])
Таким образом, двумерный список нельзя создавать при помощи операции повторения одной строки. Что же делать?
Первый способ: сначала создадим список из n элементов (для начала просто из n нулей). Затем сделаем каждый элемент списка ссылкой на другой одномерный список из m элементов:
n = 3 m = 4 a = [0] * n for i in range(n): a[i] = [0] * m
Другой (но похожий) способ: создать пустой список, потом n раз добавить в него новый элемент, являющийся списком-строкой:
n = 3 m = 4 a = [] for i in range(n): a.append([0] * m)
Но еще проще воспользоваться генератором: создать список из n элементов, каждый из которых будет списком, состоящих из m нулей:
n = 3 m = 4 a = [[0] * m for i in range(n)]
В этом случае каждый элемент создается независимо от остальных (заново конструируется список [0] * m для заполнения очередного элемента списка), а не копируются ссылки на один и тот же список.
3. Ввод двумерного массива
Пусть программа получает на вход двумерный массив в виде n строк, каждая из которых содержит m чисел, разделенных пробелами. Как их считать? Например, так:
3 1 2 3 4 5 6 7 8 9
# в первой строке ввода идёт количество строк массива n = int(input()) a = [] for i in range(n): a.append([int(j) for j in input().split()])
Или, без использования сложных вложенных вызовов функций:
3 1 2 3 4 5 6 7 8 9
# в первой строке ввода идёт количество строк массива n = int(input()) a = [] for i in range(n): row = input().split() for i in range(len(row)): row[i] = int(row[i]) a.append(row)
Можно сделать то же самое и при помощи генератора:
3 1 2 3 4 5 6 7 8 9
# в первой строке ввода идёт количество строк массива n = int(input()) a = [[int(j) for j in input().split()] for i in range(n)]
4. Пример обработки двумерного массива
Пусть дан квадратный массив из n строк и n столбцов. Необходимо элементам, находящимся на главной диагонали, проходящей из левого верхнего угла в правый нижний (то есть тем элементам a[i][j] , для которых i==j ) присвоить значение 1 , элементам, находящимся выше главной диагонали – значение 0, элементам, находящимся ниже главной диагонали – значение 2. То есть необходимо получить такой массив (пример для n==4 ):
1 0 0 0 2 1 0 0 2 2 1 0 2 2 2 1
Рассмотрим несколько способов решения этой задачи. Элементы, которые лежат выше главной диагонали – это элементы a[i][j] , для которых ij . Таким образом, мы можем сравнивать значения i и j и по ним определять значение A[i][j] . Получаем следующий алгоритм:
n = 4 a = [[0] * n for i in range(n)] for i in range(n): for j in range(n): if i < j: a[i][j] = 0 elif i >j: a[i][j] = 2 else: a[i][j] = 1 for row in a: print(' '.join([str(elem) for elem in row]))
Данный алгоритм плох, поскольку выполняет одну или две инструкции if для обработки каждого элемента. Если мы усложним алгоритм, то мы сможем обойтись вообще без условных инструкций.
Сначала заполним главную диагональ, для чего нам понадобится один цикл:
for i in range(n): a[i][i] = 1
Затем заполним значением 0 все элементы выше главной диагонали, для чего нам понадобится в каждой из строк с номером i присвоить значение элементам a[i][j] для j = i+1 , . n-1 . Здесь нам понадобятся вложенные циклы:
for i in range(n): for j in range(i + 1, n): a[i][j] = 0
Аналогично присваиваем значение 2 элементам a[i][j] для j = 0 , . i-1 :
for i in range(n): for j in range(0, i): a[i][j] = 2
Можно также внешние циклы объединить в один и получить еще одно, более компактное решение:
n = 4 a = [[0] * n for i in range(n)] for i in range(n): for j in range(0, i): a[i][j] = 2 a[i][i] = 1 for j in range(i + 1, n): a[i][j] = 0 for row in a: print(' '.join([str(elem) for elem in row]))
А вот такое решение использует операцию повторения списков для построения очередной строки списка. i -я строка списка состоит из i чисел 2 , затем идет одно число 1 , затем идет n-i-1 число 0 :
n = 4 a = [0] * n for i in range(n): a[i] = [2] * i + [1] + [0] * (n - i - 1) for row in a: print(' '.join([str(elem) for elem in row]))
А можно заменить цикл на генератор:
n = 4 a = [0] * n a = [[2] * i + [1] + [0] * (n - i - 1) for i in range(n)] for row in a: print(' '.join([str(elem) for elem in row]))
5. Вложенные генераторы двумерных массивов
Для создания двумерных массивов можно использовать вложенные генераторы, разместив генератор списка, являющегося строкой, внутри генератора всех строк. Напомним, что сделать список из n строк и m столбцов можно при помощи генератора, создающего список из n элементов, каждый элемент которого является списком из m нулей:
[[0] * m for i in range(n)]
Но при этом внутренний список также можно создать при помощи, например, такого генератора: [0 for j in range(m)] . Вложив один генератор в другой, получим вложенные генераторы:
[[0 for j in range(m)] for i in range(n)]
Но если число 0 заменить на некоторое выражение, зависящее от i (номер строки) и j (номер столбца), то можно получить список, заполненный по некоторой формуле.
Например, пусть нужно задать следующий массив (для удобства добавлены дополнительные пробелы между элементами):
0 0 0 0 0 0 0 1 2 3 4 5 0 2 4 6 8 10 0 3 6 9 12 15 0 4 8 12 16 20
В этом массиве n = 5 строк, m = 6 столбцов, и элемент в строке i и столбце j вычисляется по формуле: a[i][j] = i * j .
Для создания такого массива можно использовать генератор:
[[i * j for j in range(m)] for i in range(n)]