Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информю М.УК.КурРаб.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
233.47 Кб
Скачать

Министерство науки и образования РФ

МГТУ МИРЭА

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

по предмету:

“Информатика и программирование ”

.

Москва

2012

Составитель доцент Л.З.

Редактор доцент А.В. Панов

Методические указания служат дополнением к лекционному материалу. Работа содержит материл по теме: «Разработка элементов информационно поисковых систем». Содержание ориентировано на техническую базу кафедры Интеллектуальных Технологий и Систем, а также на оснащении кафедры современным программным обеспечением.

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

Печатается по решению издательского совета университета.

Рецензенты: И.И. Холкин,

А.В.Панов.

МГТУ МИРЭА

Методические указания напечатаны в авторской редакции.

Подписано в печать……

Государственное образовательное учреждение высшего профессионального образования МГТУ МИРЭА

119454, Москва пр. Вернадского, 78.

Введение

Одной из актуальных задач высшей школы является

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

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

Курсовая работа позволяет закрепить те практические навыки, которые получили студенты при выполнении лабораторных работ по дисциплине «Информатика и Программирование»,а также такая дисциплина как «Алгоритмы и структур данных». Выполнение курсовой работы позволит студентам закрепить теоретические знания по программированию базовых структур алгоритмов. Выполнение курсовой работы сопровождается созданием расчётной пояснительной записки.

1. Расчётно-пояснительная записка

1.1Содержание расчётно-пояснительной записки

Расчётная пояснительная записка по курсовой работе должна включать:

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

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

Теоретическая часть курсовой работы должна сдержать разработку алгоритма поставленной задачи , полное графическое изображение (схема алгоритма) . Схема алгоритма должна соответствовать ГОСТ.

Листинг (текст программы ) должен соответствовать представленной схеме алгоритма и хорошо структурирован.

1.2 ТРЕБВАНИ К ЛИСТИНГУ ПРОПРАММЫ.

Кодирование и документирование программы

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

Если какое-либо действие можно

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

Писать программу нужно с написания обобщённых схем.

Затем записать её на естественном языке (псевдокоде), что именно и как она должна делать.

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

Описание алгоритма полезно по нескольким причинам:

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

Если алгоритм можно разбить на последовательность законченных действий ( а к этому нужно стремиться!), то каждое законченное действие оформляется в виде функции. Каждая функция должна решать только одну задачу (не надо объединять два коротких независимых фрагмента в одну функцию). Размер функции должен изменяться в широких пределах всё зависит от того, какой размер имеет законченный фрагмент кода, выделяемый в функцию. Желательно , чтобы тело функции помещалось на один два экрана: одинаково сложно разбираться в программе, содержащей несколько необъятных функций

или россыпи функций по несколько строк каждая.

Если некоторые действия в программе встречаются, хотя бы дважды,

их также нужно оформить в виде функции. Однотипные действия оформляются в виде перегруженных функций или функций с параметрами. Короткие функции имеет смысл объявить в директиве

inline .

Необходимо тщательно выбирать имена переменных. Правильно

выбранные имена могут сделать программу в некоторой степени самодокументированной .Неудачные имена, наоборот служат источником проблем . Нельзя увлекаться сокращениями , они ухудшают читаемость программы и часто можно забыть как было сокращено то или иное слово . Общая тенденция состоит в том , что чем больше область видимости у переменной, тем более длинное у неё имя .

Перед таким именем часто ставится префикс типа (одна или несколько букв , по которым можно определить тип переменой) . Для счётчиков

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

типа I,j,k . Имена макросов предпочтительнее записывать заглавными буквами, чтобы отличить их от других объектов программы . Не рекомендуется использовать имена, начинающиеся с символа подчёркивания , имена типов оканчивающихся на _t, а также а так же идентификаторы совпадающие с именами ресурсов стандартной библиотеки С ++.

Переменные желательно инициализировать при их объявлении, а

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

1.3 ЛОКАЛЬНЫЕ ПЕРРЕМЕННЫЕ ПРЕДПОЧТИТЕЛЬНЕЕ

ГЛОБАЬНЫХ

Если глобальная переменная всё же необходима, лучше объявить её статической , что ограничит область её действия всего одним исходным файлом.

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

Изменение, которых трудно отследить.

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

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

в случае передачи сложных объектов. Исключения составляют параметры , размер которых меньше размера указателя. их эффективнее

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

что внутри неё параметр изменяется.

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

чисел в явном виде. Константы должны иметь осмысленные

имена, заданные через const или перечисления.

Для записи каждого фрагмента программы необходимо использовать наиболее подходящие средства языка. Любой цикл, в принципе можно организовать с помощью операторов go to и if, но это было бы нелепо.

2. Тематика курсовой работы.

2.1 Работа с базой данных.

Файлы представляют собой области памяти на внешнем носителе (как правило магнитном диске), предназначенные для:

  • хранения данных, превосходящих по объему память компьютера (меньше, разумеется, тоже можно);

  • долговременного хранения информации (она сохраняется при выключении машины).

Файлы отличаются от обычных массивов тем, что

  • они могут изменять свой размер;

  • обращение к элементам этих массивов производится не при помощи операции индексации[],а при помощи специальных системных вызовов и функций;

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

Библиотека ввода-вывода C++ включает средства для работы с последовательными файлами. Последовательный файл отличается от файлов с другой организацией тем, что чтение из файла и запись в файл ведуться байт за байтом от начала к концу файла.

Потоки для работы с файлами создаются как объекты классов

ofstream - поток вывода (записи) в файл

ifstream - поток ввода (чтения) данных из файла

fstream - поток ввода-вывода данных

Для использования данных классов необходимо включить заголовочный файл fstream.h.

Флаги открытия файла:

enum ios::open_mode{

in = 0x01; - открыть только для чтения

out = 0x02; - открыть только для записи

ate = 0x04;

app = 0x08; - дописывать данные в конец файла

}

2.2 Пример задания на курсовую работу.

Необходимо создать программу, которая обеспечивает первичный ввод информации в базу данных

для работы с собственной базой данных, в которой следует предусмотреть создание меню со следующими пунктами:

- newFile (создание нового файла);

- viewFile (просмотр файла);

- addFile (добавление новой записи);

Решение задачи следует начать с выявления понятий классов и их взаимосвязей .

Для получения места в общежитии формируется список студентов, который включает:

  1. ФИО студента;

  2. Номер группы;

  3. Средний бал;

  4. Доход на одного члена семьи.

struct Student

{

int num;

char f[20]; Текст программы

#include <iostream.h>

#include <iomanip.h>

#include <fstream.h>

#include <stdlib.h>

#include <stdio.h>

char gruppa[6];

float ball;

float dohod;

};

int enterChoice();

void newRecord(fstream&);

void x();

void poisk();

void vuvod(ostream&, Student);

void vuvod(ostream &output, Student c);

void textFile(fstream&);

void updateRecord(fstream&);

void deleteRecord(fstream&);

void outputLine(ostream&, Student);

void main()

{

fstream base("c:\\base.dat", ios::in | ios::out);

if(!base)

{

cout<<"File error"<<endl;

exit(1);

}

int choice;

while((choice=enterChoice())!=8)

{

switch (choice)

{

case 1:

newRecord(base);

break;

case 2:

x();

break;

case 3:

textFile(base);

break;

case 4:

updateRecord(base);

break;

case 5:

deleteRecord(base);

break;

case 6:

poisk();

break;

case 7:

exit(1);

break;

default:

cout<<"Error"<<endl;

break;

}

base.clear();

}

}

int enterChoice()

{

cout<<endl<<"Vash vibor:"<<endl

<<"1 - Vvod dannuh"<<endl

<<"2 - Vuvod vseh dannuh"<<endl

<<"3 - Sozdanie tekstovogo faila s imenem print.txt"<<endl

<<"4 - Izmenenie imeyshihsa dannuh"<<endl

<<"5 - Ydalenie dannuh"<<endl

<<"6 - Poisk studenta"<<endl

<<"7 - Konec rabotu"<<endl;

int menuChoice;

cin>>menuChoice;

return menuChoice;

}

void newRecord(fstream &insertInFile)

{

ofstream base("c:\\base.dat", ios::ate);

if(!base)

{

cout<<"File error"<<endl;

exit(1);

}

cout <<"Vvedite nomer studenta. Dla ostanovki vvoda, najmite 0."<<endl;

Student student;

cin>>student.num;

while(student.num>0 && student.num<=200)

{

cout <<"Vvedite Familiy, gryppy, srednii bal, dohod na odnogo chlena sem'i studenta"<<endl;

cin>>student.f>>student.gruppa>>student.ball>>student.dohod;

base.seekp((student.num-1)*sizeof(student));

base.write((char*)&student, sizeof(student));

cout<<"Vvedite nomer studenta. Dla ostanovki vvoda, najmite 0."<<endl;

cin>>student.num;

}

}

void outputLine(ostream&, Student);

void x()

{

ifstream base("c:\\base.dat", ios::in);

if(!base)

{

cout<<"File error"<<endl;

exit(1);

}

cout<<setiosflags(ios::left)<<setw(6)<<"Nomer"<<setw(21)<<"Familiya"<<setw(7)<<"Gryppa"<<setw(4)<<"Srednii ball"<<setiosflags(ios::right)<<setw(8)<<"Dohod na odnogo cheloveka"<<endl;

Student student;

base.read((char*)&student, sizeof(student));

while(!base.eof())

{

if (student.num!=0)

outputLine(cout, student);

base.read((char*)&student, sizeof(Student));

}

}

void outputLine(ostream &output, Student c)

{

output<<setiosflags(ios::left)<<setw(6)<<c.num<<setw(21)<<c.f<<setw(7)<<c.gruppa<<setw(4)<<c.ball<<setw(10)<<setprecision(5)<<setiosflags(ios::showpoint | ios::right)<<c.dohod<<endl;

}

void textFile(fstream &readFromFile)

{

ofstream PrintFile("c:\\print.txt", ios::out);

if(!PrintFile)

{

cout<<"File error"<<endl;

exit (1);

}

PrintFile<<setiosflags(ios::left)<<setw(8)<<"Nomer"<<setw(15)<<"Familiya"<<setw(10)<<"Gryppa"<<setw(15)<<"Srednii ball"<<setiosflags(ios::right)<<setw(8)<<"Dohod na odnogo cheloveka"<<endl;

readFromFile.seekg(0);

Student student;

readFromFile.read((char*)&student, sizeof(student));

while(!readFromFile.eof())

{

if (student.num !=0)

outputLine(PrintFile, student);

readFromFile.read((char*) &student, sizeof (student) );

}

}

void updateRecord(fstream &updateFile)

{

int zapis;

do

{

cout<<"Vvedite nomer zapisi, kotorui hotite izmenit"<<endl;

cin>>zapis;

}

while (zapis<1 || zapis>200);

Student student;

updateFile.seekg((zapis - 1)*sizeof(student));

updateFile.read((char*) &student, sizeof(student));

if (student.num !=0)

{

outputLine (cout, student);

cout<<endl<<"Vvedite yvelichenie dohoda na cheloveka so znakom (+), ymenshenie so znakom (-): "<<endl;

float izmenenie;

cin>>izmenenie;

student.dohod +=izmenenie;

updateFile.seekp((zapis - 1) *sizeof(student));

updateFile.write((char*)&student, sizeof(student));

outputLine(cout, student);

}

else

cout<<"Zapis Nomer "<<zapis<<"Error"<<endl;

}

void deleteRecord(fstream &deleteFromFile)

{

cout<<"Vvedite nomer scheta dla ydaleniia: ";

int zapis;

cin>>zapis;

Student student;

deleteFromFile.seekg((zapis-1)*sizeof(student));

deleteFromFile.read((char*)&student, sizeof(student));

if (student.num!=0)

{

Student blankStudent={0,"", "", 0};

deleteFromFile.seekp((zapis - 1)*sizeof(student));

deleteFromFile.write((char*)&blankStudent, sizeof(student));

cout<<"Zapis "<<zapis<<"bula ydalena"<<endl;

}

else

cout<<"Zapis nomer "<<zapis<<"pysta"<<endl;

}

void outputLine(ostream&, Student);

void poisk()

{

char r[20];

ifstream base("c:\\base.dat", ios::in);

if(!base)

{

cout<<"File error"<<endl;

exit(1);

}

Student student;

cout<<"Vvedite familiyu stydenta"<<endl;

cin>>r;

cout<<setiosflags(ios::left)<<setw(6)<<"Nomer"<<setw(21)<<"Familiya"<<setw(7)<<"Gryppa"<<setw(4)<<"Srednii ball"<<setiosflags(ios::right)<<setw(8)<<"Dohod na odnogo cheloveka"<<endl;

base.read((char*)&student, sizeof(student));

while(!base.eof())

if (r==student.f)

outputLine(cout, student);

base.read((char*)&student, sizeof(Student));

}

2.3 Графический материал курсовой работы

.

Блок заданий:

Вариант 1

1, Определить класс с именем Student , содержащий следующие поля:

  • Фамилия и инициалы;

  • Номер группы;

  • Успеваемость (массив из пяти элементов);

Определить методы доступа к этим полям и перегруженные операции извлечения и вставки для объектов типа Student.

2.написать программу, выполняющую следующии действия:

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

  • Вывод на дисплей фамилий и номеров групп для всех студентов, включённых в массив, если средний балл студента больше 4.0.

  • Если таких студентов нет вывести соответствующее сообщение.

Вариант2

1, Определить класс с именем Student , содержащий следующие поля:

  • Фамилия и инициалы;

  • Номер группы;

  • Успеваемость (массив из пяти элементов);

Определить методы доступа к этим полям и перегруженные операции извлечения и вставки для объектов типа Student.

2.написать программу, выполняющую следующии действия:

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

  • Вывод на дисплей фамилий и номеров групп для всех студентов, имеющих хотя бы одну оценку2.

  • Если таких студентов нет вывести соответствующее сообщение.

Вариант 3.

1, Определить класс с именем Student , содержащий следующие поля:

  • Фамилия и инициалы;

  • Номер группы;

  • Успеваемость (массив из пяти элементов);

Определить методы доступа к этим полям и перегруженные операции извлечения и вставки для объектов типа Student.

2.написать программу, выполняющую следующии действия:

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

  • Вывод на дисплей фамилий и номеров групп для всех студентов, включённых в массив, если средний балл студента больше 3.5.

  • Если таких студентов нет вывести соответствующее сообщение.

Вариант 4.

1. Определить класс Aeroflot, содержащий следующие поля:

  • Название пункта назначения рейса,

  • Номер рейса,

  • Тип самолёта.

Определить методы доступа к этим полям и перегруженные операции извлечения и вставки для объектов типа Aeroflot.

2. Написать программу, выполняющую следующии действия:

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

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

  • Если таких рейсов нет, выдать на экран соответствующее сообщение.

Вариант 5.

1. Определить класс Aeroflot, содержащий следующие поля:

  • Название пункта назначения рейса,

  • Номер рейса,

  • Тип самолёта.

Определить методы доступа к этим полям и перегруженные операции извлечения и вставки для объектов типа Aeroflot.

2. Написать программу, выполняющую следующии действия:

  • Ввод с клавиатуры данных в массив, состоящий из десяти объектов типа Aeroflot. Записи должны быть размещены в алфавитном порядке .

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

  • Если таких рейсов нет, выдать на экран соответствующее сообщение.

Вариант 6.

1. Определить класс Worker, содержащий следующие поля:

  • Фамилия и инициалы работника,

  • Название занимаемой должности,

  • Год поступления наработу.

Определить методы доступа к этим полям и перегруженные операции извлечения и вставки для объектов типа Worker.

2. Написать программу, выполняющую следующии действия:

  • Ввод с клавиатуры данных в массив, состоящий из десяти объектов типа Worker . Записи должны быть размещены в алфавитном порядке .

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

  • Если таких работников нет, выдать на экран соответствующее сообщение.

Вариант 7.

1.Определить класс Train ,содержащий следующие поля:

  • Название пунктов назначения;

  • Номер поезда;

  • Время отправления;

Определить методы доступа к этим полям и перегруженные операции извлечения и вставки для объектов типа Train.

2.Написаеь программу. выполняющую следующии действия:

  • Ввод с клавиатуры данных в массив, состоящий из десяти объектов типа Train. Записи должны быть размещены в алфавитном порядке по названиям пунктов назначения;

  • Вывод на экран информации о поездах, отправляющихся после введённого с клавиатуры времени;

  • Если таких поездов нет, выдать на экран соответствующее сообщение.

Вариант 8.

1.Определить класс Train ,содержащий следующие поля:

  • Название пунктов назначения;

  • Номер поезда;

  • Время отправления;

Определить методы доступа к этим полям и перегруженные операции извлечения и вставки для объектов типа Train.

2.Написаеь программу. выполняющую следующии действия:

  • Ввод с клавиатуры данных в массив, состоящий из десяти объектов типа Train.

  • Записи должны быть упорядочены по времени отправления поезда;

  • Вывод на экран информации о поездах, направляющихся в пункт, назначение которого введённого с клавиатуры;

  • Если таких поездов нет, выдать на экран соответствующее сообщение.

Вариант 9.

1.Определить класс Train ,содержащий следующие поля:

  • Название пунктов назначения;

  • Номер поезда;

  • Время отправления;

Определить методы доступа к этим полям и перегруженные операции извлечения и вставки для объектов типа Train.

2.Написать программу. выполняющую следующии действия:

  • Ввод с клавиатуры данных в массив, состоящий из десяти объектов типа Train.

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

  • Если таких поездов нет, выдать на экран соответствующее сообщение.

Вариант10.

1.Определить класс Mаrsh, содержащий следующие поля:

  • название начального маршрута;

  • название конечного пункта маршрута;

  • номер маршрута.

Определить методы доступа к этим полям и перегруженные операции извлечения и вставки для объектов типа Mаrsh,

2. Написать программу. выполняющую следующии действия:

  • ввод с клавиатуры данных в массив, состоящий из десяти объектов типа Mаrsh, записи должны быть упорядочены по номерам маршрутов:

  • вывод информации о маршруте на экран, номер которого введён с клавиатуры;

  • если таких маршрутов нет, выдать на экран соответствующее сообщение.

Вариант11.

1.Определить класс Mаrsh, содержащий следующие поля:

  • название начального маршрута;

  • название конечного пункта маршрута;

  • номер маршрута.

Определить методы доступа к этим полям и перегруженные операции извлечения и вставки для объектов типа Mаrsh,

2. Написать программу. выполняющую следующии действия:

  • ввод с клавиатуры данных в массив, состоящий из десяти объектов типа Mаrsh, записи должны быть упорядочены по номерам маршрутов:

  • вывод информации о маршрутах на экран, которые начинаются или кончаются в пункте, название которого введёно с клавиатуры;

  • если таких маршрутов нет, выдать на экран соответствующее сообщение.

Вариант12.

1.Определить класс с именем Note содержащий следующие поля:

  • фамилия, имя,

  • номер телефона,

  • день рождения (массив из трёх чисел),

Определить методы доступа к этим полям и перегруженные операции извлечения и вставки для объектов типа Note.

2. Написать программу. выполняющую следующии действия:

  • ввод с клавиатуры данных в массив, состоящий из десяти объектов типа Note, записи должны быть упорядочены по датам дней рождения:

  • вывод информации о человеке на экран, номер телефона которого введёно с клавиатуры;

  • если такого нет, выдать на экран соответствующее сообщение.

Вариант13.

1.Определить класс с именем Note содержащий следующие поля:

  • фамилия, имя,

  • номер телефона,

  • день рождения (массив из трёх чисел),

Определить методы доступа к этим полям и перегруженные операции извлечения и вставки для объектов типа Note.

2. Написать программу. выполняющую следующии действия:

  • ввод с клавиатуры данных в массив, состоящий из десяти объектов типа Note, записи должны быть упорядочены по алфавиту:

  • вывод информации о клиентах на экран, чьи дни рождения приходятся на месяц, значение которого введёно с клавиатуры;

  • если таких нет , выдать на экран соответствующее сообщение.

Вариант14.

1.Определить класс с именем Note, содержащий следующие поля:

  • фамилия, имя,

  • номер телефона,

  • день рождения (массив из трёх чисел),

Определить методы доступа к этим полям и перегруженные операции извлечения и вставки для объектов типа Note.

2. Написать программу. выполняющую следующии действия:

  • ввод с клавиатуры данных в массив, состоящий из десяти объектов типа Note, записи должны быть упорядочены по алфавиту:

  • вывод информации о клиентах на экран, чьи дни рождения приходятся на месяц, значение которого введёно с клавиатуры;

  • если таких нет , выдать на экран соответствующее сообщение.

Вариант15.

Определить класс с именем Znak, содержащий следующие поля:

  • фамилия, имя.

  • день рождения (массив из трёх чисел),

  • знак Зодиака.

Определить методы доступа к этим полям и перегруженные операции извлечения и вставки для объектов типа Znak.