> f e l t e t e l e k = new L i s t
>(); i f ( checkedListBox1 . CheckedIndices . Contains ( 0 ) ) f e l t e t e l e k . Add( Prim ) ; i f ( checkedListBox1 . CheckedIndices . Contains ( 1 ) ) f e l t e t e l e k . Add( Paros ) ; i f ( checkedListBox1 . CheckedIndices . Contains ( 2 ) ) f e l t e t e l e k . Add( P a r a t l a n ) ; i f ( checkedListBox1 . CheckedIndices . Contains ( 3 ) ) f e l t e t e l e k . Add( Oszt3 ) ; i f ( checkedListBox1 . CheckedIndices . Contains ( 4 ) ) f e l t e t e l e k . Add( Oszt6 ) ; i f ( checkedListBox1 . CheckedIndices . Contains ( 5 ) ) f e l t e t e l e k . Add( Oszt9 ) ; i f ( checkedListBox1 . CheckedIndices . Contains ( 6 ) ) f e l t e t e l e k . Add( Negyzet ) ; LBx_Valogat . Items . C l e a r ( ) ; for ( I n t 3 2 i = 0 ; i < LBx_Ossz . Items . Count ; i ++) { Boolean k e l l = f a l s e ; foreach ( P r e d i c a t e f e l t e t e l in f e l t e t e l e k ) { k e l l = k e l l | | f e l t e t e l ( ( I n t 3 2 ) LBx_Ossz . Items [ i ] ) ; if ( kell ) break ; } if ( kell ) LBx_Valogat . Items . Add( LBx_Ossz . Items [ i ] ) ; } LB_Eredm . Text = S t r i n g . Format ( " {0}/{1} " , LBx_Valogat . Items . Count , LBx_Ossz . Items . Count ) ; } 2.47. forráskód. Generálás és sz¶rés
30
2.5. Egyéb eszközök, id®, dátum, érték beállítás 19. feladat: [Napok száma] Írjon programot, melynek a segítségével bekér két dátumot, és meghatározza a két megadott dátum közötti napok számát!
1
2.48. ábra. M¶ködés közben.
1 2 3
private void monthCalendar_DateChanged ( object s e n d e r , {
4
DateRangeEventArgs e )
i f (MC_kezd . S e l e c t i o n S t a r t . CompareTo (MC_veg . S e l e c t i o n S t a r t ) > 0 )
{
5 6
}
7
el s e
8
{
9 10 11 12 13 14
LB_kulonbseg . Text = "A kez®dátum nagyobb , mint a végdátum . " ;
}
}
LB_kulonbseg . Text = S t r i n g . Format ( "A k é t dátum k ö z ö t t e l t e l t napok száma : {0} " , MC_veg . S e l e c t i o n S t a r t . S u b t r a c t (MC_kezd . S e l e c t i o n S t a r t ) . Days ) ;
2.49. forráskód. Különbség kiszámítása
31
20. feladat: [Horoszkóp] Írjon programot, melynek a segítségével bekér egy születési dátumot, és meghatározza, hogy a felhasználó melyik csillagjegyben született. Az ablak
1
fejlécében üdvöz®ljön minket napszaknak megfelel®en.
2.50. ábra. M¶ködés közben.
Magyarázat: Érdemes egy-egy tömbben a csillagjegyeket, és az azokat határoló dátumokat felsorolni. Ezek után a megadott dátum hónapjának és napjának gyelembevételével megkeresni melyik két határ közé esik. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
private void Btn_Horoszkop_Click ( object s e n d e r , EventArgs e )
{
l a b e l 1 . Text = C s i l l a g j e g y ( dateTimePicker1 . Value ) ; }
private S t r i n g C s i l l a g j e g y ( DateTime dateTime ) dateTime = new DateTime ( 2 0 1 1 , dateTime . Month , dateTime . Day ) ; DateTime [ ] d a t e s = new DateTime [ 1 2 ] { new DateTime ( 2 0 1 1 , 0 1 , 2 0 ) , new DateTime ( 2 0 1 1 , 0 2 , 1 9 ) , new DateTime ( 2 0 1 1 , 0 3 , 2 1 ) , new DateTime ( 2 0 1 1 , 0 4 , 2 0 ) , new DateTime ( 2 0 1 1 , 0 5 , 2 1 ) , new DateTime ( 2 0 1 1 , 0 6 , 2 2 ) , new DateTime ( 2 0 1 1 , 0 7 , 2 3 ) , new DateTime ( 2 0 1 1 , 0 8 , 2 3 ) , new DateTime ( 2 0 1 1 , 0 9 , 2 3 ) , new DateTime ( 2 0 1 1 , 1 0 , 2 3 ) , new DateTime ( 2 0 1 1 , 1 1 , 2 2 ) , new DateTime ( 2 0 1 1 , 1 2 , 2 2 ) }; S t r i n g [ ] j e g y e k = new S t r i n g [ 1 2 ] {
{
" Vízönt® " , " Halak " , "Kos" , " Bika " , " I k r e k " , "Rák" , " O r o s z l á n " , " Sz¶z " , " Mérleg " , " S k o r p i ó " , " N y i l a s " , "Bak" }; int i = 0 ; Boolean found = f a l s e ; while ( i < 11 && ! found ) { found = ( ( d a t e s [ i ] < dateTime ) && ( dateTime < d a t e s [ i + 1 ] ) ) ; i ++; } return ( found ) ? j e g y e k [ i − 1 ] : j e g y e k [ 1 1 ] ; }
2.51. forráskód. Csillagjegy megadása
32
21. feladat: [Id®pont] Írjon programot, melynek a segítségével megnövelhet® a dátum. Kiválasztható legyen melyik részét növelje a dátumnak vagy id®nek (év, hónap, nap,
1
óra, perc, másodperc).
2.52. ábra. M¶ködés közben.
Magyarázat: Az óra, perc, másodperc megadását egy MaskedTextBox komponensben oldjuk meg "00:00:00" maszkkal. Figyeljen arra, hogy értelmezhet®-e a megadott id®. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
private void BT_hozzaad_Click ( object s e n d e r , EventArgs e )
{
DateTime i d o ;
try
{ i d o = DateTime . ParseExact ( maskedTextBox1 . Text , "HH:mm: s s " , CultureInfo . InvariantCulture );} catch ( FormatException ) { MessageBox . Show ( " Nincs megadva i d ® ! " ) ; return ; } DateTime uj_datum_es_ido = new DateTime ( datum . Value . Year , datum . Value . Month , datum . Value . Day , i d o . Hour , i d o . Minute , i d o . Second ) ; I n t 3 2 n o v e l e s = ( int ) numericUpDown1 . Value ; i f (RB_ev . Checked ) uj_datum_es_ido = uj_datum_es_ido . AddYears ( n o v e l e s ) ;
el s e
i f (RB_honap . Checked )
uj_datum_es_ido = uj_datum_es_ido . AddMonths ( n o v e l e s ) ;
el se i f (RB_nap . Checked ) el se
uj_datum_es_ido = uj_datum_es_ido . AddDays ( n o v e l e s ) ;
i f ( RB_ora . Checked )
uj_datum_es_ido = uj_datum_es_ido . AddHours ( n o v e l e s ) ;
el se i f ( RB_perc . Checked )
uj_datum_es_ido = uj_datum_es_ido . AddMinutes ( n o v e l e s ) ;
el se i f ( RB_masodperc . Checked )
uj_datum_es_ido = uj_datum_es_ido . AddSeconds ( n o v e l e s ) ; l a b e l 3 . Text = S t r i n g . Format ( "A n ö v e l t dátum é s i d ® : { 0 : yyyy MM dd , HH:mm: s s } " , uj_datum_es_ido ) ; }
2.53. forráskód. Dátum növelése
33
22. feladat: [Stopper] Írj stoppert, mely jobb egérgombbal indítja és állítja, bal egérgombbal pedig részeredményeket ad.
1
2.54. ábra. M¶ködés közben.
1 2
private void Stopper_MouseClick ( object s e n d e r , MouseEventArgs e )
{
3
i f ( e . Button == System . Windows . Forms . MouseButtons . Right )
{
4 5
if ( started )
{
6 7 8
el se
9
{
10 11 12 13 14
}
15
{
17 18 19 21
l a b e l 1 . Text = "Jobbgomb : s t o p p e r l e á l l í t á s a " ; s t a r t T i m e = DateTime . Now ; l i s t B o x 1 . Items . C l e a r ( ) ; lb_mert . Text = S t r i n g . Empty ; } started = ! started ;
el s e i f ( e . Button == System . Windows . Forms . MouseButtons . L e f t )
16
20
l a b e l 1 . Text = "Jobbgomb : s t o p p e r i n d í t á s a " ; lb_mert . Text = S t r i n g . Format ( " Mért i d ® : { 0 : t } " , ( DateTime . Now − s t a r t T i m e ) ) ; }
}
}
if ( started )
l i s t B o x 1 . Items . Add ( ( DateTime . Now − s t a r t T i m e ) . T o S t r i n g ( " t " ) ) ;
2.55. forráskód. Egérkattintás kezelése
34
2.6. Menük és eszköztárak 23. feladat: [Három szám átlagai] Kérjünk be 3 egész számot. Különböz® m¶veleteket lehessen végezni velük, melyek eredményét a m¶velet nevével egy ListBox-ba gy¶jtse
1
a program. A m¶veleteket lehessen a formon lév® menüsorból kiválasztani, illteve a ListBox területén megjelen® helyi menüb®l is. A m¶veletek: A 3 szám összege, a 3 szám számtani, mértani, harmonikus közepe. A legnagyobb szám a 3 közül.
2.56. ábra. Három szám átlagai.
Magyarázat: A menük és helyi menü használatánál hangoljuk össze a m¶ködést. Elég az eseménykezel®ket egyszer megírni, pl. a menüpontoknál, és a helyimenü menüpontjainak eseménykezel®it irányítsuk ezekre a metódusokra. Használjuk a MenuStrip és ContextMenuStrip komponenseket. Ne felejtsük el a ListBox -nál a ContextMenuStrip tulajdonságot beállítani. 1 2 3 4 5 6 7 8 9 10 11 12 13
private bool JoSzamok ( ) return ( ( int . TryParse ( textBoxSz1 . Text , out s z 1 ) ) && ( int . TryParse ( textBoxSz2 . Text , out s z 2 ) ) && ( int . TryParse ( textBoxSz3 . Text , out s z 3 ) ) ) ; }
{
private void mértaniKözépToolStripMenuItem_Click ( object s e n d e r , {
{
EventArgs e )
i f ( JoSzamok ( ) )
ListBoxEredmeny . Items . Add( " Mértani közép : " + ( Math . Pow( s z 1 ∗ s z 2 ∗ sz3 , 1 . 0 / 3 ) ) . T o S t r i n g ( ) ) ; }
el s e
{ MessageBox . Show ( " 3 e g é s z számot k é r e k ! ! ! " , " Hiba . . . " , MessageBoxButtons .OK, MessageBoxIcon . E r r o r ) ; } }
2.57. forráskód. Három szám mértani közepe
35
24. feladat: [Menük ikonokkal] Egészítse ki az el®z® feladat megoldásául szolgáló programot úgy, hogy a menüpontok el®tt kis ikonok is jelenjenek meg, melyek szimbo-
2
lizálják a m¶veletet. Ugyanezek az ikonok jelenjenek meg egy eszköztáron is, ahonnan szintén elindítható legyen minden m¶velet.
2.58. ábra. Három szám átlagai ikonokkal. 25. feladat: [Véletlen számok] Töltsön fel egy listát 10 és 20 közé es® véletlen számokkal. Legyen 10 elem¶ a lista. Lehessen a listából kijelölt elemeket törölni, új elemet
3
bevinni, amit egy megjelen® TextBoxba tudunk bevinni, és lehessen a meglév® elemek összegét és szorzatát kiszámítani. Ezeket a m¶veleteket menüb®l kell indítani. A státuszsoron jelenítsük meg folyamatosan, hogy hány elem¶ a lista, mekkora a legkisebb és legnagyobb eleme.
2.59. ábra. Listaelemek kezekése menüb®l
Magyarázat: A feladat megoldásához alkalmazni kell a minimum-maximum kiválasztás tételét, az összegzés tételét alapesetben, és szorzatokra is. Ebben az esetben gyeljünk oda a gy¶jt®változó kezd®érték adására. Az új érték bevitelénél csak egész számot fogadjunk el.
36
1 2
private void S z e l s o e r t e k ( out int max , out int min )
{
3 4 5 6 7 8 9 10 11 12 13 14 15
}
17 18 19 20 22 23 24 25
}
int i , szam ;
30 31 32
37 38 39 40 41 42 43 44
}
{ }
} SetStatus ( ) ;
EventArgs e )
Set De f ( ) ;
private void ö s s z e g T o o l S t r i p M e n u I t e m _ C l i c k ( object s e n d e r , {
46
EventArgs e )
int i , s = 0 ; for ( i = 0 ; i < l i s t B o x 1 . Items . Count ; i ++)
{
47 48 49 51
szam = rnd . Next ( 1 0 ) + 1 0 ; l i s t B o x 1 . Items . Add( szam . T o S t r i n g ( ) ) ;
private void a l a p h e l y z e t T o o l S t r i p M e n u I t e m _ C l i c k ( object s e n d e r ,
45
50
])) ]); ])) ]);
S t a t u s L a b e l 1 . Text = " Elemek száma : " + l i s t B o x 1 . Items . Count . T o S t r i n g ( ) ; int max , min ; S z e l s o e r t e k ( out max , out min ) ; S t a t u s L a b e l 2 . Text = " Legnagyobb elem : " + max . T o S t r i n g ( ) ; S t a t u s L a b e l 3 . Text = " L e g k i s e b b elem : " + min . T o S t r i n g ( ) ;
{
29
36
i i i i
for ( i = 0 ; i < 1 0 ; i ++)
28
35
Convert . ToInt32 ( l i s t B o x 1 . Items [ Convert . ToInt32 ( l i s t B o x 1 . Items [ Convert . ToInt32 ( l i s t B o x 1 . Items [ Convert . ToInt32 ( l i s t B o x 1 . Items [
l i s t B o x 1 . Items . C l e a r ( ) ;
27
34
< = > =
private void Set De f ( )
{
26
33
Convert . ToInt32 ( l i s t B o x 1 . Items [ 0 ] ) ; i < l i s t B o x 1 . Items . Count ; i ++)
private void S e t S t a t u s ( )
{
16
21
int i ; min = max = for ( i = 1 ; { i f (max max i f ( min min }
}
s += Convert . ToInt32 ( l i s t B o x 1 . Items [ i ] ) ; } l a b e l O s s z e g . Text = " Elemek ö s s z e g : " + s . T o S t r i n g ( ) ;
2.60. forráskód. Listaelemek kezelése
37
1 2 3
private void s z o r z a t T o o l S t r i p M e n u I t e m _ C l i c k ( object s e n d e r , {
4 5 6 8 9 10 12 13 14 15 16
}
{
19 21
25 26 27
while ( l i s t B o x 1 . S e l e c t e d I t e m s . Count > 0 )
}
20
24
EventArgs e )
{
18
23
s ∗= Convert . ToInt32 ( l i s t B o x 1 . Items [ i ] ) ; } l a b e l S z o r z a t . Text = " Elemek s z o r z a t a : " + s . ToString ( ) ;
private void k i j e l ö l t e k T ö r l é s e T o o l S t r i p M e n u I t e m _ C l i c k ( object s e n d e r ,
17
22
int i ; double s = 1 ; for ( i = 0 ; i < l i s t B o x 1 . Items . Count ; i ++) {
7
11
EventArgs e )
}
l i s t B o x 1 . Items . Remove ( l i s t B o x 1 . S e l e c t e d I t e m s [ 0 ] ) ;
SetStatus ( ) ;
private void ú j B e v i t e l e T o o l S t r i p M e n u I t e m _ C l i c k ( object s e n d e r , {
28 29
EventArgs e )
int s z ; i f ( int . TryParse ( textBox1 . Text , out s z ) )
l i s t B o x 1 . Items . Add( textBox1 . Text ) ;
30 31 32 33
}
SetStatus ( ) ;
2.61. forráskód. Listaelemek kezelése
38
26. feladat: [Véletlen számok mátrixban] Töltsön fel egy 3x3 mátrixot 10 és 20 közé es® véletlen számokkal. Végezze el menüb®l és helyi menüb®l választhatóan a következ®
4
m¶veleteket: transzponált, a páratlan számok összege, a f®átló számainak összege, a sorokban lév® értékek és az oszlopokban lév® értékek összege. Ezeket az eredményeket jelenítse is meg a formon.
2.62. ábra. Mátrix elemek kezekése menüb®l
Magyarázat: A feladat megoldásánál használjuk a DataGridView komponens adta lehet®ségeket. Figyeljünk arra, hogy a mátrix bejárásánál a sorokat és oszlopokat megfelel®en azonosítsuk. Használjuk az összegzés tételét megfelel®en. A transzponált el®állítását lásd a 2.74-ben.
1 2
private void G e n e r a l ( )
{
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
}
Random rnd = new Random ( ) ; int i , j , szam ; dataGridAlap . Rows . C l e a r ( ) ; for ( i = 0 ; i < 3 ; i ++) { DataGridViewRow r = new DataGridViewRow ( ) ; for ( j = 0 ; j < 3 ; j ++) { szam = rnd . Next ( 1 0 ) + 1 0 ; DataGridViewCell dc = new DataGridViewTextBoxCell ( ) ; dc . Value = szam ; r . C e l l s . Add( dc ) ; } dataGridAlap . Rows . Add( r ) ; }
2.63. forráskód. Mátrix elemek generálása
39
1 2 3
private void p á r a t l a n Ö s s z e g T o o l S t r i p M e n u I t e m _ C l i c k ( object s e n d e r , {
4 5
EventArgs e )
int i , j , szam , p t l = 0 ; for ( i = 0 ; i < 3 ; i ++)
{
6 7
for ( j = 0 ; j < 3 ; j ++)
{
8 9 10 11 12 13 14
}
szam = ( int ) dataGridAlap . Rows [ j ] . C e l l s [ i ] . Value ; i f ( szam % 2 == 1 ) p t l += szam ;
} } l a b e l P t l O s s z e g . Text = " P á r a t l a n elemek ö s s z e g e : " + p t l . T o S t r i n g ( ) ;
15 16 17 18
private void so ro k Ös s ze g eT o ol S tr i pM e nu I te m _C l ic k ( object s e n d e r , {
19
EventArgs e )
int i , j , szam , s ;
l a b e l S o r o k . Text = " Sorok ö s s z e g e : \n" ;
20
for ( i = 0 ; i < 3 ; i ++)
21
{
22 23
{
25 26 27 28 29 30 31 32
s = 0;
for ( j = 0 ; j < 3 ; j ++)
24
}
}
szam = ( int ) dataGridAlap . Rows [ i ] . C e l l s [ j ] . Value ; s += szam ;
} l a b e l S o r o k . Text = l a b e l S o r o k . Text + ( i +1). T o S t r i n g ( ) + " . s o r : " + s . T o S t r i n g ( ) + " \n" ;
33 34 35 36
private void f ® á t l ó Ö s s z e g T o o l S t r i p M e n u I t e m _ C l i c k ( object s e n d e r , {
37 38 40 41 42 43 45
int i , szam , o s s z = 0 ; for ( i = 0 ; i < 3 ; i ++)
{
39
44
EventArgs e )
}
szam = ( int ) dataGridAlap . Rows [ i ] . C e l l s [ i ] . Value ; o s s z += szam ;
} l a b e l F o A t l O s s z e g . Text = " F ® á t l ó e l e m e i n e k ö s s z e g e : " + o s s z . ToString ( ) ;
2.64. forráskód. Mátrix elemek kezelése
40
27. feladat: [M¶veletek] Írj programot, amely egy számokkal töltött listában végez m¶veleteket. A m¶veleteket menüb®l érhessük el, és a következ®k legyenek:
2
minimum/maximum keresés (ezt almenü segítségével old meg) átlagszámítás összeg páros számok összege Ugyancsak menüb®l lehessen kiválasztani, hogy kézzel adjuk meg a számokat, vagy a program generálja ®ket. Menüb®l és gomb segítségével is lehessen kilépni a programból. A számok bekérésénél végezzünk ellen®rzést, hogy valóban egész számot adjon meg a felhasználó és a megadott határokon belül legyen: 1 és 20 között lehet a darabszám, és a számok 1 és 99 között legyenek a listában.
2.65. ábra. M¶ködés közben
Magyarázat: Mivel gyakran kell egy bekért szám ellen®rzését elvégezni, írjunk rá külön metódust, mely egy textbox szövegét próbálja meg átalakítani és megadható neki két határ, amik közé kell essen a szám.
41
1 2
private Boolean E l l e n o r i z ( TextBox tb , I n t 3 2 ah , I n t 3 2 fh , out I n t 3 2 szam )
{
3 4
i f ( I n t 3 2 . TryParse ( tb . Text , out szam ) && ( szam >= ah ) && ( szam <= f h ) )
{
5 6
return true ;
}
7
el s e
8
{
9
MessageBox . Show ( S t r i n g . Format ( " Számot k e l l megadni é s { 0 } , " +" {1} k ö z ö t t k e l l l e n n i e ! " , ah , f h ) ) ; tb . Text = S t r i n g . Empty ; tb . Focus ( ) ; return f a l s e ;
10 11 12 13 14 15 16
}
}
17 18 19 20
private void párosakÖsszegeToolStripMenuItem_Click ( object s e n d e r , {
21
EventArgs e )
I n t 3 2 sum = 0 ;
for ( I n t 3 2 i = 0 ; i < l i s t B o x . Items . Count ; i ++)
22
{
23
i f ( ( I n t 3 2 ) l i s t B o x . Items [ i ] % 2 == 0 )
24
{
25 26 27
}
28
MessageBox . Show ( S t r i n g . Format ( "A p á r o s számok ö s s z e g e : {0} " , sum ) ) ;
30 31
el s e
32 34 35 36 37 38
private void számokátlagaToolStripMenuItem_Click ( object s e n d e r , {
EventArgs e )
I n t 3 2 sum = 0 ;
for ( I n t 3 2 i = 0 ; i < l i s t B o x . Items . Count ; i ++)
40
{
41 42 43 44 46
MessageBox . Show ( " Nincs p á r o s szám ! " ) ;
}
39
45
sum += ( I n t 3 2 ) l i s t B o x . Items [ i ] ;
i f ( sum > 0 )
29
33
}
}
sum += ( I n t 3 2 ) l i s t B o x . Items [ i ] ; } MessageBox . Show ( S t r i n g . Format ( "A számok á t l a g a : {0} " , sum / ( ( double ) l i s t B o x . Items . Count ) ) ) ;
2.66. forráskód. Ellenörzés és összegzés
42
2.7. Több info egy formon 28. feladat: [SplitContainer használata] Írjon programot, mely tartalmaz 2 színes panelt egymás mellett, és lehet®ség legyen a területük arányának változtatására. Adjuk
1
meg a jobboldali panel szélességének arányát az egészhez képest.
2.67. ábra. M¶ködés közben a SplitContainer.
Magyarázat: A panelek eltolására használja a SplitContainer komponenst, míg látványosan az arány megaddható a Trackbar segítségével. 1 2
namespace Tobbinfo_1 {
3
public p a r t i a l c l a s s Form1 : Form
{
4 5
public Form1 ( )
{
6 7
}
8 9
private void t r a c k B a r 1 _ S c r o l l ( object s e n d e r , EventArgs e )
10
{
11 12 13 14
}
15 16
{
18 19 20 21 22 24
splitContainer2 . SplitterDistance = s p l i t C o n t a i n e r 2 . Width ∗ t r a c k B a r 1 . Value / 1 0 0 ; l a b e l P o s . Text = t r a c k B a r 1 . Value . T o S t r i n g ( ) + "%" ;
private void Form1_Shown ( object s e n d e r , EventArgs e )
17
23
InitializeComponent ( ) ;
}
}
}
splitContainer2 . SplitterDistance = s p l i t C o n t a i n e r 2 . Width ∗ 10 / 1 0 0 ; l a b e l P o s . Text = t r a c k B a r 1 . Value . T o S t r i n g ( ) + "%" ;
2.68. forráskód. SplitContainer használata
43
29. feladat: [TabControl használata] Írjon programot, mely bekér két egész számot külön külön egy TabControl egyik lapján. Majd kiszámolja a két szám számtani közepét, amit kiír egy másik lapra, aminek a cimkéje legyen: eredmények. A bekéréskor ügyeljen a kivételkezelésre! A programból való kilépéskor kérdezzen rá, hogy biztos ki akar-e lépni a felhasználó, és a válasznak megfelel®en járjon el.
2.69. ábra. Adatbekérés TabControl használatával.
Magyarázat: Figyeljünk oda a hibakezelésre, és a váltásra a TabPage -ek között. 1 2
private void buttonSzamol_Click ( object s e n d e r , EventArgs e )
{
3 4 5
int szam1 , szam2 ; i f ( textBox1 . Text != S t r i n g . Empty && textBox2 . Text != S t r i n g . Empty )
{
6
try
7
{
8
szam1 = Convert . ToInt32 ( textBox1 . Text ) ; szam2 = Convert . ToInt32 ( textBox2 . Text ) ; labelEredmeny . Text = ( ( szam1 + szam2 ) / 2 ) . T o S t r i n g ( ) ; tabControl1 . SelectTab ( 1 ) ;
9 10 11 12
}
13
catch
14
{
15
MessageBox . Show ( " Adathiba ! " , " Hiba " , MessageBoxButtons .OK, MessageBoxIcon . E r r o r ) ;
16 17
} }
18 19
el se
20
{
21 22 23 24 25
}
}
MessageBox . Show ( " Mindkét számot í r d be ! " , " Hiba " , MessageBoxButtons .OK, MessageBoxIcon . E r r o r ) ;
2.70. forráskód. TabControl használata
44
1
30. feladat: [Mátrixok adatai egy formon] Írjon programot, mely generál egy 3x3 mátrixot olyan véletlen számokból, melyek 1 és 20 közé esnek. Határozza meg a mátrix
3
transzponáltját, a skalárszorosát és a mátrix legkisebb és legnagyobb értékét is válassza ki. Az egyes mátrixokat és a széls®értékeket külön lapokon jelenítse meg, de csak egy formot használjon.
Magyarázat: A kezdeti állapotban a program generáljon egy kiinduló mátrixot. Figyeljen oda, hogy a véletlen számok a megadott intervallumba essenek. Megjelenítéshez lehet használni a DataGridView egy megfelel®en beállított példányát.
2.71. ábra. Kiinduló mátrix.
1 2
private void buttonAlap_Click ( object s e n d e r , EventArgs e )
{
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
}
Random rnd = new Random ( ) ; int i , j , szam ; dataGridAlap . Rows . C l e a r ( ) ; for ( i = 0 ; i < 3 ; i ++) { DataGridViewRow r = new DataGridViewRow ( ) ; for ( j = 0 ; j < 3 ; j ++) { szam = ( rnd . Next ( ) % 2 0 ) + 1 ; DataGridViewCell dc = new DataGridViewTextBoxCell ( ) ; dc . Value = szam ; r . C e l l s . Add( dc ) ; } dataGridAlap . Rows . Add( r ) ; }
2.72. forráskód. Kiinduló mátrix generálása
Magyarázat: A számolás indításakor határozza meg a feladatban el®írt mátrixokat és számokat. 45
2.73. ábra. Kiinduló mátrix.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
private void T r a n s z p o n a l t ( )
{
int i , j , szam ; dataGridTr . Rows . C l e a r ( ) ; for ( i = 0 ; i < 3 ; i ++) { DataGridViewRow r = new DataGridViewRow ( ) ; for ( j = 0 ; j < 3 ; j ++) { szam = ( int ) dataGridAlap . Rows [ j ] . C e l l s [ i ] . Value ; DataGridViewCell dc = new DataGridViewTextBoxCell ( ) ; dc . Value = szam ; r . C e l l s . Add( dc ) ; } dataGridTr . Rows . Add( r ) ; } } 2.74. forráskód. Transzponált számítása
46
1 2
private void S k a l a r S z o r z a s ( )
{
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
}
Random rnd = new Random ( ) ; int i , j , szam , s z o r z o ; s z o r z o = ( rnd . Next ( ) % 7 ) + 3 ; l a b e l S k a l a r . Text = " A s k a l á r a : "+s z o r z o . T o S t r i n g ( ) ; d a t a G r i d S z o r . Rows . C l e a r ( ) ; for ( i = 0 ; i < 3 ; i ++) { DataGridViewRow r = new DataGridViewRow ( ) ; for ( j = 0 ; j < 3 ; j ++) { szam = ( int ) dataGridAlap . Rows [ j ] . C e l l s [ i ] . Value ∗ s z o r z o ; DataGridViewCell dc = new DataGridViewTextBoxCell ( ) ; dc . Value = szam ; r . C e l l s . Add( dc ) ; } d a t a G r i d S z o r . Rows . Add( r ) ; }
2.75. forráskód. Skalárral szorzás
1 2
private void S z e l s o E r t e k e k ( ) {
int szam , i , j , min = 2 1 , max = − 1; for ( i = 0 ; i < 3 ; i ++)
3 4
{
5 6 8 9 10 11 12 13 14 15
for ( j = 0 ; j < 3 ; j ++)
{
7
}
szam = ( int ) dataGridAlap . Rows [ i ] . C e l l s [ j ] . Value ; i f ( min > szam ) min = szam ; i f (max < szam ) max = szam ;
} } l a b e l M i n . Text = min . T o S t r i n g ( ) ; labelMax . Text = max . T o S t r i n g ( ) ;
2.76. forráskód. Széls®értékek
47
2.8. Dialógusok 31. feladat: [Színek állítása dialógusablak segítségével.] Készítsen egy olyan programot, mely egy formon lév® label -nek a szín tulajdonságait állítja. A színbeállítást egy
1
nyomógomb segítségével kezdeményezze. A színeket a szokásos windows beállító ablak segítségével lehessen kiválasztani. Egy további label -be jelenítsük meg a kiválaszott szín adatait is.
2.77. ábra. M¶ködés közben.
Magyarázat: A ColorDialog példányosítása történhet a komponens használatával, vagy a kódból közvetlenül is! Figyeljen arra, hogy a ColorDialog is, mint minden dialógus ablak, a ShowDialog() metódussal hívható, melynek visszatérési értéke a DialogResult osztály egy példányában fogadható, és utána értékelhet® ki. 1 2
private void b u t t o n C o l o r s _ C l i c k ( object s e n d e r , EventArgs e )
{
3 4 5 6 7 8 9 10 11
}
C o l o r D i a l o g cd = new C o l o r D i a l o g ( ) ; D i a l o g R e s u l t dr ; dr = cd . ShowDialog ( ) ; i f ( dr == D i a l o g R e s u l t .OK) { l a b e l M i n t a . BackColor = cd . C o l o r ; l a b e l V a l . Text = cd . C o l o r . T o S t r i n g ( ) ; }
2.78. forráskód. ColorDialog használata
48
32. feladat: [Kép megnyitása dialógus ablak segítségével.] Készítsen egy olyan programot, melyben a szokásos windows Megnyitás ablak segítségével kiválaszt egy
1
képet, és azt megnyitja egy PictureBox -ban. A kép töltse ki a form felületét, méretezésre kövesse annak mozgását. A megnyitást egy gomb segítségével kezdeményezze.
2.79. ábra. Kép megnyitása.
Magyarázat: Figyeljen rá, hogy a PictureBox Dock tulajdonságát hogy állítja be! 1 2
private void buttonOpen_Click ( object s e n d e r , EventArgs e ) {
3 4 5 6 7 8 9 10
}
O p e n F i l e D i a l o g o f = new O p e n F i l e D i a l o g ( ) ; D i a l o g R e s u l t dr = o f . ShowDialog ( ) ; i f ( dr == D i a l o g R e s u l t .OK) { p i c t u r e B o x D e s t . SizeMode = PictureBoxSizeMode . CenterImage ; p i c t u r e B o x D e s t . Image = new Bitmap ( o f . FileName ) ; }
2.80. forráskód. OpenFileDialog használata
49
33. feladat: [Szöveges le megnyitása és mentése] Készítsen egy programot, mely a szokásos windows Megnyitás ablak segítségével meg tud nyitni egy szöveges le-t egy
2
TextBox -ba. Illetve tudjuk elmenteni a tartalmát a szokásos Mentés ablak használatával.
2.81. ábra. Szöveges le mentésa dialógus ablakkal.
Magyarázat: Figyeljen oda, hogy a TextBox Multiline tulajdonságát hogy állítja be. Ne feledjük, a le-ok használathához a System.IO névtérre szükség van. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
private void buttonOpen_Click ( object s e n d e r , EventArgs e ) { O p e n F i l e D i a l o g o f = new O p e n F i l e D i a l o g ( ) ; i f ( o f . ShowDialog ( ) == D i a l o g R e s u l t .OK) { F i l e S t r e a m f s = new F i l e S t r e a m ( o f . FileName , FileMode . Open ) ; StreamReader r s = new StreamReader ( f s ) ; string s = r s . ReadLine ( ) ; while ( s != null ) { textBoxDest . Text += s ; s = r s . ReadLine ( ) ; } rs . Close ( ) ; f s . Close ( ) ; } } private void buttonSave_Click ( object s e n d e r , EventArgs e ) { S a v e F i l e D i a l o g s f = new S a v e F i l e D i a l o g ( ) ; i f ( s f . ShowDialog ( ) == D i a l o g R e s u l t .OK) { F i l e S t r e a m f s = new F i l e S t r e a m ( s f . FileName , FileMode . C r e a t e ) ; StreamWriter wr = new StreamWriter ( f s ) ; wr . Write ( textBoxDest . Text ) ; wr . C l o s e ( ) ; f s . C l o s e ( ) ; } } 2.82. forráskód. A SaveFileDialog használata
50
34. feladat: [Dialógusok használata] Készítsen programot mely egy RichText komponensbe megnyit egy kiválasztott rtf le-t. Tudjuk módosítani a háttér színét, a ka-
3
rakterek színét, a karakterek jellemz®it. Tudjunk menteni. Az egyes lehet®ségeket helyi menüb®l érjük el.
2.83. ábra. Helyi menü használata a feladatban.
Magyarázat: A háttérszín beállításánál használjuk a ColorDialog komponenst. A karakterek jellemz®it a FontDialog komponens segítségével állíthatjuk be. Ennek a Font tulajdonsága tartalmazza az összes beállítást. 1 2 3 4 5 6 7 8 9 10 11
private void h á t t é r s z í n T o o l S t r i p M e n u I t e m _ C l i c k ( object s e n d e r , {
C o l o r D i a l o g cd = new C o l o r D i a l o g ( ) ; i f ( cd . ShowDialog ( ) == D i a l o g R e s u l t .OK) richTextBox1 . BackColor = cd . C o l o r ; }
EventArgs e )
private void f o n t B e á l l í t á s T o o l S t r i p M e n u I t e m _ C l i c k ( object s e n d e r , { FontDialog f d = new FontDialog ( ) ; i f ( f d . ShowDialog ( ) == D i a l o g R e s u l t .OK) richTextBox1 . Font = f d . Font ; }
EventArgs e )
2.84. forráskód. Háttérszín és Font beállítása
Magyarázat: Mentésnél gyeljünk arra, hogy le m¶velet végzésekor er®forrást használunk. Szükség lehet a kivételkezelésre. 1 2 3 4 5 6 7 8 9
private void b e t ö l t é s T o o l S t r i p M e n u I t e m _ C l i c k ( object s e n d e r , EventArgs e ) { O p e n F i l e D i a l o g o f = new O p e n F i l e D i a l o g ( ) ; i f ( o f . ShowDialog ( ) == D i a l o g R e s u l t .OK) richTextBox1 . L o a d F i l e ( o f . FileName ) ; } private void mentésToolStripMenuItem_Click ( object s e n d e r , EventArgs e ) { S a v e F i l e D i a l o g s f = new S a v e F i l e D i a l o g ( ) ; i f ( s f . ShowDialog ( ) == D i a l o g R e s u l t .OK) richTextBox1 . S a v e F i l e ( s f . FileName ) ; } 2.85. forráskód. Mentés és visszatöltés
51
2.9. Modális és nem modális formok 35. feladat: [Üzenetablak használata] Írjon programot, mely véletlenszer¶en kitalál egy egész számot 1 és 20 között. A felhasználó tippelje meg, hogy páros vagy páratlan
1
lesz. A kiértékelést egy dialógus üzenettel végezze a program.
2.86. ábra. Kiértékelés üzenetablak segítségével.
Magyarázat: Ügyeljen a véletlenszámok használatára. Az üzenetablak a MessageBox Show metódusával hívható, melynek 4 paramétere van. A megjelenítend® szöveg, a form fejlécszövege, a megjelen® gombok, és az ikon. A gombok és az ikon a rendszer felsorolt típusa MessageBoxButtons és MessageBoxIcon. Ezek közül kell választani. A Páratlan tipp kiértékelése teljesen hasonlóan mehet. 1 2 3 4 5 6
private int aSzam = 0 ; private bool ParosE ; private Random rnd = new Random ( ) ; private void buttonGen_Click ( object s e n d e r , EventArgs e )
{
7 8 9 10 11
aSzam = ( rnd . Next ( ) % 2 0 ) + 1 ; ParosE = ( ( aSzam % 2 ) == 0 ) ; labelSZAM . Text = " G e n e r á l á s k é s z " ; }
private void buttonParos_Click ( object s e n d e r , EventArgs e ) i f ( ParosE && aSzam != 0 )
{
12 13 14 15 16 17
el s e
MessageBox . Show ( " J ó l t i p p e l t é l nagyon . " , "Eredmény" , MessageBoxButtons .OK, MessageBoxIcon . I n f o r m a t i o n ) ;
MessageBox . Show ( " Rossz t i p p . " , "Eredmény" , MessageBoxButtons .OK, MessageBoxIcon . Warning ) ; labelSZAM . Text = aSzam . T o S t r i n g ( ) ; }
2.87. forráskód. Deklarálás
52
36. feladat: [Üzenetablak kiértékelése] Írjon programot, mely feltesz egy eldöntend® kérdést egy üzenet ablakban, és a válasznak megfelel®en, ha IGEN, akkor zöldre, ha NEM akkor pirosra színezi a form hátterét.
2.88. ábra. Üzenetablak gombjai.
1 2
private void buttonKerdes_Click ( object s e n d e r , EventArgs e )
{
3
i f ( MessageBox . Show ( " Süt k i n t a nap ? " , " Kérdés a b l a k . . . " ,
4 5
{
6 7
}
8
{
11 13
this . BackColor = C o l o r . Green ;
el se
9 10 12
MessageBoxButtons . YesNo , MessageBoxIcon . Q u e s t i o n ) == D i a l o g R e s u l t . Yes )
}
}
this . BackColor = C o l o r . Red ;
2.89. forráskód. Egy lehetséges megoldás.
53
1
37. feladat: [Adatbekérés modális form segítségével.] Írjon programot, mely bekér két egész számot külön külön egy adatbekér® modális form segítségével. Majd kiszámolja
3
a két szám számtani átlagát, amit kiír a f®formra. A bekéréskor ügyeljen a kivételkezelésre! A programból való kilépéskor kérdezzen rá, hogy biztos ki akar-e lépni a felhasználó, és a válasznak megfelel®en járjon el.
2.90. ábra. Modális form.
Magyarázat: Figyeljen oda, hogy az adatbekérés után publikus adatmez®be kerüljön az adat, hogy át lehessen venni a másik formból. Ne felejtse el az adatbekér® formon a felrakott gombok DialogResult értékét beállítani. Alapértelmezése None. Az adatbekéréshez példányosítsuk a bekér® formot. A kilépésnél kezeljük a MessageBox Show metódusának a visszatérési értékét. 1 2
private void buttonBe1_Click ( object s e n d e r , EventArgs e )
{
3 4 5 6 7 8 9 10 11
}
FormBeker frm = new FormBeker ( ) ; i f ( frm . ShowDialog ( ) == D i a l o g R e s u l t .OK) { SzamEgy = frm . BekertSzam ; l a b e l E l s o . Text = frm . BekertSzam . T o S t r i n g ( ) ; }
private void FormMain_FormClosing ( object s e n d e r , FormClosingEventArgs e )
{
i f ( MessageBox . Show ( " B i z t o s k i akar l é p n i ? " , " Kérdés " ,
12 13 14
{
MessageBoxButtons . OKCancel , MessageBoxIcon . Q u e s t i o n ) == D i a l o g R e s u l t . Cancel ) e . Cancel = true ; } }
2.91. forráskód. Egy lehetséges megoldás.
54
38. feladat: [Összetartozó adatok kezelése] Készítsen egy programot, melyben egy kiscserkész csapat tagjainak adatait tudjuk nyilvántartani. A tagokról az azonosítójukat,
5
a nevüket, és a születési dátumukat kell letárolni. Az adatbevitel egy modális form segítségével történjen. Az adatokat táblázatos formában jelenítsük meg. Tudjunk adatot menteni és visszatölteni leból, a szokásos windows dialógus ablakok használatával.
2.92. ábra. Kiscserkészek adatai
Magyarázat: A feladat során több mindenre kell gyeljünk. Amit át kell tekinteni, a ListView kezelése, bináris le írása és olvasása, modális form használata, és adatforgalom a formok között. Tekintsük el®ször az adatbeviteli formot. Itt csak arra ügyeljünk, hogy az adatmez®ket publikus láthatóságra állítsuk, hogy a FormMain osztályból is el lehessen érni. Magyarázat: A FormMain osztály eseménykezel®i kissé összetettebbek, mert itt végezzük el a feladatokat.
55
1 2 3 4
// Az a d a t b e v i t e l i form
public p a r t i a l c l a s s FormAdat : Form
{
5 6 7 8
public string Beazon = " " ; public string Benev = " " ; public DateTime B e s z u l ; public FormAdat ( )
9
{
10 11
InitializeComponent ( ) ;
}
12 13
private void buttonOK_Click ( object s e n d e r , EventArgs e )
14
{
15
Beazon = textBoxAzon . Text ; Benev = textBoxNev . Text ; B e s z u l = dateTimePickerSzDatum . Value ;
16 17 18 19 20
}
}
2.93. forráskód. Adatbeviteli form 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
// A f ® f o r m
public p a r t i a l c l a s s FormMain : Form
{
private string azon = " " ; private string nev = " " ; private DateTime s z u l ; public FormMain ( )
{ }
InitializeComponent ( ) ;
private void buttonZar_Click ( object s e n d e r , EventArgs e )
{ }
Close ( ) ;
private void FormMain_FormClosing ( object s e n d e r , {
22
FormClosingEventArgs e )
i f ( MessageBox . Show ( " B i z t o s k i l é p ? " , " Kérdés " ,
23 24
{
25 26 27 28
}
}
MessageBoxButtons . YesNo , MessageBoxIcon . Q u e s t i o n ) == D i a l o g R e s u l t . No) e . Cancel = true ;
2.94. forráskód. A f®form eseménykezel®i, metódusai
56
1 2 3
// K i v á l a s z t o t t a d a t m ó d o s í t á s a
private void buttonMod_Click ( object s e n d e r , EventArgs e )
{
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
}
FormAdat frm = new FormAdat ( ) ; frm . textBoxAzon . Text = l i s t V i e w D a t a . Items [ l i s t V i e w D a t a . S e l e c t e d I n d i c e s frm . textBoxNev . Text = l i s t V i e w D a t a . Items [ l i s t V i e w D a t a . S e l e c t e d I n d i c e s DateTime d = new DateTime ( ) ; d = Convert . ToDateTime ( l i s t V i e w D a t a . Items [ l i s t V i e w D a t a . S e l e c t e d I n d i c e s frm . dateTimePickerSzDatum . Value = d ; i f ( frm . ShowDialog ( ) == D i a l o g R e s u l t .OK) { l i s t V i e w D a t a . Items [ l i s t V i e w D a t a . S e l e c t e d I n d i c e s frm . Beazon ; l i s t V i e w D a t a . Items [ l i s t V i e w D a t a . S e l e c t e d I n d i c e s frm . Benev ; l i s t V i e w D a t a . Items [ l i s t V i e w D a t a . S e l e c t e d I n d i c e s frm . B e s z u l . T o S h o r t D a t e S t r i n g ( ) ; }
[ 0 ] ] . SubItems [ 2 ] . Text ) ;
[ 0 ] ] . Text = [ 0 ] ] . SubItems [ 1 ] . Text = [ 0 ] ] . SubItems [ 2 ] . Text =
try
{
33 34 35
int i ; for ( i = 0 ; i < l i s t V i e w D a t a . Items . Count ; i ++)
{
36
br . Write ( l i s t V i e w D a t a . Items [ i ] . Text ) ; br . Write ( l i s t V i e w D a t a . Items [ i ] . SubItems [ 1 ] . Text ) ; br . Write ( l i s t V i e w D a t a . Items [ i ] . SubItems [ 2 ] . Text ) ;
37 38 39 40 41
}
42
} br . Flush ( ) ;
catch
43
{
44 45
}
46
MessageBox . Show ( " Hiba a mentésben . " ) ;
finally
47
{
48 49 50 52
[ 0 ] ] . SubItems [ 1 ] . Text ;
// B i n á r i s f i l e −ba mentés private void buttonSave_Click ( object s e n d e r , EventArgs e ) { S a v e F i l e D i a l o g s f = new S a v e F i l e D i a l o g ( ) ; i f ( s f . ShowDialog ( ) == D i a l o g R e s u l t .OK) { B i n a r y W r i t e r br = new B i n a r y W r i t e r ( F i l e . Open ( s f . FileName , FileMode . C r e a t e ) ) ;
32
51
[ 0 ] ] . Text ;
}
}
}
br . C l o s e ( ) ;
2.95. forráskód. A f®form eseménykezel®i, metódusai
57
1 2 3 4 5 6 7 8 9 10
// V i s s z a t ö l t é s b i n á r i s f i l e − b ó l private void buttonOpen_Click ( object s e n d e r , EventArgs e ) { O p e n F i l e D i a l o g o f = new O p e n F i l e D i a l o g ( ) ; i f ( o f . ShowDialog ( ) == D i a l o g R e s u l t .OK) { string s a ; l i s t V i e w D a t a . Items . C l e a r ( ) ; BinaryReader br = new BinaryReader ( F i l e . Open ( o f . FileName , FileMode . Open ) ) ;
try
11
{
12 13
i f ( F i l e . E x i s t s ( o f . FileName ) )
{
14 15 16
long l e n 1 = br . BaseStream . Length ; while ( br . BaseStream . P o s i t i o n < l e n 1 )
{
17 18 19 20 21 22 23 24 25 26
}
27 29
{
30 31 32 34 35 36 37 38 39 40
}
catch { } finally
28
33
}
azon = br . Re ad St ri ng ( ) ; nev = br . R ea dS tri ng ( ) ; s a = br . R ea dS tr in g ( ) ; Li stV iew Ite m l i = new Lis tVi ewI te m ( azon , 0 ) ; l i . SubItems . Add( nev ) ; l i . SubItems . Add( s a ) ; l i s t V i e w D a t a . Items . Add( l i ) ;
}
}
}
br . C l o s e ( ) ;
// Sor t ö r l é s e private void buttonDel_Click ( object s e n d e r , EventArgs e ) { l i s t V i e w D a t a . Items [ l i s t V i e w D a t a . S e l e c t e d I n d i c e s [ 0 ] ] . Remove ( ) ; }
2.96. forráskód. A f®form eseménykezel®i, metódusai
58
39. feladat: [Memória] Írj memória játék programot. A következ® beállításokat támogassa a program:
4
hány szám legyen (6 vagy 9) mennyi ideig látszódjanak (5, 10, vagy 20 mp) hány jegy¶ek legyenek (1 vagy 2) Ha 6 db számot kell kitalálni, akkor 5/10 mp, ha 9 számot, akkor pedig 10/20 mp legyen a választható. A program a beállított paramétereknek megfelel®en generáljon számokat és jelenítse meg azokat egy ideig, majd kérdezze vissza ®ket. A számok megjelenítéséhez és visszakérdezéséhez is modális ablakokat használjunk. A visszakérdezéskor csak annyi tippje lehessen a játékosnak, mint amennyi a kitalálandó számok darabszáma.
2.97. ábra. Kezd® ablak
Magyarázat: A labeleket dinamikusan rakja fel a formra, mivel nem tudni el®re, hogy hány számot kell megjeleníteni. Magyarázat: Maximálisan annyi számot lehessen beírni, amiennyit eredetileg kiválasztottunk megtekintésre.
59
2.98. ábra. További megjelen® formok
1 2
private void BT_Indulhat_Click ( object s e n d e r , EventArgs e )
{
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
}
int db = (RB_szam6 . Checked ) ? 6 : 9 ; Frm_Szamok frm_Szamok = new Frm_Szamok ( db , ( CB_Egyjegyu . Checked ) ? 1 : 2 , RB_mp5. Checked ? 5 : RB_mp10 . Checked ? 10 : 2 0 ) ; frm_Szamok . ShowDialog ( ) ; Frm_Memoria frm_Memoria = new Frm_Memoria ( db ) ; frm_Memoria . ShowDialog ( ) ; int j o V a l a s z = 0 ; foreach ( int i in frm_Memoria . t i p p e k ) { i f ( frm_Szamok . szamok . C o n t a i n s ( i ) ) { j o V a l a s z ++; } } MessageBox . Show ( S t r i n g . Format ( "A j ó v á l a s z o k száma : {0} " , j o V a l a s z ) ) ; 2.99. forráskód. Játék indítása és kiértékelése
60
1 2 3 4 5 6 7
private void L a b e l e k K i r a k ( int db , int szamjegy ) Random v e l e t l e n = new Random ( ) ; int m e r e t S z e l e s s e g = ( p a n e l 1 . Width − 4 0 ) / 3 ; int meretMagassag = 200 / ( db / 3 ) ; szamok = new L i s t
{
8
{
min = 1 ;
max = 9 ;
{
min = 1 0 ;
max = 9 9 ; }
el s e
9 10
for ( int i = 0 ; i < db ; i ++)
11
{
12 13 14 15 17 18 19 20 21
do
22 23 24 25 26 27 29
La be l u j L a b e l = new La be l ( ) ; int x = i % 3 , y = i / 3 ; u j L a b e l . L o c a t i o n = new Poi nt ( x ∗ ( m e r e t S z e l e s s e g + 1 0 ) + 1 0 ,
y ∗ ( meretMagassag + 1 0 ) + 1 0 ) ; u j L a b e l . S i z e = new S i z e ( m e r e t S z e l e s s e g , meretMagassag ) ; u j L a b e l . Font = new Font ( Font . FontFamily , 1 6 ) ; u j L a b e l . TextAlign = ContentAlignment . MiddleCenter ; u j L a b e l . BackColor = C o l o r . Red ; int ujSzam ;
16
28
}
}
}
{ ujSzam = v e l e t l e n . Next (max − min + 1 ) + min ; } while ( szamok . C o n t a i n s ( ujSzam ) ) ; szamok . Add( ujSzam ) ; u j L a b e l . Text = ujSzam . T o S t r i n g ( ) ; p a n e l 1 . C o n t r o l s . Add( u j L a b e l ) ;
2.100. forráskód. Számok megjelenítése
1 2
private void BT_Hozzaad_Click ( object s e n d e r , EventArgs e )
{
3 5 6 8 9 10 11 12 13 14 15 16 18
int temp ; i f ( int . TryParse (TB_Szam . Text , out temp ) )
{
7
17
i f ( ! l i s t B o x 1 . Items . C o n t a i n s (TB_Szam . Text ) )
{
4
}
l i s t B o x 1 . Items . Add(TB_Szam . Text ) ; t i p p e k . Add( temp ) ;
} } TB_Szam . Text = S t r i n g . Empty ; TB_Szam . Focus ( ) ; i f (maxDb == l i s t B o x 1 . Items . Count ) { TB_Szam . Enabled = BT_Hozzaad . Enabled = f a l s e ; }
2.101. forráskód. Tipp hozzáadása
61
2.10. Id®zítés és üzenetek 40. feladat: [Id®zítés használata] Írj programot, mely a form közepén mutatja a futó id®t másodperc pontosan.
2
2.102. ábra. Id®zítés használata
Magyarázat: Az id®zítés legegyszer¶bben a Timer komponens segítségével oldhatjuk meg. Használjuk a Tick eseményt. Figyeljünk rá, hogy az id®zít®t engedélyezni kell. Az alapértelmezett értéke false. 1 2
namespace timer_1 {
3
public p a r t i a l c l a s s Form1 : Form
{
4 5
public Form1 ( )
6
{
7 8 9
}
10 11
private void timer1_Tick ( object s e n d e r , EventArgs e )
12
{
13 14 15 16 17
InitializeComponent ( ) ; t i m e r 1 . Enabled = true ;
}
}
}
l a b e l I d o . Text = DateTime . Now . ToLongTimeString ( ) ;
2.103. forráskód. Id®zítés használata
62
41. feladat: [Form színe id®zítve] Írj programot, mely 1 másodpercenként megváltozattja a form háttérszínét.
1
Magyarázat: Egy lehetséges megoldás a színek ciklikus változtatására a maradékos osztás használata. 1 2
namespace i d o z i t _ 2 {
3
public p a r t i a l c l a s s Form1 : Form
{
4 5
int i n d = 0 ;
C o l o r [ ] s z i n e k = new C o l o r [ 5 ] { C o l o r . White , C o l o r . Blue , C o l o r . Beige , C o l o r . Black , C o l o r . DarkSeaGreen } ;
6 7 8 9
public Form1 ( )
10
{
11 12
}
13 14
private void Form1_Load ( object s e n d e r , EventArgs e )
15
{
16 17 18
}
19 20
{
22 23 24 25 27
timer1 . I n t e r v a l = 1000; t i m e r 1 . Enabled = true ;
private void timer1_Tick ( object s e n d e r , EventArgs e )
21
26
InitializeComponent ( ) ;
}
}
}
this . BackColor = s z i n e k [ i n d % 5 ] ; i n d++;
2.104. forráskód. Id®zítés használata
63
42. feladat: [Új formok születése és halála] Írj programot, 2 másodpercenként megjelenít egy 20 másodpercig látható formot. Ezt 1 percig csinálja. Minden új form
2
más más feliratot tartalmazzon.
2.105. ábra. Új formok születése és halála
Magyarázat: Több timerre is szükségünk lesz mind a f®formon, ami méri a 2 másodperceket, mind a létrejöv® formokon, ami a 20 másodpercekért felel. A f®formon az 1 percet is gyelni kell. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
DateTime k e z d i d o = new DateTime ( ) ; int x , y ; TimeSpan e l t e l t ; private void button1_Click ( object s e n d e r , EventArgs e ) { t i m e r 1 . Enabled = true ; timer1 . I n t e r v a l = 2000; k e z d i d o = DateTime . Now ; } private void timer1_Tick ( object s e n d e r , EventArgs e ) { e l t e l t = DateTime . Now − k e z d i d o ; i f ( e l t e l t . Seconds > 6 0 ) this . C l o s e ( ) ; Form2 frm = new Form2 ( ) ; frm . l a b e l 1 . Text = DateTime . Now . ToLongTimeString ( ) ; frm . x = x % 8 0 0 ; frm . y = y % 6 0 0 ; frm . Show ( ) ; x += 1 0 0 ; y += 1 0 0 ; } }
2.106. forráskód. A vezérlés a f®formon
1 2 3 4 5 6 7
private void Form2_Load ( object s e n d e r , EventArgs e ) t i m e r 1 . Enabled = true ; } private void timer1_Tick ( object s e n d e r , EventArgs e ) { this . C l o s e ( ) ; } private void Form2_Shown ( object s e n d e r , EventArgs e ) { this . Top = y ; this . L e f t = x ; } {
2.107. forráskód. A megjelen® formok
64
43. feladat: [Kering® form] Írjon programot, mely egy formot mozgat a képerny®n körbe, 1 másodperces id®közzel lépkedve. A mozgás 2 percig menjen az indítástól. Használj
2
felsorolás típust a mozgás irányának tárolásához.
2.108. ábra. Körbe fut a képerny®n
1 2
namespace Korbefut { enum I r a n y o k {
3 4 5 6 7 8
}
}
Jobbra , Le , Balra , Fel
2.109. forráskód. Felsorolás típus létrehozása
Magyarázat: Az éppen aktuális irány tárolásához hozzunk létre egy felsorolás típust (Jobbra,Le,Balra,Fel). Magyarázat: Az aktuális állapot alapján mindig tudhatjuk, hogy merre kell mozgatni a form ot, és melyik lesz a következ® irány, ha elértük a képerny® megfelel® szélét. Figyeljünk arra, hogy mivel x nagyságú lépéseket teszünk, nem biztos, hogy pontosan a képerny® széléhez ér az ablak majd a mozgás végén, ezért igazítsuk be (ne lógjon ki és ne is maradjon rés).
65
1 2
private void timer_Tick ( object s e n d e r , EventArgs e )
{
3 4 5 6 7 8 9 10 11 12 13 14
l a b e l . Text = S t r i n g . Format ( " {0} mp" , s t o p p e r . Elapsed . T o t a l S e c o n d s ) ; i f ( s t o p p e r . Elapsed . T o t a l S e c o n d s >= 1 2 0 ) { t i m e r . Enabled = f a l s e ; s t o p p e r . Stop ( ) ; L e f t = ( S c r e e n . PrimaryScreen . Bounds . Width − Width ) / 2 ; Top = ( S c r e e n . PrimaryScreen . Bounds . Height − Height ) / 2 ; return ; } switch ( i r a n y ) { case I r a n y o k . Jobbra : i f ( L e f t + l e p e s < S c r e e n . PrimaryScreen . Bounds . Width − Width ) L e f t += l e p e s ;
el se
15
{
L e f t = S c r e e n . PrimaryScreen . Bounds . Width − Width ; i r a n y = I r a n y o k . Le ; } break ; case I r a n y o k . Le : i f ( Top + l e p e s <S c r e e n . PrimaryScreen . Bounds . Height − Height ) Top += l e p e s ;
16 17 18 19 20 21
el se
22
{
Top = S c r e e n . PrimaryScreen . Bounds . Height − Height ; irany = Iranyok . Balra ; } break ; case I r a n y o k . B a l r a : i f ( Left − l e p e s > 0) L e f t −= l e p e s ;
23 24 25 26 27 28
el se
29
{
Left = 0; irany = Iranyok . Fel ; } break ; case I r a n y o k . F e l : i f ( Top − l e p e s > 0 ) Top −= l e p e s ;
30 31 32 33 34 35
el se
36
{
37 38 39 40 41
}
}
}
Top = 0 ; i r a n y = I r a n y o k . Jobbra ; break ;
2.110. forráskód. Feladat megoldása
66
44. feladat: [TiliToli játék] Írjon pogramot, mely megvalósítja a TiliToli játékot. Közben valósítsa meg az id®mérést is.
3
2.111. ábra. TiliToli játék
Magyarázat: A játék lemezkéit egy-egy dinamikusan létrehozott label komponens valósítsa meg. Az újonnan létrehozott labeleket tároljuk el egy kétdimenziós tömbben, és mindegyikéhez ugyanazt az eseménykezel®t rendeljük. A közös metódus a sender objektumban utazó label pozíciójából "találja ki", hogy ® melyik a rácsban. Ha a lyuk melletti lemezre kattintunk, akkor az cseréljen helyet a lyukkal. Készítsünk függvényt, ami a labelek feliratából és helyes sorrendjéb®l meghatározza, hogy jó-e az elrendezés.
67
1 2
void u j L a b e l _ C l i c k ( object s e n d e r , EventArgs e )
{
3
i f ( ! t i m e r . Enabled )
{
4
t i m e r . Enabled = true ; } L ab el kep = ( s e n d e r as Lab el ) ; int i = kep . L e f t / meret ; int j = kep . Top / meret ; i f ( i > 0 && l a b e l e k [ i − 1 , j ] == null ) { Csere ( i , j , i − 1 , j ) ; }
5 6 7 8 9 10 11 12 13
el s e
14 15
i f ( i < N − 1 && l a b e l e k [ i + 1 , j ] == null )
{
16 17
}
18
el se
19 20
Csere ( i , j , i + 1 , j ) ;
i f ( j > 0 && l a b e l e k [ i , j − 1 ] == null )
{
21 22
}
23
el se
24 25 27 28 29 30 31 32 34 35 36 37
}
Csere ( i , j , i , j + 1 ) ; } i f ( MindegyikJoHelyen ( ) ) { t i m e r . Enabled = f a l s e ; MessageBox . Show ( " G r a t u l á l o k , k é s z ! {0} " , Lb_Ido . Text ) ; }
private bool MindegyikJoHelyen ( )
{
38 39
bool j o = true ; for ( int db = 0 ; ( db < N ∗ N) && j o ; db++)
{
40 41 42 43 45 46
}
47 49
int i = db % N; int j = db / N; i f ( l a b e l e k [ i , j ] != null )
{
44
48
i f ( j < N − 1 && l a b e l e k [ i , j + 1 ] == null )
{
26
33
Csere ( i , j , i , j − 1 ) ;
}
}
j o = Convert . ToInt32 ( l a b e l e k [ i , j ] . Text ) == ( db + 1 ) ;
return j o ; 2.112. forráskód. A kérdéses metódusok
68
3. Adatkezelés 3.1. SqlConnection, ConnectionString 1. feladat: [Kapcsolat felépítése] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. Használja a szerver telepítésekor megadott sa felhasználót
1
és jelszavát. Majd egy labelben jelenítse meg a kapcsolat állapotát. Tudja a kapcsolatot bontani is.
3.1. ábra. Kapcsolódás adatbázishoz
Magyarázat: Figyeljünk arra, hogy az adatkezeléshez szükségünk van a System.Data.SqlClient névtérre. 1 2 3
namespace sqlconn_1 { public p a r t i a l c l a s s Form1 : Form { private string ConnSt =
" s e r v e r=l o c a l h o s t \\MSSQL2005 ; d a t a b a s e=Minta ; u i d=s a ; pwd=master " ; private S q l C o n n e c t i o n sconn ;
4 5 6
public Form1 ( )
7
{
8 9 10 11 12
InitializeComponent ( ) ; buttonCon . Text = " K a p c so l ó d á s . . . " ; l a b e l K a p c s . Text = S t r i n g . Empty ; sconn = new S q l C o n n e c t i o n ( ConnSt ) ; }
private void buttonCon_Click ( object s e n d e r , EventArgs e ) i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l o s e d )
13
{
14 15
{
16 17 18
el se
19
{
20 21 22 23
}
sconn . Open ( ) ; l a b e l K a p c s . Text = sconn . S t a t e . T o S t r i n g ( ) ; buttonCon . Text = " M e g s z a k í t á s " ; } sconn . C l o s e ( ) ; l a b e l K a p c s . Text = sconn . S t a t e . T o S t r i n g ( ) ; buttonCon . Text = " K a p c s o l ó d á s " ; } } }
3.2. forráskód. Kapcsolódás adatbázishoz
69
2. feladat: [Felhasználó azonosítás] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. A kapcsolat kiépítéséhez kérje be a felhasználó nevét és jelszavát. Egy labelben jelenítse meg a a kapcsolat állapotát. Tudja a kapcsolatot bontani is.
3.3. ábra. Kapcsolódás adatbázishoz adatbekéréssel
Magyarázat: A connectionString összeállítására kell gyelni. 1 2
private void buttonKapcs_Click ( object s e n d e r , EventArgs e )
{
3 4
i f ( textBoxUser . Text != S t r i n g . Empty && {
5 6
textBoxPw . Text != S t r i n g . Empty )
string CS = ConnSt + " ; u i d=" + textBoxUser . Text + " ; pwd=" + textBoxPw . Text ;
7
i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l o s e d )
8
{
9
sconn . C o n n e c t i o n S t r i n g = CS ; sconn . Open ( ) ; l a b e l C o n . Text = sconn . S t a t e . T o S t r i n g ( ) ; buttonKapcs . Text = " M e g s z a k í t á s " ;
10 11 12
}
13
els e
14
{
15 16 17 18 19 20
} }
}
sconn . C l o s e ( ) ; l a b e l C o n . Text = sconn . S t a t e . T o S t r i n g ( ) ; buttonKapcs . Text = " K a p c s o ló d á s " ;
3.4. forráskód. Kapcsolódás adatbázishoz adatbekéréssel
70
2
3. feladat: [Kapcsolat jellemz®i] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. Használja a szerver telepítésekor megadott sa felhasználót és jelszavát. Majd írassa ki a kapcsolat jellemz®it a formra: Id®túllépés, Adatbázis neve, szerver neve, csomagméret, a host gép azonosítója és az adatbázis állapota. Tudja a kapcsolatot bontani is.
3.5. ábra. A kapcsolat jellemz®i
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
using using using using using using using using using
System ; System . C o l l e c t i o n s . G e n e r i c ; System . ComponentModel ; System . Data ; System . Drawing ; System . Linq ; System . Text ; System . Windows . Forms ; System . Data . S q l C l i e n t ;
namespace sqlconn_3 {
public p a r t i a l c l a s s Form1 : Form
{
private string ConnSt = " s e r v e r=l o c a l h o s t \\MSSQL2005 ; d a t a b a s e=Minta ; u i d=s a ; pwd=master " ; private S q l C o n n e c t i o n sconn ; public Form1 ( )
{
21 22 23 24
}
InitializeComponent ( ) ; buttonCon . Text = " K a p c so l ó d á s . . . " ; sconn = new S q l C o n n e c t i o n ( ConnSt ) ;
3.6. forráskód. A deklarációk
71
2
1 2
private void buttonCon_Click ( object s e n d e r , EventArgs e )
{
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
lvAdat . Items . C l e a r ( ) ; i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l o s e d ) { sconn . Open ( ) ; buttonCon . Text = " M e g s z a k í t á s " ; Lis tVi ewI tem l = new Li stV iew Ite m ( ) ; l . Text = " I d ® t ú l l é p é s : " ; l . SubItems . Add( sconn . ConnectionTimeout . T o S t r i n g ( ) ) ; lvAdat . Items . Add( l ) ; Lis tVi ewI tem l d b = new Li stV iew Ite m ( ) ; l d b . Text = " A d a t b á z i s : " ; l d b . SubItems . Add( sconn . Database . T o S t r i n g ( ) ) ; lvAdat . Items . Add( l d b ) ; Lis tVi ewI tem l d s = new Li stV iew Ite m ( ) ; l d s . Text = " D a t a s o u r c e : " ; l d s . SubItems . Add( sconn . DataSource . T o S t r i n g ( ) ) ; lvAdat . Items . Add( l d s ) ; Lis tVi ewI tem l p s = new Li stV iew Ite m ( ) ; l p s . Text = "Csomag méret : " ; l p s . SubItems . Add( sconn . P a c k e t S i z e . T o S t r i n g ( ) ) ; lvAdat . Items . Add( l p s ) ; Lis tVi ewI tem l s = new Lis tVi ewI tem ( ) ; l s . Text = " S z e r v e r v e r z i ó : " ; l s . SubItems . Add( sconn . S e r v e r V e r s i o n . T o S t r i n g ( ) ) ; lvAdat . Items . Add( l s ) ; Lis tVi ewI tem lw = new Lis tVi ewI tem ( ) ; lw . Text = " Munkaállomás : " ; lw . SubItems . Add( sconn . W o r k s t a t i o n I d . T o S t r i n g ( ) ) ; lvAdat . Items . Add( lw ) ; }
el s e
33
{
34 35 36 37 38 39 40
}
}
sconn . C l o s e ( ) ; buttonCon . Text = " K a p c s o l ó d á s " ; lvAdat . Items . C l e a r ( ) ; lvAdat . Items . Add( sconn . S t a t e . T o S t r i n g ( ) ) ;
3.7. forráskód. A kapcsolat jellemz®i
72
4. feladat: [Kapcsolat string dinamikus használata] Írjon programot, mely egy szabványos kongurációs le-ból (programneve.exe.cong xml le-ból) beolvassa a Con-
3
nectionString tartalmát, bekéri a felhasználó nevet és a jelszót, ezzel kiegészíti a ConnectionStringet, majd kapcsolódni tud a Minta adatbázishoz. Majd írassa ki a kapcsolat jellemz®it a formra: Id®túllépés, Adatbázis neve, szerver neve és az adatbázis állapota. Tudja a kapcsolatot bontani is.
3.8. ábra. A kapcsolat jellemz®i
Magyarázat: A kongurációs le használatához a System.Conguration névteret használni kell. Ehhez nem elegend® a szokásos using sor, hanem adjuk a referenciákhoz is hozzá a fenti nev¶ dll-t. A kongurációs leba adjuk hozzá a ConnectionString szekciót, és tölsük is ki. 1 2 3 4 5 6
3.9. forráskód. A kongurációs le
Magyarázat: A kongurációs leból a ConnectionStringet olvassuk be a CongurationManager segítségével. Akár több változatot is tárolhatunk, amiket névvel különböztetünk meg. 1 2 3 4 5 6 7 8
using System . C o n f i g u r a t i o n ; public Form1 ( ) { InitializeComponent ( ) ; buttonCon . Text = " K a p c s o l ó d á s . . . " ; sconn = new S q l C o n n e c t i o n ( ) ; ConnSt = ConfigurationManager . ConnectionStrings [ " b e t o l t " ] . ConnectionString ; } 3.10. forráskód. A kongurációs le használata
73
3.2. Az SqlCommand 5. feladat: [Tábla tartalmának lekérése és megjelenítése] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. Olvassa be az Alkalmazottak táblából az els® 5 nevet és zetést, név szerint rendezve, és jelenítse meg egy ListView ban. Használja az SqlDataReader és az SqlCommand osztályt.
3.11. ábra. M¶ködés közben.
1 2
public Form1 ( )
{
3 4 5 6 7 8 9
}
InitializeComponent ( ) ; buttonCon . Text = " K a p c s o l ó d á s . . . " ; sconn = new S q l C o n n e c t i o n ( ConnSt ) ; scomm = sconn . CreateCommand ( ) ; scomm . CommandText = " s e l e c t top 5 Nev , " +" Alapber from Alkalmazottak o r d e r by Nev" ;
10 11 12 13
private void B e o l v a s ( )
{
14
{
16 17 18 19 20 21 22 23
SqlDataReader r = scomm . ExecuteReader ( ) ;
while ( r . Read ( ) )
15
}
Lis tVi ewI tem l = new Li stV iew Ite m ( ) ; l . Text = ( string ) r [ 0 ] ; l . SubItems . Add( r [ 1 ] . T o S t r i n g ( ) ) ; lvAdat . Items . Add( l ) ;
} r . Close ( ) ;
3.12. forráskód.
74
2
6. feladat: [Skalár érték lekérése és megjelenítése] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. Olvassa be az Alkalmazottak táblából az átlagzetést és jelenítse meg egy Label -en. Használja az SqlCommand osztályt.
3.13. ábra. M¶ködés közben.
1 2
public Form1 ( )
{
3 4 5 6 7 8 9 10
}
private double B e o l v a s ( )
{
11
14
double a t l ;
a t l = Convert . ToDouble ( scomm . E x e c u t e S c a l a r ( ) ) ;
12 13
InitializeComponent ( ) ; sconn = new S q l C o n n e c t i o n ( ConnSt ) ; scomm = sconn . CreateCommand ( ) ; scomm . CommandText = " s e l e c t avg ( a l a p b e r ) from Alkalmazottak " ;
}
return a t l ;
3.14. forráskód.
75
2
7. feladat: [Séma lekérése és megjelenítése] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. Olvassa be az Alkalmazottak tábla séma szerkezetét, és jelenítse meg. Használja az SqlCommand osztályt.
3.15. ábra. M¶ködés közben.
1 2
public Form1 ( )
{
3 4 5 6 7 8 9 10 11
}
private void B e o l v a s ( )
{
12 13 14 15
InitializeComponent ( ) ; buttonCon . Text = " K a p c s o l ó d á s . . . " ; sconn = new S q l C o n n e c t i o n ( ConnSt ) ; scomm = sconn . CreateCommand ( ) ; scomm . CommandText = " s e l e c t ∗ from Alkalmazottak " ;
}
SqlDataReader r = scomm . ExecuteReader ( CommandBehavior . SchemaOnly ) ; DataTable dt = r . GetSchemaTable ( ) ; dgvAdat . DataSource = dt ;
3.16. forráskód.
76
2
8. feladat: [Tárolt eljárás futtatása] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. Készítsen egy tárolt eljárást, mely a paraméterként kapott %-os mértékben megemeli az alkalmazottak zetését, és kiszámolja az átlagzetést az emelés el®tt és után, és ezeket az adatokat visszaadja. Jelenítse meg az átlagértékeket. Használja az SqlCommand osztályt.
3.17. ábra. M¶ködés közben.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
CREATE PROCEDURE s p A t l a g N o v e l ( @ s z a z a l e k float , @ e l o t t e f l o a t output , @utana f l o a t output ) AS BEGIN s e l e c t @ e l o t t e=avg ( a l a p b e r ) from Alkalmazottak update Alkalmazottak s e t a l a p b e r = ( 1 + @ s z a z a l e k / 1 0 0 ) ∗ a l a p b e r s e l e c t @utana=avg ( a l a p b e r ) from Alkalmazottak END GO
3.18. forráskód.
77
4
1 2
namespace sqlcomm_4 {
3
public p a r t i a l c l a s s Form1 : Form
{
4 5 6 7 8 9 10
private string ConnSt = " s e r v e r=l o c a l h o s t \\MSSQL2005 ; d a t a b a s e=Minta ; u i d=s a ; pwd=master " ; private S q l C o n n e c t i o n sconn ; private SqlCommand scomm ; private double s z a z a l e k ; public Form1 ( )
11
{
12 13 14 15 16 17
}
18 19
InitializeComponent ( ) ; sconn = new S q l C o n n e c t i o n ( ConnSt ) ; scomm = sconn . CreateCommand ( ) ; scomm . CommandType = CommandType . S t o r e d P r o c e d u r e ; scomm . CommandText = " s p A t l a g n o v e l " ;
private void buttonCon_Click ( object s e n d e r , EventArgs e )
20
{
21 22
i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l o s e d )
{
23 24 25 26 27 28 29
el se
30
{
31 32
}
33 34
{
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 54
sconn . C l o s e ( ) ; buttonCon . Text = " K a p c s o l ó d á s " ; }
private void B e o l v a s ( )
35
53
sconn . Open ( ) ; buttonCon . Text = " M e g s z a k í t á s " ; i f ( textBox1 . Text != S t r i n g . Empty && double . TryParse ( textBox1 . Text , out s z a z a l e k ) ) { Beolvas ( ) ; } }
}
}
}
double e l , ut ; scomm . Parameters . Add( " s z a z a l e k " , SqlDbType . F l o a t ) ; scomm . Parameters [ " s z a z a l e k " ] . Value = s z a z a l e k ; scomm . Parameters . Add( " e l o t t e " , SqlDbType . F l o a t ) ; scomm . Parameters [ " e l o t t e " ] . D i r e c t i o n = P a r a m e t e r D i r e c t i o n . Output ; scomm . Parameters . Add( " utana " , SqlDbType . F l o a t ) ; scomm . Parameters [ " utana " ] . D i r e c t i o n = P a r a m e t e r D i r e c t i o n . Output ; i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l o s e d ) sconn . Open ( ) ; scomm . ExecuteNonQuery ( ) ; e l = ( double ) scomm . Parameters [ " e l o t t e " ] . Value ; ut = ( double ) scomm . Parameters [ " utana " ] . Value ; l a b e l A t l E l o t t e . Text = e l . T o S t r i n g ( ) ; l a b e l A t l U t a n a . Text = ut . T o S t r i n g ( ) ;
3.19. forráskód. 78
9. feladat: [Adatfelvitel adatbázisba] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. Kérje be egy új alkalmazott adatait, és szúrja be az
4
új rekordot. Használja az SqlCommand osztályt.
3.20. ábra. M¶ködés közben.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
namespace sqlcomm_5 {
public p a r t i a l c l a s s Form1 : Form
{
private string ConnSt = " s e r v e r=l o c a l h o s t \\MSSQL2005 ; d a t a b a s e=Minta ; u i d=s a ; pwd=master " ; private S q l C o n n e c t i o n sconn ; private SqlCommand scomm ; public Form1 ( )
{
InitializeComponent ( ) ; sconn = new S q l C o n n e c t i o n ( ConnSt ) ; scomm = sconn . CreateCommand ( ) ; scomm . CommandType = CommandType . Text ; buttonCon . Text = " K a p c so l ó d á s " ; gbAdat . V i s i b l e = f a l s e ; buttonRogz . Enabled = f a l s e ; buttonUj . Enabled = f a l s e ; scomm . CommandText = " i n s e r t i n t o Alkalmazottak " + " ( nev , S z u l e t _ i d o , r e s z l e g , b e o s z t a s , b e l e p e s , a l a p b e r , "+ " nyelvpotl ) values " + " ( @nev , @Szulet_ido , @ r e s z l e g , @beosztas , @belepes , "+ " @alapber , @ n y e l v p o t l ) " ; }
3.21. forráskód. Deklarációk
79
1 2
public Form1 ( )
{
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
}
InitializeComponent ( ) ; sconn = new S q l C o n n e c t i o n ( ConnSt ) ; scomm = sconn . CreateCommand ( ) ; scomm . CommandType = CommandType . Text ; buttonCon . Text = " K a p c s o l ó d á s " ; gbAdat . V i s i b l e = f a l s e ; buttonRogz . Enabled = f a l s e ; buttonUj . Enabled = f a l s e ; scomm . CommandText = " i n s e r t i n t o Alkalmazottak " + " ( nev , S z u l e t _ i d o , r e s z l e g , b e o s z t a s , b e l e p e s , " +" a l a p b e r , n y e l v p o t l ) v a l u e s ( @nev , @Szulet_ido , " +" @ r e s z l e g , @beosztas , @belepes , @alapber , @ n y e l v p o t l ) " ;
private void buttonRogz_Click ( object s e n d e r , EventArgs e )
{
19 20
i f ( textBoxNev . Text != S t r i n g . Empty && {
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
numericAlapBer . Value > 0 )
scomm . Parameters . C l e a r ( ) ; scomm . Parameters . Add( " nev " , SqlDbType . VarChar , 3 0 ) ; scomm . Parameters [ " nev " ] . Value = textBoxNev . Text ; scomm . Parameters . Add( " S z u l e t _ i d o " , SqlDbType . DateTime ) ; scomm . Parameters [ " S z u l e t _ i d o " ] . Value = dateTimePickerSzdatum . Value ; scomm . Parameters . Add( " r e s z l e g " , SqlDbType . VarChar , 3 0 ) ; scomm . Parameters [ " r e s z l e g " ] . Value = t e x t B o x R e s z l e g . Text ; scomm . Parameters . Add( " b e o s z t a s " , SqlDbType . VarChar , 3 0 ) ; scomm . Parameters [ " b e o s z t a s " ] . Value = textBoxBeo . Text ; scomm . Parameters . Add( " b e l e p e s " , SqlDbType . S m a l l I n t ) ; scomm . Parameters [ " b e l e p e s " ] . Value = numericBelep . Value ; scomm . Parameters . Add( " a l a p b e r " , SqlDbType . I n t ) ; scomm . Parameters [ " a l a p b e r " ] . Value = numericAlapBer . Value ; scomm . Parameters . Add( " n y e l v p o t l " , SqlDbType . B i t ) ; scomm . Parameters [ " n y e l v p o t l " ] . Value = checkBoxNyelvPotlek . Checked ;
try
39
{
40 41 42
}
43
catch ( E x c e p t i o n ex )
44
{
45 46 47 48 49 50 51
i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l o s e d ) sconn . Open ( ) ; scomm . ExecuteNonQuery ( ) ;
}
}
MessageBox . Show ( " A d a t r ö g z í t é s s i k e r t e l e n . " + ex . Message , " Figyelem " , MessageBoxButtons .OK, MessageBoxIcon . E r r o r ) ;
} SetAlapHelyzet ( ) ;
3.22. forráskód. Végrehgajtás
80
10. feladat: [Adatkarbantartás adatbázisban 2] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. Módosítsa a zetéseket egy bekért értékre,
4
de csak a segédmunkások esetén. A m¶velet végrehajtása után írassa ki a m¶velet által érintett sorok számát a formra. Használja az SqlCommand osztályt.
3.23. ábra. M¶ködés közben.
1 2
public Form1 ( )
{
3 4 5 6 7 8 9 10 11 12 13
}
InitializeComponent ( ) ; sconn = new S q l C o n n e c t i o n ( ConnSt ) ; scomm = sconn . CreateCommand ( ) ; scomm . CommandType = CommandType . Text ; buttonCon . Text = " K a p c s o l ó d á s " ; scomm . CommandText = " update Alkalmazottak " + " s e t a l a p b e r = @alapber where b e o s z t a s = @ b e o s z t a s " ;
private void buttonRogz_Click ( object s e n d e r , EventArgs e ) i f ( numericAlapBer . Value >= 0 )
{
{
14 15 16 17 18
scomm . Parameters . C l e a r ( ) ; scomm . Parameters . Add( " b e o s z t a s " , SqlDbType . VarChar , 3 0 ) ; scomm . Parameters [ " b e o s z t a s " ] . Value = c_beo ; scomm . Parameters . Add( " a l a p b e r " , SqlDbType . I n t ) ; scomm . Parameters [ " a l a p b e r " ] . Value = numericAlapBer . Value ;
try
19
{
20 21 22 23
}
24
{
26 27 28 29 31
l a b e l S o r o k . Text = rows . T o S t r i n g ( ) ;
catch ( E x c e p t i o n ex )
25
30
i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l o s e d ) sconn . Open ( ) ; int rows = scomm . ExecuteNonQuery ( ) ;
} }
MessageBox . Show ( " A d a t r ö g z í t é s s i k e r t e l e n . " + ex . Message , " Figyelem " , MessageBoxButtons .OK, MessageBoxIcon . E r r o r ) ;
} SetAlapHelyzet ( ) ;
3.24. forráskód. M¶ködés
81
3.3. Adatok megjelenítése, adatkötés, DateSet és DataTable 11. feladat: [Tábla tartalmának lekérése és megjelenítése] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. Olvassa be az Alkalmazottak táblából az adatokat, név szerint rendezve, és jelenítse meg egy DataGridView -ban. Használja az DataTable és az DataAdapter osztályt.
3.25. ábra. M¶ködés közben.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
private string ConnSt = " s e r v e r=l o c a l h o s t \\MSSQL2005 ; d a t a b a s e=Minta ; u i d=s a ; pwd=master " ; private S q l C o n n e c t i o n sconn ; private SqlCommand scomm ; private DataTable dt = new DataTable ( ) ; private SqlDataAdapter da ; public Form1 ( ) { InitializeComponent ( ) ; buttonCon . Text = " K a p c so l ó d á s . . . " ; sconn = new S q l C o n n e c t i o n ( ConnSt ) ; scomm = sconn . CreateCommand ( ) ; scomm . CommandText = " s e l e c t ∗ from Alkalmazottak " ; } private void buttonCon_Click ( object s e n d e r , EventArgs e ) { i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l o s e d ) { sconn . Open ( ) ; buttonCon . Text = " M e g s z a k í t á s " ; Beolvas ( ) ; } el se
{
sconn . C l o s e ( ) ; buttonCon . Text = " K a p c s o l ó d á s " ; } } private void B e o l v a s ( ) { i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l o s e d ) sconn . Open ( ) ; da = new SqlDataAdapter ( scomm ) ; dgvAdat . DataSource = dt ; da . F i l l ( dt ) ; }
3.26. forráskód. A program mejelenése
82
2
12. feladat: [Tábla tartalmának lekérése tárolt eljárással] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. Olvassa be az Alkalmazottak táblából a segédmunkások adatait, név szerint rendezve, és jelenítse meg egy DataG-
ridView -ban. Használja a DataTable és az DataAdapter osztályokat. A beolvasást egy tárolt eljárás végezze el!
3.27. ábra. M¶ködés közben.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
public Form1 ( )
{
InitializeComponent ( ) ; buttonCon . Text = " K a p c s o l ó d á s . . . " ; sconn = new S q l C o n n e c t i o n ( ConnSt ) ; scomm = sconn . CreateCommand ( ) ; DataColumn dcn = new DataColumn ( " nev " ) ; dt . Columns . Add( dcn ) ; DataColumn dca = new DataColumn ( " a l a p b e r " ) ; dt . Columns . Add( dca ) ; } private void B e o l v a s ( ) { i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l o s e d ) sconn . Open ( ) ; scomm . CommandType = CommandType . S t o r e d P r o c e d u r e ; scomm . CommandText = " spAdatLeker " ; scomm . Parameters . Add( " beo " , SqlDbType . NVarChar , 3 0 ) ; scomm . Parameters [ " beo " ] . Value = " Segédmunkás " ; SqlDataReader dr = scomm . ExecuteReader ( ) ; while ( dr . Read ( ) ) { DataRow r = dt . NewRow ( ) ; r [ " nev " ] = dr [ 0 ] ; r [ " a l a p b e r " ] = dr [ 1 ] ; dt . Rows . Add( r ) ; } dgvAdat . DataSource = dt ; }
3.28. forráskód. Beolvasás
83
3
13. feladat: [Táblák tartalmának lekérése és megjelenítése XML-ben] Írjon programot, melynek a segítségével kapcsolódni tud a Minta adatbázishoz. Olvassa be az Alkalmazottak táblából az adatokat. Jelenítse meg DataGridView -ban. Használja az
DataTable, DataSet és az DataAdapter osztályt. Lehessen Az adatokat elmenteni egy tetsz®legesen kiválasztott helyre, egy megadott nev¶ XML-leba. Adjon lehet®séget, hogy egy XML le-ból a mentett adatokat vissza lehessen olvasni.
3.29. ábra. M¶ködés közben.
1 2
private void buttonToXML_Click ( object s e n d e r , EventArgs e )
{
3 4 5 6 7 8 9 10 11 12
}
private void buttonFromXML_Click ( object s e n d e r , EventArgs e )
{
13 14 15 16 17 18 19 20
S a v e F i l e D i a l o g s f = new S a v e F i l e D i a l o g ( ) ; s f . D e f a u l t E x t = "xml" ; i f ( s f . ShowDialog ( ) == D i a l o g R e s u l t .OK) { ds . WriteXml ( s f . FileName ) ; }
}
O p e n F i l e D i a l o g o f = new O p e n F i l e D i a l o g ( ) ; o f . D e f a u l t E x t = "xml" ; i f ( o f . ShowDialog ( ) == D i a l o g R e s u l t .OK) { ds . ReadXml ( o f . FileName ) ; dgvAdat . DataSource = ds . T a b l e s [ 0 ] ; }
3.30. forráskód. XML használata
84
5
14. feladat: [Adatbevitel] Írjon programot, melynek a segítségével kapcsolódni tud a
Minta adatbázishoz. Kérjen be egy új alkalmazott adatait, és szúrja be az új rekordot.
3.31. ábra. M¶ködés közben.
3.32. ábra. M¶ködés közben.
85
3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
using using using using using using using using using
System ; System . C o l l e c t i o n s . G e n e r i c ; System . ComponentModel ; System . Data ; System . Drawing ; System . Linq ; System . Text ; System . Windows . Forms ; System . Data . S q l C l i e n t ;
namespace adatkotes_4 {
public p a r t i a l c l a s s Form1 : Form
{
private string ConnSt = " s e r v e r=l o c a l h o s t \\MSSQL2005 ; d a t a b a s e=Minta ; u i d=s a ; pwd=master " ; private S q l C o n n e c t i o n sconn ; private SqlCommand scomm ; private DataTable dt = new DataTable ( ) ; private SqlDataAdapter da ; public Form1 ( )
{
24 25 26 27 28 29 30 31 32 33
}
InitializeComponent ( ) ; buttonCon . Text = " K a p c so l ó d á s . . . " ; sconn = new S q l C o n n e c t i o n ( ConnSt ) ; scomm = sconn . CreateCommand ( ) ; b u t t o n R o g z i t . Enabled = f a l s e ; buttonUj . Enabled = f a l s e ;
private void buttonCon_Click ( object s e n d e r , EventArgs e )
{
34
i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l o s e d )
{
35 36 37 38 39 40
}
41
el se
42
{
43 44 45 46 47 48 49
sconn . Open ( ) ; buttonCon . Text = " M e g s z a k í t á s " ; b u t t o n R o g z i t . Enabled = true ; buttonUj . Enabled = true ; Beolvas ( ) ;
}
}
sconn . C l o s e ( ) ; buttonCon . Text = " K a p c s o l ó d á s " ; b u t t o n R o g z i t . Enabled = f a l s e ; buttonUj . Enabled = f a l s e ;
3.33. forráskód. Deklaráció és kapcsolódás
86
1 2
private void B e o l v a s ( )
{
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
}
private void buttonZar_Click ( object s e n d e r , EventArgs e )
{ }
}
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
try
42
{
43 44
}
45
s c . ExecuteNonQuery ( ) ;
catch ( E x c e p t i o n ex )
46
{
47 48 49 50 51 52 53 54 55
59
string i n s = " i n s e r t i n t o Alkalmazottak v a l u e s "+
" ( @nev , @szulet_ido , @ r e s z l e g , @beosztas , "+ " @belepes , @alapber , @ n y e l v p o t l ) " ; SqlCommand s c = new SqlCommand ( i n s , sconn ) ; s c . Parameters . Add( " nev " , SqlDbType . NVarChar , 3 0 ) ; s c . Parameters [ " nev " ] . Value = textBoxNev . Text ; s c . Parameters . Add( " r e s z l e g " , SqlDbType . NVarChar , 3 0 ) ; s c . Parameters [ " r e s z l e g " ] . Value = textBoxNev . Text ; s c . Parameters . Add( " b e o s z t a s " , SqlDbType . NVarChar , 3 0 ) ; s c . Parameters [ " b e o s z t a s " ] . Value = textBoxNev . Text ; s c . Parameters . Add( " b e l e p e s " , SqlDbType . I n t ) ; s c . Parameters [ " b e l e p e s " ] . Value = numericBelep . Value ; s c . Parameters . Add( " a l a p b e r " , SqlDbType . I n t ) ; s c . Parameters [ " a l a p b e r " ] . Value = numAlapBer . Value ; s c . Parameters . Add( " s z u l e t _ i d o " , SqlDbType . DateTime ) ; s c . Parameters [ " s z u l e t _ i d o " ] . Value = dateTimePicker1 . Value ; s c . Parameters . Add( " n y e l v p o t l " , SqlDbType . B i t ) ; s c . Parameters [ " n y e l v p o t l " ] . Value = cbNyelvP . Checked ; i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l o s e d ) sconn . Open ( ) ;
25
58
tabControl1 . SelectTab ( 1 ) ;
private void b u t t o n R o g z i t _ C l i c k ( object s e n d e r , EventArgs e )
{
24
57
Close ( ) ;
private void buttonUj_Click ( object s e n d e r , EventArgs e )
{
23
56
i f ( sconn . S t a t e == C o n n e c t i o n S t a t e . C l o s e d ) sconn . Open ( ) ; scomm . CommandType = CommandType . Text ; scomm . CommandText = " s e l e c t ∗ from Alkalmazottak o r d e r by nev " ; da = new SqlDataAdapter ( scomm ) ; dgvAdat . DataSource = dt ; da . F i l l ( dt ) ;
} } }
MessageBox . Show ( " Hiba az a d a t r ö g z í t é s b e n . " + ex . Message , " Hiba " , MessageBoxButtons .OK, MessageBoxIcon . E r r o r ) ;
} dgvAdat . DataSource = null ; dt . Columns . C l e a r ( ) ; dt . Rows . C l e a r ( ) ; Beolvas ( ) ; dgvAdat . DataSource = dt ; tabControl1 . SelectTab ( 0 ) ;
87 3.34. forráskód. Rögzítés
3.4. Tárolt eljárások írása és használata 15. feladat: [Átmeneti tábla lekérdezéssel] Írjon tárolt eljárást, mely az Alkalma-
zottak minta táblából kiválogatja a szakmunkások nevét és alapbérét, és ezt egy szaki nev¶ táblába tárolja el, és végül kilistázza. 1 2 3 4 5 6 7 8
2
CREATE PROCEDURE [ dbo ] . [ s p T a r o l t 1 ] AS BEGIN s e l e c t nev , a l a p b e r i n t o s z a k i from Alkalmazottak where b e o s z t a s = ' Szakmunkás ' s e l e c t ∗ from s z a k i o r d e r by nev END
3.35. forráskód. Átmeneti tábla 16. feladat: [Automatikus kulcsérték visszakérése] Írjon tárolt eljárást, mely az
Alkalmazottak minta táblába beszúr egy új rekordot, majd visszaadja az új rekord els®dlegeges kulcs értékét. Az els®dleges kulcs érték automatikusan generálódik. 1 2 3 4 5 6 7 8
CREATE PROCEDURE [ dbo ] . [ s p T a r o l t 2 ] ( @azon int output ) AS BEGIN i n s e r t i n t o Alkalmazottak ( nev , a l a p b e r , n y e l v p o t l ) v a l u e s ( ' K i s s Ádám' , 1 4 5 0 0 0 , 1 )
9
SELECT @azon = @@Identity ;
10 11 12
2
END
3.36. forráskód. @@Identity
Magyarázat: Figyeljen arra, hogy hogyan lehet a tárolt eljárást futtani, helyes paraméter használattal. 1 2 3
d e c l a r e @i int e x e c s p T a r o l t 2 @azon = @i output s e l e c t i = @i
3.37. forráskód. Paraméteres futtatás
88
17. feladat: [Kurzor használata] Írjon tárolt eljárást, mely az Alkalmazottak minta táblában megemeli az alkalmazottak zetését. Ha egy alkalmazott az átlagnál ke-
5
vesebbet keres, akkor 20%-al, míg ha többet, akkor 10%-al. A feladat megoldásához használjon kurzort.
Magyarázat: A kurzor deklarációja és használata egyszer¶. Használat után ne felejtse el bezárni és felszabadítani. Tartsa szem el®tt, hogy a kurzor használata lassú folyamat! 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
CREATE PROCEDURE [ dbo ] . [ s p T a r o l t 3 ] AS BEGIN d e c l a r e @atl f l o a t d e c l a r e @alapber f l o a t d e c l a r e @tsz int d e c l a r e @emel f l o a t d e c l a r e cur_alk c u r s o r for s e l e c t a l a p b e r , t o r z s s z a m from Alkalmazottak s e l e c t @atl = avg ( a l a p b e r ) from Alkalmazottak open cur_alk ; f e t c h next from cur_alk i n t o @alapber , @tsz while @@fetch_status = 0 begin i f @alapber < @atl s e t @emel = 20 e ls e s e t @emel = 10 update Alkalmazottak s e t a l a p b e r = ( 1 + @emel / 1 0 0 ) ∗ a l a p b e r where t o r z s s z a m = @tsz f e t c h next from cur_alk i n t o @alapber , @tsz end c l o s e cur_alk ; d e a l l o c a t e cur_alk ; END
3.38. forráskód. Kurzor használata
89
18. feladat: [Vezérlési szerkezetek 1] Írjon tárolt eljárást, amely kiírja a Fibonaccisorozat els® 10 elemét (0,1,1,2,3,...). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
2
CREATE PROCEDURE [ dbo ] . [ s p T a r o l t 4 ] AS BEGIN d e c l a r e @fib1 int d e c l a r e @fib2 int d e c l a r e @ u j f i b int d e c l a r e @i int s e t @fib1 = 0 s e t @fib2 = 1 s e t @i = 1 p r i n t @fib1 p r i n t @fib2 while @i < 9 begin s e t @i = @i + 1 s e t @ u j f i b = @fib1 + @fib2 print @ujfib s e t @fib1 = @fib2 s e t @fib2 = @ u j f i b end END
3.39. forráskód. Vezérlési szerkezet 19. feladat: [Legnagyobb különbség] Írjon tárolt eljárást, mely a felhasználó által megadott részlegnél kiszámítja a legnagyobb zetési különbséget. 1 2 3 4 5 6 7
CREATE PROCEDURE [ dbo ] . [ s p T a r o l t 5 ] ( @reszleg nvarchar ( 3 0 ) ) AS BEGIN s e l e c t max( a l a p b e r ) − min ( a l a p b e r ) from Alkalmazottak where r e s z l e g = @ r e s z l e g END
3.40. forráskód. Egy ötlet bejárás nélkül
Magyarázat: Figyeljen a paraméteres futtatásra 1
e x e c s p T a r o l t 5 @ r e s z l e g = ' Rendészet '
3.41. forráskód. Paraméteres futtatás
90
2
Irodalomjegyzék [1]
Iványi Antal alkotó szerkeszt®: Informatikai Algoritmusok I., 2004, ELTE Eötvös Kiadó.
[2]
Aszalós László: Algoritmusok mobiDIÁK könyvtár, 2004, Debreceni Egyetem, Informatikai Kar Sorozatszerkeszt®: Fazekas István.
[3]
Marton László, Fehérvári Ágnes: Algoritmusok és Adatstruktúrák, 2001, Sokszorosítva: SZIF-Universitas Kft.
[4]
Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Cliord Stein: Új Algorit-
musok Iványi Antal alkotó szerkeszt®, Scolar Kiadó, 2003, ISBN: 963 9193 90 9
91