CodeForum.anihub.ru

Объявление

Планируется создать страницы со статьями по тематике форума и страницу оглавления, доступную через меню, для чего в нём будет создан специальный пункт. Требования к статьям:

1. Формат файла - html.

2. Внутренние ссылки - относительные.

3. Если в статье больше одного файла, то она должна быть заархивирована одним файлом.

Статьи присылать на codesite@yandex.ru.

Администрация

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » CodeForum.anihub.ru » С++ » Коллекция решенных задач


Коллекция решенных задач

Сообщений 1 страница 4 из 4

1

Решение уравнений методом Гаусса.
Задача:
Дано: матрица a коэффициентов системы уравнений (первый индекс - строка), вектор-столбец b свободных членов той же системы уравнений и число уравнений. Матрица квадратная, число элементов вектора равно числу строк матрицы. Система эквивалентна матричному уравнению a*x=b. Требуется найти: вектор x решений системы уравнений. Если система не имеет однозначного решения, вернуть пустой указатель на массив x.
Решение:

Код:
double abs(double x)
{
 if (x<0)
 {
  return -x;
 }
 return x;
}
void Gauss(double **a, double *b, double *&x, unsigned short int n) // а - матрица коэффициентов, строки подряд, b - свободные члены, x - решение.
{
 unsigned hort int i,j,k,t;
 double kof,s,temp;
 if (x) // Если какой-то вектор решений уже дан
 {
  delete [] x; // Сотрём его нафиг!
  x=NULL;
 }
 for (i=n-1; i>0; --i) // Цикл по уравнениям - вычитаемым
 {
  for (t=i, j=i-1; j>=0; --j) Ищем строку с максимальным в i-том столбце коэффициентом.
  {
   if (abs(a[t][i]])<abs(a[i][j]])
   {
    t=j;
   }
  }
  if (a[i][j]==0.0)
  {
   return;
  }
  if (t!=i) // Если она не i-тая
  {
   for (k=n-1; k>=0; --k) // Меняем её с i-той
   {
    temp=a[t][k];
    a[t][k]=a[i][k];
    a[i][k]=temp;
   }
   temp=b[t];
   b[t]=b[i];
   b[i]=temp;
  }
  for (j=i-1; j>=0; --j) // Цикл пл уравнениям-уменьшаемым
  {
   kof=a[j][i]/a[i][i];
   for (a[j][i]=0.0, b[j]-=b[i]*kof, k=i-1; k>i; --k) // Цикл по столбцам
   {
    a[j][k]-=a[i][k]*kof;
   }
  }
 }
 x=new double [n];
 if (x)
 {
  for (i=0; i<n; ++i)
  {
   for (s=0.0, j=i-1, j>=0; --j)
   {
    s+=a[i][j];
   }
   if (a[i+i*n]<>0.0)
   {
    x[i]=(b[i]-s)/a[i][i];
   }
   else
   {
    delete [] x; 
    x=NULL;
    return;
   }
  }
 }
}

0

2

Задача.
Дано:
1 f - с++-функция с одним аргументом типа double и типом возвращаемого значения double,
2 s - шаг интегрирования (s<>0),
3 a, b - пределы интегрирования (если s>0, то a<b, а если s<0, то a>b).
Требуется:
вычислить интеграл по методу трапеций и поместить результат в переменную i типа double.
Решение:

Код:
typedef double(*TDd)(double);
double Itegral(TDd Function, double Start, double End, double DeltaX)
{
 double result;
 double x;
 for (result=0.0, x=Start; x<End; x+=DeltaX)
 {
  result+=Function(x)*DeltaX+(Function(x+DeltaX)-Function(x))*DeltaX/2;
 }
 return result;
}

Способ применения:

Код:
i=Integral(f,a,b,s);

0

3

Задача: хранить элементы в линейном массиве-объекте с произвольным диапазоном целых индексов
Решение:

Код:
template <TBase> class TArray // Шаблон класса
{
 protected: // Защищённые члены
  TBase *Data; // Здесь будут храниться элменты
  uint32_t Start; // Индекс первого элемента
  uint32_t Count; // Количество элментов
 public:
  TArray (); // Дефолтный конструктор
  TArray (TArray &Array); // Копирующий конструктор
  TArray operator = (TArray &Array); // Оператор присваивания
  TBase & operator [] (uint32_t Index); // Оператор индексации
  bool ReSize (uint32_t Begin, uint32_t End); // Задаём диапазон индексов
  uint32_t Number (); // Читаем число элементов
  uint32_t First(); // Читаем индекс первого элемента
  uint32_t Last; // Вычисляем индекс последнего элемента
};
TArray::TArray ()
{
 Data=NULL; // Пустой массив
 Start=0; // Пустой массив
 Count=0; // Пустой массив
}
TArray::TArray (TArray &Array)
{
 TBase *p1; // Указатель на элемент
 TBase *p2; // Указатель на элемент
 if (Array.Count!=0) // Оригинал не пуст?
 {// Оригинал не пуст
  Data=new TBase [Array.Count]; // Создаём массив
  if (Data) // Массив создан?
  {// Массив создан
   for (p1=Data+Array.Count-1, p2=Array.Data+Array.Count-1, Count=Array.Count; Start=Array.Start; p1>=Data; --p1, --p2) // Цикл: p1=указатель на последний элемент копии, p2=указатель на последний элемент оригинала, копируем число элементов, копируем индекс первого элемента и, пока p1 в копии (а p2 в оригинале) крутим цикл, каждый раз переводя оба указтеля на предыдущие элементы
   {// Тело цикла
    (*p1)=(*p2); // Копируем элемент
   }// Тело цикла
  }// Массив создан
  else
  {// Массив не создан
   Start=0; // Пустой массив
   Count=0;  // Пустой массив
  }// Массив не создан
 }// Оригинал не пуст
 else
 {// Оригинал пуст
  Data=NULL; // Пустой массив
  Start=0; // Пустой массив
  Count=0; // Пустой массив
 }// Оригинал пуст
}
TArray
TArray::operator = (TArray &Array)
{
 TBase *p1; // Указатель на элемент
 TBase *p2; // Указатель на элемент
 if (Array.Count!=0) // Оригинал не пуст?
 {// Оригинал не пуст
  Data=new TBase [Array.Count]; // Создаём массив
  if (Data) // Массив создан?
  {// Массив создан
   for (p1=Data+Array.Count-1, p2=Array.Data+Array.Count-1, Count=Array.Count; Start=Array.Start; p1>=Data; --p1, --p2) // Цикл: p1=указатель на последний элемент копии, p2=указатель на последний элемент оригинала, копируем число элементов, копируем индекс первого элемента и, пока p1 в копии (а p2 в оригинале) крутим цикл, каждый раз переводя оба указтеля на предыдущие элементы
   {// Тело цикла
    (*p1)=(*p2); // Копируем элемент
   }// Тело цикла
  }// Массив создан
  else
  {// Массив не создан
   Start=0; // Пустой массив
   Count=0;  // Пустой массив
  }// Массив не создан
 }// Оригинал не пуст
 else
 {// Оригинал пуст
  Data=NULL; // Пустой массив
  Start=0; // Пустой массив
  Count=0; // Пустой массив
 }// Оригинал пуст
 return *this; // Возвращаем копию
}
TBase &
TArray:: operator [] (uint32_t Index)
{
 return Data[Index-Start]; // На самом деле первый элемент - нулевой, второй - первый и так далее. Значит внутренний индекс любого элемента меньше на индекс первого. Вычисляем его и возвращаем ссылку на элемент
}
bool
TArray::ReSize (uint32_t Begin, uint32_t End)
{
 uint32_t Ssize;
 if (Data) // Массив уже не пуст?
 {// Массив уже не пуст
  delete [] Data; // Стираем нафиг все его элементы
 }// Массив уже не пуст
 if (End>=Begin) // Надо создать массив?
 {// Надо создать массив
  Size=End-Begin+1; // Вычисляем размер массива
  if (Size>0)// Размер массива не переполнен?
  {// Размер массива не переполнен
   Data=new TBase [Size]; // Создаём массив
   if (Data)// Массив создан?
   {// Массив созда
    Start=Begin; // Ставим индекс первого элемента
    Count=Size-1; // Ставим число элементов
   }// Массив создан
  }// Размер массива не переполнен
  else
  {// Размер массива переполнен
   Data=NULL; // Пустой массив
   Start=0; // Пустой массив
   Count=0; // Пустой массив
   return false; // Возвращаем флаг ошибки
  }// Размер массива переполнен
 }// Надо создать массив
 else
 {//Массив создавать не надо, так как он должен быть пуст
  Data=NULL; // Пустой массив
  Start=0; // Пустой массив
  Count=0; // Пустой массив
 }//Массив создавать не надо, так как он должен быть пуст
 return true; // Возвращаем флаг того, что размер массива успешно изменён
}
uint32_t
TArray::uint32t Number ()
{
 return Count;
}
uint32_t
TArray::First()
{
 return Start;
}
uint32_t
TArray::Last
{
 if (Count>0)// Массив существует?
 {// Массив существует
  return Start+Count-1; // Возвращаем индекс последнего элемента: внутренний индекс последнего элемента всегда на 1 меньше числа элементов, но внутренний индекс первого элемента - 0, значит внешние индексы всех элементов на внешний индекс первого больше
 }// Массив существует
 return 0; // Массива нет и возвращаем 0
}

.
Способ применения:

Код:
TArray <TBase> Array; // вместо TBase подставить имя действительного базового типа, а вместо Array - имя самого массива (уже объекта, а не типа)

.
Примеры:

Код:
TArray <int> iArray; // Массив iArrray элментов типа int
TArray <float> fArray; // Массив fArrray элментов типа float
TArray <double> dArray; // Массив dArrray элментов типа double
TArray <char> cArray; // Массив cArrray элментов типа char

0

4

Задача:
Дано:
массив.
Требуется: отсортировать этот массив по по возрастанию по пузырьковому алгоритму.
Решение:
template <TBase> class TArray // Шаблон класса
{
protected: // Защищённые члены
  TBase *Data; // Здесь будут храниться элменты
  uint32_t Start; // Индекс первого элемента
  uint32_t Count; // Количество элментов
public:
  TArray (); // Дефолтный конструктор
  TArray (TArray &Array); // Копирующий конструктор
  TArray operator = (TArray &Array); // Оператор присваивания
  TBase & operator [] (uint32_t Index); // Оператор индексации
  bool ReSize (uint32_t Begin, uint32_t End); // Задаём диапазон индексов
  uint32_t Number (); // Читаем число элементов
  uint32_t First(); // Читаем индекс первого элемента
  uint32_t Last; // Вычисляем индекс последнего элемента
  void Sort ();
};
TArray::TArray ()
{
Data=NULL; // Пустой массив
Start=0; // Пустой массив
Count=0; // Пустой массив
}
TArray::TArray (TArray &Array)
{
TBase *p1; // Указатель на элемент
TBase *p2; // Указатель на элемент
if (Array.Count!=0) // Оригинал не пуст?
{// Оригинал не пуст
  Data=new TBase [Array.Count]; // Создаём массив
  if (Data) // Массив создан?
  {// Массив создан
   for (p1=Data+Array.Count-1, p2=Array.Data+Array.Count-1, Count=Array.Count; Start=Array.Start; p1>=Data; --p1, --p2) // Цикл: p1=указатель на последний элемент копии, p2=указатель на последний элемент оригинала, копируем число элементов, копируем индекс первого элемента и, пока p1 в копии (а p2 в оригинале) крутим цикл, каждый раз переводя оба указтеля на предыдущие элементы
   {// Тело цикла
    (*p1)=(*p2); // Копируем элемент
   }// Тело цикла
  }// Массив создан
  else
  {// Массив не создан
   Start=0; // Пустой массив
   Count=0;  // Пустой массив
  }// Массив не создан
}// Оригинал не пуст
else
{// Оригинал пуст
  Data=NULL; // Пустой массив
  Start=0; // Пустой массив
  Count=0; // Пустой массив
}// Оригинал пуст
}
TArray
TArray::operator = (TArray &Array)
{
TBase *p1; // Указатель на элемент
TBase *p2; // Указатель на элемент
if (Array.Count!=0) // Оригинал не пуст?
{// Оригинал не пуст
  Data=new TBase [Array.Count]; // Создаём массив
  if (Data) // Массив создан?
  {// Массив создан
   for (p1=Data+Array.Count-1, p2=Array.Data+Array.Count-1, Count=Array.Count; Start=Array.Start; p1>=Data; --p1, --p2) // Цикл: p1=указатель на последний элемент копии, p2=указатель на последний элемент оригинала, копируем число элементов, копируем индекс первого элемента и, пока p1 в копии (а p2 в оригинале) крутим цикл, каждый раз переводя оба указтеля на предыдущие элементы
   {// Тело цикла
    (*p1)=(*p2); // Копируем элемент
   }// Тело цикла
  }// Массив создан
  else
  {// Массив не создан
   Start=0; // Пустой массив
   Count=0;  // Пустой массив
  }// Массив не создан
}// Оригинал не пуст
else
{// Оригинал пуст
  Data=NULL; // Пустой массив
  Start=0; // Пустой массив
  Count=0; // Пустой массив
}// Оригинал пуст
return *this; // Возвращаем копию
}
TBase &
TArray:: operator [] (uint32_t Index)
{
return Data[Index-Start]; // На самом деле первый элемент - нулевой, второй - первый и так далее. Значит внутренний индекс любого элемента меньше на индекс первого. Вычисляем его и возвращаем ссылку на элемент
}
bool
TArray::ReSize (uint32_t Begin, uint32_t End)
{
uint32_t Ssize;
if (Data) // Массив уже не пуст?
{// Массив уже не пуст
  delete [] Data; // Стираем нафиг все его элементы
}// Массив уже не пуст
if (End>=Begin) // Надо создать массив?
{// Надо создать массив
  Size=End-Begin+1; // Вычисляем размер массива
  if (Size>0)// Размер массива не переполнен?
  {// Размер массива не переполнен
   Data=new TBase [Size]; // Создаём массив
   if (Data)// Массив создан?
   {// Массив созда
    Start=Begin; // Ставим индекс первого элемента
    Count=Size-1; // Ставим число элементов
   }// Массив создан
  }// Размер массива не переполнен
  else
  {// Размер массива переполнен
   Data=NULL; // Пустой массив
   Start=0; // Пустой массив
   Count=0; // Пустой массив
   return false; // Возвращаем флаг ошибки
  }// Размер массива переполнен
}// Надо создать массив
else
{//Массив создавать не надо, так как он должен быть пуст
  Data=NULL; // Пустой массив
  Start=0; // Пустой массив
  Count=0; // Пустой массив
}//Массив создавать не надо, так как он должен быть пуст
return true; // Возвращаем флаг того, что размер массива успешно изменён
}
uint32_t
TArray::uint32t Number ()
{
return Count;
}
uint32_t
TArray::First()
{
return Start;
}
uint32_t
TArray::Last
{
if (Count>0)// Массив существует?
{// Массив существует
  return Start+Count-1; // Возвращаем индекс последнего элемента: внутренний индекс последнего элемента всегда на 1 меньше числа элементов, но внутренний индекс первого элемента - 0, значит внешние индексы всех элементов на внешний индекс первого больше
}// Массив существует
return 0; // Массива нет и возвращаем 0
}
void
TArray::Sort ()
{
TBase *temp;
TBase *p1;
TBase *p2;
if (Count>1)// Есть что вообще сортировать?
{// Есть что вообще сортировать
  for (p1=Data+Count-2; p1>Data; --p1) // Цикл перебора следующего элемента массива
  {// Тело цикла перебора следующего элемента массива
   for (p2=p1-1; p2>=Data; --p2) // Цикл перебора предыдущего элемента массива
   {// Тело цикла перебора предыдущего элемента массива
    if ((*p2)>(*p1))// Предыдущий элемент больше следующего?
    {// Предыдущий элемент больше следующего. Меняем их местами
     (*temp)=(*p1);
     (*p1)=(*p2);
     (*p2)=(*temp);
    }// Предыдущий элемент больше следующего. Меняем их местами
   }// Тело цикла перебора предыдущего элемента массива
  }// Тело цикла перебора следующего элемента массива
}// Есть что вообще сортировать
}

0


Вы здесь » CodeForum.anihub.ru » С++ » Коллекция решенных задач


Рейтинг форумов | Создать форум бесплатно