devoid.com.ua - Портал программистов. Все для программиста.
         Новости  Статьи  FAQ  Файлы  Ответы  Блог  Форум     
Статьи
C# (C sharp)
 Начинающим
 Win Forms
 Среда .NET
 C# - научиться или умереть
C / Visual C++
 Основы языка
C++Builder
 Общие вопросы
 Базы данных
 Сеть
Pascal/Delphi
 Основы
 Базы Данных
 Сеть
PHP
 Основы языка
ASP.NET
 Введение
 ADO.NET
Базы данных
 MS SQL Server
 MySQL
 Firebird/InterBase
Описания функций
 WinAPI
 C++/C (Си)
Студентам
 Лабораторные работы по C++


1.4 Math в C# (CSharp)


C# - научиться или умереть

Math в C# (Csharp)

  Математика - основа любой компьютерной программы. К счастью, ее довольно легко освоить. Вот простой пример сложения двух чисел:
int answer = 5 + 10;
  Еще можно сложить две численные переменные, как буд-то они и есть числа:
int num1 = 15;
int num2 = 10;
int addAnswer = num1 + num2;
  Остальные обычные операции работают так же. Мы используем "*" для умножения и "/" для деленеия:
int subAnswer = num1 - num2;
int mulAnswer = num1 * num2;
int divAnswer = num1 / num2;
  Стоит опасаться деления, т.к. попытка деления на 0 может привести к краху программы. Конечно, целые не могут содержать в себе дроби, поэтому остаток будет просто отброшен при передаче ответа. Если нам нужна дробь, мы используем такой тип данных, где присутствует дробь, например double. А что, если нам нужен действительный остаток, а не его дробное представление? И на это есть свой прием:
int modAnswer = num1 % num2;
  Оператор "%" в английском называется modulus. Он находит остаток от деления одного числа на другое. Например, 11 % 5 в результате вернет 1 (ведь 5 содержится в 11 два раза. Остаток 1). Замечу, что мы не ограничены количеством операций. Следующий код замечательно сработает:
int bigAnswer = (num1 - num2) * num2 + num1;
  Надо запомнить, что сначала выполнается выражение в скобках, потом умножение(или деление), а затем сложение(или вычитание). Так принято в математике, поэтому не буду углублятся в это.
  .NET framework содержит библиотеку с обычными математическими функциями, известную как библиотека "Math". Напримет, мы имеем два числа и хотим знать, которое из них больше. Просто делаем так:
int biggestNumber = Math.Max(num1, num2);
... теперь "biggestNumber" будет содержать значение либо num1 или num2, вернее , набольшее. Все точно так же работает и с наименьшим числом:
int smallestNumber = Math.Min(num1, num2);
  А что насчет округления? Это конечно хорошо, иметь точные данные в переменных, но обычно глазу не очень приятно видеть такие числа как 42.4351433462 . А округляем мы так:
double num3 = 94.537;
double twoDecimalPlaces = Math.Round(num3, 2));
  Эта команда округлит значение num3 до двух чисел после запятой, т.е. получим 94.54. Первое значени, которое мы передали, "num3" - это число, которое нам надо округлить. "2" определяет то количество цифр после запятой, которое мы хотим увидеть в результате. Если бы нужно было округлить число до близжайшего целого, мы бы просто вписали "0" :
double noDecimalPlaces = Math.Round(num3, 0));
  А результат, конечно же будет 95. Кстати, если нам когда-нибудь понадобится использовать число Пи (РІ), то для этого есть специальное средство:
double valueOfPI = Math.PI;
  Так как Пи не меняется, то нам не обязательно держать его значение в переменной. Можно использовать Math.PI в случае надобности, вот так:
double circumference = 50 * Math.PI;
  Вычисление степеней тоже просто. Следующий код прямо выводит значение степеней двойки (без использования переменных) :
Console.WriteLine("2 в степени 2 = " + Math.Pow(2, 2));
Console.WriteLine("2 в степени 3 = " + Math.Pow(2, 3));
Console.WriteLine("2 в степени 4 = " + Math.Pow(2, 4));
  И еще кое-что очень важное! Обратим внимание на следующий код:
double badAnswer = 12 / 5;
  Можно подумать, что если мы используем double для хранения результата деления, то она будет содержать и дробную часть. На самом деле - нет. Из-за того, что мы делим два целых , 12 и 5, С# думает что мы хотим произвести деление целых, не обращая внимание на тип переменной, в которой будет ответ. Так или иначе, мы можем заставить С# принимать эти числа как double-и, во так:
double goodAnswer = 12.0 / 5.0;
  Хотя это не меняет значение чисел, это все-таки меняет то, как С# видит их. Из-за того, что мы добавили десятичную точку, С# теперь думает, что мы работаем с double. А что если :
goodAnswer = 12 / 5.0;
  Не смотря на то, что один из чисел операции - целое, С# все равно будет обращаться с ней как с дробным, а не целым делением. Если выражение содержит несколько членов разных типов, С# автоматически будет использовать самый точный из возможных типов деления (опираясь на типы переменных в выражении). В данном случае самый точный тип - double, поэтому С# обращается с обоими членами как с double-и.
  А как начет переменных? Ну, следующий код даст тот же "плохой" результат, как и раньше:
int numX = 12;
int numY = 5;
badAnswer = numX / numY;
  Из-за того, что обе переменных целые, происходит "целое" деление и остаток будет потерян. Чтобы этого избежать, мы должны "приведение" ("cast") для хотя бы одного члена выражения. Следующий код заставляет С# думать, что numX - double, значит и действия проводит как над дробями:
goodAnswer = (double)numX / numY;
  Чаще всего в замешательство приводят ошибки именно такого типа: мы проводим "целое" деление, не осознавая этого. Так что, всегда надо быть внимательным к типу данных при делении чисел!
  А теперь самое время для примерного кода, в котором можно увидеть все, что мы сегодня узнали:
using System;

namespace D_Math
{
  class Class1
  {
    [STAThread]
    static void Main(string[] args)
    {
      // Объявим два числа
      int num1 = 15;
      int num2 = 10;
      // Произведем над ними математические действия(сохраним результаты)
      int addAnswer = num1 + num2;
      int subAnswer = num1 - num2;
      int mulAnswer = num1 * num2;
      int divAnswer = num1 / num2;
      int modAnswer = num1 % num2;
      int bigAnswer = (num1 - num2) * num2 + num1;
      // Выведем результат
      Console.WriteLine("number1 == {0}, и number2 == {1}...", num1, num2);
      Console.WriteLine("Результат сложения: " + addAnswer);
      Console.WriteLine("Результат вычитания: " + subAnswer);
      Console.WriteLine("Результат умножения: " + mulAnswer);
      Console.WriteLine("Результат деления: " + divAnswer);
      Console.WriteLine("Остаток деления: " + modAnswer);
      Console.WriteLine("Результат  \"(num1 - num2) * num2 + num1\": " + bigAnswer);

      // Обычное сравнение чисел (не сохраняем результаты)
      Console.WriteLine("Наибольшее число: " + Math.Max(num1, num2));
      Console.WriteLine("Наименьшее число: " + Math.Min(num1, num2));

      // Округление
      double num3 = 94.537;
      Console.WriteLine(Environment.NewLine + "Оригинальное число:\t" + num3);
	  Console.WriteLine("Округляем до...");
      Console.WriteLine("2 цифры после запятой:\t" + Math.Round(num3, 2));
      Console.WriteLine("1 цифра после запятой:\t" + Math.Round(num3, 1));
      Console.WriteLine("0 цифр после запятой:\t" + Math.Round(num3, 0));

      // Пи? - Нет ничего легче!
      Console.WriteLine(Environment.NewLine + "Пи = " + Math.PI);

      // Степени
      Console.WriteLine(Environment.NewLine + "2 в степени 1 = " + Math.Pow(2,  1));
      Console.WriteLine("2 в степени 2 = " + Math.Pow(2, 2));
      Console.WriteLine("2 в степени 3 = " + Math.Pow(2, 3));
      Console.WriteLine("2 в степени 4 = " + Math.Pow(2, 4));

      // Простенький калькулятор
      Console.Write(Environment.NewLine + "Введите 1-е число для умножения: ");
      double mul1 = Convert.ToInt32( Console.ReadLine() );
      Console.Write("Введите 2-е число: ");
      double mul2 = Convert.ToInt32( Console.ReadLine() );
      Console.WriteLine("{0} * {1} = {2}", mul1, mul2, (mul1 * mul2));


      // Опасно! Неправильное деление! Не влезай, убъет!
      Console.WriteLine(Environment.NewLine + "12 / 5 = ?");
      double badAnswer = 12 / 5;
      double goodAnswer = 12.0 / 5.0;
      Console.WriteLine("Неправильый результат: {0}\n 
	  Правильый результат: {1}", 
	  badAnswer, goodAnswer);

      // А теперь попросим пользователя нажать "Enter" для выхода из программы
      Console.WriteLine("Программа завершена. Нажмите \"Enter\" для выхода...");
      Console.ReadLine();
    }
  }
}



  Версия для печати

Информация о статье: "1.4 Math в C# (CSharp)"
  Автор: DrAcid
  Сайт:http://devoid.com.ua/
  Добавлена:12 апреля 2008
  Просмотров:3479



Не нашли ответ на свой вопрос? Задайте вопрос своим коллегам и они Вам ответят!

Задать вопрос

Популярные
   - 1.2 Переменные в C# (Csharp)
   - 1.1 Вывод в консоль с использованием C# (Csharp)
   - 1.3 Ввод данных в консоль C# (Csharp)
   - 1.5 Манипуляции строками


Блог
Купил ноутбук ASUS F3Sg-T575SCCFAW
Начал использовать Zend Framework. Доволен.
Купил цифровой фотоаппарат - Canon PowerShot A580
Получил начальный аттестат Web Money
C# - запуск только одной копии программы

Форум
Ряд Фибоначчи
Работа с компонентами ScrollBar и TextBox
COM порт
!!!В САНКТ-ПЕТЕРБУРГ В КРУПНУЮ КОМПАНИЮ НУЖНЫ СПЕЦИАЛИСТЫ ДЛ
решение задач аналитической геометрии на языке С



© Макагон Сергей (DeVoid) , 2007-2008.