Консультация № 180851
18.11.2010, 22:12
52.36 руб.
0 2 1
Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:
Задача нужна на языке Си. Среда разработки-Dev-C++.Прокомментируйте пожалуйста каждую строку.
Задача:
Коэффициенты системы линейных уравнений заданы в виде прямоугольной матрицы. С помощью допустимых преобразований привести систему к треугольному виду. Найти количество строк, среднее арифметическое элементов которых меньше заданной величины.
Спасибо!

Обсуждение

давно
Профессионал
848
1596
19.11.2010, 10:13
общий
http://www.cyberforum.ru/cpp-beginners/thread108853.html
Неизвестный
23.11.2010, 01:50
общий
это ответ
Здравствуйте, Olgaa!
Смотрите пример реализации в приложении. Основано на этой ссылке.
Цитата: форум
Преобразование матрицы к треугольному виду (для квадратной) или к трапециевидному (для прямоугольной) производится с помощью прямого хода метода Гаусса. Пусть применяется метод Гаусса без выбора ведущего элемента.
Алгоритм такой.
На i-том шаге непреобразованный столбец матрицы A - это часть столбца i, начиная с элемента a[i][i] (т.е. начиная с элемента главной диагонали для квадратной матрицы). Если a[i][i] равен нулю, то нужно перестановкой строк добиться того, чтобы первый элемент непреобразованного столбца не равнялся нулю. Если все элементы непреобразованного столбца равны нулю, то переходим к следующему столбцу, в противном случае обнуляем остальные элементы непреобразованного столбца (делим строку, которая содержит a[i][i] на a[i][i], умножаем на элемент, который хотим обнулить, и отнимаем эту строку от строки, которая содержит элемент, который хотим обнулить).

Добавила подсчёт искомых строк, поверила в Вашем компиляторе.
Будут вопросы, пишите.
Удачи!

Приложение:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
const int isize=4;
const int jsize=4;
//Матрица системы
double A[4][4] = {
{6.1, 6.2, -6.3, 6.4},
{1.1, -1.5, 2.2, -3.8},
{5.1, -5, 4.9, -4.8},
{1.8, 1.9, 2, -2.1}};

//Число перестановок строк
int rCnt=0;
//Ведущий элемент
double ldn;
//Номер ведущего элемента
int index;
int i, j, k;
double temp;

//Прямой ход
for(j=0; j<jsize; ++j)
{
//Выбор ведущего элемента столбца
ldn=A[j][j];
index=j;
for(i=j; i<isize; ++i)
if(fabs(A[i][j])>fabs(ldn))
{
ldn=A[i][j];
index=i;
}
//Если ведущий элемент равен нулю
if(!ldn)
return 0;//Выход

//Если ведущий элемент - не на гл. диагонали
//меняем строки местами
if(index!=j)
{
++rCnt;
for(i=0; i<isize; ++i)
{
temp=A[j][i];
A[j][i]=A[index][i];
A[index][i]=temp;
}
}

for (i = 0; i<jsize; i++)
A[j][i] = A[j][i]/ldn; //делим строку на ведущий элемент

//Обнуление элементов ниже гл. диагонали
for(i=j+1; i<isize; ++i)
{
for(k=0; k<jsize; ++k) //fabs для того, чтобы не вылезало -0 из-за точности типа double
A[i][k]= fabs (A[i][k]-A[j][k]*A[i][k]);
}
}

printf ("Output matrix:\n"); //контрольный вывод после преобразования
for (i = 0; i<isize; i++) {
for (j=0; j<jsize; j++)
printf ("%3.2lf ", A[i][j]);
printf ("\n");
}

printf ("Input value: "); //ввод значения для сравнения
double val, sr; //значение, среднее арифметическое
int count = 0; //число заданных строк
scanf ("%lf", &val); //ввод значения

for (i = 0; i<isize; i++) { //идём по строкам
sr = 0; //среднее арифметическое строки
for (j = 0; j<jsize; j++)
sr+=A[i][j]; //считаем сумму
if (val > sr/jsize) count++; //сравниваем с заданным значением и считаем нужные строки
}

printf ("\nCount of rows: %d", count);

system("PAUSE"); //для просмотра результата
return 0;
}
Форма ответа