Na googlu je toho malo?? Si asi delas srandu ne. Namatkou>
http://www.google.cz/search?hl=cs&client=firefox-a&rls=com.ubuntu%3Aen-US%3Aofficial&hs=JuK&q=rand+C&btnG=Hledat&lr=
http://www.google.cz/search?q=srand&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:official&client=firefox-a
Jinak tvoje vyjadrovani je strasny.
Příspěvky odeslané z IP adresy 88.103.71.–
Ani se nedivím, že to nechápeš. MS v C++ je nehorázný balast, z týhle knížky se toho moc nenaučíš. Doporučuju ji co nejrychleji zahodit a učit se z kvalitnějších materiálů.
Pokud je v tý knížce napsáno přesně to, co si uvedl, tak to je imho dost matoucí (svědčí to o úrovni té knihy)- pochopit se to z toho ale dá.
...jmeno pole typu double...
double pole[];/*jakožto pole s prvkama typu double*/
2Japo: Nj máš samozřejmě pravdu, to co jsem tam měl já je blbost.
Tabulka jde nyní vytvořit, ale opět jen jednou, když to zkusím znova, tak místo přepsání dostanu výsledek: Can't create table '.\knihy\knihy.frm' (errno: 121). Co jsem zjistil, tak to je kvůli tomu, že jakoby chci vytvářet další tabulku se stejným jménem...ale žádnou tabulku v té složce nemám, tak nevím, jestli se názvy ukládají ještě někam(?).
Dobré odpoledne.
Mám tento kód:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using MySql.Data;
using MySql.Data.MySqlClient;
namespace school
{
public partial class _Default : System.Web.UI.Page
{
/*string pro navazani spojeni*/
private static string spojeni = @"Database=test;DataSource=127.0.0.1;UserId=root;Password=W1nd";
/*string pro vytvoreni tabulky*/
private static string vytvoreni_tabulky = @"CREATE TABLE Kl (
Id, INT, NOT NULL, PRIMARY KEY, AUTO_INCREMENT;
Nazev, Varchar(40), NOT NULL;
Autor, Varchar(40), NOT NULL);";
/*string pro jednotlive prikazy*/
private static string prikaz = "";
/*třída *Connection pro navázání spojení*/
MySqlConnection connect = new MySqlConnection(spojeni);
/*třída Command pro vykonávání jednotlivých příkazů*/
MySqlCommand cmd;
protected void Page_Load(object sender, EventArgs e)
{
}
/*vytvoreni "hlavicky" tabulky*/
protected void Button1_Click(object sender, EventArgs e)
{
Label5.Text = "";
try
{
connect.Open();//navážu spojení
/*konstruktoru třídy MySqlCommand předám string s požadovaným příkazem +
*instanci třídy MySqlConnection*/
cmd = new MySqlCommand(vytvoreni_tabulky, connect);
cmd.ExecuteNonQuery();//vykonání příkazu
}
catch (Exception ex)//vyjímka typu Exception
{
Label5.Text = ex.Message;//zobrazím chybový stav daný číslem v errno
}
finally//závěrečný blok == provede se vždy
{
/*ukončím aktivní spojení - fci Close(); lze použít i v případě, že spojení nenavážu,
*k chybě nedojde*/
connect.Close();
Label5.Text = "Příkaz byl úspěšně proveden";//informuju uživatele o správném vykování příkazu
}
}
/*vlozeni zaznamu do DB*/
protected void Button2_Click(object sender, EventArgs e)
{
try
{
/*sestavení SQL příkazu*/
prikaz = @"INSERT INTO Kl (`Nazev`, `Autor`) VALUES ('ppp', 'saman')";
connect.Open();//navázání spojení
cmd = new MySqlCommand(prikaz, connect);
cmd.ExecuteNonQuery();//vykonání příkazu
}
catch (Exception ex)
{
Label5.Text = ex.Message;
}
finally
{
connect.Close();
Label5.Text = "Příkaz byl úspěšně proveden";
}
}
/*čtení z DB*/
protected void Button3_Click(object sender, EventArgs e)
{
prikaz = @"SELECT Autor, Nazev FROM Kl";
try
{
cmd = new MySqlCommand(prikaz, connect);
connect.Open();
MySqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
Label6.Text += reader[0].ToString() + ", " + reader[1].ToString() + ", " + reader[2].ToString();
}
}
catch (Exception ex)
{
Label5.Text = ex.Message;
}
finally
{
connect.Close();
Label5.Text = "Příkaz byl úspěšně proveden";
}
}
}
}
A mám s ním několik problémů. 1)Ve složce .\mysql\data\test se sice vytvoří požadovaná databáze Kl, ale jen jednou, pokud znova kliknu na button 1, tak se tato již vytvořená databáze nepřepíše - nyslel jsem, že k tomu aby se nepřepsala, bych musel mít místo CREATE TABLE Kl toto CREATE TABLE IF NOT EXISTS Kl - nebo to funguje jinak?
2)Nefunguje zápis do tabulky. IMHO bude chyba někde v syntaxi, ale dle toho, co je zde > http://dev.mysql.com/doc/refman/5.0/en/insert.html to mám dobře. Proč to tedy nefunguje?
3)Nejsem si jistý tím výpisem (čtením z DB), nemůžu zjistit, jestli funguje, ptž když do table nic nezapíšu, tak logicky nemůžu i nic číst.
Žádné vyjímky nenastávají, žádné chybové hlášky. Prosím o pomoc, už se s tím trápím celé odpoledne, vyzkoušel jsem všelijaké zápisy, ale prostě nic z toho mi nefunguje. Předem děkuji za pomoc.
Dobrý den.
Zkoušel jsem se pomocí C# připojit k MySql, ale nějak mi to pořád háže chybu. Něco jsem hledal zde > http://forums.mysql.com/read.php?38,13350,13350 ale to můj problém neřeší.
Takže používám tento kód:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data;
using MySql.Data.MySqlClient;
namespace databaze
{
class Program
{
static void Main(string[] args)
{
MySqlCommand cmd = new MySqlCommand();
MySqlConnection connect = new MySqlConnection("Database=test;DataSource=127.0.0.1;UserId=root@localhost;Password=W1nd");
connect.Open();
Console.ReadLine();
}
}
}
Zhruba takto mám nakonfigurovaný mysql server: http://img393.imageshack.us/my.php?image=mysqlmz1.gif
Můj problém spočívá v tom, že jakmile dojde kód na connect.Open();, tak VS C# 2008 vypíše chybu "Unable to connect to any of the specified MySQL hosts".
Kde je tedy problém?
Kdyžtak mě jen odkažte na vhodnou literaturu. Díky za odpovědi.
Obě tyto knihy za moc nestojí, přečemž MvC++ je imho trochu kvalitnější.
Na knize "Naučte se C++ za 21 dní" mě štve už ten název- rád bych viděl někoho, kdo se naučí programovat v C++ za 21 days. Za 21 dní se tak akorát seznámíš se syntaxí a projdeš úplný základy. Co se týče obsahu, tak se mi také moc nelíbí, přijde mi to tak nějak divně napsané.
Dobrý den.
Zde > http://netdeveloper.cz/c/c-pripojeni-do-mysql.html je článek, jak integrovat mysql do VS, ale jaké údaje mám poté vyplnit zde:
MySqlConnection connect = new MySqlConnection("Database=vašeDB;DataSource=host;UserId=uživatel;Password=heslo");
? Je potřeba ještě něco?
Aha, tak díky za info. šlo mi o to, jestli se skutečně odebere dříve alokovaný kus paměti.
Zde jsem neuvedl kontrolu přidělení paměti jen z důvodu šetření místem a také to s mým problémem nijak nesouvisí - jinak samozřejmě kontrolu používám.
Dobrý den. Myslím, že není třeba abych můj problém komentoval, tak vložím pouze kód:
int *p = (int*) malloc(4 * sizeof(int));
p[0] = 5;
p[1] = 12;
p[2] = 18;
p[3] = 20;
free((void*) p);
printf("%d, %d, %d, %d", p[0], p[1], p[2], p[3]);
A zeptám se: Proč mi program vypíše 0,12,18,20 když jsem odebral programu tuto paměť? Mám to chápat tak, že sice programu odeberu paměť, ale hodnoty stále v paměti jsou? Proč se tedy smaže 5? Nebo pouze dělám něco špatně?
Předem děkuju za odpovědi.
To Jinx : Ne nejsem (dokonce nejsem odborník ani na ČJ, nicméně tohle bych opravdu nikdy nenapsal), ale jelikož je slovenština podobná češtině, tak jsem dospěl k závěru, že takováto prasárna není přípustná. Krom toho jestli se nepletu, tak informatika je slovo cizího původu, což znamená, že po t se bude psát měkké i (tím netvrdím, že to je pravidlo pro všechna cizí slova, já opravdu nevím, ale u spousty (imho u většiny)cizích slov tomu tak je, např.: kino, etc).
Takže si o tom prosím něco zjisti...alespoň tolik, abys toho věděl více než ostatní v threadu a pak až piš. Nebudeš poté vypadat jako hlupák ;-)
Uploadnul jsem ti jakési maturitní otázky z jazyka C/C++ > http://paul27.ic.cz/maturita.doc nezaručuji správné odpovědi, můj výtvor to není. Je to jakýsi materiál jedné SPŠE, imho dost primitivní, takže bez problému.
<rejp>možná by bylo lepší učit se pravopis, viz nadpis :-D, to je hrůza</rejp>
v C je to spíš:
char pole[100];
scanf("%99s", pole);
přižemž scanf() přečte znaky a ukončí načítání mezerou, takže když máme např. řetězec: "Ahoj, jak se mas?", tak se do pole uloží jen "Ahoj,", což většinou nechceme. Takže pokud chceme číst celou řádku, použijeme třeba fci char *gets(char *str), která čte až do znaku '\n'.
Někdo, kdo se neumí ani zeptat nemůže psát HTML editor. To by ty programy vypadaly.
nebo takto:
#include <stdio.h>
#include <ctype.h>//pro pouziti fce isdigit() nutné!!
int main ()
{
char a[] = "12g";
for(int i = 0; i < sizeof(a) - 1; i++)
{
if(isdigit(a[i]) ? printf("cislice\n") : printf("neni cislice\n"));
}
while(getchar() != '\n');
getchar();
return 0;
}
k tomu, co ty chceš potřebuješ nějaký ten cyklus, znát proměnné a jak se s nimy pracuje, ale to spíš přeháním, k tomuhle potřebuješ fakt minimum, co se naučíš za 5 minut. Krom toho na internetu je spousta takovýchto zdrojáků, takže něco najít nebude problém.
Pokud chceš něco konkrétnějšího, tak se na to musíš nejprve zeptat, ty si sem v klidu napíšeš zadání DÚ a myslíš, že dostaneš hotovej program, to ani omylem - taky předveď, že máš snahu to pochopit, jinak ti nikdo radit nebude.
napsáno v C, je to jen pro ukázku, taky se trochu snaž:
do{
//tvůj kód
}while(getchar() == 'a');
goto existuje určitě v C (S C++ jsem zatím moc nedělal, je dobré znát základy C a až poté přejít na C++, ale to je o něčem jiném), nicméně tento příkaz se moc nedoporučuje používat, co mám odzkoušeno, tak jediné smysluplné využití je vyskočení z vnořeného cyklu, vždycky jindy můžeš v C/C++ použít něco jiného.
problém je, že já chci ošetřit i to, pokud je i i j menší než 0 (obě najednou).
když si napíšeš tabulku pro OR, tak se dostaneš ke krásnému výsledku (dívej se na tlustě zvýrazněný řádek):
0 0 0
0 1 1
1 0 1
1 1 1
takže původní podmínka (co si uvedl v prvním příspěvku) je skutečně zbytečná. stačí tedy:
if(i < 0 || j < 0 || i >14 || j > 14)
{}
žádná chyba, ani program nespadne za běhu - to bych sem nepsal.
problém je v tom, že se to nesetřídí + čísla co zadám se ani nevypíšou - no podívejte se sami na výstup: http://img231.imageshack.us/my.php?image=sortyf1.gif
ano, čísla generuju, ale je to stejné i kdybych je zadal ručně.
dobrý podvečer.
před nedávnem jsem narazil na tento algoritmus a tak jsem si říkal, že bych si ho napsal v C#, bohužel mi to moc nejde. myslím, že princip chápu, ovšem syntaxe je špatná (neumím to napsat), ptž program prostě nefunguje. přidávám sem radši hlavní části kódu, byl bych rád, kdyby jste mi poradili, kde dělám chybu (nemusíte psát kód, stačí slovně). díky.
třída, kde by se mělo vše setřídit:
class Trideni
{
int[] pole;
int[] pole2;
public Trideni(int delka)
{
pole = new int[delka];
pole2 = new int[delka];
}
public void NaplnPole(int hodnota, int index)//metoda pro naplnění pole
{
pole[index] = hodnota;
}
public int VypisPole(int index)//pro výpis hodnot jednotlivých indexů pole
{
return pole[index];
}
public void Setrid(int pocatek, int delka)//metoda pro setřídění
{
if (delka == 1)
{
return;
}
else if (delka == 2)//pokud jsou čísla ve "špatném" pořadí, prohodím
{
if (pole[pocatek] > pole[pocatek + 1])
{
int help = pole[pocatek];
pole[pocatek] = pole[pocatek + 1];
pole[pocatek + 1] = help;
}
}
else//pokud délka pole > 2, tak rozdělím na 1/2 a znova volám tuto metodu
{
int pocatek1 = pocatek;
int delka1 = delka / 2;
int pocatek2 = pocatek1 + delka1;
int delka2 = delka - delka1;
Setrid(pocatek1, delka1);
Setrid(pocatek2, delka2);
Spoj(pocatek1, delka1, pocatek2, delka2);
}
}
public void Spoj(int pocatek1, int delka1, int pocatek2, int delka2)//spojuji dva již setříděné úseky
{
int k = pocatek1;
int l = pocatek2;
int vyber = 0;
while (k < delka1 || l < delka2)
{
if (k >= delka1)
{
vyber = 2;
}
else if (l >= delka2)
{
vyber = 1;
}
else
{
if (pole[k] < pole[l])
{
vyber = 1;
}
else
{
vyber = 2;
}
}
if (vyber == 1)
{
pole2[k + l] = pole[k];
k++;
}
else
{
pole2[k + l] = pole[l];
l++;
}
for (int i = 0; i < pole2.Length; i++)
{
pole[i] = pole2[i];
}
}
}
}
metoda Main:
Console.Write("Zadej delku pole: ");
int delka = Convert.ToInt32(Console.ReadLine());
Trideni t = new Trideni(delka);
Random rnd = new Random();
for (int i = 0; i < delka; i++)
{
t.NaplnPole(rnd.Next(0, 101), i);
}
t.Setrid(0, delka);
for (int i = 0; i < delka; i++)
{
Console.Write(t.VypisPole(i) + ", ");
}
hodí to false, když uživatel nezadá pouze čísla.
moc jsem tě nepochopil...máš načtený řádek z původního souboru (riadok), tak proč pak toto?
StreamReader nacitany_subor = new StreamReader(input_file, Encoding.UTF8);
viděl bych to takhle:
StreamWriter vystupni_soubor = new StreamWriter(jmeno_vystupniho_souboru, kodovani);
a apk už jen:
vystupni_soubor.WriteLine(riadok);
Zkousel jsem vistu (mel jsem ji predinstalovanou na laptopu kdyz jsem ho kupoval a takovou chybu uz vickrat neudelam... aplikace se spoustely opravdu dlouho a i zapinalo se to docela pomalu (jediny clovek komu bezi visty rychle je Hulan a jeho PC z nassa a Chuck Norris).
+ podobné příspěvky...
A nebude to spíš neschopností si přečíst dva články o Windows a podle nich nastavit různé věci == nechat běžet jen to, co chci aby běželo.
Jinak je dle mého názoru Linux/Unix dobrý akorát na servery.
hmm a to si chtěl dělat boot sektor? doporučoval bych pro začítek prostudovat lekce k C++ zde na programujte.
string prikaz;
cout << "Zadej příkaz: ";
cin >> prikaz;
if(prikaz == "ahoj")
{
cout << "\n" << "nazdar";
}
myslím, že ostatní už podle tohoto dáš dohromady.
To lolik : jedinej, kdo o tom ví hovno seš ty. pokud chceš pouze něco jako "příkazovou řádku" bez bootování (jestli jsem to dobře pochopil), tak to je práce na pár minut.
Ale budu hodný a napíšu ti, jak na to:
Udělej si jednoduchou konzolovou aplikaci, kde budeš čekat na vstup uživatele. A podle toho co napíše proveď nějaký příkaz - zadá exit a ukončí se aplikace, zadá ahoj a odpovíš nazdar a tak podobně....nevím, co všechno chceš, aby to umělo.
Ptej se na konkrétní věci, pak ti rádi poradíme. Ale rozkřikovat se tady, že to chceš už napsaný == hotový aaby ti to někdo napsal, to fakt sorry, ale nediv se našim reakcím.
zonda napsal:
dík fest za radi . JA viem že mám trochu medzeri .
A ešte mám jednu otázočko k tomu čítaniu :
Aké kľučové slovo by ste použili ak chcete aby prečítalo všetky subori v danom adresáte s koncovkov .txt ?
Napr na disku C mám 6 txt suborov .Aké kľučové slovo mám použiť aby mi vypísalo všetky texti z tých 6 txt suborov ?
Nejdřív bych zjistil, kolik .txt souborů je v daném adresáři a pak jejich obsah postupně vypisoval. IMOH na tom není nic těžkého a otázku s klíčovým slovem jsem moc nepochopil.
jistěže je.
To Chrasty : Hele sorry máš pravdu, funguje to...špatně jsem se podíval. :smile19:
Když už zase píšu, tak šlo by nějak udělat, aby to moje okno bylo pořád natrchu? Myslím jako pořád aktivní....že když třeba otevřu jiný program, tak aby to moje okno (aplikace) byla schopná pořád reagovat.
To velurex : A co za to? :-) Jinak nemám čas, ale až něo stvoříš/te, tak bych mohl testnout a popřípadě propagovat.
Dobré odpoledne.
Chtěl jsem se zeptat, jak udělat, že když kliknu na prázdné políčko (myslím takové, které neudává počet min v okolí), tak se mi zobrazí všechny sousední takováto políčka? Radši to ještě upřesním obrázkem - na červeně začmárané políčko jsem kliknul a chci, aby se zobrazily všechny sousední "prázdná" políčka + jedno sousední udávající počet min v okolí: http://img230.imageshack.us/my.php?image=minyvk2.gif
Díky.
Dobře. Jen by mě zajímalo, proč nfunguje např. tato událost:
protected override void OnMouseClick(MouseEventArgs e)
{
}
na poli Buttonů. Ono by to pomocí toho vydělení taky nebylo špatný, ale klyž se po kliknutí na jakýkoli button nic neprovede, tak je to těžký => když dám např. událost:
protected override void OnMouseMove(MouseEventArgs e)
{
string x = Convert.ToString(e.X);
string y = Convert.ToString(e.Y);
Text = "[" + x + "," + y + "]";
}
Tak to funguje všude jen ne na poli tlačítek.
Jak to tedy udělat, aby to bylo funkční všude (klikání, MouseMove)?
Dobrý den.
Mám pole Buttonů:
Button[,] btn = new Button[10, 10];
S tím, že postupně vytvářím tlačítka. Následně mám metodu:
protected override void OnMouseUp(MouseEventArgs e)
{//zde bych potřeboval zjistit, na který index pole jsem kliknul, respektive na jakém indexu jsem uvolnil tlačítko myši -
//abych byl přesný}
Co chci je napsáno v dané metodě jako poznámka. Našel jsem na internetu postup jak toho docílit pomocí:
šířky (výšky) ClientSize / pocetSloupcu (Radku) a s výsledkem ještě toto:
int x = (int) (e.X / sirkaPole);//už v metodě OnMouseUp
to mi ale přijde poněkud komplikované...tak bych byl rád, kdyby jste mě navedli, jak toho docílit efektivněji?
Děkuju.
No tak to zkusím ještě jednou!
protected override void OnKeyDown(KeyEventArgs e)
{
Text = e.KeyData.ToString();
}
Takže jestli to dobře chápu, tak abych mohl do záhlavý okna/nebo někam jinam (jen pro ukázku) vypsat kód klávesy, tak musím použít nejdříve to: KeyEventArgs e což mi vlastně zjistí, jaká klávesa byla stisknuta. Je to tak?
To object sender mi vlastně říká, jaký objekt událost vyvolat že? Proč tedy v tomto kódu není (nahoře v tomto příspěvku)?
Kdybych ale dal:
cntl.KeyDown += new KeyEventHandler(MujKeyDownHandler);
void MujKeyDownHandler(object sender, KeyEventArgs e)
{
// Kód pro zpracování události KeyDown
}
Teď už by tam byl...takže pokud nejdříve deklaruju objekt, na který chci navázat událostí, tak musím použít poté to object sender?
Když ale přepisuju metodu (první kód tohoto příspšvku), tak to tam už není. To proto, že předtím nedeklaruju objekt? Takže vlastně by tu událost mohl vyvolat kdokoli (jiný objekt) - protože neříkám, že jenom tento.
Mám pravdu?
Mám konstruktor s vlastnostmy formuláře a tlačítka...dále mám událost při kliknutí na tlačítko a událost při stisku klávesy. Asi takhle:
using System;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsApplication1
{
public class Formular : Form
{
public Formular()
{
Button tlacitko = new Button();
tlacitko.Text = "Klik";
tlacitko.Location = new Point(20, 20);
tlacitko.Parent = this;
tlacitko.Click += new EventHandler(tlacitko_Click);
Text = "Zkouska";
}
protected override void OnKeyDown(KeyEventArgs e)
{
FileInfo fi = new FileInfo("Log.txt");//instance třídy FileInfo
StreamWriter sw = fi.AppendText();//zapisovač...na konec souboru přidá údaje; sw - název zapisovače
sw.Write(e.KeyData + ", ");//na konec souboru zapíšu kód stisknuté klávesy
sw.Close();//uvolním prostředky zapisovače
}
private void tlacitko_Click(object sender, EventArgs e)
{
//nějaký kód
}
static void Main()
{
Application.Run(new Formular());
}
}
}
Ovšem zapisování do souboru nefunguje - pokud odstraním:
Button tlacitko = new Button();
tlacitko.Text = "Klik";
tlacitko.Location = new Point(20, 20);
tlacitko.Parent = this;
tlacitko.Click += new EventHandler(tlacitko_Click);
vše funguje....Kde dělám chybu?
Dobrý den.
Jsou různé metody, třeba OnKeyDown atd (samozřejmě všechny chtít pod konzolí je blbost), ale třeba uvedenou a podobné na vstup z klávesnice by mohly jít pod konzolí. Zajímalo by mě, jak to udělat, protože ve Windows Application to funguje jen když odvodím třídy od Form a danou metodu přepisuju...ale jak to udělat pod konzolí, kde třídu od Form nemohu odvodit? Nebo se pletu? Jak to tedy udělat? Potřeboval bych to v C#.
Děkuju všechm za případnou pomoc.
djanosik napsal:
To paul27 : To ne, ale to neznamená, že ho nikdy nevyužiješ. Třeba budeš později chtít změnit jméno.
Vždyť jo, na to se hodí ty vlastnosti s blokem get i set, ale proč ještě konstruktor? Číst a nastavovat hodnotu datových složek přeci můžu jen pomocí vlastností -> pak už nepotřebuje konstruktor, když na to jsou vlastnosti (maximálně jak jsem psal, kdybych chtěl číst a zároveň nezadával...takže jeden konstruktor bez parametrů).
To djanosik : Jj už jsem taky zjistil. Pak by ale mohlo být jen:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
public class Zamestnanec
{
private string jmeno;
public string Jmeno
{
get
{
return this.jmeno;
}
set
{
if (value == "Pavel")
{
this.jmeno = "BB";
}
else { this.jmeno = value; }
}
}
}
public class Ja:Zamestnanec
{
}
class Program
{
static void Main(string[] args)
{
Ja ja = new Ja();
ja.Jmeno = "Pavel";
Console.Write(ja.Jmeno);
Console.ReadLine();
}
}
}
A jelikož to funguje, tak mi není jasný, proč v předešlým kódu byly zároveň konstruktory a vlastnosti na tu stejnou věc...když se stejně vlastnosti nevyužily. Maximálně by se tam hodil jeden konstruktor bez parametrů...který by ošetřil to, že kdyby byl dotaz někde z kódu na jméno a žádné bych zároveň neodesílal, tak aby se nevypsala jen mezera (nebo nic). Takže asi takhle:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
public class Zamestnanec
{
private string jmeno;
public Zamestnanec()
{
this.jmeno = "Nezadané jméno";
}
public string Jmeno
{
get
{
return this.jmeno;
}
set
{
if (value == "Pavel")
{
this.jmeno = "BB";
}
else { this.jmeno = value; }
}
}
}
public class Ja:Zamestnanec
{
}
class Program
{
static void Main(string[] args)
{
Ja ja = new Ja();
Console.Write(ja.Jmeno);
Console.ReadLine();
}
}
}
Ale možná neznám nějaké jiné souvislosti....ovšem funguje mi to.
Ok. Možná vám to nepřijde těžké, ale já to dneska vidím poprvé (teda podruhé, ještě včera večer). Prostě pořád to neumím využít, ale to se snad podá.
Ještě se zeptám na jedno a už nebudu otravovat.
Řekněme že v hlavní třídě mám tento kód:
public Osoba(string jmeno, string prijmeni)
{
this.jmeno = jmeno;
this.prijmeni = prijmeni;
}
public string Jmeno
{
get { return jmeno; }
set { jmeno = value; }
}
public string Prijmeni
{
get { return prijmeni; }
set { prijmeni = value; }
}
V odvozené třídě pak toto:
private int cisloUctu;
public Klient(string jmeno, string prijmeni, int cisloUctu) : base(jmeno, prijmeni)
{
this.cisloUctu = cisloUctu;
}
base(jmeno, prijmeni) - znamená, že přijaté paramentry string jmeno, string prijmeni "odešlu" do hlavní třídy, kde je nechám zpracovat. A a jelikož v hlavní třídě mám jak konstruktor, který ma za parametry string jmeno, prijmeni...tak tam mám vlastnosti pro zpracování jmena, prijmeni......a mě by zajímalo, jestli se z odvozené třídy odešle string jmeno, prijmeni do toho konstruktoru v hlavní třídě nebo to zpracuje daná vlastnost? Popřípadě šlo by jen - nebo v hlavní třídě je potřeba ten konstruktor:
Hlavní třída:
public string Jmeno
{
get { return jmeno; }
set { jmeno = value; }
}
public string Prijmeni
{
get { return prijmeni; }
set { prijmeni = value; }
}
Odvozená třída:
public Klient(string jmeno, string prijmeni, int cisloUctu) : base(jmeno, prijmeni)
{
this.cisloUctu = cisloUctu;
}
Vždyť přece mohu napsat tohle - a je to kratší a jediné co se změnilo je to, že jsem vše ze třídy Osoba vymazal a nakopíroval do Klienta. Pak ovšem nechápu, kde je ta výhoda.
using System;
using System.Collections.Generic;
using System.Text;
namespace RuzneOsoby
{
public class Klient
{
private int CisloUctu;
private string Jmeno;
private string Prijmeni;
public string jmeno
{
get
{
return this.Jmeno;
}
set
{
this.Jmeno = value;
}
}
public string prijmeni
{
get
{
return this.Prijmeni;
}
set
{
this.Prijmeni = value;
}
}
public int cislouctu
{
get
{
return this.CisloUctu;
}
set
{
if (value < 0)
{
this.CisloUctu = -1;
}
else { this.CisloUctu = value; }
}
}
}
class Program
{
static void Main(string[] args)
{
Klient klient = new Klient();
klient.jmeno = "Petr";
klient.prijmeni = "Novák";
klient.cislouctu = 120558;
Console.WriteLine("Jméno: {0}", klient.jmeno);
Console.WriteLine("Příjmení: {0}", klient.prijmeni);
Console.WriteLine("Číslo účtu: {0}", klient.cislouctu);
Console.ReadLine();
}
}
}
Zdravím. Na jedněch stránkách jsem našel tento kód:
using System;
using System.Collections.Generic;
using System.Text;
namespace RuzneOsoby
{
public class Osoba
{
private string Jmeno;
private string Prijmeni;
public string jmeno
{
get
{
return this.Jmeno;
}
set
{
this.Jmeno = value;
}
}
public string prijmeni
{
get
{
return this.Prijmeni;
}
set
{
this.Prijmeni = value;
}
}
}
public class Klient : Osoba
{
private int CisloUctu;
public int cislouctu
{
get
{
return this.CisloUctu;
}
set
{
if (value < 0)
{
this.CisloUctu = -1;
}
else { this.CisloUctu = value; }
}
}
}
class Program
{
static void Main(string[] args)
{
Klient klient = new Klient();
klient.jmeno = "Petr";
klient.prijmeni = "Novák";
klient.cislouctu = 120558;
Console.WriteLine("Jméno: {0}", klient.jmeno);
Console.WriteLine("Příjmení: {0}", klient.prijmeni);
Console.WriteLine("Číslo účtu: {0}", klient.cislouctu);
Console.ReadLine();
}
}
}
A chci se zeptat:
1.- Proč se tady vlastně dědičnost využívá, není to zbytečné?
2.- Jaktože lze dědit private (datové složky Jmeno, Prijmeni)?
Když už mluvím o té dědičnosti, tak se zeptám.
1.- Když dědím, tak všechny metody atd., ale ne ty soukromé, že ano?
2.- Základní (base class) třída je vlastně taková obecnější ne?
3.- Jestli jsem to bobře pochopil, tak dědičnost se používá ke zkrácení kódu? Ještě k něčemu asi co? Protože když třeba budu mít třídu, kde mám metodu, která přistupuje k datovým složkám...třeba pro zadání jména....pak mám další třídu, kam bych chtěl v podstatě to stejné jen něco málo navíc, tak abych to nemusel psát znova (jako tu metodu a datovou složku pro jméno), tak si to zdědím od hlavní třídy. Chápu to dobře?
Díky.
Standa napsal:
Ano. Jde to udělat. Alespoň ve VB.NET ano.
Nj zapoměl jsem uvést, že to chci udělat v C#.
na jednoduchou okynkovou verzi nepotrebujes nic jinyho nez jak nacist a ulozit soubor. Formular s textboxem a dvema buttonama(menu) naklikas a doplnis jen obsluhu tech buttonu.. mozna by se hodil i fileopendialog a filesavedialog ci jak se jmenuji..
fileopendialog a filesafedialog by se teda zatraceně hodily:)
Jinak já to naklikání nemám moc rád a (někomu přijde možná divné) i méně chápu když si formulář atd naklikám než když napíšu rovnou celej zdrojovej kód, takže bych to asi nenaklikával...ale to je teď jedno - takže jde to bez dědění?
Hi. Říkal jsem si, že bych zkusil nějaký hodně jednoduchý textový editor. A chci se zeptat, jestli by šel udělat bez použití dědičnosti? Proč se ptám...jsem celkem začátečník, nicméně metody, vlastnosti, konstruktory, třídy ap. a jak to mezi sebou komunikuje umím, ale dědičnost jsem si ještě na 100% neosvojil a protože jsem člověk netrpělivý, tak chci textový editor hned a ne až si dědičnost osvojím. Nicméně pokud to jinak nejde, či by to bylo jinak o hodně delší, tak hold budu muset překonat svojí netrpělivost a nejdřív úplně pochopit dědění.
Díky za odpověď.
Zdravím.
Když vytvářím např. bod, tak kód píšu do metody (snad se tomu tak říká):
protected override void OnPaint(PaintEventArgs e)...
A zajímalo by mě, proč metoda je právě protected override? Šlo by tam něco jiného? Mám celkem bordel v tom, kdy se co používá (private, protected, public). Díky.
Editoval djanosik: Změnil jsem titulek, aby lépe odpovídal obsahu vlákna. Dávejte si na to pozor!
Dobrý den.
Třeba zde: http://projektysipvz.gytool.cz/ProjektySIPVZ/Default.aspx?uid=221 je kód, který zobrazí normální okno, ale přitom tam je matoda Main...myslel jsem, že Main je jen v console application.
Když tedy v VSC# vytvořím windows application a zkopíruju tam onen kód, tak to hodí chybu. Když vytvořím console application, tak to samozřejmě také nejde. Tak se ptám, kam s tím kódem?
Dobrý večer.
Byl bych rád, kdyby jste mi doporučili nějakou dobrou literaturu o tomto programovacím jazyku (viz. nadpis). Prosím pište jen ty knihy, o kterých víte, že mi něco dají/jsou dobré, ne ty, které najdete během pár vteřin na googlu.
A kdyby jste věděli o nějaké pěkné webové stránce o tomto jazyku, tak to taky prosím napište. Nějaké znám, ale co kdyby že;-)
Díky mockrát.