Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите решить задачу!  (Прочитано 8169 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Nox
Гость
« : 17-11-2004 19:09 » 

В файле хранятся данные о работе склада с указаниям названия, номер полки, количество в наличеи товара!
Выдать на екран перечень тех товаров которых менше 5 в наличеи на складе!
Помогите записать класс со списком!

const n=3; // количество товаров
// заданная структура
struct firma {
char tovar[10]; // наименование товара
char polka[10]; // номер полки
char kolvo[10]; // количество
}


class sklad{
public:
void file(); //Вывод даных из файла
void sort(); //Сортитровка данных
private:
main firma; //Структура! Как зделать структуру масивом??? firma [n] << так?

как тута еще зделать список???
Помогите пожалуста решить ету задачу, а то у меня осталось две темы классы и списки и я их не как немогу здать, а завтра последний день!
Или приведите пример похожей програмы!
Зарание спасибо!
Записан
rebel
Гость
« Ответ #1 : 17-11-2004 21:13 » 

Цитата
main firma; //Структура! Как зделать структуру масивом??? firma [n] << так?

Так.

Цитата
как тута еще зделать список???

struct firma {
char tovar[10]; // наименование товара
char polka[10]; // номер полки
char kolvo[10]; // количество
struct firma *next;
}
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 17-11-2004 21:17 » 

Код:
const int n = 10;

....

int main()
{
   ....
   firma f[n];
   ....
}

Классический список подразумевает включение в структуру ссылку на следующий элемент (однонаправленный список)

Код:
struct Position
{
    std::string GoodsName;  // название товара
    int Shelf; // номер полки
    int Count; // количество товара

    Position *next; // указатель на следующий
};

или двунаправленный

Код:
struct Position
{
    std::string GoodsName;  // название товара
    int Shelf; // номер полки
    int Count; // количество товара

    Position *next; // указатель на следующий
    Position *prev; // указатель на предыдущий
};

Лучше стандартной библиотекой.

Код:
#include <list>
#include <string>

class Position // запись
{
  public:
      ... // вставить свои методы
  private:
    std::string GoodsName;  // название товара
    int Shelf; // номер полки
    int Count; // количество товара
};

class Warehouse
{
  public:
     ... // вставить свои методы
  private:
    std::list <Position> lp;
};
« Последнее редактирование: 02-12-2007 18:12 от Алексей1153++ » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Nox
Гость
« Ответ #3 : 17-11-2004 22:33 » 

А как теперь етот указатель(двухнаправленый) использовать в програме! Если можно покажите пример!
И как ето связать с класом!
Записан
rebel
Гость
« Ответ #4 : 18-11-2004 08:51 » 

пример использования однонаправленного списка
Код:
//функция Индекс, которая по заданному значению i возвращала значение
//элемента входного списка L
#include <stdlib.h>
#include <stdio.h>
struct cell{
   unsigned char number;
   char surname[10];
   char name[8];
   struct cell *pc;
   };
 struct cell *current;//указатель на текущий список
 struct cell *beg=NULL;//указатель на первый элемент списка
 struct cell *end=NULL;//указатель на последний элемент списка
 int count=0;
void index(int i)
{int j=0;
current=beg;
while(i!=++j)
{current=current->pc;}
printf("\n%2d %10s %8s",current->number,current->surname,current->name);
}

void main()
{int y;
 //цикл ввода и формирования списка
 do
{current=(struct cell *)malloc(sizeof(struct cell));
 //Ввод списка
 printf("\nEnter number: ");
 scanf("%d",&current->number);
if (current->number==0) {free(current);break;}//Выход из цикла ввода списка
 printf("Enter Surname: ");
 scanf("%s",&current->surname);++count;
 printf("Enter name: ");
 scanf("%s",&current->name);

if (beg==NULL && end==NULL) beg=current;
else end->pc=current;//Включить в уже существующий список
end=current;
end->pc=NULL;
}
while (1); //конец ввода списка
//Вывод содержимого списка
if (count==0) {printf("\n\nList not found");goto END;}
printf("\nCurrent list:");
current=beg;
while(current!=NULL)
{
printf("\n%2d %10s %8s",current->number,current->surname,current->name);
current=current->pc;
}
do
{printf("\n\nWhat record do you what to see? ");
scanf("%d",&y);
if ((y<=count)&&(y>0)) break;
else printf("Wrong number of record.Try again");}
while (1);
index(y);END:getch();
}
в двунаправленном, указатель *prev будет указывать на предыдущий элемент списка, аналогично тому, как *next на след. Использование аналогично однонаправленному + возможность прохода по списку из конца в начало.
« Последнее редактирование: 02-12-2007 18:14 от Алексей1153++ » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 18-11-2004 08:52 » 

в твоём примере наблюдается смешение C и C++. Так, конечно, можно. Но данная задача такого смешения, в общем, не требует.

Для понимания лучше код на C, чтобы видна была суть, которая потеряется за лесом методов при использовании классов. Пример без ввода данных, который строит пустой список, затем проходит по нему, затем удаляет.

Код:
#include <stdlib.h>

#define N 10

/* структура пустого двунаправленного списка */
struct Item
{
  struct Position *next;
  struct Position *prev;
};

int main()
{
  /* рабочий указатель и голова списка (указатель на начало) */
  struct Item *p = NULL, *head = NULL;
  int i;

  /* создаём список длиной 10 */
  for(i = 0; i < N; ++i)
  {
    /* создаём в памяти новый элемент (в С++ это делает new) */
    p = (struct Item *)malloc(sizeof(struct Item));
    if(p == NULL) return -1; /* ошибка выделения памяти */
    /* добавляем элемент в начало списка */
    p->prev = head; /* говорим, что предыдущим для нового будет старая голова */
    if(head != NULL) head->next = p; /* говорим, что для головы следующим будет новый (если голова не пуста) */
    p->next = NULL; /* для нового следующего пока нет */
    /* теперь мы привязали новый к списку */
    head = p; /* перемещаем голову на новый */
  }

  /* проход списка от начала в конец */
  p = head;
  if(p != NULL) /* если список не пуст */
  {
    while(p->prev != NULL) /* идём до последнего элемента, у которого уже нет предыдущего */
      p = p->prev;
    head = p; /* теперь голова в хвосте */
  }
  /* проход списка в обратном направлении */
  if(p != NULL) /* если список не пуст */
  {
    while(p->next != NULL) /* идём в обратную сторону до первого элемента, у которого нет следующего */
      p = p->next;
    head = p; /* теперь голова в начале */
  }
  /* вставим в середину элемент */
  if(head != NULL) /* подвинем голову куда-нибудь в середину */
    for(i = 0; i < 5 && head->prev != NULL; ++i)
      head = head->prev;
  /* создаём новый */
  p = (struct Item *)malloc(sizeof(struct Item));
  if(p == NULL) return -1; /* ошибка выделения памяти */
  /* вставляем новый между головой и следующим за ней элементом */
  p->next = head->next; /* ссылки нового на своих соседей */
  p->prev = head;
  /* ссылки соседей на нового */
  if(head->next != NULL) head->next->prev = p;
  head->prev = p;
  /* теперь связь между head и head->next разорвана и замкнута на новый элемент с обоих концов */
  /* удаление из середины элемента */
  p = head->prev; /* его будем удалять */
  /* замыкаем ссылки с головы и элемента через один от голову друг на друга */
  if(p != NULL)
  {
    /* голова ссылается на предыдущий перед удаляемым */
    if(p->prev != NULL) head->prev = p->prev;
    /* предыдущий перед удаляемым ссылается на голову */
    if(head->prev != NULL) head->prev->next = head;
    free(p); /* удаляем в (C++ это делает delete) */
  }
  /* удаление списка */
  while(head != NULL)
  {
    p = head;
    head = head->prev; /* сместили голову на один вперёд, а p остался на крайнем элементе, теперь его удалим */
    free(p);
  }
}

Код написан без проверки, так что может где и ошибся, но вроде должно работать.
« Последнее редактирование: 02-12-2007 18:16 от Алексей1153++ » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines