Ctrl+X, Ctrl+V - 2 Эта задача — продолжение предыдущей задачи Ctrl+X, Ctrl+V. В качестве основы вы можете взять код оттуда.
Петя продолжает разработку своего текстового редактора. На этот раз добавилось еще одна операция:
зажать клавишу Shift (Shift). Операции Up и Down при зажатой клавише Shift выделяют строки в текстовом редакторе. Если курсор находится на строке n n, то после операций Shift, Down, Down выделенными окажутся строки n n и n + 1 n+1.
Операция Ctrl+X вырезает выделенные строки из файла в буфер. Операция Ctrl+V копирует строки из буфера, заменяя выделенные строки в файле.
Операции Ctrl+X и Ctrl+V сбрасывают выделение после исполнения и отпускают клавишу Shift. Если при исполнении этих операций в файле не выделена ни одна строка, поведение должно соответствовать предыдущей задаче Ctrl+X, Ctrl+V.
Формат ввода Программе на вход подаётся набор строк, разделённых переносом строки. Длина каждой строки не превышает 3000 символов. Последняя строка в файле является пустой. Она означает завершение ввода файла. Других пустых строк в файле быть не может.
После этого и до окончания ввода программе подаются команды Down, Up, Ctrl+X, Ctrl+V, Shift.
Формат вывода Выведите получившийся файл построчно. Вот мое решение,подскажите что тут не так пожалуйста
#include <iostream> #include <deque> #include <string> using namespace std; int main() { deque<string> str; string o; while (true) { getline(cin, o); str.push_back(o); if (o.empty()) { break; }
} size_t cursor = 0; string d; bool IsShift = false; size_t shift = 0; deque<string> shifted; while (getline(cin, o)) { if (o == "Down" && cursor < str.size() - 1) { if (IsShift) { shifted.push_back(str[cursor]); } cursor += 1; } else if (o == "Up" && cursor > 0) { if (IsShift) { shifted.push_back(str[cursor]); } cursor -= 1; } else if (o == "Ctrl+X") { if (IsShift) { IsShift = false; for (size_t j = shift; j != cursor; ++j) { str.erase(str.begin() + j); continue; } } if (!str[cursor].empty()) { d = str[cursor]; str.erase(str.begin() + cursor); } } else if (o == "Ctrl+V") { if (IsShift) { IsShift = false; for (size_t j = 0; j != shifted.size(); ++j) { str.insert(str.begin() + cursor, shifted[j]); cursor += 1; } continue; } if (!d.empty()) { str.insert(str.begin() + cursor, d); cursor += 1; } } else if (o == "Shift") { if (IsShift) { IsShift = false; } continue; IsShift = true; shift = cursor; } } for (auto& fg : str) { cout << fg << "\n"; } }
Эта задача — продолжение предыдущей задачи Ctrl+X, Ctrl+V. В качестве основы вы можете взять код оттуда.
Петя продолжает разработку своего текстового редактора. На этот раз добавилось еще одна операция:
зажать клавишу Shift (Shift).
Операции Up и Down при зажатой клавише Shift выделяют строки в текстовом редакторе. Если курсор находится на строке
n
n, то после операций Shift, Down, Down выделенными окажутся строки
n
n и
n
+
1
n+1.
Операция Ctrl+X вырезает выделенные строки из файла в буфер. Операция Ctrl+V копирует строки из буфера, заменяя выделенные строки в файле.
Операции Ctrl+X и Ctrl+V сбрасывают выделение после исполнения и отпускают клавишу Shift. Если при исполнении этих операций в файле не выделена ни одна строка, поведение должно соответствовать предыдущей задаче Ctrl+X, Ctrl+V.
Формат ввода
Программе на вход подаётся набор строк, разделённых переносом строки. Длина каждой строки не превышает 3000 символов. Последняя строка в файле является пустой. Она означает завершение ввода файла. Других пустых строк в файле быть не может.
После этого и до окончания ввода программе подаются команды Down, Up, Ctrl+X, Ctrl+V, Shift.
Формат вывода
Выведите получившийся файл построчно.
Вот мое решение,подскажите что тут не так пожалуйста
#include <deque>
#include <string>
using namespace std;
int main() {
deque<string> str;
string o;
while (true) {
getline(cin, o);
str.push_back(o);
if (o.empty()) {
break;
}
}
size_t cursor = 0;
string d;
bool IsShift = false;
size_t shift = 0;
deque<string> shifted;
while (getline(cin, o)) {
if (o == "Down" && cursor < str.size() - 1) {
if (IsShift) {
shifted.push_back(str[cursor]);
}
cursor += 1;
}
else if (o == "Up" && cursor > 0) {
if (IsShift) {
shifted.push_back(str[cursor]);
}
cursor -= 1;
}
else if (o == "Ctrl+X") {
if (IsShift) {
IsShift = false;
for (size_t j = shift; j != cursor; ++j) {
str.erase(str.begin() + j);
continue;
}
}
if (!str[cursor].empty()) {
d = str[cursor];
str.erase(str.begin() + cursor);
}
}
else if (o == "Ctrl+V") {
if (IsShift) {
IsShift = false;
for (size_t j = 0; j != shifted.size(); ++j) {
str.insert(str.begin() + cursor, shifted[j]);
cursor += 1;
}
continue;
}
if (!d.empty()) {
str.insert(str.begin() + cursor, d);
cursor += 1;
}
}
else if (o == "Shift") {
if (IsShift) {
IsShift = false;
}
continue;
IsShift = true;
shift = cursor;
}
}
for (auto& fg : str) {
cout << fg << "\n";
}
}