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

Stl отсортировать структуру - C++

Восстановить пароль Регистрация
 
 
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
03.03.2014, 10:12     Stl отсортировать структуру #1
вообщем есть задача:
Написать функцию, которая читает данные о ноутбуках из файла 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 Кб, 3 просмотров)
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
03.03.2014, 13:34     Stl отсортировать структуру #21
Цитата Сообщение от dzrkot Посмотреть сообщение
только как теперь бинарник переводить обратно не представляю
Абсолютно так же как и записывать, только использовать метод read.
Если модифицировать ваш код то вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void writeFile(vector<NOTEBOOK>& a, ifstream &in)
{
vector<NOTEBOOK>::iterator iter_a;    
int i=0;                               
unsigned short counter =(a.size());
in.read(reinterpret_cast<char*> (&counter), sizeof(short));
    for(iter_a=a.begin();iter_a!=a.end();iter_a++)      
    {
    in.read(reinterpret_cast<char*> (&a[i]), sizeof(NOTEBOOK));
    i++;
    }
}
Только не забываем обеспечить приемлемую вместимость вектора.

Добавлено через 5 минут
Не заметил - обязательно заменить поток на ifstream.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
03.03.2014, 13:41  [ТС]     Stl отсортировать структуру #22
Цитата Сообщение от Ilot Посмотреть сообщение
Не заметил - обязательно заменить поток на ifstream.
да да я заметил, у меня были все 0 пока я не догадался out.close(); сделать)
ещё раз спасибо)
GetLucky
0 / 0 / 0
Регистрация: 03.09.2014
Сообщений: 87
24.10.2014, 13:33     Stl отсортировать структуру #23
dzrkot, можете подсказать что переделать, что-бы вывести только те у которых частота, к примеру больше 4?
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
24.10.2014, 13:37  [ТС]     Stl отсортировать структуру #24
Цитата Сообщение от GetLucky Посмотреть сообщение
dzrkot, можете подсказать что переделать, что-бы вывести только те у которых частота, к примеру больше 4?
вероятно добавить if( частота > 4) ...
хотя я бы посоветовал читать книги.
GetLucky
0 / 0 / 0
Регистрация: 03.09.2014
Сообщений: 87
24.10.2014, 13:39     Stl отсортировать структуру #25
dzrkot, по поводу условия, это ясно. Можно конкретнее указать где? Просто до конца не могу разобрать Ваш код. Извините, только начинаю. Что с книг посоветуете?
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
24.10.2014, 13:42  [ТС]     Stl отсортировать структуру #26
Цитата Сообщение от GetLucky Посмотреть сообщение
Извините, только начинаю. Что с книг посоветуете?
Лично я посоветую С.Прата Язык программирования С++.
В функции void show(vector<NOTEBOOK> &a) надо добавить 1 строчку)
GetLucky
0 / 0 / 0
Регистрация: 03.09.2014
Сообщений: 87
24.10.2014, 13:46     Stl отсортировать структуру #27
dzrkot,
C++
1
2
3
4
5
6
7
8
9
10
11
12
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()... вообщем почти тоже самое что и обычный цикл
    {
        if (a[i].f>4){
    cout<<"Display resolution : "<<a[i].disp.x<<" x "<<a[i].disp.y<<endl<<"Frequency : "<<a[i].f<<endl<<"Display size : "<<a[i].d<<endl<<"Price : "<<a[i].price<<endl<<"Model : "<<a[i].model<<endl<<endl;
    i++;    // итерируем счетчик
        }
    }
}
Добавил вот так. Можно как-то сделать что-бы только при сортировке выводило те которые больше 4.
Сейчас же даже с файла выбирает только те кто у которых частота больше 4.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2014, 13:52     Stl отсортировать структуру
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
24.10.2014, 13:52  [ТС]     Stl отсортировать структуру #28
Цитата Сообщение от GetLucky Посмотреть сообщение
Добавил вот так. Можно как-то сделать что-бы только при сортировке выводило те которые больше 4.
Сейчас же даже с файла выбирает только те кто у которых частота больше 4.
можно. С.Прата вам поможет!
Yandex
Объявления
24.10.2014, 13:52     Stl отсортировать структуру
Ответ Создать тему
Опции темы

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