←  Gotowe funkcje

AMXX.pl: Support AMX Mod X i SourceMod

»

Polskie końcówki wyrazów w zależności od w...

Gość_21977_* 30.06.2012

Wstęp
Na pewno nieraz widzieliście napisy typu:
  • Koszt przesyłki wynosi 24 złotych
  • Na Twoim koncie jest 1 punktów
  • Sesja wygaśnie za 4 minut
Nie potrafiliście sobie z tym poradzić,
lub po prostu problem Was przerastał.

Mam dla Was wspaniałą nowinę:
Od dziś będziecie spać spokojnie!
Albowiem przedstawiam rozwiązanie.

Stock wybiera odpowiednią końcówkę na podstawie podanej wartości.

Mamy do czynienia z dwoma stockami:
  • dkoncowka() dla liczb całkowitych (integer, decimal)
  • fkoncowka() dla dla liczb zmiennoprzecinkowych (float)
Zastosowanie

dkoncowka(ile, czlon[], zero[], jeden[], dwa[]);
fkoncowka(Float:ile, czlon[], zero[], pol[], jeden[], dwa[]);


Opis
  • ile [liczba całkowita dla dkoncowka(), zmiennoprzecinkowa dla fkoncowka()] → wartość, na podstawie której wybierana będzie końcówka
  • czlon [ciąg znaków] → wbrew nazwie humanistycznej, początek wyrazu wyświetlanego, identyczny dla wszystkich kolejnych argumentów
  • zero [ciąg znaków] → końcówka, którą przyjmuje wyraz dla wartości ile równej 0, która dołączona do członu da pełny, odmieniony wyraz
  • pol [ciąg znaków] → końcówka, którą przyjmuje wyraz dla wartości ile równej 0.5, która dołączona do członu da pełny, odmieniony wyraz
  • jeden [ciąg znaków] → końcówka, którą przyjmuje wyraz dla wartości ile równej 1, która dołączona do członu da pełny, odmieniony wyraz
  • dwa [ciąg znaków] → końcówka, którą przyjmuje wyraz dla wartości ile równej 2, która dołączona do członu da pełny, odmieniony wyraz
Uwaga
Zmienna czlon służy zaoszczędzeniu czasu w używaniu funkcji, pozostawienie jej pustej i podanie pełnych odmian słów pozostałych zmiennych
w zupełności spełni swoje zadanie, choć zazwyczaj zwyczajnie przysporzy nam niepotrzebnego pisania kilkakrotnie początku tego samego wyrazu.

Przykłady
if(is_user_alive(id)){
new hp=get_user_health(id);
client_print(id,print_chat,"Masz %d %s zycia", hp, dkoncowka(hp, "punkt", "ow", "", "y"));
}

if(is_user_connected(id)){
new frags=get_user_frags(id);
if(frags)
client_print(id,print_chat,"Zdobyles %d %s", frags, dkoncowka(frags, "frag", "ow", "a", "i"));
else
client_print(id,print_chat,"Nie zdobyles jeszcze zadnego fraga");
}


Stocki do skopiowania
stock dkoncowka(ile, czlon[], zero[], jeden[], dwa[]){
new str[1024];
ile=abs(ile);
if(ile==1){
format(str,1023,"%s%s",czlon,jeden);
return str;
}
if((ile%10==2 || ile%10==3 || ile%10==4) && (!(ile%100==12 || ile%100==13 || ile%100==14))){
format(str,1023,"%s%s",czlon,dwa);
return str;
}
format(str,1023,"%s%s",czlon,zero);
return str;
}

stock fkoncowka(Float:ile, czlon[], zero[], pol[], jeden[], dwa[]){
new str[1024];
ile=floatabs(ile);
if(ile==1.0){
format(str,1023,"%s%s",czlon,jeden);
return str;
}
if(ile!=floatround(ile)){
format(str,1023,"%s%s",czlon,pol);
return str;
}
new num=floatround(ile);
if((num%10==2 || num%10==3 || num%10==4) && (!(num%100==12 || num%100==13 || num%100==14))){
format(str,1023,"%s%s",czlon,dwa);
return str;
}
format(str,1023,"%s%s",czlon,zero);
return str;
}


Stocki do pobrania
Załączony plik  koncowka.inc   1,02 KB   160 Ilość pobrań
Implementacja (koncowka.inc)
  • Kopiujemy stock do folderu scripting/include i dodajemy na początku kodu
    #include <koncowka>
    
  • Lub kopiujemy potrzebne stocki do naszego kodu
Odpowiedz

  • +
  • -
ToRRent - zdjęcie ToRRent 30.06.2012

Wow !

Miałeś naprawdę dobry pomysł ;)
Odpowiedz

  • +
  • -
Maniek974 - zdjęcie Maniek974 30.06.2012

+ dla ciebie
Komuś na pewno się przyda.
Odpowiedz

  • +
  • -
Pan PrO - zdjęcie Pan PrO 30.06.2012

Na pewno się przyda
Odpowiedz

  • +
  • -
radim - zdjęcie radim 01.07.2012

Hehe, dobry pomysł, wręcz zaje*isty ; ) Dużo razy borykałem się z tym problemem i używałem zawsze if'ów O.o :facepalm:
+
Odpowiedz

  • +
  • -
sNH. - zdjęcie sNH. 01.07.2012

Dobra robota! +
Odpowiedz

  • +
  • -
Stachuu :D ?? - zdjęcie Stachuu :D ?? 01.07.2012

mogłeś tez używać reszty z dzielenia zamiast if
Odpowiedz

Gość_21977_* 01.07.2012

@Stachuu :D ?? Co miałeś na myśli z używaniem reszty z dzielenia?
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 01.07.2012

temat wyczyszczony ;)
Odpowiedz

  • +
  • -
grzesiu131 - zdjęcie grzesiu131 30.07.2012

Jest możliwość dodania trzeciego stock'u, który sprawdzałby czy pierwszy argument jest typu int czy float i na podstawie wyników sam wybierał który stock użyć d-f ?
G[o]Q (30.07.2012 14:39):
tak
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 30.07.2012

format ( które jest dość wolne ) mogło by zostać zamienione na copy
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 23.03.2013

#define konc(%1,%2,%3,%4) (%1==1?%2:(%1%%10<5&&%1%%10!=05||%1/10!=1)?%2:%3)


Zawsze robiłem to w ten sposób... Kto ten kod zrozumie? :D
Odpowiedz