Задача:
Дано натуральное число [latex]n[/latex], действительные числа [latex]{a}_{1},…,{a}_{n}[/latex] . Получить числа[latex]{b}_{1},…,{b}_{n}[/latex], которые связаны с [latex]{a}_{1},…,{a}_{n}[/latex] следующим образом:
[latex]{ b }_{ 1 }={ a }_{ 1 },{ \quad b }_{ n }={ a }_{ n },\quad { b }_{ i }=\frac { { a }_{ i+1 }\quad -\quad { a }_{ i } }{ 3 } ,\quad i=2,…,n-1[/latex]
Тесты: (числа разделяются «|» для удобного чтения)
Ввод | Вывод | Комментарий: |
3 | 3 | 3 | 3 | 3 | 0 | 3 | Работает. |
4 | 3.14 | -2.71 | 42 | 10 | 3.14 | 14.9033 | -10.6667 | 10 | Работает. |
1 | 2 | 3 | 4 | 5 | 2 | Работает. |
5 | 4 | -3 | 2 | -1 | 0 | 4 | 1.66667 | -1 | 0.333333 | 0 | Работает. |
Объяснение переменных:
[latex]n[/latex] — это [latex]n[/latex] из условия. [latex]a1, a2[/latex] — динамические числа, которые меняются с каждым шагом цикла. [latex]a1[/latex] — вводится с клавиатуры. [latex]a2[/latex] — дублируется с [latex]a1[/latex] посредством шага цикла. Нужны для выполнения условия [latex]{ b }_{ i }=\frac { { a }_{ i+1 }\quad -\quad { a }_{ i } }{ 3 }[/latex]
Код: Проверить на ideone.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> using namespace std; int main(){ int n; double a1, a2 = 0; cin >> n; for(int i = 0; (cin >> a1)&&(i < n); i++, a2 = a1){ if( i == 0 ){ // выполняется ТОЛЬКО при первом наге цикла. cout << a1 << " "; // выведу первое число } else if( i >=2 ){ // выолнение основной задачи cout << ((a1 - a2) / 3.0) << " "; // выведу числа такие, какие требует условие задачи if( i == n - 1){ // выполнение условия bn=an cout << a1; } } } } |
Алгоритм выполнения объясняется в комментариях в коде
Особенности:
- Переменные:
- int n<code>;. <code>int<code> , ибо так требует негласное условие задачи.
- double a1, a2<code>;. <code>double<code> так как в задаче не обговаривалось на каком числовом поле её следует выполнять, то я предпочёл [latex]a1,a2 \in \Re [/latex] .
- Цикл
<code>for<code> (укажу особенности):
- (i++, a2 = a1)<code> - шаг цикла (модификация). Увеличение счётчика на единицу, присвоение [latex]a2[/latex] значение [latex]a1[/latex]
Сложность этой задачи сводится к понимаю a2 = a1<code>. Цикл выполнит шаг тогда, когда он выполнил задачу своего "тела". Так как на следущее выполнение "тела" [latex]a2[/latex] "не успеет" обновится, то [latex]a2[/latex] становится "предыдущим" элементом
Итог работы:
Код обрабатывает поток данных [latex]n[/latex] раз. Это значит, что лишние числа будут игнорироваться.
Семён, Вы такой замечательный программист. Я Ваш фанат
Спасибо, я польщён.
Вы как-то не так поняли задачу.
Во входном потоке находится число n за которым следуют n каких-то чисел. Никакого «роста» или другой закономерности в этих числах задача не предусматривает.
Переделал
Вы как-то не так поняли задачу.
Во входном потоке находится число n за которым следуют n каких-то чисел.
Как мне понимать «Каких-то чисел»? Я их ввожу (тогда код работает)?, или мне сделать ограничение на цикл (например, который из 8 цифр, работает только с 5, если 5 первое число? И не работает, если цифр меньше, чем первое число)? Или может все последующие цифры, после первого вводимого, будут задаваться рандомом?
В любом случае считаю, что нынешний код труднее исполнить, чем все предложенные мной варианты. Любое из предложенных решений это немного отредактированное нынешнее.
«Во входном потоке находится число n за которым следуют n каких-то чисел.» Игорь Евгеньевич указывает Вам, что во входном потоке вначале находится количество чисел последовательности, сами числа следуют потом.
Т.е., например, для первого теста вход такой:
5
1 3 3 3
или, например,
3
-5 6 6
а не просто 1 3 3 3 или -5 6 6, как у Вас. Так задано по условию задачи, конечно хорошо, что Вы умеете правильно считывать числа до конца входного файла, но в именно этой задаче этого не требуется. Исправьте этот технический момент.
Хуже, что Ваша программа работает неправильно и якобы проходит тесты. Как Вы получили строчку
1 2 3 4 5 1 -0.333333 -0.333333 -0.333333 5 Работает
по Вашей формуле Вы от следующего члена последовательности отнимаете какой-то текущий, т.е. для строго возрастающей последовательности положительных чисел в ответе будут только положительные значения.
Объясните, пожалуйста, зачем Вам нужен второй (вложенный) цикл, не могу понять. Я понимаю условия if(i == 0) и if(i >= 1) хоть Вы их и описали в отчете очень кратко (ну это ладно) — формула первого и последующих элементов отличаются. Можно ли обойтись без этих условий? Наверное, можно, обработав первый элемент последовательности до цикла. Но и Ваш вариант имеет право на жизнь. Но необходимость вложенного цикла я не понимаю, значит вряд ли кто-то еще поймет — нужно либо исключить его либо описать в отчете зачем он нужен, раз это не очевидно.
Кроме того я не понял зачем Вы поставили большой промежуток (\quad) в формуле для b_i. Такой большой промежуток выглядит нелепо.
Всё учтено и всё решено.
— «первая цифра должна обозначать количество цифр» — поищите что такое цифра и справьте тест
— Попытался перечислить замечания по дальнейшему тексту отчёта. Их слишком много. Просто почитайте текст, там часто встречаются несогласованные словосочетания. Нужно поправить.
-Про какие вложенные циклы Вы пишите в тексте программы.
— Поставьте правильные отступы в программе
— Пожалуйста, продумайте программу. Сейчас там какая-то каша. вместо простого алгоритма.
— Имена переменных следует выбирать по их назначению. Например firstNumb показывает, что её значение было первым числом в списке данных. Это неудачное имя. Назначение переменной — хранить количество чисел последовательности. В условии это n. Чем было плохое имя? Остальные имена не лучше.
Семён. Сейчас это решение может быть зачтено примерно на 2-3 балла по нашей шкале. Может хватит дурачиться?
Полностью переделал учитывая все замечания
Видимо это какой-то тест на терпение? Уверен, что его пройду 🙂
— Исправьте 3-й тест. Там в ответе должно быть 5 чисел, а не одно.
— Исправьте все тесты. Первым числом всегда вводится количество чисел.
— Если во входном потоке записано такое:
4
1 4 10 19
то в выходной поток программа должна записать
1 2 3 19
Но ведь Александр Сергеевич написал:
«Т.е., например, для первого теста вход такой:
5
1 3 3 3».
Т.к. я неправильно понял условие, то после этого в мою голову окончательно было вбито, что первое число должно входить в ответ. Извините.
Почему третий тест должен выдавать 5 чисел в ответе, если первое число 1? Должно выводится 1 число. Разве нет?
Исправил код и подправил отчёт, теперь всё как надо, надеюсь.
— Возможно Александр Сергеевич просто допустил опечатку. Строчкой ниже у него есть ещё один пример и там всё хорошо.
— Количество чисел Вы в тестах не выделяли в отдельную строку. В программе количество членов последовательности вообще не читалось.
— Оказывается 1 | 2 | 3 | 4 | 5 это последовательность из одного числа 2, а остальные не должны читаться? Тогда желательно написать об этом тесте пару слов в отчёте, чтобы объяснить, что Вы проверяете избыточные данные во входном потоке.
— Очень не желательно сочетать в одной программе cin и scanf. Это функции из разных библиотек и в некоторых случаях могут быть не синхронизированы. Используйте какой-либо один подход.
— В условии указаны формулы для первого числа, последнего числа и чисел между ними (с номерами 2, … n-1). Значит всего должно быть n не менее 3. При таком понимании программа могла бы выглядеть так (в Вашей стилистике):
Зачтено, но исправьте, пожалуйста, замечания выделенные жирным шрифтом.
Да, прошу прощения за свою опечатку! Недоглядел! Она сбила Семена с толку, к сожалению.
По программе и отчету полностью согласен с замечаниями Игоря Евгеньевича! Еще небольшое замечание: программный код не нужно набирать как latex-формулы, можно использовать тег code в угловых скобках (в режиме редактирования разметки) или Форматы->Строки->Код (то же самое, но в визуальном редакторе). Еще лучше использовать Crayon — но для маленьких кусков вполне уместен тег code . Когда мы пишем некоторую величину в отчете, то она выходит как математическая формула — но C++ код в математические формулах смотрится нелепо.
Семен, у Вас очень оригинальный стиль программирования и стиль написания отчета — но не всегда это уместно. Возьмем фрагмент:
«a1, a2 – динамические числа, которые меняются с каждым шагом цикла. a1 – вводится с клавиатуры. a2 – дублируется с a1 посредством шага цикла. Нужны для выполнения условия { b }_{ i }=\frac { { a }_{ i+1 }\quad -\quad { a }_{ i } }{ 3 }»
динамические числа … дублируется с a1 … Нужны для выполнения условия … так не говорят. можно, например, так (минимальные изменения): «a1, a2 – переменные, которые меняются с каждым шагом цикла. a1 – текущий элемент последовательности, вводится с клавиатуры. a2 – предыдущий элемент последовательности, в него дублируется элемент a1 посредством итератора/шага цикла. Нужны для вычисления элементов { b }_{ i }=\frac { { a }_{ i+1 }\quad -\quad { a }_{ i } }{ 3 }» посмотрите — здесь дополнительно указано, что такое a1, a2, заменено неуместное «дублируется с» , третье выражение в цикле называется итератором цикла (см. и см.), в некоторых других источниках называется шагом цикла, а в некоторых одним словом не называется вообще.
Старайтесь писать проще и четче.
Спасибо за замечания, обязательно исправлю.