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

Cортировка файла по заданному полю - C++

Восстановить пароль Регистрация
 
Blitzor DDD
12 / 12 / 1
Регистрация: 17.08.2015
Сообщений: 439
02.07.2016, 19:47     Cортировка файла по заданному полю #1
Всем привет!

Задача такая: в файле есть массив данных, состоящий из двух столбцов: имени и баллов,
необходимо считать эту инфу, а потом вывести в другой файл так, чтобы имя и привязанный к нему балл размещался по убыванию.

Например, в исходном экселевском файле имеем:
Миша 262,5
Аня 268,5
Лена 334,3
Слава 168,1

А в другой файл должно быть записано:
Лена 334,3
Аня 268,5
Миша 262,5
Слава 168,1

Какой тут должен быть алгоритм? можно ли считывать адекватно из экселя и как организовать такую смешанную сортировку?

Заранее спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
 Аватар для Catstail
21501 / 10254 / 1670
Регистрация: 12.02.2012
Сообщений: 17,139
02.07.2016, 19:49     Cортировка файла по заданному полю #2
На C++ ты умучишься это делать (из XLS-файла). Другое дело - из текстового файла.
Blitzor DDD
12 / 12 / 1
Регистрация: 17.08.2015
Сообщений: 439
02.07.2016, 20:10  [ТС]     Cортировка файла по заданному полю #3
Может можно иначе? В Экселе самом?
nstwf
86 / 76 / 30
Регистрация: 19.02.2016
Сообщений: 324
Завершенные тесты: 1
02.07.2016, 20:18     Cортировка файла по заданному полю #4
Цитата Сообщение от Blitzor DDD Посмотреть сообщение
Может можно иначе? В Экселе самом?
Если в c++, делал похожее, но там была первая цифра.
Предлагаю сделать так:
Считать в структуру, а дальше менять местами и записывать, если есть наброски - кидай код.

Добавлено через 3 минуты
Сейчас попробую тебе пример написать.
Catstail
Модератор
 Аватар для Catstail
21501 / 10254 / 1670
Регистрация: 12.02.2012
Сообщений: 17,139
02.07.2016, 20:22     Cортировка файла по заданному полю #5
В Экселе это очень просто.
nstwf
86 / 76 / 30
Регистрация: 19.02.2016
Сообщений: 324
Завершенные тесты: 1
02.07.2016, 20:37     Cортировка файла по заданному полю #6
Как-то так.
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
#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
using namespace std;
 
struct test
{
    string name;
    double mark;
};
 
int Cr(string fname)
{
    int n = 0;
    ifstream fin(fname);
    while (!fin.eof())
    {
        if (fin.get() == '\n')
            n++;
    }
    fin.close();
    return n;
}
 
 
void main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    string fname = "1.txt";
    cout << "Кол-во учеников: " << Cr(fname);
    int n = Cr(fname);
    test *Test = new test[n];
    ifstream fin(fname);
    for (int i = 0; i < n; i++)
    {
        fin >> Test[i].name >> Test[i].mark;
        cout << Test[i].name << " - " << Test[i].mark << endl;
    }
    fin.close();
    //Тут сортируешь по убыванию Test[i].mark и записываешь в другой файл.
 
 
    delete[] Test;
    system("pause");
}
Добавлено через 6 минут
Вот тебе доделанный вариант:
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
#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
using namespace std;
 
struct test
{
    string name;
    double mark;
};
 
int Cr(string fname)
{
    int n = 0;
    ifstream fin(fname);
    while (!fin.eof())
    {
        if (fin.get() == '\n')
            n++;
    }
    fin.close();
    return n;
}
 
 
void main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    string fname = "1.txt";
    cout << "Кол-во учеников: " << Cr(fname);
    int n = Cr(fname);
    test *Test = new test[n];
    ifstream fin(fname);
    test Help;
    for (int i = 0; i < n; i++)
    {
        fin >> Test[i].name >> Test[i].mark;
        cout << Test[i].name << " - " << Test[i].mark << endl;
    }
    for (int i = 0; i <= n; i++)
    {
        for (int j = n - 1; j > i; j--)
        {
            if (Test[j].mark < Test[i].mark)
            {
                Help = Test[j];
                Test[j] = Test[i];
                Test[i] = Help;
            }
        }
    }
    cout << "\nОтсортированный список :\n";
    ofstream fout("2.txt");
    for (int i = 0; i < n; i++)
    {
        cout << Test[i].name << " - " << Test[i].mark << endl;
        fout << Test[i].name << " " << Test[i].mark << "\n";
    }
    fout.close();
 
    fin.close();
    delete[] Test;
    system("pause");
}
1.txt
Миша 262.5
Аня 268.5
Лена 334.3
Слава 168.1

2.txt
Слава 168.1
Миша 262.5
Аня 268.5
Лена 334.3


Добавлено через 2 минуты
Не уследил, что по убыванию, 46 строка
C++
1
if (Test[j].mark > Test[i].mark)
Blitzor DDD
12 / 12 / 1
Регистрация: 17.08.2015
Сообщений: 439
02.07.2016, 20:45  [ТС]     Cортировка файла по заданному полю #7
Catstail, не подскажете, где найти инфу?

nstwf, благодарю Вас действия и программу! Но тут остается два нюанса. Во-первых,
C++ (Qt)
1
windows.h
, у меня стоит Линукс, и во-вторых, более существенно, что считывать то надо из Экселя.. А в Вашем варианте считывание происходит из текстового файла, в таком случае мне придется аккуратно формировать исходный текстовый файл так, чтобы имя шло рядом с числом, а сами понимаете это канительно, потому что простым копипастом это не сделать....
Mr.X
Эксперт С++
 Аватар для Mr.X
2804 / 1580 / 248
Регистрация: 03.05.2010
Сообщений: 3,683
02.07.2016, 20:47     Cортировка файла по заданному полю #8
Цитата Сообщение от Blitzor DDD Посмотреть сообщение
Например, в исходном экселевском файле имеем:
Blitzor DDD, так в чем вопрос-то, как считать из экселевского файла или как отсортировать?
Catstail
Модератор
 Аватар для Catstail
21501 / 10254 / 1670
Регистрация: 12.02.2012
Сообщений: 17,139
02.07.2016, 20:49     Cортировка файла по заданному полю #9
В Линуксе из какого экселя? Из OpenOffice? С ним не работал.
Blitzor DDD
12 / 12 / 1
Регистрация: 17.08.2015
Сообщений: 439
02.07.2016, 20:51  [ТС]     Cортировка файла по заданному полю #10
Mr.X, сама задача состоит в том, что нужно отсортировать данные в экселе:

исходные данные
Миша 262,5
Аня 268,5
Лена 334,3
Слава 168,1

то, что надо получить
Лена 334,3
Аня 268,5
Миша 262,5
Слава 168,1

я просто спрашиваю, как это лучше всего сделать. Я видел много примеров на сортировку, но здесь то надо отсортировать строку, а не просто массив

Добавлено через 40 секунд
Catstail, а в экселе знаете как?
nstwf
86 / 76 / 30
Регистрация: 19.02.2016
Сообщений: 324
Завершенные тесты: 1
02.07.2016, 20:55     Cортировка файла по заданному полю #11
Blitzor DDD, ни разу не видел еще, как правильно открывать Excel файл в C++
Blitzor DDD
12 / 12 / 1
Регистрация: 17.08.2015
Сообщений: 439
02.07.2016, 20:58  [ТС]     Cортировка файла по заданному полю #12
nstwf, хорошо, а можно Вас попросить подправить программу так, чтобы она редактировала такой файл:
Слава
Миша
Аня
Лена
262,5
268,5
334,3
160,9

в такой:
Лена 334,3
Аня 268,5
Миша 262,5
Слава 168,1
Catstail
Модератор
 Аватар для Catstail
21501 / 10254 / 1670
Регистрация: 12.02.2012
Сообщений: 17,139
02.07.2016, 21:07     Cортировка файла по заданному полю #13
Цитата Сообщение от Blitzor DDD Посмотреть сообщение
Catstail, а в экселе знаете как?
- экслеле выделяешь диапазон ячеек, выбираешь "сортировка" и указываешь, по какой колонке сортировать. Только при чем здесь c/с++?
Blitzor DDD
12 / 12 / 1
Регистрация: 17.08.2015
Сообщений: 439
02.07.2016, 21:13  [ТС]     Cортировка файла по заданному полю #14
Catstail, да я просто думал, что эксель сортируют только раздельно и получилось бы так, что он отсортировал бы столбец с цифрами, а фамилии бы остались на месте. Поэтому подумал, что надо программу на Си писать
nstwf
86 / 76 / 30
Регистрация: 19.02.2016
Сообщений: 324
Завершенные тесты: 1
02.07.2016, 21:17     Cортировка файла по заданному полю #15
Цитата Сообщение от Blitzor DDD Посмотреть сообщение
Catstail, да я просто думал, что эксель сортируют только раздельно и получилось бы так, что он отсортировал бы столбец с цифрами, а фамилии бы остались на месте. Поэтому подумал, что надо программу на Си писать
Я думал, что вам нужно именно программу сортировать, конечно же, в Excel сортировать гораздо проще и удобнее.
Blitzor DDD
12 / 12 / 1
Регистрация: 17.08.2015
Сообщений: 439
02.07.2016, 21:48  [ТС]     Cортировка файла по заданному полю #16
nstwf, да, извиняюсь, что народ взбаламутил, но за программу все равно спасибо!
SergioO
02.07.2016, 21:56
  #17

Не по теме:

Цитата Сообщение от Catstail Посмотреть сообщение
экслеле выделяешь диапазон ячеек, выбираешь "сортировка" и указываешь, по какой колонке сортировать
тоже такая же первая мысль была
Цитата Сообщение от Blitzor DDD Посмотреть сообщение
nstwf, да, извиняюсь, что народ взбаламутил, но за программу все равно спасибо!

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2016, 07:05     Cортировка файла по заданному полю
Еще ссылки по теме:

C++ Сортировка массива структур по заданному полю
C++ Сортировка массива структур по заданному полю
C++ Реализовать сортировку массива структур по заданному полю

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

Или воспользуйтесь поиском по форуму:
Catstail
Модератор
 Аватар для Catstail
21501 / 10254 / 1670
Регистрация: 12.02.2012
Сообщений: 17,139
03.07.2016, 07:05     Cортировка файла по заданному полю #18
Цитата Сообщение от Blitzor DDD Посмотреть сообщение
да я просто думал, что эксель сортируют только раздельно
- Exel сортирует не более, чем по трем ключам. Но это ограничение почти всегда легко обойти. Предположим, нужно сортировать по 10 колонкам. Заводим рабочую колонку и формируем в ней ключ, равный простой строковой конкатенации этих десяти ключевых колонок. Потом сортируем по этой рабочей колонке. Что же до C++, то в составе MS Excel есть замечательный язык программирования - VBA. На нем эта задача решается десятком строк.
Yandex
Объявления
03.07.2016, 07:05     Cортировка файла по заданному полю
Ответ Создать тему
Опции темы

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