Си Шарп примеры программ

Всем привет,
сегодня мы будем делать игровой автомат.

Суть, у нас будет форма с 3 барабанами, каждый барабан будет содержать только цифры от 0 до 9. Игроку при старте игры будет даваться стартовые $100, он может делать ставки 5-10-15 и т.д до $50, после нажатия рычага, у игрока 5 попыток, выигрыш зависит от количества совпадений и ранга чисел, максимальный выигрыш привязан к 7-7-7
Читать далее Делаем «однорукого бандита».

Игра «Печатная машинка» на С#

Всем привет, сегодня мы напишем игрушку, суть следующая:

  1. В форме будут появляться случайные буквы.
  2. Если игрок вводит буквы правильно, они исчезают — уровень растет и буквы появляются все чаще.
  3. Если вся форма заполнена буквами игра окончена.

Кому лень читать(ниже), могут сразу скачать проект [download-attachment title=»WinFormsApp_HitTheKey»]

Графическая «доска» на C# за 10 минут.

Всем привет, сегодня мы сделаем простую графическую программу.

Примеры моих программ на C#


Кому лень читать (ниже) могут скачайте готовый проект [download-attachment title=»WinFormsApp_Paint»]

Поехали.
1) Создаем WinForms проект, обзываем его «WinFormsApp_Paint»
2) Меняем для формы значение св-ва Text = «MyPaint»
3) Кидаем на форму 3 элемента Label, 1 элемент NumericUpDown, 1 кнопку.
4) Для label1 св-во Text = «Выбрать цвет». Расположить в левом верхнем углу.
5) Под label1 располагаем label2
+ Очищаем св-во Text.
+ Выставляем св-ву autosize = false;
+ св-ву Size = 50;50
Читать далее Графическая «доска» на C# за 10 минут.

Создаем элемент управления для панели элементов(Toolbox) Visual Studio

Всем привет,
Сегодня мы будем делать элемент управления(Control) для масштабирования изображений, мне на текущий момент известно 2 способа, один из них мы сегодня используем.
Кому лень читать (ниже) могут скачайте готовый проект [download-attachment title=»WinFormsApp_UserControls»]

Поехали.
1) Создаем проект WinForm, называем его WinFormsApp_UserControls
2) Теперь добавляем элемент UserControl.

3) У нас открывается UserControl1.cs[Конструктор], переходим в свойства этого объекта, задаем Size: 500;500
Читать далее Создаем элемент управления для панели элементов(Toolbox) Visual Studio

Программа для просмотра изображений на C#

Всем привет,
Сегодня сделаем софтину для просмотра картинок и гифок, программка будет короткой, но рабочей).
Кому лень читать(ниже), могут сразу скачать готовый проект [download-attachment title=»WinFormsApp_ViewPicture»]

Поехали,
1) Cоздаем проект WinForms, даем название проекту WinFormsApp_ViewPicture
2) Свойству Text присваиваем значение «View Picture».
3) Кидаем на форму элемент PictureBox растягиваем его по краям, но оставляем снизу место для кнопки.
+ Свойству SizeMode выставляем значение Zoom, для того чтобы выбираемая нами картина изменяла размера под размер элемента PictureBox.
+ Свойству Anckor выставляем круговую привязку к форме = «Top,Bottom,Left,Right»
4) Кидаем на форму элемент OpenFileDialog.
6) Теперь кидаем на форму в самый низ кнопку, свойству text присваиваем значение «Open Image»
+ Свойству Anckor выставляем = «Bottom,Right», то есть привязываем кнопку к правого нижнему краю.

Теперь наша форма выглядит так:

Делаем простой редактор txt

Всем привет,
Сегодня мы будем делать редактор текстовых файлов, который будет уметь открывать уже существующие файлы и создать новые txt-файлы.
Кому читать дальше лень, могут скачать готовый проект [download-attachment title=»SimpleTextEditor»]

1)Создаем WinForms проект называем его, например, WinFormsApp_SimpleTextEditor
2) Кидаем на форму textBox и 2 кнопки, св-во name 1 кнопки = buttonOpen, 2-ой кнопки name = buttonSave.
+Anchor: bottom,right — для обеих кнопок.

textBox св-ва:
Anchor: Top, Bottom,Left,Right
ScrollBars: Vertical

На выходе должно получиться так:

3) Теперь кидаем на форму 2 диалоговых окна:
Читать далее Делаем простой редактор txt

Работает с картами в WinForms без использования JS! или Библиотека GMAP.net

Не давно был на одном из совещаний и там, один бизнес-аналитик показал, так называемую «тепловую» карту, на карту Москвы он вывел все торговые точки наших клиентов, в итоге можно было визуально оценить какие зоны у нас сильно загружены, средне и слабо. Однако, сделал он это с использованием JS+браузер. НО у меня с JS совсем плохо и я озадачился вопросом, а можно ли тоже самое сделать для desctop без использования JS, только на С#. Оказалось можно.

Кому лень читать, могут скачать сразу готовый проект [download-attachment title=»DescMaps»]
Я также сделал себя краткий [download-attachment title=»мануал по библиотеке GMAP.net»]

Итак, погнали.
1)Создаем WinForms проект называем его DescMaps.

Полезное и понятное видео по машинной математике

Опубликовано 05.01.2018 12.02.2018 Рубрики Рекомендую к просмотру

Ежегодная конференция Microsoft Connect 2017

Очень рекомендую посмотреть видео до конца )

Опубликовано 05.01.2018 13.02.2018 Рубрики Рекомендую к просмотру

Форма обратной связи на C#

Всем привет,
В середине декабря на работе было много задач по GPS трекерам, в ходе решения этих задач, пришло понимание, что для оптимизации работы и обслуживания трекеров, нужно специализированное ПО, немного подумав решил сделать софт сам. Один из модулей должен будет формировать сервисную заявку монтажникам, через email.
Вот тут я подумал, а может быть кому то еще интересно как это можно сделать, т.к. по факту это та же форма обратной связи, которая есть почти на каждом сайте, почему бы такую форму ни прикрутить к программе для возможности пользователя влиять на развитие софта.

Читайте также:
Как проверить блок питания компьютера на работоспособность программой

Кому лень читать, могут сразу скачать готовый проект [download-attachment title=»WinForm_Feedback»]

1)Для начала создадим проект, например, WinForm.
2) Даем ему название Feedback.
3) Кидаем на форму 3 textBox: Первый будет имя автора письма, второй для тема письма, третий для тела письма.
4) Даем им соответствующие имена: textBoxName, textBoxSubject и textBoxBody.
5) Еще добавляем кнопку, для отправки, в св-во Title прописываем «Отправить», в Name «buttonSubmit».
В итоге у вас должна получить вот такая форма:

Источник: programming-csharp.ru

Занимательный C#. Пять примеров для кофе-брейка

Написав уже не одну статью про Veeam Academy, мы решили приоткрыть немного внутренней кухни и предлагаем вашему вниманию несколько примеров на C#, которые мы разбираем с нашими студентами. При их составлении мы отталкивались от того, что наша аудитория — это начинающие разработчики, но и опытным программистам тоже может быть интересно заглянуть под кат. Наша цель — показать, насколько глубока кроличья нора, параллельно объясняя особенности внутреннего устройства C#.

С другой стороны, мы будем рады комментариям опытных коллег, которые или укажут на недочёты в наших примерах, или смогут поделиться своими. Подобные вопросы любят использовать на собеседованиях, так что наверняка нам всем есть что рассказать.

Надеемся, что наша подборка будет для вас полезна, поможет освежить ваши знания или просто улыбнет.

image

Пример 1

Структуры в C#. С ними нередко возникают вопросы даже у опытных разработчиков, чем так часто любят пользоваться всевозможные онлайн-тесты.

Наш первый пример – пример на внимательность и на знание того, во что разворачивается блок using. А также вполне себе тема для общения во время собеседования.

public struct SDummy : IDisposable < private bool _dispose; public void Dispose() < _dispose = true; >public bool GetDispose() < return _dispose; >static void Main(string[] args) < var d = new SDummy(); using (d) < Console.WriteLine(d.GetDispose()); >Console.WriteLine(d.GetDispose()); > >
Что выведет на консоль метод Main?

Обратим внимание, что SDummy – это структура, реализующая интерфейс IDisposable, благодаря чему переменные типа SDummy можно использовать в блоке using.

Согласно спецификации языка C# using statement для значимых типов во время компиляции разворачивается в try-finally блок:

try < Console.WriteLine(d.GetDispose()); >finally

Итак, в нашем коде внутри блока using вызывается метод GetDispose(), который возвращает булевское поле _dispose, значение которого для объекта d еще нигде не было задано (оно задается только в методе Dispose(), который еще не был вызван) и поэтому возвращается значение по умолчанию, равное False. Что дальше?

А дальше самое интересное.
Выполнение строки в блоке finally

((IDisposable)d).Dispose();

image

в обычном случае приводит к упаковке (boxing). Это нетрудно увидеть, например,

В этом случае метод Dispose вызывается уже для другого объекта, а вовсе не для объекта d.
Запустим нашу программу и увидим, что программа действительно выводит на консоль «False False». Но все ли так просто? 🙂

На самом деле никакой УПАКОВКИ НЕ ПРОИСХОДИТ. Что, по словам Эрика Липперта, сделано ради оптимизации (см. тут и тут).
Но, если нет упаковки (что само по себе может показаться удивительным), почему на экране «False False», а не «False True», ведь Dispose теперь должен применяться к тому же объекту.

Появилась новая переменная sDummy2, к которой применяется метод Dispose()!
Откуда взялась эта скрытая переменная?
Снова обратимся к спеке:

A using statement of the form ‘using (expression) statement’ has the same three possible expansions. In this case ResourceType is implicitly the compile-time type of the expression… The ‘resource’ variable is inaccessible in, and invisible to, the embedded statement.

Т.о. переменная sDummy оказывается невидимой и недоступной для встроенного выражения (embedded statement) блока using, а все операции внутри этого выражения производятся с другой переменной sDummy2.

В итоге метод Main выводит на консоль «False False», а не «False True», как считают многие из тех, кто столкнулся с этим примером впервые. При этом обязательно имейте в виду, что тут не происходит упаковки, но создается дополнительная скрытая переменная.

Общий вывод такой: изменяемые значимые типы (mutable value types) – это зло, которое лучше избегать.

Похожий пример рассмотрен тут. Если тема интересна, очень рекомендуем заглянуть.

Хочется сказать отдельное спасибо SergeyT за ценные замечания к этому примеру.

Пример 2

Конструкторы и последовательность их вызовов – одна из основных тем любого объектно-ориентированного языка программирования. Иногда такая последовательность вызовов может удивить и, что гораздо хуже, даже «завалить» программу в самый неожиданный момент.

Читайте также:
В чем заключается основное функциональное предназначение программы компас 3d

Итак, рассмотрим класс MyLogger:

class MyLogger < static MyLogger innerInstance = new MyLogger(); static MyLogger() < Console.WriteLine(«Static Logger Constructor»); >private MyLogger() < Console.WriteLine(«Instance Logger Constructor»); >public static MyLogger Instance < get < return innerInstance; >> >

Предположим, что этот класс обладает некоторой бизнес-логикой, необходимой нам для поддержки логирования (функциональность сейчас не так важна).

Посмотрим, что есть в нашем классе MyLogger:

  1. Задан статический конструктор
  2. Есть приватный конструктор без параметров
  3. Определена закрытая статическая переменная innerInstance
  4. И есть открытое статическое свойство Instance для общения с внешним миром

Снаружи класса (без использования ухищрений типа reflection) мы можем использовать только открытое статическое свойство Instance, которое можем вызвать так:

class Program < public static void Main() < var logger = MyLogger.Instance; >>
Что выведет эта программа?

Все мы знаем, что статический конструктор вызывается перед доступом к любому члену класса (за исключением констант). При этом запускается он единственный раз в рамках application domain.

В нашем случае мы обращаемся к члену класса — свойству Instance, что должно вызвать сначала запуск статического конструктора, а потом вызовет конструктор экземпляра класса. Т.е. программа выведет:

Static Logger Constructor
Instance Logger Constructor

Однако после запуска программы мы получим на консоли:

Instance Logger Constructor
Static Logger Constructor

Как так? Инстанс конструктор отработал раньше статического конструктора.
Ответ: Да!

В стандарте ECMA-334 языка C# на счет статических классов указано следующее:

17.4.5.1: «If a static constructor (§17.11) exists in the class, execution of the static field initializers occurs immediately prior to executing that static constructor.

17.11: … If a class contains any static fields with initializers, those initializers are executed in textual order immediately prior to executing the static constructor

(Что в вольном переводе значит: если в классе есть статический конструктор, то запуск инициализации статических полей происходит непосредственно ПЕРЕД запуском статического конструктора.

Если класс содержит какие-либо статические поля с инициализаторами, то такие инициализаторы запускаются в порядке следования в тексте программы непосредственно ПЕРЕД запуском статического конструктора.)

В нашем случае статическое поле innerInstance объявлено вместе с инициализатором, в качестве которого выступает конструктор экземпляра класса. Согласно стандарту ECMA инициализатор должен быть вызван ПЕРЕД вызовом статического конструктора. Что и происходит в нашей программе: конструктор экземпляра, являясь инициализатором статического поля, вызывается ДО статического конструктора. Согласитесь, довольно неожиданно.

Обратим внимание, что это верно только для инициализаторов статических полей. В общем случае статический конструктор вызывается ПЕРЕД вызовом конструктора экземпляра класса.

Как, например, тут:

class MyLogger < static MyLogger() < Console.WriteLine(«Static Logger Constructor»); >public MyLogger() < Console.WriteLine(«Instance Logger Constructor»); >> class Program < public static void Main() < var logger = new MyLogger(); >>

И программа ожидаемо выведет на консоль:

Static Logger Constructor
Instance Logger Constructor

image

Пример 3

Программистам часто приходится писать вспомогательные функции (утилиты, хелперы и т.д.), чтобы облегчать себе жизнь. Обычно такие функции довольно просты и часто занимают всего несколько строк кода. Но споткнуться можно даже на ровном месте.

Пусть нам необходимо реализовать такую функцию, которая проверяет число на нечетность (т.е. что число не делится на 2 без остатка).

Реализация может выглядеть так:

static bool isOddNumber(int i)

На первый взгляд все хорошо и, например, для чисел 5,7 и 11 мы ожидаемо получаем True.

А что вернет функция isOddNumber(-5)?

-5 нечетное число, но в качестве ответа нашей функции мы получим False!
Разберемся, в чем причина.

Согласно MSDN про оператор остатка от деления % написано следующее:
«Для целочисленных операндов результатом a % b является значение, произведенное a — (a / b) * b»
В нашем случае для a=-5, b=2 мы получаем:
-5 % 2 = (-5) — ((-5) / 2) * 2 = -5 + 4 = -1
Но -1 всегда не равно 1, что объясняет наш результат False.

Оператор % чувствителен к знаку операндов. Поэтому, чтобы не получать таких «сюрпризов», лучше результат сравнивать с нулем, у которого нет знака:

static bool isOddNumber(int i)

Или завести отдельную функцию проверки на четность и реализовать логику через нее:

static bool isEvenNumber(int i) < return (i % 2 == 0); >static bool isOddNumber(int i)

Пример 4

Все, кто программировал на C#, наверняка встречался с LINQ, на котором так удобно работать с коллекциями, создавая запросы, фильтруя и агрегируя данные…

Простая программа на C#

Давайте создадим новое консольное приложение в среде Visual Studio 2010 и наберем следующий код:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 < class Program < static void Main(string[] args) < // Форматируем шапку программы Console.BackgroundColor = ConsoleColor.Green; Console.ForegroundColor = ConsoleColor.Black; Console.WriteLine(«********************»); Console.WriteLine(«**** Мой проект ****»); Console.WriteLine(«********************»); // Основная программа Console.BackgroundColor = ConsoleColor.Black; Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine(); Console.WriteLine(«Hello, World!»); // Ожидание нажатия клавиши Enter перед завершением работы Console.ReadLine(); >> >

Читайте также:
Программы похожие на 1с

В результате получилось определение типа класса, поддерживающее единственный метод по имени Main(). По умолчанию классу, в котором определяется метод Main(), в Visual Studio 2010 назначается имя Program; при желании это имя легко изменить. Класс, определяющий метод Main(), должен обязательно присутствовать в каждом исполняемом приложении на C# (будь то консольная программа, настольная программа для Windows или служба Windows), поскольку он применяется для обозначения точки входа в приложение.

Чтобы посмотреть результат работы данного приложения на этапе отладки, в программной среде Visual Studio 2010 необходимо нажать кнопку «Начать отладку» или нажать . Результатом отладки этого приложения будет консольное окно следующего вида:

Пример консольного приложения

Давайте проанализируем данную программу более подробно, начиная с ее имени.

В отличие от ряда других языков программирования, и в особенности Java, где имя файла программы имеет большое значение, имя программы на C# может быть произвольным. Visual Studio по умолчанию задает имя Program.cs, при этом в C# файл с исходным текстом этой программы можно было бы назвать как угодно. Например, его можно было назвать Sample.cs, Test.cs или даже X.cs.

Обратите внимание, что в файлах с исходным текстом программ на C# условно принято расширение .cs, и это условие вы должны соблюдать. Кроме того, многие программисты называют файлы с исходным текстом своих программ по имени основного класса, определенного в программе.

Рассмотрим первую строку программы:

using System;

Эта строка означает, что в программе используется пространство имен System. В C# пространство имен определяет область объявлений. Благодаря пространству имен одно множество имен отделяется от других. По существу, имена, объявляемые в одном пространстве имен, не вступают в конфликт с именами, объявляемыми в другом пространстве имен.

В анализируемой программе используется пространство имен System, которое зарезервировано для элементов, связанных с библиотекой классов среды .NET Framework, применяемой в C#. Ключевое слово using просто констатирует тот факт, что в программе используются имена в заданном пространстве имен. (Попутно обратим внимание на весьма любопытную возможность создавать собственные пространства имен, что особенно полезно для работы над крупными проектами.)

Хочу обратить ваше внимание, что использование данной строки в программе не обязательно, т.к. в C# можно всегда полностью определить имя с помощью пространства имен, к которому оно принадлежит. Например, строку

Console.WriteLine(«Hello, World!»);

можно переписать следующим образом

System.Console.WriteLine(«Hello, World!»);

Однако указывать пространство имен System всякий раз, когда используется член этого пространства, — довольно утомительное занятие, и поэтому большинство программистов на C# вводят директиву using System в начале своих программ. Следует, однако, иметь в виду, что любое имя можно всегда определить, явно указав его пространство имен, если в этом есть необходимость.

С помощью ключевого слова namespace объявляется пространство имен, с которым должен быть ассоциирован класс. Весь код в последующих фигурных скобках рассматривается как принадлежащий этому пространству имен. Оператор using специфицирует пространство имен, которое должен просматривать компилятор в поисках классов, упомянутых в коде, но не определенных в текущем пространстве имен. Это служит тем же целям, что оператор import в Java и using namespace в С++.

Перейдем к следующей строке программы:

class Program

В этой строке ключевое слово class служит для объявления вновь определяемого класса. Класс является основной единицей инкапсуляции в C#, a Program — это имя класса. Определение класса начинается с открывающей фигурной скобки «». Элементы, заключенные в эти фигурные скобки, являются членами класса.

Не вдаваясь пока что в подробности, достаточно сказать, что в C# большая часть действий, выполняемых в программе, происходит именно в классе.

Метод Main(), как уже говорилось, является точкой входа в программу. Формально класс, в котором определяется метод Main(), называется объектом приложения. Хотя в одном исполняемом приложении допускается иметь более одного такого объекта (это может быть удобно при проведении модульного тестирования), при этом обязательно необходимо информировать компилятор о том, какой из методов Main() должен использоваться в качестве входной точки. Для этого нужно либо указать опцию main в командной строке, либо выбрать соответствующий вариант в раскрывающемся списке на вкладке Application (Приложение) окна редактора свойств проекта в Visual Studio 2010.

Обратите внимание, что в сигнатуре метода Main() присутствует ключевое слово static. Oбласть действия статических (static) членов охватывает уровень всего класса (а не уровень отдельного объекта) и потому они могут вызываться без предварительного создания нового экземпляра класса.

Внутри метода Main() используется несколько встроенных методов предопределенного класса Console, в частности BackgroundColor — задает цвет фона, ForegroundColor — задает цвет контента (в нашем случае текста), WriteLine() — выводит на экран строку и ReadLine() — считывает данные из консоли.

Последним, немаловажным элементом являются комментарии, подробно расписанные в следующей статье.

Источник: professorweb.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru