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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.79
mr_aleks
0 / 0 / 0
Регистрация: 13.10.2011
Сообщений: 131
#1

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

09.04.2012, 18:59. Просмотров 3695. Ответов 64
Метки нет (Все метки)

Сформировать структуру 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");
}
Но она не правильно по мойму... т.к. не правильно выводит записи из файла в след. проге
Толи что то в обьявлении типов или еще где (
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2012, 18:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос структуру AEROFLOT (C++):

Описать структуру Aeroflot - C++
Описать структуру с именем AEROFLOT,которая имеет следующие поля: 1 - название пункта назначения рейса; 2 - номер рейса; 3 - тип...

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

Описать структуру с именем AEROFLOT - C++
Описать структуру с именем AEROFLOT, содержащую следующие поля: □ название пункта назначения рейса; □ номер рейса; ...

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

Описать структуру с именем AEROFLOT - C++
Описать структуру с именем AEROFLOT, содержащую следующие поля: • название пункта назначения рейса; • номер рейса; • тип самолета.

Описать структуру с именем AEROFLOT - C++
1. Описать структуру с именем AEROFLOT, содержащую следующие поля: a)название пункта назначения рейса; б)номер рейса; в)тип...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
mr_aleks
0 / 0 / 0
Регистрация: 13.10.2011
Сообщений: 131
10.04.2012, 18:59  [ТС] #16
Большое вам человеческое спасибо Благодарен вам от души


Маленький вопросик, почему у меня не выводится русским текстом в консоле? хотя функция setlocale(LC_ALL, "Russian"); есть и правельно написана, приходится все транслитом
p_r_a_g_m_a
109 / 61 / 18
Регистрация: 08.03.2012
Сообщений: 211
Завершенные тесты: 1
10.04.2012, 20:17 #17
Незачто).Нужно использовать CharToOemA и OemToCharA
mr_aleks
0 / 0 / 0
Регистрация: 13.10.2011
Сообщений: 131
10.04.2012, 20:20  [ТС] #18
скажите как сделать сортировку "данных по номеру рейса - причем сортировать потребуется только указатели в массиве." и сделать "массив указателей на AEROFLOT на 50 элементов." ?
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
10.04.2012, 20:35 #19
Цитата Сообщение от mr_aleks Посмотреть сообщение
скажите как сделать сортировку "данных по номеру рейса - причем сортировать потребуется только указатели в массиве." и сделать "массив указателей на AEROFLOT на 50 элементов." ?
понятия не имею, как сортировать массив структур, меняя только указатели. Может тебе нужен массив указателей на структуры?
C
1
struct aeroflot** pmas;
или
C
1
struct aeroflot* pmas[10];
Или вообще связанный список?
p_r_a_g_m_a
109 / 61 / 18
Регистрация: 08.03.2012
Сообщений: 211
Завершенные тесты: 1
10.04.2012, 20:39 #20
Как я понял что-то вроде этого?:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    #define SIZE 50
    ...
    LPAEROFLOT pl[SIZE] = {NULL};
    ...
    for (int i = 0; i < SIZE - 1; ++i)
    {
        AEROFLOT Temp;
        for (int j = (i + 1); j < SIZE; ++j)
            if (pl[i].reis < pl[j].reis)
            {
                Temp = pl[i];
                pl[i] = pl[j];
                pl[j] = Temp;        
            }
    }
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
10.04.2012, 20:58 #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
Сообщений: 131
10.04.2012, 21:57  [ТС] #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
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
10.04.2012, 22:07 #23
Цитата Сообщение от mr_aleks Посмотреть сообщение
error C2228: left of '.reis' must have class/struct/union type
А целиком код сложно было запостить?
mr_aleks
0 / 0 / 0
Регистрация: 13.10.2011
Сообщений: 131
10.04.2012, 22:28  [ТС] #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
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
10.04.2012, 22:51 #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
Сообщений: 131
10.04.2012, 23:39  [ТС] #26
может набросите как будет выглядить для моего случая?) но почему не хочет компилировать такие выражения, я не знаю

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

Если будет время и желание набросте )
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
11.04.2012, 00:27 #27
А из какого ты файла читаешь?( Мне не сам файл, а программу, которая его создала.)
p_r_a_g_m_a
109 / 61 / 18
Регистрация: 08.03.2012
Сообщений: 211
Завершенные тесты: 1
11.04.2012, 01:11 #28
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
struct aeroflot** arr;
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
cin>>arr[i]->reis;
А разве не arr[0][i].reis ?
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
11.04.2012, 01:18 #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
109 / 61 / 18
Регистрация: 08.03.2012
Сообщений: 211
Завершенные тесты: 1
11.04.2012, 01:25 #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  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2012, 01:25
Привет! Вот еще темы с ответами:

Описать структуру с именем AEROFLOT - C++
Помогите пожалуйста, очень прошу. Описать структуру с именем AEROFLOT, содержащую следующие поля: название пункта назначения рейса,...

Описать структуру с именем Aeroflot - C++
Описать структуру с именем AEROFLOT , содержащую следующие поля: * название пункта назначения рейса; * номер рейса; * тип самолета; ...

Описать структуру с именем AEROFLOT - C++
Приветик всем! Помогите пожалуйста! Надо переделать программу на Си. Ниже написана подобная программа, но некоторое надо изменить: записи...

Описать структуру с именем AEROFLOT - C++
Вариант 4 1. Описать структуру с именем АЕRОFLОТ, содержащую следующие поля: • NAZN - название пункта назначения рейса; • NUMR -...


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

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

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