С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 47
1

Запись данных в массив структур

23.12.2014, 20:53. Показов 2043. Ответов 29
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно считать данные с клавиатуры и записать в массив структур.
Где ошибка? Подскажите.

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
#include <stdio.h>
#include <string.h>
#include <assert.h>
 
struct Purchase
{
    char * name;
    int price;
};
 
void scan ( Purchase* p, int i ) 
{
            
        scanf (" %s", &(p+i)->name);
 
        scanf (" %fl", &(p+i)->price);
 
        assert ((p+i)->price > 0);
 
        
}
 
void print ( Purchase* p, int i )
{
    for ( int j=0; j<i; j++)
    {
    printf (" %s\n", (p+j)->name);
    printf (" %fl\n", (p+j)->price);
    }
}
int main ( )
{
    int size=1, i=0, s=0;
 
    Purchase* shoppingCart = new Purchase[100];
    
 
    while( ! feof ( stdin))
    {   
        scan( shoppingCart, i);
        
        size++;
        i++;
    }
     
    print (shoppingCart, i);
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2014, 20:53
Ответы с готовыми решениями:

Запись значений в массив структур
например есть структура struct position { int x,y; }; и массив из структуры position...

Запись из файла в массив структур
сначала нужно считать файл и формировать vector, элементы которого имеют тип struct Student;...

Запись и чтение структур данных
Изучаю структуры данных в C++. Решил написать программу, которая просто получает данные для...

Запись бинарного файла в массив структур
Задача: Записать из текстового файла данные в массив структур и перезаписать их в бинарный файл с...

29
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
23.12.2014, 20:55 2
Ошибка как всегда в том, что вы не выделяете память для строки.
0
0 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 47
23.12.2014, 20:59  [ТС] 3
Объясните, пожалуйста, как это сднлать
0
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
23.12.2014, 21:01 4
Через new, разумеется. Перед первым использованием поля name. А ещё проще описать как массив
C++
1
char name[50];
Ну размер по желанию.
0
0 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 47
23.12.2014, 21:05  [ТС] 5
В таком случаи запись name осуществить по-другому?

C++
1
scanf (" %s", &(p+i)->name);
0
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
23.12.2014, 21:19 6
Нет, ввод не изменится. Обеспечь только выделение памяти статически (массив), либо динамически (указатель + new).

Добавлено через 6 минут
Только здесь один символ лишний, вот так надо:
C++
1
scanf (" %s", (p+i)->name);
0
0 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 47
23.12.2014, 21:19  [ТС] 7
все равно не работает
0
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
23.12.2014, 21:20 8
Покажи, что получилось.
0
0 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 47
23.12.2014, 21:23  [ТС] 9
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
#include <stdio.h>
#include <string.h>
#include <assert.h>
 
struct Purchase
{
    char name[50];
    int price;
};
 
void scan ( Purchase* p, int i ) 
{
            
        scanf (" %s", (p+i)->name);
 
        scanf (" %fl", &(p+i)->price);
 
        assert ((p+i)->price > 0);
 
        
}
 
void print ( Purchase* p, int i )
{
    for ( int j=0; j<i; j++)
    {
    printf (" %s\n", (p+j)->name);
    printf (" %fl\n", (p+j)->price);
    }
}
int main ( )
{
    int size=1, i=0, s=0;
 
    Purchase* shoppingCart = new Purchase[100];
    
 
    while( ! feof ( stdin))
    {   
        scan( shoppingCart, i);
        
        size++;
        i++;
    }
     
    print (shoppingCart, i);
 
    return 0;
}

Исправления в двух местах.
На экран просто ничего не выводится.
0
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
23.12.2014, 21:30 10
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
#include <stdio.h>
#include <string.h>
#include <assert.h>
 
struct Purchase
{
    char name[50];
    int price;
};
 
void scan ( Purchase* p, int i ) 
{
        printf("name: ");    
        scanf ("%s", (p+i)->name);
 
        printf("price: ");    
        scanf ("%d", &((p+i)->price));
 
        assert ((p+i)->price > 0);
 
        
}
 
void print ( Purchase* p, int i )
{
    for ( int j=0; j<i; j++)
    {
    printf (" %s\n", (p+j)->name);
    printf (" %d\n", (p+j)->price);
    }
}
int main ( )
{
    int size=1, i=0, s=0;
 
    Purchase* shoppingCart = new Purchase[100];
    
 
    while( ! feof ( stdin))
    {   
        scan( shoppingCart, i);
        
        size++;
        i++;
    }
     
    print (shoppingCart, i);
 
    return 0;
}
0
0 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 47
23.12.2014, 21:37  [ТС] 11
Не-а. Ничего не выводит (
0
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
23.12.2014, 21:43 12
Всё работает. Только не ясно, как закончить ввод. Ты что нажимаешь?
Миниатюры
Запись данных в массив структур  
0
0 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 47
23.12.2014, 21:47  [ТС] 13
Cntrl+C - конец ввода
0
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
23.12.2014, 21:49 14
Ctrl-C- это прервать программу, насколько я знаю. А конец ввода Ctrl-Z, хотя у меня не работает эта комбинация.
0
31 / 31 / 6
Регистрация: 23.10.2014
Сообщений: 107
23.12.2014, 21:49 15
Вам нужен ctrl+z
0
0 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 47
23.12.2014, 21:54  [ТС] 16
Если я в while пишу какое-либо условие, например i<2, то работает. Спасибо.
Но мне нужно, чтобы пользователь сам закончил ввод , поэтому while( ! feof ( stdin) ), а с ним не работает

у меня тоже не работает комбинация cntrl + z. Во всех подобных программах я использовала cntrl + с - работало.
0
31 / 31 / 6
Регистрация: 23.10.2014
Сообщений: 107
23.12.2014, 22:09 17
Обязательно ли использовать printf и scanf? Быть может сойдет такой вариант?
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
#include <iostream>
#include <cassert>
 
struct Purchase {
    char   name[50];
    double price;
};
 
bool scan(Purchase p[], int i) {
  std::cout << "Article name: ";
  if (!(std::cin >> p[i].name))
    return false;
 
  std::cout << "Article price: ";
  if (!(std::cin >> p[i].price))
    return false;
  assert(p[i].price > 0);
  return true;
}
 
void print(Purchase p[], int size) {
  for (int i = 0; i < size; ++i) {
    std::cout << "Article: " << p[i].name  << '\n'
              << "Price:   " << p[i].price << '\n';
  }
}
 
int main() {
  int count = 0;
 
  Purchase * shopingCart = new Purchase[100];
 
  while (scan(shopingCart, count))
    ++count;
 
  print(shopingCart, count);
 
  delete[] shopingCart;
  return 0;
}
Добавлено через 23 секунды
Ctlr+Z завершает ввод.
0
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
23.12.2014, 22:12 18
Надо сразу после scanf() проверять.
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
int scan ( Purchase* p) 
{
    int i = 0;
    while (!feof(stdin))
    {   
        printf("name: ");    
        scanf ("%s", (p+i)->name);
        if (feof(stdin)) return i;
 
        printf("price: ");    
        scanf ("%d", &((p+i)->price));
        if (feof(stdin)) return i;
 
        assert ((p+i)->price > 0);
        
        i++;
    }
 
    return i;
        
}
 
void print ( Purchase* p, int i )
{
    for ( int j=0; j<i; j++)
    {
    printf (" %s\n", (p+j)->name);
    printf (" %d\n", (p+j)->price);
    }
}
 
int main()
{
    //std::locale::global(std::locale(""));
    int size=1, i=0, s=0;
 
    Purchase* shoppingCart = new Purchase[100];
    
    i = scan( shoppingCart);
 
     
    print (shoppingCart, i);
 
 
    cout << endl;
    system("pause");
    return 0;
}
0
0 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 47
23.12.2014, 22:23  [ТС] 19
да, обязательно

Добавлено через 1 минуту
Скажите, а какой резон делать проверку сразу ? И так у меня не работает.
0
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
23.12.2014, 22:24 20
Не знаю. По другому у меня не работает. А так вместо очередного name нажимаешь ctrl-Z и Enter - функция завершается.
У меня работает.
0
23.12.2014, 22:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2014, 22:24
Помогаю со студенческими работами здесь

Запись из бинарного файла, в массив структур
Имеется бинарный файл, в него записан массив структур.Как мне произвести запись из файла в массив?

Чтение данных из файла, запись в массив структур
Всем привет, помогите, пожалуйста, с программой. Суть такова: имеется файл вида нужно...

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

Некорректная запись в массив структур
Вообщем написал программу но она работает не совсем корректно на этапе заполнения массива структур...

Считывание(запись) Excel в(из) массив структур
Добрый день. Подскажите пожалуйста как проще выполнить считывание данных с Excel и записать в...

Запись с файла в массив структур + вывод массива на экран
void OUTPUT_clients() { ifstream ifile; ifile.open(&quot;choisestudents.dat&quot;,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru