-2

重複の可能性:
C++ で入力値の方程式を解く方法は?

私はC ++が初めてで、遊んでいるだけです...

#include <iostream>
using namespace std;

int limbs(int handdmg, int armdmg, int chestdmg, int headshot, int legdmg)
{
    return handdmg + armdmg + chestdmg + legdmg + headshot;

}
main ()
{

    int totaldmg; 
    int handdmg; 
    int armdmg; 
    int chestdmg; 
    int legdmg;
    int headshot;
    int Dmgdial;
    int x;

    // limiting the variables to a smaller range of integers       

    handdmg = 0 < x < 5;
    armdmg = 10 < x < 15;
    chestdmg = 25 < x < 50;
    legdmg = 30 < x < 40;
    headshot = 80 < x < 120;

    cout  << "Enter your total damage taken:" << endl;
    cin >> totaldmg;

    Dmgdial = totaldmg;

    // want the variables to = the input value in the best smallest way possible

    limbs(handdmg, armdmg, chestdmg, headshot, legdmg) = Dmgdial;

    // then print the variables answers to the screen

    cout << "damage given to the hand:   " << handdmg << endl;
    cout << "damage given to the arm:    " << armdmg << endl;
    cout << "damage given to the chest:  " << chestdmg << endl;
    cout << "damage given to the leg:    " << legdmg << endl;
    cout << "damage given to the head:   " << headshot << endl;



    cin.clear();
    cin.ignore(2505, '\n');
    cin.get();

    return 0;

}

したがって、概念は単純です。156 などの値をプログラムに入力し、x の制限された値を使用して、その値を取得するための最良の方法をコンピューターに計算させます。

ただし、limbs(handdmg, armdmg, chestdmg, headshot, legdmg) = Dmgdial機能しません。コンパイラに関する限り、それは後方です。

このタイプのプログラムを機能させるにはどうすればよいですか?

4

3 に答える 3

2

[..] その値を取得する最良の方法 [...]

これはあなたの仕事です。「コンピューター」はダメージやヘッドショットについて何も知りません。紙を取り、ダメージの合計値からダメージの詳細をどのように計算したいかを書き留めます。例えば:

struct DamageDetails
{
   int head, leg, arm;
   const int HEAD_MAX = 120;
   const int HEAD_MIN = 80;

   static DamageDetails FromTotalDamage(int totalDamage)
   {
        DamageDetails damage;
        int damageTakenSoFar = totalDamage;
        damage.head = totalDamage / 2;  // 50% damage is taken to head
        if (damage.head > HEAD_MAX)
            damage.head = HEAD_MAX;
        damageTakenSoFar -= damage.head;
        // ...

        return damage;
   }

};
于 2012-08-25T09:11:31.133 に答える
0

5 つの未知数を含む 1 つの方程式を解こうとしていますが、これは未決定の問題です。一意の答えを得るには、5 つの未知数を含む 5 つの連立方程式が必要です。

さらに、実際には方程式を指定していません。現在、線形方程式 t = x + y + z + v + w を想定しているように見えます。変数を制限している(奇妙な)セクションを考えると、それはおそらく正しくありません。

さらに、C++ は方程式を解く数学システムではありません。自分で解決するコードを書くか、サードパーティのライブラリを使用する必要があります。

全体として、あなたがやろうとしていることを実行するために必要な数学とプログラミングの専門知識に関しては、あなたは頭がおかしいと思います。このようなタスクを試みる前に、より多くの理論を学ぶことで利益が得られます。

于 2012-08-25T10:05:53.473 に答える
0

バックトラッキングを使用した問題の解決策は次のとおりです。

#include <stdio.h>

int v[100], n, int dmg;

void init(int k)
{
    v[k] = 0;
}

bool solutionReached( int k ) 
{
    if (k <= 5)
        return false;

    int sum = 0;
    for (int i = 1; i <= k; i++)
    {
        sum += v[i];
    }

    if(sum == dmg)
    {
        if( v[1] < 5 &&
            v[2] > 10 && v[2] < 15 &&
            v[3] > 25 && v[3] < 50 &&
            v[4] > 30 && v[4] < 40 &&
            v[5] > 80 && v[5] < 120)
            return true;
    }

    return false;
}

void printSolution( int k ) 
{
    for (int i = 1; i < k; i++)
    {
        printf("%i ", v[i]);
    }
    printf("\n");
}

bool hasSuccesor( int k ) 
{
    if(v[k] < 120 && k <= 5)
    {
        v[k]++;
        return true;
    }
    return false;
}

bool isValid( int k ) 
{
    /*
    if(v[1] > 5)
        return false;
    if(!(v[2] > 10 && v[2] < 15))
        return false;
    if(!(v[3] > 25 && v[3] < 50))
        return false;
    if(!(v[4] > 30 && v[4] < 40))
        return false;
    if (!(v[5] > 80 && v[5] < 120))
        return false;
    */

    return true;
}

void bkt(int k)
{
    if(solutionReached(k))
        printSolution(k);
    else
    {
        init(k);
        while(hasSuccesor(k))
            if(isValid(k))
                bkt(k + 1);
    }
}

int main(int argc, char* argv[])
{
    dmg = 200;
    n = 6;
    bkt(1);

    return 0;
}
于 2012-08-25T10:06:02.750 に答える