Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2012, 22:52   #1
shadowmvn
 
Регистрация: 17.12.2012
Сообщений: 4
По умолчанию Составить функцию C++

Задача состоит в том, что нужно получить информацию о клиентах, которым могут быть предоставлены определенные скидки, если сумма их предыдущих поездок варьируется в определенных значениях. И нужно составить функцию, которая бы могла это выполнять, для этой программы:
Код:
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <clocale>
using namespace std;
struct clients 
{ 
	char imya[10];
	char familiya[10]; 
	char otchectvo[10];
	double summa;
	char strana[10];
	char date[8];
};
void outfile(fstream& f, int n)
{
	clients a;
	f.seekg(0);
	cout<<"Фамилия|"<<setw(9)<<"Имя|"<<setw(9)<<"Отчество|"<<setw(7)<<"Стоимость поездки|"<<setw(9)<<"Посещаемая страна|"<<setw(2)<<"Дата|"<<endl;		
	cout<<setw(5)<<"_________________________________________________________________________"<<endl;
		for(int i=0; i<n; i++)
		{
			f.read((char *)&a,sizeof a);	
			cout<<a.imya<<"|"<<setw(8)<<a.familiya<<"|"<<setw(8)<<a.otchectvo<<"|"<<setw(6)<<a.summa<<"|"<<setw(18)<<a.strana<<setw(5)<<"|"<<a.date<<"|";
			cout<<endl;  
		}
}
int vvod(fstream& f, int &n)
{
	clients a;
	int q;
	int i=0;
	cin.get();
	cout<<"Сколько клиентов вы хотите внести?";cin>>q;
	f.seekg((n)*(sizeof a));
	{
		cout<<"Введите имя: "; cin>>a.imya;
		cout<<"Введите фамилию: "; cin>>a.familiya;
		cout<<"Введите отчество: ";cin>>a.otchectvo;
		cout<<"Введите посещаемую страну: ";cin>>a.strana;
		cout<<"Введите дату поездки: ";cin>>a.date;
		cout<<"Введите стоимость поездки: ";cin>>a.summa;
		cout<<endl;
		f.write((char *)&a,sizeof a);
	}
	f.close();
	n++;
	f.open("data.dat", ios::in | ios::out);
	return i;
}
int read_f(fstream &f, fstream &out)
{
	int i=0;
	clients a;
	while(!f.eof())
	{
		f>>a.imya>>a.familiya;f>>a.otchectvo;f>>a.summa>>a.strana>>a.date;
		out.write((char *) &a, sizeof a);
		i++;
	}
	return i;
}
int country(fstream &f1, int n, char coun)
{
	int m=0;
	clients a;
	f1.seekg(0);
	for(int i=0;i<n;i++)
	{
		f1.read((char *)&a, sizeof a); 
		if(a.strana[0] == coun )
		{
			cout<<a.imya<<"|"<<setw(8)<<a.familiya<<"|"<<setw(8)<<a.otchectvo<<"|"<<setw(6)<<a.summa<<"|"<<setw(18)<<a.strana<<setw(5)<<"|"<<a.date<<"|";
			cout<<endl;
			m++;
		}
	}
	return m;
}
int main()
{
	char sym;
	clients a;
 setlocale(LC_CTYPE,"Russian");
 fstream in ("data.txt", ios::in);
 if(!in)
 {
  cout<<"Не открыт data.txt"<<endl;
  return 1;
 }
 fstream out ("data.dat",  ios::out | ios::binary);
 if(!in.is_open())
 {
  cout<<"Не открыт data.dat"<< endl;
  return -1;
 }
int size_f=read_f(in,out);
 in.close();
 out.close();
 fstream out_f ("data.dat", ios::in | ios::out | ios::binary);
 if(!out_f)
 {
  cout<<"Не открыт data.dat"<<endl;
  return 1;
 }
 cout<<endl;
 outfile(out_f,size_f);
fstream out_f1 ("data.dat", ios::in |  ios::out | ios::binary);
 if(!out_f1)
 {
  cout<<"Не открыт data1.dat"<<endl;
  return 1;
 }
 do {
	 cout<<endl;
  cout<<"Меню:"<<endl;
  cout<<"1. Добавить клиента"<<endl;
  cout<<"2. Просмотреть список клиентов"<<endl;
  cout<<"3. Показать постоянных клиентов"<<endl;
  cout<<"4. Показать клиентов, посетивших указанную страну"<<endl;
  cout<<"5. Показать клиентов, которым могут быть предоставлены скидки"<<endl;
  cout<<"6. Выход"<<endl;
  cout<<"Введите номер пункта меню> ";cin>>sym; 
  cout<<endl;
  switch(sym)
  {   
case'1': 
	vvod(out_f,size_f);
	break;
 case'2':
	outfile(out_f,size_f);
	break;
	return 0;
 case'4':
	 cout<<"Введите страну> ";
	char coun;
    cin>>coun;
	country(out_f,size_f,coun);
	break;
  }
 }
while (sym!='6');
return 0;
}
Мне не понятно как подсчитывать хранимые в a.summa значения для разных клиентов с учетом того, что клиенты могут повторяться. Очень прошу помощи!
Также здесь есть ошибка, которую я не могу исправить.
Вот эта функция
Код:
int country(fstream &f1, int n, char coun)
{
	int m=0;
	clients a;
	f1.seekg(0);
	for(int i=0;i<n;i++)
	{
		f1.read((char *)&a, sizeof a); 
		if(a.strana[0] == coun )
		{
			cout<<a.imya<<"|"<<setw(8)<<a.familiya<<"|"<<setw(8)<<a.otchectvo<<"|"<<setw(6)<<a.summa<<"|"<<setw(18)<<a.strana<<setw(5)<<"|"<<a.date<<"|";
			cout<<endl;
			m++;
		}
	}
	return m;
}
выводит строки по введенной в консоль стране. Но помимо строк пять раз выводится меню. В чем здесь ошибка?
shadowmvn вне форума Ответить с цитированием
Старый 24.12.2012, 19:09   #2
shadowmvn
 
Регистрация: 17.12.2012
Сообщений: 4
По умолчанию

Народ ну помогите пожалуйста! У меня нет даже представления как это делать(
Надо как-то сделать, чтобы при равных значениях в a.familiya складывались a.summa. Чтобы если в a.familiya встречался Ivanov, то a.summa записывалась в переменную и при последующей встрече Ivanov, a.summa приплюсовывалась к той переменной. И так для каждых одинаковых a.familiya.
shadowmvn вне форума Ответить с цитированием
Старый 24.12.2012, 21:01   #3
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Надо как-то сделать, чтобы при равных значениях в a.familiya складывались a.summa.

считаем, что у тебя уже есть заполненный массив структур, по которым нужно суммировать
Код:
template <typename ForwardIterator, typename T, typename _F1, typename _P2>
T accumulate_if(ForwardIterator first, ForwardIterator last, T val, _F1 f1, _P2 p2)
{
    for (; first != last; ++first)
        if (f1(*first))
            val = p2(val, *first);
    return val;
}

struct match
{
   match(std::string s) : fam(s) {}
   std::string fam;
   bool operator()(const clients& cli) const
   { return fam == cli.familiya; }
};

struct summa
{
    double operator()(double sum, const clients& cli) const
   { return sum + cli.summa; }
};

clients arr[10];
double sum = accumulate_if(arr, arr + 10, 0., match("Иванов"), summa());
Rififi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно составить функцию обчсиления afirat Общие вопросы Delphi 8 09.12.2012 17:27
Задача EXCEL составить функцию Если. FENIX888 Microsoft Office Excel 10 26.08.2011 18:22
Используя функцию, составить программу Васильева Зинаида Помощь студентам 1 18.11.2010 22:04
как составить функцию Sdeeee Microsoft Office Excel 3 03.02.2010 17:07
Процедуру и функцию помогите составить плиз Oleg36 Помощь студентам 2 26.12.2008 11:27