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

структуру AEROFLOT - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.79
mr_aleks
0 / 0 / 0
Регистрация: 13.10.2011
Сообщений: 118
09.04.2012, 18:59     структуру AEROFLOT #1
Сформировать структуру AEROFLOT для хранения следующей информации:

· номер рейса;

· название пункта назначения рейса;

· тип самолета;

· цена билета.



Ввести с клавиатуры информацию для нескольких рейсов (к-во заранее не определено) и сохранить ее в бинарном файле "5.dat".

Подготовьте файл, в котором будет не менее 20 корректных записей.
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
#include <iostream>
#include <stdio.h>
#include <iomanip>
using namespace std;
void main(void)
{
    struct AEROFLOT
    {
        int reis; char punkt[100];
        char tip[100]; int cena;
    }*px;
    int size;
    char punkt[100];
    cout << "Vvedite kolichestvo struktur: ";
    cin >> size; cout << "--------------------" << endl;
    AEROFLOT *pxas=new AEROFLOT[size]; px=&pxas[0];
    int i; FILE *f1;
    f1=fopen("5.dat","wb");
    for ( i=0; i<size; i++)
    {
        cin.ignore();
        cout << "Vvedite dannye: " << i+1 << endl;
        cout << "Nazvanie punkta naznachenija rejsa: "; gets(px[i].punkt); 
        cout << "Tip samoleta: "; gets(px[i].tip); 
        cout << "Nomer rejsa: "; cin >> px[i].reis;
        cout << "Cena bileta: ";  cin >> px[i].cena;
        cout << "--------------------" << endl;
        fwrite(&px[i],sizeof(AEROFLOT),1,f1);
    } fclose(f1);
    system("PAUSE");
}
Но она не правильно по мойму... т.к. не правильно выводит записи из файла в след. проге
Толи что то в обьявлении типов или еще где (
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
10.04.2012, 20:58     структуру AEROFLOT #21
Цитата Сообщение от p_r_a_g_m_a Посмотреть сообщение
Как я понял что-то вроде этого?:
Я понял, что менять местами надо именно указатели, а не экземпляры структур, так как особенно при работе с массивами структур, операция перестановки экземпляров отнимает куда больше времени и памяти, чем перестановка указателей на них

Добавлено через 13 минут
Цитата Сообщение от p_r_a_g_m_a Посмотреть сообщение
Как я понял что-то вроде этого?:
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
struct aeroflot** arr;
struct aeroflot* tmp;
int size=50;
int main(){
arr=new struct aeroflot*[size];
arr[0]=new struct aeroflot[size];
for (int i=0; i<size; i++) a[i]=arr[0]+i;
 
 
for (int i=0; i<size; i++) {//считываем массив из файла, с клавы или откуда угодно
   cin>>arr[i]->reis;//и все остальные поля...
   //..........короче считывание сами придумайте, 
}
 
for (int i=0; i<size; i++) 
   for (int j=0; j<size-i-1; j++)            //обычный пузырёк
      if ( (arr[j]->reis)>(arr[j]->reis) ){
          tmp=arr[j];
          arr[j]=arr[j+1];
          arr[j+1]=tmp;
       }
delete[] arr[0];
delete[] arr;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mr_aleks
0 / 0 / 0
Регистрация: 13.10.2011
Сообщений: 118
10.04.2012, 21:57  [ТС]     структуру AEROFLOT #22
Компилятор выдает ошибку на arr[j]->reis, заменил на точку и пишит уже.
error C2228: left of '.reis' must have class/struct/union type
из файла тоесть так file = fopen("D:\\5.dat", "rb+") ?
И вывод надо структур уже отсортированных ?

Добавлено через 5 минут
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
#define STRLEN 20
using namespace std;
#pragma pack (1)
typedef struct
{
    char punkt[STRLEN];
    int reis;
    char tip[STRLEN];
    int cena;
} AEROFLOT, *LPAEROFLOT;
#pragma pack()
int main(int argc, char** argv)
{
LPAEROFLOT pxas = new AEROFLOT[10];
LPAEROFLOT pl[SIZE] = {NULL};
...
    FILE* file;
    if((file = fopen("D:\\5.dat", "rb+")) == NULL) { printf("Oshibka pri otkrytii fajla.\n"); exit(1); }
...
for ( i=0; i<20; i++)
    {
        fread(&pxas[i],sizeof(AEROFLOT),1,file); pl[i]=&pxas[i];
    }   
//считывания типо такого ?
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
10.04.2012, 22:07     структуру AEROFLOT #23
Цитата Сообщение от mr_aleks Посмотреть сообщение
error C2228: left of '.reis' must have class/struct/union type
А целиком код сложно было запостить?
mr_aleks
0 / 0 / 0
Регистрация: 13.10.2011
Сообщений: 118
10.04.2012, 22:28  [ТС]     структуру AEROFLOT #24
Как то так

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
#include <iostream>
#include <stdio.h>
#include <iomanip>
#define STRLEN 20
using namespace std;
#pragma pack (1)
typedef struct
{
    char punkt[STRLEN];
    int reis;
    char tip[STRLEN];
    int cena;
} AEROFLOT;
 
struct aeroflot** arr;
struct aeroflot* tmp;
int size=50;
int main()
{
    arr=new struct aeroflot*[size];
arr[0]=new struct aeroflot[size];
for (int i=0; i<size; i++) arr[i]=arr[0]+i;
 
     FILE* file;
for (i=0; i<size; i++) {
    if((file = fopen("D:\\5.dat", "rb+")) == NULL) { printf("Oshibka pri otkrytii fajla.\n"); exit(1); }
}
 
for (i=0; i<size; i++) 
   for (int j=0; j<size-i-1; j++)            //îáû÷Г*ûé ïóçûð¸ê
      if ( (arr[j].reis)>(arr[j].reis) ){
          tmp=arr[j];
          arr[j]=arr[j+1];
          arr[j+1]=tmp;
       }
delete[] arr[0];
delete[] arr;
 
 
 
for ( i=0; i<20; i++) 
{
 
        
            cout << "Po nomeru: " << arr[i].reis << endl;
            cout << "--------------------" << endl;
        
}
 
 
}
но тут явно не дописано или я полностью не понимаю как сортировать только указатели в массиве.
Если нужно то вот само задание
Подготовьте массив указателей на AEROFLOT на 50 элементов.

Считайте все записи из файла "5.dat" .

Для чтения каждой отдельной записи осуществите динамический захват памяти.

Соответствующий адрес храните в массиве указателей.

Выполните сортировку данных по номеру рейса - причем сортировать потребуется только указатели в массиве.

Выведите отсортированнный массив.
в начальных темах с указателями я еще понимал то тут уже нет
ПС предыдущий код проги на 2ой стр!
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
10.04.2012, 22:51     структуру AEROFLOT #25
Ты что? Ты что не знаешь разницы между arr[i]. и arr[i]-> ???
arr[i].reis применяется для обращения к полю reis в и-том элементе массива
arr[i]->reis применяется для обращения к полю reis, в элементе на который указывает и-тый указатель в массиве

в общем случае запись arr[i]->reis эквивалентна *(arr[i]).reis
Если тебе настолько неудобна запись "стрелочкой" для обращения по указателю, можешь добавить скобки со звёздочкой.

Но просто arr[i].reis это бессмыслица. После того как мы решили хранить в массиве указатели, надо соответственно и изменить обращение к полям структур
Ты это проходил уже или читал об этом?
mr_aleks
0 / 0 / 0
Регистрация: 13.10.2011
Сообщений: 118
10.04.2012, 23:39  [ТС]     структуру AEROFLOT #26
может набросите как будет выглядить для моего случая?) но почему не хочет компилировать такие выражения, я не знаю

Добавлено через 25 минут
вроде бы проходили но знаете как на лекциях это бывает, почитать котигорически надо.

Если будет время и желание набросте )
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
11.04.2012, 00:27     структуру AEROFLOT #27
А из какого ты файла читаешь?( Мне не сам файл, а программу, которая его создала.)
p_r_a_g_m_a
 Аватар для p_r_a_g_m_a
108 / 60 / 17
Регистрация: 08.03.2012
Сообщений: 208
Завершенные тесты: 1
11.04.2012, 01:11     структуру AEROFLOT #28
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
struct aeroflot** arr;
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
cin>>arr[i]->reis;
А разве не arr[0][i].reis ?
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
11.04.2012, 01:18     структуру AEROFLOT #29
Цитата Сообщение от p_r_a_g_m_a Посмотреть сообщение
А разве не arr[0][i].reis ?
Я не уверен, что вызвало твой вопрос. Ты точно с оператором -> знаком?
Или я действительно неправильно написал?
arr это указатель на начало массива указателей
arr[i] это i-й член массива, это указатель указывающий на i-ю структуру
arr[i]->reis это поле reis полученное по указателю arr[i] на структуру struct aeroflot
Всё ещё считаешь, что тут ошибка? Вполне вероятно, но не в arr[i]->reis
p_r_a_g_m_a
 Аватар для p_r_a_g_m_a
108 / 60 / 17
Регистрация: 08.03.2012
Сообщений: 208
Завершенные тесты: 1
11.04.2012, 01:25     структуру AEROFLOT #30
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
arr=new struct aeroflot*[size];
Ну ведь тут выходит что мы создаем 10 указателей
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
arr[0]=new struct aeroflot[size];
потом выделяем память для массива структуры с 10 элементами и первый указатель arr[0] будет ссылаться на эту область памяти.
То есть это вроде как некая матрица 1х10

При попытке получить поле arr[i]->reis, мы получаем:
Миниатюры
структуру AEROFLOT  
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
11.04.2012, 01:38     структуру AEROFLOT #31
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
#include "stdafx.h"
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <iomanip>
#define STRLEN 20
using namespace std;
#pragma pack (1)
struct aeroflot
{
    char punkt[STRLEN];
    int reis;
    char tip[STRLEN];
    int cena;
};
 
struct aeroflot** arr;
struct aeroflot* tmp;
 
int main()
{
    int i;
    int size=50;///УКАЖИ ВЕРНОЕ КОЛИЧЕСТВО ЗАПИСЕЙ В ФАЙЛЕ!!!
    arr=new struct aeroflot*[size];
    arr[0]=new struct aeroflot[size];
    for (int i=0; i<size; i++) arr[i]=arr[0]+i;
 
     FILE* f;
if((f = fopen("D:\\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]->reis)>(arr[j+1]->reis) ){
          tmp=arr[j];
          arr[j]=arr[j+1];
          arr[j+1]=tmp;
       }
 
 
for ( i=0; i<size; i++) 
{
              cout << "Po nomeru: " << arr[i]->reis << endl;
            cout << "--------------------" << endl;
      
}
 
delete[] arr[0];
delete[] arr;
}
Добавлено через 2 минуты
Цитата Сообщение от p_r_a_g_m_a Посмотреть сообщение
потом выделяем память для массива структуры с 10 элементами и первый указатель arr[0] будет ссылаться на эту область памяти.
То есть это вроде как некая матрица 1х10
совершенно верно. Матрица в Си это и есть массив указателей.
Только мы будем менять местами не элементы матрицы arr[0][5], а поднимемся на уровень выше, в массив указателей на эти элементы и будем сортировать указатели. Элементы же в памяти будут стоять неподвижно

Добавлено через 10 минут
При попытке получить поле arr[i]->reis, мы получаем:
Понятия не имею о чём ты я сам только что создал массив указателей, вручную присвоил значения нескольким полям разных элементов, затем удалил его и всё без ошибок. Из файла, естесственно не читал: его у меня нет
p_r_a_g_m_a
 Аватар для p_r_a_g_m_a
108 / 60 / 17
Регистрация: 08.03.2012
Сообщений: 208
Завершенные тесты: 1
11.04.2012, 01:44     структуру AEROFLOT #32
Что-то я окончательно запутался) Причину моего исключения я понял..
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
11.04.2012, 01:48     структуру AEROFLOT #33
Цитата Сообщение от p_r_a_g_m_a Посмотреть сообщение
Что-то я окончательно запутался) Причину моего исключения я понял..
я написал так (для проверки) и всё работало
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
    struct aeroflot** arr;
    struct aeroflot* tmp;
    int i;
    int size=50;///УКАЖИ ВЕРНОЕ КОЛИЧЕСТВО ЗАПИСЕЙ В ФАЙЛЕ!!!
    arr=new struct aeroflot*[size];
    arr[0]=new struct aeroflot[size];
    for (int i=0; i<size; i++) arr[i]=arr[0]+i;
    arr[25]->reis=55;
    arr[44]->reis=55;
    arr[5]->reis=55;
 
    
 delete[] arr[0];
delete[] arr;
retrn 0;
}
p_r_a_g_m_a
 Аватар для p_r_a_g_m_a
108 / 60 / 17
Регистрация: 08.03.2012
Сообщений: 208
Завершенные тесты: 1
11.04.2012, 01:53     структуру AEROFLOT #34
Все понял) После
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
for (int i=0; i<size; i++) arr[i]=arr[0]+i;
arr[0] == arr[0][0]
arr[1] == arr[0][1]
...
arr[50] == arr[0][50]
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
11.04.2012, 01:56     структуру AEROFLOT #35
Цитата Сообщение от p_r_a_g_m_a Посмотреть сообщение
arr[0] == arr[0][0]
arr[1] == arr[0][1]
...
arr[50] == arr[0][50]
А вот и нет! То есть массивы двумерные хранятся таким же образом конечно, но вот только здесь у нас указатели и верно будет
*(arr[0]) == arr[0][0]
*(arr[1]) == arr[1][0]
...
Согласен?
p_r_a_g_m_a
 Аватар для p_r_a_g_m_a
108 / 60 / 17
Регистрация: 08.03.2012
Сообщений: 208
Завершенные тесты: 1
11.04.2012, 01:59     структуру AEROFLOT #36
Не ну то что там указатели ясно) Просто я звездочку не написал)
mr_aleks
0 / 0 / 0
Регистрация: 13.10.2011
Сообщений: 118
11.04.2012, 02:10  [ТС]     структуру AEROFLOT #37
Скомпилировал, получил вот такое
Миниатюры
структуру AEROFLOT  
p_r_a_g_m_a
 Аватар для p_r_a_g_m_a
108 / 60 / 17
Регистрация: 08.03.2012
Сообщений: 208
Завершенные тесты: 1
11.04.2012, 02:17     структуру AEROFLOT #38
Цитата Сообщение от mr_aleks Посмотреть сообщение
Извиняюсь, но что за файл "stdafx.h" который подключается как библиотека??
Используется в МС:
stdafx.h: включаемый файл для стандартных системных включаемых файлов или включаемых файлов для конкретного проекта, которые часто используются, но не часто изменяются.
mr_aleks
0 / 0 / 0
Регистрация: 13.10.2011
Сообщений: 118
11.04.2012, 02:20  [ТС]     структуру AEROFLOT #39
Или мб все таки ошибка из за того что в файле не 20 записей а меньше??
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2012, 02:23     структуру AEROFLOT
Еще ссылки по теме:

C++ Описать структуру с именем AEROFLOT
C++ Описать структуру с именем AEROFLOT
Описать структуру Aeroflot C++

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

Или воспользуйтесь поиском по форуму:
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
11.04.2012, 02:23     структуру AEROFLOT #40
Цитата Сообщение от mr_aleks Посмотреть сообщение
Скомпилировал, получил вот такое
У тебя точно size равен числу записей в файле?

Добавлено через 2 минуты
Цитата Сообщение от mr_aleks Посмотреть сообщение
скажите как сделать сортировку "данных по номеру рейса - причем сортировать потребуется только указатели в массиве." и сделать "массив указателей на AEROFLOT на 50 элементов." ?
Твои слова?
Yandex
Объявления
11.04.2012, 02:23     структуру AEROFLOT
Ответ Создать тему
Опции темы

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