Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2014, 19:21   #21
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

Код:
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>
#include <stdbool.h>

enum { N = 4 };

typedef struct Queue
{
    int data[N];
    int last;
} Queue;

void Creation(Queue *Q)
{
    Q->last = 0;
}

bool Empty(Queue *Q) 
{
    return (Q->last == 0);
}

void Add(Queue *Q)
{
    if (Q->last == N)
    {
        printf("\nОчередь заполнена\n\n");
        return;
    }
    int value;
    printf("\nзначение > ");
    scanf("%d", &value);
    Q->data[Q->last++] = value;
    printf("\nЭлемент добавлен в очередь\n");
}

void Delete(Queue *Q)
{
    int i;
    for (i = 0; i < Q->last - 1; ++i)
        Q->data[i] = Q->data[i + 1];
    --Q->last;
}

int Top(Queue *Q)
{
    return Q->data[0];
}

int Count(Queue *Q)
{
    return Q->last;
}

int main()
{
    setlocale(LC_ALL, "Rus");
    Queue Q;
    Creation(&Q);
    int number;
    do {
        printf( "1. Добавить элемент\n" );
        printf( "2. Удалить элемент" );
        printf( "3. Вывести верхний элемент\n" );
        printf( "4. Узнать размер очереди\n" );
        printf( "0. Выйти\n\n");
        printf( "Номер команды > ");
        scanf("%d", &number);
        switch (number) {
            case 1:
                Add(&Q);
                break;
            case 2:
                if (Empty(&Q))
                    printf("\nОчередь пуста\n\n");
                else {
                    Delete(&Q);
                    printf("Элемент удален из очереди\n\n");
                }
                break;
            case 3:
                if (Empty(&Q))
                    printf("Очередь пуста\n\n");
                else {
                    printf("\nНачальный элемент:\n\n");
                    Top(&Q);
                }
                break;
            case 4:
                if (Empty(&Q))
                    printf("Очередь пуста\n\n");
                else {
                    printf("\nНачальный элемент:\n\n");
                    Count(&Q);
                }
                break;
            case 0:
                break;
            default:
                printf("Команда не определена\n\n");
                break;
        }
	} while (number);
	system("pause");
    return 0;
}
А вообще такая реализация очереди не очень. При удалении 1 элемента копировать оставшиеся слишком дорого. Лучше реализовывать кольцевой массив (указатели на первый и последний элементы).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 04.04.2014, 20:23   #22
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

У меня в задании есть записи продажа и покупка(товара).Запись о продаже содержит префикс “S” и количество товара.Запись о закупке содержит префикс “R”, количество товара и стоимость одного изделия.ТО есть мне нужно чтобы у каждой единицы товара были свои характеристики - цена, например?
East Undia Trading вне форума Ответить с цитированием
Старый 07.04.2014, 21:40   #23
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

А что нужно сделать? Сказать, сколько осталось товара или сколько денег заработали?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 08.04.2014, 01:56   #24
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

BDA, нужно что-то в этом роде, после продажи, выводилось например:
50 штук по 1.50$ каждый на сумму 75.00$
150 штук по 1.32$ каждый на сумму 198.00$
Всего продано на сумму 273.00$
Я не понимаю, как сделать чтобы каждый добавленный элемент имел собственную цену?
East Undia Trading вне форума Ответить с цитированием
Старый 08.04.2014, 02:16   #25
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

Стоимость продажи равна стоимости закупки? Продается один и тот же товар?
Что должно вывестись при таких входных данных:
Цитата:
R 10 1
R 5 2
S 7
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 08.04.2014, 05:29   #26
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

BDA, продажа происходит с 20% надбавкой.Товар один и тот же.Да, что такое префиксы я сразу смекнул.
East Undia Trading вне форума Ответить с цитированием
Старый 08.04.2014, 05:31   #27
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

Так а что по примеру входных данных? Сначала продают самые дешевые? Или в порядке, обратном поступлению?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 08.04.2014, 20:24   #28
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

BDA, наверно не получится нормально передать цель, вот полный текст задания:
Цитата:
Фирма по хранению и сбыту бытовых инструментов получает грузы с оборудованием по различным ценам и продает их затем с 20%-ной надбавкой, причем товары, полученные ранее, продаются в первую очередь (структура данных – очередь). Напишите программу, считывающую записи о торговых операциях двух типов: операции по закупке и операции по продаже. Запись о продаже содержит префикс “S” и количество товара. Запись о закупке содержит префикс “R”, количество товара и стоимость одного изделия. После считывания записи о закупке напечатайте ее с указанием стоимости всей партии. После считывания записи об операции продажи напечатайте, сколько изделий было продано, цену одного изделия в каждой продаваемой партии, стоимость каждой партии и суммарную стоимость всей сделки. Например, если фирмой были проданы 200 единиц оборудования, в которые входили 50 единиц с закупочной ценой 1.25$ и 150 единиц с закупочной ценой 1.1$, то напечатаны должны быть три строки:
50 штук по 1.50$ каждый на сумму 75.00$
150 штук по 1.32$ каждый на сумму 198.00$
Всего продано на сумму 273.00$
Если на складе отсутствует требуемое в заказе число изделий, то продайте все имеющиеся, а затем напечатайте сообщение об отсутствии остальной части изделий на складе.
East Undia Trading вне форума Ответить с цитированием
Старый 08.04.2014, 22:20   #29
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

Вот теперь более-менее понятно. Вышереализованную очередь лучше не использовать, так как количество партий товара заранее неизвестно. При поступлении товара, он заносится в очередь в виде "количество, стоимость единицы товара". При продаже товара нужно правильно "забирать" партии товара с начала очереди. Начать стоит с разработки очереди на динамической памяти, а не на массиве.
Код:
typedef struct QueueElem {
    int count, cost;
    struct QueueElem *next;
} QueueElem;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.04.2014, 01:40   #30
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

BDA, мне можно за основу взять пример вот этой программы?
Код:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

#define MAX 100

char *p[MAX], *qretrieve(void);
int spos = 0;
int rpos = 0;
void enter(void), qstore(char *q), review(void), delete_ap(void);

int main(void)
{
  char s[80];
  register int t;

  for(t=0; t < MAX; ++t) p[t] = NULL; /* иницилизировать массив
                                         пустыми указателями */

  for(;;) {
    printf("Ввести (E), Список (L), Удалить (R), Выход (Q): ");
    gets(s);
    *s = toupper(*s);

    switch(*s) {
      case 'E':
        enter();
        break;
      case 'L':
        review();
        break;
      case 'R':
        delete_ap();
        break;
      case 'Q':
        exit(0);
    }
  }
  return 0;
}

/* Вставка в очередь новой встречи. */
void enter(void)
{
  char s[256], *p;

  do {
    printf("Введите встречу %d: ", spos+1);
    gets(s);
    if(*s==0) break; /* запись не была произведена */
    p = (char *) malloc(strlen(s)+1);
    if(!p) {
      printf("Не хватает памяти.\n");
      return;
    }
    strcpy(p, s);
    if(*s) qstore(p);
  } while(*s);
}

/* Просмотр содержимого очереди. */
void review(void)
{
  register int t;

  for(t=rpos; t < spos; ++t)
    printf("%d. %s\n", t+1, p[t]);
}

/* Удаление встречи из очереди. */
void delete_ap(void)
{
  char *p;

  if((p=qretrieve())==NULL) return;
  printf("%s\n", p);
}

/* Вставка встречи. */
void qstore(char *q)
{
  if(spos==MAX) {
    printf("List Full\n");
    return;
  }
  p[spos] = q;
  spos++;
}

/* Извлечение встречи. */
char *qretrieve(void)
{
  if(rpos==spos) {
    printf("Встречь больше нет.\n");
    return NULL;
  }
  rpos++;
  return p[rpos-1];
}
East Undia Trading вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в коде программы (для индекса требуется массив или указатель). Язык Си Семижон Евгения Помощь студентам 7 20.01.2014 02:45
Ошибка в коде программы.Язык Си. East Undia Trading Помощь студентам 8 19.01.2014 21:03
Ошибка в ходе программы, требуется пояснение... kotzzz Мультимедиа в Delphi 2 14.04.2010 14:31
Язык программы KWN, lnc Общие вопросы Delphi 1 22.01.2010 22:33
как в цикле создавать массив с одним и тем же именем!?ошибка в ходе выполнения -access violation at addr sleevman Помощь студентам 2 28.10.2009 19:06