Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ОАП_решения_задачи

.pdf
Скачиваний:
104
Добавлен:
26.03.2015
Размер:
1.69 Mб
Скачать

61

Тема 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;

}