• 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

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
249 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,350 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 (121,600 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ź 174 wizyt
0 głosów
4 odpowiedzi 97 wizyt
0 głosów
1 odpowiedź 71 wizyt

90,818 zapytań

139,493 odpowiedzi

313,550 komentarzy

60,311 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...