Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Aecttann
6 / 6 / 0
Регистрация: 19.10.2013
Сообщений: 320
#1

Добыча золота в варкрафт - C++

10.04.2014, 00:57. Просмотров 751. Ответов 1
Метки нет (Все метки)

Заданное количество юнитов добывают золото равными порциями из одной шахты, задерживаясь в пути на случайное время, до ее истощения.
Написать программу работы одного юнита.
Код работает неправильно: вместо того, чтобы шахта истощилась и работа программы завершилась - количество принесённого золота увеличивается и увеличивается до тех пор, пока система полностью не зависает.
Подскажите, пожалуйста, где ошибка.

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
#include <iostream>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
 
 
using namespace std;
 
int f(int z);
 
int spawn (int S)
{
    pid_t child_pid;
    child_pid = fork();
    if(child_pid!=0)
        return child_pid;
    }
 
 
int main()
{
    srand(time(0));
    setlocale(LC_ALL,"RUS");
 
    int unit, gold_per_unit, gold,time1=3,i, B;
    cout<<"введите начальное количество золота в руднике = ";
    cin>>gold;
    cout<<"введите количество золота, которое 1 юнит приносит за 1 ходку ";
    cin>>gold_per_unit;
    cout<<"введите количество юнитов ";
    cin>>unit;
    B=rand()%unit+2;
 
 
    while(gold>=0)
    {
        cout<<"Количество золота = "<<gold<<endl;
        cout<<"Юниты в пути..."<<endl;
 
        if(gold==0)
            break;
       else spawn(S);
 
 
        gold=gold+unit*gold_per_unit;
 
 
          cout<<"Юниты принесли "<<unit*gold_per_unit<<" золота!"<<endl;
    }
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2014, 00:57     Добыча золота в варкрафт
Посмотрите здесь:

Найдите максимальный вес золота, который можно унести в рюкзаке вместительностью S, если есть N золотых слитко - C++
Найдите максимальный вес золота, который можно унести в рюкзаке вместительностью S, если есть N золотых слитков с заданными весами. ...

База данных с++ "Добыча угля" (Отчет по практике) - C++
Доброго времени суток! Люди помогите создать базу данных по добыче угля,производственная практика уже заканчивается а программы нет(незнаю...

Варкрафт кикает с WINDOWS 7... - Windows 7
Захожу в батлу,всё хорошо по взрослому начинаю играть концентрируюсь и тут начинает подлагивать после чего проходит одна минута и меня...

Как установить Варкрафт на Windows 7 ??? - Windows 7
Люди, помогите пожалуйста установть варку 3 на WINDOWS 7 ??? Проблема такая: запускаю варку вроде бы начинает запускаться и бац выдает...

Варкрафт 3, ДОТА: пишите, поиграем - MMO игры
Кто-то играет? Если да - пишите, поиграем...а то из знакомых мало кто с дотой дружит, а боты надоели)

Добыча из URL - PHP
У меня url такого вида http://saitotot.com/page.php/id1. Как мне добыть цифру 1 или которая там . Вот такое не выходит if...

Стянуть котировки золота и нефти - MS Excel
Function Цена_квартиры() Dim URL, ZEN, XMLHTTP As Object, XX: URL = &quot;http://www.rosrealt.ru/Rostov_na_Donu/cena&quot; Set XMLHTTP =...

Самый быстрый суперкомпьютер замедлился из-за золота - Компьютерное железо
В ноябре прошлого года суперкомпьютер Titan в Национальной лаборатории Ок-Ридж (США) был назван самым быстрым в мире. Однако теперь...

Как получить много золота с помощью WPE PRO? - MMO игры
Вообще тут есть оонлайн мморпг игра, в ней многие пользуются этой прогой, потому что я никогда не поверю что можно вложить в игру 600 тысяч...

Найдите максимальный вес золота, который можно унести в рюкзаке вместительностью S - Pascal ABC
Помогите решить! А лучше решите за меня=) Найдите максимальный вес золота, который можно унести в рюкзаке вместительностью S, если есть N...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stima
449 / 298 / 20
Регистрация: 22.03.2011
Сообщений: 966
Завершенные тесты: 2
10.04.2014, 02:10     Добыча золота в варкрафт #2
Во первых
задерживаясь в пути на случайное время
эти задержки должны быть разбиты на интервалы или это одна задержка? Путь это туда и обратно, или это не важно?

Во вторых
Написать программу работы одного юнита.
это как? Подразумевается ли что могут быть запущенны другие программы для других юнитов?, но где тогда "находится шахта" (если спроецировать на реализацию это может быть как шаренный файл, пайп, так и сервер в конце концов)? Может подразумевалось написать программу для эмулирующую работу шахты и N юнитов.

Во третьих fork поможет лишь в том случае, если Вы сделаете общей "шахту" для всех порожденных процессов.
В четвертых, зачем Вы добавляете если Вам нужно вычитать?

Ну и в последних, если все таки подразумевалось смоделировать рабочий процесс для N юнитов в одном приложении, где не важно путь и будет ли остановка одна или разбита, а целью стоит лишь параллельность выполнения, то ниже приведен код, так как я это вижу, в стандарте c++11 (g++ my_file_name.cpp -std=c++11)
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
64
65
66
67
68
69
70
71
72
73
74
75
#include <ctime>
#include <mutex>
#include <thread>
#include <chrono>
#include <vector>
#include <string>
#include <sstream>
#include <iostream>
 
int total_gold = 0;
int units_count = 0;
static const int unit_gold = 10;
 
std::mutex unit_mutex, cout_mutex;
 
void print(const std::string& msg)
{
    //just avoid interlaced out
    std::unique_lock<std::mutex> locker(cout_mutex);
    std::cout << msg << std::endl;
}
 
void unit_routine(int unit_id)
{
    print("unit " + std::to_string(unit_id) + " start his task");
    for ( ;; )
    {
        {
            std::unique_lock<std::mutex> locker(unit_mutex);
            if (total_gold < unit_gold)
            {
                total_gold = 0;
            }
 
            if (total_gold == 0)
            {
                print("no more gold! unit " + std::to_string(unit_id) + " finished ");
                break;
            }
 
            total_gold -= unit_gold;
            print(std::string("current amount of gold: ")  + std::to_string(total_gold));
        }
        std::this_thread::sleep_for(std::chrono::milliseconds(rand() % 100));
    }
}
 
int main()
{
    srand(unsigned int(time(nullptr)));
 
    std::cout << "Enter total gold: ";
    std::cin >> total_gold;
    std::cout << std::endl;
 
    std::cout << "Enter units count: "; 
    std::cin >> units_count;
    std::cout << std::endl;
 
    std::vector<std::thread> thread_group;
    for (int i = 0; i < units_count; ++i)
    {
        thread_group.push_back(std::move(std::thread(unit_routine, i)));
    }
 
    for (auto it = thread_group.begin(); it != thread_group.end(); ++it)
    {
        it->join();
    }
 
    std::cin.get();
    std::cin.get();
 
    return 0;
}
Yandex
Объявления
10.04.2014, 02:10     Добыча золота в варкрафт
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru