суббота, 30 июня 2012 г.

C# Работа с математическими функциями. Библиотека Math

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

Методы перечислены в таблице ниже:


Описание
Math.Acos(double p1)
Возвращает арккосинус параметра p1 -->  p1∈[-1;1]
Math.Asin(double p1)
Возвращает арксинус параметра p1 -->  p1∈[-1;1]
Math.Atan(double p1)
Возвращает арктангенс p1
Math.Atan2(double x, double y)
Возвращает арктангенс частного x/y
Math.Ceiling(double p1)
Возвращает наименьшее целое (представленное в виде значения с плавающей точкой), которое не меньше параметра p1. Например, при p1, равном 1.02, метод Ceiling() возвратит 2.0. А при p1, равном -1.02, метод Ceiling() возвратит -1 
Math.Cos(double p1)
Возвращает косинус параметра p1
Math.Cosh(double p1)
Возвращает гиперболический косинус параметра p1
Math.Exp(double p1)
Возвращает основание натурального логарифма е, возведенное в степень p1
Math.Floor(double p1)
Возвращает наибольшее целое (представленное в виде значения с плавающей точкой), которое не больше параметра p1. Например, при p1, равном 1.02, метод Floor() возвратит 1.0. А при p1, равном -1.02, метод Floor() возвратит -2
Math.IEEERemainder(double x,double y)
Возвращает остаток от деления x/y
Math.Log(double p1)
Возвращает натуральный логарифм для параметра p1
Math.Log(double p1, double p2)
Возвращает логарифм для параметра p1 по основанию p2
Math.Log10(double p1)
Возвращает логарифм для параметра v по основанию 10
Math.Pow( double base, double exp)
Возвращает значение base, возведенное в степень exp
Math.Round(double p1)
Возвращает значение p1, округленное до ближайшего целого числа
Math.Sign(double p1)
Возвращает -1, если значение v меньше нуля, 0, если p1 равно нулю, и 1, если v больше нуля
Math.Sin(double p1)
Возвращает синус параметра p1
Math.Sinh(double p1)
Возвращает гиперболический синус параметра p1
Math.Tan(double p1)
Возвращает тангенс параметра p1
Math.Sqrt(double p1)
Возвращает квадратный корень параметра p1

Пример использования:


        private void Form1_Load(object sender, EventArgs e)
        {

            label1.Text = Math.Pow(5, 7).ToString();
        }

пятница, 29 июня 2012 г.

Реализация метода Гронфельда на python

Думаю многие, начиная изучать программирование, хотели бы написать программы для шифрования данных или взлома компьютерных систем. Взломом я не занимаюсь, а вот помочь написать простую программу для шифрования текста - пожалуйста.
Итак, мы реализуем простой алгоритм – называемый шифром Гронсфельда. Шифр Гронсфельда представляет собой модификацию шифра Цезаря числовым ключом. Для этого под буквами исходного сообщения записывают цифры числового ключа. Если ключ короче сообщения, то его запись циклически повторяют. Шифр-текст получают примерно, как в шифре Цезаря, но отсчитывают по алфавиту не третью букву (как это делается в шифре Цезаря), а выбирают ту букву, которая смещена по алфавиту на соответствующую цифру ключа.
Мы будем использовать для кодирования не только буквы алфавита, но и символы юникода. Наверное, вы все знаете, что каждому символу соответствует специальный код. Чтобы посмотреть воспользуемся встроенными функциями python.
>>> ord(u'А')
1040
И обратное преобразование:
>>> print unichr(1040)
А
В нашем алгоритме мы просто будем сдвигать код символа на значение ключа. Например если значение ключа для данного символа будет 3 (например для ‘А’), то в зашифрованном виде вместо А мы выведем символ с кодом 1043 и тд.
Далее рассмотрим реализацию данного алгоритма на python.
class Grons:
    def __init__(self):
        self.symbol = []
    def code(self, str, key):
        output = ''
        i = 0
        for s in str:
            if s in self.symbol:
                output += s
            else:
                output += unichr(ord(s)+int(input_value[i]))
                if i == len(input_value) - 1:
                    i = 0
                i += 1
        return output
   
    def decode(self, str, key):
        output = ''
        i = 0
        for s in str:
            if s in self.symbol:
                output += s
            else:
                output += unichr(ord(s)-int(input_value[i]))
                if i == len(input_value) - 1:
                    i = 0
                i += 1
        return output
В данном классе у нас реализовано 3 метода: конструктор по умолчанию, метод шифрования и дешифрования.
В конструкторе мы устанавливаем массив символов, которые не нужно заменять. Я оставил его пустым, но можно, например не шифровать пробелы([‘ ‘]).
При шифровании мы передаём строку для шифрования и строку ключа.
Для дешифровки нам нужна получившаяся строка при шифровании и тот же ключ.
Пользоваться классом нужно так:
ex = Grons()
codetext = ex.code(u'''вкусный тор
                    алый red''', '2178')
print codetext
print ex.decode(dec, '2178')
Результатом выполнения будет:
дсфщфьс'уцч('!('!('!('!('!('!('буђк(yfl

вкусный тор
                    алый red
Чтобы запретить шифрование пробелов и переносов строк изменим конструктор на:
    def __init__(self):
        self.symbol = [' ','\r','\n']
В результате строка после шифрования будет выглядеть следующим образом:
дсфщфьс щпш

     змѓр smk
В данный статье был рассмотрен один из самых простых алгоритмов для шифрования текста. Он не отличается высокой криптостойкостью. Однако в некоторых случаях может пригодиться. Использование его оправдано, когда передаваемая зашифрованная информация быстро теряет актуальность, тогда даже в случаи подбора ключа, информация уже успеет устареть и никакого вреда не будет.
Оригинал статьи читаем тут, а так же другие интересные и полезные статьи на моём блоге.

Веб-сервисы в Django

Сегодня речь пойдёт о веб-сервисах на django. Для начала определим сам термин. Веб-cервис (англ. web service) — идентифицируемая веб-адресом программная система со стандартизированными интерфейсами. Веб-службы могут взаимодействовать друг с другом и со сторонними приложениями посредством сообщений, основанных на определённых протоколах (XML, JSON и т. д.). Веб-служба является единицей модульности при использовании сервис-ориентированной архитектуры приложения. (Данное определение взято свикипедии)
Прежде чем говорить об использовании сервисов, рассмотрим некоторые из преимуществ их использования:
  • Если ваш сервис был выложен в сети, другие приложения смогут использовать его возможности:
  • Веб-сервисы позволяют взаимодействовать приложениям, созданным на различных платформах и технологиях (например, сервис на c# может спокойно взаимодействовать с сервисом на java):
  • Веб-сервисы используют стандартизированные протоколы для общения. Все 4 слоя (сервис транспортировки, сообщения XML, описание сервисов и уровни обнаружения сервисов) используют один определённый протокол из тех, что используют веб-сервисы. Эта стандартизация протоколов по группам даёт бизнесу множество преимуществ, таких как широта выбора, уменьшение стоимости вследствие конкуренции и увеличение качества.
Это далеко не все преимущества данного подхода, однако и этой информации достаточно чтобы понять актуальность данной темы и хотя бы в общих чертах рассмотреть, как реализуются веб-сервисы.
В этой статье я рассмотрю два подхода к созданию сервисов: rest и xml-rpc. Это связано с простотой использования данных подходов в django, и лучше всего подойдёт для начинающих. В данной статье не будет подробно описаны все тонкости использования rest и xml-rpc, это всё есть в документации, мы только рассмотрим небольшие примеры использования.
Начнём с rest. REST (сокр. англ. Representational State Transfer, «передача состояния представления») — подход к архитектуре сетевых протоколов, обеспечивающих доступ к информационным ресурсам. В REST-сервисах акцент сделан на доступ к ресурсам, а не на исполнение удаленных сервисов. Например, вместо того чтобы запрашивать удаленное исполнение функции для нахождения нужного вам формуляра заказа, вы просто запрашиваете этот формуляр, примерно так же, как статичную Web-страницу.
На мой взгляд, наиболее простым и удобным инструментом для работы с rest в django является django-piston. Так же вы можете посмотреть в сторону Django Tastypie и Django REST framework.
Устанавливаем piston как описано в документации. 
В INSTALLED_APPS добавляем 'piston'.
В корне проекта создадим директорию api (обязательно создаём файл init.py). В этой же директории создадим файл handlers.py, в котором описываются интерфейсы работы с ресурсом, т.е. все манипуляции (CRUD) с нашей моделью.
Для примера в model создадим класс Book, с которым будем работать:
class Book(models.Model):
    title = models.CharField(, max_length=120)
    slug = models.CharField(max_length=50)
    description = models.TextField()

    def __unicode__(self):
        return self.title
Чтобы было проще тестировать забейте несколько книг в базу.
Теперь вернёмся к нашему файлу handlers.py. 
from piston.handler import BaseHandler
from app.models import Book
class BookHandler(BaseHandler):
    model = Book
    fields = ('id', 'title',)
В директории api создадим еще один файл - urls.py.
from django.conf.urls.defaults import *
from piston.resource import Resource
from api.handlers import FilmHandler

film_resource = Resource(FilmHandler)
urlpatterns = patterns('',
   url(r'^book/(?P\d+)/$', film_resource),
   url(r'^book/$', film_resource),
)
В urls.py проекта добавим ссылку на urls.py из api:
urlpatterns = patterns('',
   ...
   (r'^api/', include('api.urls')),
)
Теперь мы можем получить книги в формате json по адресуhttp://127.0.0.1:8000/api/books/:
[
    {
        "id": 1,
        "title": "Math"
    }, 
    {
        "id": 2,
        "title": "Math1"
    }
]
Так же piston берёт на себя всю работу по удалению, обновлению и добавлению данных, а так же многое другое. Подробнее об этом читайте в документации.
Теперь поговорим об xml-rpc. XML-RPC (сокр. от англ. Extensible Markup Language Remote Procedure Call — XML-вызов удалённых процедур) — стандарт/протокол вызова удалённых процедур, использующий XML для кодирования своих сообщений и HTTP в качестве транспортного механизма. Является прародителем SOAP, отличается исключительной простотой применения. XML-RPC, как и любой другой интерфейс RPC, определяет набор стандартных типов данных и команд, которые программист может использовать для доступа к функциональности другой программы, находящейся на другом компьютере в сети.
Для работы с этим протоколом в django ставим django-xmlrpc и добавляем в  INSTALLED_APPS ' django_xmlrpc'.
Для проверки работоспособности во views.py добавим функцию:
def multiply(a, b):
    return a*b
В settings.py:
XMLRPC_METHODS = (('app.views.multiply', 'mult'), )
В urls.py:
url(r'^xmlrpc/$', 'django_xmlrpc.views.handle_xmlrpc', name='xmlrpc'),
Теперь осталось написать клиента, который будет вызывать данную функцию и получать результаты её работы.
Клиент может выглядеть так:
import xmlrpclib
proxy = xmlrpclib.ServerProxy("http://localhost:8000/xmlrpc/")
rez = proxy.postsMet(2,5)
print rez
>>> 
10
>>>
На этом мы закончим рассмотрение способов создания сервисов на django. Надеюсь, это статья будет вам полезной.
Оригинал статьи читаем тут, а так же другие интересные и полезные статьи на моём блоге.

C# Информационное окно MessageBox

Это то, что надо знать обязательно при программировании, но не всегда в учебниках об этом упоминается.
Данное окно хорошо помогает при необходимости показать на экране промежуточное значение переменной, если нету желания добавлять новый элемент на форме.
Использоваться будет класс MessageBox который работает с типом данных string. Это означает, что если мы хотим показать на экране переменную, первоначальный формат которой int, long и др., то необходимо сделать конвертацию в текстовый формат.

Вот так выглядит простой пример использования:

        private void Form1_Load(object sender, EventArgs e)
        {
            MessageBox.Show("текст уведобмения в формате string");
        }


Пример с использованием конвертации при помощи метода ToString():  
        private void Form1_Load(object sender, EventArgs e)
        {
            double a = 11.0000;
            double b = 2;
            double c = a/b;
            MessageBox.Show(c.ToString());
        }

Если мы хотим получить результат без остатка, то можем воспользоваться методом Split().
Пример:
        private void Form1_Load(object sender, EventArgs e)
        {
            double a = 11.0000;
            double b = 2;
            double c = a/b;
            //Число -> index = 0
            MessageBox.Show("Число без остатка: "+c.ToString().Split(',')[0]);
            //Находжение остатка
            try
            {
                //если остаток есть
                //Остаток -> index = 1
                MessageBox.Show("Остаток:  " + c.ToString().Split(',')[1]);
            }
            catch {
                //если остатка нету
                MessageBox.Show("Числа "+a+" и "+b+" делятся без остатка");
            }

Учимся работать в Adobe Photoshop

Появилась у меня необходимость быстро и качественно научиться работать на этой прелести, хотя раньше имея линукс на своём ПК, работал в Gimp и было всё классно. Из-за этого фотошоп кажется немного неудобным, но без него никак.

Если вам тоже надо научиться работать в Adobe Photoshop и совсем нету желания тратить время на поиски информации, то готов вам показать, что нашёл я:
http://rutracker.org/forum/viewtopic.php?t=3074025

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

Если у вас нету аккаунта рутрэкера, то от долгой и утомительной регистрации вас спасёт вот эта статья.

C# Работа с классами и методами (функциями)

Класс — это шаблон, который определяет форму объекта. Он задает как данные, так и код, который оперирует этими данными. C# использует спецификацию класса для создания объекта. Объекты — это экземпляры класса. Таким образом, класс — это множество намерений (планов), определяющих, как должен быть построен объект. Важно четко понимать следующее: класс — это логическая абстракция. О ее реализации нет смысла говорить до тех пор, пока не создан объект класса, и в памяти не появилось физическое его представление.

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

Данные содержатся в переменных экземпляров, определяемых классом, а код — в методах. Однако важно с самого начала отметить, что класс определяет также ряд специальных членов данных и методов-членов, например статические переменные, константы, конструкторы, деструкторы, индексаторы, события, операторы и свойства.

Класс создается с помощью ключевого слова class. Общая форма определения класса, который содержит только переменные экземпляров и методы, имеет следующий вид:
class имя_класса {
           // Объявление переменных экземпляров. доступ тип переменная1;
           доступ тип переменная2;
           //...
           доступ тип переменнаяN;
           // Объявление методов.
           доступ тип_возврата метод1(параметры) {
                     // тело методов
           }
           доступ тип_возврата метод2(параметры) {
                     // тело метода
           }
           доступ тип_возврата методN(параметры) {
                     // тело метода
           }
}
Определение класса
Для иллюстрации мы создадим класс, который инкапсулирует информацию о зданиях (домах, складских помещениях, офисах и пр.). В этом классе (назовем его Building) будут храниться три элемента информации о зданиях (количество этажей, общая площадь и количество жильцов).

Ниже представлена первая версия класса Building. В нем определены три переменные экземпляра: floors, area и occupants. Обратите внимание на то, что класс Building не содержит ни одного метода. Поэтому пока его можно считать классом данных.

class Building
{
    public int floors; // количество этажей
    public int area; // общая площадь основания здания
    public int occupants; // количество жильцов
}

Чтобы реально создать объект класса Building, используйте, например, такую инструкцию:
Building house = new Building(); // Создаем объект // типа Building

При каждом создании экземпляра класса создается объект, который содержит собственную копию каждой переменной экземпляра, определенной этим классом. Таким образом, каждый объект класса Building будет содержать собственные копии переменных экземпляра floors, area и occupants. Для доступа к этим переменным используется оператор “точка” (.). Оператор “точка” связывает имя объекта с именем его члена. Общий формат этого оператора имеет такой вид:
объект.член
Как видите, объект указывается слева от оператора “точка”, а его член — справа. Например, чтобы присвоить переменной floors значение 2, используйте следующую инструкцию.
house.floors = 2;
В общем случае оператор “точка” можно использовать для доступа как к переменным экземпляров, так и методам.
Рассмотрим полную программу, в которой используется класс Building.



// Программа, в которой используется класс Building.
using System;
class Building {
  public int floors; // количество этажей
  public int area; // общая площадь основания здания
  public int occupants; // количество жильцов
}
// Этот класс объявляет объект типа Building.
class BuildingDemo
{
    public static void Main()
    {
        Building house = new Building(); // Создание объекта
        // типа Building.
        int areaPP; // Площадь, приходящаяся на одного жильца.
        // Присваиваем значения полям в объекте house.
        house.occupants = 4;
        house.area = 2500;
        house.floors = 2;
        // Вычисляем площадь, приходящуюся на одного жильца дома.
        areaPP = house.area / house.occupants;
        Console.WriteLine(
             "Дом имеет:\n " +

    house.floors + " этажа\n " +
    house.occupants + " жильца\n " +
    house.area +
    " квадратных футов общей площади, из них\n "
    + areaPP + " приходится на одного человека");
    }
}

Эта программа состоит из двух классов: Building и BuildingDemo. Внутри класса BuildingDemo метод Main() сначала создает экземпляр класса Building с именем house, а затем получает доступ к переменным этого экземпляра house, присваивая им конкретные значения и используя эти значения в вычислениях. Важно понимать, что Building и BuildingDemo — это два отдельных класса. Единственная связь между ними состоит в том, что один класс создает экземпляр другого. Хотя это отдельные классы, код класса BuildingDemo может получать доступ к членам класса Building, поскольку они объявлены открытыми, т.е. public-членами. Если бы в их объявлении не было спецификатора доступа public, доступ к ним ограничивался бы рамками класса Building, а класс BuildingDemo не имел бы возможности использовать их.

Если предыдущую программу назвать UseBuilding.cs, то в результате ее компиляции будет создан файл UseBuilding.exe. Классы Building и BuildingDemo автоматически становятся составными частями этого исполняемого файла. 



Методы (Функции)
Как упоминалось выше, переменные экземпляров и методы — две основные составляющие классов. Пока наш класс Building содержит только данные. Хотя такие классы (без методов) вполне допустимы, большинство классов имеют методы. Методы — это процедуры (подпрограммы), которые манипулируют данными, определенными в классе, и во многих случаях обеспечивают доступ к этим данным. Обычно различные части программы взаимодействуют с классом посредством его методов.

Любой метод содержит одну или несколько инструкций. В хорошей C#-программе один метод выполняет только одну задачу. Каждый метод имеет имя, и именно это имя используется для его вызова. В общем случае методу можно присвоить любое имя. Но помните, что имя Main() зарезервировано для метода, с которого начинается выполнение программы. Кроме того, в качестве имен методов нельзя использовать ключевые слова C#.

Имена методов в тексте этой книги сопровождаются парой круглых скобок. Например, если метод имеет имя getval, то в тексте будет написано getval(). Это помогает отличать имена переменных от имен методов.

Формат записи метода такой: 


доступ тип_возврата имя(список_параметров) {
// тело метода
Здесь элемент доступ означает модификатор доступа, который определяет, какие части программы могут получить доступ к методу. Модификатор доступа необязателен, и, если он не указан, подразумевается, что метод закрыт (private) в рамках класса, где он определен. Пока мы будем объявлять все методы как public- члены, чтобы их могли вызывать все остальные составные части программного кода, даже те, которые определены вне класса. 

С помощью элемента тип_возврата указывается тип значения, возвращаемого методом. Это может быть любой допустимый тип, включая типы классов, создаваемые программистом. Если метод не возвращает никакого значения, необходимо указать тип void. Имя метода, как нетрудно догадаться, задается элементом имя. В качестве имени метода можно использовать любой допустимый идентификатор, отличный от тех, которые уже использованы для других элементов программы в пределах текущей области видимости. Элемент список_параметров представляет собой последовательность пар (состоящих из типа данных и идентификатора), разделенных запятыми. 


Параметры — это переменные, которые получают значения аргументов, передаваемых методу при вызове. Если метод не имеет параметров, список_параметров остается пустым.  


Возврат значения

Хотя void-методы — не редкость, большинство методов все же возвращают значение. И в самом деле, способность возвращать значение — одно из самых полезных качеств метода.


Методы возвращают значения вызывающим их процедурам, используя следующую форму инструкции return:
return значение;
Здесь элемент значение и представляет значение, возвращаемое методом.
Пример консольного приложения:



// Демонстрация возврата значения методом areaPerPerson().

using System;

class Building
{
    public int floors; // количество этажей
    public int area; // общая площадь здания
    public int occupants; // количество жильцов
    // Возврат значения площади, которая
    // приходится на одного человека.
    public int areaPerPerson()
    {
        return area / occupants;
    }
}
// Использование значения от метода areaPerPerson().
class BuildingDemo
{
    public static void Main()
    {
        Building house = new Building();
        Building office = new Building();
        int areaPP;  // Площадь, которая приходится
        // на одного человека.
        // присваиваем значения полям в объекте house.
        house.occupants = 4;
        house.area = 2500;
        house.floors = 2;// Присваиваем значения полям в объекте office.
        office.occupants = 25;
        office.area = 4200;
        office.floors = 3;
        // Получаем для объекта house площадь, которая
        // приходится на одного человека.
        areaPP = house.areaPerPerson();
        Console.WriteLine("Дом имеет:\n " +
             house.floors + " этажа\n " +
             house.occupants + " жильца\n " +
             house.area +
             " квадратных футов общей площади, из них\n " +
             areaPP + " приходится на одного человека");
        Console.WriteLine();
        // Получаем площадь для объекта office, которая
        // приходится на одного человека.
        areaPP = office.areaPerPerson();
        Console.WriteLine("Офис имеет:\n " +
             office.floors + " этажа\n " +
             office.occupants + " работников\n " +
             office.area +
             " квадратных футов общей площади, из них\n " +
             areaPP + " приходится на одного человека");
    }
}


Как написать сообщение в Blogger

Сегодня мне задали второй раз этот вопрос. Значит ответ достоин иметь место на этом блоге =)
Хотя это всё недодумка разработчиков блоггера, так как сделали слишком сложный интерфейс, чтобы в нём разобраться с первого раза.

Как создавать собщения показано в видео ниже.


Надеюсь, что видео вам помогло =)

четверг, 28 июня 2012 г.

C# Как добавить строку в textBox

Это случай, который заставляет подумать, что разработчики C# немного не додумали. Если попытаться сделать перенос строки в textBox при помощи спец символа \n, то у нас ничего не выйдет и увидем этот симбол в чистом виде, в каком мы его сейчас наблюдаем.

Чтобы осуществить перенос строки, надо использовать метод Environment.NewLine. Рассмотрим на примере.


        private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.AppendText("1" + Environment.NewLine + "2");
        }

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

среда, 27 июня 2012 г.

C# Работа со строками

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

Использование нескольких версий метода Compare() демонстрируется в следующей программе:

        private void Form1_Load(object sender, EventArgs e)
        {
            string str1 = "один";
            string str2 = "один";
            string str3 = "ОДИН";
            string str4 = "два";
            string str5 = "один, два";
            if (String.Compare(str1, str2) == 0)
                label1.Text = (str1 + " и " + str2 + " равны.");
            else
                label1.Text = (str1 + " и " + str2 + " не равны.");
            if (String.Compare(str1, str3) == 0)
                label2.Text = (str1 + " и " + str3 + " равны.");
            else
                label2.Text = (str1 + " и " + str3 + " не равны.");
            if (String.Compare(str1, str3, true) == 0)
                label3.Text = (str1 + " и " + str3 +
                       " равны без учета регистра.");
            else
                label3.Text = (str1 + " и " + str3 +
                       " не равны без учета регистра.");
            if (String.Compare(str1, str5) == 0)
                label4.Text = (str1 + " и " + str5 + " равны.");
            else
                label4.Text = (str1 + " и " + str5 + " не равны.");
            if (String.Compare(str1, 0, str5, 0, 3) == 0)
                label5.Text = ("Первая часть строки " + str1 + " и " +
                       str5 + " равны.");
            else
                label5.Text = ("Первая часть строки " + str1 + " и " +
                       str5 + " не равны.");
            int result = String.Compare(str1, str4);
            if (result < 0)
                label6.Text = (str1 + " меньше " + str4);
            else if (result > 0)
                label6.Text = (str1 + " больше " + str4);
            else
                label6.Text = (str1 + " равно " + str4);
        }

Объединение строк
Существует два способа конкатенации (объединения) двух или больше строк. Можно использовать для этого оператор “+”. Также можно применить один из методов конкатенации, определенных в классе String. Несмотря на то что оператор “+” — самое простое решение во многих случаях, методы конкатенации предоставляют дополнительные возможности.

Метод, который выполняет конкатенацию, именуется Concat(), а его простейший формат таков:
public static string Concat(string str1, string str2)
Метод возвращает строку, которая содержит строку str2, присоединенную к концу строки str1.
Еще один формат метода Concat() позволяет объединить три строки:
public static string Concat( string str1, string str2, string str3)
При вызове этой версии возвращается строка, которая содержит конкатенированные строки str1, str2 и str3. По правде говоря, для выполнения описанных выше операций все же проще использовать оператор “+”, а не метод Concat(). 

А вот следующая версия метода Concat() объединяет произвольное число строк, что делает ее весьма полезной для программиста:
public static string Concat(params string[] strs)
Здесь метод Concat() принимает переменное число аргументов и возвращает результат их конкатенации. Пример использования:

        private void Form1_Load(object sender, EventArgs e)
        {
            string result = String.Concat(
                  "Мы ", "тестируем ",
                  "один ", "из ", "методов ",
                  "конкатенации ", "класса ",
                  "String.");
            label1.Text = ("Результат: " + result);
        }
Некоторые версии метода Concat() принимают не string-, a object-ссылки. Они извлекают строковое представление из передаваемых им объектов и возвращают строку, содержащую конкатенированные строки. Форматы этих версий метода Concat() таковы:
public static string Concat(object v1, object v2)
public static string Concat( object v1,object v2,object v3)
public static string Concat(params object[] v)
Первая версия возвращает строку, которая содержит строковое представление объекта v2, присоединенное к концу строкового представления объекта v1. Вторая возвращает строку, которая содержит конкатенированные строковые представления объектов v1, v2 и v3. Третья возвращает строку, содержащую конкатенированные строковые представления аргументов, переданных в виде “сборного” объекта v. Чтобы вы могли оценить потенциальную пользу этих методов, рассмотрим следующую программу:


        private void Form1_Load(object sender, EventArgs e)
        {
            string result = String.Concat("Привет ", 10, " ",
                                   20.0, " ",
                                   false, " ",
                                   23.45M);
            
            label1.Text = ("Результат: " + result);
        }

В этом примере метод Concat() конкатенирует строковые представления различных типов данных. Для получения строкового представления каждого аргумента здесь вызывается метод ToString(), связанный с соответствующим аргументом. Так, для значения 10 вызывается метод Int32.ToString(). Методу Concat() остается лишь объединить эти строки и возвратить результат. Этот формат метода Concat() очень удобен, поскольку позволяет программисту не получать вручную строковые представления до самой конкатенации.

Разбиение и сборка строк
Двумя важными операциями обработки строк являются разбиение (декомпозиция) и сборка. При разбиении строка делится на составные части. А при сборке строка “собирается” из отдельных частей. Для разбиения строк в классе string определен метод Split(), а для сборки — метод Join().
Форматы использования метода Split() таковы:
public string[] split(params char[] seps)
public string[] split(params char[] seps, int count)
Метод первого формата предназначен для разбиения вызывающей строки на подстроки, которые возвращаются методом в виде строкового массива. Символы, которые отделяют подстроки одну от другой, передаются в массиве seps. Если параметр seps содержит null-значение, в качестве разделителя подстрок используется пробел. Метод второго формата отличается от первого тем, что ограничивает количество возвращаемых подстрок значением count.
Рассмотрим теперь форматы применения метода Join():
public static string Join(string sep, string[] strs)
public static string Join(string sep, string[] strs, int start, int count)

Метод Join() в первом формате возвращает строку, которая содержит конкатенированные строки, переданные в массиве strs. Второй формат позволяет собрать строку, которая будет содержать count конкатенированных строк, переданных в массиве strs, начиная со строки strs[start]. В обоих случаях каждая строка, составляющая результат, отделяется от следующей разделительной строкой, заданной параметром sep.
Использование методов Split() и Join() демонстрируется в следующей программе:


        private void Form1_Load(object sender, EventArgs e)
        {
            string str =
         "Какое слово ты скажешь, такое в ответ и услышишь.";
            char[] seps = { ' ', '.', ',', };
            // Разбиваем строку на части.
            string[] parts = str.Split(seps);
            textBox1.Text = (
                "Результат разбиения строки на части: ");
            for (int i = 0; i < parts.Length; i++)
                textBox1.AppendText(Environment.NewLine + parts[i]);
            // Теперь собираем эти части в одну строку.
            string whole = String.Join(" | ", parts);
            textBox1.AppendText(Environment.NewLine + "Результат сборки: ");
            textBox1.AppendText(Environment.NewLine + whole);
        }

Декомпозиция строки — важная операция обработки строк, поскольку ее часто используют для получения отдельных лексем, составляющих строку. 

Удаление символов и дополнение ими строк
Иногда возникает необходимость удалить из строки начальные и концевые пробелы. Без этой операции, как правило, не обходится ни один командный процессор. Например, программа ведения базы данных способна распознать слово “print”. Но пользователь мог ввести эту команду с одним или несколькими начальными либо концевыми пробелами. Поэтому, прежде чем такая команда будет передана на распознание базой данных, из нее должны быть удалены “лишние” пробелы. И наоборот, возможны ситуации, когда строку нужно дополнить пробелами, чтобы она “доросла” до определенной минимальной длины. Например, при подготовке данных для форматированного вывода необходимо позаботиться о том, чтобы каждая выводимая строка имела определенную длину. К. счастью, в C# предусмотрены методы, которые позволяют легко выполнить эти операции.
Чтобы удалить из строки начальные и концевые пробелы, используйте один из следующих вариантов метода Trim():
public string Trim()
public string Trim(params char[] chrs)
Первый формат метода предназначен для удаления начальных и концевых пробелов из вызывающей строки. Второй позволяет удалить начальные и концевые символы, заданные параметром chrs. В обоих случаях возвращается строка, содержащая результат этой операции.
В C# предусмотрена возможность дополнить строку заданными символами справа либо слева. Для реализации “левостороннего” дополнения строки используйте один из следующих методов:
public string PadLeft(int len)
public string PadLeft(int len, char ch)
Первый формат метода предназначен для дополнения строки с левой стороны пробелами в таком количестве, чтобы общая длина вызывающей строки стала равной заданному значению len. Второй формат отличается от первого тем, что для дополнения строки вместо пробела используется символ, заданный параметром ch. В обоих случаях возвращается строка, содержащая результат этой операции.
Для реализации “правостороннего” дополнения строки используйте один из следующих методов:
public string PadRight(int len)
public string PadRight(int len, char ch)
Первый формат метода дополняет строку с правой стороны пробелами в таком количестве, чтобы общая длина вызывающей строки стала равной заданному значению len. Второй формат отличается от первого тем, что для дополнения строки вместо пробела используется символ, заданный параметром ch. В обоих случаях возвращается строка, содержащая результат этой операции.
Выполнение операций удаления символов и дополнения ими строк демонстрируется в следующей программе:

        private void Form1_Load(object sender, EventArgs e)
        {
            string str = "тест";            
            textBox1.AppendText( "Исходная строка: " + str);
            // Дополнение пробелами с левой стороны строки.
            str = str.PadLeft(10);
            textBox1.AppendText(Environment.NewLine + "|" + str + "|");            
            // Дополнение пробелами с правой стороны строки.
            str = str.PadRight(20);
            textBox1.AppendText(Environment.NewLine + "|" + str + "|"); 
            // Удаление начальных и концевых пробелов.
            str = str.Trim();
            textBox1.AppendText(Environment.NewLine + "|" + str + "|");             
            // "Левостороннее" дополнение строки символами "#".
            str = str.PadLeft(10, '#');
            textBox1.AppendText(Environment.NewLine + "|" + str + "|");          
            // "Правостороннее" дополнение строки символами "#".
            str = str.PadRight(20, '#');
            textBox1.AppendText(Environment.NewLine + "|" + str + "|");          
            // Удаление начальных и концевых символов "#".
            str = str.Trim('#');
            textBox1.AppendText(Environment.NewLine + "|" + str + "|");          
        }

Вставка, удаление и замена
С помощью метода Insert() можно вставлять одну строку в другую:
public string Insert(int start, string str)
Здесь параметром str задается строка, вставляемая в вызывающую. Позиция вставки (индекс) задается параметром start. Метод возвращает строку, содержащую результат этой операции.
С помощью метода Remove() можно удалить заданную часть строки:
public string Remove(int start, int count)
Количество удаляемых символов задается параметром count. Позиция (индекс), с которой начинается удаление, задается параметром start. Метод возвращает строку, содержащую результат этой операции.
С помощью метода Replace() можно заменить часть строки заданным символом либо строкой. Этот метод используется в двух форматах:

public string Replace(char ch1, char ch2)
public string Replace(string str1, string str2)

Первый формат метода позволяет заменить в вызывающей строке все вхождения символа ch1 символом ch2. Второй служит для замены в вызывающей строке всех вхождений строки str1 строкой str2. В обоих случаях возвращается строка, содержащая результат этой операции.
Рассмотрим программу, в которой демонстрируется использование методов Insert(), Remove() и Replace():


        private void Form1_Load(object sender, EventArgs e)
        {
            string str = "Это тест";
            textBox1.AppendText("Исходная строка: " + str);    
            
            // Вставляем строку.
            str = str.Insert(4, "простой ");
            textBox1.AppendText(Environment.NewLine + str ); 
            // Заменяем строку.
            str = str.Replace("простой", "сложный");
            textBox1.AppendText(Environment.NewLine + str); 
            // Заменяем символы.
            str = str.Replace('т', 'X');
            textBox1.AppendText(Environment.NewLine + str); 
            // Удаляем подстроку.
            str = str.Remove(4, 5);
            textBox1.AppendText(Environment.NewLine + str); 
        }

Изменение Регистра
Класс String содержит два удобных метода, которые позволяют изменить “регистр”, т.е. способ написания букв в строке. Эти методы называются ToUpper() и ToLower():
public string ToLower()
public string ToUpper()
Метод ToLower() заменяет все буквы в вызывающей строке их строчными вариантами, а метод ToUpper() — прописными. Оба метода возвращают строку, содержащую результат операции. Существуют также версии этих методов, которые позволяют задавать форматы данных, присущие конкретному естественному языку, диалекту или территориальному образованию.

Использование метода Substring()
С помощью метода Substring() можно получить нужную часть строки.
Возможны две формы использования этого метода:
public string Substring(int idx)
public string Substring(int idx, int count)
При использовании первой формы выделяемая подстрока начинается с элемента, заданного индексом idx, и продолжается до конца вызывающей строки. Вторая форма позволяет выделить подстроку, которая начинается с элемента, заданного индексом idx, и включает count символов. В обоих случаях возвращается выделенная подстрока.
Использование метода Substring() демонстрируется в следующей программе:

        private void Form1_Load(object sender, EventArgs e)
        {
            string str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            textBox1.AppendText("str: " + str);
            textBox1.AppendText(Environment.NewLine + "str.Substring(15): "); 
            string substr = str.Substring(15);
            textBox1.AppendText(substr);
            textBox1.AppendText(Environment.NewLine + "str.Substring(0, 15): ");            
            substr = str.Substring(0, 15);
            textBox1.AppendText(substr); 
        }

Форматирование
Если данные встроенного типа (например, int или double) требуется представить в форме, удобной для восприятия человеком, необходимо создать их строковое представление. Несмотря на то что C# автоматически поддерживает стандартный формат для такого представления, у программиста есть возможность задать собственный формат. Например, как было показано в части I, числовые данные можно вывести в формате с указанием суммы в долларах и центах. Для числовых типов предусмотрен ряд методов форматирования данных, в том числе и методы Console.WriteLine(), String.Format() и ToString(). Во всех этих трех методах используется один и тот же подход к форматированию, поэтому, научившись форматировать данные с помощью одного их них, вы сможете применить свои навыки и к остальным методам.

Использование метода Substring() для форматирования данных
Для получения форматированного нужным образом строкового представления, соответствующего значению встроенного числового типа (например, Int32 или Double), можно использовать метод ToString():
public string ToString(string fmt)
Метод ToString() возвращает строковое представление вызывающего объекта в соответствии с заданным спецификатором формата, переданным в параметре fmt. Например, следующая программа создает денежное представление значения 188.99, используя спецификатор формата C:
 string str = 189.99.ToString("C");
Обратите внимание на то, что спецификатор формата непосредственно передается методу ToString(). В отличие от методов WriteLine() или Format(), которые используют встроенные команды форматирования (вместе с номером аргумента и значением ширины поля), метод ToString() принимает только спецификатор формата.

        private void Form1_Load(object sender, EventArgs e)
        {
            // Использование метода ToString() для
            // форматирования значений.
            double v = 17688.65849;
            double v2 = 0.15;
            int x = 21;
            string str = v.ToString("F2");
            textBox1.AppendText(Environment.NewLine + str);             
            str = v.ToString("N5");
            textBox1.AppendText(Environment.NewLine + str); 
            str = v.ToString("e");
            textBox1.AppendText(Environment.NewLine + str); 
            str = v.ToString("r");
            textBox1.AppendText(Environment.NewLine + str); 
            str = v2.ToString("p");
            textBox1.AppendText(Environment.NewLine + str); 
            str = x.ToString("X");
            textBox1.AppendText(Environment.NewLine + str); 
            str = x.ToString("D12");
            textBox1.AppendText(Environment.NewLine + str); 
            str = 189.99.ToString("C");
            textBox1.AppendText(Environment.NewLine + str); 
        }

На этом всё.

TROCKII БЛОГ Copyright © 2012 | Template created by Lev Trockii |