Skocz do zawartości

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

patryk2205

Częstotliwość liczb - PHP

Rekomendowane odpowiedzi

Witam,

Mam program który losuje 100 liczb, zapisuje je do pliku, nastepnie odczytuje je z pliku i zlicza ilość wystąpień każdej z nich. Program działa tylko chciałbym jeszcze posortować te liczby rosnąco, tylko nie wiem jak to zrobić. Myślałem żeby jakoś je do tablicy wrzucić, ale pomysł się urwał. Ma ktoś jakis pomysł?

 

<?php

function Wylosuj($plik, $liczb) // liczb -> ilość losowanych liczb
{
	$dostep = fopen($plik, "w");
	fwrite($dostep, ''); // usuwa zawartosc pliku

	for($i = 0; $i < $liczb; $i++)
	{
		$los = rand(0, 99);
		if($i != $liczb-1) // różne od ostatniej pozycji do zapisania 
		{
			fputs($dostep, $los.";");
		}
		else
		{
			fputs($dostep, $los); // na końcu nie ma ;
		}	
	}
	fclose($dostep);
	return $plik;
}

function OdczytLosy($plik)
{
	$read = fopen($plik, "r");
	$wszystkie_losy = fread($read, filesize($plik));
	fclose($read);

	return $wszystkie_losy;
}

function IloscPowtorzen($odczytane)
{
	$wylosowana = explode(";", $odczytane);

	for($l=0; $l < count($wylosowana); $l++)
	{
		echo $wylosowana[$l]." ";
	}

	echo "<hr/>";
	$pow = 0;

	for($s = 0; $s < count($wylosowana); $s++)
	{
		$k = $s - 1;
		for($k; $k > 0; $k++)
		{
			if($wylosowana[$s] == $wylosowana[$k])
			{
				break; //jeśli ilość powtórzeń takiej liczby była już liczona to przerywa pętla, wraca do początku
			}
		}

		$pow = 1;
		$p = $s+1;
		for($p; $p < count($wylosowana); $p++)
		{
			if($wylosowana[$s] == $wylosowana[$p])
			{
				$pow++;
			}
		}

		echo "Liczba: "."<b>".$wylosowana[$s]."</b>"." powtórzyła się: "."<b>".$pow." raz/y"."</b>"."<br/>"; 

	}

}

$plik = Wylosuj("wylosowane.txt", 100);
$odczytane = OdczytLosy($plik);
IloscPowtorzen($odczytane);
?>

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Do tablicy + asort.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Patrzę na tą masę kodu do tak trywialnego zadania i ręce załamuje.

W Javie napiszesz to za pomocą kilku linijek kodu.

Nie rozumiem dlaczego ludzie się jeszcze męczą w tym php-cu.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Być może lepiej w Javie aczkolwiek ja uczę się w szkole jak na razie PHP.

 

Co do rozwiązania, bo nie wiem do końca w jaki sposób to do tablicy dodać żeby można było później odczytać że dana liczba powtórzyła się tyle i tyle razy. Może być np. że będę dodawał do tablicy wartości według wzoru: "liczba;ilość". Czyli po średniku a później przy pętli do odczytania będę je wydzielał poprzez explode()?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Masz w php kilka różnych wbudowanych funkcji sortujących.

Znajdź dokumentacje php i poszukaj w niej.

Szukaj też "sortowanie tablicy liczby php" w wujku google.

 

poszukałem i znalazłem np.

krsort($top,SORT_NUMERIC);

nie pamiętam czy to rosnąco czy malejąco. Jak nie ma przeciwnej funkcji to array_reverse albo coś tam xD

 

Poświęć trochę czasu na przeglądnięcie dokumentacji żeby wiedzieć gdzie czego szukać (nie trzeba kuć na blachę,

wystarczy wiedzieć gdzie szukać a jak będziesz programować to wiedza sama wejdzie do głowy).

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Funkcje sortujące znam, korzystać z zasobów internetu też, chodzi mi o sam sposób umieszczenia danych w tablicy

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

tablica w formacie:

indeks: liczba, wartość: stara wartość + 1

 

np.

 

liczba = 10

[10]++

liczba = 21

[21]++

liczba = 10

[10]++

 

wynik:

10 = 2, 21 = 1

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Patrzę na tą masę kodu do tak trywialnego zadania i ręce załamuje.

W Javie napiszesz to za pomocą kilku linijek kodu.

Nie rozumiem dlaczego ludzie się jeszcze męczą w tym php-cu.

I myślisz że gdyby autor posta usiadł do javy napisalby to w kilku liniach? Doświadczony programista php też ten kod mocno skróci.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Generalnie ten mój program powinien działać bo zrobiłem to z explode tylko, że nie działa ten break jak należy. Dodałem go tam żeby nie wypisywało drugi raz liczby i jej ilości powtórzeń jeśli już wcześniej była sprawdzana i miałem nadzieje że jak dam break to pętla się zakończzy i wróci do początku tylko nie ta pętla wewnętrzna tylko do tej zewnętrznej for($s = 0; $s < count($wylosowana); $s++). Wie ktoś jak to zapisać w kodzie żeby pętla w danym momencie wracała do początku?

 

<?php

function Wylosuj($plik, $liczb) // liczb -> ilość losowanych liczb
{
	$dostep = fopen($plik, "w");
	fwrite($dostep, ''); // usuwa zawartosc pliku

	for($i = 0; $i < $liczb; $i++)
	{
		$los = rand(0, 99);
		if($i != $liczb-1) // różne od ostatniej pozycji do zapisania 
		{
			fputs($dostep, $los.";");
		}
		else
		{
			fputs($dostep, $los); // na końcu nie ma ;
		}	
	}
	fclose($dostep);
	return $plik;
}

function OdczytLosy($plik)
{
	$read = fopen($plik, "r");
	$wszystkie_losy = fread($read, filesize($plik));
	fclose($read);

	return $wszystkie_losy;
}

function IloscPowtorzen($odczytane)
{
	$wylosowana = explode(";", $odczytane);

	for($l=0; $l < count($wylosowana); $l++)
	{
		echo $wylosowana[$l]." ";
	}

	echo "<hr/>";
	$pow = 0;

	for($s = 0; $s < count($wylosowana); $s++)
	{
		$k = $s - 1;
		for($k; $k >=0; $k--)
		{
			if($wylosowana[$s] == $wylosowana[$k])
			{
				break; // Nie działa jak należy! Wypisuje dwa razy niektóre liczby
			}
		}

		$pow = 1;
		$p = $s+1;
		for($p; $p < count($wylosowana); $p++)
		{
			if($wylosowana[$s] == $wylosowana[$p])
			{
				$pow++;
			}
		}
		$end[$s] = $wylosowana[$s].";".$pow; // dana liczba + powtorzenia
		sort($end);

	}
	for($s = 0; $s < count($end); $s++)
	{
		$dane = explode(";", $end[$s]);
		echo "Liczba: "."<b>".$dane[0]."</b>"." powtórzyła się: "."<b>".$dane[1]." raz/y"."</b>"."<br/>"; 
	}

}

$plik = Wylosuj("wylosowane.txt", 100);
$odczytane = OdczytLosy($plik);
IloscPowtorzen($odczytane);
?>

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ustawiasz indeks pętli na wartość początkową i leci od nowa. Chociaż nie wiem czy to dobry pomysł, bo łatwo można zrobić nieskończoną ilość powtórzeń.

 

Edit: ogólnie, to to wygląda na za bardzo przekombinowane.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

php w ogóle na nowe standardy programowania jest 'skomplikowany'.

 

Nie określa się jaki typ danych ma zwrócić funkcja/metoda, przez co ani

IDE(edytor programistyczny) ani 'jednostka wykonująca' język nie powie od razu że

coś jest nie tak...

 

Brak typowania jak dla mnie powinien wykluczyć ten język z użytku. Nie znam wersji php 8 więc

nie będe się wymądrzać że język do niczego (ale raczej ze względu na wsteczną kompatybilność

nie dodadzą typowania wartości zwracanych / parametrów.

 

Po kiego diabła uczą tego w szkole. Już lepiej się brać za C / jave / pythona czy jakiegoś swifta.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Może źle się wyraziłem, nie chce żeby pętla wykonywała sie od nowa tylko żeby wróciła do początku wykonywania się, zwiększyła $s+1 i wykonywała się dalej. Bo jeśli wylosowana[$s] = wylosowana[$k] to by znaczyło, że już dla takiej liczby wcześniej była liczona ilość powtórzeń.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

stara się na siłę zrobić po swojemu ;)

 

break - przerywa wykonywanie pętli, continue - przeskakuje do kolejnego kroku pętli

wewnątrz drugiej pętli możesz wpływać na licznik pętli zewnętrznej

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

  • Popularne aktualnie

  • Tematy

  • Odpowiedzi

    • Jagular, ja o tym wiem  Odpowiadałem jedynie na pytanie jakie są możliwości po wyjściu z UE. Nie na pytanie, czy to ma sens  Na pytanie o sens odpowiedziałbym inaczej.
    • Tak, na pewno po to żeby robić z nami gospodarcze eldorado Przecież oni grają na osłabienie Europy, na skłócenie, na rozwalanie gospodarki, a nie chęć współpracy z nami. Czym chcesz wynegocjować te warunki? Jak chcesz ominąć wymagania na normy produktów, produkcji itp? Jeżeli Polska jest silna, to ma możliwość negocjacji, ale w takim razie ma też możliwość nadawania kierunku w jakim idzie UE. Jeżeli Polska jest słaba, to nie ma czym negocjować warunków, te będzie dyktować UE. Postulaty prawicy o wyjściu z unii to typowe zjeść ciastko i mieć ciastko, czyli zachować warunki handlowe, ale pozbyć się narzutu zielonego i kolorowego. To czysty populizm i mrzonki, bo chcąc mieć umowę handlową, gospodarczą, Unia może dowolnie nam narzucać warunki, w tym te związane z ekologią, prawami człowieka i czymkolwiek innym.
    • Płatność poszła jako BLIK - już dostali kilka zgłoszeń o problemie z tym sposobem zapłaty przy większych kwotach. Zero tematu "przepraszamy za zaistniałą sytuację" mega słabo...
    • Oficjalnie o silniku Ego w F1. Lee Mather, starszy dyrektor kreatywny ds. F1 24. Ego jest używany od 15 lat, i zmienia się znacząco co roku (XD) w tym roku zostanie usprawniony o  dynamic diffuse global illumination (DDGI) dla oświetlenia, pod względem graficznym wygląda że to będzie jedyna zmiana. W przeszłości zdecydowana większość gier od Codemasters śmigało na silniku EGO, w tej chwile jest on stosowany jedynie w serii F1, wszystko to po przejęciu przez EA. Lee uważa to za zaletę ponieważ zespół zna ten silnik na wylot ponieważ sami go stworzyli. "Mamy całkowitą elastyczność, aby zrobić z nim, co chcemy. Nie sądzę, że bylibyśmy w stanie tak łatwo wprowadzić ogromne zmiany w fizyce, gdyby nie nasza technologia." Zapytany, czy team odpowiedzialny za F1 rozważyłby pójście drogą ludzi od WRC i przejście na Unreal Engine, Mather odpowiedział: nie ma żadnego wymogu ani potrzeby, abyśmy wykonywali ten ruch. Nie dałoby nam to żadnych  większych korzyści w serii F1. W EA WRC oczywistym powodem była potrzeba generowania długich OS-ów,  i unreal engine daje taką możliwość, w F1 tego nie potrzebujemy. Wybiegając w przyszłość silnika EGO „Będziemy go nadal budować i rozwijać” – podkreśla Mather.   Dziękuje, tyle w temacie obiecanek zmian, przez te same osoby przez ostatnie 2 lata.  
    • Czyli bardziej atrakcyjna opcja nie jest lepsza? I jak tu nie chwytać za słówka?  Warunki handlu 'minimalnie' gorsze, hehehe...a jaka na to jest gwarancja? Scenariusz idealny? Obudźmy się i przedstawmy scenariusz realny: Polska się foszy, Unia się foszy, Polska wychodzi, Unia napina mięśnie, Polska napina mięśnie. Wygrywa silniejszy. Słabszy klęka i się podporządkowuje warunkom stawianym przez silniejszego. Jak już Unia kończy, warunkowanie przez gwałt zaczynają kolejni silniejsi od Polski; Wschód, USA, czy nawet republika moczarów zielarskich. W świecie realnym rozmyślania o tym co byśmy mogli zrobić gdybyśmy byli kimś nie mają za dużego sensu, jeżeli się tym kimś nie jest
  • Aktywni użytkownicy

×
×
  • Dodaj nową pozycję...