Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Blitzor DDD
13 / 13 / 1
Регистрация: 17.08.2015
Сообщений: 460
#1

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

02.07.2016, 19:47. Просмотров 221. Ответов 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++
Вот моя программа... не могу понять почему не работает сортировка по дате... #include<locale.h> #include<stdio.h> #include<conio.h> ...

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

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

Сортировка массива структур по заданному полю - C++
Здравствуйте. Нужна помощь в сортировке. Вот само задание: Составить таблицу, содержащую следующие сведения о сотрудниках кафедры: ...

Отсортировать массив структур по заданному полю - C++
std::sort(line.begin(), line.end(), (const data &A, const data &B)->bool {return A.all_place < B.all_place; }); Доброго времени суток....

Реализовать поиск в массиве структур по заданному полю - C++
Есть структура #include <iostream> #include <fstream> #include <conio.h> #include <iomanip> using namespace...

17
Catstail
Модератор
22904 / 11270 / 1832
Регистрация: 12.02.2012
Сообщений: 18,482
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
87 / 77 / 32
Регистрация: 19.02.2016
Сообщений: 336
Завершенные тесты: 1
02.07.2016, 20:18 #4
Цитата Сообщение от Blitzor DDD Посмотреть сообщение
Может можно иначе? В Экселе самом?
Если в c++, делал похожее, но там была первая цифра.
Предлагаю сделать так:
Считать в структуру, а дальше менять местами и записывать, если есть наброски - кидай код.

Добавлено через 3 минуты
Сейчас попробую тебе пример написать.
0
Catstail
Модератор
22904 / 11270 / 1832
Регистрация: 12.02.2012
Сообщений: 18,482
02.07.2016, 20:22 #5
В Экселе это очень просто.
0
nstwf
87 / 77 / 32
Регистрация: 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
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
02.07.2016, 20:47 #8
Цитата Сообщение от Blitzor DDD Посмотреть сообщение
Например, в исходном экселевском файле имеем:
Blitzor DDD, так в чем вопрос-то, как считать из экселевского файла или как отсортировать?
0
Catstail
Модератор
22904 / 11270 / 1832
Регистрация: 12.02.2012
Сообщений: 18,482
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
87 / 77 / 32
Регистрация: 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
Модератор
22904 / 11270 / 1832
Регистрация: 12.02.2012
Сообщений: 18,482
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
87 / 77 / 32
Регистрация: 19.02.2016
Сообщений: 336
Завершенные тесты: 1
02.07.2016, 21:17 #15
Цитата Сообщение от Blitzor DDD Посмотреть сообщение
Catstail, да я просто думал, что эксель сортируют только раздельно и получилось бы так, что он отсортировал бы столбец с цифрами, а фамилии бы остались на месте. Поэтому подумал, что надо программу на Си писать
Я думал, что вам нужно именно программу сортировать, конечно же, в Excel сортировать гораздо проще и удобнее.
0
02.07.2016, 21:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2016, 21:17
Привет! Вот еще темы с ответами:

Сортировка массива (вектора) структур по заданному полю - C++
Нужно отсортировать массив по полю структуры. Все поля типа string. struct DatabaseData{ std::string aPointOfDeparture;//Пункт...

Реализовать сортировку массива структур по заданному полю - C++
Помогите правильно отсортировать структуры по среднему балу и записать их в файл структура: struct student { char name; int...

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

Std::min_element по заданному полю массива структур - C++
Есть структура Point{double x,y}. Есть вектор vector&lt;Point&gt;. Как правильно определить функцию сравнения точек по заданной координате...


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

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

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