• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wyszukanie najmniejszego elementu w tablicy spełniającego warunek

VPS Starter Arubacloud
0 głosów
398 wizyt
pytanie zadane 23 sierpnia 2018 w JavaScript przez jaco Początkujący (290 p.)

Witajcie,
Tworzę program do doboru przekroju przewodów. Jestem zielony w programowaniu.
Obliczyłem sobie już prąd jaki mam w obwodzie, teraz mam tabele np
1,5mm2 = 22

2,5mm2=30

4mm2=40

Powiedzmy że prąd I = 28 Amperów. Chciałbym aby program przeszukał tablicę i wyświetlił wynik.
Dla prądu Ib=28A ze względu bla bla bla należy zastosować przekrój 2,5 mm2.

Moje dziwne kombinacje nie dają żadnego efektu. Proszę o jakąś wskazówkę.

<script>



function oblicz() {
	if (document.getElementById("U").value == 400){
		var U = 400;
		var P = document.getElementById("P").value;
		var cosfi = document.getElementById("cosfi").value;
		var l = document.getElementById("l").value;
		var kj = document.getElementById("kj").value;
		var dU = document.getElementById("dU").value;
 
		var I = P / (1.73205080757 * U * cosfi);
		I = I.toFixed(3);
		var s = (1.73205080757 * I * l * cosfi * 100) / (58 * U * 5);
		s = s.toFixed(3);
		var Ib = I *kj;
 
		document.getElementById("wynikI").innerHTML = "Prąd I = " + I + " A";
		document.getElementById("wynikIb").innerHTML = "Prąd Ib = " + Ib + " A";
		document.getElementById("przekroj").innerHTML = "Minimalny przekrój dla spadku napięcia dU = "+ dU + "% wynosi : " + s + " mm2";
	}
	else {
		var U = 230;
		var P = document.getElementById("P").value;
		var cosfi = document.getElementById("cosfi").value;
		var l = document.getElementById("l").value;
		var kj = document.getElementById("kj").value;
		var dU = document.getElementById("dU").value;
		
		
		
 
		var I = P / (U * cosfi);0
		I = I.toFixed(3);
		var s = (2 * I * l * cosfi * 100) / (58 * U * 5);
		s = s.toFixed(3);
		var Ib = I *kj;
		
		
     
		document.getElementById("wynikI").innerHTML = "Prąd I = " + I + " A";
		document.getElementById("wynikIb").innerHTML = "Prąd Ib = " + Ib + " A";
		document.getElementById("przekroj").innerHTML = "Minimalny przekrój dla spadku napięcia dU = "+ dU + "% wynosi : " + s + " mm2";
	}
}





</script>

 

komentarz 23 sierpnia 2018 przez OdsetekGlupoty Pasjonat (15,360 p.)
Gdzie w tym kodzie masz tablicę?
komentarz 23 sierpnia 2018 przez jaco Początkujący (290 p.)

Nie wiem nawet jak ją zdefiniować bo tego typu:

var ptaki = ["kos","gil","czyżyk"];


Mi nic nie da :/ bo potrzebują jakby 2 komórki połączone ze sobą. W jednej przekrój a w drugiej prąd dopuszczalny.

komentarz 23 sierpnia 2018 przez Perseusz Bywalec (2,190 p.)

@Jaco Nie jestem jakimś specem od JS, ale można by to zrobić w ten sposób
 

var dopasuj_1 = new array ( prąd, przekrój )
var dopasuj_2 = new array ( prąd_2, przekrój_2 )
...
var dopasuj_n = new array ( prąd_n, przekrój_n )

var tablica = new array( dopasuj_1, dopasuj_2, .... , dopasuj_n )

i po chwili namysłu mógłbyś się także zastanowić nad  dwuwymiarową tablicą i napisać [moje] powyższe od nowa :P

How can I create a two dimensional array in JavaScript?

komentarz 23 sierpnia 2018 przez jaco Początkujący (290 p.)

coś takiego?
 

var przekroje= [
  [1.5, 22],
  [2,5, 30],
  [4, 40]
];

To teraz jak przeszukać tylko drugie komórki? jeśli mam I=28 żeby zwróciło mi 2,5 ??

komentarz 23 sierpnia 2018 przez StOcK Mądrala (6,100 p.)

@jaco, ale przecież w tablicy przekroje nie masz nawet wartości 28

komentarz 23 sierpnia 2018 przez jaco Początkujący (290 p.)
Dzięki.

Konsola wywaliła takie coś:

przekroje[0][1] = 22

przekroje[1][1] = 5

przekroje[2][1] = 40

Jest to krok do przodu ale ja chciałbym są przefiltrować. Dla 28A odpowiednik przekrojem jest 2,5 który może przesłać 30A. Wynik jaki chciałbym uzyskać przy założeniu że I=28 to 2,5

Edit:
Zgadza się niema takiej wartości. Bo program powinien znaleźć namjmniejszą większą od prądu I i wyświetlić przypisany do niej przekrój.
komentarz 23 sierpnia 2018 przez pablop76 VIP (123,060 p.)

@jaco,

To jest dobry pomysł. Jeżeli user podaje wartość prądu to program szuka wartości najbliższej wyższej od zadanej w tablicy i wyrzuca przewód. Np user podaje 25A, program wyrzuca min przekrój 2.5mm2

Ale zastanowił bym się nad zastosowaniem obiektu

 

 

1 odpowiedź

+1 głos
odpowiedź 23 sierpnia 2018 przez StOcK Mądrala (6,100 p.)
Jak dla mnie to coś w tym stylu:

(PSEUDOKOD)

- robisz pętlę przez całą tablice

- na każdym elemencie sprawdzasz czy elem===szukana   jeśli tak to break;

- jeśli nie to: czy elem > szukana   jeśli nie to continue;

- jeśli tak to: sprawdzasz czy abs(elem-szukana)<abs z poprzedniego elementu

- na koniec najmniejsza wartość abs to będzie wartość "najmniejsza, większa od szukanej"
komentarz 23 sierpnia 2018 przez jaco Początkujący (290 p.)
Brzmi dobrze tylko jak to wykonać? nie mam pojęcia.
1
komentarz 23 sierpnia 2018 przez StOcK Mądrala (6,100 p.)
forEach, if else, Math.abs
komentarz 23 sierpnia 2018 przez jaco Początkujący (290 p.)
for (i = 0; i < przekroje.length; i++) {
i dalej nie wiem :/
chciałbym coś sprawdzić czy jest > od mojego I ale jak to zrobić? I Jak nazywać się będzie to coś co będę sprawdzał?
Totalnie się w tym nie orientuję niestety. Szukam przykładów na necie ale nic nie potrafię dopasować :(

Btw dzięki za pomoc i cierpliwość, jak widać jestem zielony jak ogórek.
1
komentarz 23 sierpnia 2018 przez StOcK Mądrala (6,100 p.)

w pętli korzystasz z tablicy w ten sposób

Tablica dwuwymiarowa to tak naprawdę tabela

przekroje[i][0]

i - to pierwszy index tablicy (tak jakby każdy wiersz)
0 - to drugi index (tak jakby kolumna)

0 to kolumna pierwsza, 1 to kolumna druga itd. W twoim przypadku masz tylko dwie kolumny.

Łatwiej się chyba nie da tego zobrazować.
Ps. Wysłałem wiadomość z przykładem

 

komentarz 28 sierpnia 2018 przez jaco Początkujący (290 p.)

Dzięki niesamowicie mi pomogłeś :)
Na mojej drodze pojawił się kolejny problem:
Kod:

 var przekroje= [
			[1.5, 18.5],
			[2.5, 25],
			[4, 34],
			[6, 43],
			[10, 60],
			[16, 94],
			[25, 101],
			[35, 126],
			[50, 180],
			[70, 196],
			[95, 238],
			[120, 276],
			[150, 319],
			[185, 364],
			[240, 430]
			
		];
		var szukana=Ib;
		var abs=1000;
		var indexS=null;
		for(var index = 0; index < przekroje.length; index++) {
			if(przekroje[index][1]===szukana){
			indexS=index;
		break;
		}else if(przekroje[index][1]<szukana){
		continue;
		}else{
		if(Math.abs(przekroje[index][1]-szukana)<abs){
        abs=Math.abs(przekroje[index][1]-szukana);
        indexS=index;
      }

wynik przekroje[indexS][1] potrafię bez problemu wypisać na stronie. Potrzebuję go jednak do obliczeń.
zrobiłem Var Idd = przekroje[indexS][1]; ale nie bardzo chce działać jak to należy rozwiązać?

komentarz 30 sierpnia 2018 przez StOcK Mądrala (6,100 p.)

Jeśli to obliczasz to w funkcji, to return przekroje[indexS][1];
Jeśli nie, to powinieneś mieć dostęp do przekroje[indexS][1];
Pokaż jak wypisujesz przekroje[indexS][1];

// EDIT:

W kodzie, który podałeś wyżej brakuje klamer zamykających. Zamiast 

else{
       if(Math.abs(przekroje[index][1]-szukana)<abs){
       abs=Math.abs(przekroje[index][1]-szukana);
       indexS=index;
     }
}

po prostu: 

else if(Math.abs(przekroje[index][1]-szukana)<abs){
       abs=Math.abs(przekroje[index][1]-szukana);
       indexS=index;
}

 

Podobne pytania

0 głosów
1 odpowiedź 210 wizyt
0 głosów
4 odpowiedzi 156 wizyt
0 głosów
1 odpowiedź 118 wizyt

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...