Jump to content

info 1. kolo soutěže [POKYNY A ZADÁNÍ]


vEnd

Recommended Posts

  • Hlavní moderátor

Cíl scriptu
Cílem je implementovat funkce dle prototypů a popisu v zadání. Jedná se o funkce pro práci s řetězcem a o funkce pro nenáročné výpočty a úkony.

Co ovlivní hodnocení
Hodnocení bude záležet na níže uvedených faktorech (od nejdůležitějšího).
 
1. Přeložitelnost a chybovost (chyby, pády a varování kompilátoru, chyby při běhu [klikněte pro příklad]);
2. Správná implementace (dodržení zadání) a funkčnost;
3. Ošetření neočekávaných vstupů a hodnot;
4. Přehlednost kódu.

Co hodnocení neovlivní
V prvním kole nebude rozhodovat optimalizace kódu.

Co je zakázáno
Níže uvedené funkce a způsoby programování jsou zakázány a za jejich použití bude značná ztráta bodů.
 
1. Všechny funkce z knihovny string.inc (strlen, strcmp, strval apod.);
2. Klíčové slovo stock u definic funkcí;
3. Jakékoliv jiné knihovny (includy), které nejsou součástí a_samp.inc;
4. Jakékoliv pluginy.
 
Datum a způsob odevzdání
Hotové scripty zasílejte mně pomocí soukromé zprávy. Název scriptu bude ve tvaru vas_nick_na_foru.pwn. Scripty mi můžete zasílat do 22. 1. 2017.

Zadání
1. Implementujte následující funkce pro práci s řetězci
a) StringCompare

 

forward StringCompare(const str1[], const str2[], bool:ignorecase=false, length=-1);

Účel a implemenační detaily:
Porovnat řetězce str1 a str2.
Parametr ignorecase s hodnotou true nebude rozlišovat velká a malá písmena.
Parametrem length lze určit, kolik znaků od začátku se bude porovnávat. Má-li zápornou hodnotu (výchozí je -1), budou se porovnávat celé řetězce.

Návratová hodnota:
0   – řetězce jsou totožné;
1   – řetězec str1 je delší;
-1 – řetězec str2 je delší;
69 – řetězce jsou stejně dlouhé, ale nejsou totožné.
 
Příklad použití:



new res;

res = StringCompare("Ahoj", "Ahoj"); //res bude mít hodnotu 0
res = StringCompare("Ahoj", "ahoj svete!", true, 4); //res bude mít hodnotu 0
res = StringCompare("Ahoj", "ahoj"); //res bude mít hodnotu 69
res = StringCompare("Ahoj svete!", "Ahoj"); //res bude mít hodnotu 1
res = StringCompare("Ahoj", "Ahoj svete!"); //res bude mít hodnotu -1

.

B) StringToValue



forward StringToValue(const str[]);

Účel:
Převést řetězec str na celé číslo (kladná i záporná čísla).

Návratová hodnota:
Převedené číslo.
0 v případě, že byl řetězec prázdný nebo obsahoval i jiné znaky než číslice a mínus na začátku – ošetřte!
 
Příklad použití:



new res;

res = StringToValue("0123"); //res bude mít hodnotu 123
res = StringToValue("-1445"); //res bude mít hodnotu -1445
res = StringToValue("4a8 58"); //res bude mít hodnotu 0

.

c) StringConcat


forward StringConcat(dest[], const src[], length = sizeof src, maxlen = sizeof dest);

Účel a implementační detaily:
Spojit řetězce dest a src a nový řetězec uložit do řetězce dest.
Parametrem length lze určit, kolik znaků z řetězce src se má spojit s řetězcem dest.
Velikost řetězce dest je uložena v parametru maxlen.

Návratová hodnota:
1 – funkce se provedla úspěšně;
0 – nastala chyba (záporný parametr length apod. – ošetřte!).
 
Příklad použití:



new res[20+1] = "Ahoj, ";

StringConcat(res, "svete!"); //res bude mít hodnotu "Ahoj, svete!"

res = "Ahoj, ";

StringConcat(res, "svete!", 2); //res bude mít hodnotu "Ahoj, sv"

.

d) StringTransliterate



forward StringTransliterate(dest[]);

Účel:
Nahradit všechna diakritická znaménka (česká i slovenská) v řetězci dest vhodnými písmeny.

Návratová hodnota:
Žádná.
 
Příklad použití:



new res[] = "Příliš žluťoučký kůň úpěl ďábelské ódy.";

StringTransliterate(res); //res bude mít hodnotu "Prilis zlutoucky kun upel dabelske ody."

.

e) StringAnalyze



forward StringAnalyze(const dest[], const sequence[], &numcount, &letcount, &specount, &seqcount);

Účel:
Zjistit, kolikrát se v řetězci dest vyskytuje posloupnost znaků sequence, a tento počet uložit do parametru seqcount (rozlišují se velká a malá písmena).
Zjistit, kolik obsahuje řetězec dest číslic, a tento počet uložit do parametru numcount.
Zjistit, kolik obsahuje řetězec dest písmen, a tento počet uložit do parametru letcount (nerozlišují se velká a malá písmena).
Zjistit, kolik obsahuje řetězec dest nealfanumerických znaků (znaky, které nejsou písmena ani číslice včetně mezer), a tento počet uložit do parametru specount.

Návratová hodnota:
Žádná.
 
Příklad použití:



new res[] = "ahahaha, 85,! mehehe, muhaha, AHAHAHA";
new num, let, spec, seq;

StringAnalyze(res, "ha", num, let, spec, seq);
//num bude mít hodnotu 2, let hodnotu 26, spec hodnotu 9 a seq hodnotu 5

.

f) DecodeMorse (BONUS – nepovinné)



forward DecodeMorse(const morsecode[]);

Účel a implementační detaily:
Do parametru morsecode se udává řetězec v morseovce, který je potřeba rozkódovat a vypsat do terminálu (funkce printf).
Jednotlivá písmena se oddělují mezerou, slova lomítkem.
Počítejte s tím, že zadaná morseovka bude vždy korektní, to znamená, že není třeba nic ošetřovat.
 
Návratová hodnota:
Délka dekódovaného řetězce.
 
Příklad použití:


DecodeMorse(".... . .-.. .-.. ---/.-- --- .-. .-.. -.."); //do terminálu se vypíše "Hello world" a návratová hodnota bude 11

.

2. Implementujte následující funkce pro nenáročné výpočty a úkony
a) HexToDec


forward HexToDec(strhex[]);

Účel:
Převést číslo šestnáctkové soustavy ve formě řetězce strhex na číslo desítkové soustavy.

Návratová hodnota:
Převedené číslo.
-1 v případě, že je řetězec strhex prázdný nebo obsahuje jiné znaky než 0-9, A-F či a-f – ošetřte!
 
Příklad použití:



new str[] = "FF", hex;

hex = HexToDec(str); //hex bude mít hodnotu 255

.

B) BinToDec



forward BinToDec(strbin[]);

Účel:
Převést číslo dvojkové soustavy ve formě řetězce strbin na číslo desítkové soustavy.

Návratová hodnota:
Převedené číslo.
-1 v případě, že je řetězec strbin prázdný nebo obsahuje jiné znaky než 0 a 1 – ošetřte!
 
Příklad použití:



new str[] = "11111111", bin;

bin = BinToDec(str); //bin bude mít hodnotu 255

.

c) RandomEx



forward RandomEx(min, max, excepts[], size = sizeof excepts);

Účel a implementační detaily:
Vygenerovat náhodné kladné číslo v rozsahu od min do max.
Vygenerované číslo se nesmí shodovat s žádným číslem z pole excepts (velikost pole je uložena v parametru size).

Návratová hodnota:
Vygenerované náhodné kladné číslo.
-1 v případě neúspěchu (min je větší než max, číslo není kladné apod. – ošetřte!).
 
Příklad použití:



new arr[] = {1, 2, 3}, randNum;

randNum = RandomEx(1, 4, arr); //randNum bude mít hodnotu 4, protože čísla 1, 2, 3 jsou v poli arr
randNum = RandomEx(1, 10, arr); //randNum bude mít hodnotu z rozsahu od 4 do 10 (1, 2, 3 opět nevyhovují)

.

d) FileRead


forward FileRead(fpath[], arr[6]);

Účel a implementační detaily:
Přečíst 3 údaje ze souboru s cestou fpath, převést je na číslo pomocí funkce StringToValue a uložit je do pole arr na indexy 0, 1 a 2.
Uložit 3 náhodně vygenerovaná čísla (funkce RandomEx) s rozsahem od 1 do 10 na indexy 3, 4 a 5. Tato čísla se nesmí shodovat s čísly na indexech 0, 1 a 2!

Návratová hodnota:
1 – funkce se provedla úspěšně;
0 – nastala chyba (soubor se neotevřel správně, cesta k souboru neexistuje apod. – ošetřte!).
 
Příklad použití:



new arr[6];

FileRead("neco.txt", arr);

.

e) GetMinMax


forward GetMinMax(arr[], &min, &max, size = sizeof arr);

Účel:
Zjistit minimální a maximální hodnotu z pole arr a indexy pole s minimální a maximální hodnotou uložit do parametrů min a max.
Velikost pole arr je uložena v parametru size.

Návratová hodnota:
Žádná.
 
Příklad použití:


new arr[6] = {4, 5, 2, 6, 8, 7}, minVal, maxVal;

GetMinMax(arr, minVal, maxVal); //minVal bude mít hodnotu 2 a maxVal hodnotu 4

.

Soubor k funkci FileRead je k dispozici v přílohách (jak pro Windows, tak pro Linux – rozdílné odřádkování).

file_windows.txt

file_linux.txt

Link to comment
Share on other sites

  • 2 weeks later...
  • Hlavní moderátor

První kolo ukončeno

1. kolo tímto skončilo. Nyní dojde k vyhodnocení prací těch, kteří se zúčastnili. Čekjte na vyhodnocení!

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...