Given an array of
N
size. The task is to rotate array byd
elements whered
is less than or equal toN
.Constraints: 1 ≤ T ≤ 200 1 ≤ N ≤ 200 1 ≤ A[i] ≤ 1000
Example input:
1 5 1 2 3 4 5 2
Output
3 4 5 1 2
Программа, которую я написал, кажется законной, но когда я попытался запустить ее, у меня возникла ошибка сегмента. Я даже запустил приведенный выше пример, я получаю правильный вывод. Источник: GeeksforGeeks: вращение и массив.
#include <bits/stdc++.h>
using namespace std;
int main() {
int test_case, numb, from, arr[200];
cin >> test_case;
while (test_case--) {
cin >> numb;
for (int i = 0; i < numb; i++) {
cin >> arr[i];
}
cin >> from;
for (int i = from; i < numb; i++) {
cout << arr[i] << " ";
}
for (int j = 0; j < from; j++) {
cout << arr[j] << " ";
}
cout << "\n";
}
return 0;
}
Какие изменения нужны моему коду? Что я могу сделать, чтобы избежать подобных ошибок в будущем?click_to_see_segment_fault
ошибка сегментации во время компиляции? и вы запустили программу и получили правильный вывод? Ваши утверждения противоречивы
Для каких всех входов вы получаете ошибку сегментации
@Inian Я отредактировал его во время выполнения. Счастлив? Решение?
Покажите нам точный ввод, который вы ввели, когда увидели ошибку Seg. Тот, что вы показали в вопросе, не кидает
@OmidCompSCI Но это не имеет значения, потому что моя программа работает от 0 до числа. Программа не обращается ни к одному индексу, где может быть мусорное значение.
Вы должны проверить все входные значения, как это описано в домашнем задании.
@Inian Сайт, на котором я тренируюсь, не дает мне списка ввода, но я дал ссылку, попробуйте запустить код, который выдаст ошибку сегмента.
Это дает ошибку seg только в том случае, если вы не предоставляете никаких входных данных компилятору. Таким образом, переменная test_case
все еще не инициализирована, и вы используете ее в операторе if, который вызывает неопределенное поведение.
@eras'q: Кажется, вам нужно передать ввод в текстовое поле с надписью «Ввод идет сюда». Когда я вставил туда ввод, он работал нормально. Выдает ошибку, когда ящик пуст
@С.М. Я не понимаю. Ввод значений в домашнее задание? не могли бы вы уточнить, что вы имеете в виду?
@Inian Но в предыдущей ссылке, где задан вопрос, я пытаюсь представить свое решение, и ничего не происходит.
@ 0x499602D2 Но в предыдущей ссылке, где задан вопрос, я пытаюсь отправить свое решение, но ничего не происходит.
Пока входные данные находятся в пределах указанных диапазонов, ваш код будет выводить массив так, как он будет вращаться. Однако, если вы не подтвердите свой пользовательский ввод, вы не узнаете. Многие из этих «сложных» вопросов намеренно включают данные, выходящие за пределы указанных диапазонов, чтобы проверить, правильно ли ваш код обрабатывает ошибку. Вы можете добавить проверку к каждому вводу во время, необходимое для чтения этого комментария. Кроме того, #include <iostream>
вместо #include <bits/stdc++.h>
. Оба будут работать, последний обескуражен.
@DavidC.Rankin Но в вопросе они не указали, что моя программа должна выводить, когда данные выходят за пределы заданного диапазона.
Достаточно справедливо - учитывая, что ответы показывают, что ваш код работает (и я могу подтвердить, что то, что у вас есть, будет работать для указанного ввода), совершенно неясно, где вы получаете свою ошибку. Вы можете скомпилировать свой код и запустить его с помощью printf "1\n5\n1 2 3 4 5\n2\n" | ./yourexe
и убедиться, что результат правильный. Вы остаетесь в границах для всех случаев, и если d == N
, ваш первый выходной цикл пропускается, а второй просто выводит массив без изменений (как и должно быть).
@DavidC.Rankin Можете ли вы проверить ответ джокера007. Он сказал, что сайт принимает мой код и отображает правильный ответ, но когда я нажимаю отправить, ничего не происходит.
Похоже, у вас отключен javascript в вашем браузере, что делает части страницы неактивными, или какая-то другая проблема, подобная этой. Дважды проверьте это с вашей стороны, потому что я не сомневаюсь, что в случае отправки результаты будут такими, как описывает @joker007.
Совет @eras'q: большинство людей здесь не знакомы с аспектами конкурентного программирования, такими как предположение о том, что ввод действителен, и секретные тестовые примеры.
@DavidC.Rankin Очистил кеш и включил javascript, но все еще не может отправить что-то еще, что можно сделать?
Ненавижу спрашивать, но вы используете Internet Explorer? Некоторые страницы просто не работают с ним. (MS медленно пытается убить его, даже в W10). Если вы используете FF или хром, я не знаю, что вам сказать. На данный момент это не проблема кода, это проблема браузера/сайта. Возможно, лучше перенести этот вопрос на сайт обмена стеками Суперпользователь.
@DavidC.Rankin Я использую хром. Я перенесу вопрос. Спасибо.
@DavidC.Rankin Оказалось, что была какая-то проблема с электронной почтой, которую я использовал, я до сих пор не знаю, в чем. Как только я вошел в систему из другого аккаунта Google, все заработало нормально.
Рад, что у тебя получилось. «Человеку свойственно ошибаться, но для того, чтобы по-настоящему все провернуть, нужен компьютер…»
#include <bits/stdc++.h>
using namespace std;
int main() {
int test_case, numb, from, arr[200];
cout<< "Enter the numbe of test cases"<<endl;
cin >> test_case;
if (test_case > 200)
{
cout<<"Number of test cases above limit";
return 0;
}
while (test_case--) {
cout<<"START TEST CASE"<<test_case<<endl;
cout<<"Enter the number of elements in the array"<<endl;
cin >> numb;
if (numb > 200)
{
cout<<"Array size more than expected skipping testcase"<<endl;
continue;
}
cout<<"Enter the elements of array"<<endl;
for (int i = 0; i < numb; i++) {
cin >> arr[i];
}
cout<<"Enter the number of rotations"<<endl;
cin >> from;
if (from > numb || from < 0)
{
cout <<"rotation index out of range skipping testcase"<<endl;
continue;
}
for (int i = from; i < numb; i++) {
cout << arr[i] << " ";
}
for (int j = 0; j < from; j++) {
cout << arr[j] << " ";
}
cout << "\n";
}
return 0;
}
Расширяя ответ @Charlie, Программа проверяет диапазоны numbs и from's range.
Только что отправил ваш точный код на Вращение массива | Гик для гиков (сайт, указанный в вопросе) . Он работает отлично, ошибок во время выполнения не возникало.
Вы смогли отправить решение (согласно ссылке на вопрос) или вы заставили его запуститься по второй ссылке (click_here_for_input)?
ссылку на вопрос, и я вставил ваш код в их IDE при отправке.
Я не понимаю. IDE должна проверять правильность кода или нет. Верно (вторая ссылка)? А там где дан вопрос (первая ссылка) там три кнопки Ожидаемый результат Компиляция и отправка теста когда нажимаю кнопку отправить ничего не происходит. И при нажатии на компиляцию и тестирование он застревает на оценке...
IDE находится как в 1-й, так и во 2-й ссылке. И да, как вы сказали, есть 3 кнопки, и при «отправке» отображается правильный ответ. И что значит ничего не происходит?
Когда я нажимаю кнопку отправки, ничего не происходит. Страница остается прежней, без особых изменений. Где отображается часть правильный ответ?
чуть ниже IDE.
@eras'q, вы можете проверить изображение, которое я только что добавил в ответ
На моей странице ничего не происходит. Есть ли что-нибудь, что Вы можете порекомендовать?
Попробуйте очистить кеш браузера и убедитесь, что не отключен java-скрипт.
Включенный Javascript и очистка кеша занимают вечность. Прошло 10мин.
Неужели оба до сих пор не в состоянии представить.
Ну, тогда это совершенно другая проблема, не связанная с тем, что было задано в вопросе, пожалуйста, создайте для этого другую тему. И, пожалуйста, проголосуйте за этот ответ, если вы нашли его полезным.
У меня недостаточно репутации, чтобы проголосовать за него, но я отметил его как правильный.
Оказалось, что была какая-то проблема с электронной почтой, которую я использовал, я до сих пор не знаю, что. Как только я вошел в систему из другого аккаунта Google, все заработало нормально.
@eras'q это действительно удивительно, я никогда не слышал ни о чем подобном. В любом случае, я рад, что вы решили это. Как вы поняли, что могут быть проблемы с электронной почтой?
Я не стал, я думал сделать все, что мог. Пробовал менять браузер не помогло. Единственным выходом было зайти под другим аккаунтом.
Запустите следующий ввод и увидите странные результаты. Проблема в том, что from
больше, чем количество самих элементов. В основном вам нужно сделать проверку, чтобы увидеть, больше ли само from
, чем количество элементов, или нет numb
.
#include <bits/stdc++.h>
using namespace std;
int main() {
int test_case, numb, from, arr[200];
cout<<"\nEnter number of test cases:";
cin >> test_case;
cout<<"Test cases = "<<test_case<<endl;
while (test_case--) {
cout<<"Enter count of elements:";
cin >> numb;
cout<<"Count= "<<numb<<endl;
cout<<"Enter the elements:";
for (int i = 0; i < numb; i++) {
cin >> arr[i];
}
cout<<"Entered elements are :";
for (int i = 0; i < numb; i++) {
cout << arr[i]<<" ";
}
cout<<"\nHow many times to rotated? :";
cin >> from;
cout<<"\nRotate it "<<from<<" times:\n";
for (int i = from; i < numb; i++) {
cout << arr[i] << " ";
}
for (int j = 0; j < from; j++) {
cout << arr[j] << " ";
}
cout << "\n";
}
return 0;
}
Давайте предоставим ввод следующим образом:
Enter number of test cases:1
Test cases = 1
Enter count of elements:1
Count= 1
Enter the elements:2
Entered elements are :2
How many times to rotated? :2
Rotate it 2 times:
2 32666
Вы видите ошибку? Место, где 32666, является проблемой здесь. В вашем случае тоже может произойти сбой.
Задача состоит в том, чтобы повернуть массив на d элементов, где d меньше или равно N. Так как в вашем случае 'd' не может быть больше 1 . Таким образом, в данной задаче такой ситуации не возникнет.
Конечно. Я лишь показываю, что к такой ситуации мог привести неверный ввод и во избежание сбоев нужно ставить чеки. В программе нет проверки, чтобы убедиться, что d is less than or equal to N
. Помимо этого, кажется, нет ничего плохого, что могло бы привести к аварии. Я уверен, что ОП, должно быть, ввел неправильный ввод, что привело к сбою.
Да, но в практических вопросах ввод не может выходить за заданные ограничения.
Как упомянула ОП, информация была предоставлена ею, а не самим веб-сайтом. Если бы веб-сайт предоставил ввод, был бы редкий шанс, что ввод ошибочен. Но поскольку OP сам ввел ввод, есть вероятность, что ввод был ошибочным, как я уже упоминал в своем ответе, потому что, кроме этого, нет другого способа привести к сбою.
Где ОП упомянул, что она внесла свой вклад?
В комментариях к вопросу
Вы должны убедиться, что numb меньше 200, потому что в arr всего 200 пробелов. Так что это одна из возможных проблем, где вы можете выделить ошибку. То же, что и 3-й цикл, убедитесь, что значение не > 200.