Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
1 / 1 / 3
Регистрация: 23.09.2014
Сообщений: 45
1

Присвоение структуре другой структуры из массива структур

24.01.2016, 15:26. Показов 5191. Ответов 14
Метки нет (Все метки)

Привет всем вот всё ковыряю задание с клубами. Из-за незнания нюансов и отсутствие практики не могу присвоить и отсортировать массив структур, помогите кому не лень ) Выбивает ошибку на sForSort = &aArrayClub[0];. Хочу score перевести в int и задействовать в сортировке но не могу присвоить дополнительной структуре структуру из массива которая бы вылетала, думаю мою мысль неглубокую понятно =) Кто может помочь помогите.

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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
    /*1) створіть структуру Club з полями: name - назва клубу; city - місто, яке він представляє;
    * score - кількість набраних очок;*/
 
struct Club
{
    char cCity[255];
    char cName[255];
    char cScore[255];
};
 
struct AdditionalStructForSort
{
    char cCity[255];
    char cName[255];
    char cScore[255];
};
 
int main(void)
{
    struct AdditionalStructForSort sForSort;
    struct Club sClub;
    signed int i;
 
    for ( i = 0; i < 255; i++ )
    {
        sForSort.cCity[i] = 0;
        sForSort.cName[i] = 0;
        sForSort.cScore[i] = 0;
    }
 
    for ( i = 0; i < 255; i++ )
    {
        sClub.cCity[i] = 0;
        sClub.cName[i] = 0;
        sClub.cScore[i] = 0;
    }
 
    /* 2) створіть файл, в якій внесіть дані - майбутні значення полів структури Club
    * (кожне поле - з нового рядка, без пробілів!), кількість клубів - не менше 10
    * (розташувати у файлі в довільному порядку, не залежно від кількості очок);*/
 
    FILE *pClub;
 
    //3) збережіть створений файл як текстовий;
 
    pClub = fopen ( "FileAllClubs.txt", "a+" );
 
    printf ( "Input name city: " );
    gets ( sClub.cCity );
    printf ( "Input name club: " );
    gets ( sClub.cName );
    printf ( "Input score club: " );
    gets ( sClub.cScore );
 
    fprintf ( pClub, "%s\n%s\n%s\n", &sClub.cCity[0], &sClub.cName[0], &sClub.cScore[0] );
    fclose ( pClub );
 
    for ( i = 0; i < 255; i++ )
    {
        sClub.cCity[i] = 0;
        sClub.cName[i] = 0;
        sClub.cScore[i] = 0;
    }
 
    /*4) введіть з клавіатури число N - кількість клубів,
    дані про які потрібно прочитати з файлу;*/
 
    signed int N = 0;
    printf ( "Input N: " );
    scanf ( "%d", &N );
 
    //5) виділіть динамічно пам’ять для масиву з n структур;
 
    struct Club *aArrayClub = ( struct Club* ) malloc ( N * sizeof ( struct Club ) );
 
    if ( ( aArrayClub = ( struct Club* ) malloc ( N * sizeof ( struct Club ) ) ) == NULL )
    {
        printf ( "ERROR\n" );
        exit ( 1 );
    }
 
    pClub = fopen ( "FileAllClubs.txt", "r+" );
 
    //6) прочитайте у відповідний масив максимально можливу кількість даних про клуби;
 
    for ( i = 0; i < N; i++ )
    {
        fgets ( sClub.cCity, 255, pClub );
        strcpy ( aArrayClub[i].cCity, sClub.cCity );
        fgets ( sClub.cName, 255, pClub );
        strcpy ( aArrayClub[i].cName, sClub.cName );
        fgets ( sClub.cScore, 255, pClub );
        strcpy ( aArrayClub[i].cScore, sClub.cScore );
 
        puts ( aArrayClub[i].cCity );
        puts (aArrayClub[i].cName );
        puts ( aArrayClub[i].cScore );
 
    }
 
    fclose ( pClub );
 
    /*7) здійснить сортування даного масиву за спаданням кількості очок клубів -
    першим елементом щоб стала структура, клуб якої має максимальну кількість очок,
    і далі - в порядку зменшення;Примітка: - з метою обміну структур місцями оголосіть
    додаткову аналогічну структуру, в яку тимчасово будете копіювати ті, що підлягають перестановці;
    доступ до елементів масиву структур здійснюйте за допомогою покажчиків!*/
 
    signed int iValue = 0;
    signed int iMaxScore = 0;
 
    sForSort = &aArrayClub[0]; // <- Ошибка
 
    iMaxScore = atoi( aArrayClub[0].cScore );
 
    for( i = 0; i < N; i++ )
    {
        if( ( iValue = atoi( aArrayClub[i].cScore ) ) > iMaxScore )
        {
               iMaxScore = atoi( aArrayClub[i].cScore );
        }
    }
 
    printf( "%d", iMaxScore );
 
    /*8) дані відсортованого масиву виведіть до іншого текстового файлу
    (по можливості використовуючи форматування для кращої читабельності);
    перевірте файл на предмет правильного порядку розташування в ньому даних про клуби.*/
 
    FILE *pFinalClub;
    pFinalClub = fopen( "FinalClub.txt", "a+" );
    //fprintf ("" );
    fclose( pFinalClub );
 
   return 0;
}
Добавлено через 12 часов 35 минут
Говорят что можно по елементно присваивать но что других способов нету?
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.01.2016, 15:26
Ответы с готовыми решениями:

В структуре нужно из одного метода взять значение массива и перетащить в другой (другой метод)
struct matrix { public int sz; public void size() { ...

Присвоение элементам массива значений структуры
Доброго дня. У меня возникла проблема с присвоением элементам массива значений структуры. В чем...

Преобразование массива к другой структуре
массив @array = ('1', '2', '3', '4', '5', '6'); как его можно привести к такой структуре: '2',...

Удаление структуры из массива структур
Допустим имеется структура ... struct WORKER { char familiya; char name; char otchestvo;...

14
1 / 1 / 3
Регистрация: 23.09.2014
Сообщений: 45
24.01.2016, 15:34  [ТС] 2
Нашел что так можно но почему то ругается компилятор =(
0
Миниатюры
Присвоение структуре другой структуры из массива структур  
251 / 157 / 118
Регистрация: 26.11.2012
Сообщений: 384
24.01.2016, 16:21 3
aArrayClub -массив из N элементов
sForSort - один элемент, ему можно присвоить только один элемент
Код
sForSort = aArrayClub[0];
Добавлено через 3 минуты
Цитата Сообщение от Ziberman Посмотреть сообщение
Говорят что можно по елементно присваивать но что других способов нету
можно другому указателю присвоить адрес памяти первого массива, но тогда изменение одного массива будет приводить к изменению второго.
1
1 / 1 / 3
Регистрация: 23.09.2014
Сообщений: 45
24.01.2016, 17:11  [ТС] 4
Да но я так и так писал и вот так sForSort = &aArrayClub[0]; Всеравно ошибка пичаль т_Т.
0
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
24.01.2016, 17:20 5
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Ziberman, зачем так усложнять код?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
 
struct Club
{
    char cCity[255];
    char cName[255];
    char cScore[255];
};
 
 
int main(void)
{
    struct Club sForSort = {"0","0","0"};
    struct Club sClub = {"0","0","0"};
    int i;
printf("%s\n %s\n %s\n",sClub.cCity,sClub.cName,sClub.cScore);
//system("pause"); для винды
 
}
получим в консоль
0
0
0
те оба массива одного типа sClub и все поля инициализированы строками "0". "0" - это не математический ноль! "0" - это строка
1
251 / 157 / 118
Регистрация: 26.11.2012
Сообщений: 384
24.01.2016, 17:23 6
C++
1
sForSort = &aArrayClub[0];
что бы так делать sForSort должен быть указателем
1
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
24.01.2016, 17:34 7
C
1
2
3
4
5
6
7
8
FILE* pClub = fopen ( "FileAllClubs.txt", "a+" ); // лучше сразу так
if (!pClub) // если файл открылся
{
perror("File opening failed");
return EXIT_FAILURE;
}
 
// do something...
signed int не надо писать, он и так signed пишите просто int

Добавлено через 2 минуты
Apostol584,
Цитата Сообщение от Apostol584 Посмотреть сообщение
&aArrayClub[0]
&aArrayClub[0] - это aArrayClub, тк переменная типа массив указывает на первый (нулевой) элемент массива
1
1 / 1 / 3
Регистрация: 23.09.2014
Сообщений: 45
24.01.2016, 18:06  [ТС] 8
те оба массива одного типа sClub и все поля инициализированы строками "0". "0" - это не математический ноль! "0" - это строка .

Я применял стандартное зануление массива строки из структуры. struct Club sForSort = {"0","0","0"}; на єто зануление ругается компилятор. Я уже с таким сталкивался тут только цикл надо писать.

Я учусь писать на кросс платформеном коде signed int обязательно потому что другие системи могут не понять что такое int или short. Надо писать полное название переменной signed short int и так далее.
0
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
24.01.2016, 19:30 9
© ISO/IEC 2011 − All rights reserved ISO/IEC 9899:2011 (E)

The following may be used in an expression wherever an int or unsigned int may
be used:
— An object or expression with an integer type (other than int or unsigned int)
unsigned int и int это вообще-то стандарт ISO/IEC 9899:2011
у меня подобные выражения, на которые у вас компилятор ругается "хавают" clang, gcc, microsoft
int - это по стандарту знаковое целое и может только пределы максимум и минимум меняться, но не суть
зависящие от реализации пределы:
<limits.h>
INT_MAX // максимальное значение int
INT_MIN // минимальное значение int
UINT_MAX // максимальное значение unsigned int
какой у вас компилятор и версия?
можно точно сообщение? может вы чего перепутали?
1
1 / 1 / 3
Регистрация: 23.09.2014
Сообщений: 45
24.01.2016, 19:37  [ТС] 10
qt последний вот тут я спрашивал про полное задание имени и прочитал єто во многих последних книгах Для чего надо задавать полное имя переменной?
меня больше итересует как присвоить структуре структуру из массива структур я не могу догнать єтот момент.
0
1 / 1 / 3
Регистрация: 23.09.2014
Сообщений: 45
24.01.2016, 19:54  [ТС] 11
Вот такой алгоритм хочу попробивать но не могу присвоить структуру из массива структур моей дополнительной структуре ппц что делать?
0
Миниатюры
Присвоение структуре другой структуры из массива структур  
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
24.01.2016, 20:38 12
qt - это отдельный разговор и, если ничего не путаю, это С++
Цитата Сообщение от Ziberman Посмотреть сообщение
как присвоить структуре структуру из массива структур
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
#include <stdio.h>
#include <stdlib.h>
 
 
struct Club
{
    char cCity[255];
    char cName[255];
    char cScore[255];
 
} sForSort = {"0","0","0"}, 
     sClub = {"0","0","0"};
 
 
int main(void)
{
    
    struct Club* arrClub = (Club*)malloc(sizeof(struct Club[5]));
    if (arrClub){
    
        printf("Memory good");
        arrClub[0]=sClub;
        printf("%s \n",arrClub[0].cCity);
    free(arrClub);
    }
system("pause");
}
строка 22, если инициализировать, то можно и местами поменять
1
1 / 1 / 3
Регистрация: 23.09.2014
Сообщений: 45
24.01.2016, 21:00  [ТС] 13
Вот такое пишет.
0
Миниатюры
Присвоение структуре другой структуры из массива структур  
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
24.01.2016, 22:27 14
Лучший ответ Сообщение было отмечено Ziberman как решение

Решение

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
#include <stdio.h>
#include <stdlib.h>
 
 
struct Club
{
    char cCity[255];
    char cName[255];
    char cScore[255];
 
}    sClubSort = {"0","0","0"}, 
     sClub     = {"0","0","0"};
 
int main(void)
{
    int i;
    struct Club *arrClub = (Club*)malloc(sizeof(struct Club[5]));
    
    if (arrClub){
        printf("Memory good");
        
        for(i=0;i<5;i++){
            arrClub[i]=sClub;
        }
        
        for(int i=0; i<5; i++){
        sClub=arrClub[i];               
        printf("\n %s \t %s \t %s \t",arrClub[i].cCity,arrClub[i].cName,arrClub[i].cScore);
        }
    }
        free(arrClub);
        system("pause");//windows console
}
строки 23 и 27 кода показывают присваивание в обе стороны. главное чтоб не присваивать не инициализированные переменные и за границы i не выходить
1
1 / 1 / 3
Регистрация: 23.09.2014
Сообщений: 45
24.01.2016, 22:49  [ТС] 15
Все я понял в чем дело у меня біло 2 одинаковых но разных структури [мат]
Вот:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
struct Club
{
    char cCity[255];
    char cName[255];
    char cScore[255];
};
 
struct AdditionalStructForSort
{
    char cCity[255];
    char cName[255];
    char cScore[255];
};
Анадо было делать типо структуры 1 типа в этом и вся проблема была. Спс всем за помощь.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.01.2016, 22:49

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Присвоение структуре имя
Вообщем как всегда запутался я на простых вещах :wall: Почему я не могу присвоить g.fullname...

Присвоение значений элементам в структуре
#include &lt;string.h&gt; #include &lt;iostream.h&gt; using spacename std; struct mystruct { ...

Присвоение значения данным в структуре
Здравствуйте! Подскажите, пожалуйста, как присвоить значение переменной структуры. Например:...

Установка всех переменных каждой структуры массива структур на 0
Пусть имеется данный код struct GLintpoint{ int x; int y; }

Перенос данных из одного массива структур в другой
Добрый день, крайне начинающий в с++, запутался вот с какой проблемой.Есть код, добавляющий в...

Копирование одного динамического массива структур в другой
есть структура struct Katalog{ int num_tov; int date; }; создаю динамический массив...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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