Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Новички в программировании > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Excel VBA, CAD, Софт, ОС, Windows, Ubuntu, Android, VPS
Win Api, Assembler, C++, Java, Pascal, Lazarus, Delphi, OpenGL, DirectX
C#, Qt, .NET, ASP.NET, Windows Forms, ADO.NET, Framework, WPF, UWP, WinRT, XAML
HTML, CSS, JavaScript, Ajax, PHP, Perl, Python, Ruby, SQL, WordPress, API, XML, JSON, ActionScript, Flash

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Название темы включает слова - "Помогите", "Спасите", "Срочно"
Название темы не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте >>>правила <<< и заново правильно создайте тему.
 
Опции темы
Старый 12.11.2009, 20:25   #1
Alex Cones
Trust no one.
Профессионал
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Адрес: In the middle of nowhere.
Сообщений: 6,529
Репутация: 1426
По умолчанию Типичные задачи и примеры. Теория.

ИМХО всем уже надоели одни и те же вопросы по матрицам. Посылаешь их в поиск, посылаешь, а они все пишут и пишут и пишут...
P.S. Если тема нужная - прикрепите, пожалуйста.
------------------------------------------------------------
Определение матрицы:
Матрица - это множество чисел, сгруппированных в столбцы и строки.

Пример матрицы:
Код:

5,4,5,4,3
2,3,4,5,6
1,9,6,4,3

Данная матрица имеет 3 строки и 5 столбцов.

Главная диагональ:
Главная диагональ имеется только у квадратных матриц и координаты точек главной диагонали задаются следующей формулой:
Код:

A[N,N], где N - число от 1 до максимального значения в данной матрице

Где она расположена:
Код:

1,0,0,0,0
0,1,0,0,0
0,0,1,0,0
0,0,0,1,0
0,0,0,0,1

(Единицы - элементы главной диагонали)

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

A[N,MAX-N+1], где N-число от 1 до максимального значения в данной матрице; MAX - размерность матрицы

Пример побочной диагонали:
Код:

0,0,0,0,1
0,0,0,1,0
0,0,1,0,0
0,1,0,0,0
1,0,0,0,0

Как определить, находится ли элемент ниже\на\выше главной диагонали:
Для этого мы воспользуемся формулой главной диагонали - A[N,N].
Код HTML:
Если X>Y Тогда элемент выше главной диагонали.
Если X=Y Тогда элемент на главной диагонали.
Eckb X<Y Тогда элемент ниже главной диагонали.
Аналогично для побочной диагонали, только условие изменяется согласно формуле главной диагонали:
Код HTML:
Если X>Y-MAX+1 Тогда выше
Если X=Y-MAX+1 Тогда на
Если X<Y-MAX+1 Тогда ниже
Как поменять местами два элемента диагонали:
Для этого воспользуемся старым как мир способом ПРОМЕЖУТОЧНОЙ ПЕРЕМЕННОЙ (ПП):
Обозначения:
A - первый перемещаемый элемент,
B - второй перемещаемый элемент,
PP - промежуточная переменная.
Код:

PP = A
A = B
B = PP

Пример программы на паскале:
Код:

Program moving;
Var
 Matrix:Array[1..3,1..3] of byte = (2,2,2,3,3,3,1,1,1);
 PP:Byte;
 X,Y:Byte;
Begin
 Writeln('До');
 For Y:=1 to 3 do
  Begin 
    For X:=1 to 3 do
     Write(Matrix[X,Y],' ');
    Writeln;
  End;
 PP := Matrix[3,3];
 Matrix[3,3] := Matrix[1,1];
 Matrix[1,1] := PP;
 Writeln('После');
  For Y:=1 to 3 do
  Begin 
    For X:=1 to 3 do
     Write(Matrix[X,Y],' ');
    Writeln;
  End;
  ReadLn;
End.

Максимальный элемент:
Максимальный элемент матрицы - это ячейка матрицы, имеющая максимальное значение. Максимальных элементов может быть несколько.
Пример:
Код:

2,3
9,1

Здесь 9 - Максимальный элемент матрицы.

Как найти максимальный элемент:
Для этого необходимо использовать метод пузырька (другое название - метод коробочки). В чем он заключается? Проще простого:
Код:

1. Берем первый элемент и кладем его в коробку.
2.Берем следующий элемент и если он больше того, что лежит в коробке - опустошаем коробку и положим туда данный элемент.
3. Идите на шаг 2, пока не закончатся элементы.
4. В коробке - максимальный элемент.

__________________
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума  
Старый 12.11.2009, 20:25   #2
Alex Cones
Trust no one.
Профессионал
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Адрес: In the middle of nowhere.
Сообщений: 6,529
Репутация: 1426
По умолчанию

Минимальный элемент ищется аналогично, только условие стоит наоборот: в коробку кладется наименьший элемент.

Реализация на паскале:
Код:

Program maximum;
Var
 Matrix:Array[1..3,1..3] of byte = (2,2,2,3,3,3,1,1,1);
 PP:Byte;
 X,Y:Byte;
Begin
 Writeln('До');
 For Y:=1 to 3 do
  Begin 
    For X:=1 to 3 do
     Write(Matrix[X,Y],' ');
    Writeln;
  End;
 PP := Matrix[1,1];
 For Y:=1 to 3 do
  For X:=1 to 3 do
   if Matrix[X,Y] > PP Then PP := Matrix[X,Y];
 Writeln('Mаксимум - ', PP);
  ReadLn;
End;

Поменять местами минимальный и максимальный элементы:
Аналогично примеру ищем максимальный и минимальный элементы и меняем их местами:
Код:

Program ReplaceMinAndMax;
Var
 Matrix:Array[1..3,1..3] of Byte = (1,2,3,4,5,6,7,8,9);
 PP:Byte;
 Max,Min:Byte;
 XMin,YMin,XMax,Ymax:Byte;
 X,Y:Byte;
Begin
 XMin := 1;
 YMax := 1;
 XMax := 1;
 YMax := 1;
 Max := Matrix[1,1];
 Min := Matrix[1,1];
 For Y := 1 to 3 do
  For X := 1 to 3 do
   Begin
    If Matrix[X,Y] > Max Then  Begin Max := Matrix[X,Y]; XMax := X; YMax := Y; End;
    If Matrix[X,Y] < Max Then Begin Min := Matrix[X,Y]; XMin := X; YMin := Y; End;
   End;
 PP := Matrix[XMax,YMax];
 Matrix[XMax,YMax] := Matrix[Xmin,YMin];
 Matrix[XMin,YMin] := PP;
End.

P.S. Эту задач можно решить не используя переменные Max и Min. Подумайте, как.

Как поменять местами строки:
Одно из распространенных заданий, но решается оно до банальности просто:
Код:

For X := 1 to MatrixXSize do
Begin
 PP := Matrix[X,Y1];
 Matrix[X,Y1] := Matrix[X,Y2];
 Matrix[X,Y2] := PP;
End;

Комбинируя вышеприведенные примеры можно решить любую задачу, по теме матрицы.

P.S. Если я что-то упустил - напомните, пожалуйста.
P.P.S. Если кто-то переведет вышеприведенные примеры на другие языки - статья обретет большую внутрифорумную репутацию.
P.P.P.S. 2Студенты! В этой теме постить задания НЕ НАДО!
P.P.P.P.S. (c) Копирайт Alex Cones 2009.
__________________
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 12.11.2009 в 20:27.
Alex Cones вне форума  
Старый 13.11.2009, 08:58   #3
kaa1977
Пользователь
 
Регистрация: 13.05.2009
Сообщений: 39
Репутация: 10
По умолчанию

а существуют ли в Delphi уже созданные функции (или целые библиотеки функций) для работы с матрицами?

Например, расчёт определителя, сложение матриц и так далее...

Понятно, что можно взять справочник по математике (того же Бронштейна), там всё расписано, и всё это сделать, но неужели нет уже сделанных функций
kaa1977 вне форума  
Старый 13.11.2009, 10:15   #4
Stilet
Белик Виталий :)
Профессионал
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Адрес: Украина, Донецкая область, г. Краматорск
Сообщений: 57,968
Репутация: 6787
По умолчанию

Ну я знач малость покритикую старавши довести автора до кондиции
Цитата:
Как поменять местами два элемента диагонали:
Код конечно красивый, но есть пара но:
Дело в том что паскль не очень то любит если в разделе Var идет присваивание. Это раз
Второе - обьявлен двумерный массив Array[1..3,1..3], а присваивается как линейный - = (2,2,2,3,3,3,1,1,1);
Некузяво... Может какая-то школьная версия паскаля такое и прохавает, но...

Посему решил предложить свой вариант - А заодно соригинальничать:
Код:

Const
 Matrix:Array[1..3,1..3] of byte = ((2,2,2),(3,3,3),(1,1,1));
var
 PP:Byte;
 X,Y:Byte;
Begin
 Writeln('После');
 For Y:=1 to 3 do
  Begin
    For X:=1 to 3 do
     if (x*y) in [1,9] then
      Write(Matrix[3-X+1,3-Y+1],' ')
     else
      Write(Matrix[X,Y],' ');
    Writeln;
  End;
  ReadLn;
End.

Этак нам ничего менять в массиве не нужно, просто выведем мы при определенных условиях из противоположных координат.
Кста, тот метод инвертирования координат достаточно эффективен при огромных массивах.
Надеюсь понятно что нужно и в остальных примерах слегка поправить описание массива.
__________________
I'm learning to live...

Последний раз редактировалось Stilet; 13.11.2009 в 10:18.
Stilet вне форума  
Старый 26.12.2009, 00:56   #5
psycho-coder
Профессионал
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
Репутация: 343
По умолчанию

Дополню примеры на языках Си и Си++

Как поменять местами два элемента диагонали:
Пример на Си
Код:

#include <stdio.h>
#define SIZE 3
int main()
{
	int matrix[SIZE][SIZE] = { {2, 2, 2}, 
       			        		  {3, 3, 3}, 
						  {1, 1, 1}};
	int PP = 0;
	int X, Y;
	puts("До");
	for (Y = 0; Y < SIZE; Y++)
	{
		for (X = 0; X < SIZE; X++)
			printf("%d ", matrix[X][Y]);
		puts("");
	}
	PP = matrix[2][2];
	matrix[2][2] = matrix[0][0];
	matrix[0][0] = PP;
	puts("После");
	for (Y = 0; Y < SIZE; Y++)
	{
		for (X = 0; X < SIZE; X++)
			printf("%d ", matrix[X][Y]);
		puts("");
	}
	getchar();
	return 0;
}

Пример на Си++
Код:

#include <iostream>
const int SIZE = 3;
using namespace std;
int main()
{
	int matrix[SIZE][SIZE] = {{2, 2, 2}, 
						{3, 3, 3}, 
						{1, 1, 1}};
	int PP = 0;
	int X, Y;
	cout << "До" << endl;
	for (Y = 0; Y < SIZE; Y++)
	{
		for (X = 0; X < SIZE; X++)
			cout << matrix[X][Y] << " ";
		cout << endl;
	}
	PP = matrix[2][2];
	matrix[2][2] = matrix[0][0];
	matrix[0][0] = PP;
	cout << "После" << endl;
	for (Y = 0; Y < SIZE; Y++)
	{
		for (X = 0; X < SIZE; X++)
			cout << matrix[X][Y] << " ";
		cout << endl;
	}
	cin.get();
	return 0;
}

Поиск максимального элемента:
Пример на Си
Код:

int main()
{
	int matrix[SIZE][SIZE] = {{2, 2, 2}, 
						{3, 3, 3}, 
						{1, 1, 1}};
	int PP = 0;
	int X, Y;
	for (Y = 0; Y < SIZE; Y++)
	{
		for (X = 0; X < SIZE; X++)
			printf("%d ", matrix[X][Y]);
		puts("");
	}
	PP = matrix[0][0];
	for (Y = 0; Y < SIZE; Y++)
		for (X = 0; X < SIZE; X++)
			if (matrix[X][Y] > PP) PP = matrix[X][Y];
	printf("Maximum - %d", PP);
	getchar();
	return 0;
}

Пример на Си++
Код:

int main()
{
	int matrix[SIZE][SIZE] = {{2, 2, 2}, 
						{3, 3, 3}, 
						{1, 1, 1}};
	int PP = 0;
	int X, Y;
	for (Y = 0; Y < SIZE; Y++)
	{
		for (X = 0; X < SIZE; X++)
			cout << matrix[X][Y] << " ";
		cout << endl;
	}
	PP = matrix[0][0];
	for (Y = 0; Y < SIZE; Y++)
		for (X = 0; X < SIZE; X++)
			if (matrix[X][Y] > PP) PP = matrix[X][Y];
	cout << "Maximum - " << PP << endl;
	cin.get();
	return 0;
}

Поменять местами минимальный и максимальный элементы:
Для конкретного языка подключить соответствующие библиотеки и вместо комментария "//Вывод" выбрать соответствующий способ
Код:

int main()
{
	int matrix[SIZE][SIZE] = {{2, 2, 2}, 
					        {3, 3, 3}, 
						{1, 1, 1}};
	int PP = 0;
	int X, Y;
	int Max, Min;
	int XMin, YMin, XMax, YMax;
	Max = Min = XMax = YMax = XMin = YMin = 1;
	for (Y = 0; Y < SIZE; Y++)
		for (X = 0; X < SIZE; X++)
		{
			if (matrix[X][Y] > Max) {Max = matrix[X][Y]; XMax = X; YMax = Y;}
			if (matrix[X][Y] < Max) {Min = matrix[X][Y]; XMin = X; YMin = Y;}
		}
	PP = matrix[XMax][YMax];
	matrix[XMax][YMax] = matrix[XMin][YMin];
	matrix[XMin][YMin] = PP;
       // Вывод
	return 0;
}


Как поменять местами строки:

Код:

for (X = 0; X < MatrixSize; X++)
{
	PP = matrix[X][Y1];
	matrix[X][Y1] = matrix[X][Y2];
	matrix[X][Y2] = PP;
}

P.S. В принципе различие в объявлении константы SIZE и способе вывода, а так все одинаково
P.P.S. (с) Копирайт psycho-coder 2009.
Модераторам: Может тему прикрепить?

Последний раз редактировалось psycho-coder; 26.12.2009 в 01:13.
psycho-coder вне форума  
Старый 19.01.2010, 22:20   #6
pacing
Новичок
 
Регистрация: 19.01.2010
Сообщений: 2
Репутация: 10
По умолчанию

А как найти умножения не парных елементов квадратной матрици више главной диагонали???
pacing вне форума  
Старый 19.01.2010, 23:01   #7
Базиля
Профессионал
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Адрес: СПб
Сообщений: 1,013
Репутация: 327
По умолчанию

pacing
из приведенных выше примерах, можно догадаться как, вам все разжевали что и как
Цитата:
Главная диагональ:
Главная диагональ имеется только у квадратных матриц и координаты точек главной диагонали задаются следующей формулой:
Код:

A[N,N], где N - число от 1 до максимального значения в данной матрице

Где она расположена:
Код:

1,0,0,0,0
0,1,0,0,0
0,0,1,0,0
0,0,0,1,0
0,0,0,0,1

(Единицы - элементы главной диагонали)
Вот посмотрите какие элементы здесь находятся выше главной диагонали, вот их произведение вам и нужно найти(не парных это скорей всего которые не стоят друг с другом)

Последний раз редактировалось Базиля; 19.01.2010 в 23:14.
Базиля вне форума  
Старый 19.01.2010, 23:37   #8
golodnyy
Новичок
 
Регистрация: 19.01.2010
Сообщений: 1
Репутация: 10
По умолчанию Произведение матриц

Подскажите алгоритм перемножения матриц A[n,n] и В [n,n].
golodnyy вне форума  
Старый 20.01.2010, 02:38   #9
DomiNick
Студент, не
Профессионал
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Адрес: Россия-Матушка, ул.«Эльфов 80-го уровня», спросить "сáмого Эльфа"...
Сообщений: 2,067
Репутация: 440
Лампочка

Цитата:
Подскажите алгоритм перемножения матриц A[n,n] и В [n,n].
Каждый элемент матрицы C (C=A*B) равен сумме произведений элементов i-й строки матрицы A на соответсвующие элементы j-го столбца матрицы B: Cij=Сумм(Aik*Bkj), где k=1,n

A(nxm)*B(mxr)=C(nxr)

Умножение матриц не подчиняется коммутативному закону - то есть A*B не равно B*A...

Добавлено от модератора: перемножение матриц (A x B) определено только в том случае, если количество столбцов матрицы A совпадает с количеством строк матрицы B. Если такое соотношение не выполняется, то произведение не существует/не определено. Поэтому формулировка A*B <> (не равно) B*A - некорректна. Сравнивать можно только однородные объекты - если произведение матриц B*A неопределено, то оно не является матрицей, оно вообще ничем не является.
__________________
I am the First of Cyber Evolution...
I am the First to Program your Future...

Последний раз редактировалось Вадим Мошев; 03.01.2016 в 22:33.
DomiNick вне форума  
Старый 12.03.2010, 17:19   #10
RUSt88
Профессионал
 
Регистрация: 29.12.2009
Адрес: Cара
Сообщений: 1,166
Репутация: 66
По умолчанию

как-то писал под заказ решение СЛАУ, выкладываю часть исходников
примеры работы с матрицами на C#, нахождение определителя матрицы любой размерности, транспонирование матрицы, умножение матриц между собой и на число, сложение матриц, решение СЛАУ методом Крамера, диагональные матрицы, с помощью этих реализаций решить СЛАУ можно будет практически любым способом

Код:

class Matrix 
{
    readonly int Rx; //кол-во строк матрицы
    readonly int Ry; // кол-во столбцов
    public int GetHeight() { return Rx; } // через этот метод получаем кол-во строк матрицы
    public int GetWidth() { return Ry; }
    public double[,] Matr; //массив, где хранятся значения элементов матрицы
    public Matrix(int R, int C) 
    {
        Rx = R;
        Ry = C;
        Matr = new double[Rx, Ry];
    }
    public Matrix DiagonalMatrix(double d) //диагональная матрица с коэффициентом d по диагонали
    {
        Matrix A = new Matrix(Ry, Ry);
        A = A.NullMatrix();
        for (int i = 0; i < A.Rx; i++) { A.Matr[i, i] = d; } //заполняем диагональ
        return A;
    }
    public Matrix TransMatrix() // транспонированная матрица
    {
        Matrix A = new Matrix(Ry, Rx);
        for (int i = 0; i < A.Rx; i++) { for (int j = 0; j < A.Ry; j++) { A.Matr[i, j] = Matr[j, i]; } }
        return A;
    }
    public double det() // определитель матрицы
    {
        Matrix A = new Matrix(Rx, Ry);
        for (int i = 0; i < A.Rx; i++) { for (int j = 0; j < A.Ry; j++) { A.Matr[i, j] = Matr[i, j]; } }
        double temp = 0;
        int N = A.Rx - 1;
        int h = 1; int v = N;
        double c = 0;
        for (int i = 0; i < A.GetHeight(); i++)
        {
            if (A.Matr[i, i] == 0)
            {
                for (int j = 0; j < A.Ry; j++)
                {
                    c = A.Matr[i + 1, j];
                    A.Matr[i + 1, j] = A.Matr[i, j];
                    A.Matr[i, j] = c;
                }
            }
        }
        if (A.Rx != A.Ry) { return 0; }
        else
        {
            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < v; j++)
                {
                    temp = A.Matr[j + h, i] / A.Matr[i, i];                        
                    for (int k = 0; k < A.Ry; k++) { A.Matr[j + h, k] = A.Matr[j + h, k] - A.Matr[i, k] * temp; } 
                }
                h++;
                v--;
            }
            temp = A.Matr[0, 0];
            for (int i = 1; i < A.Rx; i++) { temp *= A.Matr[i, i]; }
            return temp;
        }
    }
    public static Matrix operator *(Matrix M1, Matrix M2) // перегрузка оператора, т.е. можно умножать матрицы между собой
    {
        Matrix A = new Matrix(M1.Rx, M2.Ry);
        for (int i = 0; i < M1.Rx; i++)
        {
            for (int j = 0; j < M2.Ry; j++)
            {
                for (int k = 0; k < M1.Ry; k++) { A.Matr[i, j] += M1.Matr[i, k] * M2.Matr[k, j]; }
            }
        }
        return A;
    }
    public static Matrix operator *(double N, Matrix M) // умножение числа на матрицу
    {
        Matrix A = new Matrix(M.Rx, M.Ry);
        for (int i = 0; i < M.Rx; i++) { for (int j = 0; j < M.Ry; j++) { A.Matr[i, j] = M.Matr[i, j] * N; } }
        return A;
    }
    public static Matrix operator +(Matrix M1, Matrix M2) // сложение матриц
    {
        Matrix A = new Matrix(M1.Rx, M2.Ry);
        for (int i = 0; i < M1.Rx; i++) { for (int j = 0; j < M1.Ry; j++) { A.Matr[i, j] = M1.Matr[i, j] + M2.Matr[i, j]; } }
        return A;
    }
    public static Matrix operator /(Matrix M1, Matrix M2) // решение СЛАУ методом Крамера
    {
        Matrix A = new Matrix(M2.Rx, M2.Ry);
        Matrix D = new Matrix(M1.Rx, M1.Ry);
        Matrix V = new Matrix(M2.Rx, M2.Ry);
        for (int i = 0; i < M1.Rx; i++) { for (int j = 0; j < M1.Ry; j++) { D.Matr[i, j] = M1.Matr[i, j]; } }
        double temp = M1.det();
        double fg = 0;
        for (int i = 0; i < M1.Ry; i++)
        {
            for (int j = 0; j < M1.Rx; j++)
            {
                V.Matr[j, 0] = D.Matr[j, i];
                D.Matr[j, i] = M2.Matr[j, 0];
            }
            fg = D.det();
            A.Matr[i, 0] = fg / temp;
            for (int j = 0; j < M1.Rx; j++) { D.Matr[j, i] = V.Matr[j, 0]; }
        }
        return A;
    }
}

__________________
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]

Последний раз редактировалось RUSt88; 12.03.2010 в 17:26.
RUSt88 вне форума  
Закрытая тема



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Теория вероятности. Решить 2 задачи Worldqwerty Помощь студентам 2 14.01.2013 14:52
Типичные задачи на С++ Heming Помощь студентам 3 15.10.2012 11:13
Теория языков программирования и проектирование компиляторов (задачи) Onni Помощь студентам 0 03.06.2012 21:18
Теория информации + теория её передачи. vedro-compota Общие вопросы по программированию, компьютерным наукам 4 23.10.2010 10:06
решение инженерных задач современными средствами компьютерной техники и типичные задачи автоматизированны Дініс Свободное общение 1 12.09.2009 00:02




04:49.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Покупайте на сайте www.skinon.ru уникальные чехлы и наклейки для телефонов.
купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru