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

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

Восстановить пароль Регистрация
 
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
23.02.2013, 17:31     Структура: Выполните сортировку данных по номеру билета #1
Здраствуйте. Помогите пожалуйста, с этим заданием. Правильно ли я понимаю работу этой программы
Пояните работу непонятных мне строчек. В долгу не останусь + поставлю
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 минут
Что, никто не может помочь?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2013, 17:31     Структура: Выполните сортировку данных по номеру билета
Посмотрите здесь:

C++ Выполните сортировку элементов каждого столбца матрицы
C++ По заданным номеру масти и номеру достоинства карты определить полное название
C++ в case 7 - нужно сделать поиск по номеру группы, а в case 6 сортировку по имени
Не копируется структура C++ (по введеному номеру телефона удалить информацию из файла) C++
C++ Структура общежитие, сделать комплексную сортировку по наличию балкона + по площади припадающей на 1 жителя
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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/
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...
ya_noob
_
200 / 144 / 9
Регистрация: 08.10.2011
Сообщений: 432
24.02.2013, 09:15     Структура: Выполните сортировку данных по номеру билета #4
Цитата Сообщение от anubis1768 Посмотреть сообщение
,,Подготовьте массив указателей на student на 50 элементов.,,
вот это правильно?
правильно
Цитата Сообщение от anubis1768 Посмотреть сообщение
,,Для чтения каждой отдельной записи осуществите динамический захват памяти.,,
значит нужно создать динамический массив
в принципе да. но можно в цикле перед чтением очередной записи выделять память для очередной структуры student и присваивать адрес этой структуры элементу массива ptr[ i ].
Цитата Сообщение от anubis1768 Посмотреть сообщение
записали адреса структур в массив и сортируем указателы на структуры поле bilet
Сказали правильно, а вот сортировка реализована неправильно.
Цитата Сообщение от anubis1768 Посмотреть сообщение
Подскажите, правильно ли я рассуждаю
В общем правильно. допили только сортировку
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
25.02.2013, 18:01  [ТС]     Структура: Выполните сортировку данных по номеру билета #5
up.
Yandex
Объявления
25.02.2013, 18:01     Структура: Выполните сортировку данных по номеру билета
Ответ Создать тему
Опции темы

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