Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.90/20: Рейтинг темы: голосов - 20, средняя оценка - 4.90
21 / 2 / 0
Регистрация: 20.09.2018
Сообщений: 303
1

Обменять минимальный и максимальный элемент матрицы

09.12.2018, 13:23. Просмотров 3783. Ответов 19
Метки нет (Все метки)


Важно использовать процедуру ввода, вывода матрицы, поиска минимального, максимального элемента и их обмена. Все работает, кроме обмена.
Обменять минимальный и максимальный элемент матрицы

Помогите, пожалуйста, это исправить. Заранее огромное спасибо.
Мой код:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
uses
  System.SysUtils;
 
type
  matr = array[1..10, 1..15] of integer;
 
procedure Vvodmt(var a: matr; var n: integer);
var
  i, j: integer;
begin
  repeat
    write('Введите размерность от 2 до 10: ');
    readln(n);
  until n in [2..10];
  randomize;
  for i := 1 to n do
    for j := 1 to n do
      a[i, j] := -5 + random(100);{целые числа}
end;
 
procedure Vivodmt(a: matr; n: integer);
var
  i, j: integer;
begin
  for i := 1 to n do
  begin
    for j := 1 to n do
      write(a[i, j]:5);
    writeln;
  end;
end;
 
procedure PoiskMax(a: matr; n: integer; var max: integer);
var
  i, j: integer;
begin
  max := a[1, 1];
  for i:=1 to n do
  for j := 1 to n do
        begin
        if a[i, j] > max then
        max := a[i, j];
         end;
    end;
 
 
 procedure PoiskMin(a: matr; n: integer; var min: integer);
var
  i, j: integer;
begin
  min := a[1, 1];
  for i:=1 to n do
  for j := 1 to n do
        begin
        if a[i, j] < min then
          min := a[i, j];
         end;
    end;
 
  Procedure Obmen(a: matr; n: integer; var min, max, obm: integer);
  var
  i, j: integer;
begin
 obm:=min;
  max:=min;
 max:= obm;
    end;
 
 
 
var
  a: matr;
  n, i, j: integer;
  max, min, obm: integer;
 
begin
  Vvodmt(a, n);
  writeln('Исходная матрица:');
  Vivodmt(a, n);
  Poiskmax(a, n, max);
  writeln('Максимальный  элемент матрицы равен '  ,  max);
  PoiskMin(a, n, min);
   writeln('Минимальный  элемент матрицы равен '  ,  min);
 Obmen(a, n, min, max, obm);
 writeln('Матрица с обмененными максимальным и минимальным эдементом');
 Vivodmt(a, n);
  Readln;
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.12.2018, 13:23
Ответы с готовыми решениями:

Обменять строки матрицы, в которых находятся максимальный и минимальный элементы
Дана матрица, все элементы которой различны. Обменять строки, в которых находятся максимальный и...

Найти средний элемент, минимальный элемент и максимальный элемент матрицы
Здравствуйте,помогите решить задачу. Задана двумерная матрица размерностью 12x12 элементов...

Максимальный и минимальный элемент строк матрицы
Вот текст программы в нее нужно добавить функции определения строк в которых находится максимальный...

Минимальный элемент матрицы умножить на максимальный
Программа выполняет ввод вещественных элементов массива массива A(3,3)по строкам,контрольный вывод...

__________________
Помогаю в написании студенческих работ здесь.
19
Модератор
63219 / 46976 / 32377
Регистрация: 18.05.2008
Сообщений: 113,854
09.12.2018, 13:37 2
Лучший ответ Сообщение было отмечено catauggie как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
procedure PoiskMax(a: matr; n: integer; var imax,jmax: integer);
var  i, j: integer;
begin
max := a[1, 1];
imax:=1;
jmax:=1;
for i:=1 to n do
for j:=1 to n do
if a[i, ]>max then
 begin
  max := a[i, j];
  imx:=i;
  jmax:=j;
 end;
writeln('Максимальный элемент=',max,' его индексы [',imax,',',jmax,']' );
end;
procedure PoiskMin(a: matr; n: integer; var imin,jmin: integer);
var  i, j: integer;
begin
min := a[1, 1];
imin:=1;
jmin:=1;
for i:=1 to n do
for j:=1 to n do
if a[i,j] < min then
 begin
  min := a[i, j];
  imin:=i;
  jmin:=j;
 end;
writeln('Минимальный элемент=',min,' его индексы [',imin,',',jmin,']' );
end;
Procedure Obmen(var a: matr; n: integer; imin,jmin,imax,jmax: integer);
var i, j, obm: integer;
begin
obm:=a[imin,jmin];
a[imin,jmin]:=a[imax,jmax];
a[imax,jmax]:= obm;
end;
Вызов процедур сами поправите?
0
21 / 2 / 0
Регистрация: 20.09.2018
Сообщений: 303
09.12.2018, 14:20  [ТС] 3
Не нравятся ему параметры:
Обменять минимальный и максимальный элемент матрицы

Нужно ли в обмен класть индексы минимального и максимально элементов?
0
Модератор
63219 / 46976 / 32377
Регистрация: 18.05.2008
Сообщений: 113,854
09.12.2018, 14:24 4
Так поправьте фактические параметры при вызове процедур как объявлены формальные параметры, я же Вас и спросил
Цитата Сообщение от Puporev Посмотреть сообщение
Вызов процедур сами поправите?
0
21 / 2 / 0
Регистрация: 20.09.2018
Сообщений: 303
09.12.2018, 14:40  [ТС] 5
Нас просят выводить результат в основной программе, а не в процедурах.
Он выдает ошибку, что ему недостаточно параметров для obmen
Обменять минимальный и максимальный элемент матрицы
0
Модератор
63219 / 46976 / 32377
Регистрация: 18.05.2008
Сообщений: 113,854
09.12.2018, 14:48 6
Ну выложи сюда код, я скопирую, или мне все самому делать? Да не картинкой, а текстом.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
5698 / 3413 / 2430
Регистрация: 22.11.2013
Сообщений: 9,580
Записей в блоге: 1
09.12.2018, 14:52 7
Цитата Сообщение от catauggie Посмотреть сообщение
Он выдает ошибку, что ему недостаточно параметров для obmen
До шести можно сосчитать по пальцам, в чем проблема?

Добавлено через 3 минуты
Цитата Сообщение от catauggie Посмотреть сообщение
Нас просят выводить результат в основной программе, а не в процедурах.
Цитата Сообщение от catauggie Посмотреть сообщение
Важно использовать процедуру ввода, вывода матрицы
Пациент путается в показаниях?
0
Модератор
63219 / 46976 / 32377
Регистрация: 18.05.2008
Сообщений: 113,854
09.12.2018, 14:53 8
Он видимо про строки
Цитата Сообщение от Puporev Посмотреть сообщение
writeln('Минимальный элемент=',min,' его индексы [',imin,',',jmin,']' );
0
21 / 2 / 0
Регистрация: 20.09.2018
Сообщений: 303
09.12.2018, 14:59  [ТС] 9
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
type
  matr = array[1..10, 1..15] of integer;
 
procedure Vvodmt(var a: matr; var n: integer);
var
  i, j: integer;
begin
  repeat
    write('Введите размерность от 2 до 10: ');
    readln(n);
  until n in [2..10];
  randomize;
  for i := 1 to n do
    for j := 1 to n do
      a[i, j] := -5 + random(100);{целые числа}
end;
 
procedure Vivodmt(a: matr; n: integer);
var
  i, j: integer;
begin
  for i := 1 to n do
  begin
    for j := 1 to n do
      write(a[i, j]:5);
    writeln;
  end;
end;
 
procedure PoiskMax(a: matr; n: integer; var max, imax,jmax: integer);
var  i, j: integer;
begin
max := a[1, 1];
imax:=1;
jmax:=1;
for i:=1 to n do
for j:=1 to n do
if a[i, j]>max then
 begin
  max := a[i, j];
  imax:=i;
  jmax:=j;
 end;
end;
 
procedure PoiskMin(a: matr; n: integer; var min, imin,jmin: integer);
var  i, j: integer;
begin
min := a[1, 1];
imin:=1;
jmin:=1;
for i:=1 to n do
for j:=1 to n do
if a[i,j] < min then
 begin
  min := a[i, j];
  imin:=i;
  jmin:=j;
 end;
end;
 
Procedure Obmen(var a: matr; n: integer; imin,jmin,imax,jmax: integer);
var i, j, obm: integer;
begin
obm:=a[imin,jmin];
a[imin,jmin]:=a[imax,jmax];
a[imax,jmax]:= obm;
end;
 
 
 
var
  a: matr;
  n, i, j, imax, imin, jmax, jmin: integer;
  max, min, obm: integer;
 
begin
  Vvodmt(a, n);
  writeln('Исходная матрица:');
  Vivodmt(a, n);
  Poiskmax(a, n, max,imax,jmax);
writeln('Максимальный элемент=',max,' его индексы [',imax,',',jmax,']' );
  PoiskMin(a, n, min,imin,jmin);
writeln('Минимальный элемент=',min,' его индексы [',imin,',',jmin,']' );
 Obmen(a, n, min, max, obm);
 writeln('Матрица с обмененными максимальным и минимальным эдементом');
 Vivodmt(a, n);
  Readln;
end.
Добавлено через 1 минуту
да я про строки
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
5698 / 3413 / 2430
Регистрация: 22.11.2013
Сообщений: 9,580
Записей в блоге: 1
09.12.2018, 15:10 10
Можно было не перегружать лишними параметрами обмен:
Pascal
1
2
3
4
5
6
7
procedure Swp(var a, b: Integer);
var t: Integer;
begin
  t:=a; a:=b; b:=t;
end;
 
  Swp(a[imin,jmin],a[imax,jmax]);
Добавлено через 2 минуты
Можно не возвращать min и max, только индексы:
Pascal
1
2
WriteLn('Максимальный элемент=',a[imax,jmax],' его индексы [',imax,',',jmax,']');
WriteLn('Минимальный  элемент=',a[imin,jmin],' его индексы [',imin,',',jmin,']');
1
Модератор
63219 / 46976 / 32377
Регистрация: 18.05.2008
Сообщений: 113,854
09.12.2018, 15:14 11
Лучший ответ Сообщение было отмечено catauggie как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
type  matr = array[1..10, 1..10] of integer;
procedure Vvodmt(var a: matr; var n: integer);
var i, j: integer;
begin
repeat
write('Введите размерность от 2 до 10: ');
readln(n);
until n in [2..10];
randomize;
for i := 1 to n do
for j := 1 to n do
a[i, j] := -5 + random(100);{целые числа}
end;
 
procedure Vivodmt(a: matr; n: integer);
var i, j: integer;
begin
for i := 1 to n do
 begin
  for j := 1 to n do
  write(a[i, j]:4);
  writeln;
 end;
end;
 
procedure PoiskMax(a: matr; n: integer; var max, imax,jmax: integer);
var  i, j: integer;
begin
max := a[1, 1];
imax:=1;
jmax:=1;
for i:=1 to n do
for j:=1 to n do
if a[i, j]>max then
 begin
  max := a[i, j];
  imax:=i;
  jmax:=j;
 end;
end;
 
procedure PoiskMin(a: matr; n: integer; var min, imin,jmin: integer);
var  i, j: integer;
begin
min := a[1, 1];
imin:=1;
jmin:=1;
for i:=1 to n do
for j:=1 to n do
if a[i,j] < min then
 begin
  min := a[i, j];
  imin:=i;
  jmin:=j;
 end;
end;
 
Procedure Obmen(var a: matr; n: integer; imin,jmin,imax,jmax: integer);
var i, j, obm: integer;
begin
obm:=a[imin,jmin];
a[imin,jmin]:=a[imax,jmax];
a[imax,jmax]:= obm;
end;
 
var
  a: matr;
  n, i, j, min, imin,jmin,max,imax,jmax: integer;
begin
Vvodmt(a, n);
writeln('Исходная матрица:');
Vivodmt(a, n);
Poiskmax(a, n, max,imax,jmax);
writeln('Максимальный элемент=',max,' его индексы [',imax,',',jmax,']' );
PoiskMin(a, n, min,imin,jmin);
writeln('Минимальный элемент=',min,' его индексы [',imin,',',jmin,']' );
Obmen(a,n,imin,jmin,imax,jmax);
 writeln('Матрица с обмененными максимальным и минимальным эдементом');
Vivodmt(a, n);
Readln;
end.
1
Модератор
Эксперт Pascal/DelphiЭксперт NIX
5698 / 3413 / 2430
Регистрация: 22.11.2013
Сообщений: 9,580
Записей в блоге: 1
09.12.2018, 15:32 12
Лучший ответ Сообщение было отмечено catauggie как решение

Решение

Еще вариант поиска максимума/минимума:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
type LessFunc = function (a, b: Integer): Boolean;
 
procedure GetM(const a: TMatrix; m, n: Integer; var mi, mj: Integer; Less: LessFunc);
var i, j: Integer;
begin
  mi:=1; mj:=1;
  for i:=1 to m do for j:=1 to n do if Less(a[i,j],a[mi,mj]) then begin
    mi:=i; mj:=j;
  end;
end;
 
function Less(a, b: Integer): Boolean; far; begin Less:=a<b end;
function More(a, b: Integer): Boolean; far; begin More:=a>b end;
 
  
  GetM(a,m,n,iMin,jMin,Less); GetM(a,m,n,iMax,jMax,More);
  WriteLn('Максимальный элемент=',a[imax,jmax],' его индексы [',imax,',',jmax,']');
  WriteLn('Минимальный  элемент=',a[imin,jmin],' его индексы [',imin,',',jmin,']');
  Swp(a[imin,jmin],a[imax,jmax]);
Добавлено через 9 минут
В сухом остатке:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
const W=3;
type
  TMatrix = array [1..10,1..15] of Integer;
  LessFunc = function (a, b: Integer): Boolean;
 
function Less(a, b: Integer): Boolean; far; begin Less:=a<b end;
function More(a, b: Integer): Boolean; far; begin More:=a>b end;
 
procedure Swp(var a, b: Integer);
var t: Integer;
begin
  t:=a; a:=b; b:=t;
end;
 
procedure GetM(const a: TMatrix; m, n: Integer; var mi, mj: Integer; Less: LessFunc);
var i, j, mm: Integer;
begin
  mi:=1; mj:=1; mm:=a[1,1];
  for i:=1 to m do for j:=1 to n do if Less(a[i,j],mm) then begin
    mi:=i; mj:=j; mm:=a[i,j];
  end;
end;
 
procedure mGen(var a: TMatrix; var m, n: Integer);
var i, j: Integer;
begin
  repeat Write('m [1..',High(a),'] n [1..',High(a[Low(a)]),']: '); Read(m,n);
  until (m in [1..High(a)]) and (n in [1..High(a[Low(a)])]);
  for i:=1 to m do for j:=1 to n do a[i,j]:=-5+Random(100);
end;
 
procedure mWrite(const a: TMatrix; m, n: Integer; const p: String);
var i, j: Integer;
begin
  if p<>'' then WriteLn(p);
  for i:=1 to m do begin for j:=1 to n do Write(' ',a[i,j]:W); WriteLn; end;
end;
 
var
  a: TMatrix;
  m, n, iMin, jMin, iMax, jMax: Integer;
begin
  Randomize;
  mGen(a,m,n); mWrite(a,m,n,'A =');
  GetM(a,m,n,iMin,jMin,Less); GetM(a,m,n,iMax,jMax,More);
  WriteLn('Min = ',a[iMin,jMin],' его индексы [',iMin,',',jMin,']');
  WriteLn('Max = ',a[iMax,jMax],' его индексы [',iMax,',',jMax,']');
  Swp(a[iMin,jMin],a[iMax,jMax]); mWrite(a,m,n,'A''=');
end.
1
21 / 2 / 0
Регистрация: 20.09.2018
Сообщений: 303
10.12.2018, 17:36  [ТС] 13
Puporev, Скажите, а как написать процедуру обмена минимального и максимального элемента матрицы для каждой строки?
0
Модератор
63219 / 46976 / 32377
Регистрация: 18.05.2008
Сообщений: 113,854
10.12.2018, 17:44 14
Да можно по разному, смотря какое точное условие задачи.
0
21 / 2 / 0
Регистрация: 20.09.2018
Сообщений: 303
10.12.2018, 18:21  [ТС] 15
То составить функцию поиска максимального/минимального элемента каждой строки, а потом их обменять местами. То есть ввели, например,
1 2 3 4
5 6 9 0
3 8 4 1
А получили
4 2 3 1
5 6 0 9
3 1 4 8
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
5698 / 3413 / 2430
Регистрация: 22.11.2013
Сообщений: 9,580
Записей в блоге: 1
10.12.2018, 18:36 16
Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

Можно, например, так (в том же стиле, что и выше; недостающее -- там же):
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
type PInteger = ^Integer;
 
function vGetM(v: array of Integer; n: Integer; Less: LessFunc): PInteger;
var r: Integer;
begin
  r:=0; for n:=1 to n-1 do if Less(v[n],v[r]) then r:=n; vGetM:=@v[r];
end;
 
var
  a: TMatrix;
  m, n, i: Integer;
begin
  Randomize;
  mGen(a,m,n);
  mWrite(a,m,n,'A =');
  for i:=1 to m do Swp(vGetM(a[i],Less)^,vGetM(a[i],More)^);
  mWrite(a,m,n,'A''=');
end.
Добавлено через 2 минуты
или так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function vGetM(v: array of Integer; n: Integer; Less: LessFunc): Integer;
var r: Integer;
begin
  r:=0; for n:=1 to n-1 do if Less(v[n],v[r]) then r:=n; vGetM:=r;
end;
 
var
  a: TMatrix;
  m, n, i: Integer;
begin
  Randomize;
  mGen(a,m,n);
  mWrite(a,m,n,'A =');
  for i:=1 to m do Swp(a[i,vGetM(a[i],n,Less)+Low(a[i])],a[i,vGetM(a[i],n,More)+Low(a[i])]);
  mWrite(a,m,n,'A''=');
end.
1
21 / 2 / 0
Регистрация: 20.09.2018
Сообщений: 303
11.12.2018, 09:03  [ТС] 17
Спасибо огромное за помощь! Даже не знаю, чтобы я без вас делал...

Добавлено через 8 минут
Я правильно понял, что в
Цитата Сообщение от bormant Посмотреть сообщение
type PInteger = ^Integer; function vGetM(v: array of Integer; n: Integer; Less: LessFunc): PInteger; var r: Integer; begin r:=0; for n:=1 to n-1 do if Less(v[n],v[r]) then r:=n; vGetM:=@v[r]; end; var a: TMatrix; m, n, i: Integer; begin Randomize; mGen(a,m,n); mWrite(a,m,n,'A ='); for i:=1 to m do Swp(vGetM(a[i],Less)^,vGetM(a[i],More)^); mWrite(a,m,n,'A''='); end.
вы использовали mGen и mWrite в качестве процедуры ввода\вывода матрицы?
И еще хотел уточнить что такое LessFunc?
P.S. Посмотрел в теме выше, что такое lessfunc. Спасибо За помощь.
P.P.S. Все посмотрел и понял. Да, у вас логично написан код.
0
21 / 2 / 0
Регистрация: 20.09.2018
Сообщений: 303
11.12.2018, 09:17  [ТС] 18
Выдает ошибку
Обменять минимальный и максимальный элемент матрицы

Не пойму, что не так...
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
5698 / 3413 / 2430
Регистрация: 22.11.2013
Сообщений: 9,580
Записей в блоге: 1
11.12.2018, 10:26 19
Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

1) Во втором вызове GetM пропущена n, перед More.
2) Определена GetM(...): Integer, а использование от GetM(...): PInteger.
Первая возвращает смещение от начала (или индекс считая от 0), поэтому используется как индекс в массиве
Pascal
1
2
3
4
5
function vGetM(v: array of Integer; n: Integer; Less: LessFunc): Integer;
 
Swp(
  a[i, vGetM(a[i],n,Less)+Low(a[i]) ],
  a[i, vGetM(a[i],n,More)+Low(a[i]) ]);
Вторая возвращает указатель на элемент, поэтому и используется как указатель на Integer
Pascal
1
2
3
4
5
function vGetM(v: array of Integer; n: Integer; Less: LessFunc): PInteger;
 
Swp(
  vGetM(a[i],n,Less)^,
  vGetM(a[i],n,More)^);
Добавлено через 2 минуты
Рекомендую перечитать правила форума и перестать постить скриншоты кода.
Этот был последним, где что-либо разглядывал.

Добавлено через 50 минут
Цитата Сообщение от catauggie Посмотреть сообщение
логично написан код
Иногда цена подобной логики может быть высока -- здесь на каждое сравнение вызывается функция по указателю.
Если участок кода критичный по производительности, например, вызывается многократно в цикле с очень широкими диапазонами, а компилятор (точнее, его оптимизатор) не умеет выполнять подстановку тела функции, то вариант без LessFunc скорее всего оказался бы более предпочтителен.
1
21 / 2 / 0
Регистрация: 20.09.2018
Сообщений: 303
11.12.2018, 12:26  [ТС] 20
Спасибо еще раз за помощь и подробные обь'яснения.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.12.2018, 12:26

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Определить максимальный и минимальный элемент матрицы
9. Дана матрица целых чисел размером 5x3. Определить максимальный и минимальный элемент...

Найти максимальный и минимальный элементы последовательности и обменять их местами
Числовая последователъность формируется по правилу: Uо=cos(x) U1=cos(x+h) U2=cos(x+2h) ...

Найти и поменять максимальный и минимальный элемент матрицы

Найти максимальный и минимальный элементы последовательности, после чего обменять их местами
Числовая последователъность формируется по правилу: Uо=cos(x) U1=cos(x+h) U2=cos(x+2h)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.