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

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ
ГИДРОМЕТЕОРОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ
КАФЕДРА МОРСКИХ ИНФОРМАЦИОННЫХ СИСТЕМ.
Курсовая работа.
Вариант №16
Работу выполнил
студент группы ИС-147
Арсений Борисович Чистый
Работу принял
доцент кафедры ВСиИ
Неклюдова С.А.
Санкт-Петербург
2013.
Создать однофайловое консольное приложение (проект).
В этом проекте описать структуру, соответствующую предметной области вашего индивидуального задания из семинара №6. Для хранения данных использовать массив, состоящий из n элементов типа этой структуры. Количество переменных типа структуры (величину n) вводить с клавиатуры в процессе выполнения программы.
Программа должна предлагать меню для выбора режима работы с ней.
Выбрав соответствующую опцию меню, можно производить следующие действия:
После выполнения выбранного действия, программа снова должна предлагать меню. И так до тех пор, пока пользователь не решит завершить работу с программой.
Действия, выполняемые по каждому пункту меню, должны быть оформлены в программе в виде функций.
Оформление курсовой работы должно включать титульный лист, задание на курсовое проектирование, формализацию (если требуется), таблицу имен, блок-схему алгоритма, код программы, представление интерфейса пользователя (скрин-шоты), полное и достаточное тестирование, полученные результаты и выводы о правильности разработанного алгоритма.
Задание семинара №6:
Описать структуру с именем ZNAK, содержащую следующие поля:
□ фамилия, имя;
□ знак Зодиака;
□ дата рождения (массив из трех чисел);
Написать программу, выполняющую следующие действия:
□ ввод с клавиатуры данных в массив, состоящий из восьми
элементов типа ZNAK: записи должны быть упорядочены по
датам рождения;
□ вывод на экран информации о людях, родившихся под знаком,
название которого введено с клавиатуры;
□ если таких нет, выдать на дисплей соответствующее сообщение;
Имя объекта в задаче |
Имя объекта в программе |
Тип объекта |
Содержательный смысл |
Структура |
ZNAK |
Структура |
Исходная структура Содержащая поля: фамилия (surname), имя (name), знак Зодиака (zodiak), дата рождения.(date[3]) |
man[size] |
Массив структур типа ZNAK |
Исходный массив структур |
|
n |
size |
Целое число |
Количество структур типа ZNAK |
Фамилия |
surname [30] |
Символьная переменная |
Фамилия человека |
Имя |
name[30] |
Символьная переменная |
Имя человека |
Знак Зодиака |
zodiak[20] |
Символьная переменная |
Знак Зодиака человека |
Дата рождения |
date[3] |
Целый одномерный массив |
Массив из трех чисел каждому из которых соответствует год, месяц и день рождения человека |
ne_nayden |
Логическая переменная |
ne_nayden = true означает отсутствие людей с искомым знаком Зодиака |
|
iskomyznak[30] |
Символьная переменная |
Искомый знак Зодиака |
|
imin |
Целое число |
Переменная для хранения индекса минимального элемента |
|
choice |
Символьная переменная |
Переменная принимающая результат вызова функции menu() |
|
*man1 |
Указатель на массив структур man[size] |
Передает адрес массива структур man[size] |
|
*size_adress |
Указатель на целочисленное значение size |
Передает адрес размера массива структур man[size] |
|
ch |
Символьная переменная |
Передает значение нажатой клавиши в функцию main() |
|
fout |
Объект класса ifstream |
Объект считывания данных из файла |
|
end_[10] |
Символьная переменная |
Переменная для сравнения считанных данных из файла с условным обозначение конца файла endoffile |
|
buf[40] |
Символьная переменная |
Переменная для считывания данных из файла, которая при получении последовательности символов endoffile заканчивает считывание данных |
|
put |
Объект класса ofstream |
Объект для записи данных в файл |
|
deleteznak[30] |
Символьная переменная |
Переменная получающая искомый параметр по которому удаляются данные |
|
a |
Структура типа ZNAK |
Переменная для обмена местами элементов массива структур типа ZNAK |
|
enter() |
Функция |
Функция ввода данных вручную |
|
init_list() |
Функция |
функция заполняющая все элементы массива знаков Зодиака NULL символами |
|
search() |
Функция |
функция поиска по знаку Зодиака |
|
Choose_delete() |
Функция |
функция выборочного удаления (по введенному знаку Зодиака) |
|
display() |
Функция |
функция вывода всей информации |
|
file_enter() |
Функция |
функция выводящая информацию из файла |
|
Save_file() |
Функция |
функция сохранения данных в файл |
|
menu() |
Функция |
функция меню ,считывающая нажатую кнопку |
|
main() |
Функция |
Входная функция программы |
|
i |
Целое число |
Расч. переменная |
|
j |
Целое число |
Расч. переменная |
Начало
ZNAK:
surname[30] name[30] zodiac[20] date[3]
Конец
file_enter(*man1, *size_adress)
main()
init_list(*man1, *size_adress)
menu ( )
enter (*man1, *size_adress)
Save_file (*man1, *size_adress)
display (*man1, *size_adress)
search (*man1, *size_adress)
Choose_delete(*man1, *size_adress)
True
True
True
True
True
True
True
Конец
False
False
False
False
False
False
False
file_enter(man,&size)
display (man,&size)
search(man,&size)
Choose_delete(man,&size)
Save_file(man,&size)
enter (man,&size)
choise=ж
choise=е
choise=д
choise=г
choise=в
choise=б
choise=a
choise= menu()
От i=1 до i>0 с шагом 0
init_list(man, &size)
Ввод size
main()
False
True
1
continue
break
!*man1[i].zodiak
От i=0 до i<*size_adress с шагом 1
enter (*man1,*size_adress)
Конец
False
return tolower(ch)
True
!strchr("абвгдеж", tolower(ch))
Ввод ch
Вывод таблицы меню
menu()
Конец
man1[i].zodiak=\0
От i=0 до i<*size_adress с шагом 1
init_list(*man1,*size_adress)
Ввод man1[i].surname[30],
man1[i].name[30], man[i].zodiac[20]
True
True
True
1 < man1[i].date[1] < 12
Конец
False
True
Конец
return
Вывод “Список полон”
i=*size_adress
1
1 < man1[i].date[2] < 31
Ввод man1[i].date[2]
Ввод man1[i].date[1]
1900 < man1[i].date[0]
< 2014
Ввод man1[i].date[0]
False
False
False
False
True
Конец
continue
Вывод из fout в man1[j].name man1[j].zodiak man1[j].date[0] man1[j].date[1] man1[j].date[2]
strcpy( man1[j].surname, buf )
!strcmp(buf, end)
Вывод из fout в buf
От j=0 до j<*size_adress с шагом 1
False
True
end_= "endoffile"
Конец
return
Вывод “Список полон”
i=*size_adress
True
False
!*man1[i].zodiak
break
continue
file_enter (*man1,*size_adress)
От i=0 до i<*size_adress с шагом 1
Save_file(*man1,*size_adress)
Конец
True
False
*man1[i].zodiak = '\0'
!strcmp(deleteznak,man1[i] .zodiak)
От i=0 до i<*size_adress с шагом 1
Ввод deleteznak
Choose_delete (*man1,*size_adress)
False
True
Конец
Ввод в put "endoffile"
Ввод в put man1[j].surname
man1[j].name man1[j].zodiak man1[j].date[0] man1[j].date[1] man1[j].date[2]
*man1[i].zodiak
От i=0 до i<*size_adress с шагом 1
True
False
False
True
Конец
Вывод “Человек не найден”
ne_nayden
Вывод man1[i].date[j]
От j=0 доj<3 с шагом 1
Вывод man1[i].surname[30],
man1[i].name[30], man[i].zodiac[20]
!strcmp( iskomyznak, man1[i].zodiak )
От i=0 до i<*size_adress с шагом 1
ne_nayden = true
Ввод iskomyznak
ne_nayden = false
search(*man1,*size_adress)
4
3
2
man1[j].date[2] <man1[imin].date[2]
man1[j].date[1] =man1[imin].date[1]
man1[j].date[1] <man1[imin].date[1]
man1[j].date[0] =man1[imin].date[0]
man1[j].date[0] <man1[imin].date[0]
От j=i+1 до j<size_adress с шагом 1
display(*man1,*size_adress)
От i=0 до i<size_adress-1 с шагом 1
imin = j
False
False
False
True
False
True
True
False
True
imin = j
imin = j
True
imin = i
Конец
Вывод man1[i].surname[30],
man1[i].name[30], man[i].zodiac[20]
man1[i].date[0], man1[i].date[1] , man1[i].date[2]
От i=0 до i<size_adress-1 с шагом 1
4
3
man1[imin] = a
2
ZNAK a = man1[i]
man1[i] = man1[imin]
#include <iostream>
#include <cctype>
#include <cstring>
#include <iomanip>
#include <fstream>
#include <Windows.h>
using namespace std;
struct ZNAK
{
char surname[30];
char name[30];
char zodiak[20];
int date[3];
};
void enter(ZNAK *man1, int *size_adress) , init_list(ZNAK *man1, int *size_adress);
void search(ZNAK *man1, int *size_adress) , Choose_delete(ZNAK *man1, int *size_adress);
void display(ZNAK *man1, int *size_adress), file_enter(ZNAK *man1, int *size_adress);
void Save_file(ZNAK *man1, int *size_adress);
int menu();
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char choice;
cout << "Введите размерность массива " << endl;
int size;
cin >> size;
ZNAK *man = new ZNAK[size];
init_list(man, &size);
for(int i = 1;i>0;i=i+0)
{
choice = menu();
switch ( choice )
{
case 'а' : enter(man, &size);
break;
case 'б' : file_enter(man, &size);
break;
case 'в' : Save_file (man, &size);
break;
case 'г' : display(man, &size);
break;
case 'д' : search(man, &size);
break;
case 'е' : Choose_delete(man, &size);
break;
case 'ж' : return 0;
}
}
}
void init_list(ZNAK *man1, int *size_adress)
{
int i;
for( i = 0; i<*size_adress; i++)
*man1[i].zodiak = '\0';
}
int menu()
{
char ch;
cout << endl ;
do
{
cout << "--------------------------------------\n";
cout << "| (А)-|-Ввод_ручной |\n";
cout << "| (Б)-|-Вывод_данных_из_файла |\n";
cout << "| (В)-|-Сохранение_данных_в_файл |\n";
cout << "| (Г)-|-Просмотр_всех_данных |\n";
cout << "| (Д)-|-Поиск_по_знаку_Зодиака |\n";
cout << "| (Е)-|-Удаление_данных |\n";
cout << "| (Ж)-|-Выход |\n";
cout << "--------------------------------------\n";
cout << "Выберите команду: "; cin >> ch;
} while (!strchr("абвгдеж", tolower(ch)));
return tolower(ch);
}
void enter(ZNAK *man1, int *size_adress)
{
int i;
for(i=0; i<*size_adress; i++ )
if (!*man1[i].zodiak)
break;
else
continue;
if (i==*size_adress)
{
cout <<"Список полон \n";
return;
}
cout << "Имя и фамилия: ";
cin >> man1[i].surname >> man1[i].name;
cout << "Знак Зодиака: ";
cin >> man1[i].zodiak;
cout <<
"Введите дату рождени в формате - ( 1900 < год < 2014 : месяц : день )"
<< endl;
do
cin >> man1[i].date[0];
while(man1[i].date[0]<1900||man1[i].date[0]>2014 );
do
cin >> man1[i].date[1];
while (man1[i].date[1]<1 || man1[i].date[1] > 12 );
do
cin >> man1[i].date[2];
while (man1[i].date[2]<1||man1[i].date[2]> 31 );
cout << endl;
}
void file_enter(ZNAK *man1, int *size_adress)
{
int i;
for(i=0; i<*size_adress; i++ )
if (!*man1[i].zodiak) break;
else
continue;
if (i==*size_adress)
{
cout <<"Список полон\n";
return;
}
ifstream fout("Experement_6_.txt");
char end_[10] = "endoffile";
char buf[40];
for ( int j = i ; j < *size_adress ; j++ )
{
fout >> buf;
if ( !strcmp( buf, end_ ))
continue;
else
{
strcpy( man1[j].surname, buf );
fout >> man1[j].name >> man1[j].zodiak >>
man1[j].date[0] >> man1[j].date[1]
>> man1[j].date[2];
}
}
fout.close();
}
void Save_file(ZNAK *man1, int *size_adress)
{
ofstream put;
put.open("Experement_6_.txt");
for(int i=0; i<*size_adress; i++ )
{
if (*man1[i].zodiak)
put << man1[i].surname << " " <<
man1[i].name << " " << man1[i].zodiak <<
" "<<man1[i].date[0]<<" " <<man1[i].date[1]
<< " " << man1[i].date[2] << " " <<endl;
}
put << "endoffile";
put.close();
}
void Choose_delete(ZNAK *man1, int *size_adress)
{
char deleteznak[30];
cout <<
"Введите данные (знак Зодиака) для удаления: "
<< endl;
cin >> deleteznak;
for (int i = 0; i<*size_adress; i++ )
{
if ( !strcmp(deleteznak,man1[i].zodiak))
*man1[i].zodiak = '\0';
}
}
void search(ZNAK *man1, int *size_adress)
{
char iskomyznak[30];
cout << "Введите искомый знак Зодиака: " << endl;
cin >> iskomyznak;
bool ne_nayden = true;
for ( int i = 0; i < *size_adress; i++ )
{
if ( !strcmp( iskomyznak, man1[i].zodiak ) )
{
ne_nayden = false;
cout <<
"Информация о человеке с искомым знаком Зодиака: "
<< endl;
cout<< "Фамилия и Имя: " << man1[i].surname
<< " " << man1[i].name << endl;
cout << "Знак Зодиака: " << man1[i].zodiak
<< endl;
cout << "Дата рождения: ";
for ( int j = 0; j < 3; j++ )
cout << setw(5) << man1[i].date[j];
cout << endl << endl;
}
}
if ( ne_nayden )
cout << "Человек не найден " << endl;
}
void display(ZNAK *man1, int *size_adress)
{
for ( int i = 0; i < *size_adress - 1; i++ )
{
int imin = i;
for ( int j = i + 1; j < *size_adress ; j++ )
{
if ( man1[j].date[0] < man1[imin].date[0] )
imin = j;
if ( man1[j].date[0] == man1[imin].date[0] )
{
if(man1[j].date[1]< man1[imin].date[1] )
imin = j;
if(man1[j].date[1]==man1[imin].date[1])
if(man1[j].date[2]<man1[imin].date[2])
imin = j;
}
}
ZNAK a = man1[i];
man1[i] = man1[imin];
man1[imin] = a;
}
cout << endl;
for ( int i = 0; i<*size_adress; i++)
if (*man1[i].zodiak)
{
cout << "Фамилия и Им: " << man1[i].surname
<< " " << man1[i].name << endl;
cout << "Знак Зодиака: "<< man1[i].zodiak
<< endl;
cout << "Дата рождения: " << setw(5) <<
man1[i].date[0]
<< setw(3) << man1[i].date[1] << setw(3) <<
man1[i].date[2];
cout << endl << endl;
}
}
Содержимое файла до работы:
Планкина Соня Водолей 1981 2 25
Кумарова Оля Овен 1995 5 7
Погодина Даша Рыбы 1992 4 20
Доброва Ира Водолей 1981 2 25
Маслов Миша Водолей 1981 1 7
Патчин Гоша Водолей 1981 1 5
Колин Иосиф Козерог 1972 12 1
Веселов Коля Овен 1969 10 24
endoffile
Порядок введенных команд:
2-(Б)- Вывод_данных_из_файла
3-(Г)-Просмотр_всех_данных
Веселов Коля Овен 1969 10 24
Колин Иосиф Козерог 1972 12 1
Патчин Гоша Водолей 1981 1 5
Маслов Миша Водолей 1981 1 7
Доброва Ира Водолей 1981 2 25
Планкина Соня Водолей 1981 2 25
Погодина Даша Рыбы 1992 4 20
Кумарова Оля Овен 1995 5 7
4- (А) Ввод_ручной
Железов Евгений Водолей 1981 1 8
5-(А)-Ввод_ручной
Никонов Владислав Весы 1977 2 3
6-(А)-Ввод_ручной
Каплин Станислав Водолей 1999 1 1
7-(А)-Ввод_ручной
Список полон
8-(Г)-Просмотр_всех_данных
Веселов Коля Овен 1969 10 24
Колин Иосиф Козерог 1972 12 1
Никонов Владислав Весы 1977 2 3
Патчин Гоша Водолей 1981 1 5
Маслов Миша Водолей 1981 1 7
Железов Евгений Водолей 1981 1 8
Доброва Ира Водолей 1981 2 25
Планкина Соня Водолей 1981 2 25
Погодина Даша Рыбы 1992 4 20
Кумарова Оля Овен 1995 5 7
Каплин Станислав Водолей 1999 1 1
9-(Е)-Удаление_по_знаку_Зодиака
Введенный знак: Водолей
10-(Г)-Вывод_всех_данных
Веселов Коля Овен 1969 10 24
Колин Иосиф Козерог 1972 12 1
Никонов Владислав Весы 1977 2 3
Погодина Даша Рыбы 1992 4 20
Кумарова Оля Овен 1995 5 7
11-(Д)-Поиск_по_знаку_Зодиака
Введенный знак: Овен
Веселов Коля Овен 1969 10 24
Кумарова Оля Овен 1995 5 7
12-(В)-Сохранение_данных_в_файл
13-(Ж) -Выод
Содержимое файла после работы:
Веселов Коля Овен 1969 10 24
Колин Иосиф Козерог 1972 12 1
Никонов Владислав Весы 1977 2 3
Погодина Даша Рыбы 1992 4 20
Кумарова Оля Овен 1995 5 7
Поскольку результаты тестирования программы совпали с результатами выполнения программы на компьютере, алгоритм разработан верно.