Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование на C#. Часть 1. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
for (i = 1; i<= n; i++)
p = p * i;
}
public Form1()
{
Initialize Component();
}
private void button1_Click(object sender, Event Args e)
{
int k,r;
k = Convert.ToInt32 (textBox1.Text);// Вводk.
r = Convert.ToInt32 (textBox2.Text);// Вводr
// Вывод результата по кнопке «Функция».
// Вызов функции.
label3.Text = "F=" + (fak(k) * fak(r) / fak(r+k)).ToString();
}
private void button3_Click (object sender, Event Args e)
{
Close();
}
private void button2_Click (object sender, EventArgs e)
{
intk,r;
double p1,p2,p;
k = Convert.ToInt32 (textBox1.Text);
r= Convert.ToInt32 (textBox2.Text);
fak (k,outp1);// Вызов процедуры.
fak (r, out p2);
fak (k+r,
out p);
61
// Вывод результата по кнопке «Процедура».
label3.Text = "F="+(p1*p2/p).ToString();
}
}
}
Структурная схема алгоритма для решения задачи с использованием подпрограммы процедура приведена на рис. 4.3.
Начало
1
Ввод (m, n)
2
FAK ( n, p1 )
3
FAK ( n, p2 )
4
FAK ( n, p )
5
f : = p1*p2/p
Вход FAK
( n ;out P )
1
P : = 1
FAK
FAK
FAK
3
2
2
Цикл 1
i=1, n
P : = P * i
Цикл 1
62
6
Печать f
Конец
Выход FAK
Рис. 4.3. Структурная схема алгоритма
2. Две версии класса Account
Рассмотрим проектирование классов Account и Account1, описывающих такую абстракцию данных, как банковский счёт. Определим две основные операции – занесение денег на счёт и снятие денег. В первом случае – в клас­се Account – будем активно использовать поля класса. Дополнительно к двум основным полям credit и debit, хранящим приход и расход счёт
а, введ
ем поле balance, задающее текущее состояние счета и два поля, связанных с послед­ней выполняемой операцией. Пусть поле sum будет хранить сумму денег те­кущей операции, а поле result – результат выполнения операции.
Описание класса:
/// <summary> /// КлассAccount определяет банковский счет. /// простейший вариант с возможностью трех операций: /// положить деньги на счет, снять со сч /// Вариан
т с полями
ета, узнать баланс.
/// </summary>
public class Account
{ //закрытые поля класса
int debit=0, credit=0, balance =0;
intsum =0, result=0;
/// <summary> /// Зачисление на счет с проверкой
/// </summary> /// <param name="sum">зачисляемая сумма</param>
public void put Money(int sum)
{
this.sum = sum;
if (sum>0)
{
credit += sum; balance = credit - debit; result =1;
63
}
else result = -1;
Mes();
}//put Money
/// <summary> /// Снятие со счета с проверкой
/// </summary> /// <param name="sum">снимаемая сумма</param>
public void getMoney(int sum)
{
this.sum = sum;
if(sum<= balance)
{
debit += sum; balance = credit - debit; result =2;
}
else result = -2;
Mes();
}//get Money
/// <summary> /// Уведомление о выполнении операции
/// </summary>
void Mes()
{
switch (result)
{
case
1:
64
Console.WriteLine ("Операция зачи
сления
денег прошла успешно!");
Console.WriteLine ("Cумма={0}, Ваш текущий баланс={1}",
sum,balance);
break;
case 2:
Console.WriteLine ("Операция снятия денег прошла успешно!"); Console.WriteLine ("Cумма={0}, Ваш текущий баланс={1}",
sum,balance);
break;
case -1: Console.WriteLine ("Операция зачисления денег не выполнена!"); Console.WriteLine ("Сумма должна быть больше нуля!"); Console.WriteLine ("Cумма={0}, Ваш текущий баланс={1}",
sum,balance);
break;
case -2:
Console.WriteLine ("Операция снятия денег не выполнена!"); Console.WriteLine("Сумма должна быть не больше баланса!");
Console.WriteLine("Cумма={
0}, Ваш текущий баланс={1}",
sum,balance);
break;
default: Console.WriteLine("Неизвестная операция!");
break;
}
}
}//Account
Класс Account1, отличается только тем, что у него будет меньше полей. В классе появится соответствующая функция вместо поля balance с этим же именем, вместо полей sum и result появятся аргументы у методов, обеспечи­вающие необходимую передачу информации.
/// <summary>
/// Класс Account1определяет банковский счет.
/// Вариант с аргументами и функциями
/// </summary>
public class Account1
{
65
//закрытые поля класса
Int debit=0, credit=0;
/// <summary>
/// Зачисление на счет с проверкой
/// </summary>
/// <param name="sum">зачисляемая сумма</param>
public void putMoney(int sum)
{
int res =1;
if (sum>0) credit += sum;
else res = -1;
Mes(res, sum);
}//putMoney
/// <summary>
/// Снятие со счета с проверкой
/// </summary>
/// <param name="sum">снимаемая сумма</param>
public void getMoney(
{
int res
=2;
int sum)
if(sum<= balance())debit += sum;
else res = -2;
balance();
Mes(res, sum);
}
//getMoney
66
/// <summary>
/// вычисление баланса
/// </summary>
/// <returns>текущий баланс</returns>
int balance()
{
return(credit - debit);
}
/// <summary>
/// Уведомление о выполнении операции
/// </summary>
void Mes(int result, int sum)
{
switch (result)
{
case1:
Console.WriteLine ("Операция зачисления денег прошла успешно!");
Console.WriteLine ("Cумма={0}, Ваш текущий баланс={1}",
sum,balance());
break;
case2:
Console.WriteLine ("Операция снятия денег прошла успешно!");
Console.WriteLine ("Cумма={0}, Ваш текущий баланс={1}",
sum,balance
break;
case-1:
());
Console.WriteLine("Операция зачисления денег не выполнена!");
Console.WriteLine("Сумма должна быть больше нуля!");
Console.WriteLine("Cумма={0}, Ваш текущий баланс={1}",
sum,balance());
break;
case-2:
Console.WriteLine("Операция снятия денег не выполнена!");
Console.WriteLine("Сумма должна быть не больше баланса!");
Console.WriteLine("Cумма={0}, Ваш текущий баланс={1}",
sum,balance());
67
break;
default:
Console.WriteLine("Неизвестная операция!");
break;
}
}
}//Account1
При сравнении классов можно видеть, что число полей сократилось с 5
до двух, упростились основные методы getMoney и putMoney. При этом в ка-
честве платы у класса появился дополнительный метод balance(), у метода
Mes теперь появились два аргумента.
Класс Testing, тестирующий работу с к
лассами Account и Account1:
public void TestAccounts()
{
Account myAccount= new Account();
myAccount.putMoney(6000);
myAccount.getMoney(2500);
myAccount.putMoney(1000);
myAccount.getMoney(4000);
myAccount.getMoney(1000);
//Аналогичная работа с классомAccount1
Console.WriteLine("Новый класс и новый счет!");
Account1 myAccount1 = new Account1();
68
myAccount1.putMoney(6000);
myAccount1.getMoney(2500);
myAccount1.putMoney(1000);
myAccount1.getMoney(4000);
myAccount1.getMoney(1000);
}
Функции с побочным эффектом, помимо результата, вычисляемого
−
функцией и возвращаемого ей в операторе return, имеют выходные аргумен­ты с ключевыми словами ref и out
/// <summary>
/// тестирование побочного эффекта
/// </summary>
public void TestSideEffect()
{
inta = 0, b=0, c=0;
a =1; b = a + f(ref a);
a =1; c = f(ref a)+ a;
Console.WriteLine("a={0}, b={1}, c={2}",a,b,c);
}
4.3. ЗАДАЧИ ДЛЯ САМОСТОЯТЕЛЬНОГО РЕШЕНИЯ
1. Составить схему алгоритма и написать программу вычисления P по
формуле
⎧
=
P
⎨ ⎩
где n меняется от 3 до 6 с шагом 1. Для вычисления n! использовать метод.
2.
Составить схему алгоритма и программу вычисления b
Описать метод Stepen(x, n) от вещественного x и натурального n, вы- числяющий (посредством умножения) величину x
3.
Составить схему алгоритма и программу вычисления
3
≥+
;5,4!
nеслиn
<
,5),(sin
nеслиn
k
5
++= ab
.)1(7,2
n
.
!!
),(
nmF
=
mn
,
!)(
mn
+
где n и m – неотрицательные целые числа. Для вычисления факториала ис­пользовать метод типа void.
69
4. Составьте программу поиска максимального элемента матрицы A
≤
размерности 3 на 4, элементы которой заполняются случайными числами в диапазоне от –2π до +2π . Заполнение матрицы А происходит в головном мо-
дуле, поиск максимума осуществляется методом с типом void.
5. Составьте программу поиска минимального элемента матрицы A
размерности 3 на 4, элементы которой заполняются случайными числами в диапазоне от –2π до +2π . Заполнение матрицы А происходит в головном мо-
дуле, поиск максимума осу
ществляется методом типа double.
6. Составьте программу вычисления суммы положительных элементов
матрицы M размерности 3 на 3, элементы которой заполняются случайными числами в диапазоне от –2π до +2π . Заполнение матрицы М происходит в
головном модуле, поиск суммы осуществляется методом с типом voi
7. Составить
схему алгоритма и программу для вычисления z-суммы
d.
значений функций:
z = f (a, b) + f (a2, b2) + f (a2 – 1, b) + f (a – b, b) + f (a2 + b2, b2 – 1),
tuеслиtu
;0,0,
при а = 2; b = 7,2; l = 3.
tuеслиtu
.0,0,
>≤+
где
⎧
tuf
),(
=
⎨
>−
⎩
8. Составить схему алгоритма и программу для вычисления z-суммы
значений функций:
z = f (sinα, a) + f (cosα, a) + f (sin
+ f (sinα – cosα , a
⎧
где
tuf
),(
=
⎨ ⎩
π с шагом π/6.
9. Составить схему алгоритма и программу для вычисления z-суммы
значений функций:
70
2
α, a – 1) +
2
– 1) + f ((sin
uеслиtu
;0),sin(
>+
2
α – 1, cosα + a),
при a = 0,5; l = 0,3: α меняется от 0 до
uеслиtu
.0,
≤+
),()|,||(|),1||(),(),||( bayxfxyxfyxfbafyxfz +++−+−+++=
,
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]