Evidence zaměstnanců ve Small Basicu

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

PetrJan
nováček
Příspěvky: 14
Registrován: květen 12
Pohlaví: Nespecifikováno
Stav:
Offline

Evidence zaměstnanců ve Small Basicu

Příspěvekod PetrJan » 28 kvě 2012 16:27

Mám vytvořit program na evidenci zaměstnanců. Má obsahovat úvodní menu s následujícími položkami - Nový zaměstnanec, Smazat zaměstnance, Vypiš všechny zaměstnance (stačí jména).
Vím, jak vytvořit menu a teoreticky jak přidat zaměstnance... Nedokážu ho ale přidat do pole, tzn. nedokážu je poté všechny vypsat. A smazání konkrétního zaměstnance? Opravdu netuším...
Pochobyl bych, kdyby se to dělalo v SQL, ale ve Small Basicu?

Díky za radu...

Reklama
Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Evidence zaměstnanců ve Small Basicu

Příspěvekod faraon » 28 kvě 2012 16:50

Zrovna pole není na takovéhle věci ideální, ale v BASICu se s nimi velmi snadno pracuje. Akorát si předem musíš stanovit nějaký maximální počet, který pak už nelze překročit, dřív byl omezený hlavně velikostí operační paměti, která se pohybovala maximálně v desítkách kilobajtů ;-)

Musíš mít v nějaké proměnné uložený počet zaměstnanců, kteří se už v poli nacházejí, a vypíšeš je normálně jednoho po druhém smyčkou FOR. U toho výpisu je dobré buď pozastavovat ho po určitém počtu řádků, a pokračovat po stisku klávesy, nebo mít maximální počet položek takový, aby se vždy vešly všechny na obrazovku...

Přidání položky je úplně jednoduché, přičteš k počtu jedničku a na místo které počet ukazuje vložíš nové jméno.

Odstranění položky je trochu zdlouhavější, použiješ zase cyklus FOR, prostě na její místo okopíruješ jméno z vyšší buňky, do té vyšší zase z té nad ní, a tak pořád dokola až do konce pole, a na závěr od počtu odečteš jedničku. Nebo jí odečteš předem, záleží jak postavíš ten cyklus.

Jako bonus můžeš přidat řazení podle abecedy, data narození, platu a podobně, záleží na fantazii. Ale začni tím nejjednodušším - jménem a příjmením, další údaje se dají doprogramovat dodatečně.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

PetrJan
nováček
Příspěvky: 14
Registrován: květen 12
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Evidence zaměstnanců ve Small Basicu

Příspěvekod PetrJan » 28 kvě 2012 17:19

Díky.
Musíš mít v nějaké proměnné uložený počet zaměstnanců, kteří se už v poli nacházejí
to udělám jak? udělám proměnnou, ale jak zjistím počet položek v poli?
Odstranění položky je trochu zdlouhavější, použiješ zase cyklus FOR, prostě na její místo okopíruješ jméno z vyšší buňky, do té vyšší zase z té nad ní, a tak pořád dokola až do konce pole, a na závěr od počtu odečteš jedničku
Musím tedy mazat podle pozice nebo to jde udělat i podle jména?

Zatím my opravdu stačí jméno...

Díky

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Evidence zaměstnanců ve Small Basicu

Příspěvekod faraon » 28 kvě 2012 17:35

Počet položek nezjišťuješ, protože na začátku máš nulu, a při každém přidání přičítáš jedničku :idea:

Mazat podle jména by šlo také, musel bys ho nejdřív v poli vyhledat (hledání můžeš přidat jako další funkci), ale nejjednodušší bude prostě zadat pořadové číslo (vypisuj ho při výpisu před jménem), protože to můžeš rovnou použít jako počáteční hodnotu pro rozběhnutí mazacího FORu.
Bylo by dobré ohlídat jestli se nemá mazat položka která neexistuje, a buď ohlásit chybu, nebo úspěšné splnění úkolu. Kdysi dávno o tom vyšla skvělá knížka "Dialog s počítačem".

Ještě k tomu výpisu, při pozastavení můžeš mezerníkem nebo Enterem pokračovat, a Escape další vypisování přeruší, abys třeba viděl pořadové číslo zaměstnance, kterého chceš smazat.
A přišlo by vhod ukládání do souboru, abys nemusel pokaždé zadávat všechno znovu.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

PetrJan
nováček
Příspěvky: 14
Registrován: květen 12
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Evidence zaměstnanců ve Small Basicu

Příspěvekod PetrJan » 28 kvě 2012 17:50

Jo, už mi to pak taky došlo...

Řekl bych, že to mám tak nějak hotové... Ale ve výpisu se mi nezobrazují jména zaměstnanců. Mohl byste mi poradit?

Kód: Vybrat vše

počet = 0
i = 1
Začátek:
TextWindow.WriteLine("1 - Nový zaměstanenec")
TextWindow.WriteLine("2 - Smazat zaměstnance")
TextWindow.WriteLine("3 - Výpis zaměstnanců")
TextWindow.WriteLine("")
TextWindow.WriteLine("Napiš číslo operace, kterou chceš provést:")
index = TextWindow.ReadNumber()

If index = 1 Then
  Goto Nový
ElseIf index = 2 Then
  Goto Smazat
ElseIf index = 3 Then
  Goto Výpis
Else
  TextWindow.WriteLine("ŠPATNĚ, ZADEJ SPRÁVNÉ ČÍSLO")
EndIf

Nový:
TextWindow.WriteLine("Zadej jméno zaměstnance:")
zaměstnanec[i] = TextWindow.Read()
TextWindow.WriteLine("Zaměstnanec " + zaměstnanec[i] + " byl přidán do evidence")
zaměstnanec[i] = zaměstnanec[i+1]
počet = počet + 1
TextWindow.WriteLine("")
  Goto Začátek

Smazat:
If počet < 1 Then
  TextWindow.WriteLine("V evidenci nejsou žádní zaměstnanci")
  TextWindow.WriteLine("")
  Else
TextWindow.WriteLine("Zadej pozici zaměstnance, kterého cheš smazat:")
pozice = TextWindow.ReadNumber()
If pozice > počet Then
  TextWindow.WriteLine("Na této pozici není žádný zaměstnanec")
  Goto Smazat
Else
For pozice = pozice To počet
  zaměstnanec[i] = zaměstnanec[i-1] 
EndFor
počet = počet - 1
EndIf
EndIf
  Goto Začátek

 
Výpis:
If počet < 1 Then
  TextWindow.WriteLine("V evidenci nejsou žádní zaměstnanci")
  TextWindow.WriteLine("")
  Else
TextWindow.WriteLine("V evidenci jsou tito zaměstnanci:")
For i = 1 To počet
    TextWindow.WriteLine(i + ". " + zaměstnanec[i])
  EndFor
  TextWindow.WriteLine("")
EndIf
  Goto Začátek


Díky

Uživatelský avatar
domitea
Tvůrce článků
Level 4.5
Level 4.5
Příspěvky: 1971
Registrován: červen 09
Bydliště: Královehradecký kraj
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Evidence zaměstnanců ve Small Basicu

Příspěvekod domitea » 28 kvě 2012 18:28

PetrJan píše:Pochobyl bych, kdyby se to dělalo v SQL, ale ve Small Basicu?


Dovolím menší rejp.

Proč zneužívat databázi na jednu tabulku, když stačí CSV :wink:

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Evidence zaměstnanců ve Small Basicu

Příspěvekod faraon » 28 kvě 2012 18:35

Tak hlavně ukonči tu volbu z Menu skokem na Začátek, takhle vjedeš při zadání jakéhokoliv neplatného čísla rovnou do zadání nového zaměstnance ;-)

Proměnná i je tam úplně zbytečná, tu použiješ akorát v cyklech, ve všech ostatních případech vystačíš s tou počet. Mimochodem, většina programovacích jazyků nedovoluje v názvech proměnných nebo funkcí používat diakritiku.

Chyba při zadání je tenhle řádek:
zaměstnanec[i] = zaměstnanec[i+1]
Tím si zadané jméno ihned přepíšeš vyšší položkou, která ještě neexistuje, takže na jeho místo zkopíruješ prázdný řetězec a ten se pak pokoušíš vypisovat... On se ti samozřejmě zobrazí, ale nic v něm není :evil:

Není ve SmallBasicu příkaz GOSUB? Ono GOTO se má používat minimálně, jen v nejnutnějších případech*, a pokud možno vůbec, protože nezapadá do zásad strukturovaného programování! Takže GOSUB Nový

Kód: Vybrat vše

Nový: 'Přidání nového zaměstnance
      TextWindow.WriteLine("Zadej jméno zaměstnance:")
      počet=počet+1
      zaměstnanec[počet] = TextWindow.Read()
      IF LEN(zaměstnanec[počet])>0 then
         TextWindow.WriteLine("Zaměstnanec " + zaměstnanec[i] + " byl přidán do evidence")
      ELSE
         TextWindow.WriteLine("CHYBA: Nebylo zadáno jméno!")
         počet=počet-1
      END IF
Return

Funkce LEN v BASICu zjišťovala délku řetězce, zkus pro ní najít ekvivalent.

Není v SB nutné dimenzovat velikost pole? Ve starších dialektech bylo možné použít automatickou velikost, ale ta byla vždy , když jsi potřeboval jiný počet, musel jsi ho deklarovat na začátku programu:
DIM zamestnanec(1000)

V mazání musíš kopírovat vyšší položku, ne předchozí, takže
zaměstnanec[i] = zaměstnanec[i+1]



* To zamená že se na GOTO máš vykašlat, dokud nebudeš psát programy dlouhé aspoň deset tisíc řádků :lol:
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

PetrJan
nováček
Příspěvky: 14
Registrován: květen 12
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Evidence zaměstnanců ve Small Basicu

Příspěvekod PetrJan » 28 kvě 2012 20:34

Díky, toho jsem si nevšiml...
Funguje mi to, kromě mazání. Nestane se vůbec nic.
Ještě když mám u výpisu:

Kód: Vybrat vše

FOR Počet = 1 TO Počet
tak načítá stále dále čísla.
Tak jsem zavedl porměnnou max:

Kód: Vybrat vše

FOR Počet = 1 TO max
to se pole zkrátí, tím pádem to odmaže poslední pozici
A když tam mám natvrdo počet položek:

Kód: Vybrat vše

FOR Počet = 1 TO 15
nestane se nic a pole se zobrazí stále stejně, i když jsem něco vymazal...

Vím, že bych GOTO používat neměl, ale takto my to zatím vyhovuje...
Nikde jsem nenašel, jak se zadá pevná velikost pole ve small basicu :(

Kód: Vybrat vše

počet = 0
max = 0

Začátek:
TextWindow.WriteLine("1 - Nový zaměstanenec")
TextWindow.WriteLine("2 - Smazat zaměstnance")
TextWindow.WriteLine("3 - Výpis zaměstnanců")
TextWindow.WriteLine("")
TextWindow.WriteLine("Napiš číslo operace, kterou chceš provést:")
operace = TextWindow.ReadNumber()

If operace = 1 Then
  Goto Nový
ElseIf operace = 2 Then
  Goto Smazat
ElseIf operace = 3 Then
  Goto Výpis
Else
  TextWindow.WriteLine("ŠPATNĚ, ZADEJ SPRÁVNÉ ČÍSLO")
  Goto Začátek
EndIf

Nový:
  TextWindow.WriteLine("Zadej jméno zaměstnance:")
  počet = počet + 1
  max = max + 1
  zaměstnanec[počet] = TextWindow.Read()
  TextWindow.WriteLine("Zaměstnanec " + zaměstnanec[počet] + " byl přidán do evidence")
  TextWindow.WriteLine("")
 Goto Začátek

Smazat:
If počet < 1 Then
  TextWindow.WriteLine("V evidenci nejsou žádní zaměstnanci")
  TextWindow.WriteLine("")
 Else
    TextWindow.WriteLine("Zadej pozici zaměstnance, kterého cheš smazat:")
  pozice = TextWindow.ReadNumber()
    If pozice > počet Then
      TextWindow.WriteLine("Na této pozici není žádný zaměstnanec")
     Goto Smazat
    Else
      For pozice = pozice To max
        zaměstnanec[počet] = zaměstnanec[počet+1] 
      EndFor
      max = max - 1
      počet = počet - 1
    EndIf
EndIf
 Goto Začátek

Výpis:
If počet < 1 Then
  TextWindow.WriteLine("V evidenci nejsou žádní zaměstnanci")
  TextWindow.WriteLine("")
  Else
TextWindow.WriteLine("V evidenci jsou tito zaměstnanci:")
For počet = 1 To 15
  TextWindow.WriteLine(počet + ". " + zaměstnanec[počet])
  EndFor
  TextWindow.WriteLine("")
EndIf
  Goto Začátek


Díky moc

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Evidence zaměstnanců ve Small Basicu

Příspěvekod faraon » 28 kvě 2012 22:11

Tak zrovna v tom výpisu je potřeba ta proměnná i:

Kód: Vybrat vše

Výpis: 'zobrazí databázi zaměstnanců
       If pocet>Then
          For i = 1 To počet
              TextWindow.WriteLine(i + ". " + zaměstnanec[i])
          EndFor
       Else
          TextWindow.WriteLine("V evidenci nejsou žádní zaměstnanci")
       Endif


Jen taková historická zajímavost, ve FORTRANu (prvním programovacím jazyku z roku 1956) byly proměnné jejichž názvy začínaly písmeny I,J,K,L,M,N celočíselné, zatímco všechny ostatní byly reálné. Sloužilo to kromě jiného i jako mnemotechnická pomůcka, index pole nebo smyčky byl prostě I, druhá vnořená smyčka měla jako index následující písmeno J, třetí K... To se od té doby používá tradičně dodnes, protože není důvod dělat to jinak. I je prostě Index, ukazatel na určitou položku v pořadí.

Takže vystačíš se dvěma proměnnými, hlavní proměnou počet ve které máš aktuální stav, a pomocnou proměnnou i, která slouží pro výpis.

To mazání by mělo jít takhle nějak:

Kód: Vybrat vše

počet=počet-1
For i=pozice To počet
    zaměstnanec[i]=zaměstnanec[i+1]
Endfor


Tady jsou potřeba proměnné tři, hlavní počet, a pomocné pozice a i.

To dimenzování pole jsem v návodech co mám také nenašel, třeba to už není potřeba, můžeš to odzkoušet, jestli (a kdy) ti to spadne:

Kód: Vybrat vše

For i=1 To 1000000
    pole[i]=i
    TextWindow.WriteLine(i)
Endfor


Zbytek už nemám dneska sílu luštit, tak jen pro inspiraci něco podobného co jsem kdysi dělal:

Kód: Vybrat vše

10 PRINT "*** Vysledkova listina ***"
20 INPUT "pocet hracu: ", h
30 DIM jmeno$(h), skore(h)
40 FOR a = 1 TO h
50   PRINT a; : INPUT "- jmeno, skore: ", jmeno$(a), skore(a)
60 NEXT a
70 INPUT "1 - podle jmena 2 - podle skore 3 - tisk 4 - konec "; a
80 ON a GOTO 100, 200, 300, 400
90 GOTO 70

100 FOR a = 2 TO h: b = a
110   IF jmeno$(b - 1) <= jmeno$(b) THEN GOTO 150
120   w$ = jmeno$(b):jmeno$(b) = jmeno$(b - 1):jmeno$(b - 1) = w$
130   w = skore(b): skore(b) = skore(b - 1): skore(b - 1) = w
140   IF b > 2 THEN b = b - 1: GOTO 110
150 NEXT a: GOTO 500

200 FOR a = 2 TO h: b = a
210   IF skore(b - 1) >= skore(b) THEN GOTO 250
220   w$ = jmeno$(b):jmeno$(b) = jmeno$(b - 1):jmeno$(b - 1) = w$
230   w = skore(b): skore(b) = skore(b - 1): skore(b - 1) = w
240   IF b > 2 THEN b = b - 1: GOTO 210
250 NEXT a: GOTO 500

300 LPRINT TAB(20); "Vysledkova listina:": LPRINT
310 FOR a = 1 TO h
320   LPRINT jmeno$(a); TAB(60); skore(a)
330 NEXT a: LPRINT : GOTO 70

400 END

500 FOR a = 1 TO h
510   PRINT jmeno$(a); TAB(60); skore(a)
520 NEXT a: GOTO 70
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

PetrJan
nováček
Příspěvky: 14
Registrován: květen 12
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Evidence zaměstnanců ve Small Basicu

Příspěvekod PetrJan » 29 kvě 2012 16:05

Díky moc za pomoc, vyřešeno...

Kód: Vybrat vše

počet = 0

Začátek:
TextWindow.WriteLine("1 - Nový zaměstanenec")
TextWindow.WriteLine("2 - Smazat zaměstnance")
TextWindow.WriteLine("3 - Výpis zaměstnanců")
TextWindow.WriteLine("")
TextWindow.WriteLine("Napiš číslo operace, kterou chceš provést:")
operace = TextWindow.ReadNumber()

If operace = 1 Then
  Goto Nový
ElseIf operace = 2 Then
  Goto Smazat
ElseIf operace = 3 Then
  Goto Výpis
Else
  TextWindow.WriteLine("ŠPATNĚ, ZADEJ SPRÁVNÉ ČÍSLO")
  Goto Začátek
EndIf

Nový:
  TextWindow.WriteLine("Zadej jméno zaměstnance:")
  počet = počet + 1
  zaměstnanec[počet] = TextWindow.Read()
  TextWindow.WriteLine("Zaměstnanec " + zaměstnanec[počet] + " byl přidán do evidence")
  TextWindow.WriteLine("")
 Goto Začátek

Smazat:
If počet < 1 Then
  TextWindow.WriteLine("V evidenci nejsou žádní zaměstnanci")
  TextWindow.WriteLine("")
 Else
    TextWindow.WriteLine("Zadej pozici zaměstnance, kterého cheš smazat:")
  pozice = TextWindow.ReadNumber()
    If pozice > počet Then
      TextWindow.WriteLine("Na této pozici není žádný zaměstnanec")
     Goto Smazat
    Else
      For i = pozice To počet
        zaměstnanec[i] = zaměstnanec[i+1] 
      EndFor
      počet = počet - 1
    EndIf
EndIf
 Goto Začátek

Výpis:
If počet < 1 Then
  TextWindow.WriteLine("V evidenci nejsou žádní zaměstnanci")
  TextWindow.WriteLine("")
  Else
TextWindow.WriteLine("V evidenci jsou tito zaměstnanci:")
For i = 1 To počet
  TextWindow.WriteLine(i + ". " + zaměstnanec[i])
  EndFor
  TextWindow.WriteLine("")
EndIf
  Goto Začátek

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Evidence zaměstnanců ve Small Basicu

Příspěvekod faraon » 30 kvě 2012 17:15

Ještě mě napadlo pár drobností, před mazáním by bylo dobré se pro jistotu zeptat na potvrzení. Ona je sice při zadání čísla mnohem menší pravděpodobnost překlepu než při zapisování celého jména ručně, ale člověk je tvor chybující, a když občas něco podělá, rád to svede na někoho jiného, v tomhle případě na blbý počítač a neschopného programátora. Takže nějak takhle (a až teď jsem si všimnul že ti tam chybí písmeno c):


Zadej pozici zaměstnance, kterého cheš smazat:
14
Opravdu chceš vymazat zaměstnance: Pepíček (A/N)?
a
Položka vymazána.


A zadávání čísla nebo potvrzení na dalším řádku vypadá divně, není ve SB kromě TextWindow.WriteLine() také TextWindow.Write() podobně jako v Pascalu? Pak by to bylo takové:


Zadej pozici zaměstnance, kterého cheš smazat: 14
Opravdu chceš vymazat zaměstnance: Pepíček (A/N)? a
Položka vymazána.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)


Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 5 hostů