Программирование на C, C# и Java
Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы
ОСТОРОЖНО МОШЕННИКИ! В последнее время в соиальных сетях учстились случаи педложения помощи в написании прогамм от лиц, прикрвающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в псторонних группах ВК. Для связи с нами используйте исключительно эти контакт: vscoderu@yandex.ru, https://vk.com/vscode
Калькулятор C# в консоли
В данном уроке опять создадим простенький калькулятор на языке C#, но в этот раз будем работать в консоли.
Калькуляторы на Windows Forms можно посмотреть здесь и здесь.
Данный калькулятор абсолютно элементарен и требует минимальных знаний языка. Создаём проект («Файл» ->»Создать»->»Проект»->»Консольное приложение») и объявляем наши переменные:
double total ;
Double — это тип переменной с плавающей запятой, иными словами, тип, в который можно записать десятичные числа, причём довольно большие. В него поместится как значение 5, так и значение 5,45, и даже значение 5,4571601695, также в нём можно использовать и отрицательные числа.
В переменную a мы внесём первое число, которое запишет пользователь. В переменную b — второе число. А переменная total будет выводить результат математических операций с переменными а и b.
Char — это тип переменной в виде какого-либо символа, будь то буква, цифра или какой-нибудь знак. В переменную oper мы будем заносить знак математической операции над числами. В нашем калькуляторе будут только самые основные — «+», «-«, «*» и «/».
Итак, мы объявили переменные, теперь нам надо узнать, что конкретно нужно посчитать пользователю, а для этого придётся считывать данные, которые он будет вводить:
Console . WriteLine ( «Введите первое число:» ) ;
a = Convert . ToDouble ( Console . ReadLine ( ) ) ;
Console . WriteLine ( «Введите оператор:» ) ;
oper = Convert . ToChar ( Console . ReadLine ( ) ) ;
Console . WriteLine ( «Введите второе число:» ) ;
b = Convert . ToDouble ( Console . ReadLine ( ) ) ;
Сначала мы выводим на консоль надпись о том, чтобы пользователь ввёл первое число.
В следующей строке мы присваиваем переменной a введенное пользователем число, но при этом не забываем, что введенные пользователем данные всегда имеют строковой формат string, а так как у нашей переменной тип double, то надо отконвертировать string в double соответствующим методом Convert.
Примерно то же самое мы проделываем с переменной oper, но конвертируем string уже не в double, а в char, потому что переменная oper имеет такой тип данных.
Точно то же самое, что было с переменной a проделываем и с переменной b, так как они одинакового типа.
Числа получены. Но пока неизвестно, как ими оперировать, так как главное для нас — узнать что за знак скрывается в переменной oper, и уже исходя из этого, производить операции над числами:
total = a + b ;
Console . WriteLine ( «Cумма » + a + » и » + b + » равна » + total + «.» ) ;
else if ( oper == ‘-‘ )
total = a — b ;
Console . WriteLine ( «Разность » + a + » и » + b + » равна » + total + «.» ) ;
else if ( oper == ‘*’ )
total = a * b ;
Console . WriteLine ( «Умножение » + a + » на » + b + » равно » + total + «.» ) ;
else if ( oper == ‘/’ )
total = a / b ;
Console . WriteLine ( «Деление » + a + » на » + b + » равно » + total + «.» ) ;
Console . WriteLine ( «Неизвестный оператор.» ) ;
Для этого мы используем оператор условия if (если).
Первая строка звучит примерно так: если в переменной oper записан знак «+», то..
..мы присваиваем переменной total сумму переменных a и b и выводим ответ на экран. В кавычках записаны слова, которые выводятся на экран, а переменные, расположившиеся среди плюсов выводят свои значения. Пример такого ответа выглядит вот так:
По подобию первого условия мы создаём остальные, используя операторы else if (так положено семантически, если для алгоритма необходимы какие-либо условия. Если условия не необходимы, то можно использовать оператор else, как написано ниже).
Мы расписали все необходимые нам операторы. Но что, если пользователь введёт какой-нибудь неверный оператор? Тогда нам следует предупредить его, что такого оператора нет. Для этого мы используем else. Логика такая — если у нас в oper имеется знак плюса — мы складываем, если же минус -вычитаем, знак умножения- умножаем, знак деления — делим, если в oper имеется любой другой знак (всё остальное), то нам уже не нужно какое-то определение условия (как, например, oper==’+’), поэтому можно обойтись простым else.
Наша программа уже работает, но, пожалуй, можно добавить ещё одну несложную деталь.
А что, если пользователь захочет выполнить несколько операций? Например, сначала сложить два числа, а затем умножить два других числа? Для этого ему пришлось бы перезапускать программу. Но можно сделать и иначе:
Программирование на C, C# и Java
Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы
ОСТОРОЖНО МОШЕННИКИ! В последнее время в соиальных сетях учстились случаи педложения помощи в написании прогамм от лиц, прикрвающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в псторонних группах ВК. Для связи с нами используйте исключительно эти контакт: vscoderu@yandex.ru, https://vk.com/vscode
Калькулятор на C#
В данном уроке мы разработаем с вами калькулятор на C#. Программа будет написана согласно принципам объектно-ориентированного программирования (ООП): будет определен интерфейс для методов, реализующих функционал клавиш математических операций калькулятора, от интерфейса выполним наследование и напишем соответствующий класс и методы. Калькулятор, помимо базовых операций сложения, вычитания, умножения и деления, будет предоставлять возможность выполнять операции: извлечения квадратного корня, извлечения корня произвольной степени, возведения в квадрат, возведения в произвольную степень, вычисления факториала, а также работу с регистром памяти (MRC).
Создание пользовательского интерфейса калькулятора
Создадим в Visual Studio проект на Visual C# Windows Forms. Добавим на форму элемент GroupBox, в который поместим Label. В свойстве Dock, элемента Label, необходимо указать Right, чтобы Label был привязан к правому краю. Связка данных элементов управления будет реализовывать дисплей калькулятора.
Калькулятор также содержит кнопки. Всего их 28 штук. Пользовательский интерфейс представлен на рисунке 1.

Рисунок 1. Интерфейс калькулятора
Кнопка «+/-» меняет знак операнда на противоположный.
Кнопка MRC, а также кнопки M+, M-, M×, M÷, реализуют отдельный регистр памяти калькулятора и команды для управления им. Что такое MRC можно прочитать — здесь.
Программирование калькулятора на C#
Реализация интерфейса класса
Поскольку наш калькулятор будет написан в рамках парадигмы ООП (объектно-ориентированного программирования), то начнем кодирование с описания структуры интерфейса для класса, реализующего математические операции программы.
Добавим в проект класс InterfaceCalc.cs и определим в созданном файле интерфейс InterfaceCalc.
public interface InterfaceCalc
//а — первый аргумент, b — второй
void Put_A ( double a ) ; //сохранить а
void Clear_A ( ) ;
double Multiplication ( double b ) ;
double Division ( double b ) ;
double Sum ( double b ) ;
double Subtraction ( double b ) ; //вычитание
double SqrtX ( double b ) ;
double DegreeY ( double b ) ;
double Sqrt ( ) ;
double Square ( ) ;
double Factorial ( ) ;
double MemoryShow ( ) ; //показать содержимое регистра памяти
void Memory_Clear ( ) ; //стереть содержимое регистра памяти
//* / + — к регистру памяти
void M_Multiplication ( double b ) ;
void M_Division ( double b ) ;
void M_Sum ( double b ) ;
void M_Subtraction ( double b ) ; //вычитание
Для выполнения математических операций понадобится два операнда: a и b (например, a + b). Операнд a придется хранить в памяти калькулятора, пока пользователь будет вводить второй аргумент операции. Для сохранения числа a объявим прототип метода void Put_A(double a), для очистки — void Clear_A(). Для умножения, деления, сложения и вычитания чисел a и b соответственно понадобятся методы: double Multiplication(double b), double Division(double b), double Sum(double b), double Subtraction(double b). Вычисление корня степени b из a: double SqrtX(double b). Возведение числа a в степень b: double DegreeY(double b). Вычисление квадратного корня: double Sqrt(). Возведение числа a в квадрат: double Square(). Вычисление факториала a!: double Factorial(). Теперь объявления методов для работы с регистром памяти (MRC) калькулятора. Показать содержимое памяти и очистить его: double MemoryShow(), void Memory_Clear(). M×, M÷, M+ и M- к регистру соответственно: void M_Multiplication(double b), void M_Division(double b), void M_Sum(double b), void M_Subtraction(double b).
Создание класса, реализующего интерфейс InterfaceCalc
Теперь добавим в калькулятор класс, который будет реализовывать написанный ранее интерфейс. Для этого в проекте создадим класс Calc : InterfaceCalc. Как вы видите, здесь используется наследование (оператор «двоеточие»). В данном классе напишем реализацию всех методов, требуемых спецификацией нашего интерфейса.
Programmer ASP.NET MVC C#

Asp.net для начинающих: Пишем калькулятор на asp.net mvc
Programming
Для лучшего понимания принципа обмена информацией между сайтом (Вашим браузером) и сервером напишем калькулятор.
Для начала создадим проект asp.net mvc 3.
Перейдем в файл Global.asax и удалим правило обработки url, которое создается по-умолчанию. Вместо кода:
У нас будет всего одна страничка.
Дальше откроем файл HomeController и добавляем в него событие Calc:
public ActionResult Calc()
return View();
>
В папке Views/Home создаем отображение для этого действия (правой кнопкой кликаем по папке «Home», в контекстном меню выбираем «Add»->»View. «). Заполняем окно: в поле «View name» пишем «Calc»; ставим галочку «Use a layout or master page:», в поле снизу указываем путь к файлику «~/Views/Shared/_Layout.cshtml»

На страничке «_Layout.cshtml» указывается общая структура сайта (та часть сайта, которая повторяется на всех страничка, например меню)
Теперь запустите приложение (клавиша F5), убедитесь что оно работает и открылась страничка с надписью Calc
Следующим шагом напишем html вид нашего калькулятора. Он будет состоять из двух текстовых полей для аргументов и выпадающего списка для выбора действия. Так же на страничке будет кнопка для передачи данных на сервер. Результат действий будем выводить в тег «»
Открываем файл «Calc.cshtml» и пишем код:
@ ViewBag.Title = «Calc»;
Layout = «~/Views/Shared/_Layout.cshtml»;
>
Запустим приложение. На экране у Вас должна появится картинка:

При нажатии на кнопку «=» ничего не происходит. Это потому, что мы не указали, куда передавать введенные данные.
Для этого в контроллер добавим действие:
public ActionResult Result()
return View();
>
так же в Global.asax добавим новое правило
Этим правилом мы привязали url «Home/Result.aspx» к действию «Result» контроллера «Home». Это действие будет у нас обрабатывать математические функции.
Теперь изменим html вид калькулятора. Мы добавим тег в котором укажем на какой url передавать введенные аргументы (передавать будем на «Home/Result.aspx»)
Теперь изменим action Result, укажем что он принимает два аргумента и математическую операцию
public ActionResult Result(string arg1, string arg2, string math)
return View();
>
Поставим breakpoint на этом методе, что бы увидеть какие данные передались. Запустим приложение, введем 2+2, нажмем «=»

Как Вы можете увидеть два аргумента передались, а математическое действие нет. Для этого нужно изменить выпадающий список. Нужно указать его название, это делается с помощью атрибута «name»:
еще раз запустите программу введите 2+2, нажмем «=» Теперь все введенные параметры передались. Нам осталось реализовать ответ сервера на наш запрос (сейчас он возвращает ошибку).
Подведем итог, что бы передать html (данные) на сервер нам нужно: обернуть его в тег form в этом теге указать url куда будут передаваться данные; данные которые мы хотим передать должны иметь атрибут «name», в котом укажем имя параметров.
Теперь напишем обработчик введенных данных и вывод результата.
Для начала проверить, что бы аргументы arg1 и arg2 были цифрами, для этого пробуем их преобразовать в тип decimal. Используем метод decimal.TryParse. Потом в зависимости от показателя math выполним нужную операцию. Результат действия запишем в переменную result. Полный код действия Result:
public ActionResult Result(string arg1, string arg2, string math)
decimal a = 0;
decimal b = 0;
string result =»»;
if (!decimal.TryParse(arg1, out a) || !decimal.TryParse(arg2, out b))
result = «Не правильные аргументы»;
switch (math)
case «+»:
result = (a + b).ToString();
break;
case «-«:
result = (a — b).ToString();
break;
case «*»:
result = (a * b).ToString();
break;
case «/»:
result = b != 0 ?
(a / b).ToString()
: «error»;
break;
default:
result = «Выбирите математическую функцию»;
break;
>
return View(«Calc», model: result);
>
Как видите, результат наших действий мы передали на представление «Calc» (т.е. результат будет отображаться с помощью html который находиться в файле «~/Views/Home/Calc.cshtml»)
Откроем файл «Calc.cshtml» и исправим строку:
Запустим приложение и проверим, все ли правильно у нас считает.
Если все работает, то перейдем к улучшению кода.
- Для начала хочу обратить Ваше внимания, что мы в двух местах указали url адрес «Home/Result.aspx» (в файле Global.asax и в файле Calc.cshtml) Так делать не правильно. Все url должны храниться только в Global.asax. По этому изменим код на такой Теперь если мы изменим url в Global.asax, то он измениться и на странички Calc.cshtml
- Теперь обратите внимание на то, что после подсчета какой-то функции, наш url становиться очень длинным (например, http://localhost:62442/Home/Result.aspx?arg1=2&math=%2B&arg2=2). Для того что бы этого избежать будем передавать данные на сервер методом POST, а не GET, который используется по-умолчанию. Для этого подправим код тега . Новый код:
- Что бы избежать писанины, и возможных ошибок, рекомендую тег заменить на такой C# код: вместо тега пишем @using(Html.BeginForm(«Result», «Home»)) , а вместо закрития пишем >
- Так же обратите внимание, что у нас используется два действия «Calc» и «Result» и одно представление Calc.cshtml. Мы можем избавиться от действия «Result». Для этого перенесем код в метод «Calc», а Result — удалим. Так же нужно удалить правило «Home-Result» с Global.asax. И указать на странички Calc.cshtml, что данные будет обрабатывать метод Calc (Calc«, «Home»)»> ) Полный код метода Calc:
public ActionResult Calc(string arg1, string arg2, string math)
decimal a = 0;
decimal b = 0;
string result = «»;
if (!decimal.TryParse(arg1, out a) || !decimal.TryParse(arg2, out b))
result = «введите данные»;
switch (math)
case «+»:
result = (a + b).ToString();
break;
case «-«:
result = (a — b).ToString();
break;
case «*»:
result = (a * b).ToString();
break;
case «/»:
result = b != 0 ?
(a / b).ToString()
: «error»;
break;
default:
result = «введите данные»;
break;
>
Вы скорее всего заметили, что после нажатия на кнопку «=» все введенные данные стираются, а остается только результат. Что бы это исправить, нужно будет создать class, который мы будет передавать в файл Calc.cshtml, как результат математических действий. Для этого нажмем правой кнопкой мышки на папке «Models» и выбираем меню «Add»->»Сlass. «

Назовем класс TResult. Создадим в нем свойства для аргументов и результата:
public class TResult
public string arg1
public string arg2
public string math
Теперь укажем, что наш файл Calc.cshtml будет принимать class TResult. Для этого вверху файла Calc.cshtml пишем код: @model Calculator.Models.TResult
После этого мы можем изменить html (полный код Calc.cshtml):
@model Calculator.Models.TResult
@ ViewBag.Title = «Calc»;
Layout = «~/Views/Shared/_Layout.cshtml»;
>
@using (Html.BeginForm(«Calc», «Home»))
| value=»@Model.arg1″ /> | value=»@Model.arg2″ /> | @Model.result |
>
Как Вы видете, в текстовые поля мы записываем введеные аргументы value=»@Model.arg2″ и выбираем нужную математическую функцию.
Теперь изменим наше действие Calc, так что бы оно передавало класс TResult в представление:
public ActionResult Calc(string arg1, string arg2, string math)
Calculator.Models.TResult vdata = new Models.TResult()
arg1 = arg1,
arg2 = arg2,
math = math,
>;
decimal a = 0;
decimal b = 0;
string result = «»;
if (!decimal.TryParse(arg1, out a) || !decimal.TryParse(arg2, out b))
result = «введите данные»;
switch (math)
case «+»:
result = (a + b).ToString();
break;
case «-«:
result = (a — b).ToString();
break;
case «*»:
result = (a * b).ToString();
break;
case «/»:
result = b != 0 ?
(a / b).ToString()
: «error»;
break;
default:
result = «введите данные»;
break;
>
vdata.result = result;
return View(vdata);
>
Запустите приложение и проверьте, что все правильно работает.
Asp.net для начинающих. Содержание
Комментарий:
- В 7/10/2013 11:05:56 AM, Аноним
Не работает Не удалось найти имя типа или пространства имен «Calculator» (пропущена директива using или ссылка на сборку?)
Предполагаю, что вы создали класс TResult в другом «namespace».
Developer ASP.NET MVC C#
Как сделать калькулятор в си шарп

Приложение «Калькулятор» На первом занятии мы уже создавали простое приложение. Создадим ещё одно, назовём его Lesson2, и рассмотрим некоторые свойства формы и визуальных элементов. При этом мы будем создавать приложение «калькулятор». Итак, сначала присвоим форме заголовок «Калькулятор» (не путать с именем формы). Заголовок задаётся свойством Text. Панель свойств находится в правой части экрана.

Покрасим форму, например, в темно-синий цвет. Для этого найдём в редакторе свойств строку BackColor и выпадающем списке выберем нужный цвет.

Мы будем делать немного нетрадиционный калькулятор, в отличие, например от Windows калькулятора. Он будет иметь отдельные строки для ввода аргументов, знака математического действия и результата вычислений.
Поставим на форму четыре текстовых поля textBox1 . textBox4 сверху вниз.

Напротив каждого текстового поля поставим метки Label и в свойстве Text меток введём надписи, показанные на рисунке. Цвет надписей меток можно изменить свойством ForeColor.
Добавим кнопку и создадим событие на нажатие кнопки «Вычислить». Событие можно создать двойным щелчком на выделенной кнопке или, на панели свойств и событий, переключиться на раздел события (Properties) и выбрать событие Click.

Так же, двойным щелчком следует создать событие button1_Click. Допишем в полученную функцию обработчика события следующие строки (помечены синим цветом):
private void button1_Click(object sender, EventArgs e)
double x, y, z;
string znak = «»;
x = Convert.ToDouble(textBox1.Text);
y = Convert.ToDouble(textBox3.Text);
z = 0;
znak = textBox2.Text;
if (znak == «+») z = x + y; else
if (znak == «-«) z = x — y; else
if (znak == «/») z = x / y; else
if (znak == «*») z = x * y; else
textBox4.Text = Convert.ToString(z);
>

Объявление переменных и способы записи выражений. Рассмотрим подробно все строки написанные в функции обработчика события.
Строка double x, y, z; — объявляет три переменные x, y и z (x и y — для вводимых значений и z для хранения результата вычислений) типа double. Тип double выбран с тем расчётом, что калькулятор должен уметь вычислять максимально большие числа.
При объявлении переменных любого типа им присваивается имя. Имя переменной должно начинаться с латинской буквы за которой могут следовать числа, например x256. Переменная может быть словом, например означающем назначение переменной input_x, out_y. Несколько переменных одного типа записываются через запятую. Выражение объявления переменных завершается точкой с запятой. При объявлении имени переменной и последующему её вызову в программе, регистр символов имеет значение. Так переменные Input_x и input_x являются независимыми, то есть это не одна переменная, а две.
Следующая строка программы string znak = «»; объявляет переменную znak (для хранения знака математической операции) типа string — строка и сразу этой переменной присваивается начальное значение — пустая строка.
Строка x = Convert.ToDouble(textBox1.Text); преобразует первую числовую строку введённую пользователем в textBox1 в число и присваивает это число переменной x. Аналогичное назначение следующей строки — преобразование и присваивание числа переменной y.
В строке z = 0; присваиваем начальное значение переменной z. В языке C# принято инициализировать переменные до обращения к ним из программы. Если не написать эту строку то компилятор (компилятор — программа преобразующая текст программы в цифровой код понятный для ЭВМ) выдаст предупреждающее сообщение, но программа всё равно будет работоспособна.
Строкой znak = textBox2.Text; мы получаем символ знака оперции введённый пользователем в textBox2 и присваиваем его переменной znak.
Далее, нам нужно проверить какой знак операции ввёл пользователь. Строка if (znak == «+») z = x + y; определяет ввёл ли пользователь знак +. Прочитать эту строку можно так: Если (if) переменная знак (znak) равна символу «+» то результат вычисления будет z = x + y. В скобках выражения записана проверка истинности выражения.
Для проверки истинности выражений в операторе if следует использовать следующие знаки сравнения:
== проверка равенства
!= проверка неравенства
< меньше
> больше
>= больше или равно
Следующие три строки:
if (znak == «-«) z = x — y; else
if (znak == «/») z = x / y; else
if (znak == «*») z = x * y; else
выполняют проверку на ввод остальных математических знаков и, соответственно, производят вычисления. Слово else в конце каждой строки означает «иначе», то есть, если условие не выполнено, то иначе нужно проверить следующее условие.
И, наконец, строка textBox4.Text = Convert.ToString(z); выводит полученное значение z в textBox4. В связи с тем, что переменная z числового типа, а вывести в textBox4 мы можем только строковый тип, то нужно преобразовать число в строку функцией Convert.ToString.
Калькулятор готов, можно проверить его работоспособность нажав клавишу F5.

Примечание — при вводе чисел с плавающей запятой, в Windows принято вводить разделитель запятую, а не точку, как это принято в DOS.

Логические операции. Известно, что при делении на 0 возникает ошибка. Попробуем исключить такую ошибку, если пользователь введёт знаменателем 0. Доработаем строку определяющую ввод знака деления:
В этой строке мы написали: если знак равен наклонной черте ((znak == «/») и && второй аргумент (знаменатель) равен 0 (y == 0) то выводится сообщение об ошибке MessageBox.Show(«Ошибка! Деление на 0»); иначе else можно вычислить результат деления z = x / y;. Из этой строки видно, что сложные логические выражения записываются в скобках. В сложных логических конструкциях следует использовать следующие операторы:
&& — логическое «И»
|| — логическое «ИЛИ»
Введя изменения, посмотрим, как работает программа в такой ситуации.


Встроенные математические функции. Итак, калькулятор готов, но производить только арифметические действия не тнтересно, поэтому расширим возможности нашего калькулятора введя вычисление некоторых математических функций. Язык C# имеет большую коллекцию функций математической обработки данных, основные из них приведены в таблице:
| Запись на C# | Возвращаемый результат |
| Math.Abs(Х); | Модуль числа Х |
| Math.Ceiling (Х); | Округление числа Х до большего целого |
| Math.Floor(Х); | Округление числа Х до меньшего целого |
| Math.Cos (Х); | Косинус аргумента Х |
| Math.E | Число е. е = 2,718282 |
| Math.Exp (Х); | Экспонента, число е в степени Х |
| Math.Log(Х); | Логарифм натуральный числа Х |
| Math.Log10(Х); | Логарифм десятичный числа Х |
| Math.Max(Х,Y); | Максимум из двух чисел Х и Y. |
| Math.Min (X,Y); | Минимум из двух чисел Х и Y. |
| Math.Pi | Число пи. |
| Math.Pow(X,Y); | Число X в степени Y |
| Math.Round(Х); | Простое округление числа Х |
| Math.Sing(Х); | Знак числа Х |
| Math.Sin(Х); | Синус аргумента Х |
| Math.Sqrt(Х); | Квадратный корень числа Х |
| Math.Tan(Х); | Тангенс аргумента Х |
Примечание: аргументы тригонометрических функций задаются в радианах.
Добавим в наш калькулятор, например, возведение в степень Y числа X. Нам нужно выбрать обозначение этой операции. Степень принято обозначать значком ^. Для расширения возможностей калькулятора добавим ещё строки в код обработчика события:
if (znak == «^») z = Math.Pow(x, y); else
Это уже известное нам выражение определяющее ввод знака ^ и если знак введён, то произвести вычисление степени. Запустим приложение и убедимся, что оно исправно работает.

И, в заключение этого урока, добавим на форму ещё одну кнопку которая, для удобства пользователя, будет очищать все поля ввода и результата.

Двойным щелчком на кнопки создадим функцию события нажатия на кнопку. Добавим код очистки всех текстовых полей:
| ©Гуков Константин Михайлович 2006 — 2012 Почта: [email protected] |
