ОАП_решения_задачи
.pdf61
Тема 10 Структуры, объединения, битовые поля, перечисления
Задача 10.1
Определить структурированный тип, набор функций (в виде меню) для работы с массивом структур.
*В структурированной переменной предусмотреть способ отметки ее как не содержащей данных (т.е. «пустой»).
*Функции должны работать с массивом структур или с отдельной структурой через указатели,
*а также при необходимости возвращать указатель на структуру. В перечень обязательных функций входят:
** - «очистка» структурированных переменных;
** - поиск свободной структурированной переменной;
** - ввод элементов (полей) структуры с клавиатуры;
** - вывод элементов (полей) структуры с клавиатуры;
** - поиск в массиве структуры и минимальным значением заданного поля;
** дополнительные функции
** - сортировка массива структур в порядке возрастания заданного поля (при сортировке разрешается присваивание структурированных переменных);
** - удаление заданного элемента;
** - изменение (редактирование) заданного элемента.
** Интерфейс пользователя осуществить в виде командного процессора:
** 1 - загрузить данные
** 2 - вывести на экран ......
База данных студент. Фамилия И.О., дата поступления, дата отчисления. Выбор по произвольному шаблону.
#include "stdafx.h"
# include <iostream>
# include <stdio.h>
# include <cstring>
# include |
<windows.h> |
|
#include |
<locale> |
|
# define nam 30 |
//Название пункта |
|
# define zap 30 |
//Кол-во структур |
|
int er; |
|
//Переключатель |
using namespace std; |
|
|
struct student |
|
|
{char name[nam]; |
//продолжительность |
|
int date; |
|
//Время |
int dat; |
|
//Время |
}; |
|
|
struct student mas_student[zap]; |
|
|
struct student bad; |
|
|
int sch=0; |
|
//Счетчик полных записей |
void enter_new() |
// ф-ция ввода новой структуры |
|
{ |
|
|
if(sch<zap) |
|
|
{ |
|
|
cout<<"Запись номер";cout<<sch+1; cout<< endl<<"Введите имя"<<endl; cin>>mas_student[sch].name; cout<<"Введите дату поступления"<<endl; cin>>mas_student[sch].date; cout<<"Введите двту отчисления "<<endl; cin>>mas_student[sch].dat;
sch++;
}
else cout<<"Введено максимальное кол-во записей";
62 |
cout<<"Что делать дальше?"<<endl; |
|
|
cin>>er; |
|
} |
|
|
void del() |
//ф-ция удаления записи |
|
{ |
int d; |
//номер записи, которую нужно удалить |
|
cout<<"\nВведите номер записи, которую необходимо удалить"<<endl; |
|
|
cout<<"Если необходимо удалить все записи,нажмите '99'"<<endl; |
|
|
cin>>d; |
|
|
if (d!=99) |
|
|
{for (int de_1=(d-1);de_1<sch;de_1++) |
|
|
mas_student[de_1]=mas_student[de_1+1]; |
|
|
sch=sch-1; |
|
|
} |
|
|
if (d==99) |
|
|
for(int i=0;i<zap;i++) |
|
|
mas_student[i]=bad; |
|
cout<<"Что делать дальше?"<<endl; |
|
|
cin>>er; |
|
|
} |
|
|
void change() |
|
|
|
{int c; |
//номер записи, которую нужно |
изменить |
|
|
|
int per; |
|
cout<<"\nВведите номер записи"<<endl; cin>> c;
do
{
cout<<"Введите: "<<endl; cout<<"1-для изменения имени"<<endl;
cout<<"2-для изменения даты поступления"<<endl; cout<<"3-для изменения даты отчисления"<<endl; cout<<"4-для прекращения\n";
cin>>per; switch (per)
{
case 1: cout<<"Введите новое имя ";cin>>mas_student[c-1].name;break; case 2: cout<<"Введите новую дату поступления ";cin>>mas_student[c-
1].date;break;
case 3: cout<<"Введите новое дату отчисления ";cin>>mas_student[c-1].dat;break; cin>>per;
}
}while(per!=4);
cout<<"Что делать дальше?"<<endl; cin>>er;
}
void out() |
//ф-ция вывода записей |
{ |
|
int sw; |
// переключатель |
int o; |
//номер структ, кот. надо вывести |
cout<<endl<<"Введите: "<<endl;
cout<<"1-если хотите вывести какую-либо запсь"<<endl; cout<<"2-если хотите вывести все записи"<<endl; cin>>sw;
if(sw==1)
{
cout<<"Введите номер записи, которую нужно вывести"<<endl; cin>>o;
cout<<endl; cout<<"имя";cout<<mas_student[o-1].name<<endl;
cout<<"дату поступления";cout<<mas_student[o-1].date<<endl; cout<<"дату отчисления";cout<<mas_student[o-1].dat<<endl;
}
if(sw==2)
{ for(int i=0;i<sw;i++)
63 |
{ |
cout<<"имя";cout<<mas_student[i].name<<endl; |
|
|
cout<<"дату поступления";cout<<mas_student[i].date<<endl; |
|
cout<<"дату отчисления";cout<<mas_student[i].dat<<endl; |
|
} |
|
} |
|
cout<<"Что делать дальше?"<<endl; |
|
cin>>er; |
} |
|
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_CTYPE, "Russian");
cout<<"Записей пока нет"<<endl; cout<<"Введите:"<<endl;
cout<<"1-для удаления записи"<<endl; cout<<"2-для ввода новой записи"<<endl; cout<<"3-для изменения записи"<<endl; cout<<"4-для вывода записи(ей)"<<endl; cout<<"5-для выхода"<<endl;
cin>>er;
do
{switch(er)
{
case 1:del();break;
case 2:enter_new();break; case 3:change();break; case 4:out();break;
}
}
while(er!=5);
}
Задача 10.2
Определить структурированный тип, набор функций (в виде меню) для работы с массивом структур. Создать разделы «Читатели», «Ф.И.О», Номер читательского билета», «Название книги», «Срок возврата книги». В
структурированной переменной предусмотреть способ отметки ее как не содержащей данных (т.е.
64
«пустой»). Функции должны работать с массивом структур или с отдельной структурой через указатели, а также при необходимости возвращать указатель на структуру.
#include "stdafx.h" #include <iostream> #include "locale"
#include <stdio.h> #include <algorithm> #define Max 200 using namespace std;
//описание структуры struct LIBRARY
{
bool work;
char familia[Max], name[Max], Surname[Max], book[Max]; int number, cost;
LIBRARY ()
{
work = false;
};
} library[Max];
//глобальные переменные: int Size = -1;
//описание функций
//функция удаления элементов void clear (int n)
{
if (n<Max)
{
library[n].work = false;
printf ("элемент %d был удален\n", n); } else printf ("число слишком большое\n");
}
//функция поиска свободного элемента void find ()
{
int i;
for (i = 0; i<Max && library[i].work; i++);
i == Max ? printf ("не найдено свободных ячеек\n") : printf ("свободная ячейка: %d\n", i);
}
//функция ввода данных void input ()
{
int pos;
for (pos=0; pos<Max && library[pos].work; pos++); if (pos==Max)
{
printf ("не найдено свободных ячеек\n"); return;
}
library[pos].work = true;
cout<<"Введите данные нового абонента:"<<endl; cout<<"Введите фамилию абонента"<<endl; cin>>library[pos].familia;
cout<<"Введите имя абонента"<<endl; cin>>library[pos].name;
cout<<"Введите отчество абонента"<<endl; cin>>library[pos].Surname;
cout<<"Введите номер читательского билета"<<endl; scanf_s ("%d", &library[pos].number);
cout<<"Введите название книги(без пробелов)"<<endl; cin>>library[pos].book;
cout<<"Срок возврата (дней) "<<endl; 65 scanf_s ("%d", &library[pos].cost);
Size++;
} |
|
|
//функция вывода |
|
|
void output |
() |
|
{ |
|
|
for (int i=0; i<Max; i++) |
|
|
if |
(library[i].work) |
|
|
{ |
|
|
cout<<'\n'<<"Фамилия |
: "<<library[i].familia; |
|
cout<<'\n'<<"Имя |
: "<<library[i].name; |
|
cout<<'\n'<<"Отчество |
: "<<library[i].Surname; |
|
cout<<'\n'<<"Номер билета |
: "<<library[i].number; |
|
cout<<'\n'<<"Название книги |
: "<<library[i].book; |
|
cout<<'\n'<<"Срок возврата книги |
: "<<library[i].cost<<'\n'; |
}
// printf("%s %s %s %d %s %d\n", library[i].familia, library[i].name, library[i].Surname, library[i].number, library[i].book, library[i].cost);
}
//функция сортировки void sort ()
{
int f;
int datee=library[0].number; int buf;
cout<<"Введите:"<<endl;
cout<<"1-для поиска по минимальному номеру читательского билета"<<endl; cout<<"0-для поиска по минимальному количеству дней возврата книги"<<endl; cin>>f;
if(f==1)
{
for (int i=0; i<Max; i++)
{
if (library[i].work) if(library[i].number<=datee)
{
datee=library[i].number;
buf=i;
}
}
cout<<"Минимальныq номер читательского билета:"<<" "<<library[buf].number<<endl;
}
if(f==0)
{
int namef=library[0].cost; for(int i=0; i<Max; i++)
{
if (library[i].work)
if (library[i].cost<=namef)
{
namef=library[i].cost;
buf=i;
}
}
cout<<"Минимальное количество дней до возврата книги:"<<"
"<<library[buf].cost<<endl;
}
}
//функция удаления элементов void del (int n)
{
if (n>=0 && n<Max)
if (library[n].work) library[n].work = false;
for (int i=n; i<Max-1; i++) swap (library[i], library[i + 1]); Size--;
cout<<"Элемент успешно удален"<<endl;
66
}
//функция изменения данных void edit (int n)
{
if (n>=0 && n<Max)
if (!library[n].work) cout<<"Данный элемент не существует"<<endl; else
{
cout<<"Введите фамилию абонента"<<endl; cin>>library[n].familia; cout<<"Введите имя абонента"<<endl; cin>>library[n].name;
cout<<"Введите отчество абонента"<<endl; cin>>library[n].Surname;
cout<<"Введите номер читательского билета"<<endl; scanf_s ("%d", &library[n].number);
cout<<"Введите название книги(без пробелов)"<<endl; cin>>library[n].book;
cout<<"Срок возврата (дней) "<<endl; scanf_s ("%d", &library[n].cost);
}
else cout<<"данного элемента не существует"<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "rus"); locale loc ("Russian_Russia");
cout<<"Вас приветствует электронная библиотека ОАО'ИСиТ'"<<endl; char er;
do
{
cout<<"Выберете один из пунктов меню и введите соответствующую цифру:"<<endl; cout<<"______________________________________________________________"<<endl; cout<<"1. Очистка переменной."<<endl;
cout<<"2. Поиск свободной переменной."<<endl; cout<<"3. Ввод элементов в базу данных."<<endl; cout<<"4. Вывод элементов."<<endl;
cout<<"5. Сортировка элементов."<<endl; cout<<"6. Удаление заданного элемента."<<endl; cout<<"7. Изменение выбранного элемента."<<endl; cout<<"0. Выход из программы."<<endl;
er=getchar ();
if (er =='0') break; int n;
switch (er)
{
case '1':
cout<<"введите номер элемента"<<endl; scanf_s ("%d", &n);
clear (n); break;
case '2': find (); break;
case '3': input (); break;
case '4': output (); break;
case '5': sort (); break;
case '6':
cout<<"введите номер элемента"<<endl; scanf_s ("%d", &n);
del (n); break;
case '7':
cout<<"введите номер элемента"<<endl;
67 scanf_s ("%d", &n); edit (n);
break;
}
} while (true); return 0;
}
68
Тема 11 Файлы
Задача 11.1
Дано число k и строковый файл с именем Name1, содержащий непустые строки.
* Создать два новых файла: строковый с именем Name2, содержащий последние k символов каждой строки исходного файла (если строка короче k символов, то она сохраняется целиком), и символьный с именем Name3, содержащий k-й символ каждой строки (если строка короче k, то в файл Name3 записывается пробел).
#include "stdafx.h" #include <string.h> #include <stdio.h> #include <fstream> using namespace std;
int main ()
{
FILE *fin = fopen ("name1.txt", "rt"); ofstream fout1 ("name2.txt");
ofstream fout2 ("name3.txt");
printf ("Vvedite 4islo k\n"); int k;
scanf ("%d", &k);
while (!feof (fin))
{
char s[255] = ""; fgets (s, 254, fin);
if (strlen (s) <= k) fout1 << s; else
for (int i = strlen (s) - k - 1; i < strlen (s); i++) fout1 << s[i];
if (strlen (s) < k) fout2 << " " << endl; else fout2 << s[k - 1] << endl;
}
fclose (fin); fout1.close (); fout2.close ();
return 0;
}
Задача 11.2
Дан строковый файл с именем NameS, содержащий даты в формате "день/месяц/год", причем под день и месяц отводится по две позиции, а под год – четыре. Создать файлы целых чисел с именами Name1, Name2, Name3, содержащие соответственно значения *дней и месяцев+; *дней и лет+; *месяцев и лет+ для дат из исходного строкового файла (в том же порядке).
#include "stdafx.h" #include <string> #include <stdio.h> #include <iostream> #include <fstream> #include <locale> #include <conio.h> using namespace std;
69
int _tmain(int argc, _TCHAR* argv[])
{
setlocale (LC_ALL, "rus");
cout<<"Внимание идет работа с файлами"<<endl; FILE *f = fopen("nameS.txt", "a+");
ofstream fout1 ("nameS1.txt"); ofstream fout2 ("nameS2.txt"); ofstream fout3 ("nameS3.txt"); fout1 <<"Месяц/Год"<<endl;
fout2 <<"День/Месяц"<<endl; fout3 <<"День/Год"<<endl;
while (!feof (f))
{
char s[200]; fgets (s, 20, f);
for(int i=3; i<=9; i++) fout3 << s[i];
fout3 <<endl; for(int i=0; i<=4; i++)
fout2 << s[i]; fout2 <<endl;
for(int i=0; i<=9; i++)
{
if( i<3 || i>5) fout1<<s[i];
}
fout1<<endl;
}
fclose (f); fout1.close ();
fout2.close (); fout3.close ();
cout<<"Работа с файлами успешно завершена"<<endl; getch();
return 0;
}