Oficjalne forum pomocy serwisu PUN.pl

Niestety, nikt nie powie Ci czym jest FluxBB - musisz go poznać sam!

Nie jesteś zalogowany na forum.

#1 2015-04-07 16:07:53

Baczus
Użytkownik
Skąd: ten spam?
Dołączył: 2010-02-25
Liczba postów: 448
WWW
Windows 7Firefox 37.0

Dla fanatyków PHPa z prośbą o pomoc

W sumie to nie wiem czy mogę to tutaj umieścić ale kod jest całkowicie mój (napisany od czystej kartki) więc mogę z nim zrobić co zechcę, jednak bardziej mi chodzi o to czy znajdę tu jakiś odzew..
Mianowicie chodzi o to jak jeszcze bardziej usprawnić poniższy kod i czy w ogóle się da:

<?php echo'<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<meta name="author" content="Baczus" >
	<meta name="copyright" content="Copyright CC BY-SA 2015 Baczus">
	<!-- Creative Commons Uznanie autorstwa - Na tych samych warunkach  (CC BY-SA)
	Link do licencji dla nieznających:
	http://creativecommons.org/licenses/by-sa/3.0/deed.pl
	-->
	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" >
	<title>10 >> 2</title>
	<style type="text/css">
	#error {
		display: none;
	}
	</style>
</head>
<body style="background-color: black;">
<center><font color="white">
<font size="24px"><p style="font-family: monospace">Binaryzacja</font></p>
<form action="binaryzacja.php" method="post">
<center>
<font size="5">
Podaj liczbę: </font><input type="text" name="coto" /><br>
Na ilu bitach ją zapisać: <select name="iletego">
';
for ($i=0;$i<20;$i++){
	$oktet = ($i+1)*8;
	echo '<option>'.$oktet.'
	';
}
echo '</select> 
<input type="submit" name="submit" value="Prześlij"/>
</center>
</form><br>
<div id="error">';
$hasz = $_POST["coto"];
$bity = $_POST["iletego"];
$maximum = pow(2,$bity)-1;
echo '</div>';
$programowane = $hasz-$hasz%1;
$ile = $bity+1;
if (0<$hasz){
	if ($hasz<$maximum){
		if($hasz%1 == 0){
			echo 'Poniższa linijka zamienia liczbę całkowitą na naturalną.<br>';
			echo 'Wybrałeś liczbę <b>'.$hasz.'</b>, a program wczytuje liczbę <b>'.$programowane.'</b>';
			for ($i=0;$i<$ile;$i++){
			if ($i>0){
			$liczba[$i] = $wynik[($i-1)]/2;
			}
			else {
			$liczba[$i] = $programowane;
			}
			$b[$i] = $liczba[$i]%2;
			 if($b[$i]==1){
				 $wynik[$i] = $liczba[$i]-0.5;
			}
			 else {
				 $wynik[$i] = $liczba[$i];
			}
			}
			echo '<br><br><br>'.$programowane.' >> ';
			for ($i=1;$i<$ile;$i++){
			echo $b[$bity-$i];
			if ($i%8==0){
			echo ' ';
			}
			else {}
			}
		}
		else {
		echo 'Podałeś liczbę nie naturalną !';
		}
	}
	else {
	echo 'Podałeś za dużą liczbę ! ';	
	}
}
else {
	echo 'Nie podałeś liczby ! ';
}
echo '
</font></center>
</body>
</html>
';
?>

PS div error musi zostać w takiej formie ponieważ Vertrigo ma problemy ze zrozumieniem przypisania zmiennych PHPu do tych przysłanych z formularza (kto działał na tym środowisku ten wie o co chodzi. Chyba, że jakoś to obszedł, jeśli tak to proszę powiedzieć jak).
Z góry dzięki za pomoc.

* Jeśli ktoś twierdzi, że łamię regulamin to proszę przeczytać 1 punkt regulaminu działu ("1. Dział przeznaczony jest do rozmów na tematy niezwiązane z serwisem PUN.pl") Regulamin działu

Wiadomość dodana po 15 min 35 s:
Sory ale właśnie znalazłem błąd:

$maximum = pow(2,$bity)-1;
...
	if ($hasz<$maximum){

Więc 65535 nie jest tolerowane dla 16 bitowego zapisu, a powinno być, bo to 11111111 11111111 ...
Żeby to zniwelować wystarczy zrobić jedną z dwóch rzeczy:

1. Usunąć -1

LUB

2. Zmienić wyrażenie warunkowe przepisanego ifa na mniejsze lub równe.

Sorka ale ciągle sam szukam błędów [sred])

Offline

#2 2015-04-07 16:34:53

pro14ab
Moderator
Skąd: C:\users\pro14ab
Dołączył: 2013-01-20
Liczba postów: 1,190
WWW
Windows 7Chrome 41.0.2272.118

Odp: Dla fanatyków PHPa z prośbą o pomoc

Raczej nikt Ci tu nie pomoże, osoby ogarniające PHP odeszły lub mało kiedy wchodzą.

Offline

#3 2015-04-08 20:17:18

Baczus
Użytkownik
Skąd: ten spam?
Dołączył: 2010-02-25
Liczba postów: 448
WWW
Windows 7Firefox 37.0

Odp: Dla fanatyków PHPa z prośbą o pomoc

Ok zmieniło się dość nie wiele ale kod jest bardziej wydajny i przyzwoitszy dlatego postanawiam go tutaj zamieścić celem uaktualnienia tematu:

<?php echo'<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<meta name="author" content="Baczus" >
	<meta name="copyright" content="Copyright CC BY-SA 2015 Baczus">
	<!-- Creative Commons Uznanie autorstwa - Na tych samych warunkach  (CC BY-SA)
	Link do licencji dla nieznających:
	http://creativecommons.org/licenses/by-sa/3.0/deed.pl
	-->
	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" >
	<title>10 >> 2</title>
	<style type="text/css">
	#error {
		display: none;
	}
	</style>
</head>
<body style="background-color: black;">
<center><font color="white">
<font size="24px"><p style="font-family: monospace">Binaryzacja</font></p>
<form action="binaryzacja.php" method="post">
<center>
<font size="5">
Podaj liczbę: </font><input type="text" name="coto" /><br>
Na ilu bitach ją zapisać: <select name="iletego">
';
for ($i=0;$i<20;$i++){
	$oktet = ($i+1)*8;
	echo '<option>'.$oktet.'
	';
}
echo '</select> 
<input type="submit" name="submit" value="Prześlij"/>
</center>
</form><br>
<div id="error">';
$hasz = $_POST["coto"];
$hasz = str_replace(",",".",$hasz);
$bity = $_POST["iletego"];
$maximum = pow(2,$bity);
echo '</div>';
$programowane = (int) $hasz;
$ile = $bity+1;
if (0<$hasz){
	if ($hasz<$maximum){
		if ($programowane == $hasz){
			echo 'Wybrałeś liczbę <b>'.$hasz.'</b>';
		 }
		else {
			echo 'Wybrałeś liczbę <b>'.$hasz.'</b>, a program wczytuje liczbę <b>'.$programowane.'</b>';
		 }
		for ($i=0;$i<$ile;$i++){
		 if ($i>0){
			$liczba[$i] = $wynik[($i-1)]/2;
		 }
		 else {
			$liczba[$i] = $programowane;
		 }
		$b[$i] = $liczba[$i]%2;
		 if($b[$i]==1){
			 $wynik[$i] = $liczba[$i]-0.5;
		 }
		 else {
			 $wynik[$i] = $liczba[$i];
		 }
		}
		echo '<br><br><br>'.$programowane.' >> ';
			for ($i=1;$i<$ile;$i++){
		 echo $b[$bity-$i];
		 if($i%8==0) echo ' ';
		}
	}
	else {
	echo 'Podałeś za dużą liczbę ! ';	
	}
}
else {
	echo 'Nie podałeś liczby ! ';
}
echo '
</font></center>
</body>
</html>
';
?>
Co się zmieniło?

+ $hasz = str_replace(",",".",$hasz);
Przecież w PHP liczby wymierne (nie całkowite) deklaruje się przy pomocy znaku kropki, a nie przecinka. Na wszelki wypadek obsługa tych drugich też się przyda skoro nawet mi się zdarza o tym zapomnieć [dblpt]D
+ $programowane = (int) $hasz;
Zamiana typu zmiennej, a raczej wymuszenie przejścia na inny typ zmiennej, gdzie ja miałem głowę, że nie zrobiłem tego wcześniej [dblpt]huh[dblpt]
+ if ($programowane == $hasz)
No ok wszystko fajnie, że teraz $programowanie jest intem ( [dblpt]gora[dblpt] ) ale jeśli ktoś wpisał złośliwie liczbę z przecinkiem (kropką) to przecież musi zobaczyć, że ten program nie obsługuje liczb wymiernych, tylko naturalne, bo sam sposób zapisu tych zmiennych byłby wątpliwy... Zresztą mniejsza w to, bo mi nie jest nawet potrzebna obsługa liczb ujemnych czy całkowitych [dblpt]angel[dblpt]
Niestety Powyższa modyfikacja nie jest w pełni odporna na idiotów (jak zwykł mawiać mój nauczyciel w technikum). Mianowicie chodzi o to, że gdy użytkownik wpisze np. "32miliony" to zostanie mu wyświetlony komunikat "Wybrałeś liczbę 32miliony", a nie "Wybrałeś liczbę 32miliony, a program wczytuje liczbę 32", mimo to przetworzona zostanie liczba 32 [sred]) . Jednak w uszczegółowieniu tego ifa dla obsługi również tego typu zmian przy przejściu na inny typ zmiennej zwracam się o pomoc [dblpt]please[dblpt]
- if($hasz%1 == 0)
Stało się to zbędne, gdyż stary fragment zastąpiło nadanie typu int dla zmiennej przetwarzanej w programie ($programowane) [dblpt]einstein[dblpt]

Podsumowując
Dalej proszę o uważną interpretację kodu i może jednak znajdzie się ktoś, kto zna jakąś metodę na usprawnienie tego kodu, naprawę wspomnianego tutaj niedociągnięcia lub powie jak zwiększyć maksymalną liczbę, którą może przetworzyć ten program, bo 2^160-1 na pewno nie uciągnie, mimo iż teoretycznie użytkownik może ją wpisać [dblpt]P

Liczę na was [sred])

Offline

Użytkowników czytających ten temat: 0, gości: 1
[Bot] CCBot

Stopka

Forum oparte na FluxBB

Darmowe Forum
wstory - supremerp - stangoldlakeurp - zastepdelta - lossantosstories