Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Blitzor DDD
13 / 13 / 1
Регистрация: 17.08.2015
Сообщений: 460
#1

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

02.07.2016, 19:47. Просмотров 247. Ответов 17
Метки нет (Все метки)

Всем привет!

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

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

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

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

Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.07.2016, 19:47
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Cортировка файла по заданному полю (C++):

Сортировка по заданному полю структуры
Вот моя программа... не могу понять почему не работает сортировка по дате......

Угрожает ли ладья заданному полю
Выполнить задание, используя условные операторы Поле шахматной доски...

Cортировка слов из файла в алфавитном порядке
Пользователь вводит имя файла, в котором в столбик записаны слова. Программа...

Сортировка массива структур по заданному полю
Задание под вариантом такое : Упорядочить список студентов по предмету физика,...

Сортировка массива структур по заданному полю
Здравствуйте. Нужна помощь в сортировке. Вот само задание: Составить...

Отсортировать массив структур по заданному полю
std::sort(line.begin(), line.end(), (const data &A, const data &B)->bool...

17
Catstail
Модератор
23525 / 11633 / 2034
Регистрация: 12.02.2012
Сообщений: 18,973
02.07.2016, 19:49 #2
На C++ ты умучишься это делать (из XLS-файла). Другое дело - из текстового файла.
0
Blitzor DDD
13 / 13 / 1
Регистрация: 17.08.2015
Сообщений: 460
02.07.2016, 20:10  [ТС] #3
Может можно иначе? В Экселе самом?
0
nstwf
88 / 78 / 56
Регистрация: 19.02.2016
Сообщений: 336
Завершенные тесты: 1
02.07.2016, 20:18 #4
Цитата Сообщение от Blitzor DDD Посмотреть сообщение
Может можно иначе? В Экселе самом?
Если в c++, делал похожее, но там была первая цифра.
Предлагаю сделать так:
Считать в структуру, а дальше менять местами и записывать, если есть наброски - кидай код.

Добавлено через 3 минуты
Сейчас попробую тебе пример написать.
0
Catstail
Модератор
23525 / 11633 / 2034
Регистрация: 12.02.2012
Сообщений: 18,973
02.07.2016, 20:22 #5
В Экселе это очень просто.
0
nstwf
88 / 78 / 56
Регистрация: 19.02.2016
Сообщений: 336
Завершенные тесты: 1
02.07.2016, 20:37 #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)
1
Blitzor DDD
13 / 13 / 1
Регистрация: 17.08.2015
Сообщений: 460
02.07.2016, 20:45  [ТС] #7
Catstail, не подскажете, где найти инфу?

nstwf, благодарю Вас действия и программу! Но тут остается два нюанса. Во-первых,
C++ (Qt)
1
windows.h
, у меня стоит Линукс, и во-вторых, более существенно, что считывать то надо из Экселя.. А в Вашем варианте считывание происходит из текстового файла, в таком случае мне придется аккуратно формировать исходный текстовый файл так, чтобы имя шло рядом с числом, а сами понимаете это канительно, потому что простым копипастом это не сделать....
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
02.07.2016, 20:47 #8
Цитата Сообщение от Blitzor DDD Посмотреть сообщение
Например, в исходном экселевском файле имеем:
Blitzor DDD, так в чем вопрос-то, как считать из экселевского файла или как отсортировать?
0
Catstail
Модератор
23525 / 11633 / 2034
Регистрация: 12.02.2012
Сообщений: 18,973
02.07.2016, 20:49 #9
В Линуксе из какого экселя? Из OpenOffice? С ним не работал.
0
Blitzor DDD
13 / 13 / 1
Регистрация: 17.08.2015
Сообщений: 460
02.07.2016, 20:51  [ТС] #10
Mr.X, сама задача состоит в том, что нужно отсортировать данные в экселе:

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

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

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

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

в такой:
Лена 334,3
Аня 268,5
Миша 262,5
Слава 168,1
0
Catstail
Модератор
23525 / 11633 / 2034
Регистрация: 12.02.2012
Сообщений: 18,973
02.07.2016, 21:07 #13
Цитата Сообщение от Blitzor DDD Посмотреть сообщение
Catstail, а в экселе знаете как?
- экслеле выделяешь диапазон ячеек, выбираешь "сортировка" и указываешь, по какой колонке сортировать. Только при чем здесь c/с++?
1
Blitzor DDD
13 / 13 / 1
Регистрация: 17.08.2015
Сообщений: 460
02.07.2016, 21:13  [ТС] #14
Catstail, да я просто думал, что эксель сортируют только раздельно и получилось бы так, что он отсортировал бы столбец с цифрами, а фамилии бы остались на месте. Поэтому подумал, что надо программу на Си писать
0
nstwf
88 / 78 / 56
Регистрация: 19.02.2016
Сообщений: 336
Завершенные тесты: 1
02.07.2016, 21:17 #15
Цитата Сообщение от Blitzor DDD Посмотреть сообщение
Catstail, да я просто думал, что эксель сортируют только раздельно и получилось бы так, что он отсортировал бы столбец с цифрами, а фамилии бы остались на месте. Поэтому подумал, что надо программу на Си писать
Я думал, что вам нужно именно программу сортировать, конечно же, в Excel сортировать гораздо проще и удобнее.
0
Blitzor DDD
13 / 13 / 1
Регистрация: 17.08.2015
Сообщений: 460
02.07.2016, 21:48  [ТС] #16
nstwf, да, извиняюсь, что народ взбаламутил, но за программу все равно спасибо!
0
SergioO
02.07.2016, 21:56
  #17

Не по теме:

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

0
Catstail
Модератор
23525 / 11633 / 2034
Регистрация: 12.02.2012
Сообщений: 18,973
03.07.2016, 07:05 #18
Цитата Сообщение от Blitzor DDD Посмотреть сообщение
да я просто думал, что эксель сортируют только раздельно
- Exel сортирует не более, чем по трем ключам. Но это ограничение почти всегда легко обойти. Предположим, нужно сортировать по 10 колонкам. Заводим рабочую колонку и формируем в ней ключ, равный простой строковой конкатенации этих десяти ключевых колонок. Потом сортируем по этой рабочей колонке. Что же до C++, то в составе MS Excel есть замечательный язык программирования - VBA. На нем эта задача решается десятком строк.
0
03.07.2016, 07:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2016, 07:05
Привет! Вот еще темы с решениями:

Сортировка массива (вектора) структур по заданному полю
Нужно отсортировать массив по полю структуры. Все поля типа string. struct...

Реализовать поиск в массиве структур по заданному полю
Есть структура #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;conio.h&gt;...

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

Реализовать сортировку массива структур по заданному полю
Помогите правильно отсортировать структуры по среднему балу и записать их в...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru