Proszę o sprawdzenie kodu (pod kątem nawiasów)

Witam

Proszę o sprawdzenie co jest nie tak z nawiasami:

[code]n = 5 #liczba wszystkich dosteych przedmioto
koszt= [12, 1, 2, 1, 4] #koszt kolejnych przedmiot󷍊int
waga = [4, 2, 2, 1, 10] #waga kolejnych przedmiot󷍊int
W = 15 #maksymalna waga plecaka

def sprawdzenie
@cur_w
@tot_v
@i
@maxi
used[]

i=0
i.upto(n-1)
	used[i]=0
end

cur_w=W

while cur_w > 0
	maxi = -1
	i=0
	i.upto(n-1)
		used[i]=0
		if (used[i]==0) and ((maxi == -1) or (waga[i]/koszt[i] > waga[maxi]/koszt[maxi]))
			maxi = i
		end
		used[maxi] = 1
		cur_w -=koszt[maxi]
		tot_v += waga[maxi]
		if cur_w>0
			puts "Dodaj przedmiot numer" + (maxi + 1) + "o danych ( " + waga[maxi] + ","  + koszt[maxi] + "w calosci\n"
			else
				puts "Dodaj" + ((1 + cur_w/koszt[maxi]) * 100) + "% kosztu przedmiotu o numerze" + (maxi + 1) + "i danych (" + waga[maxi] + "," + koszt[maxi]*((1 + cur_w/koszt[maxi]))
				tot_v -= waga[maxi]
				tot_v += (1 + cur_w/koszt[maxi]) * waga[maxi]
		end
	end
end
	puts "Koszt wszystkich przedmiotow w plecaku wynosi" + tot_v

end

sprawdzenie()[/code]

to nie nawiasy. poczytaj o blokach iteratorach i pętlach :wink:

uwagi dodatkowe:

  • pisz krótsze metody - łatwiej się wtedy czyta kod
  • popracuj nad nazewnictwem zmiennych

Jejku, nie chodziło mi o nawiasy tylko o end’y (pomyliło mi się z C++, ponieważ przerabiałam to z C++ na Ruby’ego)
Niestety jestem początkująca i piszę tak żeby działało (i nie wiem kiedy metoda jest za długa)

Jeśli chodzi o end’y to wydaje mi się że ich ilość jest dobra, może błąd jest gdzie indziej

Tam błędów jest co niemiara… Patrząc na ten kod przypomina mi się You can write fortran in any language :slight_smile:

Tak poważnie, to powinnaś najpierw przyswoić sobie chociaż jakieś podstawy, bo w programowaniu w Ruby nie chodzi o to, żeby zamienić nawiasy w kodzie, pisanym w C/C++ na do…end.

Brakuje “do”, np.

[code=ruby]while … do

end[/code]
tu też jest nie tak

i.upto(n-1)
  • przydało by się użyć each

przerób kurs: http://tryruby.org/
przeczytaj sobie na przykład to: http://www.ruby-lang.org/pl/dokumentacja/ruby-w-20-minut/
szczególnie polecam dla przesiadających się z innego języka: http://www.ruby-lang.org/pl/dokumentacja/ruby-a-inne-jezyki-programowania/

Powodzenia!

PS. Umownie za długą metodę (funkcję) można w Rubym uznać taką, która ma więcej niż 7-10 linijek. Warto wtedy wydzielić kod do osobnej metody i wywoływać z pierwszej - oczywiście w miarę logicznie.

Nie wiem dlaczego, ale nie skopiowało się wszystko - poucinało niektóre linijki.
Teraz jest dobrze:

n = 5 #liczba wszystkich dosteych przedmioto
koszt= [12, 1, 2, 1, 4] #koszt kolejnych przedmiot󷍊int
waga = [4, 2, 2, 1, 10] #waga kolejnych przedmiot󷍊int
W = 15 #maksymalna waga plecaka

def sprawdzenie
@cur_w
@tot_v
@i
@maxi
used[]

i=0
i.upto(n-1)
	used[i]=0
end

cur_w=W

while cur_w > 0
	maxi = -1
	i=0
	i.upto(n-1)
		used[i]=0
		if (used[i]==0) and ((maxi == -1) or (waga[i]/koszt[i] > waga[maxi]/koszt[maxi]))
			maxi = i
		end
		used[maxi] = 1
		cur_w -=koszt[maxi]
		tot_v += waga[maxi]
		if cur_w>0
			puts "Dodaj przedmiot numer" + (maxi + 1) + "o danych ( " + waga[maxi] + ","  + koszt[maxi]  " )"+ "w calosci\n"
			else
				puts "Dodaj" + ((1 + cur_w/koszt[maxi]) * 100) + "% kosztu przedmiotu o numerze" + (maxi + 1) + "i danych (" + waga[maxi] + "," + koszt[maxi]*((1 + cur_w/koszt[maxi]))
				tot_v -= waga[maxi]
				tot_v += (1 + cur_w/koszt[maxi]) * waga[maxi]
		end
	end
end
	puts "Koszt wszystkich przedmiotow w plecaku wynosi" + tot_v

end

sprawdzenie()

[quote=sevos]Brakuje “do”, np.

[code=ruby]while … do

end[/code]
tu też jest nie tak

i.upto(n-1)
  • przydało by się użyć each

przerób kurs: http://tryruby.org/
przeczytaj sobie na przykład to: http://www.ruby-lang.org/pl/dokumentacja/ruby-w-20-minut/
szczególnie polecam dla przesiadających się z innego języka: http://www.ruby-lang.org/pl/dokumentacja/ruby-a-inne-jezyki-programowania/

Powodzenia!

PS. Umownie za długą metodę (funkcję) można w Rubym uznać taką, która ma więcej niż 7-10 linijek. Warto wtedy wydzielić kod do osobnej metody i wywoływać z pierwszej - oczywiście w miarę logicznie.[/quote]
Dziękuję za rady. Na pewno skorzystam, gdyż chciałabym się zająć nauką Ruby’ego (a szczególnie Ruby on Rails - a do tego potrzebny jest Ruby).
No i trochę trudno jest mi się przestawić z C++, ale wiadomo, większość osób w szkołach zaczynało właśnie od Pascala albo C++.

Kod poprawię.

Jaki błąd mam w each ?

n = 5 #liczba wszystkich dostepnych przedmiotow
koszt= [12, 1, 2, 1, 4] #koszt kolejnych przedmiot
waga = [4, 2, 2, 1, 10] #waga kolejnych przedmiot
W = 15 #maksymalna waga plecaka

def sprawdzenie
@cur_w
@tot_v
@i
@maxi
used[]

i=0
i.each do |n-1|
	used[i]=0
end

cur_w=W

while (cur_w > 0) 
	maxi = -1
	i=0
	i.each do |n-1|
		used[i]=0
		if (used[i]==0) and ((maxi == -1) or (waga[i]/koszt[i] > waga[maxi]/koszt[maxi]))
			maxi = i
		end
		used[maxi] = 1
		cur_w -=koszt[maxi]
		tot_v += waga[maxi]
		if cur_w>0
			puts "Dodaj przedmiot numer" + (maxi + 1) + "o danych ( " + waga[maxi] + ","  + koszt[maxi] + "w calosci\n"
			else
				puts "Dodaj" + ((1 + cur_w/koszt[maxi]) * 100) + "% kosztu przedmiotu o numerze" + (maxi + 1) + "i danych (" + waga[maxi] + "," + koszt[maxi]*((1 + cur_w/koszt[maxi]))
				tot_v -= waga[maxi]
				tot_v += (1 + cur_w/koszt[maxi]) * waga[maxi]
		end
	end
do
end
	puts "Koszt wszystkich przedmiotow w plecaku wynosi" + tot_v

end

sprawdzenie()

i=0 i.each |n-1| used[i]=0 end
jest to nieprawidłowa składnia :wink: przerób ten tutorial - tryruby.org i większość powinna stać się jasna - to tylko 20-30 minut, a przestaniesz się męczyć z tym olbrzymim kawałkiem kodu.
i wklejaj kod używająć [ code=ruby][ /code] - to, że ucina linijki, to znak, że masz linijki za długie, a to tylko błąd stylowania forum (po zmniejszeniu czcionki w przeglądarce widać wtedy cały kod), a kod ze zmienną szerokością czcionki kiepsko się czyta.

Mam jeszcze pytanie: jest coś takiego jak “tablica.max” a czy można w pętli zrobić aby wypisane zostały coraz mniejsze max’y?
Tzn. mamy tablicę z liczbami 12, 3, 5, 2 i w pętli zostaną wypisane liczby od największej.

[12, 3, 5, 2].sort.reverse

Szukałam dosyć długo nie znalazłam: jak posortować tablicę wielowymiarową według jakiejś kolumny? tam są tylko liczby

http://ruby-doc.org/core/classes/Array.html#M002185

użyć bloku sortując tablicę “nadrzędną”.

Nie ma czegoś takiego jak wielowymiarowa tablica, a jedynie tablica tablic.

sevos, bardzo dziękuję za pomoc :slight_smile: . Widzę, że na Ruby’m to Ty się znasz i to bardzo dobrze. Oj, też bym tak chciała.

[quote=sevos]Brakuje “do”, np.

[code=ruby]while … do

end[/code]
[/quote]
W przypadku while ‘do’ nie jest wymagane (while nie przyjmuje bloku, dlatego np. nie zadziała while (warunek) { }).