Главная страница
Навигация по странице:

  • Задания Задание 1.

  • Задание 7.

  • Задание 10.

  • 2 Разветвляющиеся вычислительные процессы

  • 2.3 Тестирование программы

  • 3.3 Тестирование программы

  • 5.3 Тестирование программы

  • 6.3 Тестирование программы

  • 7.3 Тестирование программы

  • 8.3 Тестирование программы

  • лабы по плюсам, Павловская, Вариант 4. Задания Задание 1


    Скачать 0.67 Mb.
    НазваниеЗадания Задание 1
    Анкорлабы по плюсам, Павловская, Вариант 4
    Дата23.01.2022
    Размер0.67 Mb.
    Формат файлаdocx
    Имя файлаRGR_s__GToC6j_2.docx
    ТипДокументы
    #339407
    страница1 из 2
      1   2

    Министерство науки и высшего образования Российской Федерации

    Федеральное государственное бюджетное
    образовательное учреждение высшего образования
    «Комсомольский-на-Амуре государственный университет»

    Факультет компьютерных технологий

    Кафедра «Проектирование, управление и разработка информационных систем»

    РАСЧЁТНО-ГРАФИЧЕСКАЯ РАБОТА

    по дисциплине «Объектно-ориентированное программирование»

    Вариант 4

    Студент группы 9ВТб-1 А. А. Гужа

    Преподаватель С. А. Гордин

    2021

    Задания

    Задание 1. Написать программу расчета по двум формулам. Предварительно подготовить тестовые примеры.

    Задание 2. Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры.

    Написать программу, которая определяет, попадает ли точка с заданным координатами в область, закрашенную на рисунке серым цветом. Результат работы вывести в виде текстового сообщения.

    Задание 3. Разработать программу, вычисления значения функции, заданной графически. Результаты вывести на экран в виде таблицы на интервале от xнач до xкон с шагом dx. Значения xнач до xкон с шагом dx получить от пользователя.

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

    Вычислить и вывести на экран таблицы значения функции, заданной с помощью ряда Тейлора, на интервале от xнач до xкон с шагом dx с точностью e. Таблицу снабдить заголовком и шапкой. Каждая строка таблицы должна содержать значение аргумента и количество просуммированных членов ряда.

    Задание 4. Построить описание класса, содержащего информацию о почтовом адресе организации. Предусмотреть возможность раздельного изменения составных частей адреса и проверки допустимости вводимых значений. В случае недопустимы значений полей выбрасываются исключения. Написать программу, демонстрирующую все разработанные элементы класса.

    Задание 5. В одномерном массиве, состоящем из n вещественных элементов, вычислить: сумму элементов массива с нечетными номерами; сумму элементов массива, расположенных между первым и последним отрицательными элементами. Сжать массив удалив из него все элементы, модуль которых не превышает единицу. Освободившиеся в конце массива элементы заполнить нулями.

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

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

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

    Задание 9. Описать базовый класс Строка. Описать производный от Строка класс Десятичная_строка. Строки данного класса могут содержать только символы десятичных цифр и символы – и +, задающие знак числа. Символы – и + могут находиться только в первой позиции числа, причем символ + может отсутствовать, в этом случае число считается положительным. Если в составе инициализирующей строки будут встречены любые символы, отличные от допустимых, класс Десятичная_строка принимает нулевое значение. Содержимое данных строк рассматривается как десятичное число. Для класса определить следующие методы: конструктор, принимающий в качестве параметра число; арифметическая разность строк; проверка на больше (по значению); проверка на меньше (по значению).

    Задание 10. Описать структуру с именем AEROFLOT и написать программу выполняющую ряд дейтсвий над ней.

    Содержание





    Введение 6

    1 Линейные программы 7

    1.1 Описание программы 7

    1.2 Текст программы 8

    1.3 Тестирование программы 8

    2 Разветвляющиеся вычислительные процессы 9

    2.1 Описание программы 9

    2.2 Текст программы 10

    2.3 Тестирование программы 12

    3 Организация циклов 14

    3.1 Описание программы 14

    3.2 Текст программы 15

    3.3 Тестирование программы 18

    4 Простейшие классы 20

    4.1 Описание программы 20

    4.2 Текст программы 20

    4.3 Тестирование программы 22

    5 Одномерные массивы 23

    5.1 Описание программы 23

    5.2 Текст программы 23

    5.3 Тестирование программы 25

    6 Двумерные массивы 26

    6.1 Описание программы 26

    6.2 Текст программы 26

    6.3 Тестирование программы 29

    7 Строки 30

    7.1 Описание программы 30

    7.2 Текст программы 30

    7.3 Тестирование программы 32

    8 Классы и операции 34

    8.1 Описание программы 34

    8.2 Текст программы 34

    8.3 Тестирование программы 37

    9 Наследование 38

    9.1 Описание программы 38

    9.2 Текст программы 38

    9.3 Тестирование программы 42

    10 Структуры 43

    10.1 Описание программы 43

    10.2 Текст программы 43

    10.3 Тестирование программы 45

    Заключение 47

    Список использованных источников 48


    Введение

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

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

    Программисты договорились, что данные внутри объекта будут называться свойствами, а функции — методами. Но это просто слова, по сути это те же переменные и функции.

    Объекты характеризуются четырьмя словами: инкапсуляция, абстракция, наследование и полиморфизм.

    Такой подход позволяет программировать каждый модуль независимо от остальных. Главное — заранее продумать, как модули будут общаться друг с другом и по каким правилам. При таком подходе вы можете улучшить работу одного модуля, не затрагивая остальные — для всей программы неважно, что внутри каждого блока, если правила работы с ним остались прежними.

    На дисциплине «Технологии и методы программирования» мы работаем с программой Visual Studiо, на языке С++ (моментами с С).

    Целями данной работы являются: обрести способность разрабатывать алгоритмы и программы, пригодные для практического применения, а также знать основные языки программирования и навыки работы с базами данных, операционными системами и оболочками, современными программными средами разработки информационных систем и технологий.
    1 Линейные программы
    Для представления объектов в языках C++, С#, Java и подобных используется понятие класс, аналогичное обыденному смыслу этого слова в контексте «класс членистоногих», «класс млекопитающих», «класс задач» и т.

    п. Класс является обобщенным понятием, определяющим характеристики и поведение некоторого множества конкретных объектов этого класса, часто называемых экземплярами класса. Класс содержит данные, задающие свойства объектов класса, и функции, определяющие их поведение.

    Данные класса называются полями (по аналогии с полями структуры), а функции класса — методами. Поля и методы называются элементами класса. Создаваемый тип данных обладает практически теми же свойствами, что и стандартные типы. Это очень важная особенность объектно-ориентированных языков [1, стр. 179].
    1.1 Описание программы
    Напишите программу для расчета по двум формулам, указанным на рисунке 1.1. Составить и протестировать примеры.


    Рисунок 1.1 – Задание
    Для выполнения данного задания необходимо будет определить переменные вещественного типа и записать в них рассчитываемые значения.

    Чтобы посчитать такие функции, как синус или косинус, используем готовые решения, заложенные в стандарте языка.

    1.2 Текст программы
    Проект состоит из одного файла исходного кода, который приведен в листинге 1.1:
    Листинг 1.1 – Текст файла Program.cs

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;
    namespace Lab01

    {

    class Program

    {

    static void Main(string[] args)

    {

    double z1, z2, a;

    Console.WriteLine("Введите значение a: ");

    a = double.Parse(Console.ReadLine());

    z1 = (Math.Sin(2 * a) + Math.Sin(5 * a) - Math.Sin(3 * a)) / (Math.Cos(a) - Math.Cos(3 * a) + Math.Cos(5 * a));

    z2 = Math.Tan(3 * a);

    Console.WriteLine($"a={a}\nz1={z1}\nz2={z2}");

    }

    }

    }
    1.3 Тестирование программы
    Результат работы программы при введенном значении, равном 2, приведен на рисунке 1.2.


    Рисунок 1.2 – Результат работы программы

    2 Разветвляющиеся вычислительные процессы
    В линейной программе все операторы выполняются последовательно, один за другим. Таким способом можно записать только очень простые алгоритмы. Для того чтобы в зависимости от конкретных значений исходных данных обеспечить выполнение разных последовательностей операторов, применяются операторы ветвления if и switch. Оператор if обеспечивает передачу управления на одну из двух ветвей вычислений, а оператор switch — на одну из произвольного количества ветвей [1, стр. 26].
    2.1 Описание программы
    Задача 1. Разработать программу, вычисления значения функции, заданной графически, показанной на рисунке 2.1. Результаты вывести на экран в виде таблицы на интервале от xнач до xкон с шагом dx. Значения xнач до xкон с шагом dx получить от пользователя.


    Рисунок 2.1 – График функции
    Задача 2. Написать программу, которая определяет, попадает ли точка с заданным координатами в область, показанную на рисунке 2.2, закрашенную на рисунке серым цветом. Результат работы вывести в виде текстового сообщения.
    Р
    исунок 2.2 - Область

    Для выполнения данного задания необходимо будет определить границы серой области, соответственно, если выбранная точка лежит внутри этих границ, то это считается попаданием, иначе промахом. Составим математическую модель серой области по формуле 1.1.
    (1.1)

    Если точка с координатами (х;у) будет удовлетворять условиям, указанным выше, то это будет означать попадание, иначе – промах.
    2.2 Текст программы
    Проект состоит из двух файлов исходного кода, которые приведены в листингах 2.1 и 2.2, соответственно:
    Листинг 2.1 – Текст файла Program.cs

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;
    namespace Lab021

    {

    class Program

    {

    static void Main(string[] args)

    {

    double y, x, R;

    Console.WriteLine("Введите значение x: ");

    x = double.Parse(Console.ReadLine());

    Console.WriteLine("Введите значение R: ");

    R = double.Parse(Console.ReadLine());

    if (x < -10 || x > (2 * R+2))

    {

    Console.WriteLine("Данный аргумент не попадает в область!");

    }

    else

    {

    if (x >= -10 && x <= 0)

    {

    Console.WriteLine($"x-6={x - 6}");

    y = R * (x + 6) / 6;

    }

    else

    {

    if (x > 0 && x < R)

    {

    y = -Math.Sqrt(Math.Pow(R, 2) - Math.Pow(x, 2));

    }

    else

    {

    if (x >= R && x <= 2 * R)

    {

    y = Math.Sqrt(Math.Pow(R, 2) - (Math.Pow(x - 2 * R, 2)));

    }

    else

    {

    y = 0;

    }

    }

    }

    Console.WriteLine($"y={y}");

    }

    }

    }

    }
    Листинг 2.2 - Текст файла Program.cs

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;
    namespace Lab022

    {

    class Program

    {

    static void Main(string[] args)

    {

    double x, y, R;

    R = 4;

    Console.WriteLine("Введите значение x: ");

    x = double.Parse(Console.ReadLine());

    Console.WriteLine("Введите значение y: ");

    y = double.Parse(Console.ReadLine());

    if (y >= 0 && (Math.Pow(x, 2) + Math.Pow(y, 2) <= Math.Pow(R, 2)) || (x <= 0 && y < 0 && y <= x && y >= -R))

    {

    Console.WriteLine("Есть попадание!");

    }

    else

    {

    Console.WriteLine("Нет попадания!");

    } } }}
    2.3 Тестирование программы
    Результаты работы программы при разных вариантах продемонстрированы на рисунках 2.2, 2.3, 2.4, 2.5.


    Рисунок 2.2 – Значение функции при x = 3


    Рисунок 2.3 – Значение функции при x = 6


    Рисунок 2.4 – Промах


    Рисунок 2.5 – Попадание
    3 Организация циклов
    Операторы цикла используются для вычислений, повторяющихся многократно. В С# имеется четыре вида циклов: цикл с предусловием while, цикл с постусловием repeat, цикл с параметром for и цикл перебора foreach. Каждый из них состоит из последовательности операторов [1, стр. 32].
    3.1 Описание программы
    Задача 1. Разработать программу, вычисления значения функции, заданной графически. Результаты вывести на экран в виде таблицы на интервале от xнач до xкон с шагом dx. Значения xнач до xкон с шагом dx получить от пользователя. Функция представлена на рисунке 3.1.



    Рисунок 3.1 – Задание 1
    Для выполнения данной задачи необходимо создать цикл, который будет шагать по значениям х и в соответствии с поставленными условиями будет рассчитывать одну из функций. Ветвление будет реализовано с помощью оператора if, а цикл с помощью оператора for. Все переменные будут запрашиваться у пользователя в консоли.

    Задача 2. Для десяти выстрелов, координаты которых задаются с клавиатуры, вывести текстовые сообщения о попадании в мишень из пункта 2, представленной на рисунке 3.2.

    Р
    исунок 3.2 - Мишень
    Для выполнения этой задачи нужно организовать цикл for, который 10 раз проверит попадут ли указаные координаты по данной мишени.

    Задача 3. Вычислить и вывести на экран таблицы значения функции, заданной с помощью ряда Тейлора, на интервале от xнач до xкон с шагом dx с точностью e. Таблицу снабдить заголовком и шапкой. Каждая строка таблицы должна содержать значение аргумента и количество просуммированных членов ряда. Ряд Тейлора представлен на рисунке 3.3.


    Рисунок 3.3 – Ряд Тейлора для задачи 2
    Для выполнения этой задачи организуем цикл, в котором определённая переменная будет накапливать в себе сумму каждого нового члена ряда для каждого нового значения х, а также проверять по формуле приближенного значения суммы ряда.
    3.2 Текст программы
    Проекты всех задач состоят из трех файлов исходного кода, которые приведены в листингах 3.1, 3.2 и 3.3, соответсвенно:
    Листинг 3.1 – Текст файла Program.cs

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;
    namespace Lab031

    {

    class Program

    {

    static void Main(string[] args)

    {

    double y, x, dx, k, R;

    Console.WriteLine("Введите начальное значение: ");

    x = double.Parse(Console.ReadLine());

    Console.WriteLine("Введите конечное значение: ");

    k = double.Parse(Console.ReadLine());

    Console.WriteLine("Введите шаг: ");

    dx = double.Parse(Console.ReadLine());

    //Console.WriteLine("Введите значение R: ");

    R = 3.0;

    for (; x <= k; x += dx)

    {
    if (x < -10 || x > (2 * R + 2))

    {

    Console.WriteLine("Данный аргумент не попадает в область!");

    }

    else

    {

    if (x >= -10 && x <= 0)

    {

    //Console.WriteLine($"x-6={x - 6}");

    y = - R * (x + 6) / 6;

    }

    else

    {

    if (x > 0 && x < R)

    {

    y = -Math.Sqrt(Math.Pow(R, 2) - Math.Pow(x, 2));

    }

    else

    {

    if (x >= R && x <= 2 * R)

    {

    y = Math.Sqrt(Math.Pow(R, 2) - (Math.Pow(x - 2 * R, 2)));

    }

    else

    {

    y = 0;

    }

    }

    }

    Console.WriteLine($"|\t{x}\t|\t{y}\t|");

    }

    }

    }

    }

    }
    Листинг 3.2 – Текст файла Program.cs

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;
    namespace Lab032

    {

    class Program

    {

    static void Main(string[] args)

    {

    int R;

    Console.WriteLine("Введите значение R: ");

    R = int.Parse(Console.ReadLine());

    for (int i = 0; i < 10; i++)

    {

    double x, y;

    Console.WriteLine("Введите значение x: ");

    x = double.Parse(Console.ReadLine());

    Console.WriteLine("Введите значение y: ");

    y = double.Parse(Console.ReadLine());

    if (y >= 0 && (Math.Pow(x, 2) + Math.Pow(y, 2) <= Math.Pow(R, 2)) || (x <= 0 && y < 0 && y <= x && y >= -R))

    {

    Console.WriteLine("Есть попадание!");

    }

    else

    {

    Console.WriteLine("Нет попадания!");

    }

    }

    }

    }

    }
    Листинг 3.3 – Текст файла Program.cs

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;
    namespace Lab033

    {

    class Program

    {

    static void Main(string[] args)

    {

    double check, sum, x, dx, e, k;

    int max = 1000;

    Console.WriteLine("Введите начальное значение: ");

    x = double.Parse(Console.ReadLine());

    Console.WriteLine("Введите конечное значение: ");

    k = double.Parse(Console.ReadLine());

    Console.WriteLine("Введите шаг: ");

    dx = double.Parse(Console.ReadLine());

    e = 0.001;

    for (; x < k; x = Math.Round(x+dx, 10))

    {

    check = Math.Log(x + 1);

    double ch = x;

    sum = ch;

    int i = 1;

    do

    {

    ch = Math.Pow(-1, i) * Math.Pow(x, i + 1) / (i + 1);

    sum += ch;

    i++;

    }

    while (Math.Abs(ch) > e);

    Console.WriteLine($"|\t{x,5}\t|\t{sum,10}\t|\t{check,10}\t|\t{i,4}\t|");

    }

    }

    }

    }
    3.3 Тестирование программы
    Результаты работы программы продемонстрированы на рисунках 3.4, 3.5 и 3.6.


    Рисунок 3.3 – Результат работы при задаче 1


    Рисунок 3.4 – Результат работы при задаче 2


    Рисунок 3.5 – Результат работы при задаче 3

    4 Простейшие классы
    Класс являеться типом данных, определяемых пользователем. Он должен представлять собой логическую сущность, например, являться моделью реального объекта или процесса. Элементами класса являються данные и функции, предназначенные для их обработки.
    4.1 Описание программы
    Построить описание класса, содержащего информацию о почтовом адресе организации. Предусмотреть возможность раздельного изменения составных частей адреса и проверки допустимости вводимых значений. В случае недопустимы значений полей выбрасываются исключения. Написать программу, демонстрирующую все разработанные элементы класса.

    Для выполнения данного задания создадим общую модель адреса какого-либо помещения и назовем её Adress, в ней мы будем хранить следующуб информацию: город, улицу, дом, почтовый индекс. Будем считать что этого достаточно для точного описанния адреса любого сооружения. Далее нам понадобяться конструкторы данного класса, сперва конструктор по умолчанию, он будет создавать экземпляр класса и вводитть в него пустую информацию, затем конструктор, который будет примнимать в себя параметра для создания.

    Также создадим методы change и show, которые обеспечат возможность изменения некого адреса и его вывод на консоль, соответсвенно.
    4.2 Текст программы
    Проект состоит из одного файла исходного кода, который приведен в листинге 4.1:
    Листинг 4.1 – Текст файла Program.cs

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;
    namespace Laba04

    {

    class Program

    {

    static void Main(string[] args)

    {

    try

    {

    string str1, str2, str3, str4;

    Console.Write("Введите город: "); str1 = Console.ReadLine();

    Console.Write("Введите улицу: "); str2 = Console.ReadLine();

    Console.Write("Введите дом: "); str3 = Console.ReadLine();

    Console.Write("Введите индекс: "); str4 = Console.ReadLine();

    Adress ad = new Adress(str1, str2, str3, str4);

    ad.show();
    Console.WriteLine("Что меняем?");

    Console.WriteLine("1 - город");

    Console.WriteLine("2 - улицу");

    Console.WriteLine("3 - дом");

    Console.WriteLine("4 - индекс");

    Console.Write("Введите номер:");

    int cmd = int.Parse(Console.ReadLine());

    if (cmd < 1 || cmd > 4) { throw new ArithmeticException(); };

    Console.Write("Введите новое значние: ");

    string str = Console.ReadLine();

    ad.change(cmd, str);

    ad.show();

    }

    catch { Console.WriteLine("Возникло исключение"); }

    }

    }

    }
    class Adress

    {

    string City, Street, House, Index;

    public Adress() { City = "non_city"; Street = "non_street"; House = "non_house"; Index = "non_index"; }

    public Adress(string _City, string _Street, string _House, string _Index) { City = _City; Street = _Street; House = _House; Index = _Index; }

    public void change(int i, string str)

    {

    switch (i)

    {

    case 1: City = str; break;

    case 2: Street = str; break;

    case 3: House = str; break;

    case 4: Index = str; break;

    }

    }

    public void show()

    {

    Console.WriteLine($"{City} {Street} {House} {Index}");

    }

    }
    4.3 Тестирование программы
    Результат работы программы при введенных значениях приведен на рисунке 4.1.


    Рисунок 4.1 – Результат работы программы
    5 Одномерные массивы
    В случае простых переменных каждой области памяти для хранения одной величины соответствует свое имя. Если требуется работать с группой величин одного типа, их располагают в памяти последовательно и дают им общее имя, а различают по порядковому номеру. Такая последовательность однотипных величин называется массивом. Массивы, как и любые другие объекты, можно размещать либо с помощью операторов описания, либо динамически с помощью операций выделения памяти.

    Элементы массива нумеруются с нуля, поэтому максимальный индекс (номер) элемента всегда на единицу меньше размерности. Автоматический контроль выхода индекса за границы массива не выполняется, поэтому программист должен следить за этим самостоятельно
    5.1 Описание программы
    В одномерном массиве, состоящем из n вещественных элементов, вычислить: сумму элементов массива с нечетными номерами; сумму элементов массива, расположенных между первым и последним отрицательными элементами. Сжать массив удалив из него все элементы, модуль которых не превышает единицу. Освободившиеся в конце массива элементы заполнить нулями.
    5.2 Текст программы
    Проект состоит из одного файла исходного кода, который приведен в листинге 5.1.
    Листинг 5.1 – Текст файла Program.cs

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;
    namespace Laba05

    {

    class Program

    {

    static void Main(string[] args)

    {

    Random rnd = new Random();

    const int n = 10;

    double[] arr = new double[n];
    int iFirst = -1, iLast = -1;
    for(int i = 0; i < arr.Length; i++)

    {

    arr[i] = rnd.NextDouble() * 10 - 5;

    Console.WriteLine($"[{i}]={arr[i]}");

    if (arr[i] < 0)

    {

    if (iFirst == -1) iFirst = i;

    else iLast = i;

    }

    }
    double sum = 0;

    double sumNegativ = 0;

    for (int i = 1; i < arr.Length; i+=2)

    {

    sum += arr[i];

    }

    Console.WriteLine("Сумма по четным индексам:" + sum);
    if (iFirst == -1 || iLast == -1)

    {

    Console.WriteLine("Недостаточно отрицательных значений");

    }

    else

    {

    for(int i = iFirst + 1; i < iLast; i++)

    {

    sumNegativ += arr[i];

    }

    Console.WriteLine($"Сумма от {arr[iFirst]} до {arr[iLast]} равна {sumNegativ}");

    }

    int count = 0;

    for (int i = 0; i < arr.Length - count; i++)

    {

    if (Math.Abs(arr[i]) < 1)

    {

    for (int j = i; j < arr.Length - count - 1; j++)

    {

    arr[j] = arr[j + 1];

    }

    arr[arr.Length - count - 1] = 0;

    count++;

    }

    }

    Console.WriteLine("Измененный массив:");

    foreach(double elem in arr)

    {

    Console.Write(elem + " ");

    }

    }

    }

    }


    5.3 Тестирование программы
    Результат работы программы приведен на рисунке 5.1.


    Рисунок 5.1 – Результат работы программы

    6 Двумерные массивы
    Двумерный массив представляется в С# как массив, состоящий из массивов. Вторая размерность задается в отдельных квадратных скобках. Если массив определяется с помощью операторов описания, обе его размерности должны быть константами или константными выражениями, поскольку инструкции по выделению памяти формируются компилятором до выполнения программы.

    Строки двумерного массива ничем не разделены, то есть прямоугольной матрицей он является только в нашем воображении. В памяти сначала располагается одномерный массив a[0] — нулевая строка массива a, затем — массив a[1], являющийся первой строкой массива a, и т.д. Количество элементов в каждом из этих массивов равно длине строки, то есть количеству столбцов в матрице. При просмотре массива от начала в первую очередь изменяется правый индекс (номер столбца). Для доступа к отдельному элементу массива применяется конструкция вида a[i] [j], где i (номер строки) и j (номер столбца) — выражения целочисленного типа. Каждый индекс может изменяться от 0 до значения соответствующей размерности, уменьшенной на единицу.
    6.1 Описание программы
    Дана целочисленная матрица. Определить: произведение элементов в тех строках, которые не содержат отрицательных элементов; максимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы.
    6.2 Текст программы
    Проект состоит из одного файла, представленного в листинге 6.1.
    Листинг 6.1 – Текст файла Текст.txt

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;
    namespace Laba06

    {

    class Program

    {

    static void Main(string[] args)

    {

    Random rnd = new Random();

    int rows = rnd.Next(3, 5),

    cols = rows,

    rndMin = -10,

    rndMax = 10;

    int[,] mat = new int[rows, cols];
    //fill array with random

    Console.WriteLine("Исходная матрица:");

    for (int i = 0; i < rows; i++)

    {

    for (int j = 0; j < cols; j++)

    {

    mat[i, j] = rnd.Next(rndMin, rndMax);

    Console.Write(mat[i, j] + "\t");

    }

    Console.WriteLine();

    }
    Console.WriteLine("Произведение:");

    int mult = 1;

    bool negative;

    for (int i = 0; i < rows; i++)

    {

    negative = false;

    for (int j = 0; j < cols; j++)

    {

    if (mat[i, j] >= 0)

    {

    mult *= mat[i, j];

    }

    else

    {

    mult = 1;

    negative = true;

    break;

    }

    }

    if (!negative)

    {

    Console.WriteLine($"Строка[{i}]: {mult}");

    }

    else

    {

    Console.WriteLine($"Строка[{i}]: есть отрицательный элемент");

    }

    }

    //определяем минимальную сумму из модулей элементов диагоналей параллельных побочной

    int maxSum = mat[0,0], sum, k;

    int index = 0;

    k = 2 * rows - 1; //общее кол-во диагоналей
    //рассчет сумм левой части матрицы

    for (int c = 1; c <= (k / 2); c++)

    {

    int j = 0;

    sum = 0;

    for (int i = c ; i < rows ; i++)

    {

    Console.Write($" c({c}) i({i}) j({j}) ");

    Console.Write($"[{mat[i, j]}]");

    sum += mat[i,j];

    ++j;

    }

    if (sum > maxSum)

    {

    index = -c;

    maxSum = sum;

    }

    Console.WriteLine();

    }

    //рассчет сумм правой части матрицы

    for (int c = 1; c <= (k / 2); c++)

    {

    int j = cols - c;

    sum = 0;

    for (int i = 0; i < rows && j < cols; i++)

    {

    Console.Write($" c({c}) i({i}) j({j}) ");

    Console.Write($"[{mat[i, j]}]");

    sum += mat[i, j];

    j++;

    }

    if (sum > maxSum)

    {

    maxSum = sum;

    index = c;

    }

    Console.WriteLine();

    }

    Console.WriteLine($"Максимальная сумма среди побочных диагоналей равна {maxSum} , диагональ {index}");

    }

    }

    }
    6.3 Тестирование программы
    Результат работы программы при использовании текстового файла, приведен на рисунке 6.1.


    Рисунок 6.1 – Результат работы программы
    7 Строки
    Обработка тесктовой информации является, вероятно, одной из самых распространенных задач в современном программировании, и С# предоставляет для ее решения широкий набор средст: отдельные символы, массивы символов, изменяемые и неизменяемые и регулярные выражения.

    Тип string, предназначенный для работы со строками символов в кодировке Unicode, является встроенным типом C#. Ему соответсвует базовый класс System.String библиотеки .NET.
    7.1 Описание программы
    Написать программу, которая считывает русский текст из файла и выводит на экран слова, начинающиеся с гласных букв.

    Для выполнения этого задания будем применять следующий алгоритм:

    • cчитаем строчку из файла, в которм лежит текст;

    • уберем лишение пробелы по бокам строки с помощью метода String.Trim();

    • удалим из строки все символы пунктуации, с помощью метода char.IsPunctuation();

    • разделим строку на слова по разделителю – пробел, при помощи метода String.Split();

    • если первый символ слова является одной из гласных букв русского алфавита, то значит, что это слово начинающееся с гласной буквы;

    • выводим слово на экран;

    • если строки не кончились, то переходим к пункту 1, иначе к пункту 8;

    • закнчиваем работу программы.



    7.2 Текст программы
    Проект состоит из одного файла исходного кода, который приведен в листинге 7.1:
    Листинг 7.1 – Текст файла Program.cs

    using System;

    using System.IO;
    namespace Laba07

    {

    class Program

    {

    static void Main(string[] args)

    {

    try

    {

    StreamReader f = new StreamReader("C:/Users/Алексей/Desktop/Laba07 text.txt");

    string s;

    Vowel vow = new Vowel();

    long i = 0;

    while ((s = f.ReadLine()) != null)

    {

    s.Trim();

    Console.WriteLine("{0}: {1}", i++, s);

    for(int j = 0; j < s.Length; j++)

    {

    if (char.IsPunctuation(s[j]))

    {

    s = s.Remove(j, 1);

    }

    }

    string[] words = s.Split(' ');

    foreach (string word in words)

    {

    if (word.Length > 1)

    {

    if (char.IsLetter(word[0]) && vow.isVowel(word[0]))

    {

    Console.WriteLine("\t{0}", word);

    }

    }

    }

    }

    f.Close();

    }

    catch (FileNotFoundException e)

    {

    Console.WriteLine(e.Message);

    Console.WriteLine("Проверьте правильность имени файла!");

    return;

    }

    catch (Exception e)

    {

    Console.WriteLine("Error: " + e.Message);

    return;

    }

    }

    }
    class Vowel

    {

    char[] vowels = { 'a', 'у', 'о', 'и', 'э', 'ы', 'я', 'ю', 'е', 'ё' };

    //функция определения гласной буквы

    public bool isVowel(char c)

    {

    foreach (char ch in vowels)

    {

    if (ch == c) return true;

    if (char.IsUpper(c))

    {

    if (char.ToLower(c) == ch) return true;

    }

    }

    return false;

    }

    }

    }
    7.3 Тестирование программы
    Исходный текст представлен на рисунке 7.1. Результат работы программы приведен на рисунке 7.2.


    Рисунко 7.1 – Исходный текст


    Рисунок 7.2 – Результат работы программы
    8 Классы и операции
    С# позволяет переопределить действие большинства операций так, чтобы при использовании с объектами конкретного класса они выполняли заданые функции. Это дает возможность применять экземпляры собственных типов данных в составе выражений таким же образом, как и стандартные.

    Оперделение собственных классов операций класса часто называют перегрузкой операций. Перегрузка обычно применяется для классов, описывающих математическике или физические понятия, то есть таких классов, для которых семантика операций делает программу более приятной.
    8.1 Описание программы
    Описать класс, обеспечивающий представление матрицы произвольного размера с возможностью, изменения числа строк и столбцов, вывода на экран подматрицы любого размера и всей матрицы, доступа по индексам к элементу матрицы. Написать программу, демонстрирующую все разработанные элементы класса.
    8.2 Текст программы
    Проект состоит из одного файла исходного кода, который приведен в листинге 8.1:
    Листинг 8.1 – Текст файла Laba08.cpp

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;
    namespace Laba08

    {

    class Program

    {

    static void Main(string[] args)

    {

    Matrix a = new Matrix();

    Matrix b = new Matrix(4, 6);

    Random rnd = new Random();

    Matrix c = new Matrix(5, 5, 3);

    Console.WriteLine("Matrix a");

    a.showAll();

    Console.WriteLine("Matrix b");

    b.showAll();

    Console.WriteLine("Matrix c");

    c.showAll();

    c.addRowsCols(3, 4);

    Console.WriteLine("Changed matrix c");

    c.showAll();

    Matrix d = new Matrix(10, 10);

    d.rndFull(1, 100);

    Console.WriteLine("Matrix d");

    d.showAll();

    Console.WriteLine("Part 1 matrix d");

    d.show(2, 3, -1, -1);

    Console.WriteLine("Part 2 matrix c");

    d.show(1, 1, 5, 6);

    Console.WriteLine("Changed matrix d addRosCols");

    d.addRowsCols(1, 1);

    d.showAll();

    Console.WriteLine("Changed matrix d rmvRosCols");

    d.rmvRowsCols(3, 3);

    d.showAll();

    Console.WriteLine("Changed element [2,4] in matrix d");

    d.change(2, 4, 0);

    d.showAll();

    }

    }
    class Matrix

    {

    int row, col;

    int[,] mat;
    public Matrix(int nRows, int nCols)

    {

    row = nRows; col = nCols;

    mat = new int[row, col];

    }

    public Matrix(int nRows, int nCols, int elem)

    {

    row = nRows; col = nCols;

    mat = new int[row, col];

    for (int i = 0; i < row; i++)

    {

    for(int j = 0; j < col; j++)

    {

    mat[i, j] = elem;

    }

    }

    }

    public Matrix()

    {

    row = 3; col = 3;

    mat = new int[row, col];

    }

    public void addRowsCols(int nr, int nc)

    {

    int[,] newMat = new int[row + nr, col + nc];

    for(int i = 0; i < row; i++)

    {

    for (int j = 0; j < col; j++)

    {

    newMat[i, j] = mat[i, j];

    }

    }

    row = row + nr;

    col = col + nc;

    mat = newMat;

    }
    public void rmvRowsCols(int nr, int nc)

    {

    int[,] newMat = new int[row - nr, col - nc];

    row = row - nr;

    col = col - nc;

    for (int i = 0; i < row; i++)

    {

    for (int j = 0; j < col; j++)

    {

    newMat[i, j] = mat[i, j];

    }

    }

    mat = newMat;

    }
    public void show(int rIndexStr, int cIndexStr, int rIndexEnd, int cIndexEnd)

    {

    if (rIndexEnd < 0) rIndexEnd = row;

    if (cIndexEnd < 0) cIndexEnd = col;

    for(int i = rIndexStr; i < rIndexEnd; i++)

    {

    for (int j = cIndexStr; j < cIndexEnd; j++)

    {

    Console.Write("{0, 4} ", mat[i, j]);

    }

    Console.WriteLine();

    }

    }
    public void rndFull(int min, int max)

    {

    Random rnd = new Random();

    for (int i = 0; i < row; i++)

    {

    for (int j = 0; j < col; j++)

    {

    mat[i, j] = rnd.Next(min, max);

    }

    }

    }
    public void change(int i, int j, int val)

    {

    mat[i, j] = val;

    }
    public void showAll()

    {

    show(0, 0, -1, - 1);

    }

    }

    }
    8.3 Тестирование программы
    Результат работы программы при введенных значениях приведен на рисунке 8.1.


    Рисунок 8.1 – Результат работы программы

    9 Наследование
    Класс в С# может иметь произвольное количество потомков и только одного предка. При описании класса еимя его предка записывается в заголовке класса после двоеточия. Если имя предка не указано, предком считается базовый класс всей иерархии System.Object.
    9.1 Описание программы
    Описать базовый класс Строка. Описать производный от Строка класс Десятичная_строка. Строки данного класса могут содержать только символы десятичных цифр и символы – и +, задающие знак числа. Символы – и + могут находиться только в первой позиции числа, причем символ + может отсутствовать, в этом случае число считается положительным. Если в составе инициализирующей строки будут встречены любые символы, отличные от допустимых, класс Десятичная_строка принимает нулевое значение. Содержимое данных строк рассматривается как десятичное число. Для класса определить следующие методы: конструктор, принимающий в качестве параметра число; арифметическая разность строк; проверка на больше (по значению); проверка на меньше (по значению).
    9.2 Текст программы
    Проект состоит из одного файла исходного кода, который приведен в листинге 9.1:
    Листинг 9.1 – Текст файла Program.cs

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;
    namespace Laba09

    {

    class Program

    {

    static void Main(string[] args)

    {

    //MyString str0 = new MyString("test");

    //DecimalString str1 = new DecimalString(100);

    MyString str1 = new DecimalString(100);

    MyString str2 = new DecimalString("+400");

    MyString str3 = new DecimalString("hkgjdgh");

    MyString str4 = new DecimalString(0231);

    MyString str5 = new DecimalString(-456);

    MyString str6 = new DecimalString("-557");
    MyString[] arr = new MyString[] { str1, str2, str3, str4, str5, str6 };

    Console.WriteLine("Вывод:");

    for(int i = 0; i < arr.Length; i++)

    {

    Console.WriteLine("{0}", arr[i].Symbs);

    }

    DecimalString s1 = new DecimalString(123);

    DecimalString s2 = new DecimalString(46);

    DecimalString res = s1 - s2;
    Console.WriteLine("Пример 1:\n{0} - {1} = {2}", s1.Symbs, s2.Symbs, res.Symbs);
    Console.WriteLine("Пример 2:\n{0} - {1} = {2}", arr[1].Symbs, arr[5].Symbs, ((DecimalString)arr[1] - (DecimalString)arr[5]).Symbs);
    Console.WriteLine("Пример 3:\n{0} - {1} = {2}", arr[3].Symbs, arr[4].Symbs, ((DecimalString)arr[3] - (DecimalString)arr[4]).Symbs);
    Console.WriteLine("Пример 4:\n{0} - {1} = {2}", arr[4].Symbs, arr[1].Symbs, ((DecimalString)arr[4] - (DecimalString)arr[1]).Symbs);
    Console.WriteLine("Пример 6:\n{0} > {1} ? {2}", arr[4].Symbs, arr[5].Symbs, ((DecimalString)arr[4] > (DecimalString)arr[5]));
    Console.WriteLine("Пример 6:\n{0} < {1} ? {2}", arr[1].Symbs, arr[5].Symbs, ((DecimalString)arr[1] < (DecimalString)arr[3]));
    MyString st = new MyString("hello");

    st.showMsg(); //объект MyString

    arr[0].showMsg(); //объект DecimalString, ссылка MyString

    s1.showMsg(); //объект DecimalString

    }

    }
    class MyString

    {

    string symbs;
    public string Symbs { get => symbs; set => symbs = value; }
    public MyString()

    {

    }
    public MyString(string str)

    {

    symbs = str;

    }
    public void Clear()

    {

    symbs = "";

    }
    virtual public void showMsg()

    {

    Console.WriteLine("Это Базовый класс");

    }
    }

    class DecimalString : MyString

    {

    public DecimalString(string str)

    : base(str)

    {

    int result;

    if (int.TryParse(str, out result))

    {

    Symbs = result.ToString();

    if(str[0] == '+')

    {

    string.Concat("+", Symbs);

    }

    else

    {

    if (str[0] == '-')

    string.Concat("-", Symbs);

    }

    }

    else

    {

    Symbs = "0";

    }

    }
    public DecimalString(int num)

    {

    Symbs = num.ToString();

    }
    public DecimalString Substraction(DecimalString str1, DecimalString str2)

    {

    string s1 = str1.Symbs;

    string s2 = str2.Symbs;

    //Console.WriteLine("{0} <-> {1}", str1.symbs, s2);

    int result = int.Parse(s1) - int.Parse(s2);

    //Console.WriteLine("{0} - {1} = {2}", s1, s2, result);

    return new DecimalString(result);

    }
    public bool isMore(DecimalString str1, DecimalString str2)

    {

    if (int.Parse(str1.Symbs) > int.Parse(str2.Symbs)) return true;

    return false;

    }

    public bool isLess(DecimalString str1, DecimalString str2)

    {

    if (int.Parse(str1.Symbs) < int.Parse(str2.Symbs)) return true;

    return false;

    }
    public static DecimalString operator -(DecimalString str1, DecimalString str2)

    {

    return str1.Substraction(str1, str2);

    }
    public static bool operator >(DecimalString str1, DecimalString str2)

    {

    return str1.isMore(str1, str2);

    }
    public static bool operator <(DecimalString str1, DecimalString str2)

    {

    return str1.isLess(str1, str2);

    }
    override public void showMsg()

    {

    Console.WriteLine("Это Производный класс");

    }

    }

    }
      1   2


    написать администратору сайта