Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124

Задачка про Винни Пуха мед и пчел

10.12.2015, 13:39. Показов 5189. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть задача
"Винни-Пух и пчелы. Заданное количество пчел добывают мед равными порциями, задерживаясь в пути на случайное время. Винни-Пух потребляет мед порциями заданной величины за заданное время и столько же времени может прожить без питания. Работа каждой пчелы реализуется в порожденном процессе. Процесс обмена информации между процессами происходит с помощью очередей сообщений"
Сучть задачи есть родительский процесс(бочка), и дочерние (4 пчелы и медведь) пчелы. Пчелы носят мед медведь его ест
Начал выполнять задачу и столкнулся с тем что при извлечении сообщения из очереди считывается что попало в переменную а не то что нужно не могу понять в чем ошибка делаю как в литературе
В приведенном куске кода просто реализован один дочерний процесс который шлет родителю сообщение а тот его приничает
но как оказалось не принимает
помогите найти ошибку

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
#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <wait.h>
#include <sys/stat.h>
 
//struct buf {long type; char text[100];}; 
int main (int argc, char* argv[]) 
{
    if (argc<7)
    {
      printf("Формат запуска: вместительность бочки,начальное количество меда, количество пчел, величина потребления меда, время потребления  \n");
      exit (0);
    }
    //buf mymsg;
    int barrelhoney=atoi(argv[1]);
    printf("Вместительность бочки %d грамм\n", barrelhoney);
    int initialamount=atoi(argv[2]);
    printf("Начальное количество меда в бочке =  %d грамм\n", initialamount);
    int bee=atoi(argv[3]);
    printf("Количество пчел %d \n", bee);
    int quantity=atoi (argv[4]);
    int time=atoi(argv[5]);
    printf("Медведь потребляет по  %d грамм меда каждые %d секунд\n", quantity, time);    
    int gramm=atoi(argv[6]);
    printf("Каждая пчела приносит по  %d грамм \n", gramm);
    pid_t pid;
    int porciya=10, length, cont=0, mq_id;
    char str1[100];
    key_t ipckey;
    struct {long type; char text[100];}mymsg;
    length=sizeof(mymsg)-sizeof(long);
    ipckey=ftok("/tmp/foo", 42);
    printf("key = %d\n",ipckey );
    mq_id = msgget(ipckey, IPC_CREAT | 0666);
    printf("mq_id = %d\n",mq_id );
    if (!(pid=fork())) 
    {
        printf("Сын - key = %d\n", ipckey);
        printf("сын -mq_id = %d\n",mq_id );
        memset (mymsg.text,0,100);
        strcpy(mymsg.text,"10");
        mymsg.type=1;        
        printf("mymsg.text= %s\n", mymsg.text);
        msgsnd(mq_id, &mymsg,length,0);
        return 0;
    }
    printf("Отец - ipckey = %d\n", ipckey);
    sleep(2);
    msgrcv(mq_id, &mymsg,length,1,0);
    printf("Отец - сообщение: %s\n",  mymsg.text);
    return 0;
}
Добавлено через 3 часа 45 минут
пока ждал ответа смог сделать чтобы одна пчела наполняла бочку
но теперь не могу сделать чтобы бочку наполняли несколько пчел
не получается расфоркать 4 процесса

программа на одну пчелу и без медведя выглядить так
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
#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <wait.h>
#include <sys/stat.h>
 
//struct buf {long type; char text[100];}; 
int main (int argc, char* argv[]) 
{
    if (argc<7)
    {
      printf("Формат запуска: вместительность бочки,начальное количество меда, количество пчел, величина потребления меда, время потребления  \n");
      exit (0);
    }
    //buf mymsg;
    int barrelhoney=atoi(argv[1]);
    printf("Вместительность бочки %d грамм\n", barrelhoney);
    int initialamount=atoi(argv[2]);
    printf("Начальное количество меда в бочке =  %d грамм\n", initialamount);
    int bee=atoi(argv[3]);
    printf("Количество пчел %d \n", bee);
    int quantity=atoi (argv[4]);
    int time=atoi(argv[5]);
    printf("Медведь потребляет по  %d грамм меда каждые %d секунд\n", quantity, time);    
    //int gramm=atoi(argv[6]);
    printf("Каждая пчела приносит по  %s грамм \n", argv[6]);
    pid_t pid;
    int porciya=0, length, cont=0, mq_id;
    char str1[100];
    key_t ipckey;
    struct {long type; char text[100];}mymsg;
    length=sizeof(mymsg)-sizeof(long);
    ipckey=ftok("/tmp/foo", 42);
    printf("key = %d\n",ipckey );
    mq_id = msgget(ipckey, IPC_CREAT | 0666);
    printf("mq_id = %d\n",mq_id );
    //for (int i=1; i<=bee; i++)
    if (!(pid=fork())) 
    {
       for (int i=1;initialamount<barrelhoney;i++)
        {
            memset (mymsg.text,0,100);
            strcpy(mymsg.text,argv[6]);
            mymsg.type=1;
            msgsnd(mq_id, &mymsg,length,0);
            sleep (2);
        }
        return 0;
    }
    for (int i=1;initialamount<barrelhoney;i++)
    {
    //sleep(2);
    msgrcv(mq_id, &mymsg,length,1,0);
    printf("Пчела принесла %s грамм меда\n",  mymsg.text);
    initialamount+=atoi(mymsg.text);
    printf("В бочке %d грамм меда\n", initialamount);}
    msgctl (mq_id, IPC_RMID,0);
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.12.2015, 13:39
Ответы с готовыми решениями:

Вес Винни - Пуха
Всем доброе утро, знаю что была эта тема, но решали её через паскаль, как сделать её в делфи. не знаю даже через какие компоненты. помогите...

Проверить, все ли в порядке с ритмом стиха Винни-Пуха...
Винни-Пух попросил вас посмотреть, есть ли в его стихах ритм. Поскольку разобраться в его кричалках не настолько просто, насколько легко он...

Определить, на каком дне рождения вес съеденной пищи превысит собственный вес Винни – Пуха
На каждом следующем дне рождения Винни – Пух съедает столько же пищи, сколько на двух предыдущих. На двух первых днях рождения у Пятачка и ...

2
 Аватар для bsa916115
51 / 24 / 12
Регистрация: 10.10.2015
Сообщений: 107
10.12.2015, 22:51
У Вас в программе один fork(), а надо их сделать 5. 4 пчелы и медвед. Лучше для пчел написать свою функцию, которая пишет в очередь, а для медведа другую, которая читает.
Если говорить о межпроцессном обмене и желании всех процессов узнать сколько меда реально есть, то здесь надо разделяемую память задействовать.
0
3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124
11.12.2015, 08:25  [ТС]
bsa916115, разделяемая память это будет след лаба а сейчас задание именно через очереди сообщений сделать
А по поводу форков на 5процессов я знаю
Просто у меня не получается сделать нормально
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.12.2015, 08:25
Помогаю со студенческими работами здесь

Определить, на каком дне рождения вес съеденной пищи превысит собственный вес Винни-Пуха
На каждом следующем дне рождения Винни-Пух съедает столько же пищи, сколько на двух предыдущих. На двух первых днях рождения у Пятачка и...

Определить, на каком дне рождения вес съеденной пищи превысит собственный вес Винни-Пуха
На каждом следующем дне рождения Винни-Пух съедает столько же пищи, сколько на двух предыдущих. На двух первых днях рождения у Пятачка и...

задачка про частицы
Компоненты ускорения частицы, движущиеся в плоскости xy равны: Ax=2A Ay=2B где A и B - положительные постоянные. В момент t=0 координаты...

Задачка про домино
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace...

задачка про автомобиль
Автомобиль движется со скоростью 60 км/ч. Внешний диаметр покрышек колес равен 60 см. Найти величину нормального ускорения внешнего слоя...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru