Форум программистов, компьютерный форум CyberForum.ru

Найти максимальную сумму 3 чисел в каждой строке файла - C++

Восстановить пароль Регистрация
 
maSt
 Аватар для maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
09.10.2012, 01:23     Найти максимальную сумму 3 чисел в каждой строке файла #1
Дан файл.
3 - первая строка файла , количество пар-строк которые есть в файле.
765 458 329 705 120 895
G H T P L M
297 486 910 110 370
G V T U O P
34.63 347.63 522.50 337.02 614.48 0.00
U Z L C S
Нужно найти максимальную сумму 3 чисел в каждой строке и вывести соответственные буквы с нижних строк.
Например в последнем
Z L C
Написал программу. Она все правильно считает, но после того как прочитает первый раз строку с числами и строку с буквами указатель в файле сбывается (не могу понять почему) и программа опять считает 1 строку с числами и 1 строку с буквами вместо 2.
Как сделать чтобы не сбивало указатель в файле?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>;
#include <stdio.h>
#include <fstream>;
#include <string>
using namespace std;
 
int main()
{
    ifstream f("input.txt");
    ofstream n("output.txt");
    int v;
    f >> v;
    float a,b,c,d,g,h=0,j=0;
    char p,x,z;
    for (int i = 0 ; i != v; i++)
    {
        f >> a ;
        f >> b;
        f >> c;
        do
        {
            g = a + b + c;
            a = b;
            b = c; 
            f >> d;
            c = d;
            j++;
            if (g > h)
            {
                h = g;
            }
        }
        while (d != 0.00);
        for (int i =0 ; i!=j-1; i++)
        {
            f >> p;
        }
        f >> x >> z ;
        n << p << " " << x << " " << z << "\n";
    }
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2012, 01:23     Найти максимальную сумму 3 чисел в каждой строке файла
Посмотрите здесь:

Дан двумерный массив.посчитать сумму элементов в кажой строке. найти максимальную и минимальную сумму и помень эти строки местами. C++
C++ Найти максимальную сумму чисел, произведение которых не превышает заданного числа.
Дан текстовый файл, содержащий целые числа. В каждой строке этого файла найти сумму наибольшего и наименьшего элементов и записать их в другой C++
C++ Найти в массиве чисел последовательность, имеющую максимальную сумму
C++ Найти максимальную сумму чисел в одной строке и вывести на экран эту сумму и номер строки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.10.2012, 07:29     Найти максимальную сумму 3 чисел в каждой строке файла #2
do while - бесконечный цикл. Как определили, что указатель в файле сбивается? Логика программы непонятна. Можете описать, алгоритм поиска максимальной суммы 3 чисел и вывода соответсвующих букв ?

Добавлено через 1 часа 38 минут
Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <iostream>
#include <vector>
#include <fstream>
#include <string>
#include <cctype> // для isdigit()
#include <algorithm> // для sort() и count()
using namespace std;
 
const int N = 3; // количество чисел в максимальной сумме
 
//функция помещает в вектор index 
// индексы N наибольших чисел из вектора vec
 
void maxsumN(const vector <float> &vec, vector <int> &index)
{
    for (int i = 0; i < N; i++) // поиск N индексов 
    {
        float max = 0; // для наибольшего числа
        int maxi = 0; // для индекса наибольшего числа 
        for (int j = 0; j < vec.size(); j++) // перебор чисел в векторе
        {
            float temp = 0; // для текущего числа 
            if (i == 0) temp = vec[j]; // если ещё ни один индекс не найден
            else if (!count(index.begin(), index.end(), j)) temp = vec[j]; // если индексы уже найдены и j не равен ни одному из них
                 else continue; // если такой индекс уже есть в найденных, то пропускаем
            if (temp > max)  
            {
                max = temp; // новое максимальное значение
                maxi = j;  // индекс нового максимального значения
            } 
        }
        index.push_back(maxi); // найденный индекс помещаем в index
        max = 0;
    }
    
    sort(index.begin(), index.end()); // сортируем индексы по возрастанию
}
 
int main()
{
    ifstream f("input.txt");
    ofstream n("output.txt");
    
    int v;
    f >> v;
    
    for (int i = 0; i < v; i++)
    {
        vector <float> vec; // вектор для чисел
        float a;
        while (f >> a) // читаем до символов. При считывании символа вместо числа, 
                       // f установит флаг ошибки и будет выход из цикла
            if (f) vec.push_back(a); // если считали без ошибки, добавляем число в вектор
        f.clear(); // сбрасываем флаг ошибки
        
        string str; // строка для символов
        char ch;
        while (f >> ch) // чтение символов до цифры
            if (!isdigit(ch)) str.push_back(ch); // если символ не цифра, то добавляем его в str 
            else break; // если считана цифра, выход
        f.clear();
        f.seekg(-1, ios::cur); // возвращаем курсор на начало строки с цифрами
        
        for (int i = 0; i < vec.size(); i++) // вывод чисел из вектора
            cout << vec[i] << " ";
        cout << endl;
    
        for (int i = 0; i < str.size(); i++) // вывод символов из строки
            cout << str[i] << " ";
        cout << endl;
    
        vector <int> index; // вектор для индексов наибольших из считанных чисел 
        maxsumN(vec, index); // функция помещает в вектор index 
                             // индексы N наибольших чисел из вектора vec
 
        float maxsum = 0;
        for (int i = 0; i < index.size(); i++) // получение максимальной суммы N чисел
                                               // и вывод на экран 
        {
            maxsum += vec[index[i]];
            cout << vec[index[i]] << " + ";
        }
        cout << "\b\b";
        cout << "= " << maxsum << endl; // вывод максимальной суммы
 
        for (int i = 0; i < index.size(); i++) // вывод из строки str символов по индексам в index
            cout << str[index[i]] << " ";
        cout << endl << endl;
 
        vec.clear(); // очистка вектора и строки для следующего считывания из файла
        str.clear();
    }
    
    f.close();
    
    cin.get();
    return 0;
}
-=ЮрА=-
Заблокирован
Автор FAQ
09.10.2012, 10:19     Найти максимальную сумму 3 чисел в каждой строке файла #3
maSt, вот мой взгляд на проблему
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <string>
#include <sstream>
#include <fstream>
#include <iostream>
using namespace std;
 
//Думаю ясно что будет хранить данная стркутура
struct fData
{
    string digits;
    string symbols;
};
//Функция возвращает сумму цифр из поля digits
double SumDigitsInfData(fData ptr);
//Функция производит запись в поток ofstream три первіх значения из полей 
//string digits;
//string symbols;
bool Write3FirstFields(ofstream &ofs, fData ptr);
 
int main()
{
    bool bFlag = true;//Флаг успешного чтения
    string line;//Строка с даннми из файла
    int nPairs = 0;//Число пар строк
    fData * pList = NULL;//указатель на динамический массив структур fData
    double maxSum =  0;//Думаю тоже ясно - макс сумма первых 3-х цифр
    int iRowMaxSum= -1;//Будет хранить индекс стркои с макс суммой цифр
    int i;//Счётчик
    ofstream ofs;//Указатель на поток записи мы проинициализируем его позже
    ifstream ifs("input.txt");
    if(!ifs.is_open())
        cout<<"Error open input.txt"<<endl;
    else
    if(!(ifs>>nPairs))
        cout<<"Incorrect file format"<<endl;
    else
    if(!(pList = new fData[nPairs]))
        cout<<"Allocation memory error"<<endl;
    else
    {
        ifs.get();
        for(i = 0; i < nPairs && !ifs.eof() && bFlag; i++)
        {
            if(!getline(ifs,pList[i].digits)) //Пробуем считать строку цифр
                bFlag = false;
            else
            if(!getline(ifs,pList[i].symbols))//Пробуем считать строку символов
                bFlag = false;
            else
            {
                cout<<"\tPair # "<<i + 1<<endl;
                cout<<"Digits : "<<pList[i].digits<<endl;
                cout<<"Symbols: "<<pList[i].symbols<<endl;
            }
        }
        if(!bFlag)
            cout<<"During parsing file errors occured"<<endl;
        else
        {
            iRowMaxSum = 0;
            //Инициализируем maxSum суммой цифр первой строки
            maxSum = SumDigitsInfData(pList[iRowMaxSum]);
            for(i = 1; i < nPairs && bFlag; i++)
            {
                if(maxSum < SumDigitsInfData(pList[i]))
                {
                    iRowMaxSum = i;
                    maxSum = SumDigitsInfData(pList[i]);
                }
            }
            cout<<"Number of Pair with max sum 1-st digits : "<<iRowMaxSum + 1<<endl;
            cout<<"Digits : "<<pList[iRowMaxSum].digits<<endl;
            cout<<"Symbols: "<<pList[iRowMaxSum].symbols<<endl;
            cout<<"Sum    : "<<maxSum<<endl;
            ofs.open("output.txt");
            if(!ofs.is_open())
                cout<<"Error creation output.txt"<<endl;
            else
            if(!Write3FirstFields(ofs, pList[iRowMaxSum]))
                cout<<"Error during write to file"<<endl;
            else
                cout<<"Writing OK"<<endl;
        }
        delete [] pList;//Чистка памяти
    }
    ifs.close();
    ofs.close();
    return 0;
}
 
double SumDigitsInfData(fData ptr)
{
    double val = 0;
    double sum = 0;
    stringstream ss(ptr.digits);
    for(int i = 0; i < 3 ; i++)
    {
        if((ss>>val))
            sum += val;
    }
    return sum;
}
 
bool Write3FirstFields(ofstream &ofs, fData ptr)
{
    int i;
    bool bFlag = true;
    double val = 0;
    char symbol= 0;
    stringstream ss;
    ss.str(ptr.digits);
    cout<<"\tWrite in file"<<endl;
    for(i = 0; i < 3 && bFlag; i++)
    {
        if(!(ss>>val))
            bFlag = false;
        else
        {
            cout<<val<<" ";
            ofs<<val<<" ";
        }
    }
    ofs<<endl;
    cout<<endl;
    ss.clear();//Сбросили флаг EOF
    ss.seekg(0,ios::beg);//Установили указатель вначало
    ss.str(ptr.symbols);
    for(i = 0; i < 3 && bFlag; i++)
    {
        if(!(ss>>symbol))
            bFlag = false;
        else     
        {
            cout<<symbol<<" ";
            ofs<<symbol<<" ";
        }
    }
    return bFlag;
}
input.txt
3
765 458 329 705 120 895
G H T P L M
297 486 910 110 370
G V T U O P
34.63 347.63 522.50 337.02 614.48 0.00
U Z L C S
output.txt
297 486 910
G V T
Миниатюры
Найти максимальную сумму 3 чисел в каждой строке файла  
-=ЮрА=-
Заблокирован
Автор FAQ
09.10.2012, 10:22     Найти максимальную сумму 3 чисел в каждой строке файла #4
maSt, сумма первых трёх цифр наибольшая в этой строке
Цитата Сообщение от maSt Посмотреть сообщение
765 458 329 705 120 895 = 765 458 329 = 1552
G H T P L M
297 486 910 110 370 = 297 486 910 = 1693
G V T U O P
34.63 347.63 522.50 337.02 614.48 0.00 = 34.63 347.63 522.50 = 904.76
U Z L C S
так что ты ошибся с этим
Цитата Сообщение от maSt Посмотреть сообщение
Например в последнем
Z L C
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.10.2012, 10:59     Найти максимальную сумму 3 чисел в каждой строке файла #5
-=ЮрА=-, у вас совсем не по заданию.
Цитата Сообщение от maSt Посмотреть сообщение
U Z L C S
Нужно найти максимальную сумму 3 чисел в каждой строке и вывести соответственные буквы с нижних строк.
Например в последнем
Z L C
Не сказано, что первых трёх. Не сказано, что найти строку с наибольшей суммой первых трёх чисел. ТС только с третьей буквой в примере ошибся. Нужно было написать: Z L S.
Миниатюры
Найти максимальную сумму 3 чисел в каждой строке файла  
-=ЮрА=-
09.10.2012, 11:07
  #6

Не по теме:

Увидел я воспринял что первых трёх но писать совсем не по заданию это ты уж точно зря!Лучше разберись с cin.sync
Сейчас поправим, в любом случае решается отличным от твоего способом

-=ЮрА=-
Заблокирован
Автор FAQ
09.10.2012, 11:52     Найти максимальную сумму 3 чисел в каждой строке файла #7
maSt, задание я понял так есть пары строк, в одиних числа в дргих буквы, надо найти строку с макс суммой чисел - это строка 1 сумма чисел равна 2365 по логике буквы нижней строки это буквы из строки G H T P L M но никак не последней стркои, которая к первой никакого отношения не имеет
Цитата Сообщение от maSt Посмотреть сообщение
765 458 329 705 120 895
G H T P L M
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include <string>
#include <vector>
#include <sstream>
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;
 
//ÄóìГ*Гѕ ГїГ±Г*Г® Г·ГІГ® áóäåò õðГ*Г*ГЁГІГј Г¤Г*Г*Г*Г*Гї ñòðêóòóðГ*
struct fData
{
    string digits;
    string symbols;
};
//ÔóГ*êöèÿ âîçâðГ*Г№Г*ГҐГІ ñóììó öèôð ГЁГ§ ïîëÿ digits
double SumDigitsInfData(fData ptr, vector<double> &values);
//ÔóГ*êöèÿ ïðîèçâîäèò Г§Г*ГЇГЁГ±Гј Гў ïîòîê ofstream òðè ïåðâ³õ Г§Г*Г*Г·ГҐГ*ГЁГї ГЁГ§ ïîëåé 
//string digits;
//string symbols;
bool Write3FirstFields(ofstream &ofs, fData ptr, vector<double> values);
 
int main()
{
    bool bFlag = true;//ÔëГ*ГЈ ГіГ±ГЇГҐГёГ*îãî Г·ГІГҐГ*ГЁГї
    string line;//ÑòðîêГ* Г± Г¤Г*Г*Г*ìè ГЁГ§ ГґГ*éëГ*
    int nPairs = 0;//×èñëî ГЇГ*Г° ñòðîê
    fData * pList = NULL;//ГіГЄГ*Г§Г*òåëü Г*Г* äèГ*Г*ìè÷åñêèé Г¬Г*Г±Г±ГЁГў ñòðóêòóð fData
    double maxSum =  0;//ÄóìГ*Гѕ òîæå ГїГ±Г*Г® - Г¬Г*ГЄГ± ñóììГ* ïåðâûõ 3-Гµ öèôð
    int iRowMaxSum= -1;//Áóäåò õðГ*Г*ГЁГІГј ГЁГ*äåêñ ñòðêîè Г± Г¬Г*ГЄГ± ñóììîé öèôð
    int i;//Ñ÷¸ò÷èê
    vector<double> RowValues;//âåêòîð äëÿ Г§Г*Г*Г·ГҐГ*ГЁГ© ñòðîêè digits
    ofstream ofs;//ÓêГ*Г§Г*òåëü Г*Г* ïîòîê Г§Г*ГЇГЁГ±ГЁ ìû ïðîèГ*èöèГ*ëèçèðóåì ГҐГЈГ® ïîçæå
    ifstream ifs("input.txt");
    if(!ifs.is_open())
        cout<<"Error open input.txt"<<endl;
    else
    if(!(ifs>>nPairs))
        cout<<"Incorrect file format"<<endl;
    else
    if(!(pList = new fData[nPairs]))
        cout<<"Allocation memory error"<<endl;
    else
    {
        ifs.get();
        for(i = 0; i < nPairs && !ifs.eof() && bFlag; i++)
        {
            if(!getline(ifs,pList[i].digits)) //Ïðîáóåì Г±Г·ГЁГІГ*ГІГј ñòðîêó öèôð
                bFlag = false;
            else
            if(!getline(ifs,pList[i].symbols))//Ïðîáóåì Г±Г·ГЁГІГ*ГІГј ñòðîêó ñèìâîëîâ
                bFlag = false;
            else
            {
                cout<<"\tPair # "<<i + 1<<endl;
                cout<<"Digits : "<<pList[i].digits<<endl;
                cout<<"Symbols: "<<pList[i].symbols<<endl;
            }
        }
        if(!bFlag)
            cout<<"During parsing file errors occured"<<endl;
        else
        {
            iRowMaxSum = 0;
            //Г€Г*èöèГ*ëèçèðóåì maxSum ñóììîé öèôð ïåðâîé ñòðîêè
            for(i = 1; i < nPairs && bFlag; i++)
            {
                if(SumDigitsInfData(pList[iRowMaxSum], RowValues) < SumDigitsInfData(pList[i],RowValues))
                    iRowMaxSum = i;
            }
            
            cout<<"Number of Pair with max sum 1-st digits : "<<iRowMaxSum + 1<<endl;
            cout<<"Digits : "<<pList[iRowMaxSum].digits<<endl;
            cout<<"Symbols: "<<pList[iRowMaxSum].symbols<<endl;
            cout<<"Sum    : "<<SumDigitsInfData(pList[iRowMaxSum], RowValues)<<endl;
            cout<<"Numbers: "<<RowValues[0]<<" + "<<RowValues[1]<<" + "<<RowValues[2]<<endl;
            ofs.open("output.txt");
            if(!ofs.is_open())
                cout<<"Error creation output.txt"<<endl;
            else
            if(!Write3FirstFields(ofs, pList[iRowMaxSum], RowValues))
                cout<<"Error during write to file"<<endl;
            else
                cout<<"Writing OK"<<endl;
        }
        delete [] pList;//Г—ГЁГ±ГІГЄГ* ГЇГ*ìÿòè
    }
    ifs.close();
    ofs.close();
    return 0;
}
 
bool bComp(double left, double right)
{
    return left > right;
}
 
double SumDigitsInfData(fData ptr, vector<double> &values)
{
    stringstream ss(ptr.digits);
    values.clear();
    double value = 0;
    for(int i = 0; !ss.eof(); i++)
    {
        if(ss>>value)
            values.push_back(value);
    }
    sort(values.begin(), values.end(), bComp);
    return values[0] + values[1] + values[2];
}
 
bool Write3FirstFields(ofstream &ofs, fData ptr, vector<double> values)
{
    int i, j;
    int indexes[3]  = {0};
    bool bFlag = 3 <= values.size();
    double val = 0;
    char symbol= 0;
    stringstream ss;
    ss.str(ptr.digits);
    cout<<"\tWrite in file"<<endl;
    for(j = (i = 0); i < 3 && bFlag && !ss.eof(); j++)
    {
        if(!(ss>>val))
            bFlag = false;
        else
        if(val == values[0] || val == values[1] || val == values[2])
        {
            indexes[i] = j;
            cout<<val<<" ";
            ofs<<val<<" ";
            i++;
        }
    }
    ofs<<endl;
    cout<<endl;
    ss.clear();//Ñáðîñèëè ГґГ«Г*ГЈ EOF
    ss.seekg(0,ios::beg);//ÓñòГ*Г*îâèëè ГіГЄГ*Г§Г*òåëü ГўГ*Г*Г·Г*ëî
    ss.str(ptr.symbols);
    for(j = (i = 0); i < 3 && bFlag && !ss.eof(); j++)
    {
        if(!(ss>>symbol))
            bFlag = false;
        else  
        if(indexes[i] == j)
        {
            cout<<symbol<<" ";
            ofs<<symbol<<" ";
            i = i + 1;
        }
    }
    return bFlag;
}
Миниатюры
Найти максимальную сумму 3 чисел в каждой строке файла  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.10.2012, 12:02     Найти максимальную сумму 3 чисел в каждой строке файла #8
-=ЮрА=-, ясно же написано:
сумму 3 чисел в каждой строке
ТС не зря же пример привёл. В одной букве только ошибся, надо было: Z L S. Для третьей строки символов - это правильно. Они соответствуют трём самым большим числам в третьей строке чисел.
-=ЮрА=-
Заблокирован
Автор FAQ
09.10.2012, 12:50     Найти максимальную сумму 3 чисел в каждой строке файла #9
alsav22 раскрой глаза да посмотри последний код, а я лучше подожду автора с пояснениями к заданию.
-=ЮрА=-
Заблокирован
Автор FAQ
09.10.2012, 13:35     Найти максимальную сумму 3 чисел в каждой строке файла #10
maSt, с учётом всех нападок в мой адрес выше, я решил сделать код ещё лаконичней
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <string>
#include <vector>
#include <sstream>
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;
 
//ÄóìГ*Гѕ ГїГ±Г*Г® Г·ГІГ® áóäåò õðГ*Г*ГЁГІГј Г¤Г*Г*Г*Г*Гї ñòðêóòóðГ*
struct fData
{
    string digits;
    string symbols;
};
//ÔóГ*êöèÿ âîçâðГ*Г№Г*ГҐГІ ñóììó öèôð ГЁГ§ ïîëÿ digits
double SumDigitsInfData(fData ptr, vector<double> &values, vector<char> &symbols);
 
int main()
{
    bool bFlag = true;//ÔëГ*ГЈ ГіГ±ГЇГҐГёГ*îãî Г·ГІГҐГ*ГЁГї
    string line;//ÑòðîêГ* Г± Г¤Г*Г*Г*ìè ГЁГ§ ГґГ*éëГ*
    
    fData * pList = NULL;//ГіГЄГ*Г§Г*òåëü Г*Г* äèГ*Г*ìè÷åñêèé Г¬Г*Г±Г±ГЁГў ñòðóêòóð fData
    int iRowMaxSum= -1;//Áóäåò õðГ*Г*ГЁГІГј ГЁГ*äåêñ ñòðêîè Г± Г¬Г*ГЄГ± ñóììîé öèôð
    int i;//Ñ÷¸ò÷èê
    int nPairs = 0;//×èñëî ГЇГ*Г° ñòðîê
    
    double maxSum = 0;
    vector<double> RowValues;//âåêòîð äëÿ Г§Г*Г*Г·ГҐГ*ГЁГ© ñòðîêè digits
    vector  <char> RowSymbols;//âåêòîð äëÿ ñèìâîëîâ ñòðîêè
    ofstream ofs;//ÓêГ*Г§Г*òåëü Г*Г* ïîòîê Г§Г*ГЇГЁГ±ГЁ ìû ïðîèГ*èöèГ*ëèçèðóåì ГҐГЈГ® ïîçæå
    ifstream ifs("input.txt");
    if(!ifs.is_open())
        cout<<"Error open input.txt"<<endl;
    else
    if(!(ifs>>nPairs))
        cout<<"Incorrect file format"<<endl;
    else
    if(!(pList = new fData[nPairs]))
        cout<<"Allocation memory error"<<endl;
    else
    {
        ifs.get();
        for(i = 0; i < nPairs && !ifs.eof() && bFlag; i++)
        {
            if(!getline(ifs,pList[i].digits)) //Ïðîáóåì Г±Г·ГЁГІГ*ГІГј ñòðîêó öèôð
                bFlag = false;
            else
            if(!getline(ifs,pList[i].symbols))//Ïðîáóåì Г±Г·ГЁГІГ*ГІГј ñòðîêó ñèìâîëîâ
                bFlag = false;
        }
        if(!bFlag)
            cout<<"During parsing file errors occured"<<endl;
        else
        {
            iRowMaxSum = 0;
            //Г€Г*èöèГ*ëèçèðóåì maxSum ñóììîé öèôð ïåðâîé ñòðîêè
            ofs.open("output.txt");
            if(!ofs.is_open())
                cout<<"Error creation output.txt"<<endl;
            else
            {
                for(i = 0; i < nPairs && bFlag; i++)
                {
                    if(SumDigitsInfData(pList[iRowMaxSum], RowValues, RowSymbols) < SumDigitsInfData(pList[i],RowValues, RowSymbols))
                        iRowMaxSum = i;
                    
                    cout<<"\tROW # "<<i + 1<<endl;
                    cout<<"ALLDigits : "<<pList[i].digits<<endl;
                    cout<<"ALLSymbols: "<<pList[i].symbols<<endl;
                    cout<<"Sum    : "<<SumDigitsInfData(pList[i], RowValues, RowSymbols)<<endl;
                    cout<<"Numbers: "<<RowValues[0] <<" + "<<RowValues[1] <<" + "<<RowValues[2]<<endl;
                    cout<<"Symbols: "<<RowSymbols[0]<<" + "<<RowSymbols[1]<<" + "<<RowSymbols[2]<<endl;
                    //ГЏГЁГёГҐГ¬ Гў ГґГ*éë
                    ofs<<"\tROW # "<<i + 1<<endl;
                    ofs<<"ALLDigits : "<<pList[i].digits<<endl;
                    ofs<<"ALLSymbols: "<<pList[i].symbols<<endl;
                    ofs<<"Sum    : "<<SumDigitsInfData(pList[i], RowValues, RowSymbols)<<endl;
                    ofs<<"Numbers: "<<RowValues[0] <<" + "<<RowValues[1] <<" + "<<RowValues[2]<<endl;
                    ofs<<"Symbols: "<<RowSymbols[0]<<" + "<<RowSymbols[1]<<" + "<<RowSymbols[2]<<endl;
                }
                maxSum = SumDigitsInfData(pList[iRowMaxSum], RowValues, RowSymbols);
                cout<<"\tPair with max sum 1-st digits : "<<iRowMaxSum + 1<<endl;
                cout<<"Digits : "<<pList[iRowMaxSum].digits<<endl;
                cout<<"Symbols: "<<pList[iRowMaxSum].symbols<<endl;
                cout<<"Sum    : "<<maxSum<<endl;
                cout<<"Numbers: "<<RowValues[0]<<" + "<<RowValues[1]<<" + "<<RowValues[2]<<endl;
                cout<<"Symbols:  "<<RowSymbols[0]<<" + "<<RowSymbols[1]<<" + "<<RowSymbols[2]<<endl;
 
                //ГЏГЁГёГҐГ¬ Гў ГґГ*éë
                ofs<<"Number of Pair with max sum 1-st digits : "<<iRowMaxSum + 1<<endl;
                ofs<<"Digits : "<<pList[iRowMaxSum].digits<<endl;
                ofs<<"Symbols: "<<pList[iRowMaxSum].symbols<<endl;
                ofs<<"Sum    : "<<maxSum<<endl;
                ofs<<"Numbers: "<<RowValues[0]<<" + "<<RowValues[1]<<" + "<<RowValues[2]<<endl;
                ofs<<"Symbols: "<<RowSymbols[0]<<" + "<<RowSymbols[1]<<" + "<<RowSymbols[2]<<endl;
            }
        }
        delete [] pList;//Г—ГЁГ±ГІГЄГ* ГЇГ*ìÿòè
    }
    ifs.close();
    ofs.close();
    return 0;
}
 
bool bComp(pair<double, char> left, pair<double, char> right)
{
    return left.first > right.first;
}
 
double SumDigitsInfData(fData ptr, vector<double> &values, vector<char> &symbols)
{
    stringstream ss;
    ss.str(ptr.digits);
    char  symbol = 0; 
    double value = 0;
    int i = 0;
    vector< pair<double, char> > pData;
    for(i = 0; !ss.eof(); i++)
    {
        if(ss>>value)
            pData.push_back(make_pair(value, ' '));
    }
    ss.clear();
    ss.seekg(0,ios::beg);
    ss.str(ptr.symbols);
    for(i = 0; i < values.size(); i++)
    {
        if(ss>>symbol)
            pData[i].second = symbol;
    }
     values.clear();
    symbols.clear();
    sort(pData.begin(), pData.end(), bComp);
    for(i = 0; i < pData.size(); i++)
    {
         values.push_back(pData[i].first);
        symbols.push_back(pData[i].second);
    }
    pData.clear();
    return values[0] + values[1] + values[2];
}
Миниатюры
Найти максимальную сумму 3 чисел в каждой строке файла  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2012, 16:06     Найти максимальную сумму 3 чисел в каждой строке файла
Еще ссылки по теме:

Задана матрица целых чисел, найти сумму отрицательных элементов в каждой строке C++
C++ Найти сумму остатков от деление парных чисел на 5 в каждой строке матрицы
C++ Найти максимальную сумму двух соседних чисел из данного набора

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
maSt
 Аватар для maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
09.10.2012, 16:06  [ТС]     Найти максимальную сумму 3 чисел в каждой строке файла #11
Огромное спасибо всем за помощь
Yandex
Объявления
09.10.2012, 16:06     Найти максимальную сумму 3 чисел в каждой строке файла
Ответ Создать тему
Опции темы

Текущее время: 02:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru