Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041

Stl отсортировать структуру

03.03.2014, 10:12. Показов 2689. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
вообщем есть задача:
Написать функцию, которая читает данные о ноутбуках из файла note.txt в структуру приведенного вида. Написать функцию, которая записывает содержимое структуры в конец бинарного файла. Структура бинарного файла: первые два байта - целое число записей в файле, далее записи в формате структуры NOTEBOOK.
Написать программу, в которой на основе разработанных функций осуществляется запись в двоичный файл данных о ноутбуках, отсортированных в порядке уменьшения тактовой частоты процессора.
я закрыл глаза на то, что в задачи про видеопамять нигде не упоминается, это опускаем.

вообщем как сделать сортировку по частоте при помощи STL? Не хочу делать топорно, всётаки STL пытаюсь освоить, и что касается записи в бинарный файл, тоже как это сделать через write? ну или другие варианты

за обилие комментариев прошу прощение - делаю для человека, который 0 в программировании

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 <vector>
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
 
struct NOTEBOOK{
    struct disp_res{
    int x;              // разрешение экрана
    int y;              //
    };
disp_res disp;
int f;          // частота
float d;        // диагональ
int price;      // цена
char model[21]; // название
};
 
// функция которой мы считываем файл в массив структур NOTE
void readNote(vector<NOTEBOOK> &a, ifstream& in)
{
string str;                 // буфер для хранения считываемой информации
NOTEBOOK n;                 // структура, в которую мы считываем данные из потока in
 
    while (!in.eof())
    {
    in>>str;                        // считываем до первого пробела в str
    n.disp.x=atoi(str.c_str());     // преобразуем тип string в тип int с помощью функции atoi и записываем в n.disp.x
 
    in>>str;
    n.disp.y=atoi(str.c_str());     // аналогично
 
    in>>str;
    n.f=atoi(str.c_str());          // всё тоже самое
 
    in>>str;
    n.d=float(atof(str.c_str()));   // преобразуем функцией atof стринг в double, а затем в float и записываем в
 
    in>>str;
    n.price=atoi(str.c_str());      // аналогично с 1ыми
 
    in>>str;
    strcpy(n.model,str.c_str());    // здесь мы тип string приводим к типу char* методом c_str()(т.к. функции strpy принимает только char* - указатель на char) а затем вызываем функцию strcpy
                                    // которая копирует str в массив символов model[21]
 
    a.push_back(n);              // добавляем в наш контейнер структуру n - метод push_back добавляет структуру в конецочереди, т.е. это аналогиятого
                                 // как мы кладём вещи в коробку - первая вещь будет снизу, т.е. 0, вторая будет над ней, т.е. 1 и т.д.
    }
}
 
// функция для простмотра вектора с структурами
void show(vector<NOTEBOOK> &a)
{
vector<NOTEBOOK>::iterator iter_a;      // создаем итератор для прохода по вектору со структурами, итератор - это своеобразный указатель, используемый для STL контекнеров, советую почитать, там всё просто
int i=0;        // просто счетчик для отображения номера структуры
    for(iter_a=a.begin();iter_a!=a.end();iter_a++)  // цикл - начинается с указателя a.begin() - начала ветора, и продолжается до a.end()... вообщем почти тоже самое что и обычный цикл
    {
    cout<<"Разрешение экрана : "<<a[i].disp.x<<" x "<<a[i].disp.y<<endl<<"Частота ГГц : "<<a[i].f<<endl<<"Диагональ экрана : "<<a[i].d<<endl<<"Цена : "<<a[i].price<<endl<<"Модель : "<<a[i].model<<endl<<endl;
    i++;    // итерируем счетчик
    }
}
 
int main()
{
setlocale(LC_ALL, "Russian");
ifstream in("note.txt");
vector <NOTEBOOK> a;
 
readNote(a,in);     // считываем в а данные из note.txt
show(a);            // выводим записанные данные
 
return 0;
}
Вложения
Тип файла: rar AleksandraVasil_2_free.rar (259.5 Кб, 4 просмотров)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.03.2014, 10:12
Ответы с готовыми решениями:

как отсортировать файл с STL
имеются два файла, в одном файле в первой строке: &quot;SANTA CLAUS&quot; Во второй &quot;DED MOROZ&quot; В третьей набор букв:...

как отсортировать стек через stl контейнеры
Подскажите пожалуйста как отсортировать стек с помощью stl контейнеров

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

27
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
03.03.2014, 10:52
эм а определить операцию сравнения 2х записей по полю тактовой частоты и ее в qsort например
1
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
03.03.2014, 10:53  [ТС]
Цитата Сообщение от aLarman Посмотреть сообщение
эм а определить операцию сравнения 2х записей по полю тактовой частоты и ее в qsort например
вот это я и хочу сделать, но не особо нашёл как это будет выглядеть
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
03.03.2014, 10:57
C++
1
2
3
4
bool Compare(NOTEBOOK first, NOTEBOOK second)
{
return first.freq < second.freq;
}
freq поле с частотой
1
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
03.03.2014, 10:58  [ТС]
всё вроде нашёл, копал не в ту сторону
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
03.03.2014, 11:00
или
C++
1
2
3
4
struct Compare
{
bool operator()(NOTEBOOK first, NOTEBOOK second) { return first.freq  < second.freq;}
}
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2222 / 1424 / 419
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
03.03.2014, 11:02
Цитата Сообщение от dzrkot Посмотреть сообщение
и что касается записи в бинарный файл, тоже как это сделать через write?
Вы же используете файловый поток. Тогда в чем вопрос?
Цитата Сообщение от dzrkot Посмотреть сообщение
вообщем как сделать сортировку по частоте при помощи STL?
Стандартный алгоритм sort со своим бинарным предикатом.
C++
1
2
3
4
5
6
7
  template <class _Tp>
    struct compare : public binary_function<_Tp, _Tp, _Tp>
    {
      bool
      operator()(const _Tp& x, const _Tp& y) const
      { return x.f < y.f; }
    };
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
03.03.2014, 11:08
Цитата Сообщение от Ilot Посмотреть сообщение
template <class _Tp>
Что ж вас так тянет-то использовать имена, начинающиеся с подчеркивания?! Да еще и с последующей заглавной буквой.
0
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
03.03.2014, 11:12  [ТС]
Цитата Сообщение от Ilot Посмотреть сообщение
Стандартный алгоритм sort со своим бинарным предикатом.
Код C++
C++
1
2
3
4
5
6
7
template <class _Tp>
 struct compare : public binary_function<_Tp, _Tp, _Tp>
 {
 bool
 operator()(const _Tp& x, const _Tp& y) const
 { return x.f < y.f; }
 };
эм..вы со мной разговаривали?) я ещё не настолько крут в С++ чтобы понять)

Добавлено через 1 минуту
Цитата Сообщение от Ilot Посмотреть сообщение
public binary_function<_Tp, _Tp, _Tp>
вот этого не понял просто)
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2222 / 1424 / 419
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
03.03.2014, 11:14

Не по теме:

Tulosba, просто я ленивый. Для ответа на вопрос мне проще открыть реализацию своего компилятора и малось подправить имеющийся там код.


Цитата Сообщение от dzrkot Посмотреть сообщение
эм..вы со мной разговаривали?) я ещё не настолько крут в С++ чтобы понять)
Спасибо потешили старичка. Уж я то точно не крут в с++... пока...
Из моего компилятора:
C++
1
2
3
4
5
6
7
8
9
  template <class _Arg1, class _Arg2, class _Result>
    struct binary_function
    {
      typedef _Arg1 first_argument_type;   ///< the type of the first argument
                                           ///  (no surprises here)
 
      typedef _Arg2 second_argument_type;  ///< the type of the second argument
      typedef _Result result_type;         ///< type of the return type
    };
1
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
03.03.2014, 11:29  [ТС]
Цитата Сообщение от Ilot Посмотреть сообщение
Вы же используете файловый поток. Тогда в чем вопрос?
вопрос в том, что я этого ни разу не делал и ищу примеры...а вообще я не особо представляю что будет на выходе, я так понял что там будет всякая бинарная абракадабра)

Добавлено через 6 минут
или обычный .тхт....? что от меня хотят в задании?))
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2222 / 1424 / 419
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
03.03.2014, 11:38
Лучший ответ Сообщение было отмечено dzrkot как решение

Решение

От вас хотят именно бинарный файл. Сперва вы записываете число типа short - количество записей:
C++
1
2
unsigned short count;
out.write(reinterpret_cast<char*>&count, sizeof(short));
Далее в цикле заносите структуры в файл:
C++
1
2
for (int i = 0; i < count; ++i)
out.write(reinterpret_cast<char*>&a[i], sizeof(NOTEBOOK));
Открываете файл как бинарный:
C++
1
ofstream out("имя файла", ios::bin);
1
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
03.03.2014, 11:48  [ТС]
Цитата Сообщение от Ilot Посмотреть сообщение
ofstream out("имя файла", ios::bin);
ругается на bin , с binary всё ок)

сделал функцию так, в самом бинарнике получаю
4 ђ   pAА] Pentium ию" я" 0 @ ˜ь" @ И  €A N Asus ию" я" 0 @ ˜ь"
*  ˜A { Intel ию" я" 0 @ ˜ь"  8  €AHq Lenovo ию" я" 0 @ ˜ь"

я так поимаю что это норм?))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void writeFile(vector<NOTEBOOK> a, ofstream &out)
{
out<<a.size();
vector<NOTEBOOK>::iterator iter_a;    
int i=0;                               
unsigned short counter =(a.size());
out.write(reinterpret_cast<char*> (&counter), sizeof(a.size()));
    for(iter_a=a.begin();iter_a!=a.end();iter_a++)      
    {
    out.write(reinterpret_cast<char*> (&a[i]), sizeof(NOTEBOOK));
    i++;
    }
}
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2222 / 1424 / 419
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
03.03.2014, 11:54
C++
1
out.write(reinterpret_cast<char*> (&counter), sizeof(a.size()));
В оператор sizeof необходимо передавать размер типа short, а вы передаете size_t.
Цитата Сообщение от dzrkot Посмотреть сообщение
сделал функцию так, в самом бинарнике получаю
4 ђ   pAА] Pentium ию" я" 0 @ ˜ь" @ И  €A N Asus ию" я" 0 @ ˜ь"
*  ˜A { Intel ию" я" 0 @ ˜ь"  8  €AHq Lenovo ию" я" 0 @ ˜ь"
я так поимаю что это норм?))
Нельзя так просто открыть бинарный файл. Впринципе это норма. Для чтения информации из бинарного файла пользуйтесь знанием его структуры.
0
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
03.03.2014, 11:58  [ТС]
Цитата Сообщение от Ilot Посмотреть сообщение
Нельзя так просто открыть бинарный файл. Впринципе это норма. Для чтения информации из бинарного файла пользуйтесь знанием его структуры.
ну в задании нету чтения из бинарника, но ради любопытства я попробую читать его и переводить обратно
Цитата Сообщение от Ilot Посмотреть сообщение
В оператор sizeof необходимо передавать размер типа short, а вы передаете size_t.
оу, спасибо))


только как теперь бинарник переводить обратно не представляю
0
Заблокирован
03.03.2014, 12:03
мне лень читать две страницы троллинга, напиши в двух словах, что тебе надо сделать - накидаю код.
0
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
03.03.2014, 12:28  [ТС]
Цитата Сообщение от THE--MASTER Посмотреть сообщение
мне лень читать две страницы троллинга, напиши в двух словах, что тебе надо сделать - накидаю код.
прочитать из бинарника обратно в структуры NOTEBOOK к примеру в vector<NOTEBOOK> b

Добавлено через 9 минут
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
#include <iostream>
#include <vector>
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
 
struct NOTEBOOK{
    struct disp_res{
    int x;              // разрешение экрана
    int y;              //
    };
disp_res disp;
int f;          // частота
float d;        // диагональ
int price;      // цена
char model[21]; // название
};
 
// функция которой мы считываем файл в массив структур NOTE
void readNote(vector<NOTEBOOK> &a, ifstream& in)
{
string str;                 // буфер для хранения считываемой информации
NOTEBOOK n;                 // структура, в которую мы считываем данные из потока in
 
    while (!in.eof())
    {
    in>>str;                        // считываем до первого пробела в str
    n.disp.x=atoi(str.c_str());     // преобразуем тип string в тип int с помощью функции atoi и записываем в n.disp.x
 
    in>>str;
    n.disp.y=atoi(str.c_str());     // аналогично
 
    in>>str;
    n.f=atoi(str.c_str());          // всё тоже самое
 
    in>>str;
    n.d=float(atof(str.c_str()));   // преобразуем функцией atof стринг в double, а затем в float и записываем в
 
    in>>str;
    n.price=atoi(str.c_str());      // аналогично с 1ыми
 
    in>>str;
    strcpy(n.model,str.c_str());    // здесь мы тип string приводим к типу char* методом c_str()(т.к. функции strpy принимает только char* - указатель на char) а затем вызываем функцию strcpy
                                    // которая копирует str в массив символов model[21]
 
    a.push_back(n);              // добавляем в наш контейнер структуру n - метод push_back добавляет структуру в конецочереди, т.е. это аналогиятого
                                 // как мы кладём вещи в коробку - первая вещь будет снизу, т.е. 0, вторая будет над ней, т.е. 1 и т.д.
    }
}
 
// функция для простмотра вектора с структурами
void show(vector<NOTEBOOK> &a)
{
vector<NOTEBOOK>::iterator iter_a;      // создаем итератор для прохода по вектору со структурами, итератор - это своеобразный указатель, используемый для STL контекнеров, советую почитать, там всё просто
int i=0;        // просто счетчик для отображения номера структуры
    for(iter_a=a.begin();iter_a!=a.end();iter_a++)  // цикл - начинается с указателя a.begin() - начала ветора, и продолжается до a.end()... вообщем почти тоже самое что и обычный цикл
    {
    cout<<"Разрешение экрана : "<<a[i].disp.x<<" x "<<a[i].disp.y<<endl<<"Частота ГГц : "<<a[i].f<<endl<<"Диагональ экрана : "<<a[i].d<<endl<<"Цена : "<<a[i].price<<endl<<"Модель : "<<a[i].model<<endl<<endl;
    i++;    // итерируем счетчик
    }
}
 
// эту функцию мы передаем в sort , для ьтого, чтобы отсортировать вектор а по частоте
bool Compare(NOTEBOOK obj1, NOTEBOOK obj2)
{
return obj1.f > obj2.f;
}
 
void writeFile(vector<NOTEBOOK> a, ofstream &out)
{
out<<a.size();
vector<NOTEBOOK>::iterator iter_a;      // создаем итератор для прохода по вектору со структурами
int i=0;                                // просто счетчик для отображения номера структуры
unsigned short counter =(a.size());     // переменная 2 байта, хранящая кол-во структур NOTEBOOK
out.write(reinterpret_cast<char*> (&counter), sizeof(unsigned short ));    // записываем 2 байта с кол-вом структур в файл
    for(iter_a=a.begin();iter_a!=a.end();iter_a++)      // цикл
    {
    out.write(reinterpret_cast<char*> (&a[i]), sizeof(NOTEBOOK));   // записываем в файл
    i++;
    }
}
 
int main()
{
setlocale(LC_ALL, "Russian");
ifstream in("note.txt");
ofstream out("result",ios::binary);
vector <NOTEBOOK> a;
 
readNote(a,in);     // считываем в а данные из note.txt
show(a);            // выводим записанные данные
 
sort(a.begin(),a.end(),Compare);    // сортируем а по частоте f
cout<<"\nСортировка по убыванию частоты : \n\n";
show(a);            // выводим записанные данные
 
writeFile(a,out);
 
return 0;
}
0
Заблокирован
03.03.2014, 12:59
где бинарник?
0
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
03.03.2014, 13:03  [ТС]
Цитата Сообщение от dzrkot Посмотреть сообщение
ofstream out("result",ios::binary);
вот он
0
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
03.03.2014, 13:13  [ТС]
вот сам проект
Вложения
Тип файла: rar AleksandraVasil_2_free.rar (281.7 Кб, 8 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.03.2014, 13:13
Помогаю со студенческими работами здесь

Создать stl очередь, заполнить ее случайным образом и отсортировать
вопрос в заголовке, заранее спасибо.

STL Заполнить массив размером 10 случайными числами от 0 до 10, отсортировать его по убыванию и вывести
Заполнить массив размером 10 случайными числами от 0 до 10, отсортировать его по убыванию и вывести в выходной поток. Добавлено через...

отсортировать структуру
Всем привет, вот такой вопрос, не получается правильно отсортировать следующую структуру по z координате vector&lt;Quaternion&gt;q;...

Отсортировать структуру
Задание такое Описать структуру с именем Train содержащую следующие поле. nazn-название пункта назначения numr -номер поезда ...

Отсортировать структуру
Начал изучать структуры. Разобрался как вводить и выводить, но при попытке вывести через отдельную функцию не выводится первой символ....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод Сайт называется reddit: The Thinkpad X220 Tablet is the best budget school laptop period. Это. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru