• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak zapisać to inaczej, krócej?

Object Storage Arubacloud
0 głosów
704 wizyt
pytanie zadane 12 maja 2016 w PHP przez roxy32l Początkujący (470 p.)
<?php
	$liczba = $_POST['liczba'];
	
	else if(($liczba%3 == 0) && ($liczba %2 == 0) && ($liczba%5 == 0))
	{
		print 'Liczba jest podzielna przez 3 oraz 2';
	}
	if(($liczba%3 == 0) && ($liczba %5 == 0))
	{
		print 'Liczba jest podzielna przez 3 oraz 5';
	}
	else if(($liczba%5 == 0) && ($liczba %2 == 0))
	{
		print 'Liczba jest podzielna przez 5 oraz 2';
	}
	else if ($liczba%3 == 0)
	{
		print 'Liczba jest podzelna przez 3';
	}
	else if ($liczba%2 == 0)
	{
		print 'Liczba jest podzelna przez 2';
	}
	else if ($liczba%5 == 0)
	{
		print 'Liczba jest podzelna przez 5';
	}
	
?>	

Dziękuję za odpowiedzi.

komentarz 12 maja 2016 przez rafal.budzis Szeryf (85,260 p.)

Gdybym chciał zarządzać każdym wyświetlanym tekstem wstawiać miedzy "oraz", przecinki i inne znaki zrobił bym to tak długość kodu jest podobna ale zdaje mi sie ze rozbudowa kodu sprawi mniej problemów.

<?php
    $liczba = $_POST['liczba'];

    $mod2 = ($liczba % 2 == 0);
    $mod3 = ($liczba % 3 == 0);
    $mod5 = ($liczba % 3 == 0);

    $index = 'i';
    $index .= $mod2 ? '2' : '';
    $index .= $mod3 ? '3' : '';
    $index .= $mod5 ? '5' : '';

    $array = array(
        'i' => 'Liczba nie dzieli się przez 2, 3 oraz 5',
        'i2' => 'Liczba jest podzelna przez 2',
        'i3' => 'Liczba jest podzelna przez 3',
        'i5' => 'Liczba jest podzelna przez 5',
        'i23' => 'Liczba jest podzielna przez 3 oraz 2',
        'i25' => 'Liczba jest podzielna przez 5 oraz 2',
        'i35' => 'Liczba jest podzielna przez 3 oraz 5',
        'i235' => 'Liczba jest podzielna przez 2, 3 oraz 5',
    );

    echo $array[$index];

?>

 

3 odpowiedzi

+2 głosów
odpowiedź 12 maja 2016 przez bartek7910 Obywatel (1,980 p.)

Pierwsza sprawa. Masz źle wykonany pierwszy warunek. 

else if(($liczba%3 == 0) && ($liczba %2 == 0) && ($liczba%5 == 0))

To else nie ma prawa się tam znaleźć. Powinno być dopiero w drugim warunku.

 

if(($liczba%3 == 0) && ($liczba %2 == 0) && ($liczba%5 == 0))
    {
        print 'Liczba jest podzielna przez 3 oraz 2';
    }
else if(($liczba%3 == 0) && ($liczba %5 == 0))
    {
        print 'Liczba jest podzielna przez 3 oraz 5';
    }

Ja osobiście zrobiłbym to na pętli

<?php
	$liczba = $_POST['liczba'];
	#Zastosowanie petli for
	$dzielna="";
	for($i=2;$i<=5;$i++){
		if ($liczba %$i === 0){
			$dzielna = $dzielna." $i";
		}
	}
	echo"<p>Liczba $liczba jest podzielna przez $dzielna.</p>";
?>

Tym sposobem masz rozwiązanie bardziej uniwersalne. Wystarczy odpowiednio zmodyfikować warunek. 

komentarz 12 maja 2016 przez rafal.budzis Szeryf (85,260 p.)
Super ale co z wyrazem oraz ? :)
komentarz 12 maja 2016 przez bartek7910 Obywatel (1,980 p.)

Wystarczy prosta modyfikacja

 if ($liczba %$i === 0){
  if ($dzielna === '') $dzielna = "$i";
  else $dzielna = $dzielna." oraz $i";
}
komentarz 12 maja 2016 przez rafal.budzis Szeryf (85,260 p.)

Ale nie mozna powielać spójników w jezyku polskim dla 3 dzielników powinno być z przecinkiem i dopiero końcowy powinien otrzymać "oraz".

np dla dzielników 2 ,3 i 5 powinno być moim zdaniem 2, 3 oraz 5 w twoim programie wyjdzie "2 oraz 3 oraz 5"

Ja na twoim miejscu dodawał bym to do tablicy potem join połączył tablice bez ostatniego elementu przecinkami i na końcu dodał ostatni element.

komentarz 12 maja 2016 przez bartek7910 Obywatel (1,980 p.)

Oczywiście masz rację. 

To był tylko na szybko przykład podany. Poza tym nie chcę tworzyć całego gotowego rozwiązania tylko wskazać kierunek. Mój błąd że nie wspomniałem o możliwości zastosowania tablicy. Idąc dalej tym tropem, dla każdej liczby można zdefiniować wartość TRUE lub FALSE. Tym sposobem mamy jasno określone przez jakie liczby dzieli się dana liczba, a przez jakie nie. W zależności co chcemy wiedzieć wystarczy odpowiednio operować na tablicy.

komentarz 12 maja 2016 przez rafal.budzis Szeryf (85,260 p.)
:) tylko mi sie nie podoba troche to ze skróciłeś funkcjonalność programu i chwalisz się ze ma mniej linijek to jest takie troche dziwne. Zastanawiam sie czy finalny kod nie był by bardziej skomplikowany. (nie koniecznie patrzac na ilośc linijek ale poziam zagłebień i ilość ifów) Zerknij na moją propozycje :) 0 ifów i mysle ze mój kod bedzie szybszy od propozycji tablic + if + pętle
komentarz 12 maja 2016 przez bartek7910 Obywatel (1,980 p.)
edycja 12 maja 2016 przez bartek7910

A czy przetestowałeś dobrze swój skrypt?

Ja przetestowałem wszystkie trzy wersje i wyszły mi następujące wyniki:

Przykład dla liczby 5

Przykład #1 wersja oryginalna

Liczba jest podzelna przez 5

Przykład #2 bartek7910 - pętla FOR

Liczba 5 jest podzielna przez 5.

Przykład #3 wersja kolegi @rafla612b

Liczba nie dzieli się przez 2, 3 oraz 5

tylko mi sie nie podoba troche to ze skróciłeś funkcjonalność programu

Jak dla mnie to jest raczej na odwrót. Funkcjonalność się zwiększyła ponieważ wystarczą drobne modyfikacje i nie trzeba ograniczać się tylko do tych trzech liczb.

chwalisz się ze ma mniej linijek to jest takie troche dziwne

Nie chwalę się, że mój kod ma mniej linijek. Jest to tylko pewna uproszczona propozycja rozwiązania, wskazanie kierunku. Nie twierdzę, że jest to też najbardziej optymalne rozwiązanie, ale jest to tylko przykład, nad którym można dalej pracować.

Zerknij na moją propozycje :) 0 ifów

Twój kod po prostu nie działa!

Koniec tematu!

EDIT------------------------------

Znalazłem błąd w Twoim kodzie

$mod2 = ($liczba % 2 == 0);

 $mod3 = ($liczba % 3 == 0);

 $mod5 = ($liczba % 3 == 0);

Ostatnia linijka powinna wyglądać tak 

$mod5 = ($liczba % 5 == 0);

 

1
komentarz 12 maja 2016 przez Comandeer Guru (601,590 p.)

Ale nie mozna powielać spójników w jezyku polskim

Dywagowałbym.

Gdyby to była prawda, nie istniałyby zasady interpunkcji związanej z wielokrotnym wystąpieniem danego spójnika.

1
komentarz 12 maja 2016 przez rafal.budzis Szeryf (85,260 p.)

Jedną literówkę zrobiłem wpisałem 3 zamiast 5 robiłem na szybko rano przed pracą ale dzieki temu ze mój kod jest czytelny udało ci się znaleźć literówke :) Dzięki za wskazanie błedu. Cóż moge powiedzieć jestem tylko człowiekiem i popełniam błędy. Boli mnie trochę ze krzyczysz ze mój kod nie działa tylko dlatego ze chciałem ci pokazać inne podejście. Może źle odebrałeś te "chwalenie się" mogłem użyć słowa "pokazujesz przykład" chyba z tego wynikło jakieś nie porozumienie.

Jak dla mnie to jest raczej na odwrót. Funkcjonalność się zwiększyła ponieważ wystarczą drobne modyfikacje i nie trzeba ograniczać się tylko do tych trzech liczb.

Tu bym troszkę podyskutował bo wiesz można taki prosty skrypt zapisać Obiektowo gdzie klasa abstrakcyjna bedzie miała wyliczanie i pokazywanie podzielnych liczb. A dopiero klasy końcowe bedą dziedziczyć i implementować dzielniki ale czasem trzeba się skupić na założeniach autora i nie rozbudowywać ponad miare potrzeb. Dopasować kod do potrzeb jest trudno ale ważne przy pisaniu czystego kodu którego czasem jestem fanatykiem i mnie ponosi :x

Sorki jeśli źle mnie odebrałeś na pewno nie miałem nic złego na myśli.

komentarz 12 maja 2016 przez bartek7910 Obywatel (1,980 p.)

Zapewne można to zrobić na wiele sposobów. Wszystko zależy od wiedzy i umiejętności piszącego.

Kolega @ roxy32l zrobił to na ifach, ja i kolega @maly zrobiliśmy to na pętli (@maly jeszcze bardziej to rozbudował), Ty przedstawiłeś jeszcze inny sposób.

Z tym chwaleniem faktycznie miałem prawo źle Cię odebrać, czego efektem był tekst z niedziałającym kodem. Szkoda że wcześniej tego błędu nie zauważyłem. Na pewno by ten tekst się nie pojawił.

Jeśli Cię tym uraziłem to przepraszam.

Myślę, że możemy uznać temat za zamknięty.

Pozdrawiam

+2 głosów
odpowiedź 12 maja 2016 przez maly Nałogowiec (37,190 p.)

Najpierw zebrać wyniki.

$liczba =123456;
$podzielne = [];
for($i = 2; $i <= 123; $i++){
	if ($liczba %$i === 0){
		$podzielne[] = $i;
	}
}

 

Potem je formatować.

Gdybyś nie potrzebował słowa 'oraz' wystarczyłoby użyć implode.

echo implode(', ', $podzielne);

Jeśli 'oraz' jest wymagany to można sformatować tekst wykorzystując np. array_walk.

$result = '';

$userdata['count'] = count($podzielne);
$userdata['result'] = &$result;

array_walk($podzielne, function($value, $key, $userdata){
	$separator = '';
	if($key == $userdata['count'] - 2)
		$separator = ' oraz ';
	elseif($userdata['count'] > 1 && $key != $userdata['count'] - 1)
		$separator = ', ';

	$userdata['result'] .= $value.$separator;
},$userdata);

echo $result;

Można też sformatować wynik innymi sposobami ale napewno powinien istnieć podział między obliczeniami a wyświetlaniem wyników.

komentarz 12 maja 2016 przez bartek7910 Obywatel (1,980 p.)

Żeby rozwiązanie było jeszcze bardziej uniwersalne to warunek dla pętli można zrobić tak:

for($i = 2; $i <=$liczba; $i++)

W ten sposób nie ma ograniczenia co do wielkości liczby.

0 głosów
odpowiedź 15 maja 2016 przez roxy32l Początkujący (470 p.)

Dziękuję za odpowiedzi. bartek7910 na przyszłość to koleżanka ;P

komentarz 15 maja 2016 przez bartek7910 Obywatel (1,980 p.)

Bardzo przepraszam Koleżanko blush

Obiecuję poprawę laugh

Podobne pytania

0 głosów
1 odpowiedź 671 wizyt
pytanie zadane 17 stycznia 2018 w C i C++ przez julita998 Początkujący (250 p.)
0 głosów
2 odpowiedzi 175 wizyt
pytanie zadane 18 listopada 2015 w PHP przez Dawid Warduliński Obywatel (1,830 p.)
0 głosów
1 odpowiedź 130 wizyt
pytanie zadane 22 lutego 2022 w C# przez DXC Użytkownik (500 p.)

92,580 zapytań

141,432 odpowiedzi

319,665 komentarzy

61,965 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...