Указатели и списки
Описание типа данных, соответствующего предложенному представлению многочленов. Разработка функции и процедур для работы с этими списками-многочленами: Equality (p, q), Meaning (p, x), Add (p, q, r). Листинг разработанной программы и ее функционал.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 01.12.2017 |
Размер файла | 47,3 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Лабораторная работа
Указатели и списки
Задание
Необходимо описать тип данных, соответствующий предложенному представлению многочленов, а также разработать следующие функции и процедуры для работы с этими списками-многочленами:
- логическую функцию Equality (p, q), проверяющую равенство многочленов p и q;
- функцию Meaning (p, x), вычисляющую значение многочлена в целочисленной точке х;
- процедуру Add (p, q, r) вычисления суммы многочленов q и r, результат - многочлен p.
1. Реализация программы (полностью весь код с комментариями)
программа многочлен указатель
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Threading. Tasks;
namespace SiAOD_LR1
{
public class Item
{
public int Number {get; set;}
public int Power {get; set;}
public Item Next {get; set;}
public Item Back {get; set;}
}
}
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Threading. Tasks;
namespace SiAOD_LR1
{
public class MyList
{
public Item List {get; set;}
public MyList() {List = new Item();}
// добавление нового члена
public void Add (int number, int power)
{
ReverseEnd();
Item local = new Item()
{
Number = number,
Power = power,
Back = List
};
List. Next = local;
List = local;
}
// упрощение выражения
public void Simplify()
{
// индексаторы нужны для того что бы пропуска
// проверяемый элемент при сравнии
int index = 0;
bool isEnd = false, delete = false;
Item item = new Item();
// пока основной не кончился сверяю его с локальным
// и объединяю члены с одинаковыми степенями
while (! isEnd)
{
ReverseBegin();
index++;
// проходим в глуь списка по индексу
for (int i = 0; i < index; i++)
{
if (List. Next!= null)
List = List. Next;
else
isEnd = true;
}
// записываем в предыдущий перебираемый элемент
// получившуюся сумму
List. Back. Number += item. Number;
// счётчик для вложенного цикла
// стартовый индекс
int localIndex = index;
item = new Item()
{
Number = 0,
Power = List. Power
};
while (! IsEnd())
{
localIndex++;
List = List. Next;
if (List. Power == item. Power && index!= localIndex)
{
item. Number += List. Number;
// удаление записанного члена многочлена
Item local = List = List. Back;
try
{
local. Next = List. Next. Next;
List. Next. Back = local;
List = local;
localIndex -;
}
catch
{
// создание буферного элемента списка
// для корректного извлечения последнего
List = local;
List. Next = new Item()
{
Back = List
};
List = List. Next;
delete = true;
break;
}
}
}
}
// удаление буферного элемента списка (последнего)
if (delete)
{
DeleteEnd();
}
ReverseBegin();
}
// удаление последнего
public void DeleteEnd()
{
ReverseEnd();
List = List. Back;
List. Next = null;
}
// являемся ли мы в начале списка
public bool IsBegin()
{
return List. Back == null && List. Next!= null;
}
// являемся ли мы в конце списка
public bool IsEnd()
{
return List. Next == null;
}
// функция для перехода к началу списка
public void ReverseBegin()
{
while (List. Back!= null)
{
List = List. Back;
}
if (List. Back!= null && List. Next!= null)
List = List. Next;
}
// функция для перехода к концу списка
public void ReverseEnd()
{
while (List. Next!= null)
{
List = List. Next;
}
}
public string GetPolynomial()
{
ReverseBegin();
string result = «»;
while (List. Next!= null)
{
List = List. Next;
result += GenerateMember (List. Number, List. Power);
}
result += GenerateMember (List. Number, List. Power);
return result;
}
public string GenerateMember (int number, int power)
{
return number. ToString() + «+(X^» + power. ToString() +»)»;
}
}
}
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Threading. Tasks;
namespace SiAOD_LR1
{
public class Program
{
static void Main (string[] args)
{
var x = Math. Pow (0, 2);
MyList first = new MyList(), second = new MyList(), third = new MyList();
Random rnd = new Random();
first. Add (1, 2);
first. Add (3, 3);
first. Add (1, 1);
first. Add (1, 1);
first. Add (3, 3);
second. Add (1, 2);
second. Add (2, 3);
second. Add (1, 3);
second. Add (2, 1);
second. Add (3, 3);
Add (ref third, first, second);
Console. WriteLine («p {0}», third. GetPolynomial());
Console. WriteLine («Meaning {0}», Meaning (first, 5));
Console. WriteLine («Equality {0}», Equality (first, second));
Console. ReadKey();
}
// процедуру Add (p, q, r) вычисления суммы многочленов q и r, результат - многочлен p
static public void Add (ref MyList p, MyList q, MyList r)
{
p. ReverseEnd();
q. ReverseBegin();
p. List. Next = q. List. Next;
p. ReverseEnd();
r. ReverseBegin();
p. List. Next = r. List. Next;
p. List. Next. Back = p. List;
p. Simplify();
}
// логическую функцию Equality (p, q), проверяющую равенство многочленов p и q
static public bool Equality (MyList p, MyList q)
{
p. Simplify();
q. Simplify();
while (! p. IsEnd())
{
p. List = p. List. Next;
q. ReverseBegin();
while (! q. IsEnd())
{
q. List = q. List. Next;
if (q. List. Number == p. List. Number && q. List. Power == p. List. Power)
{
Delete (ref p);
Delete (ref q);
break;
}
}
}
return Comparison (p, q);
}
static private bool Comparison (MyList p, MyList q)
{
bool result = true;
p. ReverseBegin();
q. ReverseBegin();
while (! p. IsEnd())
{
if (p. List!= q. List)
{
result = false;
}
p. List = p. List. Next;
q. List = q. List. Next;
}
return result;
}
// функцию Meaning (p, x), вычисляющую значение многочлена в целочисленной точке х
static public double Meaning (MyList p, int x)
{
double result = 0;
p. ReverseBegin();
while (! p. IsEnd())
{
p. List = p. List. Next;
result += p. List. Number * Math. Pow (x, p. List. Power);
}
return result;
}
static private void Delete (ref MyList index)
{
Item local = index. List = index. List. Back;
try
{
local. Next = index. List. Next. Next;
index. List. Next. Back = local;
index. List = local;
}
catch {}
}
}
}
2. Скрин программы, в котором отражены все результаты работы программы
3. Контрольные вопросы
1) Перечислите наиболее частые случаи, когда может оказаться эффективной работа с указателями.
Редактирование нескольких передаваемых значений в методе.
Метод для замены значений двух переменных местами.
Доступ к объекту формы по ссылке для его редактирования. (Неявное использование указателей).
2) Объясните, в чем различие между типизированными и нетипизированными указателями.
Типизированные указатели можно использовать только с переменными конкретного типа, в то время как нетипизированные указатели могут указывать на любые данные.
3) Объясните, почему сложение указателей не имеет смысла.
Пример: На проводах категории 5e (интернетовых) очень часто пишут «указатель», т.е. число, которое каждый метр увеличивается. Вот есть у нас сколько-то метров такого провода. В начале написана метка 185m, через ровно 1 метр будет метка 186m и так далее. Мы знаем, что на другом конце метка 211m.
Вычтем указатели 211-185 = 26. Получается у нас всего 26 метров такого провода. Вычитание указателей на практике используется для того, чтобы узнать сколько между этими указателями «места», или в нашем случае провода. И важно одно свойство - со скольких бы мы не начинали отсчёт, всё равно получим 26 метров. Существование меток вне диапазона, например 10m или 500m нам не важно.
Теперь сложим: 211+185 = 396. Полученое число не несёт ни какой смысловой нагрузки. Причём оно указывает на метку, которой не существует (катушки обычно по 305 метров) https://ru.stackoverflow.com/questions/284850/почему-нельзя-складывать-указатели
4) Дайте определение абстрактному типу данных «список».
Список - это абстрактный тип данных, представляющий собой упорядоченный набор значений, в котором некоторое значение может встречаться более одного раза. Экземпляр списка является компьютерной реализацией математического понятия конечной последовательности. Экземпляры значений, находящихся в списке, называются элементами списка (англ. item, entry либо element); если значение встречается несколько раз, каждое вхождение считается отдельным элементом.
Размещено на Allbest.ru
...Подобные документы
Проблемы с организацией данных. Определение и классификация динамических структур данных. Линейные односвязные, двухсвязные, кольцевые списки. Очередь, стеки. Описание основных типов данных и функции для работы с ними. Листинг программы, пример ее работы.
контрольная работа [290,6 K], добавлен 17.07.2012Создание базы данных и СУБД. Структура простейшей базы данных. Особенности языка программирования Турбо Паскаль. Описание типов, констант, переменных, процедур и функций. Описание алгоритма базы данных (для сотрудников ГИБДД), листинг программы.
курсовая работа [26,3 K], добавлен 26.01.2012Переменные типа integer, real, их функции. Общее понятие о массиве, файлы для Pascal. Информационный и информанизационный набор списка. Реализация и тестирование программы. Выбор базы данных, внесение имени, меню. Блок-схема алгоритма, листинг программы.
курсовая работа [306,0 K], добавлен 04.02.2013Характеристика программы на языке VBA, которая вводит исходные данные, выполняет расчеты и выводит результаты на экран. Описание переменных в программе, ее блок-схема и алгоритм работы. Листинг программы. Описание входных данных и результат вычислений.
курсовая работа [721,4 K], добавлен 10.11.2010Разработка программы по составлению бланка с анализом сданной отчетности клиента. Выбор способа организации данных, операторы языка SQL, построение ER-диаграммы и таблиц на её основе, листинг процедур. Описание процесса работы пользователя с программой.
дипломная работа [1,8 M], добавлен 10.10.2015Описание авторской идеи анимации, использования базовых команд и конструкций. Процесса проектирования программы. Описание алгоритма разработанной программы. Последовательность создания анимации. Листинг программы и скриншот рисунка по программе.
курсовая работа [911,5 K], добавлен 20.05.2013Разработка функциональной и принципиальной схемы. Выбор управляющего контроллера. Описание МК PIC16F626, МК AVR, МК 51. Выбор элементной базы. Разработка управляющей программы. Описание алгоритма работы программы. Схема устройства, листинг программы.
курсовая работа [492,9 K], добавлен 28.12.2012Возможности и синтаксис команд MATLAB, листинг программы и описание цикла. Порядок составления программы вычисления коэффициентов алгебраического интерполяционного многочлена и построения сплайн-функции, "склеенной" из кусков многочленов 3-го порядка.
лабораторная работа [30,8 K], добавлен 04.07.2009Описание и функциональное назначение программы по оптимизации функции, ее логическая структура и используемые технические средства. Практическое применение программы, вызов и загрузка, входные и выходные данные, выполнение контрольного примера и листинг.
курсовая работа [337,4 K], добавлен 26.02.2012Организация входных и выходных данных. Выбор состава технических и программных средств. Функционал для заполнения заявки для постоянно клиента. Форма вывода справки по программе. Таблица файлов, входящих в проект. Тестирование программы, ее листинг.
курсовая работа [2,5 M], добавлен 25.05.2014Написание программы, формирующей текстовый файл и выводящую на экран таблицу согласно заданному условию. Реализация принципа формирования текстовых файлов, разработка отдельных модулей (процедур) выбора информации из файла. Листинг полученной программы.
курсовая работа [769,1 K], добавлен 29.12.2011Средства выделения и освобождения памяти. Динамические структуры данных. Связные линейные списки и их машинное представление. Структура одно- и двухсвязного списка. Реализация операций над связными линейными списками. Разработка программы на языке С++.
курсовая работа [944,7 K], добавлен 14.03.2015Разработка программы на языке VBA, которая вводит исходные данные, выполняет расчеты и выводит на экран заданную информацию. Типы блок-схем и их использование при написании программы. Описание входных данных и результат вычислений, листинг программы.
курсовая работа [680,3 K], добавлен 03.08.2009Особенности метода численного интегрирования функции одной переменной. Замена на каждом элементарном отрезке подынтегральной функции на многочлен первой степени (линейную функцию). Разработка алгоритма программы, ее листинг. Пример работы программы.
контрольная работа [217,9 K], добавлен 14.07.2012Разработка программы с использованием языка программирования Pascal для выполнения алгебраических действий с действительными числами без знака в шестнадцатеричной системе счисления. Описание хода выполнения, схема алгоритма, листинг программы, ее функции.
реферат [687,5 K], добавлен 28.10.2011Описание данных, используемых при решении задачи. Структура программного модуля. Составление блок-схемы процедуры заполнения класса ZapisBook из текстового файла. Описание разработанной программы для упрощения работы с электронной записной книжкой.
курсовая работа [687,2 K], добавлен 03.10.2013Разработка программы на языке Turbo Pascal, обеспечивающей работу пользователя в диалоговом режиме с возможностью выбора функций с помощью одноуровневого меню вертикального типа. Блок-схема и листинг программы, описание руководства пользователя.
курсовая работа [1,5 M], добавлен 17.03.2014Преобразование матрицы по заданным правилам. Методика работы с массивами, основанная на классических алгоритмах. Разработка и описание блок-схемы алгоритма. Листинг программы, экраны работы и отладки программы. Инструкция для пользователей программы.
контрольная работа [338,4 K], добавлен 29.01.2013Описание программного обеспечения и языка программирования. Структуризация записей файлов, таблица компонентов. Организация производства: комплекс технических средств, инструкция пользователя. Листинг разработанной программы и оценка ее эффективности.
дипломная работа [868,3 K], добавлен 29.04.2013Типы данных, использованные при создании базы данных. Структура программы, используемые переменные, выражения и указатели. Концептуальное (инфологическое), логическое (даталогическое) и физическое проектирование. Тестирование программы и описание полей.
курсовая работа [398,4 K], добавлен 16.07.2012