Jump to content
IT-პროგრამირების ფორუმი

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

Jabber


Skype


ლოკაცია


ინტერესები

Found 31 results

  1. განხილვა: C# Attribute

    სათაური: 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. C# app + SQLite Database

    მოგესალმებით, ბიჭებო მოკლედ ესეთი რაღაც გავაკეთოთ... ვიფიქრე და ყველაზე პრაქტიკული გადაწყვეტილება მაინც როდესაც ვინმეს, მაგალითად ლომბარდს პროგრამას უწერ, რომელიც მხოლოდ ლოკალურად მუშაობს ანუ ერთი ოფისი აქვს ბაზის მხარის გაკეთება სად უფრო იოლი და ხარისხიანი იქნებოდა. Access ან სერვერების დასტარტვას და ასე შემდეგ SQLite ის გამოყენება ვამჯობინე, თქვენი აზრიც დაწერეთ. ვამჯობინე იმიტომ რომ პროგრამას გახსნისას ბაზა დაიქოქება და ერთი ბაზის ფაილს შექმნის ფოლდერშივე. და შემდეგ იქ ხდება ქონექშენი. ანუ მე SQLite ვამჯობინე ამ შემთხვევისთვის, რადგან თავიდან ავიცილო ზედმეტი წვალება სერვერის მოქოქვა და ასე შემდეგ და თუ უკეთესი იდია იცით დაწერეთ. ასევე მოვიძიოთ სორსები და დავყაროთ აქ როგორ ხდება აპპიდან SQLite ბაზასთან მუშაობა
  5. 3D 2048

    ესაა ჩემი დაწერილი 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. ტეტრისი windows forms-ში

    ესაა ჩემი დაწერილი ტეტრისი, ყველაზე კარგი გადაწყვეტა არაა მარა მაინც გამოდგება 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; } } }
  9. პროგრამირების ქართული ვიდეოგაკვეთილების საიტის გაკეთებას ვაპირებთ და რომელ ენების გაკვეთილების დადებას მირჩევთ?
  10. task manager wpf-ში

    ესაა ჩემი დაწერილი Task Manager. ჯერ დაუმთავრებელია,ბევრი რაღაცაა გასაკეთებელი და შესაცვლელი, მაგრამ მგონი რაღაცა გამოდის run as admin-ით უნდა ჩაირთოს. პროგრამის ლინკი: http://bin.ge/dl/136574/taskmgr.zip.html
  11. ეს არის ფეისბუქის კომენტარების ფლუდერი. თქვენ წერთ ტექსტს, რომელიც გინდათ რომ გამოჩნდეს. ქვემოთ უწერთ რაოდენობას, რამდენჯერაც გინდათ რომ დაიპოსტოს. მერე აწვებით სტარტს და მაუსს აწკაპუნებთ კომენტარის დაწერის ზოლზე, რის შემდეგაც იმდენჯერ დაკომენტარდება რამდენიც რაოდენობა გქონდათ მითითებული. ესეც კოდი: 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}"); } თუ რამეს ვერ გაიგებთ, დაწერეთ.
  12. აქ დაწერეთ ხოლმე თხოვნები ვიზუალ ნეტთან დაკავშირებით. ყველაფერი რაც არ მოიცავს მხოლოდ ერთ რომელიმე კონკრეტულ ენას და დაკავშირებულია ვიზუალ ნეტ-თან, იკითხეთ და ითხოვეთ აქ.
  13. ანდროიდის სისტემის ტელეფონებისთვის არსებობს პროგრამა 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 წამიან ტაიმერს. ესეც სრული კოდი:
  14. ალბათ ყველანი შეხვედრიხართ ან გაგიგიათ მაინც 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 კომპონენტი და ა.შ. ასეთ შემთხვევაში კარგი იქნება, თუ კოდს ამ თემაშივე დადებთ.
  15. TaskManager WPF-ში.

    ჩემი დაწერილი ძალით 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>
  16. თუ იცით რაარის 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); }
  17. ამოცანა მდგომარეობს შემდეგში: ეს ამოცანა ცნობილია როგორ მონტი ჰოლის პარადოქსი და იხსნება შემდეგნაირად: თავდაპირველად კარის არჩევისას, იმისი შანსი რომ თხა ამოგვივიდეს, არის 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-ს მიწერა.
  18. 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
  19. ამ თემაში მინდა დავდოთ ხოლმე 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) დრო.
  20. რამოდენიმე გეომეტრიული ობიექტის კლასი დავწერე. 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; } }
  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. გრაფიკის აგება

    გაფიკის აგება თუ გიცდიათ?
  23. Pro C# 5.0 and the .NET 4.5 Framework

    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
  24. Microsoft Visual C# 2012 Step by Step

    Year: December 2012 Author: John Sharp Publisher: Microsoft Press ISBN: 978-0-7356-6801-0 Language: English Format: PDF Quality: Initially, computer (eBook) Interactive table of contents: Yes Number of pages: 848 Description: Teach yourself how to build applications with Microsoft Visual C # 2012 and Visual Studio ® 2012-one step at a time. Ideal for those with fundamental programming skills, this tutorial provides practical, learn-by-doing exercises for mastering core C # language features and creating working applications and components for Windows ®. Discover how to: • Work with variables, non-reserved identifiers, statements, operators, and methods • Use the new application models provided by Windows 8 and the Windows Runtime • Create interfaces and define abstract classes • Manage errors and exception handling • Use collection classes • Work with databases by using DataBinding with the Entity Framework • Respond to user input and gestures; gather input from devices and other sources • Handle events arising from multiple sources • Develop your first Windows 8 apps Introducing Microsoft Visual C# and Microsoft Visual Studio 2012 Chapter 1 : Welcome to C# Beginning Programming with the Visual Studio 2012 Environment Writing Your First Program Using Namespaces Creating a Graphical Application Summary Chapter 1 Quick Reference Chapter 2 : Working with Variables, Operators, and Expressions Understanding Statements Using Identifiers Using Variables Working with Primitive Data Types Using Arithmetic Operators Incrementing and Decrementing Variables Declaring Implicitly Typed Local Variables Summary Chapter 2 Quick Reference Chapter 3 : Writing Methods and Applying Scope Creating Methods Applying Scope Writing Methods Using Optional Parameters and Named Arguments Summary Chapter 3 Quick Reference Chapter 4 : Using Decision Statements Declaring Boolean Variables Using Boolean Operators Using if Statements to Make Decisions Using switch Statements Summary Chapter 4 Quick Reference Chapter 5 : Using Compound Assignment and Iteration Statements Using Compound Assignment Operators Writing while Statements Writing for Statements Writing do Statements Summary Chapter 5 Quick Reference Chapter 6 : Managing Errors and Exceptions Coping with Errors Trying Code and Catching Exceptions Using Checked and Unchecked Integer Arithmetic Throwing Exceptions Using a finally Block Summary Chapter 6 Quick Reference Understanding the C# Object Model Chapter 7 : Creating and Managing Classes and Objects Understanding Classification The Purpose of Encapsulation Defining and Using a Class Controlling Accessibility Understanding static Methods and Data Summary Chapter 7 Quick Reference Chapter 8 : Understanding Values and References Copying Value Type Variables and Classes Understanding Null Values and Nullable Types Using ref and out Parameters How Computer Memory Is Organized The System.Object Class Boxing Unboxing Casting Data Safely Summary Chapter 8 Quick Reference Chapter 9 : Creating Value Types with Enumerations and Structures Working with Enumerations Working with Structures Summary Chapter 9 Quick Reference Chapter 10 : Using Arrays Declaring and Creating an Array Populating and Using an Array Copying Arrays Using Multidimensional Arrays Summary Chapter 10 Quick Reference Chapter 11 : Understanding Parameter Arrays Overloading: A Recap Using Array Arguments Comparing Parameter Arrays and Optional Parameters Summary Chapter 11 Quick Reference Chapter 12 : Working with Inheritance What Is Inheritance? Using Inheritance Understanding Extension Methods Summary Chapter 12 Quick Reference Chapter 13 : Creating Interfaces and Defining Abstract Classes Understanding Interfaces Abstract Classes Sealed Classes Summary Chapter 13 Quick Reference Chapter 14 : Using Garbage Collection and Resource Management The Life and Times of an Object Resource Management Implementing Exception-Safe Disposal Summary Chapter 14 Quick Reference Defining Extensible Types with C# Chapter 15 : Implementing Properties to Access Fields Implementing Encapsulation by Using Methods What Are Properties? Understanding the Property Restrictions Declaring Interface Properties Generating Automatic Properties Initializing Objects by Using Properties Summary Chapter 15 Quick Reference Chapter 16 : Using Indexers What Is an Indexer? Indexers in Interfaces Using Indexers in a Windows Application Summary Chapter 16 Quick Reference Chapter 17 : Introducing Generics The Problem with the object Type The Generics Solution Creating a Generic Class Creating a Generic Method Variance and Generic Interfaces Summary Chapter 17 Quick Reference Chapter 18 : Using Collections What Are Collection Classes? Using Collection Initializers The Find Methods, Predicates, and Lambda Expressions Comparing Arrays and Collections Summary Chapter 18 Quick Reference Chapter 19 : Enumerating Collections Enumerating the Elements in a Collection Implementing an Enumerator by Using an Iterator Summary Chapter 19 Quick Reference Chapter 20 : Decoupling Application Logic and Handling Events Understanding Delegates Lambda Expressions and Delegates Enabling Notifications with Events Understanding User Interface Events Summary Chapter 20 Quick Reference Chapter 21: Querying In-Memory Data by Using Query Expressions What Is Language-Integrated Query? Using LINQ in a C# Application Summary Chapter 21 Quick Reference Chapter 22 : Operator Overloading Understanding Operators Understanding Compound Assignment Evaluation Declaring Increment and Decrement Operators Comparing Operators in Structures and Classes Defining Operator Pairs Implementing Operators Understanding Conversion Operators Summary Chapter 22 Quick Reference Building Professional Windows 8 Applications with C# Chapter 23 : Improving Throughput by Using Tasks Why Perform Multitasking by Using Parallel Processing? Implementing Multitasking with the .NET Framework Canceling Tasks and Handling Exceptions Summary Chapter 23 Quick Reference Chapter 24 : Improving Response Time by Performing Asynchronous Operations Implementing Asynchronous Methods Using PLINQ to Parallelize Declarative Data Access Synchronizing Concurrent Access to Data Summary Quick Reference Chapter 25 : Implementing the User Interface for a Windows Store App What Is a Windows Store App? Using the Blank App Template to Build a Windows Store App Summary Chapter 25 Quick Reference Chapter 26 : Displaying and Searching for Data in a Windows Store App Implementing the Model-View-ViewModel Pattern Windows 8 Contracts Summary Chapter 26 Quick Reference Chapter 27 : Accessing a Remote Database in a Windows Store App Retrieving Data from a Database Inserting, Updating, and Deleting Data in a Database Summary Chapter 27 Quick Reference Appendix : About the Author :download:
  25. dynamic ტიპი C# 4.0-ში

    .NET FrameWork 4.0 ვერსიაში შემოიღეს ახალი ტიპი სახელად dynamic. ეს არის დინამიური ტიპი და მას შეიძლება მიენიჭოს ნებისმიერი მნიშვნელობა. ამ ტიპის მონაცემები, თვისებები/მეთოდები მოწმდება მხოლოდ პროგრამის გაშვების დროს (runtime) და არა კომპილირების დროს. კომპილერი ამ დროს ვარაუდობს რომ ობიექტს აქვს ნებისმიერი ტიპის ოპერაციის მხარდაჭერა და ამიტომაც იგნორს უკეთებს. თქვენ შეგიძლიათ დაწეროთ ასე მაგალითდ: dynamic d1 = "salami scripts.ge!"; dynamic d2 = 7; განვიხილოთ ამ ტიპის უპირატესობა ერთ მაგალითზე: ვთქვათ, ვმუშაობთ რაღაც პროექტზე და გვჭირდება მოთხოვნებზე დავაბრუნოთ JSON მონაცემები, სიტყვაზე, კლიენტები, შეკვეთები, პროდუქტები და ა.შ. ასევე გვაქვს რაღაც Json მეთოდი რომელიც ჩვეულებრივ მონაცემებს აკონვერტებს JSON ფორმატში. და ჩვენ გვინდა რომ დავაბრუნებინოთ ისეთი პასუხი, რომელიც გვეტყვის ჩვენი მოთხოვნა განხორციელდა თუ არა, თუ არა მაშინ მიზეზიც გვითხრას. ამის განხორციელების ერთი მეთოდი არის კლასის შექმნა, რომელსაც ექნება საჭირო თვისებები და მერე დავაბრუნებინებთ მაგალითად კლიენტის მონაცემებს (კლიენტების ლისტს სიტყვაზე). ახლა ჩვენ შევძლებთ კლიენტების ლისტის დაბრუნებას CustomersData თვისებისთვის კლიენტების ლისტის გადაცემით. ეს ყველაფერი მშვენივრად იმუშავებს, მაგრამ რომ დავაკვირდეთ ვნახავთ, რომ სხვადასხვა ობიექტებისთვის მოგვიწევს ცალკე კლასების შექმნა. უკვე არსებული CustomersAPIResponse გარდა, უნდა გვქონდეს ProductsAPIResponse, OrdersAPIRespons. მეტისმეტად ბევრი კლასებია. როგორ მოვიქცეთ? უნდა მივმართოთ dynamic ტიპს. ეს ტიპი შეგვიძლია წარმატებით გამოვიყენოთ, როდესაც კომპილერს წინასწარ ვერ ვეტყვით რომ კონკრეტულად ეს ტიპი გვინდა. ზემოთ მოყვანილ მაგალითში CustomersData თვისების ტიპი იყო განსაზღვრული და ის იყო IEnumerable<Customer> ტიპის. კომპილერი დაეთანხმა ამ ტიპს და შეასრულა თავისი საქმე. dynamic ტიპის შემთხვევაში კომპილერი უგულვებელყოფს მას (ignore) და შეგვიძლია გადავცეთ ნებისმიერი ტიპის მონაცემი. აი მერე, პროგრამის შესრულების დროს მას მიენიჭება ის მნიშვნელობა რომელიც გადაეცემა. ამრიგად, შევცვალოთ ჩვენი კოდი: როგორც ხედავთ, Data-ს ტიპი არის დინამიური, რაც იმას ნიშნავს რომ ნებისმიერ რამეს მიიღებს ის და კომპილერი საერთოდ არ შეიწუხებს თავს მისთვის. ახლა კი შეგვიძლია მისი გამოყენება ჩვენს მეთოდებში. GetMockProductData აბრუნებს პროდუქტების ლისტს, ხოლო GetMockCustomerData - კლიენტებს. ჩვენი Data თვისება ამჯერად მშვენივრად მუშაობს და ითვისებს ნებისმიერ მონაცემს. შეიძლება დაგებადოთ კითხვა: ზუსტად var ქეივორდივით არ მუშაობს? პასუხია - არა! var მაინც მკაცრად განსაზღვრული ტიპია, მაგალითად თუ მიანიჭებთ ასეთ რამეს: ამის შემდეგ iamStrongType ხდება string ტიპის და მას სხვა ტიპის მნიშვნელობას ვერ მივანიჭებთ. მაგალითდ ეს შეცდომას ამოგვიგდებს: ამის გარდა var ტიპის თვისება ვერანაირად ვერ გვექნება და ეს კიდევ ერთი პლიუსია dynamic ტიპისა. var შეგვიძლია გამოვიყენოთ, მაგალითად, ობიექტის შექმნისას, ან კიდევ როდესაც რაიმეს დაბრუნება გვინდა მაგრამ კლასის შექმნა გვესიკვდილება. Object vs. Dynamic object კლასი საბაზოა, ხოდა მისი გამოყენებაც ხომ შეგვიძლია? მართალია, მაგრამ ამ შემთხვევაში მოგვიწევს მისი კონკრეტულ ტიპზე დაყვანა (კონვერტაცია). თემა გადმოთარგმნილია codeproject-დან და მისი ორიგინალის ავტორია: kshyju.
×