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

Сумма 3 чисел с файла, не могу понять - C++

Восстановить пароль Регистрация
 
maSt
 Аватар для maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
11.10.2012, 21:30     Сумма 3 чисел с файла, не могу понять #1
недавно уже писал об этой проблеме , спасибо всем кто помог. Но мне все равно интересно почему все работает не так как я задумал.
У нас есть файл
C++
1
2
3
4
5
6
7
3
403.94 324.78 126.09 557.93 257.52 409.61 191.39 235.86 879.98 199.36 924.13 266.84 895.51 783.41 0.00
X F T Z L W H E U R T I J D 
838.21 175.43 817.30 162.98 0.00
O V T V 
34.63 347.63 522.50 337.02 614.48 0.00
U Z L C S
первая строка - количество пар строк с информацией.
Нам нужно найти максимальную сумму 3 последовательно стоящих чисел и вывести буквы соответствующие этим числам.
То есть во второй строке 924.13 ,266.84, 895.51 , то есть 11, 12 и 13 число.
И соответствующие им буквы T I J.
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()
{
    float a=0,b=0,c=0,d=0,g,t=0,i=0,h=0,j=0;
    char p,x,z;
    ifstream f("input.txt");
    ofstream n("output.txt");
    int v;
    f >> v;
    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"; 
    }
}
программа работает правильно. То есть на первую строку выдает T I J.
Но сколько не ломаю голову не могу понять почему оно не идет дальше по файлу, а опять начинает обрабатывать 2 и 3 строку.
То есть в output я получаю
T I J
T I J
T I J
почему именно так? почему оно не идет дальше?

Добавлено через 3 часа 9 минут
up сообщение
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2012, 21:30     Сумма 3 чисел с файла, не могу понять
Посмотрите здесь:

C++ не могу понять...
C++ Не могу понять
C++ Не могу понять
C++ не могу понять
Стек на основе массива структур - эт как понять читаю литературу и не могу понять! C++
не могу понять C++
C++ не могу понять
Эксперты! Одномерный массив неповторяющихся чисел не могу понять почему криво работает C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
11.10.2012, 23:36     Сумма 3 чисел с файла, не могу понять #2
Сделал через std::list, на массивах должно быть ещё сложнее
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
#include <iostream>
#include <fstream>
#include <list>
#include <numeric>
#include <iterator>
#include <cctype>
#include <stdexcept>
 
int main()
{
    try
    {
        std::ifstream ifs("in.txt");
        if(ifs.is_open())
        {
            size_t n, maxi, i, j, k;
            ifs >> n;
            size_t const size = 3;
            std::list<double> l; // список чисел
            std::list<char> lc; // список букв
            double max, tmp, maxnum;
            for(k = 0; k < n; ++k)
            {
                for(i = 0; i < size && ifs >> tmp && tmp; ++i) // заполнение первыми size числами
                {
                    l.push_back(tmp);
                }
                if(l.size() == size)
                {
                    max = std::accumulate(l.begin(), l.end(), 0.0); // установка начального значения
                    maxi = 0; // начальный индекс
                    for(; ifs >> tmp && tmp; ++i) // поиск максимума в группе
                    {
                        l.push_back(tmp);
                        l.pop_front();
                        tmp = std::accumulate(l.begin(), l.end(), 0.0);
                        if(tmp > max)
                        {
                            max = tmp;
                            maxi = i - 2;
                            maxnum = *l.begin();
                        }
                    }
                }
                else throw std::runtime_error("l.size() != size");
                char c;
                for(j = 0; j < i && ifs >> c && isalpha(c); ++j) // заполнение списка букв
                {
                    lc.push_back(c);
                }
                if(i == j) // если список букв и список чисел равны по размеру
                {
                    std::list<char>::const_iterator it(lc.begin());
                    std::advance(it, maxi);
                    std::cout << "Group " << k << ": ";
                    for(i = 0; i < size; ++i)
                    {
                        std::cout << *it++ << ' ';
                    }
                    std::cout << std::endl;
                }
                else throw std::runtime_error("mismatch number of doubles and letters");
                l.clear();
                lc.clear();
            }
            ifs.close();
        }
        else std::cerr << "Unable to open input file" << std::endl;
    }
    catch(std::exception const& e)
    {
        std::cerr << "Exception: " << e.what() << std::endl;
    }
    return 0;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.10.2012, 01:52     Сумма 3 чисел с файла, не могу понять #3
maSt, посмотрите, где у вас находится курсор после первого правильного считывания символов. В первой строке символов после J, т.е. следующий элемент для чтения D. Возврат в начало цикла for(). f >> ожидает ввода цифры, получает символ D. Ошибка ввода. Устанавливается флаг ошибки. Поток ввода становится нерабочим.Дальше пролёт до конца, где в файл опять записываются те же символы, и так до выхода из цикла.

Добавлено через 4 минуты
Цитата Сообщение от maSt Посмотреть сообщение
Нужно найти максимальную сумму 3 чисел в каждой строке и вывести соответственные буквы с нижних строк.
Что же вы в своей первой теме Найти максимальную сумму 3 чисел в каждой строке файла забыли написать: последовательно стоящих?

Добавлено через 45 минут
Даже если это исправить, то при чтении следующей пары всё равно ошибки. У вас в коде, переходы от считывания чисел к считыванию символов и наоборот, не продуманы

Добавлено через 44 минуты
Ошибки нашёл. 1) При переходе к следующей паре, не обнуляются значения j, h, 2) Не запоминается индекс j при максимальной сумме, 3) Не обрабатывается перход от чтения символов к чтению чисел. Вот код с исправлениями:
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
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <string>
#include <cctype> // для isdigit()
using namespace std;
 
int main()
{
    float a = 0,b = 0,c = 0,d = 0, g, t = 0, i = 0, h = 0, j = 0, ind = 0; // ind для запоминания j при максимальной сумме
    char p, x, z;
    ifstream f("input.txt");
    ofstream n("output.txt");
    int v;
    f >> v;
    
    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;
                    ind = j; // запомнили j
                }
            }
            while (d != 0.00);
                
            for (int i = 0 ; i != ind; i++)
                {
                    f >> p;
                }
                f >> x >> z ;
                n << p << " " << x << " " << z << "\n";
                
                j = 0; //! обнулили перед следующей парой
                h = 0; //!
                ind = 0; //!
        
        // перевод курсора на начало строки с числами
        char ch;
        while (f) // чтение символов до цифры или до конца файла
        {
            f >> ch; 
            if (isdigit(ch)) break; // если считана цифра,то выход
        }
        f.clear(); // на всякий случай
        f.seekg(-1, ios::cur); // возвращаем курсор на начало строки с цифрами
    }
    
    cin.get();
    return 0;
}
Yandex
Объявления
12.10.2012, 01:52     Сумма 3 чисел с файла, не могу понять
Ответ Создать тему
Опции темы

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