Консультация № 174837
03.12.2009, 20:31
0.00 руб.
0 6 1
Задача по обработке массива объектов.
В данной задаче нужно:
1. Описать класс (структур) (согласно своего варианта задания);
2. Объявить массив объектов созданного типа на 10 элементов;
3. Написать программу, выполняющую следующие действия:
- ввод информации с клавиатуры в массив объектов;
- вывод на экран всей информации;
- вывод на экран информации, отвечающей условию поиска .
1. Структура с именем WORKER содержит следующие поля:
- фамилия и инициалы работника;
- название занимаемой должности;
- год поступления на работу.

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


Приложение:
Условие задачи.
1.Структура с именем PRICRE содержит следующие поля:
- наименование товара;
- название магазина;
- стоимость товара в рублях.
2. Условие поиска - вывести на экран информацию о товаре,
наименование которого введено с клавиатуры.

Пусть:
tovar - имя поля с наименованием товара - символьный массив
размерностью 20;
mag - имя поля с названием магазина - символьный массив
размерностью 15;
cena - имя поля со стоимостью товара в рулях - целое число.
Тогда описание структуры (класса) будет таким:
struct PRICE
{
char tovar[20];
char mag[15];
int cena;
};
Текст программы
#include <iostream.h>
#include <iomanip.h>
#include <string.h>
#include <conio.h>

#define TOV 20 // длина поля наименования товара
#define MAG 15 // длина поля названия магазина
#define R 10 // размерность массива объектов

// описание структуры PRICE
struct PRICE
{
char tovar [TOV];
char mag [MAG];
int cena;
};
// прототипы функций
void input ( PRICE [R] );
void output ( PRICE [R] );
PRICE inputzap ();
void outputzap ( PRICE );
void tabl();
void poisk ( PRICE [R] );

void main()
{
PRICE m[R]; // объявление массива объектов типа PRICE
// размерностью R
clrscr(); // функция очистки экрана
input(m);
clrscr();
output(m);
poisk(m);
}
// определение функции ввода в массив объектов
void input( PRICE x[R])
{
int i;
cout << "Ввод информации в массив объектов:\n"
for (i=0; i<R; i++)
x[i]=inputzap();
}

// определение функции ввода одной записи
PRICE inputzap()
{
PRICE z;
cout << "Введите наименование товара:";
cin.seekg(0L, ios::end);
cin.get(z.tovar, TOV-1, '\n');
cout << "Введите название магазина:";
cin.seekg(0L, ios::end);
cin.get(z.mag, MAG-1, '\n');
cout << "Введите стоимость товара в рублях:";
cin.seekg(0L, ios::end);
cin >> z.cena;
return z;
}

// определение функции вывода всей информации на экран
void output ( PRICE x[R] )
{
int i;
cout << "Вывод информации о всех товарах:\n";
tabl();
for (i=0; i<R; i++)
outputzap(x[i]);
cout << "------------------------------------------------------------\n";
}

// определение функции вывода одной записи на экран
void outputzap (PRICE z)
{
cout.setf(ios::left); // установка флага равнения по левому краю
cout << "|" << setw(25) << z.tovar << "|" << setw(20) << z.mag
<< "|";
cout.setf(ios::right); // установка флага равнения по правому краю
cout << setw(11) << z.cena << "|" << endl;
}

// определение функции вывода на экран шапки таблицы
void tabl()
{
cout << "-----------------------------------------------------------------------------\n";
cout << "| Наименование товара | Название магазина | Стоимость |\n";
cout << "|---------------------------------|--------------------------|----------------|\n";
}

// определение функции вывода на экран информации,
// отвечающей условию поиска
void poisk ( PRICE x[R] )
{
int i;
char tov[TOV]; // для ввода условия поиска

cout << "Введите наименование интересующего Вас товара:";
cin.seekg(0L, ios::end);
cin.get(tov,TOV-1,'\n');

cout << "Вывод информации о заданном товаре:\n";
tabl();
for (i=0; i<R; i++)
if (strcmp(x[i].tovar,tov)==0)
// наименования товара совпали
outputzap(x[i]);
cout << "------------------------------------------------------------\n";
}

Обсуждение

Неизвестный
03.12.2009, 22:46
общий
это ответ
Здравствуйте, Сидорова Юлия Евгеньевна.
Программа. С++. MS VS 2008.
В программе не производится проверка на корректность вводимых данных.
Код:
#include <iostream>
#include <sstream>
#include <iterator>
#include <locale>
#include <string>
#include <list>
#include <algorithm>
#include <functional>
#include <ctime>

using namespace std;

// Класс - рабочий
class worker
{
public:
worker(wstring fio,wstring job,unsigned int year);
unsigned int year() const;
private:
wstring _fio;
wstring _job;
unsigned int _year;
friend basic_ostream<wchar_t>& operator<<(basic_ostream<wchar_t>& stream,const worker& right);
};

typedef list<worker> workerList;

int menu();
void addData(workerList& workers);
void printData(const workerList& workers);
void findData(const workerList& workers);

int main()
{
locale::global(locale("russian_russia.866"));
workerList workers;
while(true)
{
switch(menu())
{
case 0:
return 0;
case 1:
addData(workers);
break;
case 2:
printData(workers);
break;
case 3:
findData(workers);
break;
}
}
}

// Выводит меню
int menu()
{
while(true)
{
wcout<<L"Возможны следующие варианты:"<<endl
<<L"1 - Ввод данных"<<endl
<<L"2 - Вывод информации"<<endl
<<L"3 - Поиск"<<endl
<<L"0 - Выход"<<endl
<<L"Сделайте свой выбор:";
wint_t choice=_getwche();
wcout<<endl;
switch(choice)
{
case L'0':
case L'1':
case L'2':
case L'3':
return choice-L'0';
default:
wcout<<L"Будьте внимательней"<<endl;
}
}
}

// Добавляет данные к списку
void addData(workerList& workers)
{
while(true)
{
wcout<<L"Введите Ф.И.О.(пустая строка для выхода):";
wstring fio;
getline(wcin,fio);
if(fio.empty())
{
return;
}
wcout<<L"Должность:";
wstring job;
getline(wcin,job);
wcout<<L"Год:";
unsigned int year;
wcin>>year;
wcin.ignore(numeric_limits<streamsize>::max(),L'\n');
workers.push_back(worker(fio,job,year));
}
}

// Выводит список
void printData(const workerList& workers)
{
wcout<<L"Полный список:"<<endl;
copy(workers.begin(),workers.end(),ostream_iterator<worker,wchar_t>(wcout,L"\n"));
}

// Функтор для поиска согласно стажа работы
class stageFunctor:unary_function<worker,bool>
{
public:
stageFunctor(unsigned int stage)
{
// Получим год ниже которого будем искать
time_t curTime=time(0);
#pragma warning(disable:4996)
_year=localtime(&curTime)->tm_year+1900-stage;
}
// Собственно сам функтор
result_type operator()(const argument_type& arg) const
{
return arg.year()<_year;
}
private:
unsigned int _year;
};

// Ищет данные согласно условия
void findData(const workerList& workers)
{
wcout<<L"Требуемый стаж работы:";
unsigned int stage;
wcin>>stage;
wcin.ignore(numeric_limits<streamsize>::max(),L'\n');
copy_if(workers.begin(),workers.end(),ostream_iterator<worker,wchar_t>(wcout,L"\n"),stageFunctor(stage));
}

worker::worker(wstring fio,wstring job,unsigned int year)
:_fio(fio)
,_job(job)
,_year(year)
{}

unsigned int worker::year() const
{
return _year;
}

// Оператор вывода для worker
basic_ostream<wchar_t>& operator<<(basic_ostream<wchar_t>& stream,const worker& right)
{
basic_stringstream<wchar_t> sstr;
sstr<<L"Ф.И.О.:"<<right._fio<<L" Должность:"<<right._job<<L" Год:"<<right._year;
return stream<<sstr.str();
}

Пример вывода.
Код:
Возможны следующие варианты:
1 - Ввод данных
2 - Вывод информации
3 - Поиск
0 - Выход
Сделайте свой выбор:1
Введите Ф.И.О.(пустая строка для выхода):Иванов П.С.
Должность:Слесарь
Год:1999
Введите Ф.И.О.(пустая строка для выхода):Петров И.И.
Должность:Дворник
Год:2005
Введите Ф.И.О.(пустая строка для выхода):Сидоров А.П.
Должность:Директор
Год:1990
Введите Ф.И.О.(пустая строка для выхода):
Возможны следующие варианты:
1 - Ввод данных
2 - Вывод информации
3 - Поиск
0 - Выход
Сделайте свой выбор:2
Полный список:
Ф.И.О.:Иванов П.С. Должность:Слесарь Год:1 999
Ф.И.О.:Петров И.И. Должность:Дворник Год:2 005
Ф.И.О.:Сидоров А.П. Должность:Директор Год:1 990
Возможны следующие варианты:
1 - Ввод данных
2 - Вывод информации
3 - Поиск
0 - Выход
Сделайте свой выбор:3
Требуемый стаж работы:15
Ф.И.О.:Сидоров А.П. Должность:Директор Год:1 990
Возможны следующие варианты:
1 - Ввод данных
2 - Вывод информации
3 - Поиск
0 - Выход
Сделайте свой выбор:3
Требуемый стаж работы:8
Ф.И.О.:Иванов П.С. Должность:Слесарь Год:1 999
Ф.И.О.:Сидоров А.П. Должность:Директор Год:1 990
Возможны следующие варианты:
1 - Ввод данных
2 - Вывод информации
3 - Поиск
0 - Выход
Сделайте свой выбор:
5
Неизвестный
04.12.2009, 15:48
общий
Можно ли сделать без строчки: using namespace std; ???
Неизвестный
04.12.2009, 19:21
общий
Сидорова Юлия Евгеньевна:
Можно. Только тогда придется писать вместо wcout - std::wcout, вместо wcin - std::wcin, вместо wstring - std::wstring. Или использовать директиву using типа так:
Код:
...
using std::wcout;
using std::wcin;
using std::wstring;
... и т.д.

Да и что не так с этой строкой?
Неизвестный
06.12.2009, 00:19
общий
Спасибо, я попробую.
У меня компилятор borland turbo c++. Видимо ему эта строка не по вкусу
Неизвестный
06.12.2009, 01:40
общий
Сидорова Юлия Евгеньевна:
Цитата: 234150
У меня компилятор borland turbo c++. Видимо ему эта строка не по вкусу
Это очень старый компилятор, который уже давным давно не соответствует стандарту C++.

Попробуйте Visual C++ Express Edition:http://www.microsoft.com/express/download/#webInstall
Неизвестный
06.12.2009, 18:42
общий
Нам в институте посоветовали этот
Спасибо за подсказку. Я обязательно попробую!
Форма ответа