Jump to content

მოგესალმებით, კეთილი იყოს თქვენი მობრძანება, ვიმედოვნებ ჩვენი აქტიური წევრი იქნები, ჩვენს  ფორუმი 2012 წლიდან მოდის, წლების განმავლობაში დაგროვილი ლინკები ხშირ შემთხვევაში მკვდარი იქნება, მაგრამ ჩვენს საიტზე  ხელს ნუ ჩაიქნევ , შემოდი და შენც მიიღე მონაწილება მის შექმნაში. მადლობა.

 

Search the Community

Showing results for tags 'C#'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • ფორუმი
    • ფორუმი
    • ზოგადი დისკუსიები
    • ტუტორიალი/Tutorial
    • მათემატიკა
    • ბიბლიოთეკა
    • კრიპტოგრაფია
    • კიბერ უსაფრთხოება
    • ელექტროინჟინერია
    • Jortsoft
  • პროგრამები
    • დიზანის & 3D მოდელირება
    • პროგრამები/ software
    • დაცვა
  • Visual Studio
    • Visual Studio
    • C#
    • C და C++
    • ASP.NET/WPF/MVC
    • WCF
    • Quick Basic / Visual Basic
  • Web Development
    • HTML & CSS
    • Bootstrap
    • PHP & MySQL
    • Javascript
    • AngularJS
    • სხვადასხვა
    • SEO
    • ძრავების მიმოხილვა
  • Development
    • Android Developert
    • JAVA
    • Perl
    • Python
    • ბაზები
    • Other
    • Game Developer
    • მობილურის დეველოპერი
  • IT-Support
    • Unix/Linux
    • MS Windows
    • Apple /MAC
    • Android
    • Network
    • კომპიუტერის არქიტექტურა
  • ყიდვა-გაყიდვა/შეკვეთები
    • ყიდვა-გაყიდვა
    • შეკვეთები

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


AIM


MSN


Website URL


ICQ


Yahoo


Jabber


Skype


ლოკაცია


ინტერესები

Found 31 results

  1. სათაური: C# Attribute კატეგორია: C# თარითი: 2016-04-06 ავტორი: GHOST_FATHER C# ატრიბუტების მაგალითები C# Attribute
  2. სათაური: შესავალი პროგრამირებაში c# 02 კატეგორია: C# თარითი: 2016-01-21 ავტორი: GHOST_FATHER შესავალი პროგრამირებაში c# 02
  3. სათაური: შესავალი პროგრამირებაში c# 01 კატეგორია: C# თარითი: 2016-01-21 ავტორი: GHOST_FATHER ყველასთვის ნათელია, რომ ინგლისური ენის ცოდნა ბევრ რამეში შეიძლება გამოადგეს ადამინას, მაგილათად კარიერულ წინსვლაში. ზოგიერთი პროფესიის ადამიანისათვის ინგლისურის ცოდნა სამსახურეობრივ აუცილებლობასაც კი წარმოადგენს. უამრავ ინგლისურ ტერმინს ვიყენებთ, შესაბამისად ენის ცოდნა ასეთ ტერმინებთან მუშაობას აადვილებს. მაგრამ, იქნებ, დღეს ყველაზე მეტად კომპიუტერული ენების შესწავლის დროა? იმ საქმის დიდი ნაწილს რომელსაც წარსულში ადამიანი ასრულებდა, დღეს კომპიუტერი აკეთებს. ვინღა აწარმოებს გამოთვლებს კომპიუტერების ეპოქაში, ამას ხომ ჩვენს მაგივრად კომპიუტერები აკეთებან. სავარაუდოდ ის რაშიც დღეს ადამიანების დახმარება გვჭირდება მომავალში კომპიუტერების საზრუნავი იქნება. შესაბამიად პროაგრამული კოდის ცოდნა ან მის ფუნქციონირების პრინციპებში გარკვევა დროთა განმავლობაში კიდევ უფრო მნიშვნელოვანი გახდება. თუკი დღეს კომპიუტერთან სხვადასხვა პროგრამების ღილაკებსა და მენიუს კომპონენტებზე მიჭერით ვურთიერთობთ მომავალში დაგვჭირდება კომპიუტერთან საურთიერთო ენის ცოდნა რათა კომპიუტერულ ტექნიკასთან მისსავე ენაზე ველაპარაკოთ და უფრო კომპლექსური, რთული დავალების მიცემა შევძლოთ. კურსის მიზანია გააცნოს მსმენელბს პროგრამულ კოდთან მუშაობის საწყისები და ობიექტზე ორიენტირებული პროგრამირების თავისებურებანი. კურსის განმავლობაში თეორიული მეცადინეობების გარდა გათვალისწინებულია პრაქტუკული დავალებები, რომლის ფარგლებშიც მსმენელები თავად შექმნიან კომპიუტერულ პროგრამას რომელშიც მომხარებელთან ინტერაქცია იქნება გათვალისქინებული. კურსი საინტერესო იქნება როგორც მათთის ვისაც სურს დაეუფლოს პროგრამირებას ასევე მათთვის ვინც მომავალში გეგემავს IT პროექტების მართვას. მათ შეეძლებათ ზუსტად და პროგრამისტებისათვის გასაგებად დაგეგმონ IT პროექტები. ლექტორი: ალექსი ამნიაშვილი პრეზენტაციის ლინკი: https://docs.google.com/presentation/... შესავალი პროგრამირებაში c# 01
  4. მოგესალმებით, ბიჭებო მოკლედ ესეთი რაღაც გავაკეთოთ... ვიფიქრე და ყველაზე პრაქტიკული გადაწყვეტილება მაინც როდესაც ვინმეს, მაგალითად ლომბარდს პროგრამას უწერ, რომელიც მხოლოდ ლოკალურად მუშაობს ანუ ერთი ოფისი აქვს ბაზის მხარის გაკეთება სად უფრო იოლი და ხარისხიანი იქნებოდა. Access ან სერვერების დასტარტვას და ასე შემდეგ SQLite ის გამოყენება ვამჯობინე, თქვენი აზრიც დაწერეთ. ვამჯობინე იმიტომ რომ პროგრამას გახსნისას ბაზა დაიქოქება და ერთი ბაზის ფაილს შექმნის ფოლდერშივე. და შემდეგ იქ ხდება ქონექშენი. ანუ მე SQLite ვამჯობინე ამ შემთხვევისთვის, რადგან თავიდან ავიცილო ზედმეტი წვალება სერვერის მოქოქვა და ასე შემდეგ და თუ უკეთესი იდია იცით დაწერეთ. ასევე მოვიძიოთ სორსები და დავყაროთ აქ როგორ ხდება აპპიდან SQLite ბაზასთან მუშაობა
  5. ესაა ჩემი დაწერილი 3D 2048. რაღაც კონკურსისთვის დავწერე მარა ვერ გავიმარჯვე და თქვენ მაინც ითამაშეთ და შეაფასეთ wpf-ის 3D ძრავითაა. (ჩემი მეცხრე სიმფონიაა ჯერჯერობით ) link : http://bin.ge/dl/158496/3d-2048.exe.html
  6. ამწუთას ჩამოვტვირთე ბახტაძის წიგნი. მაინტერესებს ღირს თუ არა ამ წიგნით სწავლა დამწყებისთვის, და არის თუ არა რაიმე ვიდეომასალა ქართულ ენაზე სწავლაში, რომ დამეხმაროს. თან არ ვიცი არცერთი პროგრამული ენა და ღირს თუ არა პირდაპირ C#-ით დაწყება?
  7. გამარჯობათ, ამ თემაში ჩვენ განვიხილავთ c#-ში მრავალნაკადიანობას. მრავალნაკადიანობის მხარდაჭერით შესაძლებელია კოდის სხვადასხვა ნაწილები ვამუშაოთ პარალელურად. C#-ის კლიენტი (Console, WPF, Windows Forms) იწყება ერთ ნაკადში, რომელიც ავტომატურად იქმნება CLR-ისა და ოპერატიული სისტემის მიერ (ე.წ. “მთავარი ნაკადი”) და ამის შემდეგ პროგრამის მიერ ხდება სხვა დამატებითი ნაკადების შექმნა. განვიხილოთ მარტივი მაგალითი: არ დაგავიწყდეთ, რომ ქვემოთ მოყვანილ ყველა მაგალითს წინ წამძღვარენული აქვს შემდეგი სახელსივრცეები: using System; using System.Threading; class ThreadTest { static void Main() { Thread t = new Thread (WriteY); // ახალი ნაკადის შექმნა t.Start(); // ნაკადის დაწყება // პარალელურად იგივეს ვაკეთებთ მთავარ ნაკადში for (int i = 0; i < 1000; i++) Console.Write ("x"); } static void WriteY() { for (int i = 0; i < 1000; i++) Console.Write ("y"); } } მთავარი ნაკადი ქმნის ახალ ნაკად t-ს, რომელიც იწყებს “y” სიმბოლოს დაბეჭდვას, ამასთანავე მთავარი ნაკადი პარალელურად წერს “x” სიმბოლოს: როდესაც ნაკადი მუშაობას იწყებს, მის IsAlive თვისებას ენიჭება true მნიშვნელობა, სანამ ნაკადი შეწყვეტდეს მუშაობას. ნაკადი მაშინ ჩერდება, როდესაც ნაკადის კონსტრუქტორისთვის გადაცემული დელეგატი დაამთავრებს მუშაობას. როდესაც ნაკადს მუშაობა დამთავრებული აქვს ის ვეღარ “გაცოცხლდება”. CLR ყოველ ნაკადს ანიჭებს ცალკე სტეკს, ამიტომ ლოკალური ცვლადები ცალკე ინახება. შემდეგ მაგალითში ჩვენ განვსაზღვრავთ მეთოდს ლოკალური ცვლადით და შემდგომ ამ მეთოდს ვიძახებთ მთავარ და ახალ შექმნილ ნაკადებში: static void Main() { new Thread (Go).Start(); // Go() - ს გამოძახება ახალ ნაკადში Go(); // Go() - ს გამოძახება მთ ავარ ნაკად ში } static void Go() { for (int cycles = 0; cycles < 5; cycles++) Console.Write ('?'); } ციკლში არსებული cycles ცვლადი არის ისევე, როგორც მთავარი ნაკადის მეხსიერებაში, ასევე ცალკე ახლადშექმნილ ნაკადში, ამიტომაც არის 10 კითხვის ნიშანი 5-ის მაგივრად. ნაკადები მხოლოდ მაშინ იზიარებენ მონაცემს, როდესაც მათ აქვთ საერთო რეფერენსი(ლინკი) ობიექტზე, მაგალითად: class ThreadTest { bool done; static void Main() { ThreadTest tt = new ThreadTest(); // ეგზემპლარის შექმნა new Thread (tt.Go).Start(); // ნაკადის შექმნა და გაშვება tt.Go(); } void Go() { if (!done) { done = true; Console.WriteLine ("Done"); } } } რადგან ორივე ნაკადი იძახებს Go() ფუნქციას რომელებიც ეკუთვნიან ერთსა და იმავე ThreadTest კლასის ეგზემპლარს, ამიტომ ისინი იზიარებენ done ცვლადს. სწორედ ამიტომ სიტყვა “Done” იწერება ერთხელ და არა ორჯერ: არსებობს ასევე ნაკადებს შორის მონაცემთა გაზიარების სხვა გზაც სტატიკური ცვლადების საშუალებით. იხილეთ ქვევით მოყვანილი მაგალითი: class ThreadTest { static bool done; // სტატიკურ ცვლადებთან წვდომა გვაქვს ყველა ნაკადში static void Main() { new Thread (Go).Start(); Go(); } static void Go() { if (!done) { done = true; Console.WriteLine ("Done"); } } } ორივე ეს მაგალითი უსვამს ხაზს თუ როგორი მნიშვნელოვანია thread safety(ამას შემდეგ განვიხილავთ). ორივე მაგალითში შედეგს წინასწარ ვერ განვსაზღვრავთ. შესაძლებელია, რომ სიტყვა “Done” ორჯერ დაიბეჭდოს. ჩვენ შეგვიძლია ბრძანებათა წყობა შევცვალოთ Go ფუნქციაში და უფრო ნათლად დავინახავთ ამ პრობლემას. static void Go() { if (!done) { Console.WriteLine ("Done"); done = true; } } პრობლემა არის ის რომ სანამ ერთი ნაკადი done - ს მიანიჭებს true-ს, მანამდე მეორე ასრულებს console.writeline(done)-ს. ამ პრობლემის გადაჭრა შესაძლებელია lock ბრძანებით: class ThreadSafe { static bool done; static readonly object locker = new object(); static void Main() { new Thread (Go).Start(); Go(); } static void Go() { lock (locker) { if (!done) { Console.WriteLine ("Done"); done = true; } } } } ამ შემთხვევაში სანამ ერთი ნაკადი ასრულებს ამ კოდს: if (!done) { Console.WriteLine ("Done"); done = true; } , მეორე ვერ დაიწყებს მის შესრულებას. შედეგად done დაიბეჭდება ერთხელ. კოდს, რომელიც ასეა დაცული ეწოდება : thread-safe. Join და sleep ნაკადში შეგვიძლია დავუცადოთ სხვა ნაკადის დასრულდებას join მეთოდის გამოძახებით. static void Main() { Thread t = new Thread (Go); t.Start(); t.Join(); Console.WriteLine ("ნაკადი დასრულდა!"); } static void Go() { for (int i = 0; i < 1000; i++) Console.Write ("y"); } ეს კოდი დაბეჭდავს y-ს 1000-ჯერ და მხოლოდ t ნაკადის დასრულების შემდეგ დაბეჭდავს „ნაკადიდ ასრულდა“. Join-ში ასევე შეგვიძლია გადავცეთ დრო, რომელშიც უნდა დასრულდეს ნაკადი. თუ ამ დროში დასრულდება ფუნქცია დააბრუნებს true-ს. ფუნქცია Thread.sleep აპაუზებს მოცემულ ნაკადს გარკვეული დროით. Thread.Sleep (TimeSpan.FromHours (1)); // აპაუზებს 1 საათით Thread.Sleep (500); // აპაუზებს 500 მილ იწამით . თუ ნაკადი იმყოფება join ან sleep მდგომარეობაში, ის დაბლოკილია და არ მოიხმარს პროცესორის რესურსებს. P.S. Thread.sleep(0) - ამ შემთხვევაში დრო ნულია, მაგრამ ნაკადი მაინც ჩერდება რადგან ირთვება ეგრეთწოდებული Time slicing, ანუ პროცესორი გადავა სხვა ნაკადის შესრულებაზე, რომელიც რიგში დგას. იგივეს აკეთებს მეთოდი Thread.Yield(), იმ განსხვავებით რომ ამ შემთხვევაში ნაკადი ადგილს უთმობს მხოლოდ იმ ნაკადს რომელიც იგივე პროცესორზე სრულდება. ინგლისური წყარო ზემოთ დასახელებული წყაროდან ნათარგმნია თაზო ბაღდავაძის მიერ, სპეციალურად ScriptS.GE-სთვის!
  8. ესაა ჩემი დაწერილი Task Manager. ჯერ დაუმთავრებელია,ბევრი რაღაცაა გასაკეთებელი და შესაცვლელი, მაგრამ მგონი რაღაცა გამოდის run as admin-ით უნდა ჩაირთოს. პროგრამის ლინკი: http://bin.ge/dl/136574/taskmgr.zip.html
  9. პროგრამირების ქართული ვიდეოგაკვეთილების საიტის გაკეთებას ვაპირებთ და რომელ ენების გაკვეთილების დადებას მირჩევთ?
  10. ესაა ჩემი დაწერილი ტეტრისი, ყველაზე კარგი გადაწყვეტა არაა მარა მაინც გამოდგება namespace tetrisi { internal class _1122 : figura { internal _1122() : base() // X - shesamowmebeli { recs[0].x = 150 - 150 % figura.zoma; // X 2 3 recs[0].y = recs[1].y = -1 * figura.zoma; // 0 1 X recs[1].x = recs[0].x + figura.zoma; // X X recs[2].x = recs[1].x; recs[3].y = recs[2].y = -2 * figura.zoma; recs[3].x = recs[2].x + figura.zoma; } internal override void brunva(ref bool[,] m) { switch (dir) { case Dirs.pirveli: { if (recs[1].y + figura.zoma > 380) return; foreach (var r in recs) if (r.x < 0 || r.y < 0) return; if (m[recs[3].y, recs[0].x] || m[recs[1].y+figura.zoma, recs[1].x] || m[recs[1].y+figura.zoma, recs[1].x + figura.zoma] || m[recs[1].y, recs[1].x + figura.zoma] ) return; this.recs[2].x -= figura.zoma; // 2 X X this.recs[3].y += (2*figura.zoma); // 0 1 X this.recs[3].x -= figura.zoma; // 3 X this.dir = Dirs.meore; } break; case Dirs.meore: { if (recs[1].x + figura.zoma > 380) return; foreach (var r in recs) if (r.x < 0 || r.y < 0) return; if (m[recs[2].y, recs[1].x] || m[recs[2].y, recs[1].x+figura.zoma] || m[recs[3].y, recs[3].x+figura.zoma] || m[recs[1].y , recs[1].x+figura.zoma] ) return; this.recs[3].x += figura.zoma; this.recs[3].y -= (2 * figura.zoma); this.recs[2].x += figura.zoma; this.dir = Dirs.pirveli; } break; default: break; } } } } namespace tetrisi { internal class _121 : figura // { internal _121() : base() // X - shesamowmebeli { recs[0].x = 150 - 150 % figura.zoma; // X 3 X recs[0].y = recs[1].y = recs[2].y = -1 * figura.zoma; // 0 1 2 recs[1].x = recs[0].x + figura.zoma; // X X X recs[2].x = recs[1].x + figura.zoma; recs[3].y = -2 * figura.zoma; recs[3].x = recs[0].x + figura.zoma; } internal override void brunva(ref bool[,] m) { switch (dir) { case Dirs.pirveli: { if (recs[2].y + figura.zoma > 380) return; foreach (var r in recs) if (r.x < 0 || r.y < 0) return; //try //{ if ( m[recs[3].y, recs[0].x] || m[recs[3].y, recs[2].x] || m[recs[1].y - figura.zoma, recs[1].x + figura.zoma] || m[recs[1].y - figura.zoma, recs[1].x - figura.zoma] || m[recs[1].y - figura.zoma, recs[1].x] ) return; //} //catch //{ // return; //} this.recs[2].x -= (2 * figura.zoma); // 3 X X this.recs[2].y += figura.zoma; // 0 1 this.recs[3].x -= figura.zoma; // 2 X this.dir = Dirs.meore; } break; case Dirs.meore: { if (recs[1].x + figura.zoma > 380) return; foreach (var r in recs) if (r.x < 0 || r.y < 0) return; if (m[recs[2].y, recs[1].x] || m[recs[3].y, recs[1].x] || m[recs[3].y , recs[1].x+figura.zoma] ) return; this.recs[0].x += figura.zoma; // 3 0 2 this.recs[0].y -= figura.zoma; // X 1 X this.recs[2].x += (2*figura.zoma); // X this.recs[2].y -= (2 * figura.zoma); this.dir = Dirs.mesame; } break; case Dirs.mesame: { if (recs[1].y + figura.zoma > 380) return; foreach (var r in recs) if (r.x < 0 || r.y < 0) return; if (m[recs[1].y, recs[2].x] || m[recs[1].y, recs[3].x] || m[recs[1].y + figura.zoma, recs[2].x] ) return; this.recs[0].x += figura.zoma; this.recs[0].y += figura.zoma; // X 2 this.recs[3].x += (2 * figura.zoma); // 1 0 this.recs[3].y += (2 * figura.zoma); // X X 3 this.dir = Dirs.meotxe; } break; case Dirs.meotxe: { if (recs[1].y - figura.zoma < 0) return; foreach (var r in recs) if (r.x < 10 || r.y < 0) return; if (m[recs[3].y , recs[1].x] || m[recs[3].y , recs[1].x-figura.zoma] || m[recs[2].y , recs[1].x] ) return; this.recs[0].x -= (2*figura.zoma); this.recs[2].y += figura.zoma; this.recs[3].x -= figura.zoma; this.recs[3].y -= (2*figura.zoma); this.dir = Dirs.pirveli; } break; default: break; } } } } namespace tetrisi { internal class _13 : figura // { internal _13() : base() // X - shesamowmebeli { recs[0].x = recs[1].x = recs[2].x = 150 - 150 % figura.zoma; // X 0 X recs[0].y = -3 * figura.zoma; // X 1 X recs[1].y = -2 * figura.zoma; // 3 2 recs[2].y = recs[3].y = -1 * figura.zoma; recs[3].x = recs[0].x - figura.zoma; } internal override void brunva(ref bool[,] m) { switch (dir) { case Dirs.pirveli: { if (recs[0].x + figura.zoma > 380) return; foreach (var r in recs) if (r.x < 0 || r.y < 0) return; if (m[recs[0].y, recs[0].x + figura.zoma] || m[recs[0].y, recs[0].x - figura.zoma] || m[recs[1].y, recs[1].x + figura.zoma] || m[recs[1].y, recs[1].x - figura.zoma] ) return; this.recs[1].x += figura.zoma; // 0 X this.recs[0].x -= figura.zoma; // 2 3 1 this.recs[2].x -= figura.zoma; // X X X this.recs[2].y -= figura.zoma; this.recs[3].x += figura.zoma; this.recs[3].y -= figura.zoma; this.dir = Dirs.meore; } break; case Dirs.meore: { if (recs[2].y + figura.zoma > 380) return; foreach (var r in recs) if (r.x < 0 || r.y < 0) return; if (m[recs[0].y, recs[0].x + figura.zoma] || m[recs[3].y + figura.zoma, recs[3].x] || m[recs[2].y + figura.zoma, recs[2].x] || m[recs[1].y + figura.zoma, recs[1].x] ) return; this.recs[1].x -= figura.zoma; // 0 1 X this.recs[1].y -= figura.zoma; // 2 X X this.recs[3].x -= figura.zoma; // 3 this.recs[3].y += figura.zoma; this.dir = Dirs.mesame; } break; case Dirs.mesame: { if (recs[1].x + figura.zoma > 380) return; foreach (var r in recs) if (r.x < 0 || r.y < 0) return; if (m[recs[1].y, recs[1].x + figura.zoma] || m[recs[2].y, recs[1].x] || m[recs[2].y, recs[1].x + figura.zoma] ) return; this.recs[2].x += (2 * figura.zoma); this.recs[2].y -= figura.zoma; // 0 1 2 this.recs[3].x += (2 * figura.zoma); // X 3 this.recs[3].y -= figura.zoma; // X X X this.dir = Dirs.meotxe; } break; case Dirs.meotxe: { if (recs[3].y + figura.zoma > 380) return; foreach (var r in recs) if (r.x < 0 || r.y < 0) return; if (m[recs[3].y + figura.zoma, recs[3].x] || m[recs[1].y + figura.zoma, recs[1].x] || m[recs[3].y + figura.zoma, recs[0].x] || m[recs[3].y + figura.zoma, recs[1].x] ) return; this.recs[0].x += figura.zoma; this.recs[1].y += figura.zoma; this.recs[2].x -= figura.zoma; this.recs[2].y += (2 * figura.zoma); this.recs[3].x -= (2*figura.zoma); this.recs[3].y += figura.zoma; this.dir = Dirs.pirveli; } break; default: break; } } } } namespace tetrisi { internal class _2211 : figura { internal _2211() : base() // X - shesamowmebeli { recs[0].x = 150 - 150 % figura.zoma; // 0 1 X recs[0].y = recs[1].y = -2 * figura.zoma; // X 2 3 recs[1].x = recs[0].x + figura.zoma; // X X X recs[2].x = recs[1].x; recs[3].y = recs[2].y = -1 * figura.zoma; recs[3].x = recs[2].x + figura.zoma; } internal override void brunva(ref bool[,] m) { switch (dir) { case Dirs.pirveli: { if (recs[2].y + figura.zoma > 380) return; foreach (var r in recs) if (r.x < 0 || r.y < 0) return; if (m[recs[3].y, recs[0].x] || m[recs[1].y, recs[1].x + figura.zoma] || m[recs[2].y + figura.zoma, recs[2].x ] || m[recs[2].y + figura.zoma, recs[3].x] || m[recs[2].y + figura.zoma, recs[0].x] ) return; this.recs[0].y += figura.zoma; // X 1 X this.recs[3].y += figura.zoma; // 0 2 X this.recs[3].x -= (2 * figura.zoma); // 3 this.dir = Dirs.meore; } break; case Dirs.meore: { if (recs[1].x + figura.zoma > 380) return; foreach (var r in recs) if (r.x < 0 || r.y < 0) return; if (m[recs[1].y, recs[0].x] || m[recs[1].y, recs[1].x + figura.zoma] || m[recs[2].y, recs[2].x + figura.zoma] ) return; this.recs[3].x += (2 * figura.zoma); this.recs[3].y -= figura.zoma; this.recs[0].y -= figura.zoma; this.dir = Dirs.pirveli; } break; default: break; } } } } namespace tetrisi { internal class _31 : figura { internal _31() : base() // X - shesamowmebeli { recs[0].x = recs[1].x = recs[2].x = 150 - 150 % figura.zoma; // 0 X X recs[0].y = -3*figura.zoma; // 1 X recs[1].y = -2*figura.zoma; // 2 3 recs[2].y = recs[3].y = -1*figura.zoma; recs[3].x = recs[0].x+figura.zoma; } internal override void brunva(ref bool[,] m) { switch (dir) { case Dirs.pirveli: { if (recs[0].x + 2 * figura.zoma > 380) return; foreach (var r in recs) if (r.x < 0 || r.y < 0) return; if (m[recs[0].y, recs[0].x + figura.zoma] || m[recs[0].y, recs[0].x + 2 * figura.zoma] || m[recs[1].y, recs[1].x + figura.zoma]) return; this.recs[1].x += figura.zoma; // 0 1 2 this.recs[1].y -= figura.zoma; // 3 X X this.recs[2].x += (2 * figura.zoma); // X X this.recs[2].y -= (2 * figura.zoma); this.recs[3].x -= figura.zoma; this.recs[3].y -= figura.zoma; this.dir = Dirs.meore; } break; case Dirs.meore: { if (recs[2].y + 2 * figura.zoma > 380) return; foreach (var r in recs) if (r.x < 0 || r.y < 0) return; if (m[recs[3].y, recs[3].x + figura.zoma] || m[recs[3].y, recs[3].x + 2 * figura.zoma] || m[recs[2].y+2*figura.zoma, recs[2].x] || m[recs[2].y + 2 * figura.zoma, recs[2].x- figura.zoma] ) return; this.recs[2].x -= figura.zoma; // 0 1 X this.recs[2].y += figura.zoma; // X 2 X this.recs[3].x += figura.zoma; // X 3 this.recs[3].y += figura.zoma; this.dir = Dirs.mesame; } break; case Dirs.mesame: { if (recs[1].x + figura.zoma > 380) return; foreach (var r in recs) if (r.x < 0 || r.y < 0) return; if (m[recs[3].y, recs[3].x - figura.zoma] || m[recs[2].y, recs[3].x - figura.zoma] || m[recs[2].y, recs[2].x+figura.zoma] || m[recs[1].y,recs[1].x+figura.zoma] ) return; this.recs[0].y += figura.zoma; // X 2 this.recs[1].y += figura.zoma; // 0 1 3 this.recs[2].x += figura.zoma; // X X X this.recs[2].y -= figura.zoma; this.recs[3].x += figura.zoma; this.recs[3].y -= figura.zoma; this.dir = Dirs.meotxe; } break; case Dirs.meotxe: { if (recs[3].y + figura.zoma > 380) return; foreach (var r in recs) if (r.x < 0 || r.y < 0) return; if (m[recs[3].y+figura.zoma, recs[3].x] || m[recs[1].y+figura.zoma, recs[1].x] || m[recs[0].y+figura.zoma, recs[2].x] || m[recs[0].y - figura.zoma, recs[2].x] ) return; this.recs[0].y -= figura.zoma; this.recs[1].x -= figura.zoma; this.recs[2].x -= (2 * figura.zoma); this.recs[2].y += (2 * figura.zoma); this.recs[3].x -= figura.zoma; this.recs[3].y += figura.zoma; this.dir = Dirs.pirveli; } break; default: break; } } } } namespace tetrisi { /// <summary> /// მიმართულება /// </summary> public enum Dirs : byte { pirveli = 1, meore = 2, mesame = 3, meotxe = 4 } } using System.Drawing; namespace tetrisi { static class Fig_funcs { static Pen pen = new Pen(Color.Gold, figura.zoma / (figura.zoma / 2)), pen_washlis = new Pen(Color.White, figura.zoma / (figura.zoma / 2)); public static void daxatva(this figura fig,ref Brush funji, ref Graphics g) { foreach (var i in fig.recs) { g.DrawRectangle(pen, i.x, i.y, figura.zoma, figura.zoma); g.FillRectangle(funji, i.x + figura.zoma / (figura.zoma / 2), i.y + figura.zoma / (figura.zoma / 2), figura.zoma - figura.zoma / (figura.zoma / 2), figura.zoma - figura.zoma / (figura.zoma / 2)); } } public static void washla(this figura fig,ref Graphics g) { foreach (var i in fig.recs) { g.DrawRectangle(pen_washlis, i.x, i.y, figura.zoma, figura.zoma); g.FillRectangle(Brushes.White, i.x, i.y, figura.zoma, figura.zoma); } } public static void vardna(this figura fig) { for (int i = 0; i < 4; i++) fig.recs.y += figura.zoma; } /// <summary> /// მარცხნივ გადაწევა /// </summary> public static void svla_l(this figura fig, ref bool[,] xazebi) { for (int i = 0; i < 4; i++) { if (fig.recs.x == 0 || (fig.recs.y > 0 && xazebi[fig.recs.y, fig.recs.x - figura.zoma])) { return; } } for (int i = 0; i < 4; i++) { fig.recs.x -= figura.zoma; } } /// <summary> /// მარჯვნივ გადაწევა /// </summary> public static void svla_r(this figura fig, ref bool[,] xazebi) { for (int i = 0; i < 4; i++) { if (fig.recs.x == 400 - figura.zoma || (fig.recs.y > 0 && xazebi[fig.recs.y, fig.recs.x + figura.zoma])) { return; } } for (int i = 0; i < 4; i++) { fig.recs.x += figura.zoma; } } } } namespace tetrisi { // [Synchronization] internal class figura // : ContextBoundObject { protected internal static int zoma = 20; /// <summary> /// მიმართულება /// </summary> internal Dirs dir; internal figura() { this.dir = Dirs.pirveli; } /// <summary> /// აქ ინახება კოორდინატები /// </summary> internal Rec[] recs = {new Rec(0,0),new Rec(0,0),new Rec(0,0),new Rec(0,0)}; internal virtual void brunva(ref bool[,] m){} } } namespace tetrisi { internal class Kvadrati : figura { internal Kvadrati() : base() { recs[0].x = recs[2].x = 150 - 150 % figura.zoma; recs[0].y = recs[1].y = -2 * figura.zoma; recs[1].x = recs[3].x = recs[0].x + figura.zoma; recs[3].y = recs[2].y = recs[0].y + figura.zoma; } } } namespace tetrisi { internal struct Rec { private int X, Y; internal Rec(int X, int Y) { this.X = X; this.Y = Y; } internal int x { get { return X; } set { X = value; } } internal int y { get { return Y; } set { Y = value; } } } } namespace tetrisi { internal class Sveti : figura { internal Sveti() : base() { recs[0].y = recs[1].y = recs[2].y = recs[3].y = -2 * (figura.zoma); recs[0].x = 150 - 150 % figura.zoma; recs[1].x = recs[0].x + figura.zoma; recs[2].x = recs[1].x + figura.zoma; recs[3].x = recs[2].x + figura.zoma; } internal override void brunva(ref bool[,] m) { switch (dir) { case Dirs.pirveli: { if (recs[0].y + (3 * figura.zoma) > 380) return; for (int i = recs[0].x; i < recs[0].x + 4 * figura.zoma; i += figura.zoma) { for (int j = recs[0].y + figura.zoma; j <recs[0].y + 4 * figura.zoma; j += figura.zoma) { if (i < 0 || j < 0 || m[j, i]) return; } } recs[1].x -= figura.zoma; recs[1].y += figura.zoma; recs[2].x -= 2*figura.zoma; recs[2].y += 2 * figura.zoma; recs[3].x -= 3 * figura.zoma; recs[3].y += 3 * figura.zoma; dir = Dirs.meore; } break; case Dirs.meore: { if (recs[0].x + (3 * figura.zoma) > 380) return; for (int i = recs[0].x + figura.zoma; i < recs[0].x + 4 * figura.zoma; i += figura.zoma) { for (int j = recs[0].y ; j < recs[0].y + 4 * figura.zoma; j += figura.zoma) { if (i < 0 || j < 0 || m[j, i]) return; } } recs[1].x += figura.zoma; recs[1].y -= figura.zoma; recs[2].x += 2 * figura.zoma; recs[2].y -= 2 * figura.zoma; recs[3].x += 3 * figura.zoma; recs[3].y -= 3 * figura.zoma; dir = Dirs.pirveli; } break; } } } } using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Threading; using System.Windows.Forms; namespace tetrisi { public partial class form1 : Form { public form1() { InitializeComponent(); label1.Text = "ანგარიში: 0"; trackBar1.Minimum = 50; trackBar1.Maximum = 250; trackBar1.SmallChange = 5; trackBar1.LargeChange = 10; trackBar1.TickFrequency = 20; trackBar1.Value = 50; this.trackBar1.Scroll += sichqaris_chveneba; trackBar1.Enabled = false; } #region cvladebi /// <summary> /// lock-ში მიწერია /// </summary> object _=new object(),__=new object(); Color tetri = Color.White; Graphics g,g2; figura fig, shemdegi,fig_temp; Thread t; int Angarishi = 0; /// <summary> /// სიჩქარე /// </summary> int Shualedi = 250; /// <summary> /// სიჩქარე /// </summary> public int shualedi { get { return Shualedi; } set { Shualedi = value; } } public int angarishi { get { return Angarishi; } set { Angarishi = value; form1.ActiveForm.Invoke((MethodInvoker)delegate() { label1.Text = "ანგარიში: " + angarishi.ToString(); }); } } /// <summary> /// ამ მასივში ვინახავთ აშენებულ ხაზებს /// </summary> bool[,] xazebi = new bool[401, 381]; Brush mwvane = Brushes.Green; Brush lurji = Brushes.Blue; /// <summary> /// ფიგურების რაოდენობას ვითვლით ამით /// </summary> int Ricxvi = 0; public int ricxvi { get { return Ricxvi; } set { Ricxvi = value; ActiveForm.Invoke((MethodInvoker)delegate() { label4.Text = "ფიგურების რაოდენობა: " + (Ricxvi-1).ToString(); }); } } /// <summary> /// შემთხვევითი რიცხვის დასაგენერირებლად /// </summary> DateTime d; /// <summary> /// დროებით ვინახავთ წასაშლელ ხაზებს /// </summary> List<int> l; #endregion /// <summary> /// თამაშის დაწყება და გადატვირთვა /// </summary> private void button1_Click(object sender, EventArgs e) { try { t.Abort(); g.Dispose(); g2.Dispose(); } catch (NullReferenceException) { } label3.Text = "სიჩქარე : 50"; trackBar1.Value = 50; fig_temp = new figura(); g2 = CreateGraphics(); g2.FillRectangle(Brushes.White, 420, 150, 120, 110); g = panel1.CreateGraphics(); g.Clear(tetri); angarishi = 0; ricxvi = 0; shualedi = 250; xazebi = new bool[401, 381]; d = DateTime.Now; Random r = new Random(d.Second); int temp = r.Next(ricxvi); switch (temp % 7) { case 0: fig = new Sveti(); break; case 1: fig = new _2211(); break; case 2: fig = new Kvadrati(); break; case 3: fig = new _13(); break; case 4: fig = new _121(); break; case 5: fig = new _31(); break; case 6: fig = new _1122(); break; } ricxvi++; fig_gen(); t = new Thread(modzraoba); t.IsBackground = true; panel1.Focus(); t.Start(); trackBar1.Enabled = true; button1.Text = "გადატვირთვა"; if (button1.Width != 100) button1.Width = 100; } private void modzraoba() { while (true) { if (KeyPreview) { lock (_) { KeyPreview = false; fig.washla(ref g); if (!davardna_chk()) { fig.vardna(); fig.daxatva(ref mwvane,ref g); } else { fig.daxatva(ref lurji, ref g); fig_gen(); } xazis_washla(); KeyPreview = true; } Thread.Sleep(shualedi); } } } private void Form1_KeyDown(object sender, KeyEventArgs e) { if (KeyPreview && fig!=null) { Monitor.Enter(__); KeyPreview = false; switch (e.KeyCode.ToString()) { case "S": { if (!davardna_chk()) { fig.washla(ref g); fig.vardna(); fig.daxatva(ref mwvane, ref g); } } break; case "Space": { if (fig.GetType() != typeof(Kvadrati)) { fig.washla(ref g); fig.brunva(ref xazebi); fig.daxatva(ref mwvane, ref g); } } break; case "A": { fig.washla(ref g); fig.svla_l(ref xazebi); fig.daxatva( ref mwvane,ref g); } break; case "D": { fig.washla(ref g); fig.svla_r(ref xazebi); fig.daxatva(ref mwvane,ref g); } break; default: break; } Monitor.Exit(__); KeyPreview = true; } } /// <summary> /// ახალი ფიგურის ტიპის გენერირება /// </summary> private void fig_gen() { if (ricxvi != 1) { fig = shemdegi; } if (fig_temp.GetType() != typeof(figura)) { fig_temp.washla(ref g2); } d = DateTime.Now; Random r = new Random(d.Second); int temp = r.Next(ricxvi,ricxvi+100); switch (temp % 7) { case 0: { shemdegi = new Sveti(); fig_temp = new Sveti(); } break; case 1: { shemdegi = new _2211(); fig_temp = new _2211(); } break; case 2: { shemdegi = new Kvadrati(); fig_temp = new Kvadrati(); } break; case 3: { shemdegi = new _13(); fig_temp = new _13(); } break; case 4: { shemdegi = new _121(); fig_temp = new _121(); } break; case 5: { shemdegi = new _31(); fig_temp = new _31(); } break; case 6: { shemdegi = new _1122(); fig_temp = new _1122(); } break; } ricxvi++; for (int i = 0; i < fig_temp.recs.Length; i++) { fig_temp.recs.x += 305; fig_temp.recs.y += 230; } fig_temp.daxatva(ref mwvane,ref g2); } /// <summary> /// შევსებული ხაზის წაშლა /// </summary> private void xazis_washla() { l = new List<int>(); for (int y = 380; y > -1; y -= figura.zoma) { bool b = false; for (int x = 0; x < 400; x += figura.zoma) { if (!xazebi[y, x]) { b = false; break; } else b = true; } if (b) l.Add(y); } if (l.Count != 0) { for (int L = l.Count-1; L >=0; L--) { for (int i = l[L]; i > 0; i -= figura.zoma) { for (int j = 0; j < 400; j += figura.zoma) { xazebi[i, j] = xazebi[i - figura.zoma, j]; } } } angarishi+=l.Count; ganaxleba(); } } /// <summary> /// დავარდნის შემოწმება. /// აბრუნებს Bool ტიპის მნიშვნელობას /// </summary> private bool davardna_chk() { foreach (var r in fig.recs.Where(n => n.y > 0)) { if (xazebi[r.y + figura.zoma, r.x] == true || r.y == 380) { foreach (var rec in fig.recs) { if (rec.y < 40) { MessageBox.Show("waage angarishit : " + angarishi.ToString()); KeyPreview = true; form1.ActiveForm.Invoke((MethodInvoker)delegate() { trackBar1.Enabled = false; }); t.Abort(); } xazebi[rec.y, rec.x] = true; } return true; } } return false; } private void ganaxleba() { for (int i = 0; i < 400; i += figura.zoma) { for (int j = 0; j < 400; j += figura.zoma) { if (xazebi[i, j]) { g.DrawRectangle(new Pen(Color.Gold, figura.zoma / (figura.zoma / 2)), j, i, figura.zoma, figura.zoma); g.FillRectangle(lurji, j + figura.zoma / (figura.zoma / 2), i + figura.zoma / (figura.zoma / 2), figura.zoma - figura.zoma / (figura.zoma / 2), figura.zoma - figura.zoma / (figura.zoma / 2)); } else g.FillRectangle(Brushes.White, j, i, figura.zoma, figura.zoma); } } } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (t != null) t.Abort(); } /// <summary> /// სიჩქარის შეცვლა /// </summary> private void trackBar1_Scroll(object sender, EventArgs e) { shualedi = 300 - trackBar1.Value; } private void sichqaris_chveneba(object sender, EventArgs e) { label3.Text = "სიჩქარე : " + ((TrackBar)sender).Value; } } }
  11. თუ იცით რაარის Binary Search მიხვდებით რას შვება კოდი. void Main() { // დალაგებული მასივი var numb = new[]{1,2,3,6,8,9,14}; Console.WriteLine(BinarySearch(numb,14)); // 6 -- იმიტომ, რომ 14 არის ინდექსით 6-ე. } static int BinarySearch<T>(IList<T> list,T key) { return BinarySearch<T>(list,0,list.Count-1,key,new Comparer(CultureInfo.InvariantCulture)); } static int BinarySearch<T>(IList<T> list,int start, int stop, T key,IComparer comparer) { if(start > stop) return -1; int mid = (start+stop)/2; if(list[mid].Equals(key)) return mid; else if(comparer.Compare(list[mid],key) > 0) return BinarySearch(list,start,mid-1,key,comparer); else return BinarySearch(list,mid+1,stop,key,comparer); }
  12. ეს არის ფეისბუქის კომენტარების ფლუდერი. თქვენ წერთ ტექსტს, რომელიც გინდათ რომ გამოჩნდეს. ქვემოთ უწერთ რაოდენობას, რამდენჯერაც გინდათ რომ დაიპოსტოს. მერე აწვებით სტარტს და მაუსს აწკაპუნებთ კომენტარის დაწერის ზოლზე, რის შემდეგაც იმდენჯერ დაკომენტარდება რამდენიც რაოდენობა გქონდათ მითითებული. ესეც კოდი: namespace FB_Spammer { public partial class Form1 : Form { public Form1() { InitializeComponent(); } int i = 1; private void timer1_Tick(object sender, EventArgs e) { int raodenoba = Convert.ToInt32(tbRaodenoba.Text); gagzavna(); i++; if(i > raodenoba) { timer1.Enabled = false; } } private void button1_Click(object sender, EventArgs e) { string text = tbRaodenoba.Text; for (int a = 0; a < text.Length-1; a++) { if (!char.IsNumber(text)) { MessageBox.Show("შეიტანეთ რიცხვი!", "FB Spammer", MessageBoxButtons.OK, MessageBoxIcon.Warning); tbRaodenoba.Text = ""; return; } } i = 1; timer1.Enabled = true; } private void button2_Click(object sender, EventArgs e) { timer1.Enabled = false; } public void gagzavna() { SendKeys.Send(tbText.Text); SendKeys.Send("{ENTER}"); } } } აქ მთავარია გაგზავნის მეთოდი, რომელიც მუშაობს მანამ სანამ გაგზავნილი ტექსტის რაოდენობა ჩვენს მიერ ჩაწერილ რაოდენობას არ გაუტოლდება (timer1_Tick ივენთი). public void gagzavna() { SendKeys.Send(tbText.Text); SendKeys.Send("{ENTER}"); } თუ რამეს ვერ გაიგებთ, დაწერეთ.
  13. აქ დაწერეთ ხოლმე თხოვნები ვიზუალ ნეტთან დაკავშირებით. ყველაფერი რაც არ მოიცავს მხოლოდ ერთ რომელიმე კონკრეტულ ენას და დაკავშირებულია ვიზუალ ნეტ-თან, იკითხეთ და ითხოვეთ აქ.
  14. ანდროიდის სისტემის ტელეფონებისთვის არსებობს პროგრამა IP Webcam, რომლის საშუალებითაც ვებ ბრაუზერში, კონკრეტულ მისამართზე, შეგვიძლია ვნახოთ ის, რასაც ჩვენი ტელეფონი ხედავს. ინფორმაცია გადაიცემა სურათების სახით: აქედან გამომდინარე ვებბრაუზერ კომპონენტის დახმარებით მარტივად შეიძლება დაიწეროს პროგრამა რომელიც ამ ვიდეოს კომპიუტერში გვიჩვენებს. დავიწყოთ: ამ პროგრამისთვის დაგვჭირდება: 1 webBrowser, 3 Button, 3 label, 1, textbox, 1 picturebox, 1 timer. დააგდეთ 1 webBrowser ფორმაზე და visible თვისება დაუყენეთ false-ზე (არ გვჭირდება რომ ეს ბრაუზერი ჩანდეს). შემდეგ დააგდეთ 1 picturebox, 1 timer და 3 Button. ღილაკებს სახელები შეუცვალეთ, შესაბამისად: btnConnect, btnStart, btnStop. მერე დააგდეთ 3 label, ერთი სტატუსისთვის გვჭირდება, ამიტომ ტექსტი საერთოდ წაუშალეთ, ხოლო სახელად დაარქვით lblStatus, დანარჩენი ორიდან ერთს ტექსტში დაუწერეთ "IP Address : Port", ხოლო მეორეს status და დააყენეთ lblStatus-ის წინ. ფორმას მოვრჩით. ახლა კოდზე გადავიდეთ: ქონექშენის თაიმაუთისთვის გვჭირდება ერთი თაიმერი, რომელიც რეაგირებას მოახდენს 8 წამში, ამიტომაც სულ ზემოთ დაუმატეთ დირექტივა using System.Timers; ხოლო ინიციალიზაციის მეთოდის ქვემოთ კი: //timer for timeout System.Timers.Timer timer = new System.Timers.Timer(8000); ახლა გვჭირდება ვებბრაუზერის ორი ივენთი, webBrowser1_Navigating და webBrowser1_Navigated, რომ ვიცოდეთ სად ვართ. private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) { lblStatus.Text = "Please Wait..."; btnStart.Enabled = false; } private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e) { lblStatus.Text = "You can start now..."; btnStart.Enabled = true; timer.Stop(); } აქ მეორე მეთოდში, ტაიმერი ითიშება თუ დაკავშირება წარმატებით განხორციელდა, ხოლო თუ არ განხორციელდა წარმატებით... მაგას ქვემოთ ვნახავთ. მე ერთნაირი კონტროლები ერთად მილაგია (კოდზე ვამბობ), ამიტომაც ახლა მეთოდები შეგვხვდება, რომელთაც ქვემოთ მივუბრუნდებით. გადავიდეთ ღილაკებზე. პირველი არის დაკავშირების ღილაკი: //btnConnect private void btnConnect_Click(object sender, EventArgs e) { timer.Start(); try { webBrowser1.Navigate("http://" + tbIpPort.Text + "/js.html"); timer.Elapsed += new ElapsedEventHandler(tmr_Elapsed); } catch { MessageBox.Show("Could not connect. Check if your app is runningnand IP and Port are correct", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } ვრთავთ ტაიმერს და იწყება დროის ათვლა. ლინკი რომელიც გვიჩვენებს ვიდეოს არის ეს: "http://ip:port/js.html". სწორედ ამიტომ გვაქვს ტექსტბოქსი, სადაც აიპი და პორტი იწერება ორწერტილით გაყოფილი. შემდეგ ხდება ტაიმერის გასულ დროზე რეაგირება და 8 წამი ისე გავიდა რომ ვერ დავუკავშირდით გვერდს ერორს ამოაგდებს. ამ რეაგირების მეთოდს მალე ვიხილავთ. დაწყების ღილაკის კოდი ასეთია: //btnStart private void btnStart_Click(object sender, EventArgs e) { timer1.Start(); lblStatus.Text = "Streaming started..."; btnStop.Enabled = true; btnStart.Enabled = false; btnConnect.Enabled = false; } ეს ტაიმერი, სულ სხვაა, კერძოდ ფორმაზე რომ დავაგდეთ ის. სტატუსის ტექსტს ვააფდეითებთ და ღილაკებს ვთიშავთ და ვრთავთ, იმის მიხედვით როგორც საჭიროა. გაჩერების ღილაკი: //btnStop private void btnStop_Click(object sender, EventArgs e) { timer1.Stop(); pictureBox1.ImageLocation = ""; lblStatus.Text = "Streaming stopped..."; btnStart.Enabled = true; btnStop.Enabled = false; } აქ დროს ვაჩერებთ და დანარჩენი ისე ვაკეთებთ როგორც წინა ღილაკზე. ახლა მთავარი. ჩვენი ტაიმერის Tick ივენთი: //timer1_Tick for picturebox updating private void timer1_Tick(object sender, EventArgs e) { try { pictureBox1.ImageLocation = webBrowser1.Document.GetElementById("img1") .GetAttribute("src"); } catch { timer1.Stop(); lblStatus.Text = "Error in connection!"; MessageBox.Show("Something went wrong.nReload app", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } pictureBox1-ში სურათები რომ გამოვიტანოთ, ან პირდაპირ სურათი უნდა მივუთითოთ, ან მისი მისამართი. ჩვენ ვიცით მისამართი, ამასთან სურათის სახელები მუდმივად იცვლება რენდომით. თუმცა ვიცით რომ აიდი არის "img1", ხოლო სურათის მისამართი წერია "src"-ში. ამის ცოდნა საკმარისია იმისთვის რომ სურათები გადმოვიტანოთ, თუმცა ის მუდმივად ახლდებად ა ჩვენც მუდმივად უნდა განვაახლოთ ლინკი, სწორედ ამიტომ გვაქვს ეს ყველაფერი timer1_Tick ივენთში. სხვათაშორის, აჯობებს timer1-ის ინტერვალი 50-ზე ან ცოტა ნაკლებზე დააყენოთ, რადგან დეფოლტად 100-ზეა და ცოტა აგვიანებს ხოლმე. თუ სურათების გადმოტანა არ ხერხდება ვთიშავთ ამ ტაიმერს და გამოგვაქვს მესიჯი. და ბოლოს ჩვენი 8 წამიანი ტაიმერის ივენთჰენდლერი (ქართულად რა ქვია დამავიწყდა): //timer.Elapsed EventHandler void timer_Elapsed(object sender, ElapsedEventArgs e) { MessageBox.Show("Connection timed out. Check if your app is runningnand IP and Port are correct", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); timer.Stop(); } თუ 8 წამი ისე გავიდა, რომ ლინკთან დაკავშირება ვერ მოხდა, გამოდის, რომ ან ტელეფონზე არ არის ჩართული აპლიკაცია და ინტერნეტი თავისთავად, ან კიდევ აიპი და პორტია არასწორად მითითებული, ამიტომ ვაგდებთ შესაბამის შეტყობინებას და ვაჩერებთ 8 წამიან ტაიმერს. ესეც სრული კოდი:
  15. ალბათ ყველანი შეხვედრიხართ ან გაგიგიათ მაინც adf.ly-ს ლინკები, სადაც ათასი skip ad უნდა გაიაროთ სანამ სასურველ ლინკამდე მიხვალთ. ინტერნეტში არაერთი პროგრამა თუ ედ-ონ-ი მოიძებნება მისი გამოტოვებისთვის, მაგრამ მე არ შემხვედრია მსგავსი პროგრამა, რომელიც სი შარპშია დაწერილი. ამიტომაც, აქ მინდა გაჩვენოთ ერთ-ერთი ხერხი, რომლითაც იგივეს გავაკეთებთ C#-ს webBrowser კომპონენტის გამოყენებით. სანამ, კოდზე გადავიდოდეთ, მანამდე უნდა ითქვს, რომ არსებობს ასეთი საიტი http://de-ads.net/ რომლის გამოყენებითაც შეგვიძლია პირდაპირ ლინკი მივიღოთ. ჩვენ ზუსტად ამ საიტს გამოვიყენებთ და ელემენტის ტეგების და იდ-ების გამოყენებით, მივიღებთ ჩვენთვის სასურველ შედეგს. როგორც ხედავთ, არსებული ტექსტბოქსის იდი არის "url", ღილაკის მნიშვნელობა არის "Deadfly!", ხოლო ღილაკის ტეგის სახელი "input". ახლა შედეგიც ვნახოთ: ჩანს, რომ შედეგის აიდი არის "results". ახლა კი შეგვიძლია გადავიდეთ მთავარ ნაწილზე. მაშ ასე, დავიწყოთ! პირველ რიგში ჩვენ დაგვჭირდება: 2 ტექსტბოქსი, 1 ღილაკი, 1 ვებბრაუზერი და 1 ტაიმერი. სურათზე ჩანს რა უნდა დაარქვათ თითოეულს, თუ კოდის პირდაპირ აქედან დაკოპირებას აპირებთ: ახლა გადავიდეთ კოდზე: ფორმაზე ორჯერ დააწკაპუნეთ და შექმნილ Form_Load ივენთში ჩაწერეთ ეს კოდი: WebBrowser1.Navigate("http://de-ads.net/"); WebBrowser1.ScriptErrorsSuppressed = true; აქ დიდი არეფერია, უბრალოდ გადავდივართ ჩვენთვის საჭირო გვერდზე და იე სკრიპტის ერორი რომ არ ამოგვიგდოს, ვიყენებთ იმას რაც მეორე ხაზზე წერია. ახლა ღილაკს დააწკაპუნეტ ორჯერ და შექმნილ ივენთში ჩაწერეთ ეს კოდი: WebBrowser1.Document.GetElementById("url").SetAttribute("Value", this.txtInput.Text); foreach (HtmlElement element in WebBrowser1.Document.GetElementsByTagName("input")) { if (element.GetAttribute("value") == "Deadfly!") { element.InvokeMember("click"); tmResult.Start(); } } WebBrowser1.Stop(); როგორც ზემოთ უკვე ვთქვი, ტექსტბოქსის აიდი არის "url", ჩვენ ვიყენებთ ამას და მის მნიშვნელობას ანუ "Value"-ს ვანიჭებთ txtInput-ში არსებულ მნიშვნელობას და ეს მნიშვნელობა არის adf.ly-ს ლინკი. მერე, სათითაოდ ვეძებთ ტეგის სახელს "input". როგორც ვიცით ეს სახელი აქვს სწორედ ღილაკის ტეგს და მისი მნიშვნელობაა "Deadfly!", შესაბამისად ვამბობთ, რომ თუ მნიშვნელობა იქნება "Deadfly!", მაშინ გამოკიეთე დაკლიკებაო. რის შემდეგაც ვრთავთ ტაიმერს (ტაიმერის კოდს ახლავე ნახავთ). ბოლოს კი ვთიშავთ ვებბრაუზერს, RAM-მუდმივად რომ არ მოიმატოს და ამავე მიზეზით ცოტა ხანში ტაიმერსაც გავთიშავთ. და ბოლოს, ტაიმერს მიაკლიკეთ ორჯერ და შექმნილ ივენთსი ჩაწერეთ ეს კოდი: txtResult.Text = WebBrowser1.Document.GetElementById("results").InnerText; if (txtResult.Text != string.Empty && txtResult.Text != "working...") { tmResult.Stop(); } ჩვენ ვიცით, რომ დაბრუნებული მნიშვნელობის აიდი არის "results", ჩვენ ვიღებთ მას და ჩვენს მეორე ტექსტბოქსში გადმოგვაქვს ის ტექსტი რასაც ეს პასუხი შეიცავს (InnerText). ამის მერე, როგორც მე შევამჩნიე, RAM მუდმივად იზრდებოდა, იმიტომ რომ ტაიმერი არსადაა გათიშული და მუდმივად გადმოაქვს ტექსტი, ამიტომაც გავაკეთე ისე, რომ თუ ტექსტბოქსი ცარიელი არ იქნება და ამასთან ტექსტი არ არის: "working...", გათიშოს ტაიმერი. ეს ვერ არის მაინცდამაინც კარგი გადაწყვეტა, თუმცა უკეთესი ამწუთას არ მომდის თავში. შედეგად, თუ ვთქვათ ლინკი არის ეს: http://adf.ly/YFaTB, მივიღებთ ასეთ რამეს: სრული კოდი: namespace BypassAdfly { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { WebBrowser1.Navigate("http://de-ads.net/"); WebBrowser1.ScriptErrorsSuppressed = true; } private void cmdGet_Click(object sender, EventArgs e) { WebBrowser1.Document.GetElementById("url").SetAttribute("Value", this.txtInput.Text); foreach (HtmlElement element in WebBrowser1.Document.GetElementsByTagName("input")) { if (element.GetAttribute("value") == "Deadfly!") { element.InvokeMember("click"); tmResult.Start(); } } WebBrowser1.Stop(); } private void tmResult_Tick(object sender, EventArgs e) { txtResult.Text = WebBrowser1.Document.GetElementById("results").InnerText; if (txtResult.Text != string.Empty && txtResult.Text != "working...") { tmResult.Stop(); } } } } ეს კოდი არის ელემენტარული ვარიანტი, მაგრამ წარმოდგენას შეგიქმნით. თქვენ შეგიძლიათ გააუმჯობესოთ ის, სრულიად ამოიღოთ webbrowser კომპონენტი და ა.შ. ასეთ შემთხვევაში კარგი იქნება, თუ კოდს ამ თემაშივე დადებთ.
  16. ჩემი დაწერილი ძალით Task Manager. Screens: ახლა კოდი: C#: MainWindow.xaml.cs using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.Linq; using System.Runtime.CompilerServices; using System.ServiceProcess; using System.Windows; using System.Windows.Threading; using TaskManagerNET.Annotations; namespace TaskManagerNET { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { private List<Process> processes; private List<Service> services; public MainWindow() { InitializeComponent(); var dispatchTimer = new DispatcherTimer(); dispatchTimer.Start(); dispatchTimer.Interval = TimeSpan.FromSeconds(1); dispatchTimer.Tick += DispatchTimerOnTick; } private void DispatchTimerOnTick(object sender, EventArgs eventArgs) { #region Logic for Processes var pTemp = Process.GetProcesses(); int k = 0; //If a process was added or removed update the listview if (Process.GetProcesses().Count != processes.Count) { processes = Process.GetProcesses(); ProcessesListView.ItemsSource = processes; } //Update threads and memory usage try { foreach (var p in processes) { p.Threads = pTemp[k].Threads; p.MemoryUsage = pTemp[k].MemoryUsage; k++; } } catch { } #endregion #region Logic For Services var sTemp = Service.GetServices(); int j = 0; //If a process was added update the listview if (Service.GetServices().Count != services.Count) { services = Service.GetServices(); ServicesListView.ItemsSource = services; } //Update threads and memory usage try { foreach (var s in services) { s.Status = sTemp[j].Status; j++; } } catch { } #endregion } private void Initialize() { processes = Process.GetProcesses(); services = Service.GetServices(); } private void MainWindow_OnLoaded(object sender, RoutedEventArgs e) { Initialize(); ProcessesListView.ItemsSource = processes; ServicesListView.ItemsSource = services; KillProcessMenuItem.Click += KillProcessMenuItemOnClick; } private void KillProcessMenuItemOnClick(object sender, RoutedEventArgs routedEventArgs) { try { EndProcess(((Process)ProcessesListView.SelectedItem).Id); } catch (NullReferenceException ex) { Debug.WriteLine(ex.Message); } } public void EndProcess(int id) { try { System.Diagnostics.Process.GetProcessById(id).Kill(); processes.Remove(processes.Single(x => x.Id == id)); processes = Process.GetProcesses(); ProcessesListView.ItemsSource = processes; } catch { } } } class Process : INotifyPropertyChanged { private string memoryUsage; private int threads; public int Id {get; set; } public string ProcessName { get; set; } public int Threads { get { return threads; } set { threads = value; OnPropertyChanged(); } } public string MemoryUsage { get { return memoryUsage; } set { memoryUsage = value; OnPropertyChanged(); } } public string Description { get; set; } public event PropertyChangedEventHandler PropertyChanged; [NotifyPropertyChangedInvocator] protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); } public static List<Process> GetProcesses() { return ((System.Diagnostics.Process.GetProcesses().Select(x => new Process{ Id = x.Id, MemoryUsage = (x.WorkingSet64.ToString("N0") .Substring(0, x.WorkingSet64.ToString("N0").Length - 4) + " K"), ProcessName = x.ProcessName, Threads = x.Threads.Count }))).ToList(); } } class Service : INotifyPropertyChanged { private string status; public string ServiceName { get; set; } public string Status { get { return status; } set { status = value; OnPropertyChanged(); } } public static List<Service> GetServices() { return ((ServiceController.GetServices().Select(x => new Service() { ServiceName = x.ServiceName, Status = x.Status.ToString() }))).ToList(); } public event PropertyChangedEventHandler PropertyChanged; [NotifyPropertyChangedInvocator] protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); } } } XAML: MainWindow.xaml <Window x:Class="TaskManagerNET.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="My Task Manager" Height="350" Width="350" Loaded="MainWindow_OnLoaded"> <Grid> <TabControl> <TabItem Header="Processes"> <ListView Name="ProcessesListView"> <ListView.ContextMenu> <ContextMenu> <MenuItem Header="Kill Process" Name="KillProcessMenuItem"></MenuItem> </ContextMenu> </ListView.ContextMenu> <ListView.View> <GridView> <GridViewColumn Header="Id" DisplayMemberBinding="{Binding Id}" /> <GridViewColumn Header="Image Name" DisplayMemberBinding="{Binding ProcessName}" /> <GridViewColumn Header="Memory" DisplayMemberBinding="{Binding MemoryUsage}" /> <GridViewColumn Header="Threads" DisplayMemberBinding="{Binding Threads}" /> </GridView> </ListView.View> </ListView> </TabItem> <TabItem Header="Services"> <ListView Name="ServicesListView"> <ListView.View> <GridView> <GridViewColumn Header="Service Name" DisplayMemberBinding="{Binding ServiceName}" /> <GridViewColumn Header="Status" DisplayMemberBinding="{Binding Status}" /> </GridView> </ListView.View> </ListView> </TabItem> </TabControl> </Grid> </Window>
  17. თუ არ იცით, ალბათ ყველას გაგიგიათ მაინც მორზეს ანბანი, სადაც ყოველ ასოს შეესაბამება ტირეებისა და წერტილების გარკვეული კომბინაცია. ე.ი გასაღებად გვაქვს ასო და მისი მნიშვნელობა ტირე-წერტილების სახით. ასეთი სიტუაციებისთვის სი შარპში გვაქვს კოლექცია Dictionary<key, value>, სადაც ყოველ გასაღებს (key) შეესაბამება მნიშვნელობა (value). გასაღები და მნიშვნელობა შეიძლება იყოს ნებისმიერი ტიპის და ამასთან შეიძლება მათი ტიპები განსხვავებული იყოს, მაგალითად: Dictionary<int, string> = new Dictionary<int, string>{1, "ფორუმი"}, {2, "წევრები"}; ჩვენ კონსოლურ აპლიკაციაში Beep() მეთოდით შეგვიძლია სიგნალი გავუშვათ. მორზეს სიგნალის გასაშვებად რაც ჩვენ გვჭირდება სულ ისაა, რომ შევქმნათ გასაღები - მნიშვნელობათა ცხრილი, სადაც ასოებს (გასაღებს) მივუსადაგებთ შესაბამის წერტილების და ტირეების კომბინაციებს, შემდეგ თითოეული წერტილისთვის დავაგენერირებთ მოკლე სიგნალს, ხოლო ტირესთვის შედარებით გრძელს. მე პროექტში სიხშირედ აღებული მაქვს 1000, წერტილისთვის 250 მილიწამი, ხოლო ტირესთვის 750 მილიწამი. კოდს ასეთი სახე ექნება (სიგნალის სახით გასაშვებ სიტყვად აღებული მაქვს scriptsge): static void Main(string[] args) { string word = "scriptsge"; Dictionary<string, string> Codes = new Dictionary<string, string> { {"a", ".- "}, {"b", "-... "}, {"c", "-.-. "}, {"d", "-.. "}, {"e", ". "}, {"f", "..-. "}, {"g", "--. "}, {"h", ".... "}, {"i", ".. "}, {"j", ".--- "}, {"k", "-.- "}, {"l", ".-.. "}, {"m", "-- "}, {"n", "-. "}, {"o", "--- "}, {"p", ".--. "}, {"q", "--.- "}, {"r", ".-. "}, {"s", "... "}, {"t", "- "}, {"u", "..- "}, {"v", "...- "}, {"w", ".-- "}, {"x", "-..- "}, {"y", "-.-- "}, {"z", "--.. "}, {"0", "-----"}, {"1", ".----"}, {"2", "..---"}, {"3", "...--"}, {"4", "....-"}, {"5", "....."}, {"6", ".----"}, {"7", "..---"}, {"8", "...--"}, {"9", "....-"} }; foreach (char c in word.ToCharArray()) { string rslt = Codes[c.ToString()].Trim(); foreach (char c2 in rslt.ToCharArray()) { if (c2 == '.') Console.Beep(1000, 250); else Console.Beep(1000, 750); } System.Threading.Thread.Sleep(50); } Console.ReadKey(); }
  18. გაფიკის აგება თუ გიცდიათ?
  19. ამოცანა მდგომარეობს შემდეგში: ეს ამოცანა ცნობილია როგორ მონტი ჰოლის პარადოქსი და იხსნება შემდეგნაირად: თავდაპირველად კარის არჩევისას, იმისი შანსი რომ თხა ამოგვივიდეს, არის 66%, ხოლო მანქანის ამოსვლის შანსი არის 33%. ვინაიდან ტელეწამყვანმა იცის სად არის მანქანა და სად თხები, ტელეწამყვანის მიერ თხიანი კარის გახსნის მერე არჩევანის შეცვლით, ჩვენი მოგების შანსები ორჯერ იზრდება, ზუსტად იმიტომ, რომ თხის ამოსვლის ალბათობა ორჯერ მეტია და შესაბამისად ორჯერ მეტია იმის შანსი, რომ თავდაპირველად თხიანი კარი ავირჩიეთ და შეცვლის შემთხვევაში მანქანა ამოგვივა. ბევრს არ სჯერა რომ ეს ასეა და ფიქრობს, ორი კარი რომ დარჩება შანსები 50/50-ზეაო მაგრამ ეს მოსაზრება მცდარია. თავდაპირველად, სანამ ამოხსნას ვნახავდი, მეც ასე მეგონა, შემდეგ აზრი შევიცვალე და ახლა მინდა გაჩვენოთ არჩევანის შეცვლის უპირატესობა პროგრამული კოდით. გრაფიკული ასახვისთვის ვიყენებ IMSL ბიბლიოთეკას, რომელსაც აქ არ განვიხილავ და ვინც მას საერთოდ არ იცნობს, მინიმუმს შეუძლია გაეცნოს მოკლედ, ეს ამოცანა პროგრამულად რომ გავაკეთოთ, უნდა მოვიქცეთ ასე: უნდა გავაკეთოთ კარებების შემთხვევითი შერჩევა (choice), კარებების უკან თხების და მანქანის შემთხვევითი დალაგება (doors[winner]=1), შემდეგ ტელეწამყვანს უნდა გავახსნევინოთ თხიანი კარი (shown) და ბოლოს, ყოველი ხელახალი თამაშისას დავითვალოთ, რამდენი იყო მოგება მაშინ, როდესაც არ შევიცვალეთ გადაწყვეტილება და თავდაპირველ აზრზე დავრჩით (stayWins) და მაშინ, როდესაც შევცვალეთ გადაწყვეტილება (switchWins). ამ ყველაფრის შემდეგ, გრაფიკულად ვახდენთ ასახვას,ზემოთ აღნიშნული ბიბლიოთეკის საშუალებით. კოდი შეიცავს ყველა საჭირო კომენტარს მაგრამ თუ რამე მაინც ვერ გაიგეთ, შეგიძლიათ იკითხოთ. public class MonthyHallProblem : FrameChart { int rounds = 30; public MonthyHallProblem() { double[] dabrunebaStayWins = new double[rounds]; double[] dabrunebaSwitchWins = new double[rounds]; double switchWins = 0; double stayWins = 0; Random gen = new Random(); for (int plays = 0; plays < rounds; plays++) { int[] doors = { 0, 0, 0 };//0 არის თხა და 1 არის მანქანა var winner = gen.Next(3); doors[winner] = 1; //დავაყენოთ მომგებიანი მანქანა შემთხვევით არჩეულ კარში int choice = gen.Next(3); //ავირჩიოთ ნებისმიერი კარი int shown; //გახსნილი კარი, ანუ რომლსაც ჟურნალისტი აღებს do { shown = gen.Next(3); } while (doors[shown] == 1 || shown == choice); //არ ვაჩვენოთ არჩეული და გამარჯვებული ვარიანტები stayWins += doors[choice]; //თუ დარჩენისას ვიგებთ, დავამატოთ შესაბამის ცვლადს //შეცვლილი კარი (ანუ ბოლოს დარჩენილი) არის (3 - choice - shown), რადგან 0+1+2=3 switchWins += doors[3 - choice - shown]; dabrunebaStayWins[plays] = stayWins; dabrunebaSwitchWins[plays] = switchWins; } Chart chart = this.Chart; AxisXY axis = new AxisXY(chart); axis.AxisX.SetTitle("თამაშების რაოდენობა"); axis.AxisY.SetTitle("მოგების რაოდენობა"); chart.Legend.IsVisible = true; Data data1 = new Data(axis, dabrunebaSwitchWins); data1.DataType = Data.DATA_TYPE_MARKER | Data.DATA_TYPE_LINE; data1.MarkerType = Data.MARKER_TYPE_FILLED_SQUARE; data1.MarkerColor = Color.Blue; data1.LineColor = Color.Blue; data1.SetTitle("switchWins"); Data data2 = new Data(axis, dabrunebaStayWins); data2.DataType = Data.DATA_TYPE_LINE | Data.DATA_TYPE_MARKER; data2.MarkerType = Data.MARKER_TYPE_FILLED_TRIANGLE; data2.MarkerColor = Color.Red; data2.LineColor = Color.Red; data2.SetTitle("stayWins"); } } სადმე გადატანის შემთხვევაში არ დაგავიწყდეთ ავტორის და scripts.ge-ს მიწერა.
  20. Noobz

    Head First C#

    Head First C# is a complete learning experience for learning how to program with C#, XAML, the .NET Framework, and Visual Studio. Fun and highly visual, this introduction to C# is designed to keep you engaged and entertained from first page to last. You’ll build a fully functional video game in the opening chapter, and then learn how to use classes and object-oriented programming, draw graphics and animation, and query data with LINQ and serialize it to files. And you'll do it all by creating games, solving puzzles, and doing hands-on projects. By the time you're done, you'll be a solid C# programmer—and you'll have a great time along the way! Create a fun arcade game in the first chapter, and build games and other projects throughout the book Learn how to use XAML to design attractive and interactive pages and windows Build modern Windows Store apps using the latest Microsoft technology Learn WPF (Windows Presentation Foundation) using the downloadable WPF Learner's Guide Using the Model-View-ViewModel (MVVM) pattern to create robust architecture Build a bonus Windows Phone project and run it in the Visual Studio Windows Phone emulator Projects in the book work with all editions of Visual Studio, including the free Express editions. Download
  21. ამ ტუტორიალში თქვენ ისწავლით მარტივი გრაფიკების აგებას IMSL Chart ბიბლიოთეკის გამოყენებით. ეს ბიბლიოთეკა ფული ღირს და თუ გადახდა არ გინდათ, შეგიძლიათ ოფიციალურიდან საცდელი ვერსია გადმოწეროთ. თუმცა მე გთავაზობთ მესამე გზას, რომელსაც დარწმუნებული ვარ ყველა ვიცნობთ. ეს არის გაკრეკილი ვერსია (ზემოთ დევს ლინკი). ასე რომ ვისაც აქამდე არ გადმოგიწერიათ, ახლა გადმოწერეთ. სანამ მთავარზე გადავიდოდეთ ჯერ ამის დაყენებას აგიხსნით. ბიბლიოთეკას რომ გადმოწერთ, დააყენეთ ჩვეულებრივად, მაგრამ დაიმახსოვრეთ სად აყენებთ. მე პირადად მიყენია Program Files-ში VNI დირექტორიის სახით. როდესაც გადმოწერთ ფაილს, ნახავთ, რომ მასში, საინსტალაციოს გარდა, არის სასწავლო დოკუმენტაცია და კრეკიც. მოკლედ, რომ დააყენებთ, VNI ფოლდერში იქნება License ფოლდერი. კრეკიდან აიღეთ License.dat ფაილი და ჩააგდეთ მაგ დირექტორიაში. ამის მერე თქვენ გაქვთ ლიცენზირებული IMSL Chart ბიბლიოთეკა. ახლა მთავარი. გახსენით თქვენი ვიზუალ სტუდიო, აირჩიეთ Windows Forms Application და ოკ. WFA იმიტომ აგარჩევინეთ, რომ კონსოლურ აპლიკაციაში სახელსივრცეების დამატება მოგვიწევდა, რაც აქ თავიდანვე ისედაც დამატებულია. რომ ჩაირთვება, მარჯვნივ მონახეთ References, მაუსის მარჯვენა კლიკი და Add Reference, მერე გადადით Browse-ში და მოძებნეთ IMSLCS.dll რომელიც წესით უნდა იყოს VNI > imsl > imslcs500 > bin დირექტორიაში. ახლა კი სახელსივრცეებში დაამატეთ: using Imsl.Chart2D; კოდი მე მიწერია კლასის კონსტრუქტორში და არ მიცდია რომელიმე მეთოდში მისი ჩაწერა და შემდეგ გამოყენება, ამიტომ არ ვიცი ეგრე მუშაობს თუ არა. თქვენ შეგიძლიათ შეამოწმოთ. კლასი, რომელშიც Chart და AxisXY კლასების ობიექტები გვაქვს გამოყენებული, აუცილებლად უნდა იყოს FrameChart კლასის მემკვიდრე. გარდა ამისა კლასები, რომლებშიც ფუნქციები იწერება აუცილებლად უნდა იყვნენ ChartFunction ინტერფეისის მემკვიდრეები. ეს ინტერფეისი მოითხოვს, რომ ფუნქციის ტიპი იყოს double, ხოლო სახელი F და მას აუცილებლად უნდა ჰქონდეს ერთი double ტიპის პარამეტრი. მაგალითად: class kvadratuli : ChartFunction { int a = 2, b = 2, c = 1; public double F(double x) { return a * x * x + b * x + c; } } დროა გადავიდეთ კოდის წერაზე. შექმენით რაიმე კლასი, ჩემს შემთხვევაში ეს იქნება SampleProject. public class SampleProject : FrameChart { } ახლა მასში შექმენით უპარამეტრო კონსტრუქტორი. public SampleProject() { } ჩვენი ძირითადი კოდი არის სწორედ ამ კონსტრუქტორში.ჩვენ გვჭირდება Chart, AxisXY და Data კლასის ობიექტები. ღერძებიდან ერთს ერქმევა x ღერძი, ხოლო მეორეს - y ღერძი. ლეგენდა გვიჩვენებს რა რა არის. ჩემს მაგალითში გამომაქვს ორი გრაფიკი, ერთი კვადრატული ფუნქციის და მეორე სინუსის. შესაბამისად დაგვჭირდება 2 ცალი Data კლასის ობიექტი(მონაცემები). ამ შემთხვევაში data-ს აქვს 4 პარამეტრი: აქსისი, ფუნქცია, x-ის საწყისი და საბოლოო მნიშვნელობები. ამრიგად ჩვენი კონსტრუქტორი თავისი კოდით ასე გამოიყურება: public SampleProject() { Chart chart = this.Chart; AxisXY axis = new AxisXY(chart); axis.AxisX.SetTitle("x ღერძი"); axis.AxisY.SetTitle("y ღერძი"); chart.Legend.IsVisible = true; Data data1 = new Data(axis, new kvadratuli(), -2, 1); data1.LineColor = Color.Blue; data1.SetTitle("კვ.გრაფიკი"); Data data2 = new Data(axis, new sinusi(), -10, 10); data2.LineColor = Color.Red; data2.SetTitle("სინუსი"); } თუ ამ კოდს პირდაპირ დააკოპირებთ, ერორი გექნებათ, რადგან kvadratuli და sinusi კლასები ჯერ არ გაქვთ. ავდგეთ და შევქმნათ, ჩვენი რა მიდის. ჯერ კვადრატული გავაკეთოთ: class kvadratuli : ChartFunction { int a = 2, b = 2, c = 1; public double F(double x) { return a * x * x + b * x + c; } } შემდეგ კი სინუსი: class sinusi : ChartFunction { public double F(double x) { if (x == 0.0) return 1.0; return Math.Sin(Math.PI * x) / (Math.PI * x); } } აქ, 0.0-ზე ერთი იმიტომ გავხადეთ, რომ NaN არ დაგვიწეროს. საბოლოოდ ჩემი მთლიანი კოდი ასე გამოიყურება: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Imsl.Chart2D; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } } public class SampleProject : FrameChart { public SampleProject() { Chart chart = this.Chart; AxisXY axis = new AxisXY(chart); axis.AxisX.SetTitle("x ღერძი"); axis.AxisY.SetTitle("y ღერძი"); chart.Legend.IsVisible = true; Data data1 = new Data(axis, new kvadratuli(), -2, 1); data1.LineColor = Color.Blue; data1.SetTitle("კვ.გრაფიკი"); Data data2 = new Data(axis, new sinusi(), -10, 10); data2.LineColor = Color.Red; data2.SetTitle("სინუსი"); } } class kvadratuli : ChartFunction { int a = 2, b = 2, c = 1; public double F(double x) { return a * x * x + b * x + c; } } class sinusi : ChartFunction { public double F(double x) { if (x == 0.0) return 1.0; return Math.Sin(Math.PI * x) / (Math.PI * x); } } } ახლა პროექტის გაშვება რომ სცადოთ, არაფერი არ მოხდება. ეს იმიტომ, რომ გაშვებისას Main-ში მითითებულია Form1 კლასი. გადადით Program.cs-ში და შეცვალეთ აპლიკაციის გაშვების კოდი ასე: Application.Run(new SampleProject()); ეს არის ჩვენი მთავარი კლასის სახელი, ასე რომ თქვენს კლასს თუ სხვა რამე დაარქვით, მაშინ ის სახელი მიუთითეთ. ჩემი მონაცემების გამოყენების შემთხვევაში მიიღებთ იმ შედეგს რომელიც ზემოთ სურათზეა ნაჩვენები. წარმატებები. მსგავსი სტატია ქართულ სივრცეში არ დევს, ასე რომ გამოყენების შემთხვევაში მიუთითეთ საიტის სახელი scripts.ge და ავტორი. პ.ს. მართკუთხა კოორდინატთა სისტემა ისეთი სახით, როგორიც ჩვენ სკოლაში გვასწავლეს, მე ვერ ვნახე, ანუ ბიბლიოთეკა ვერ ვიპოვე. ინგლისურად მას ჰქვია Cartesian coordinate system. თუ ვინმე იპოვის რაიმე ბიბლიოთეკას სი შარპისთვის, დააგდოს აქაც.
  22. ამ თემაში მინდა დავდოთ ხოლმე projecteuler.net -ის ამოცანების პასუხები და თუ რაიმე კითხვები გვაქვს ისინიც აქ დავწეროთ ხოლმე. დადებული კოდი (ამოხსნა) აუცილებლად უნდა იყოს სიტყვიერად (თეორიულად) ახსნილი მაქსიმალურად გასაგებად და თუ დამატებით, კოდშიც იქნება კომენტარები, უკეთესია. ერთ ამოცანას შეიძლება სხვადასხვა ამოხსნა და სხვადასხვა კოდი ჰქონდეთ. ჩვენ მივესალმებით ნებისმიერი ვარიანტის დადებას, შემდეგ განვიხილავთ კიდევაც, დავსვამთ კითხვებს და ასე შემდეგ. საბოლოოდ, ჩვენ გვექნება ბლოგპოსტების მსგავსი ამოხსნები და უფრო მეტიც, კითხვა-პასუხი აქ, ამ თემაში. ვფიქრობ კარგი იდეაა. პრობლემა No.1 ვიპოვოთ ყველა იმ რიცხვის ჯამი, რომელიც ნაკლებია ათასზე და იყოფა 3-ზე ან 5-ზე. ამოხსნა ციკლით ეს ამოცანა იხსნება ციკლით ან არითმეტიკული პროგრესიის გამოყენებით. ბუნებრივია მეორე მეთოდი უფრო სწრაფად მუშაობს, თუმცა მოცემული რიცხვის სიმცირიდან გამომდინარე, შეგვიძლია ციკლით გავაკეთოთ. int a = 0; for (int i = 3; i < 1000; i++) { if (i % 3 == 0 || i % 5 == 0) { a += i; } } Console.WriteLine(a); ამას დიდი ახსნა არ სჭირდება. შემოგვაქვს ცვლადი პასუხის ჩასაწერად. შემდეგ ვაკეთებთ ციკლს 3-დან 1000-მდე და ვეძებთ ისეთ რიცხვებს, რომლებიც იყოფა 3-ზე ან 5-ზე და ამ რიცხვებს ვაჯამებთ (a += i;). ვიღებთ პასუხს და გამოგვაქვს ეკრანზე. ამოხსნა გეომეტრიული პროგრესიის გამოყენებით იმის მაგივრად, რომ შევამოწმოთ ყველა რიცხვი და ამოვარჩიოთ ისინი, რომლებიც იყოფა 3-ზე ან 5-ზე, ჩვენ შეგვიძლია დავთვალოთ ყველა იმ რიცხვის ჯამი რომელიც იყოფა 3-ზე, შემდეგ ყველა იმ რიცხვის ჯამი რომელიც იყოფა 5-ზე, მერე დავაჯამოთ ისინი და გამოვაკლოთ ყველა იმ რიცხვის ჯამი, რომელიც იყოფა 3*5=15-ზე, ვინაიდან ისინი ორჯერ გვხვდება. ჩვენ შეგვიძლია შევქმნათ მეთოდი int nJami(int n, int m) { } ანუ იმ რიცხვების ჯამი, რომლებიც n-ზე იყოფა. აქ m არის მაქსიმალური რიცხვი (ჩვენს შემთხვევაში 999). ახლა ვნახოთ ჯამი როგორ დაიწერება, როცა n=3. 3+6+9+12+...+999 = 3*(1+2+3+4+...+333) ხოლო როცა n=5: 5+10+15+20+...+995 = 5*(1+2+3+4+...+199) აქ, შევამჩნევთ, რომ 1+2+3+4...N არის არითმეტიკული პროგრესია, მაშასადამე ჩვენ შეგვიძლია გამოვიყენოთ არითმეტიკული პროგრესიის N წევრის ჯამის ფორმულა, რომელიც ასე იწერება - N*(N+1)/2. აქ N არის უდიდესი რიცხვი, რომელიც ნაკლებია m-ზე და იყოფა n-ზე. (ჩვენს მაგალითში 3-ზე არის 333 და 5-ზე არის 199), შესაბამისად N = m/n. ყოველივე ზემოთქმულიდან გამომდინარე, ყველა რიცხვის ჯამი რომელიც იყოფა n-ზე, შეგვიძლია ჩავწეროთ ასე: n*N*(N+1)/2 = n * (m/n) *((m/n) + 1) / 2. ახლა კი ჩვენი მეთოდი უკვე მზადაა: static int nJami(int n, int m) { return n * (m / n) * ((m / n) + 1) / 2; } ბოლოს კი გამოვთვლით შედეგს: int shedegi = nJami(3, 999) + nJami(5, 999) - nJami(15, 999); ეს მეორე მეთოდი ბევრად უკეთესია დროის მხრივ, რადგან მას სჭირდება O(1) დრო, მაშინ როდესაც პირველ მეთოდს სჭირდება O(n) დრო.
  23. რამოდენიმე გეომეტრიული ობიექტის კლასი დავწერე. public class Cone : IObject3D { private readonly double height; private readonly double radius; public Cone(double height,double radius) { this.height = height; this.radius = radius; } public double SurfaceArea { get { return Math.PI*radius*(radius + height); } } public double Volume { get { return (1/3.0) *SurfaceArea*height; } } } public class Cylinder : IObject3D { private readonly double radius; private readonly double height; public Cylinder(double radius,double height) { this.radius = radius; this.height = height; } public double Volume { get { return Math.PI*radius*radius*height; } } public double SurfaceArea { get { return 2*Math.PI*radius*(radius+height); } } } public class Triangle { private readonly double a; private readonly double b; private readonly double c; private readonly double height; private readonly double width; public double Height { get { return height; } } public double Width { get { return width; } } public Triangle(double height,double width) { this.height = height; this.width = width; } public Triangle(double a, double b, double c) { this.a = a; this.b = b; this.c = c; } public double Area() { return (height*width)/2; } public double Perimeter() { return a + b + c; } } public class Rectangle { private readonly double height; private readonly double width; public double Height { get { return height; } } public double Width { get { return width; } } public Rectangle(double height,double width) { this.height = height; this.width = width; } public double Perimeter { get { return 2*(width + height); } } public bool IsSquare { get { return width == height; } } public double Area { get { return height*width; } } } public class Circle { private readonly double radius; public Circle(double radius) { this.radius = radius; } public double Radius { get { return radius; } } public double Area { get { return Math.PI*radius*radius; } } public double Circumference { get { return 2*Math.PI*radius; } } public static double RadiusFromArea(double area) { return Math.Sqrt(area/Math.PI); } public static double RadiusFromCircumference(double circumference) { return Math.Sqrt(circumference/(2*Math.PI)); } } public class Sphere : IObject3D { private readonly double radius; public Sphere(double radius) { this.radius = radius; } public double Radius { get { return radius; } } public static double RadiusFromVolume(double volume) { return Math.Pow((volume)/(4/3.0*Math.PI), (1/3.0)); } public static double RadiusFromSurfaceArea(double surfaceArea) { return Math.Sqrt(surfaceArea/(4*Math.PI)); } public double Volume { get { return 4/3.0 * Math.PI * Math.Pow(radius,3); } } public double SurfaceArea { get { return 4*Math.PI*radius*radius; } } } public interface IObject3D { double Volume { get; } double SurfaceArea { get; } }
  24. Who this book is for : If you're checking out this book for the first time, do understand that itΓÇÖs targeted at experienced software professionals or graduate students of computer science (so donΓÇÖt expect three chapters on iteration or decision constructs!). It is perfect for anyone who is interested in the new .NET Framework 4.5 and the C# language. Whether you are moving to .NET for the first time or are already writing applications using previous .NET versions, this book will provide you with a comprehensive grounding in the new technology and serve as a complete reference throughout your coding career. Table of Contents : 1. The Philosophy of .NET 2. A Survey of .NET Development Tools 3. Core C# Programming Constructs Part I 4. Core C# Programming Constructs Part II 5. Encapsulation 6. Inheritance and Polymorphism 7. Structured Exception Handling 8. Working with Interfaces 9. Generics and Collections 10. Delegates, Events and Lambda Expressions 11. Advanced C# Language Features 12. LINQ to Objects 13. Understanding Object Lifetime 14. Building and Configuring Class Libraries 15. Reflection, Dynamic Loading, Late Binding, and Attributes 16. The Dynamic Language Runtime 17. Processes and AppDomains 18. CIL and the Role of Dynamic Assemblies 19. Multithreaded and Asynchronous Programming 20. Working with I/O Services and Object Serialization 21. ADO.NET Part I: The Connected Layer 22. ADO.NET Part II: The Disconnected Layer 23. ADO.NET Part III: The Entity Framework 24. LINQ to XML 25. Windows Communication Foundation 26. Windows Workflow Foundation 27. Introducing WPF and XAML 28. The WPF Control Programming Model 29. WPF Graphical Render Services 30. WPF Resources, Animations and Styles 31. WPF Control Templates 32. Introducing ASP.NET Web Forms 33. ASP.NET Web Controls, Master Pages and Themes 34. State Management Techniques Book Details : Paperback: 1560 pages Publisher: Apress; 6th Edition (August 2012) Language: English ISBN-10: 1430242337 ISBN-13: 978-1430242338 ტორენტი: http://thepiratebay.sx/torrent/7628287/Pro_Csharp_5.0_And_The_NET_4.5_Framework_6th_Edition_V413HAV
×
×
  • შექმნა...