Diskuze: Evidenční systém v C#
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 22 zpráv z 22.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
To je jasný úkol pro SQL. Měl by sis přečíst něco odtud (Databáze ADO.NET). Dál už budeš muset sám a jelikož studuješ IT školu, tak ti ve tvém vlastním zájmu doporučuji se naučit programovat. Myslím, že pro tvou budoucnost (např. na vysoké škole) to bude žádoucí.
V zadání není nic o perzistenci, takže ta databáze není tak nutná. Mnohem jednodušší už má si udělat nějakou in-memory "databázi" a neučit se kvůli tomu SQL.
K autorovi: neřekl jsi jak moc jsi zdatný, takže se blbě radí.
Nějak takto si představuji základní strukturu programu, snad Ti to pomůže začít:
SQL ještě navíc ani neděláme, hehe.
Zdatný nejsem vůbec. Například, jakmile mi příklad ukáže učitel na
projektoru, pochopím to. Pochopím, co daná funkce dělá. Jenomže to
nedokážu sestavit tak, aby z toho byl program. Jako kdyby mi v tom bránila 90
% část mozku.
A zkoušíš si doma dělat nějaké menší prográmky? Jen opisováním / chápáním z cicích příkladů se to opravdu naučit nelze.
Vždy se snažím probranou látku doma zopakovat a pochopit ji. Takže ano, zkouším...ale víme jak, je to bída z mé strany.
No zkus dát nějaký nástřel jak bys to řešil (klidně v kódu) a my tě nějak usměrníme
Já právě skončím tady. Dál si nevím prostě rady
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kniha
{
class Knihovna
{
static void Main(string[] args)
{
public string Zamestnanci { get; set }
public int Vek { get; set }
public double Jmeno { get; set }
}
}
}
namespace ProjektEvidence
{
class Program
{
static void Main(string[] args)
{
}
}
class Kniha
{
public string titul;
public string autor;
public string vydavatel;
}
class Zamestnanec
{
public string jmeno;
public string prijmeni;
}
}
ps, evidovat věk číslem je nesmysl! Eviduj datum narození (věk si pak můžeš spočítat s aktuálního data).
K tomudle vůbec SQL nepotřebuješ. Pochybuju, že tam budeš ukládat statisíce záznamů a mezi nimi provádět fulltext apod.
Vytvoř si třídy dle toho, co napsali ti nahoře. Pak si projdi tutoriály jak číst vstup z Console. Console.ReadLine apod. V nekonečném cyklu while(true) budeš zobrazovat menu aplikace, které bude díky Console.ReadLine číst volbu, kterou uživatel zadá. Do cyklu si dej ifíky nebo switch pro jednotlivé volby (1. - 10.).
V programu v Main() si udělej nějaké pole, třeba:
var arrZamestnanec = new List<Zamestnanec>();
a po zadání volby 1. uděláš
Console.Write("Zadejte jméno: ");
Pak si přečteš vstup a uložíš jej do nějaké proměnné a naplníš objekt
arrZamestnanec.Add(new Zamestnanec(){ Jmeno = "xxxx", ....});
Musíš se naučit práci s polem, třídou, cykly a půjde to.
Tyto SPŠ pamatuju, jak přišla nějaká výuka programování ASP.NET a během 15ti minut i u nás zaregistrovalo ASP.NET Freehosting (https://www.aspify.com) asi 30 lidí .
Začal bych tím, že si nabouchám datové typy Kniha a Zamestnanec. Ty budou obsahovat příslušné vlastnosti a konstruktory. Také přetěžují ToString(), aby se při výpisu do konzole ukázaly lidsky. Např.:
class Zamestnanec
{
public enum epozice { Knihovnik, Reditel, Urednik, Vedouci, ITSpravce}
public string Jmeno { get; private set; }
public string Prijmeni { get; private set; }
public decimal Plat { get; private set; }
public epozice Pozice { get; private set; }
public DateTime DatumNarozeni {get; private set; }
public int Vek
{
get
{
int vek = DateTime.Today.Year - DatumNarozeni.Year;
if (DatumNarozeni.AddYears(vek) < DateTime.Today) vek--;
}
}
public Zamestnanec(string jmeno, string prijmeni, decimal plat, epozice pozice, DateTime datum)
{
Jmeno = jmeno;
Prijmeni = prijmeni;
Plat = plat;
Pozice = pozice;
DatumNarozeni = datum;
}
public override string ToString() { return Jmeno + Prijmeni; }
}
class Kniha
{
public string Jmeno { get; private set; }
public string Autor { get; private set; }
public int RokVydani { get; private set; }
public Kniha(string jmeno, string autor, int rok)
{
Jmeno = jmeno;
Autor = autor;
RokVydani = rok;
}
public override string ToString() { return Autor + ": " + Jmeno; }
}
Dále ve třídách naimplementuješ editační metody, které vždy upraví danou vlastnost, to budeš používat k položkám editace knihy, editace změstnance.
Další třída, kterou budeš potřebovat, je Databaze. Ta bude obsahovat dva Listy (List<Kniha> a List<Zamestnanec>) a metody na přidání a odebrání položek obou Listů (implementace List.Add() a List.RemoveAt()). Dále ještě metody, které vrátí položku z Listu dle indexu, to aby byl přístup k položkám na editaci. Podle zdejšího tutoriálu na soubory si ještě uděláš ukládání a čtení do souborů (jak je libo, asi buď klasický CSV nebo do XMLček).
Poslední třída bude Komunikator, která bude pracovat s konzolí, komunikovat s uživatelem, zobrazovat meníčka, atd.
Při spuštění v Mainu inicializuješ Databázi a Komunikátor, kterému databázi předáš, odtud on bude zobrazovat data. Na datábazi dále zavoláš načtení dat ze souboru. Pak už jen komunikátor pracuje ve smyčce a zobrazuje uživateli co se po něm chce
Ahoj, tak jsem si to zkusil sám, jen tak cvičně
Musím říct, že je to moc pěkná úloha
Program zde (ne neboj, není to virus):
https://www.dropbox.com/…Knihovny.zip?dl=0
Chceš-li zdroják, napiš, rád zašlu
Ahoj všichni, mockrát vám děkuju za odpovědi a rady. Myslím si, že už protokol mám skoro hotový. Co na to říkáte?
Proč sakra implementuješ zvlášť string Zamestnanec.VypisCeleJmeno()? Vždyť objektově správnější a jednodušší způsob by byl jednoduše override string Zamestnanec.ToString()!
A pracovní pozici by možná bylo lepší skladovat jako enum, tak jsem to řešil i já
S tou pracovní pozicí jako enum bych si nebyl jistý. Co když Bude potřeba přidat novou pracovní pozici, to má člověk upravit zdrojový kód a znovu si to zkompilovat?
A teď koukám že máš jednotlivé proměnné zaměstnance (jméno atd.) jen jako private fieldy, proč nemáš normálně vlastnost která je public get a private set? V zadání jste měli "nejlepší možný objektový návrh"
Myslím, že je enum velice vhodný. Možná by nejsprávnější bylo mít externí texťák s možnými pracovními pozicemi, ze kterých by program enum za běhu vytvořil
Enum by se imo měl používat na výčty, které se nikdy nemění (například dny v týdnu apod.) a jsou v něčem velmi podobné statickým konstantám. Asi by přes reflexi nějak šlo přidávat a ubírat typy pracovních pozic, ale byl by v tom zbytečně zmatek. Na věci, které může zadat uživatel (například i formou textového souboru) se podle mě mnohem lépe hodí pole nebo nějaká kolekce.
Dobře, tak možná ne přímo enum, ale rozhodně nějaký List s možnými pracovními pozicemi ve formě stringu, ne aby se bral přímo uživatelem zadaný string. Díky enumu či listu (něco s charakterem kolekce) je možné pozici ukládat jako číslo, předejít tak upper-lower case duplicitám, překlepům apod. a mít možnost porovnávat pracovníky na stejné pozici snadno
Enum je jen syntaktický cukr pro konstantu.
třeba:
enum Align
{
Left, Right
}
se přeloží na:
class Align
{
const int Left = 0;
const int Right = 1;
}
Zobrazeno 22 zpráv z 22.