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

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

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

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

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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.12.2014, 20:53
Ответы с готовыми решениями:

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

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

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

29
31 / 31 / 6
Регистрация: 23.10.2014
Сообщений: 107
23.12.2014, 22:35
Студворк — интернет-сервис помощи студентам
Такой вариант
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
#include <assert.h>
#include <stdio.h>
 
struct Purchase {
    char   name[50];
    double price;
};
 
bool scan(Purchase p[], int i) {
  printf("%s", "Article name: ");
  if (scanf("%s", (p + i)->name) == EOF)
    return false;
 
  printf("%s", "Article price: ");
  if (scanf("%lf", &(p + i)->price) == EOF)
    return false;
 
  assert(p[i].price > 0);
 
  return true;
}
 
void print(Purchase p[], int size) {
  for (int i = 0; i < size; ++i) {
    printf("Article: %s\n", (p + i)->name);
    printf("  Price: %.2f\n", (p + i)->price);
  }
}
 
int main() {
  int count = 0;
 
  Purchase * shopingCart = new Purchase[100];
 
  while (scan(shopingCart, count))
    ++count;
 
  print(shopingCart, count);
 
  delete[] shopingCart;
  return 0;
}
1
0 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 47
23.12.2014, 23:13  [ТС]
А вот так заработало, спасибо

Добавлено через 26 минут
А не могли бы вы мне тут помочь. Нужно самый дешевый товар найти.
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
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <assert.h>
 
 
struct Purchase {
    char   name[50];
    int price;
};
 
bool scan(Purchase p[], int i) {
  printf("%s", "Article name: ");
  if (scanf("%s", (p + i)->name) == EOF)
    return false;
 
  printf("%s", "Article price: ");
  if (scanf("%d", &(p + i)->price) == EOF)
    return false;
 
  assert(p[i].price > 0);
 
  return true;
}
 
void print(Purchase p[], int size) {
    for (int i = 0; i < size; ++i) {
    printf("Article: %s\n", (p + i)->name);
    printf("  Price: %d\n", (p + i)->price);
  }
}
 
char  cheap( Purchase* p, int n )
{
    int cheap = p->price;
    int index=0;
 
    for( int i=1; i<n; i++) 
    {
        if( (p+i)->price < cheap )
        {
            cheap=(p+i)->price;
            index=i;
        }
    }
    return (p+index )->name; 
}
 
int main() {
    int count = 0, size=100;
    char cheapProduct[50];
    char expenProduct;
 
    Purchase * shopingCart = new Purchase[size];
 
    while (scan(shopingCart, count))
     ++count;
 
    print(shopingCart, count);
 
    cheapProduct = (cheap( shopingCart, size ));
    
    printf( "\nThe cheapest purchase is %s", cheapProduct );
 
    delete[] cheapProduct;
    delete[] shopingCart;
    
  return 0;
}
0
31 / 31 / 6
Регистрация: 23.10.2014
Сообщений: 107
23.12.2014, 23:16
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
Purchase * cheap( Purchase* p, int n )
{
    int cheap=p->price;
    int index=0;
 
    for( int i=1; i<n; i++) 
    {
        if( (p+i)->price < cheap )
        {
            cheap=(p+i)->price;
            index=i;
        }
    }
    return (p+index); 
}
 
int main() {
    int count = 0, size=100;
    Purchase * cheapProduct = NULL;
    Purchase * expenProduct = NULL;
 
    Purchase * shopingCart = new Purchase[size];
 
    while (scan(shopingCart, count))
     ++count;
 
    print(shopingCart, count);
 
    cheapProduct = cheap( shopingCart, size );
    
    printf( "\nThe cheapest purchase is %s", cheapProduct->name );
 
    delete[] shopingCart;
  return 0;
}
0
0 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 47
23.12.2014, 23:23  [ТС]
Выдает какой-то бред
0
31 / 31 / 6
Регистрация: 23.10.2014
Сообщений: 107
23.12.2014, 23:30
cheapProduct = cheap( shopingCart, count);
0
0 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 47
23.12.2014, 23:32  [ТС]
О да, спасибо
0
31 / 31 / 6
Регистрация: 23.10.2014
Сообщений: 107
23.12.2014, 23:43
Да, кстати, delete/delete[] нужно применять только если память под массив была выделена динамически т.е через new или new[]. Причем delete, если new, и delete[], если new[], и только так.
C++
1
2
3
4
5
6
7
8
9
10
11
int main() {
  int * dyn_ar = new int[10];
  int * dyn_int = new int;
  int   stat_ar[10];
 
  delete dyn_int; // правильно
  delete[] dyn_ar; // правильно
//  delete dyn_ar; // ошибка
//  delete[] stat_ar; // ошибка
//  delete stat_ar; // ошибка
}
А то у вас было
C++
1
2
3
4
5
6
int main() {
  <...>
  char cheapProduct[50];
  <...>
  delete[] cheapProduct;
}
0
0 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 47
24.12.2014, 00:26  [ТС]
Спасибо)

Добавлено через 2 минуты
А можете ещё помочь найти повторяющиеся товары и товары, имеющие одинаковую цену. Мои функции не работают
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
void sameGoods( Purchase* p, int n )
{
    bool exit=false;
    printf("Repetitive purchases are ");
    for( int i=0; i<n; i++ )
    {
        for( int j=1; j<n; j++ )
        {
            if ( (p+i)->name == (p+j)->name)
            {
                printf ("\n%s\n", (p+i)->name);
                exit=true;
                break;
            }
        }
        if( exit ) break;
    }
}
 
void samePrice( Purchase* p, int n )
{
    printf("Products which have the same price are ");
    for( int i=0; i<n; i++ )
    {
        for( int j=1; j<n; j++ )
        {
            if ( (p+i)->price == (p+j)->price)
            {
                printf ("\n%s\n", (p+i)->name);
                break;
            }
        }
    }
}
0
31 / 31 / 6
Регистрация: 23.10.2014
Сообщений: 107
24.12.2014, 01:27
Строки нужно сравнивать функцией strcmp(str1, str2).

Добавлено через 33 минуты
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
void sameGoods( Purchase* p, int n )
{
    Purchase ** repeats = new Purchase*[n];
    int rep_count = 0;
 
    for (int i = 0; i < n - 1; ++i) {
      for (int j = i + 1; j < n; ++j) {
        if (strcmp((p+i)->name, (p+j)->name) == 0) {
          bool appear = false;
 
          for (int k = 0; k < rep_count && !appear; ++k) {
            if (strcmp(repeats[k]->name, (p+i)->name) == 0)
              appear = true;
          }
 
          if (!appear)
            repeats[rep_count++] = p+i;
        }
      }
    }
 
    printf("Repetitive purchases are ");
 
    for (int i = 0; i < rep_count; ++i)
      printf ("\n%s\n", repeats[i]->name);
 
    delete[] repeats;
}
Вторую - по аналогии.
0
0 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 47
25.12.2014, 17:10  [ТС]
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.12.2014, 17:10

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
BitTorrent (версия 7.11 English) и Меню Настройки
russiannick 15.11.2026
Пункты, отвечающие за отключение обновлений в BitTorrent версии 7. 11 (английской) Options Preferences General Language
Транслитерация текста с кириллицы на латиницу (вариант №4)
Maks 15.11.2026
Что-то я перемудрил с предыдущими версиями, в этот раз сделал всё проще, обратившись к функции "СтрокаЛатиницей" из типового общего модуля "СтроковыеФункцииКлиент". В данной функции нет апострофов,. . .
BitTorrent (версия 4.3.9) и Меню Настройки
russiannick 15.11.2026
В меню Настройки можно отключить автоматическое обновление программы. Карта этого меню приложена ниже. Нужный пункт выделен красным. Сервис Настройки Поведение
Транслитерация текста с кириллицы на латиницу (вариант №3)
Maks 15.11.2026
Обновленная версия предыдущей обработки. Изменения коснулись букв: Ъ, Ы, Ь, Э, отображения которых зависят от положения реквизита "Транслитерация имён". Изменено отображение буквы Й. Добавлена. . .
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru