Главная страница
Навигация по странице:

  • Задание для 1-й программы

  • Задание для 2-й программы

  • контрольная. Отчет по курсовой работе ответить на вопросы преподавателя, касающиеся особенностей разработанной программы. Варианты заданий


    Скачать 98.5 Kb.
    НазваниеОтчет по курсовой работе ответить на вопросы преподавателя, касающиеся особенностей разработанной программы. Варианты заданий
    Анкорконтрольная
    Дата09.12.2021
    Размер98.5 Kb.
    Формат файлаdoc
    Имя файлаK.doc
    ТипОтчет
    #297822

    Пермский национальный исследовательский политехнический университет

    Кафедра «Автоматика и телемеханика»

    РАЗРАБОТКА ПРОГРАММ

    НА ЯЗЫКАХ ПРОГРАММИРОВАНИЯ СИ И СИ++

    Методические указания к курсовой работе

    по дисциплине «Программирование и основы алгоритмизации»

    (заочная форма обучения)

    Пермь 2012

    Введение


    Цель курсовой работы: практическое применение знаний, умений и навыков, полученных в ходе изучения дисциплины, в частности, знаний базовых принципов разработки программ на языках программирования Си и Си++.

    Курсовая работа по дисциплине «Программирование и основы алгоритмизации» служит для проверки: навыков программирования на языке высокого уровня; умений составлять алгоритмы и реализовывать эти алгоритмы в составе программного обеспечения; знаний методов разработки алгоритмов и принципов программирования, включая принципы объектно-ориентированного программирования.

    Студент самостоятельно выполняет задание на курсовую работу согласно своему варианту. Затем должен быть оформлен отчет по курсовой работе согласно установленным правилам. Оценка за курсовую работу ставится по итогам защиты курсовой работы. В ходе защиты студент должен: продемонстрировать выполнение разработанной программы; предоставить правильно оформленный отчет по курсовой работе; ответить на вопросы преподавателя, касающиеся особенностей разработанной программы.

    Варианты заданий


    Необходимо разработать две программы. Первая из этих программ должна быть разработана на языке Си, вторая – на языке Си++ с использованием принципов объектно-ориентированного программирования. Ниже приводятся задания по разработке этих двух программ.
    Задание для 1-й программы

    Вариантом задания считается число, формируемое последней цифрой номера зачетной книжки. Поэтому вариант – это число в диапазоне от 0 до 9.

    Следует разработать программу, которая преобразует любой текстовый файл в другой текстовый файл по правилу, определяемому на основе своего варианта по табл. 1. Указанное правило применяется для каждой строки исходного текстового файла. В ходе выполнения программы пользователь может вводить имя исходного текстового файла, а также имя получаемого текстового файла.

    Для начала можно составить программу, которая по строкам копирует один текстовый файл в другой, а потом модифицировать данную программу на основе правила, полученного согласно своему варианту.

    Таблица 1.

    Правила преобразования текстового файла, соответствующие вариантам.

    Номер

    варианта

    Правило преобразования текстового файла (применяется для каждой строки исходного текстового файла)



    В каждой второй строке надо удалить третье слово, если такое есть, при этом количество пробелов в строке не должно измениться. Остальные строки не меняются.



    В каждой строке каждое слово заключается в круглые скобки, если данная строка начинается с цифры, при этом количество пробелов в строке не должно измениться.



    В каждой строке удаляются слова, которые состоят из одного или двух символов, при этом количество пробелов в строке не должно измениться.



    Если в строке четное количество слов, то удаляется каждое второе слово, при этом количество пробелов в строке не должно измениться.



    Если в строке есть хотя бы одно слово, первый и последний символ которого равны, то тогда поставить восклицательный знак в начало этой строки, сдвинув исходную строку на один символ вправо.



    В каждой строке каждое слово, состоящее более, чем из 8 символов, сократить до первых 8 символов этого слова, при этом количество пробелов в строке не должно измениться.



    В конец каждой строки через пробел добавляется число, которое равно количеству символов в самом длинном слове данной строки.



    Вместо каждой третьей строки оставить только наиболее длинное слово этой строки, если же таких слов несколько, то оставить только первое из них. Остальные строки не меняются.



    Если строка состоит из слов равной длины, то тогда поставить восклицательный знак в начало этой строки, сдвинув исходную строку на один символ вправо.



    В конец каждой строки через пробел добавляется число, которое равно количеству пробелов в самой длинной последовательности пробелов данной строки.


    Задание для 2-й программы

    Необходимо выполнить следующие этапы.
    1. Разработать программу, следуя указаниям 14-й лекции методического пособия (файл Cpp14.doc). Должна получиться программа графической заставки, в процессе выполнения которой по графическому окну случайным образом перемещаются точки и прямоугольники.
    2. Теперь к имеющимся точкам и прямоугольникам надо добавить окружности. Для этого добавьте объекты «Окружность» на основе принципа наследования по аналогии с тем, как это было сделано в случае объекта «Прямоугольник». При этом для объектов «Точка», объектов «Прямоугольник» и объектов «Окружность» надо использовать один и тот же массив obj. В итоге при выполнении графической заставки по окну должны перемещаться точки, прямоугольники и окружности.
    3. Реализовать перемещение графических объектов по прямым траекториям с разными случайными векторами скоростей.

    Для перемещения объекта по прямой траектории надо, чтобы для этого объекта сохранялся вектор скорости. Этот вектор скорости можно задавать двумя переменными vx и vy, которые соответственно определяют горизонтальную и вертикальную скорости. Каждый объект должен иметь свой вектор скорости, поэтому в описании объекта «Точка» надо добавить две переменные vx и vy типа int. При этом объекты «Прямоугольник» и «Окружность», а также другие объекты, порожденные от объекта «Точка», унаследуют эти переменные. Кроме того, надо выполнить начальную инициализацию этих переменных при создании экземпляра объекта. Для этого в конструкторе TPoint::TPoint надо присвоить этим переменным случайные значения, например, значения rand()%7-3. Тогда при появлении на экране графический объект будет иметь случайный вектор скорости. Для увеличения скорости перемещения можно использовать более широкий диапазон псевдослучайных чисел, например, rand()%11-5.

    Теперь следует выполнить перемещение каждого графического объекта согласно вектору скорости. Для этого в цикле перемещения всех объектов при вызове obj[i]->MoveXY необходимо при вычислении каждого аргумента к имеющейся координате объекта obj[i] прибавлять не случайное приращение, а значение соответствующего компонента вектора скорости, то есть vx или vy этого объекта. Для обращения к vx и vy объекта obj[i] надо соотвественно использовать obj[i]->vx и obj[i]->vy.

    Перед запуском программы, рекомендуется установить N=10. При выполнении программы объекты должны передвигаться по прямым траекториям. Но при этом объекты очень быстро перемещаются за пределы экрана. Чтобы этого не происходило надо поступить следующим образом. Пусть при выходе за правую границу экрана объект появляется в левой части экрана, при выходе за нижнюю границу экрана объект появляется в верхней части и наоборот. Один из возможных вариантов реализации состоит в том, что в функции TPoint::MoveXY вместо безусловных присвоений переменных (x=ix; y=iy;) надо разместить аналогичные присвоения с учетом необходимых условий, используемых для проверки возможного выхода объекта за пределы экрана. Например, если оказывается, что ix больше GrMaxX(), то тогда x надо присвоить значение ix-GrMaxX()-1 (предполагается, что vx<=GrMaxX()) и т.д. При этом должны быть учтены все границы экрана.

    Чтобы векторы скоростей иногда случайным образом менялись надо сразу после вызова obj[i]->MoveXY выполнять случайное изменение вектора скорости объекта obj[i] аналогично тому, как это делается в конструкторе TPoint::TPoint. Но важно, чтобы такое изменение происходило не каждый раз, а в некоторые случайные моменты времени. Для реализации этого достаточно, например, делать указанное изменение при условии, что значение rand()%100 равно 50.

    Проверьте выполнение программы при различных значениях N.

    В итоге при выполнении программы на экране по прямым траекториям с разными случайными векторами скоростей должны перемещаться графические объекты, при этом векторы скоростей иногда случайным образом должны меняться.
    4. Обеспечить возможность добавления очередного объекта и удаления последнего добавленного объекта в ходе выполнения программы.

    Сначала надо сделать количество объектов переменным. Для этого вместо константы N надо ввести переменную N типа int и задать ей начальное значение, равное прежнему значению константы. Кроме того, надо ввести константу M, определяющую максимальный размер массива указателей на объекты. Для этого перед main() надо добавить #define M 10000 (при этом значение константы при необходимости можно менять), а также вместо TPoint *obj[N] поместить TPoint *obj[M]. Проверьте выполнение программы. Внешне ничего не должно измениться.

    Теперь можно реализовать возможность динамического добавления и удаления объектов. Пусть очередной объект добавляется при нажатии Insert, а последний добавленный объект удаляется при нажатии Delete. Для этого после key=GrKeyRead() надо добавить следующий фрагмент.

    switch(key){

    case GrKey_Insert:

    if (N
    //! здесь надо добавить создание случайного объекта

    //! только вместо obj[i] надо использовать obj[N]

    N++; //количество объектов увеличивается

    }

    break;

    case GrKey_Delete:

    if (N>0){

    delete obj[N-1];

    N--; //количество объектов уменьшается

    }

    break;

    }

    При этом вместо двух строк комментариев, начинающихся на «//!», надо вставить уже имеющийся фрагмент программы, который обеспечивает создание случайного объекта. Только в этом фрагменте надо вместо obj[i] использовать obj[N]. Например, если N равно 10, то уже определены указатели с obj[0] по obj[9], тогда на вновь создаваемый объект должен указывать указатель obj[10], то есть obj[N].

    Проверьте правильность выполнения программы. В частности, с помощью Delete можно удалить все объекты, а потом с помощью Insert заново создать необходимое количество объектов.
    5. Выполнить реализацию перемещения графических объектов согласно варианту задания.

    Особенности перемещения графических объектов согласно i-му варианту задания определяются на основе запуска файла i.exe, который представляет собой пример реализации программы с заданным перемещением графических объектов. В случае каждого варианта необходимо подобрать соответствующие значения допустимых размеров объектов. Файлы с названиями вида i.exe прилагаются к данным методическим указаниям.

    После запуска файла с названием вида i.exe надо нажимать клавишу Insert для добавления новых графических объектов.

    Номер варианта определяется последней цифрой номера зачетной книжки:

    для цифры 0 или 5 выбирается вариант 0;

    для цифры 1 или 6 выбирается вариант 1;

    для цифры 2 или 7 выбирается вариант 2;

    для цифры 3 или 8 выбирается вариант 3;

    для цифры 4 или 9 выбирается вариант 4.
    Далее приводятся рекомендации по выполнению каждого варианта задания (при необходимости, более детальные рекомендации можно получить на консультациях с преподавателем).
    Вариант 0.

    Пусть «ведущий» объект будет окружностью с радиусом, равным 2, и с цветом с кодом 10, то есть ярко-зеленый. Указатель на этот объект может быть obj[0], тогда оставшиеся объекты (со 1-го по (N-1)-й) будут «ведомыми». Поэтому «ведущий» объект должен создаваться сначала, а потом создание остальных объектов можно делать в цикле от 1 до N-1. Также надо сделать так, чтобы «ведущий» объект нельзя было удалить, и чтобы значение N всегда было не меньше 1.

    Перемещение «ведущего» объекта остается без изменений, а перемещение «ведомых» объектов для начала можно сделать следующим образом. Перед вызовом obj[i]->MoveXY при i>0 надо изменять значения obj[i]->vx и obj[i]->vy так, чтобы вектор скорости был направлен к «ведущему» объекту. Например, obj[i]->vx можно установить равным 10-й части разности между координатой x «ведущего» объекта и координатой x объекта obj[i] (аналогично для obj[i]->vy). После этого «ведомые» объекты будут следовать за «ведущим», но не будет требуемой случайности и «распределенности».

    Для привнесения элемента случайности в перемещения «ведомых» объектов надо к значениям obj[i]->vx и obj[i]->vy прибавлять небольшие случайные значения, например, rand()%7-3.

    Для обеспечения «распределенности» надо, чтобы при вычислении obj[i]->vx и obj[i]->vy выполнялось деление не на фиксированное число (например, на 10), а на некоторое значение, свойственное объекту obj[i], то есть каждый «ведомый» объект будет приближаться на свое расстояние к «ведущему» объекту. Для этого в объект TPoint надо добавить дополнительную переменную, затем подобно переменным vx, vy эту переменную надо инициализировать в конструкторе, а также менять ее значение в случайные моменты времени. При этом значение указанной переменной рекомендуется выбирать случайным образом в диапазоне от 5 до 50.
    Вариант 1.

    Для реализации вращательного движения относительно центра экрана удобно использовать полярную систему координат. Для этого в объект TPoint надо добавить переменные a, s типа float, которые соответственно задают угол (в радианах) и расстояние от центра экрана. Пусть эти переменные в конструкторе устанавливаются в 0 (то есть все объекты появляются в центре экрана).

    Кроме того, переменные vx, vy надо заменить на переменные va, vs типа float, которые задаются приращения угла и расстояния соответственно. Значение va рекомендуется случайно выбирать в диапазоне от 0.01 до 0.1, а значение vs рекомендуется случайно выбирать в диапазоне от 0.1 до 1.

    Затем функцию obj[i]->MoveXY можно изменить так, чтобы у нее не было аргументов. Также содержимое этой функции надо изменить следующим образом. После вызова Hide надо изменить значения a, s на соответствующие приращения va, vs. После этого надо перейти от полярной системы координат к декартовой, то есть изменить значения целочисленных переменных x, y, а именно x:=floor(GrMaxX()/2+s*cos(a)); y:=floor(GrMaxY()/2-s*sin(a)); (это необходимо, так как отображение объектов выполняется на основе x, y). После этого осуществить вызов Show и закончить функцию obj[i]->MoveXY. Объекты будут совершать «вращательные» перемещения, но при этом они будут постепенно уходить за пределы экрана, а в окончательном варианте программы объекты должны перемещаться только в пределах экрана.

    Чтобы объекты оставались в пределах экрана надо после вызова Hide внутри функции obj[i]->MoveXY добавить изменение значений va, vs на противоположные в том случае, если на следующем шаге расстояние от центра экрана будет больше половины высоты экрана.

    Кроме того, надо добавить некоторую «распределенность» при перемещении объектов. Для этого при перемещении каждого объекта можно иногда изменять случайным образом значения va, vs.
    Вариант 2.

    Для обозначения состояния перемещающихся объектов надо добавить переменную State типа int. Если State=0, то объекты свободно перемещаются, иначе объекты начинают «собираться вместе». Первоначально до создания объектов надо установить State равным 0, и затем надо сделать так, чтобы значение State становилось равным 1 в случайный момент времени подобно тому, как в случайные моменты времени изменяются значения obj[i]->vx, obj[i]->vy. Например, для этого сразу после цикла перемещения всех объектов надо добавить присвоение переменной State значения 1, если rand()%100 равно 50.

    Теперь надо реализовать перемещение объектов к центру экрана при State!=0. Для этого перед вызовом obj[i]->MoveXY надо изменять значения obj[i]->vx и obj[i]->vy в случае State!=0 так, чтобы вектор скорости был направлен к центру экрана. Например, obj[i]->vx можно установить равным 10-й части разности между координатой x центра экрана и координатой x объекта obj[i] (аналогично для obj[i]->vy). После этого объекты в случайный момент времени будут направляться к центру экрана.

    Для того, чтобы объекты снова начали свободно перемещаться необходимо проверить, что уже все объекты собрались в центре экрана. Это можно сделать до цикла перемещения всех объектов на основе добавления цикла проверки положения всех объектов. Этот цикл проверки должен выполняться только если State!=0 (то есть тогда, когда объекты собираются к центру). Необходимо сделать так, чтобы State оставалось равным 1, если хотя бы один объект находится на расстоянии большем, чем 15, от центра хотя бы по одной из координат (есть хотя бы один объект, который еще не переместился к центру). Если же все объекты переместились к центру, то тогда State должно быть равным 0 после указанного цикла проверки, а также для каждого объекта должны быть заново установлены случайные значения vx и vy, что обеспечит начало свободного перемещения объектов.

    Теперь надо добавить элемент случайности в перемещение объектов к центру экрана. Для этого при вычислении значений vx, vy, обеспечивающих перемещение к центру, надо к значениям obj[i]->vx и obj[i]->vy прибавлять небольшие случайные значения, например, rand()%7-3. Если эти случайные значения делать достаточно большими, то тогда может оказаться, что условие нахождения всех объектов рядом с центром экрана никогда не выполняется. Эту проблему можно решить также увеличением соответствующего допустимого расстояния от центра.
    Вариант 3.

    Реализацию «прицела» можно сначала выполнить на основе дополнительного экземпляра объекта «Окружность». Для этого рядом с описанием массива obj надо добавить описание указателя на этот дополнительный экземпляр, например, TCircle *cursor, если TCircle – это класс объектов «Окружность». Затем перед начальным созданием графических объектов надо добавить создание «прицела» подобно тому, как создаются объекты «Окружность». При этом в качестве аргументов конструктора надо указать центр экрана, соответствующий цвет и размер. Для удаления «прицела» надо добавить delete cursor перед завершением функции main.

    Остается только отобразить «прицел», для этого следует добавить строку cursor->Show; после цикла перемещения графических объектов.

    Теперь надо реализовать перемещение «прицела» с помощью клавиатуры. Если расширить список выбора, относящийся к оператору switch с ключом выбора key, на основе добавления строки

    case GrKey_Up: cursor->MoveXY(cursor->x,cursor->y-10); break;

    где в качестве аргументов функции MoveXY используются значения cursor->x и cursor->y-10, то при нажатии клавиши «↑» будет происходит перемещение «прицела» вверх по экрану. Используя константы GrKey_Down, GrKey_Left, GrKey_Right, соответствующие кодам клавиш «↓», «←», «→», можно аналогичным способом обеспечить перемещение «прицела» в любом из четырех направлений по экрану.

    Для обработки нажатия клавиши F1 надо использовать этот же оператор выбора и константу GrKey_F1. Здесь надо отметить, что в примере используется клавиша «Пробел» для удаления объекта, а не F1, но это не является существенным, так как можно реализовать использование любой удобной клавиши.

    После нажатия клавиши F1 необходимо выполнить цикл перебора всех объектов с проверкой нахождения объекта внутри окружности «прицела». В данном случае рекомендуется использовать цикл вида while (i
    Остается только доработать отображение «прицела». Для этого можно выполнить порождение нового объекта «Прицел» от объекта «Окружность». При этом отличием объекта «Прицел» от объекта «Окружность» будет только функция Draw. После порождения объекта «Прицел» достаточно изменить тип указателя при вызове new, выполняемом для задания значения переменной cursor.
    Вариант 4.

    Необходимо для переменных x, y, vx, vy объекта TPoint задать тип float, что обеспечит возможность более плавного изменения их значений. Также рекомендуется аргументам функции MoveXY задать тип float. Затем необходимо будет добавить округление до целого каждой из этих переменных там, где это будет необходимым.

    Вектор скорости в основном будет изменяться детерминировано, поэтому надо убрать фрагмент, который реализует изменение вектора скорости в случайные моменты времени.

    Важно отметить, что при задании начальных случайных значений vx, vy в конструкторе TPoint::TPoint надо учитывать, что vx, vy – это переменные вещественного типа.

    Для имитации действия «силы тяготения» надо перед вызовом obj[i]->MoveXY выполнять изменение obj[i]->vy на некоторое фиксированное значение (например, на значение 0.1). При этом перемещение объектов до нижней границы экрана будет выполняться согласно варианту задания.

    Чтобы объекты «отскакивали» от нижней границы экрана надо перед вызовом obj[i]->MoveXY выполнять проверку координаты y объекта obj[i]. Если оказывается, что на следующем шаге этот объект может выйти за пределы нижней границы экрана и появиться в верхней части экрана, то тогда значение obj[i]->vy надо изменить на противоположное. После этого объекты будут «отскакивать» от нижней границы экрана. Для постепенной остановки вертикальных перемещений объекта необходимо при изменении значения obj[i]->vy на противоположное значение выполнять умножение на некоторый фиксированный коэффициент меньше 1 (например, на значение 0.5).

    Для проверки траекторий перемещения объектов можно в функции MoveXY временно исключить вызов функции Hide. Естественно, что в окончательном варианте должно обеспечиваться удаление предшествующих изображений объекта, то есть, скорее всего, в функции MoveXY должен быть реализован вызов функции Hide.

    Остается реализовать проверку остановки вертикальных перемещений объекта и обеспечить перемещение объекта в верхнюю часть экрана после остановки вертикальных перемещений. Например, если после перемещения координата y объекта больше координаты y нижней границы экрана, уменьшенной на единицу, и его переменная vy по абсолютному значению меньше 0.1, то можно считать, что вертикальные перемещения этого объекта закончились, и с помощью функции MoveXY этот объект можно переместить в верхнюю часть экрана, предварительно установив новые случайные значения для переменных vx, vy, аналогично тому, как это делается в конструкторе объекта TPoint.

    Требования к оформлению отчета по курсовой работе


    Отчет должен содержать:

    – титульный лист (пример оформления титульного листа выдается в отдельном файле);

    – цель работы;

    – задание для первой программы согласно своему варианту с указанием варианта (предваряется заголовком «Задание для 1-й программы»);

    – описание процесса разработки первой программы (предваряется заголовком «Разработка 1-й программы»), при этом данный раздел должен заканчиваться переходом к описанию разработанной программы, например, на основе фразы «В результате выполнения задания была разработана программа, описание которой включает в себя: исходный текст программы; схему основной части программы»;

    – заголовок «Описание 1-й разработанной программы»;

    – исходный текст 1-й программы (с комментариями);

    – схему программы (так называемую «блок-схему»), выполненную согласно ГОСТ 19.701-90;

    – задание для второй программы согласно своему варианту с указанием варианта (предваряется заголовком «Задание для 2-й программы»);

    – описание процесса разработки второй программы (предваряется заголовком «Разработка 2-й программы»), при этом данный раздел должен заканчиваться переходом к описанию разработанной программы, например, на основе фразы «В результате выполнения задания была разработана программа, описание которой включает в себя: исходный текст программы; схемы наиболее важных частей программы»;

    – заголовок «Описание 2-й разработанной программы»;

    – исходный текст 2-й программы (с комментариями);

    – иерархию объектов, созданных в программе, при этом иерархия объектов должна быть представлена в виде дерева с указанием типов объектов и связей, обозначающих отношения наследования;

    – схемы («блок-схемы») наиболее важных частей программы, выполненные согласно ГОСТ 19.701-90.

    Исходный текст программы, схемы («блок-схемы») должны предваряться соответствующими подзаголовками.

    При описании процесса разработки программы следует приводить примеры выполнения программы с оформлением копий экрана («скриншотов») в виде рисунков.

    Отчет выполняется на бумаге формата А4. Страницы отчета должны быть пронумерованы. Титульный лист имеет номер 1, но этот номер на нем не проставляется. Номер страницы должен располагаться сверху по центру страницы. Рисунки должны иметь подрисуночные надписи и нумерацию. Необходимо для всех полей установить размер 2,5 см, а также использовать одинарный интервал для набора любого текста. При этом для обычного текста надо применять шрифт Times New Roman (размер 12), а для текста программы и фрагментов текста программы надо применять шрифт Courier New (размер 12).


    написать администратору сайта