Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
-
Axamith
- Příspěvky: 530
- Registrován: 09 srp 2017, 08:17
- Reputation: 0
-
Kontaktovat uživatele:
Příspěvek
od Axamith » 16 lis 2018, 10:04
Potřebuji v programu pracovat s procenty.
Mám proměnnou A a povolenou toleranci B. Výpočtem zjistím hodnotu A_min a A_max (Hodnota A + a - procent B).
Kód: Vybrat vše
int A = 100;
int B = 5; // tolerance %
void setup() {
Serial.begin(9600);
}
void loop() {
int A_min = (A - ((A / 100) * B));
int A_max = (A + ((A / 100) * B));
Serial.print("A_min : ");
Serial.println(A_min);
Serial.print("A_max : ");
Serial.println(A_max);
delay(1000);
}
Existuje nějaký elegantnější způsob (funkce), jak pracovat s procenty, než vypisovat kompletní vzorec?
-
KamilV
- Příspěvky: 479
- Registrován: 03 dub 2018, 15:27
- Reputation: 0
- Bydliště: Olomouc
Příspěvek
od KamilV » 16 lis 2018, 14:39
Třeba
Kód: Vybrat vše
int A_min = A-map(B, 0, 100, 0, A);
int A_max = A+map(B, 0, 100, 0, A);
ale nemyslím si, že je to čitelnější a přehlednější konstrukce.
Nejlépe by asi bylo napsat si na to vlastní funkci (ať se ten výpočetní vztah neopakuje v kódu vícekrát) a volat tu.
-
martinius96
- Příspěvky: 579
- Registrován: 01 srp 2017, 19:29
- Reputation: 0
- Bydliště: Poprad
-
Kontaktovat uživatele:
Příspěvek
od martinius96 » 16 lis 2018, 16:26
Vyjadrenie v % môžeš použiť aj ako float číslo.. napríklad pre 5% to bude 1.05
-
Axamith
- Příspěvky: 530
- Registrován: 09 srp 2017, 08:17
- Reputation: 0
-
Kontaktovat uživatele:
Příspěvek
od Axamith » 16 lis 2018, 17:42
Zůstanu u původního zápisu. Je přehledný a srozumitelný. Nebyl jsem si jistý, jestli není přímo fce na práci s procenty. Žádnou jsem nenašel, ale co kdyby ...
martinius96 píše: ↑16 lis 2018, 16:26
Vyjadrenie v % môžeš použiť aj ako float číslo.. napríklad pre 5% to bude 1.05
Potřebuji mít ty procenta v proměnné, měřím analogovou hodnotu z čidla a výsledku povoluji toleranční pole podmínkou. Pro ladění potřebuji tu % hodnotu měnit.
V každém případě děkuji za názory.
-
pavel1tu
- Příspěvky: 2054
- Registrován: 26 říj 2017, 08:28
- Reputation: 0
- Bydliště: Trutnov
-
Kontaktovat uživatele:
Příspěvek
od pavel1tu » 16 lis 2018, 18:12
Já bych to udělal jako ty ... je to pro mne přehledné
KamilV je evidentně programátor, já na to jeho musel kouknout asi 5x, než jsem to pochopil
Jen pokud to počítáš vícekrát, udělal bych z toho funkci
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
-
AstroMiK
- Příspěvky: 592
- Registrován: 08 pro 2017, 19:05
- Reputation: 0
Příspěvek
od AstroMiK » 16 lis 2018, 21:46
Axamith píše: ↑16 lis 2018, 10:04
Kód: Vybrat vše
int A_min = (A - ((A / 100) * B));
int A_max = (A + ((A / 100) * B));
... A jseš si jistý, že ti ten vzorec funguje?
Zkus si zadat třeba A=80 a B=5. Teoreticky by měl výsledek 76 a 84.
Jenže když nejdřív vydělíš (A/100) to je (80/100), tak výsledek bude v integer rozsahu 0. Pak to můžeš násobit jakýmkoliv B a výsledek další operace bude zase 0.
-
SkullKeep
- Příspěvky: 290
- Registrován: 23 srp 2017, 18:51
- Reputation: 0
- Bydliště: Brno
-
Kontaktovat uživatele:
Příspěvek
od SkullKeep » 16 lis 2018, 23:29
Takže jestli to chápu dobře tak kód by měl vypadat nějak takhle:
Kód: Vybrat vše
int A = 100;
int B = 5; // tolerance %
void setup() {
Serial.begin(9600);
}
void loop() {
int A_min = Amin();
int A_max = Amax();
Serial.print("A_min : ");
Serial.println(A_min);
Serial.print("A_max : ");
Serial.println(A_max);
delay(1000);
}
int Amin () {
return (A - int(float((A / 100)) * B));//výpočet minima
}
int Amax () {
return (A + int(float((A / 100)) * B));//výpočet maxima
}
-
AstroMiK
- Příspěvky: 592
- Registrován: 08 pro 2017, 19:05
- Reputation: 0
Příspěvek
od AstroMiK » 16 lis 2018, 23:48
To pořád neřeší ten problém (A/100).
Správně by ten vzorec mohl být třeba takhle:
Kód: Vybrat vše
int A_min = (A - ((A / 100.0) * B));
int A_max = (A + ((A / 100.0) * B));
Lepší by to ale bylo ještě se správným zaokrouhlováním výsledku.
-
Axamith
- Příspěvky: 530
- Registrován: 09 srp 2017, 08:17
- Reputation: 0
-
Kontaktovat uživatele:
Příspěvek
od Axamith » 19 lis 2018, 08:21
Problém řeším stejně jako je v posledním příspěvku, samotný výpočet je ve funkci. Kód je tak přehlednější.
Jak řešit zaokrouhlování? Já to vyřešil volbou datového typu integer (int). Float by vracel desetinná místa, ale narazil jsem právě na problém zaokrouhlení.
-
ohruska
- Příspěvky: 235
- Registrován: 08 pro 2017, 20:56
- Reputation: 0
Příspěvek
od ohruska » 19 lis 2018, 09:47
Pokud potřebujete zaokrouhlená procenta, tak by bylo potřeba pracovat s float.
Pro zobrazení potom převod na String, případně zpět na int.
Kód: Vybrat vše
float A_min = (A - ((A / 100.0) * B));
float A_max = (A + ((A / 100.0) * B));
String AA_min=String(A_min,0);
String AA_max=String(A_max,0);
int aaa=AA_min.toInt();
int bbb=AA_max.toInt();
Serial.println(A_min );
Serial.println(A_min,0 );
Serial.println(AA_min );
Serial.println(A_max);
Serial.println(A_max,0 );
Serial.println(AA_max );
Serial.println(aaa);
Serial.println(bbb);
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 16 hostů