Алгоритмитизация. 1. Алгоритмизация. Самостоятельная работа к лекции 2. "Технология объектноориентированного программирования. Состав языка. Типы данных. Переменные, именованные константы. Вводвывод данных. Форматирование данных."
Скачать 2.89 Mb.
|
x); // 11110011 или -13| (логическое сложение) Похоже на логическое умножение, операция также производится по двоичным разрядам, но теперь возвращается единица, если хотя бы у одного числа в данном разряде имеется единица. Например: int x1 = 2; //010 int y1 = 5;//101 Console.WriteLine(x1|y1); // выведет 7 - 111 int x2 = 4; //100 int y2 = 5;//101 Console.WriteLine(x2 | y2); // выведет 5 - 101 ^ (логическое исключающее ИЛИ) Также эту операцию называют XOR, нередко ее применяют для простого шифрования: int x = 45; // Значение, которое надо зашифровать - в двоичной форме 101101 int key = 102; //Пусть это будет ключ - в двоичной форме 1100110 int encrypt = x ^ key; //Результатом будет число 1001011 или 75 Console.WriteLine($"Зашифрованное число: {encrypt}") ; int decrypt = encrypt ^ key; // Результатом будет исходное число 45 Console.WriteLine($"Расшифрованное число: {decrypt}"); |
| 1 | 2 | 3 | 4 | |
1 | | | | | |
2 | | | | | |
3 | | | | | |
4 | | | | |
1) для заданного значения n определить количество черных ячеек шахматной доски;
2) по номеру ячейки (k, m) определить ее цвет;
3) определить, являются ли ячейки с номерами (k1, m1) и (k2, m2) одного цвета;
4) определить, находится ли фигура, стоящая в ячейке с номером (k1, m1), под ударом второй фигуры, стоящей в ячейке с номером (k2, m2), при условии, что ход второй фигуры и ей является: a) пешка; b) слон; c) ладья; d) ферзь; e) конь.
Код программы:
Console.WriteLine("Введите длину и ширину шахматной доски");
int m = Convert.ToInt32(Console.ReadLine());
int n = Convert.ToInt32(Console.ReadLine());
int[,] arr = new int[m,n];
for (int i = 1;i <= m;i++)
{
for (int j = 1; j <= n; j++)
{
if ((i % 2 != 0 && j % 2 != 0) || (i % 2 == 0 && j % 2 == 0))
{
Console.WriteLine($"Клетка по индексам m = {i}, n = {j}: Черная");
}
else
{
Console.WriteLine($"Клетка по индексам m = {i}, n = {j}: Белая");
}
}
}
Start:
Console.WriteLine("Введите номер подзадачи");
int num = int.Parse(Console.ReadLine());
//Ловушка программиста
switch (num) {
case 1:
{
Console.WriteLine("Введите размер доски");
n = int.Parse(Console.ReadLine());
if (Math.Pow(n, 2) % 2 != 0)
{
Console.WriteLine("Количество черный клеток на доске размером {0} = {1}", n, ((n * n) / 2 + 1));
} else
{
Console.WriteLine("Количество черный клеток на доске размером {0} = {1}", n, ((n * n) / 2));
}
Console.WriteLine("Продолжить?(y/n)");
string answer = Console.ReadLine();
if (answer == "y")
{
goto Start;
}
else break;
}
case 2:
{
Console.WriteLine("Введите индексы клетки");
int ind1 = int.Parse(Console.ReadLine());
int ind2 = int.Parse(Console.ReadLine());
if ((ind1 % 2 != 0 && ind2 % 2 != 0) || (ind1 % 2 == 0 && ind2 % 2 ==0))
{
Console.WriteLine($"Индексы: {ind1} , {ind2}. Цвет: Черный");
}else
{
Console.WriteLine($"Индексы: {ind1} , {ind2}. Цвет: Белый");
}
Console.WriteLine("Продолжить?(y/n)");
string answer = Console.ReadLine();
if (answer == "y")
{
goto Start;
}
else break;
}
case 3:
{
Console.WriteLine("Введите индексы первой клетки");
int m1 = int.Parse(Console.ReadLine());
int n1 = int.Parse(Console.ReadLine());
Console.WriteLine("Введите индексы второй клетки");
int m2 = int.Parse(Console.ReadLine());
int n2 = int.Parse(Console.ReadLine());
bool col1, col2; // true - Черныйцвет, false - белый
if(m1 % 2 != 0 && n1 % 2 != 0 || m1 % 2 == 0 && n1 % 2 == 0) {
col1 = true;
}
else
{
col1 = false;
}
if (m2 % 2 != 0 && n2 % 2 != 0 || m2 % 2 == 0 && n2 % 2 == 0)
{
col2 = true;
}
else
{
col2 = false;
}
if (col1 == col2) Console.WriteLine("Цвета одинаковые"); else Console.WriteLine("Цвета разные");
Console.WriteLine("Продолжить?(y/n)");
string answer = Console.ReadLine();
if (answer == "y")
{
goto Start;
}
else break;
}
case 4:
{
Console.WriteLine("Введите размер шахматной доски");
int rows = Convert.ToInt32(Console.ReadLine());
byte[,] table = new byte[rows, rows];
for (int i = 0;i < rows;i++)
{
for (int j = 0; j < rows;j++)
{
table[i,j] = 0;
}
}
Console.WriteLine("Введите координаты первой фигуры");
int coord1 = int.Parse(Console.ReadLine());
int coord2 = int.Parse(Console.ReadLine());
table[coord1 - 1, coord2 - 1] = 1;
for(int i = 0;i < rows;i++)
{
for(int j = 0;j < rows;j++)
{
Console.Write(table[i, j] + " ");
}
Console.WriteLine();
}
Console.WriteLine("Введите фигуру");
string figure = Console.ReadLine();
if (figure == "Пешка" || figure == "пешка")
{
Console.WriteLine("Введите координаты фигуры");
int coord21 = int.Parse(Console.ReadLine());
int coord22 = int.Parse(Console.ReadLine());
table[coord21 - 1, coord22 - 1] = 2;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < rows; j++)
{
Console.Write(table[i, j] + " ");
}
Console.WriteLine();
}
if ((coord21 - 1 == coord1 && coord22 == coord2 - 1) || coord21 - 1 == coord1 && coord22 == coord2 + 1)
{
Console.WriteLine("Фигура 1 под атакой!");
}
else
{
Console.WriteLine("Фигура 1 в безопасности");
}
}
if (figure == "Конь" || figure == "конь")
{
Console.WriteLine("Введите координаты фигуры");
int coord21 = int.Parse(Console.ReadLine());
int coord22 = int.Parse(Console.ReadLine());
table[coord21 - 1, coord22 - 1] = 2;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < rows; j++)
{
Console.Write(table[i, j] + " ");
}
Console.WriteLine();
}
if ((coord1 - 1 == coord21 && coord21 - 2 == coord22) || (coord1 - 1 == coord21 && coord21 + 2 == coord22)
|| (coord1 + 1 == coord21 && coord2 - 2 == coord22) || (coord1 + 1 == coord21 && coord2 + 2 == coord22)
|| (coord1 + 2 == coord21 && coord2 - 1 == coord22) || (coord1 - 2 == coord21 && coord2 - 1 == coord22)
|| (coord1 - 2 == coord21 && coord2 - 2 == coord22) || (coord1 + 2 == coord21 && coord2 + 1 == coord22))
{
Console.WriteLine("Фигура 1 атакована!");
}
else
{
Console.WriteLine("Фигура 1 в безопасности");
}
}
if (figure == "Слон" || figure == "слон")
{
Console.WriteLine("Введите координаты фигуры");
int coord21 = int.Parse(Console.ReadLine());
int coord22 = int.Parse(Console.ReadLine());
table[coord21 - 1, coord22 - 1] = 2;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < rows; j++)
{
Console.Write(table[i, j] + " ");
}
Console.WriteLine();
}
for (int i = coord21 - 1,j = coord22 - 1; i >= 0 && j>= 0; i--,j--)
{
if (i == (coord1 - 1) && j == (coord2 - 1))
{
Console.WriteLine("Фигура 1 атакована!");
goto Continue;
}
}
for (int i = coord21 - 1, j = coord22 - 1; i >= 0 && j < rows; i--, j++)
{
if (i == (coord1 - 1) && j == (coord2 - 1))
{
Console.WriteLine("Фигура 1 атакована!");
goto Continue;
}
}
for (int i = coord21 - 1, j = coord22 - 1; i < rows && j >= 0; i++, j--)
{
if (i == (coord1 - 1) && j == (coord2 - 1))
{
Console.WriteLine("Фигура 1 атакована!");
goto Continue;
}
}
for (int i = coord21 - 1, j = coord22 - 1; i < rows && j < rows; i++, j++)
{
if (i == (coord1 - 1) && j == (coord2 - 1))
{
Console.WriteLine("Фигура 1 атакована!");
goto Continue;
}
}
Console.WriteLine("Фигура 1 в безопасности");
}
if (figure == "Ладья" || figure == "ладья")
{
Console.WriteLine("Введите координаты фигуры");
int coord21 = int.Parse(Console.ReadLine());
int coord22 = int.Parse(Console.ReadLine());
table[coord21 - 1, coord22 - 1] = 2;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < rows; j++)
{
Console.Write(table[i, j] + " ");
}
Console.WriteLine();
}
if (coord21 == coord1 || coord22 == coord2) {
Console.WriteLine("Фигура 1 атакована!");
}
else
{
Console.WriteLine("Фигура 1 в безопасности");
}
}
if (figure == "Ферзь" || figure == "ферзь") {
Console.WriteLine("Введите координаты фигуры");
int coord21 = int.Parse(Console.ReadLine());
int coord22 = int.Parse(Console.ReadLine());
table[coord21 - 1, coord22 - 1] = 2;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < rows; j++)
{
Console.Write(table[i, j] + " ");
}
Console.WriteLine();
}
for (int i = coord21 - 1, j = coord22 - 1; i >= 0 && j >= 0; i--, j--)
{
if (i == (coord1 - 1) && j == (coord2 - 1))
{
Console.WriteLine("Фигура 1 атакована!");
goto Continue;
}
}
for (int i = coord21 - 1, j = coord22 - 1; i >= 0 && j < rows; i--, j++)
{
if (i == (coord1 - 1) && j == (coord2 - 1))
{
Console.WriteLine("Фигура 1 атакована!");
goto Continue;
}
}
for (int i = coord21 - 1, j = coord22 - 1; i < rows && j >= 0; i++, j--)
{
if (i == (coord1 - 1) && j == (coord2 - 1))
{
Console.WriteLine("Фигура 1 атакована!");
goto Continue;
}
}
for (int i = coord21 - 1, j = coord22 - 1; i < rows && j < rows; i++, j++)
{
if (i == (coord1 - 1) && j == (coord2 - 1))
{
Console.WriteLine("Фигура 1 атакована!");
goto Continue;
}
}
if (coord21 == coord1 || coord22 == coord2)
{
Console.WriteLine("Фигура 1 атакована!");
goto Continue;
}
Console.WriteLine("Фигура 1 в безопасности");
}
Continue:
Console.WriteLine("Продолжить?(y/n)");
string answer = Console.ReadLine();
if (answer == "y")
{
goto Start;
}
else break;
}
default:
{
Console.WriteLine("Такой подзадачи не существует");
break;
}
}
Работа программы:
Задача 2. Задана дата в формате <день>.<месяц>.<год>. Определить:
1) сколько дней прошло с начала года; 2) сколько дней осталось до конца года;
3) дату предыдущего дня; 4) дату следующего дня.
Код программы:
Console.WriteLine(">Введите дату в формате dd.MM.yyyy:");
DateTime dt = DateTime.Parse(Console.ReadLine());
Console.WriteLine(">Дней прошло с начала года:" + dt.DayOfYear);
DateTime now = DateTime.Now;
int nextYear = now.Year + 1;
DateTime nextNewYear = new DateTime(nextYear, 1, 1);
nextNewYear = new DateTime(nextNewYear.Ticks - 1);
int days = nextNewYear.DayOfYear - now.DayOfYear;
Console.WriteLine(">Дней осталось до конца года:" + days);
Console.WriteLine(">Дата предыдущего дня:" + dt.AddDays(-1).ToShortDateString());
Console.WriteLine(">Дата следующего дня:" + dt.AddDays(+1).ToShortDateString());
Работа программы:
Задача 3. Натуральное число из n цифр является числом Армстронга, если сумма его цифр, возведенных в n-ную степень, равна самому числу. Например, 153=13+53+33. Найти все трехзначные числа Армстронга.
Код программы:
using System;
namespace Rextester
{
public class Program
{
public static void Main(string[] args)
{
for (int i = 100; i <= 999; i++)
{
int a = i % 10;
int b = (i / 10) % 10;
int c = (i / 100) % 10;
int tmp = a * a * a + b * b * b + c * c * c;
if (i == tmp)
{
Console.WriteLine(i);
}
}
Console.ReadKey();
}
}
}
Работа программы:
Задача 4. Стороны прямоугольника заданы натуральными числами n и m. Найти количество квадратов (стороны которых выражены натуральными числами), на которые можно разрезать данный прямоугольник, если от него каждый раз отрезать квадрат:
1) наименьшей площади; 2) наибольшей площади
Код программы:
using System;
public class Program
{
public static void Main(){
int n = 8;
int m = 3;
//маленькие квадратики
int mi = n*m;
Console.WriteLine(mi);
// большие квадраты
int k = 0; // количество квадратов
while(n != m){
if(n > m){
n = n - m;
k++;
}
else{
m = m - n;
k++;
}
}
k++;
Console.WriteLine(k);
}
}
Работа программы
Самостоятельная работа к лекции №5. "Методы: основные понятия. Перегрузка методов."
I. Написать программу, вычисляющую первые n элементов заданной последовательности:
II. Вычислить и вывести на экран значение n члена последовательности для каждого x [a,b] c шагом h=0.1 Результат работы программы представить в виде следующей таблицы:
№ | Значение x | Значение функции bn(x) |
1 | | |
2 | | |
… | | |
Замечание. Для решения задачи разработать метод, в который передаются значения х и n, и которым возвращается значение bn.
I
Код программы:
Console.WriteLine("Введите n");
double n = Convert.ToDouble(Console.ReadLine());
double bn;
double b = 9;
for (int i = 1; i <= n; ++i)
{
if (i == 1) bn = b;
else
{
bn = 0.1 * b + 10;
b = bn;
}
Console.WriteLine(bn);
}
Работа программы:
Код программы:
class Program
{
static int Main(string[] args)
{
int n = 20;
double[] mylist = new double[n + 1];
sequence(n, ref mylist);
for (int i = 1; i < mylist.Length; i++)
{
Console.WriteLine("n = " + i + "; b = " + mylist[i]);
}
Console.ReadKey();
return 0;
}
static double sequence(int n, ref double[] mylist1)
{
double result = default(double);
if (n == 1)
{
result = 1;
}
else if (n == 2)
{
result = 2;
}
else
{
result = (n * sequence(n - 2, ref mylist1) - sequence(n - 1, ref mylist1)) / (n + 1);
}
mylist1[n] = result;
return result;
}
}
Работа программы:
II.
Код программы:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int x = 1;
int n = 3;
Console.WriteLine(res(n,x));
Console.ReadLine();
}
static int res(int n,int b)
{
if (n == 1)
{
return b;
}
else
return res(n - 1, b) +( 2 * res(n - 1, b));
}
}
}
Работа программы:
Код программы:
static double B(double x, int n)
{
if (n == 1)
{
return x;
}
else
{
if (n % 2 == 0)
{
return B(x, 2 * n - 1) + x;
}
else
{
return 2 * B(x, 2 * n);
}
}
}
static void Main(string[] args)
{
double h = 0.1;
// Ввод n
Console.Write("n="); int n = int.Parse(Console.ReadLine());
// Ввод a, b
Console.Write("a="); double a = double.Parse(Console.ReadLine());
Console.Write("b="); double b = double.Parse(Console.ReadLine());
// Вызов метода b и вывод результата
for (double x = a; x <= b; x += h)
{
double otv = B(x, n);
Console.WriteLine("b({0,6:##0.00}; {1}) ={2,8:####0.00}", x, n, otv);
}
Console.ReadKey();
}
Самостоятельная работа к лекции №6. "Рекурсия: прямая и косвенная, простая и «сложная». Рекурсивные методы возвращающие и не возвращающие значение."
Задача 1. Разработать рекурсивный метод для вывода на экран всех возможных разложений натурального числа n на множители (без повторений). Например, для n=12 на экран должно быть выведено:
2*2*3=12
2*6=12
3*4=12
Задача 2. Разработать рекурсивный метод для вывода на экран всех возможных разложений натурального числа n на слагаемые (без повторений). Например, для n=5 на экран должно быть выведено:
1+1+1+1+1=5
1+1+1+2=5
1+1+3=5
1+4=5
2+1+2=5
2+3=5
Задача 1
Код программы:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Lab
{
class Program
{
static void F(int delitel, int n, int j, int m, int[] a)
{
if (n == 1)//вывод на экран
{
for (int i = 0; i < j - 1; i++)
Console.Write(a[i] + "*");
if (j > 0 && a[j - 1] != m)
Console.WriteLine(a[j - 1] + "=" + m);
return;
}
for (a[j] = delitel; a[j] <= n; a[j]++)//определение множителей
if ((n % a[j]) == 0)
F(a[j], n / a[j], j + 1, m, a);
}
static void Main()
{
int[] a = new int[100];
Console.Write("Введите число: ");
int n = int.Parse(Console.ReadLine());
int m = n;
F(2, n, 0, m, a);//начальный делитель, число, начало массива, повторение числа, сам массив
}
}
}
Работа программы:
Задача 2
Код программы:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication13
{
class Program
{
public static void Main()
{
One ob = new One();
ob.two();
}
}
class One
{
int a = 1, b = 1;
public void two()
{
Console.WriteLine("Введите n: ");
int x = Convert.ToInt32(Console.ReadLine());
rec(x);
}
public void rec(int x)
{
for (int i = 1; i < x; i++)
{
Console.Write(a);
for (int j = x - i; j > 1; j--)
{
Console.Write(" + 1");
}
Console.Write(" + " + b);
Console.WriteLine();
b++;
}
b = a + 1;
a++;
if (x > 1)
rec(x - 2);
}
}
}
Работа программы:
Самостоятельная работа к лекции №7. "Обработка исключений: операторы try, checked и unchecked. Генерация собственных исключений."
Практическое задание
Замечание. При решении задач производить обработку следующих исключительных ситуаций: ввода пользователем недопустимых значений и переполнения при вычислении математических выражений.
I. Для заданного натурального nи действительного х подсчитать следующие суммы:
Решение
4)
Код программы:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace ConsoleApplication14
{
class Program
{
static void Main(string[] args)
{
double s = 0;
int n;
Console.Write("n = ");
n = Convert.ToInt32(Console.ReadLine());
for (int i = 1; i <= n; i++)
s += (Math.Pow(-1, i)) / (Math.Pow(2, i));
Console.WriteLine(s);
Console.ReadKey();
}
}
}
Работа программы:
2)
Код программы:
int n = 5;
double x = 1.2345;
double el = x;
double sum = 0;
for (int i = 0; i < n; i++)
{
el = Math.Sin(el);
sum += el;
}
Console.WriteLine(sum);
Console.ReadKey();
Работа программы:
II. Для заданного натурального k и действительного x подсчитать следующие выражения:
2)
Код программы:
class Program
{
static void Main(string[] args)
{
double x = 6.0;
long k = 1;
double res = 0;
for(long n = 1; n <= k; ++n)
{
res += GetSign(n + 1) * GetPower(x, 2 * n - 1) / GetFact(2 * n - 1);
}
Console.WriteLine(res);
Console.ReadKey();
}
private static long GetSign(long a)
{
return a % 2 == 0 ? 1 : -1;
}
private static double GetPower(double a, long pow)
{
double res = a;
for(long i = 1; i < pow; ++i)
{
res *= a;
}
return res;
}
private static long GetFact(long n)
{
return n == 0 ? 1 : n * GetFact(n-1);
}
}
Работа программы:
III. Вычислить бесконечную сумму ряда с заданной точностью е (e>0).
1)
Код работы:
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
double sum, i, eps = 0, sl;
Console.WriteLine("Введите точность: ");
try
{
eps = Convert.ToDouble(Console.ReadLine());
}
catch
{
Console.WriteLine("Некорректный ввод!");
}
if (eps > 0)
{
sum = 0;
i = 1;
sl = 1 / (i * i);
while (sl > eps)
{
sum += sl;
i++;
sl = 1 / (i * i);
}
Console.WriteLine("Сумма ряда = " + sum);
}
else
{
Console.WriteLine("Введите e больше нуля!");
}
Console.ReadLine();
}
}
}
Работа программы:
Самостоятельная работа к лекции №8. "Массивы: одномерные, многомерные и ступенчатые."
I. В одномерном массиве, элементы которого – целые числа, произвести следующие действия:
1. Удалить из массива все четные числа.
2. Вставить новый элемент после всех элементов, которые заканчиваются на данную цифру.
3. Удалить из массива повторяющиеся элементы, оставив только их первые вхождения.
4. Вставить новый элемент между всеми парами элементов, имеющими разные знаки.
5. Уплотнить массив, удалив из него все нулевые значения.
II. В двумерном массиве, элементы которого – целые числа, произвести следующие действия:
1. Вставить новую строку после строки, в которой находится первый встреченный минимальный элемент.
2. Вставить новый столбец перед всеми столбцами, в которых встречается заданное число.
3. Удалить все строки, в которых нет ни одного четного элемента.
4. Удалить все столбцы, в которых все элементы положительны.
5. Удалить из массива k-тую строку и j-тый столбец, если их значения совпадают.
6. Уплотнить массив, удалив из него все нулевые строки и столбцы.