Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

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