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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2020, 08:25   #1
Константин01
Пользователь
 
Регистрация: 11.05.2019
Сообщений: 21
По умолчанию Асинхронный сбор данных с циклическим буфером

Условия задачи прикреплены. Вкратце, реализовать асинхронный сбор данных с помощью циклического буфера. Вот мой код:

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

struct circular_buffer
{
  char *cycleBuf;
  char tail;
  char head;
  char size;
  size_t capacity;
};

void init(struct circular_buffer *cb, size_t capacity)
{
  cb->cycleBuf = (char*)malloc(sizeof(int)*capacity);
  cb->tail = 0;
  cb->head = 0;
  cb->size = 0;
  cb->capacity = capacity;
}

void push(struct circular_buffer *cb, char item, FILE* fp2)
{
  if (cb->size == cb->capacity)
    fprintf(fp2, "Memory overflow\n");
  else
  {
    cb->cycleBuf[cb->tail] = item;
    //printf("%d was pushed\n", cb->cycleBuf[cb->tail]);
    cb->size++;
    cb->tail++;
    if (cb->tail >= cb->capacity) cb->tail = 0;
  }
}

char pop(struct circular_buffer *cb)
{
  char result = 0;
  if (cb->size > 0)
  {
    result = cb->cycleBuf[cb->head];
    cb->cycleBuf[cb->head] = 0;
    cb->size--;
    cb->head++;
    if (cb->head == cb->capacity) cb->head = 0;
  }
  return result;
}

int main(void) 
{
  FILE *fp1, *fp2;
  fp1 = fopen("input.txt", "r");
  fp2 = fopen("output.txt", "w");
  
  int N, M;

  fscanf(fp1, "%d", &N);
  fscanf(fp1, "%d", &M);

  struct circular_buffer cb;
  init(&cb, N);

  int k = 0;
  int temp = 0;
  int sum = 0;
  while (k < M)
  {
    int R = 0;
    fscanf(fp1, "%d", &R);
    k += 1;
    if (R > 0)
    {
      for (int i=0;i<R;i++)
      {
        fscanf(fp1, "%d", &temp);
        k += 1;
        push(&cb, temp, fp2);
      }
    }
    
    if (R < 0)
    {
      sum = 0;
      int l = 0;
      for (int i=0;i<abs(R);i++)
      { 
        temp = pop(&cb);
        //printf("%d was poped\n", temp);
        if (temp != 0)
        {
          l += 1;
          sum += temp;
        }
        else 
        {
          if (l != 0) fprintf(fp2, "%d\n", sum/l);
          fprintf(fp2, "Empty queue\n");
          break;
        }
      }
      if (temp != 0 && l != 0) fprintf(fp2, "%d\n", sum/l);
    }
  }

  return 0;
}
Тест из примера проходит, а следующие тесты - нет. Не могу понять в чем проблема. Прошу посмотреть код, или если кто-то уже видел решение этой задачи - кинуть ссылку. Буду благодарен.
Изображения
Тип файла: jpg 13.jpg (53.3 Кб, 0 просмотров)
Константин01 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сбор данных JS Юрий241 JavaScript, Ajax 0 27.01.2019 14:06
Сбор данных RelaX Inc. Безопасность, Шифрование 8 28.03.2013 17:55
Вопросы по передаче данных. Синхронный, асинхронный режимы. Коэффициент сжатия. Zyek Помощь студентам 1 22.10.2010 15:47
Сбор данных OgE®_M@G Microsoft Office Excel 6 05.11.2008 05:57
работа с буфером данных alexs2141 Общие вопросы C/C++ 5 06.06.2008 12:45