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ę.

×
×
  • Dodaj nową pozycję...