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

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

Войти
Регистрация
Восстановить пароль
 
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
#1

Структура: Выполните сортировку данных по номеру билета - C++

23.02.2013, 17:31. Просмотров 533. Ответов 4
Метки нет (Все метки)

Здраствуйте. Помогите пожалуйста, с этим заданием. Правильно ли я понимаю работу этой программы
Пояните работу непонятных мне строчек. В долгу не останусь + поставлю
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
#include <iostream>
#include <stdio.h>
#include <iomanip>
#include <cstdlib>
#define STRLEN 20
using namespace std;
#pragma pack (1)
struct student
{
    char name[STRLEN];
    int bilet;
    char tip[STRLEN];
    int age;
};
 
struct student** arr; //создаем указатель на указатель на структуру
struct student* tmp;//создаем указатель на структуру
 
int main()
{
    int i;
    int size=50;
    arr=new struct student*[size];//виделяем память в куче для массива указателей
    arr[0]=new struct student[size]; //виделяем память в куче для массива структур
    for (int i=0; i<size; i++) arr[i]=arr[0]+i;  //тут не понятно
 
     FILE* f;
    if((f = fopen("5.dat", "rb+")) == NULL) { printf("Oshibka pri otkrytii fajla.\n"); exit(1); }
    for (i=0; i<size; i++) 
    fread(arr[0]+i, sizeof(struct aeroflot), size, f); //вот эту строку еще поясните пожалуйста 
    fclose(f);
    for (i=0; i<size; i++) 
        for (int j=0; j<size-i-1; j++)            //Г®почему именно такой извращенный цикл? зачем?
            if ( (arr[j]->bilet)>(arr[j+1]->bilet) ){ //операция arr[j] возвращает указатель на структуру, верно?
                                                                         //поэтому мы здесь ставим оператор ->
                tmp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=tmp;
            }
 
 
for ( i=0; i<size; i++) 
{
              cout << "Po nomeru: " << arr[i]->bilet << endl;
              cout << "--------------------" << endl;
      
}
 
delete[] arr[0];
delete[] arr;
system("PAUSE>NULL");
}
само задание:
Подготовьте массив указателей на student на 50 элементов.
Считайте все записи из файла "5.dat" .
Для чтения каждой отдельной записи осуществите динамический захват памяти.
Соответствующий адрес храните в массиве указателей.
Выполните сортировку данных по номеру билета - причем сортировать потребуется только указатели в массиве.
Выведите отсортированнный массив.

Если не трудно, то напишите открытые файла через С++ класс ifstream, работу которого я более менее понимаю. У меня самого не получаеться вот код:
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
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstdlib>
 
#define STRLEN 20
#pragma pack (1)
struct student
{
    int bilet;
    std::string name;
    std::string tip;
    int age;
};
#pragma pack()
 
struct AEROFLOT** arr;
struct AEROFLOT* tmp;
struct AEROFLOT *pxas = new AEROFLOT[50];
 
int main(int argc, char** argv) {
    setlocale(LC_ALL, "Russian");
    std::ifstream text( "5.dat" );
    int size = 3;
    int temp;
    int min = 100000;
    std::string szstring;
    int i = 0;
    while( !text.eof() ) {
        text >> temp;
        pxas[i].bilet = temp;
        text >> szstring;
        pxas[i].name = szstring;
        text >> szstring;
        pxas[i].tip = szstring;
        text >> temp;
        pxas[i].age = temp;
        if( pxas[i].age < min )
            min = pxas[i].age;
        i++;    
    }
    for( int j = 0; j < i; j++ ) {
        arr[j] = &pxas[j];
    }
    
    for( int j = 0; j < i; j++) {
            if ( (arr[j]->bilet ) > ( arr[j+1]->bilet) ) {
                tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
            
    for ( i = 0; i < size; i++) {
        std::cout << "Po nomeru: " << arr[i]->bilet << std::endl;
        std::cout << "--------------------" << std::endl;
    }
    return 0;
}
Помогите пожалуйста

Добавлено через 42 минуты
up...

Добавлено через 1 час 7 минут
Что, никто не может помочь?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2013, 17:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Структура: Выполните сортировку данных по номеру билета (C++):

Выполнить сортировку данных по номенклатурному номеру - C++
Подготовьте массив указателей на PRICE на 50 элементов. Считайте все записи из файла &quot;8.dat&quot; . Для чтения каждой отдельной записи...

Выполните сортировку вещественного массива методом выбора - C++
Помогите пожалуйста решить пару задач по C++! 1)Выполните сортировку вещественного массива методом выбора: выбирается наименьший элемент...

Выполните сортировку элементов каждого столбца матрицы - C++
Дано натуральное n. Для n, вводимого с клавиатуры получите действительную квадратную матрицу порядка n, вычислив ее элементы по формуле: ...

Не копируется структура C++ (по введеному номеру телефона удалить информацию из файла) - C++
Рабочий код: Структура в заголовочном файле: struct contact{ int ID; std::string Name; std::string Surname; std::string...

Структура общежитие, сделать комплексную сортировку по наличию балкона + по площади припадающей на 1 жителя - C++
Такое задание: дана структура общежитие, сделать комплексную сортировку по наличию балкона + по площади припадающей на 1 жителя! ...

в case 7 - нужно сделать поиск по номеру группы, а в case 6 сортировку по имени - C++
Помогите пожалуйста: в case 7 - нужно сделать поиск по номеру группы, а в case 6 сортировку по имени #include &lt;iostream&gt; #include...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MrGrig
176 / 159 / 2
Регистрация: 08.10.2012
Сообщений: 422
23.02.2013, 18:23 #2
Цитата Сообщение от anubis1768 Посмотреть сообщение
struct student** arr; //создаем указатель на указатель на структуру
struct student* tmp;//создаем указатель на структуру
Цитата Сообщение от anubis1768 Посмотреть сообщение
arr=new struct student*[size];//виделяем память в куче для массива указателей
* * arr[0]=new struct student[size]; //виделяем память в куче для массива структур
не совсем уверен нужно ли дописывать struct каждый раз. Хватит и такого.
student** arr;
struct student* tmp;

arr=new student*[size];
arr[0]=new student[size];

теперь дальше.

Цитата Сообщение от anubis1768 Посмотреть сообщение
C++
1
2
for (int i=0; i<sze; i++) 
    arr[i]=arr[0]+i;
в предыдущем шаге мы выделили память указателю на массив arr[0]. Смысловой нагрузки нет в цикле. потому что к указателю на массив, идет попытка записать число. компилятор должен ругаться про невозможность приведения типов. Возможно тут идет попытка каждому указателю на массив присвоить указатель на первый массив.

Цитата Сообщение от anubis1768 Посмотреть сообщение
C++
1
fread(arr[0]+i, sizeof(struct aeroflot), size, f);
http://www.cplusplus.com/reference/cstdio/fread/
тут видимо опять попытка в цикле заполнить каждую строчку массива. Но если то что выше верно, то данные будут затираться и выйдет каша.


Цитата Сообщение от anubis1768 Посмотреть сообщение
C++
1
2
for (i=0; i<size; i++) 
* * * * for (int j=0; j<size-i-1; j++)
* * * * * *//опочему именно такой извращенный цикл? зачем?
врать не буду не знаю оО

Цитата Сообщение от anubis1768 Посмотреть сообщение
C++
1
if ( (arr[j]->bilet)>(arr[j+1]->bilet) ){ //операция arr[j] возвращает указатель на структуру, верно?
не совсем так. если был бы arr одномерным массивом, товернулся бы указатель на значение bilet объекта arr[i].
а так я даже и не знаю что вернётся, мусор. А скорее всего компилятор ошибку выдаст.
оператор точка дает нам доступ к отрытым частям структуры/класса, если мы имеем объект.
оператор -> дает тоже самое, если у нас не объект а указатель на него.

Цитата Сообщение от anubis1768 Посмотреть сообщение
Если не трудно, то напишите открытые файла через С++ класс ifstream, работу которого я более менее понимаю. У меня самого не получаеться вот код:
на счет этого опять же только ссылку могу дать, сам не часто ей в сях пользуюсь
http://www.cplusplus.com/reference/fstream/ifstream/
1
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
23.02.2013, 22:51  [ТС] #3
Спасибо и на том. Просто суть задания мне не ясна. Не то что я плохо усвоил тему указателы, но задание какое то мутное. Вообще его не понял.
,,Подготовьте массив указателей на student на 50 элементов.,,
вот это правильно?
C++
1
student *ptr[50];
они сохраняются на стеке. Потом
,,Для чтения каждой отдельной записи осуществите динамический захват памяти.,,
значит нужно создать динамический массив и в него зчитать информацию из файла
C++
1
student *newptr = new student[50];
Считали данные и теперь надо адрес считанных структур присвоить тому массиву указателей что мы создали на стеке
C++
1
2
for(int i = 0; i < 50; i++)
ptr[i] = newptr[i];
записали адреса структур в массив и сортируем указателы на структуры поле bilet
C++
1
2
3
4
5
6
7
8
student *temp;
for(int i = 0; i < 50; i++){
if( ptr[i]->bilet > ptr[i+1]->bilet){
temp = ptr[i];
ptr[i] = ptr[i+1];
ptr[i+1] = temp;
}
}
ну и выводим поля на екран... Подскажите, правильно ли я рассуждаю, или это (скорее всего да) полнейший бред

Добавлено через 1 час 39 минут
Что, нету людей которые бы разьяснили? Я очень запутался

Добавлено через 2 часа 19 минут
up...
0
ya_noob
_
201 / 145 / 9
Регистрация: 08.10.2011
Сообщений: 432
24.02.2013, 09:15 #4
Цитата Сообщение от anubis1768 Посмотреть сообщение
,,Подготовьте массив указателей на student на 50 элементов.,,
вот это правильно?
правильно
Цитата Сообщение от anubis1768 Посмотреть сообщение
,,Для чтения каждой отдельной записи осуществите динамический захват памяти.,,
значит нужно создать динамический массив
в принципе да. но можно в цикле перед чтением очередной записи выделять память для очередной структуры student и присваивать адрес этой структуры элементу массива ptr[ i ].
Цитата Сообщение от anubis1768 Посмотреть сообщение
записали адреса структур в массив и сортируем указателы на структуры поле bilet
Сказали правильно, а вот сортировка реализована неправильно.
Цитата Сообщение от anubis1768 Посмотреть сообщение
Подскажите, правильно ли я рассуждаю
В общем правильно. допили только сортировку
1
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
25.02.2013, 18:01  [ТС] #5
up.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2013, 18:01
Привет! Вот еще темы с ответами:

Реализовать поиск и сортировку по заданному полю в массиве объектов пользовательского типа (структура Train) - C++
Описать структуру с именем TRAIN, содержащую следующие поля: NAZV - название пункта назначения, NUMR - номер поезда, DATE - дата отправки,...

Сортировку вставками меняем на Пирамидальную сортировку и на Сортировку подсчётом - C++
Здравствуйте. Я не как не могу разобраться.Помогите. У меня есть листинг сортировки вставками: #include &quot;stdafx.h&quot; #include...

Структура "Автобус". Организовать поиск по номеру маршрута - C++
Описать структуру AVTO. которая содержит следующие поля: номер автобуса, номер маршрута, фамилия водителя. Организовать поиск по номеру...

Структура "Студент", вывести список студентов упорядоченный по порядковому номеру - C++
Cоздать структуру Student.Она должна включать в себя 3 поля: Порядковый номер , 5 оценок студента, ФИО. Нужно чтобы выводила список...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.02.2013, 18:01
Ответ Создать тему
Опции темы

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