3 / 3 / 0
Регистрация: 22.09.2015
Сообщений: 124

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

10.12.2015, 13:39. Показов 5198. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru