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

Обработка структур данных - C++

Восстановить пароль Регистрация
 
nakokoko
0 / 0 / 0
Регистрация: 11.03.2011
Сообщений: 25
18.04.2011, 22:31     Обработка структур данных #1
Здравствуйте.никак не могу понять задачу. подскажите решение. в голову ничего не лезит. (задача на языке СИ)
вот условие: Сведения о читателях библиотеки состоят из фамилии, имени, адреса читателя, названия книг, и цены.
а) вывести списоок читателей, которые взяли одинаковые книги.
б) найти названия книгг, цена которых превышает 200 рубл. И вывести список читателей, взявших эти книги.
заранее благодарю.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
19.04.2011, 07:34     Обработка структур данных #2
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct book {
    char title[MAXTITLE];
    unsigned price;
};
 
struct node {
    struct book data;
    struct node *next;
};
 
struct reader {
    char name[MAXNAME];
    char lname[MAXNAME];
    char addr[MAXADDR];
    struct node *books;
};
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
19.04.2011, 07:59     Обработка структур данных #3
...
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
struct Books {
   char *name;
   int cost;
   struct Books *next;
};
 
struct Books *make_book(char *name, int c, struct Books *next)
{
   struct Books *b =(struct Books*)malloc(sizeof(struct Books));
   b->name = (char*)malloc(strlen(name) + 1);
   strcpy(b->name, name);
   b->cost = c;
   b->next = next;
   return b;
}
 
void free_books(struct Books **b)
{
  struct Books *next;
  for (; (*b) != NULL; (*b) = next) {
     next = (*b)->next;
     free(*b);
  }
  *b = NULL;
}
 
struct Reader {
   char *address;
   char *first_name;
   char *last_name;
   struct Books *taken_books;
};
 
struct Reader *make_reader(char *addr,char *fname, char *lname, struct Books *books)
{
   struct Readear *r = (struct Reader*)malloc(sizeof(struct Reader));
   r->address = (char*) malloc(strlen(addr) + 1);
   strcpy(r->address, addr);
   // и так далее
   r->taken_books = books;
   return r;
}
void free_raeder(struct Reader **r)
{
   free((*r)->address);
   // и остальные освободить
   free_books((*r)->taken_books);
   free(*r);
   *r = NULL;
}
 
// ну и там дальше...
int main()
{
   struct Reader * readers[100]; // массив из 100 указателей на структуры Reader
   // открываем, читаем файл file
  int i = 0;
  while (!feof(file)) {
     // считываем данные о читателе...
     char addr[256], fname[32], lname[32];
     fscanf(file, "%s %s %s", addr, fname, lname);
     // ... и о книжках
     struct Books *books= NULL;
     int c;
     // пропускаем разделители
     while (!feof(file) && (c = getc(file), c == ' ' || c == '\t' || c == '\n') ) {}
     if (c == '[') {
        do {
           // считываем книжки точно так же, построчно
           char name[256];
           int cost;
           fscanf(file, "%s %d", buff, &cost);
           books = make_book(name, cost, books);
           // пропускаем разделители
           while (!feof(file) && (c = getc(file), c == ' ' || c == '\t' || c == '\n') ) {}
           if (c == ']') // список книг закончился
              break;
           else
              ungetc(c, file);
         } while(1);
     } else {
       // нет списка книжек дальше, books остался == NULL
       ungetc(c, file);
     }
     readers[i] = make_reader(addr, fname, lname, books);
     ++i;
  }
  // i содержит индекс последнего элемента
  // массив заполнен, работать с ним должно быть легко...
 
  // б)
  int j;
  for (j = 0; j < i + 1; ++j) {
     struct Books * some_book = readers[j]->taken_books;
     while (some_book != NULL) {
        // цена превышает 200 р.
        if (200 < some_book->cost) {
            printf("Reader: %s %s takes book %s of %d rubles\n",
                           readers[j]->first_name, readers[j]->last_name, some_book->name, some_book->cost);
        }
        some_book = some_book->next;
     }
  }
 
  // освободить память
  do {
     free_readaer(&readaers[i]);
  } while (i--);
}
Предполагает что файл имеет следующую структуру:
Код
address1 first_name1 last_name1 [ book_name1 price1 bookname2 price2 ]
address2 first_name2 last_name2 [ book_name3 price3 bookname4 price4 ]
address3 first_name3 last_name3 
address4 first_name4 last_name4 [ book_name1 price1 ]
...
: третий не брал книг, а четвертый читатель взял одну, причем такую же что и первый читатель.

Books это связный список.
задание а) сам сделаешь.

П. С. Не компилировал, как работает не знаю.
nakokoko
0 / 0 / 0
Регистрация: 11.03.2011
Сообщений: 25
20.04.2011, 06:43  [ТС]     Обработка структур данных #4
мне посоветовали сделать так
Уланов|Дмитрий|ул. Детская, дом 3, корпус 19, кв. 52|Мичман Флэндри|90
Денисов|Антон|Спартаковская ул., 92/1|Создание трехмерных персонажей. 3D для дизайнеров|220




потом надо подумать, как программа будет выводить результаты.Без подсветки
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
читатели, взявшие одинаковые книги:
книгу "книга 1" взяли эти читатели:
читатель 1
читатель 2
книгу "книга 2" взяли эти читатели:
читатель 3
читатель 4

книги, цена которых превышает 200 р.:
книгу "книга 1" (ц. 220 р.) взяли эти читатели:
читатель 1
читатель 2
книгу "книга 2" (ц. 330 р.) взяли эти читатели:
читатель 3
читатель 4
мне все это нужно сделать в 1 общий код.посоветуйте как.
nakokoko
0 / 0 / 0
Регистрация: 11.03.2011
Сообщений: 25
20.04.2011, 15:02  [ТС]     Обработка структур данных #5
спасибо. ток я хотел код чуть поменьше. мне посаветовали сделать так
Сначала надо придумать, откуда программа будет получать список книг и читателей.
Например, можно создать текстовый файл библиотека.txt, в который написать "фамилии, имени, адреса читателя, названия книг, и цены."
например:Без подсветки
Уланов|Дмитрий|ул. Детская, дом 3, корпус 19, кв. 52|Мичман Флэндри|90
Денисов|Антон|Спартаковская ул., 92/1|Создание трехмерных персонажей. 3D для дизайнеров|220
потом надо подумать, как программа будет выводить результаты.Без подсветки
читатели, взявшие одинаковые книги:
книгу "книга 1" взяли эти читатели:
читатель 1
читатель 2
книгу "книга 2" взяли эти читатели:
читатель 3
читатель 4

книги, цена которых превышает 200 р.:
книгу "книга 1" (ц. 220 р.) взяли эти читатели:
читатель 1
читатель 2
книгу "книга 2" (ц. 330 р.) взяли эти читатели:
читатель 3
читатель 4
только вот как это в код вывести(определ_) не могу.
P.s Насколько я понял, требуется создать структуру (и потом соответствено объявить переменную на каждого читателя) с полями, содержащими эти данные.

Добавлено через 8 часов 13 минут
получилось у меня так
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
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define n 3
void main()
{struct bibl
{
char fam[40];
char im[30];
char adr[50];
char kn[60];
int cena;
} b[n];
int i,j; char a[60];
for(i=0;i<n;i++)
{gets(b[n].fam);
 gets(b[n].im);
 gets(b[n].adr);
 gets(b[n].kn);
 scanf("%d", &b[n].cena);
 }
 for(i=0;i<n-1;i++)
 for(j=i+1;j<n;j++)
  {
  if(strcmp(b[i].kn,b[j].kn)=0)puts(b[n].fam);
   puts(b[n].im);
  }
 
  for(i=0;i<n;i++)
  {
  if(b[i].cena>=200)puts(b[n].fam);
   puts(b[n].im);
  }
 
 
 }
что дальше непойму.
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
20.04.2011, 15:42     Обработка структур данных #6
Идея верная, дальше заставь программу делать то, что ты от нее ожидаешь (откомпилируй и отладь).

strcmp(b[i].kn,b[j].kn)=0 это присваивание, сравнение оператором == делается.

В этих циклах:
C
1
2
3
4
5
6
for(i=0;i<n-1;i++)
  for(j=i+1;j<n;j++) {
    if(strcmp(b[i].kn,b[j].kn)=0)
      puts(b[n].fam);
    puts(b[n].im);
  }
ты будешь обходить не "для каждого проверить каждый", а "для каждого проверить все с большим индексом". Вроде надо:
C
1
2
3
4
5
6
7
for (i = 0; i < n; ++i) {
  for (j = 0; j < n; ++j) {
    if (i != j) {
      // код для для проверки
    }
  }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2011, 03:22     Обработка структур данных
Еще ссылки по теме:

C++ Обработка массива структур
Обработка данных железнодорожного расписания. Массив структур C++
Обработка данных в виде массива структур средствами языка С++ C++

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

Или воспользуйтесь поиском по форуму:
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.04.2011, 03:22     Обработка структур данных #7
Цитата Сообщение от nakokoko
потом надо подумать, как программа будет выводить результаты
выводить можно разными способами
одна функция может выводить читателя (всю информацию о нём и даже выборочно)
другая функция может выводить книгу

тебе нужно разработать функцию чтения одного читателя из базы читателей
Yandex
Объявления
21.04.2011, 03:22     Обработка структур данных
Ответ Создать тему
Опции темы

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