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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2012, 17:50   #1
dioxyde
 
Регистрация: 07.01.2012
Сообщений: 3
По умолчанию c++ Строки

Проблема такая,
нужно посчитать сумму платежей с указанной целью.
То есть допустим я в поле "введите цель платежа" ввожу какуюнибудь цель.
Дальше как я понял нужно найти все платежи с таким названием ну и потом посчитать их сумму...
На теории легко, а как доходит до практики меня тупит, незнаю как это записать...

Код:
#include <iostream>

using namespace std;

int main()
{
 setlocale(LC_ALL,"rus");
 struct Payment
 {
  char PaymentNumber[20];
  double Amount;
  char PurposeOfPayment[50];
 };
const int n=3;
Payment mas[n];

for(int i=0; i<n; i++)
{
	cout << "[" << i+1 << "]: " << endl;
	
	cout <<"Введите Номер Счета: ";
	cin.getline(mas[i].PaymentNumber,20);

	cout <<"Введите Цель Платежа: ";
	cin.getline(mas[i].PurposeOfPayment,50);
	
	cout<<"Введите Сумму: ";
	cin >> mas[i].Amount;
	cin.get();
	cout << endl;
}


system("PAUSE");
}
dioxyde вне форума Ответить с цитированием
Старый 07.01.2012, 20:54   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от dioxyde Посмотреть сообщение
Дальше как я понял нужно найти все платежи с таким названием ну и потом посчитать их сумму...
Сформулируй мысль по человечески. Ничего не понятно.
_Bers вне форума Ответить с цитированием
Старый 07.01.2012, 21:37   #3
pinkiller
Форумчанин
 
Регистрация: 29.10.2011
Сообщений: 141
По умолчанию

class Pay{
public:
string PaymentNumber;
double Amount;
string PurposeOfPayment;

friend istream& operator>>(istream &ist, Pay&P){
ist>>P.PaymentNumber;
ist>>P.Amount;
ist>>P.PurposeOfPayment;
return ist; };

};

void main(){
string NugnayaCeL; // цель по которой ищешь сумму;
cin>>NugnayaCeL;
Pay Pa[n];
double SUM=0;
for(int i=0; i<n; i++){
cin>>Pa[i];
}
for(int i=0; i<n; i++){
if (Pa[i].PurposeOfPayment=NugnayaCeL) {SUM=SUM+Pa[i].Amount}
}



Умею работать только с классами, чем смог тем помог
Я это все дело тут написал, у себя не отлаживал, могут быть ошибки(
pinkiller вне форума Ответить с цитированием
Старый 07.01.2012, 21:45   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от pinkiller Посмотреть сообщение
class Pay{
public:
string PaymentNumber;
double Amount;
string PurposeOfPayment;

friend istream& operator>>(istream &ist, Pay&P){ //<-- вот тут ошибка. Не имеет права быть членом класса.
ist>>P.PaymentNumber;
ist>>P.Amount;
ist>>P.PurposeOfPayment;
return ist; };

};

void main(){
string NugnayaCeL; // цель по которой ищешь сумму;
cin>>NugnayaCeL;
Pay Pa[n];
double SUM=0;
for(int i=0; i<n; i++){
cin>>Pa[i];
}
for(int i=0; i<n; i++){
if (Pa[i].PurposeOfPayment=NugnayaCeL) {SUM=SUM+Pa[i].Amount} //<--строка содержит 2 ошибки. Перепутал == с =, и забыл точку с запятой
}
см комментарий в коде.

Последний раз редактировалось _Bers; 07.01.2012 в 22:00.
_Bers вне форума Ответить с цитированием
Старый 07.01.2012, 22:21   #5
pinkiller
Форумчанин
 
Регистрация: 29.10.2011
Сообщений: 141
По умолчанию

Создал проект, отладил. все работает.

Код:
#include <iostream>
#include <string>
using namespace std;

class Pay{
public: 
string PaymentNumber;
double Amount;
string PurposeOfPayment;

friend istream& operator>>(istream &ist, Pay&P){ // нет тут ошибки о___О
ist>>P.PaymentNumber; 
ist>>P.Amount;
ist>>P.PurposeOfPayment;
return ist;}

};

void main(){
int n=2;
string NugnayaCeL; // цель по которой ищешь сумму;
cin>>NugnayaCeL;
Pay Pa[2];
double SUM=0;
for(int i=0; i<n; i++){
cin>>Pa[i];
}
for(int i=0; i<n; i++){
	if (Pa[i].PurposeOfPayment==NugnayaCeL) {SUM=SUM+Pa[i].Amount;}} // исправил

cout<<SUM;
}

В первом месте небыло ошибки, можно перегружать операции работы с потоками внутри класса и &P тоже можно делать, кажется... Оо
pinkiller вне форума Ответить с цитированием
Старый 07.01.2012, 22:50   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Я походу сам туплю. Видимо я не до конца понимаю смысл ключевого слова friend

Рассмотрим пример:

Код:
struct Pay
{
    string PaymentNumber;    double Amount;    string PurposeOfPayment;

    friend istream& operator>>(istream &ist, Pay&P)
    { ist>>P.PaymentNumber>>P.Amount>>P.PurposeOfPayment;  return ist;}

    friend ostream& operator<<(ostream &ost, Pay&P)
    { ost<<P.PaymentNumber<<P.Amount<<P.PurposeOfPayment;  return ost;}
};

int main()
{
    Pay test;  cin>>test;  cout<< test;
    
    test.operator>>(cin, test); //: error C2039: >>: не является членом "Pay"
    
    operator>>(cin, test); //а так работает
    
    return 0;
}
Операторы объявлены и реализованы внутри класса. Причем, без ключевого слова static, но с ключевым словом friend

Вопрос: являются ли операторы членами класса, или нет?
И если они не являются членами класса, то в какой области видимости они существуют?

Создаётся впечатление, что несмотря на то, что объявляются и реализуются внутри класса, все равно компилятор сам поместит эти функции в глобальную область видимости, несмотря на то, что отсутствует ключевое слово static
_Bers вне форума Ответить с цитированием
Старый 07.01.2012, 23:26   #7
pinkiller
Форумчанин
 
Регистрация: 29.10.2011
Сообщений: 141
По умолчанию

На сколько я знаю friend делает эту функцию видимой для членов класса всегда и везде.
Но вообщем это скорее догадки.
а еще я не видел чтобы так обращались к << >> и пр.
Код:
Class.operator++;
так можно при перегруженном ++ ?
pinkiller вне форума Ответить с цитированием
Старый 08.01.2012, 00:04   #8
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

pinkiller

Создал проект, отладил. все работает.

friend istream& operator>>(istream &ist, Pay&P){ // нет тут ошибки о___О


И не будет.
Просто _Bers, по-видимому, кроме незнания ключевого слова static, также не в курсе того, что объявление дружественной функции может быть также определением, поэтому пытается запутать тебя.
Rififi вне форума Ответить с цитированием
Старый 08.01.2012, 00:59   #9
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
pinkiller

Создал проект, отладил. все работает.

friend istream& operator>>(istream &ist, Pay&P){ // нет тут ошибки о___О


И не будет.
Просто _Bers, по-видимому, кроме незнания ключевого слова static, также не в курсе того, что объявление дружественной функции может быть также определением, поэтому пытается запутать тебя.
Rififi много говорит, да все не по делу.

Может ли Rififi сказать точно, является ли
Код:
friend istream& operator>>(istream &ist, Pay&P)
{ ist>>P.PaymentNumber>>P.Amount>>P.PurposeOfPayment;  return ist;}
Членом класса, или не является? А если не является, то почему тогда функция определенная в теле класса вдруг оказалась не его членом?

А если является, тогда как понимать эту ошибку компиляции:
Код:
test.operator>>(cin, test); //: error C2039: >>: не является членом "Pay"
А то, может быть, Rififi и сам не знает, а только зубки скалит?
_Bers вне форума Ответить с цитированием
Старый 08.01.2012, 01:16   #10
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Ниже представленный код наглядно демонстрирует тот факт, что ключевое слово friend сообщает компилятору о том, что функция является другом класса, но не членном этого класса. А так же, демонстрирует тот факт, что компилятор расположит дружественную функцию в глобальной области видимости

Код:
#include <iostream>
#include <string>
using namespace std;

struct Pay
{
    string PaymentNumber;    double Amount;    string PurposeOfPayment;

    friend istream& operator>>(istream &ist, Pay&P)  
    { ist>>P.PaymentNumber>>P.Amount>>P.PurposeOfPayment;  return ist;}

    friend ostream& operator<<(ostream &ost, Pay&P)
    { ost<<P.PaymentNumber<<P.Amount<<P.PurposeOfPayment;  return ost;}
};

struct Pay1
{
    string PaymentNumber;    double Amount;    string PurposeOfPayment;

    //: error C2084: функция "std::istream &operator >>(std::istream &,Pay &)" уже имеет текст реализации
    //: см. предыдущее определение '>>'
    friend istream& operator>>(istream &ist, Pay&P)  
    { ist>>P.PaymentNumber>>P.Amount>>P.PurposeOfPayment;  return ist;}

    //: error C2084: функция "std::ostream &operator <<(std::ostream &,Pay &)" уже имеет текст реализации
    //: см. предыдущее определение '<<'
    friend ostream& operator<<(ostream &ost, Pay&P)
    { ost<<P.PaymentNumber<<P.Amount<<P.PurposeOfPayment;  return ost;}
};


int main()
{
    Pay test;  
    operator>>(cin, test); //перегруженная функция живет в глобальной области видимости
    cout<< test;
    return 0;
}
_Bers вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сделать в гриде строки выше, чтобы не растягивать строки до бесконечности kris__tina БД в Delphi 1 09.06.2011 15:31
Даны строки S и S0. Удалить из строки S все подстроки, совпадающие с S0 . Если совпадающих подстрок нет, Шпунюся Помощь студентам 1 16.12.2010 21:02
Создание пустой строки и копирование в неё содержимое предыдущей строки Gvaridos Microsoft Office Excel 2 29.10.2010 13:33
Определять максимальную длину той части строки s, которая не содержит символы из строки s1. Александе еть я Общие вопросы C/C++ 5 13.04.2010 20:54
Перенести символа с начала строки в место перед запятой этой же строки. Zhiltsov Microsoft Office Excel 4 05.06.2009 13:10