Autor Zpráva
Nat
Profil *
Zdravím, jak by se dalo zapsat pomocí cyklu toto:


if ($a == ($b - 1)) {
  $c = ($d2 / 2) + ($d1 / 2);
}

if ($a == ($b - 2)) {
  $c = ($d3 / 2) + $d2 + ($d1 / 2);
}

if ($a == ($b - 3)) {
  $c = ($d4 / 2) + $d3 + $d2 + ($d1 / 2);
}

...
nightfish
Profil
blbě... ale kdybys ty $d1, $d2, ..., $d4 měl v poli, tak by to jít mohlo
tiso
Profil
Nat - o čo ide? Čo majú tie premenné a výpočty znamenať?
Nat
Profil *
Nightfish: všechny hodnoty jsou v array

Tiso:

Zkusím dát příklad:

Mám 4 pole (ne array, prostě se to jmenuje pole)

Pole s číslem 2 je největší, a znám u něj hodnotu F. Podle níže zapsaných rovnic potřebuji zjistit i hodnoty pro ostatní pole.

V array mám uloženy hodnoty h.

Rovnice:

Pro pole s číslem 1 F1 = F2 - q * (h2/2 + h1/2)

Pro pole s číslem 4 F4 = F2 + q * (h2/2 + h3 + h4/2)

Je doufám zřejmé, že pokařdé může být největší jiné pole a počet polí může být libovolný tedy například může být polí 8 a největší bude 4 atd.
tiso
Profil
Nat - ako vysvetlenie čo to má byť mi to bohužiaľ nestačí...
Alphard
Profil
Nenapsal jste to moc jasně. Možná nějak takhle (jen ukázka, bez úprav to asi fungovat nebude)

  $p = count ($d);  // jestli je indexovano od 0, je nutné odecist 1
  $c = ($d[$p] / 2) + ($d[1] / 2);
  for ($j = $p  - 1; $p > 1; $p--)
    $c += $d[$j];
Nat
Profil *
Ono není zrovna jednoduché to popsat :-) každopádně tady je kód, který funguje a který jsem chtěl dát do cyklu:


function koef_for_Soi ($scale_factor, $rosko_So, $height_field_y, $height_field, $height_field_level, $field) {
  $number_of_field = count($height_field_y);
  for ($i = 0; $i <= count($height_field); $i++) {
    if ($height_field_level[$i]['height_level'] == max($height_field)) {
      $number_of_long_field = $height_field_level[$i]['number_field'];
    }
  }
  
  if ($field == 1 AND $number_of_long_field == 2) {
    $koef_for_Soi = (($height_field_y[0] / $scale_factor) / 2) + (($height_field_y[1] / $scale_factor) / 2);
  }
  if ($field == 1 AND $number_of_long_field == 3) {
    $koef_for_Soi = (($height_field_y[0] / $scale_factor) / 2) + (($height_field_y[1] / $scale_factor)) + (($height_field_y[2] / $scale_factor) / 2);
  }
  if ($field == 1 AND $number_of_long_field == 4) {
    $koef_for_Soi = (($height_field_y[0] / $scale_factor) / 2) + (($height_field_y[1] / $scale_factor)) + (($height_field_y[2] / $scale_factor)) + (($height_field_y[3] / $scale_factor) / 2);
  }
  if ($field == 1 AND $number_of_long_field == 5) {
    $koef_for_Soi = (($height_field_y[0] / $scale_factor) / 2) + (($height_field_y[1] / $scale_factor)) + (($height_field_y[2] / $scale_factor)) + (($height_field_y[3] / $scale_factor)) + (($height_field_y[4] / $scale_factor) / 2);
  }
  
  if ($field == 2 AND $number_of_long_field == 1) {
    $koef_for_Soi = (($height_field_y[1] / $scale_factor) / 2) + (($height_field_y[0] / $scale_factor) / 2);
  }
  if ($field == 2 AND $number_of_long_field == 3) {
    $koef_for_Soi = (($height_field_y[1] / $scale_factor) / 2) + (($height_field_y[2] / $scale_factor) / 2);
  }
  if ($field == 2 AND $number_of_long_field == 4) {
    $koef_for_Soi = (($height_field_y[1] / $scale_factor) / 2) + (($height_field_y[2] / $scale_factor)) + (($height_field_y[3] / $scale_factor) / 2);
  }
  if ($field == 2 AND $number_of_long_field == 5) {
    $koef_for_Soi = (($height_field_y[1] / $scale_factor) / 2) + (($height_field_y[2] / $scale_factor)) + (($height_field_y[3] / $scale_factor)) + (($height_field_y[4] / $scale_factor) / 2);
  }
  
  if ($field == 3 AND $number_of_long_field == 1) {
    $koef_for_Soi = (($height_field_y[0] / $scale_factor) / 2) + ($height_field_y[1] / $scale_factor) + (($height_field_y[2] / $scale_factor) / 2);
  }
  if ($field == 3 AND $number_of_long_field == 2) {
    $koef_for_Soi = (($height_field_y[2] / $scale_factor) / 2) + (($height_field_y[1] / $scale_factor) / 2);
  }
  if ($field == 3 AND $number_of_long_field == 4) {
    $koef_for_Soi = (($height_field_y[2] / $scale_factor) / 2) + (($height_field_y[3] / $scale_factor) / 2);
  }
  if ($field == 3 AND $number_of_long_field == 5) {
    $koef_for_Soi = (($height_field_y[2] / $scale_factor) / 2) + (($height_field_y[3] / $scale_factor)) + (($height_field_y[4] / $scale_factor) / 2);
  }
  
  if ($field == 4 AND $number_of_long_field == 1) {
    $koef_for_Soi = (($height_field_y[0] / $scale_factor) / 2) + ($height_field_y[1] / $scale_factor) + ($height_field_y[2] / $scale_factor) + (($height_field_y[3] / $scale_factor) / 2);
  }
  if ($field == 4 AND $number_of_long_field == 2) {
    $koef_for_Soi = (($height_field_y[1] / $scale_factor) / 2) + ($height_field_y[2] / $scale_factor) + (($height_field_y[3] / $scale_factor) / 2);
  }
  if ($field == 4 AND $number_of_long_field == 3) {
    $koef_for_Soi = (($height_field_y[2] / $scale_factor) / 2) + (($height_field_y[3] / $scale_factor) / 2);
  }
  if ($field == 4 AND $number_of_long_field == 5) {
    $koef_for_Soi = (($height_field_y[3] / $scale_factor) / 2) + (($height_field_y[4] / $scale_factor) / 2);
  }
return abs($koef_for_Soi);
}


tiso
Profil
Nat
1. načo máš v tej funkcii premennú $rosko_So? Nevyužívaš ju.
2. načo tam máš riadok 3? Premennú $number_of_field nevyužívaš.
3. prečo nevyjmeš $scale_factor? Stačí ho dať na koniec: return abs($koef_for_Soi/$scale_factor);
4. výsledok pri podmienke if ($field == 1 AND $number_of_long_field == 2) je rovnaký ako pri podmienke if ($field == 2 AND $number_of_long_field == 1)

A poprosil by som upresniť čo znamenajú jednotlivé premenné.
AM_
Profil
Nat
Myslím, že není tak složité si algoritmus vymyslet sám, hlavně když sám nejlíp víš, oč běží.
Tu hromadu řádků jsi jistě sepsal podle nějakých pravidel co se s čím sčítá. Zkus si tato pravidla sepsat vlastními slovy, uvidíš, že přepsání do kódu je pak jen rutinní záležitost.
Nebo sem zkus alespoň napsat slovně (tedy ne pomocí vzorečků), o jaký výpočet jde, když to člověk vidí takto tak se algoritmus vymýšlí dost ztěžka, když řekneš, že máš např. určité pole souřadnic ze kterého chceš spočítat hodnotu pro nějaké dané něco za určitých pravidel, tak bude někdo vědět spíš.
Nat
Profil *
Tiso Ty pozůstatky jsou tam ze situace kdy jsem ukládal výsledek jako pole a byly v něm i ty ostatní hodnoty. Ta připomínka se Scale_factorem je dobrá díky is podmínkou.

AM_ toto je jen pracovní verze, kterou jsem vytvořil právě proto abych viděl kde se tam dá vložit cyklus, během dneška se na to ještě podívám a zkusím to případně slovně popsat.

Zatím díky
Nat
Profil *
Tak nakonec takhle, doufám, že z tohoto už se dá lépe pochopit co jsem chtěl


function koef_for_Soi ($scale_factor, $height_field_y, $height_field, $height_field_level, $field) {
  for ($i = 0; $i <= count($height_field); $i++) {
    if ($height_field_level[$i]['height_level'] == max($height_field)) {
      $number_of_long_field = $height_field_level[$i]['number_field'];
    }
  }  
  $different = $number_of_long_field - $field; 
  if ($different == 1 OR $different == -1) {
    $koef_for_Soi = ($height_field_y[$number_of_long_field-1] / 2) + ($height_field_y[$field-1] / 2);
  } 
  if ($different > 1) {
    for ($i = 2; $i <= $different; $i++) {
      $koef_for_Soi_i = $koef_for_Soi_i + $height_field_y[$number_of_long_field-$i];
    }
    $koef_for_Soi = ($height_field_y[$number_of_long_field-1] / 2) + ($height_field_y[$field-1] / 2) +  + $koef_for_Soi_i;
  }  
  if ($different < 1) {
    for ($i = 2; $i <= $different; $i++) {
      $koef_for_Soi_i = $koef_for_Soi_i + $height_field_y[$number_of_long_field+$i];
    }
    $koef_for_Soi = ($height_field_y[$number_of_long_field-1] / 2) + ($height_field_y[$field-1] / 2) + $koef_for_Soi_i;
  }
return abs($koef_for_Soi / $scale_factor);
}
AM_
Profil
Nebo sem zkus alespoň napsat slovně (tedy ne pomocí vzorečků), o jaký výpočet jde
ještě že jsi to udělal, z tohohle zdrojového kódu už určitě všichni chápeme, co to má dělat.
Zjevně počítáš jakýsi koeficient, tak to zkus vysvětlit.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: