Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Двумерные массивы с функциями


Автор: SIMarOK 10.11.2004, 22:10
Я не понимаю как начать программу с функциями. может кто подсказать? Спасибоsmile

По данной квадратной матрице построить вектор, элемент которого равен разности между максимальным элементом соответствующего столбца матрицы и элементом этого столбца, лежащем на главной диагонали. Найти произведение ненулевых элементов полученного вектора. Число строк матрицы не более 15. Формат числа ±ц.цц. smile

Автор: Monomah 11.11.2004, 10:50
А матрица записана в файле или уже есть готовый двумерный массив? Если нада считать из файла, то тут можно использовать fscanf(...). С её помощью ты сможешь считать все числа из строки в заданном формате (точно не знаю, можно ли использовать эту функцию при неизвестном количестве чисел в строке, но это число можно узнать другими способами). Ну а потом, когда все числа записаны в массив, то мне кажется нет трудности вычислить вектор.
ну например так:

float max=-99999; // допустим это число меньше всех чисел из матрицы
float proiz=1; // здесь будет результирующее произведение чисел вектора
float data[n][n]; // массив с уже считанными данными, n - размер матрицы, первый индекс - столбцы, второй - строки
float vector[n]; // сюда будем записывать новый вектор

for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
{if (data[i][j]>max) max=data[i][j]; //нашли максимальный элемент столбца
}
vector[i]=max- data[i][i] ;
max=-99999;
}
for (i=0;i<n;i++)
{
if (vector[i]!=0)
proiz=proiz*vector[i];
}
конец программы


если нада на функции разбить, то например можно нахождение максимального числа в столбце вынести в отдельную функцию

Автор: SIMarOK 11.11.2004, 17:27
Цитата(Monomah @ 11.11.2004, 10:50)
А матрица записана в файле или уже есть готовый двумерный массив? Если нада считать из файла, то тут можно использовать fscanf(...). С её помощью ты сможешь считать все числа из строки в заданном формате (точно не знаю, можно ли использовать эту функцию при неизвестном количестве чисел в строке, но это число можно узнать другими способами). Ну а потом, когда все числа записаны в массив, то мне кажется нет трудности вычислить вектор.
ну например так:

float max=-99999; // допустим это число меньше всех чисел из матрицы
float proiz=1; // здесь будет результирующее произведение чисел вектора
float data[n][n]; // массив с уже считанными данными, n - размер матрицы, первый индекс - столбцы, второй - строки
float vector[n]; // сюда будем записывать новый вектор

for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
{if (data[i][j]>max) max=data[i][j]; //нашли максимальный элемент столбца
}
vector[i]=max- data[i][i] ;
max=-99999;
}
for (i=0;i<n;i++)
{
if (vector[i]!=0)
proiz=proiz*vector[i];
}
конец программы


если нада на функции разбить, то например можно нахождение максимального числа в столбце вынести в отдельную функцию

Пасибо за помощьsmile
Пользователь сам заполняет двумерный массив, вводомsmile
А как посчитать "которого равен разности между максимальным элементом соответствующего столбца матрицы и элементом этого столбца, лежащем на главной диагонали" как я понимаю это здесь высчитывается?
Код


for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
{if (data[i][j]>max) max=data[i][j]; //нашли максимальный элемент столбца
}
vector[i]=max- data[i][i];
max=-99999;
}


Автор: Adil' 11.11.2004, 17:58
К чему заботиться о наименьшем допустимом значении - обычно максимальным назначают нулевой элемент массива и начинают поиск с первого. Да и циклы построения вектора и вычисления произведения ненулевых элементов этого вектора можно объединить в один, и массив vector тогда не нужен:
Код

float vector;
printf("\nVector:");
for (int i=0;i<n;i++)
{
 max=data[i][0];
 for (int j=1;j<n;j++)
   if (data[i][j]>max)
     max=data[i][j]; //нашли максимальный элемент столбца
 vector=max- data[i][i];
 if (fabs(vector)>MINFLOAT)//все-таки плавающее число "в лоб" с нулём лучше не сравнивать
   proiz*=vector;
 printf(" %d->%+.2f",i,vector);
}
printf(";\tMult.:%+.2f",proiz);
- подключить <math.h> и <values.h>

Автор: Monomah 11.11.2004, 18:24
Adil', абсолютно согласен, писал не из мысли быстродействия программы smile

А так может быстрее будет?
Цитата
if (vector!=(float)(0))
?

Автор: Adil' 11.11.2004, 18:51
Цитата(Monomah @ 11.11.2004, 18:24)
if (vector!=(float)(0))

Это абсолютно равнозначно vector!=0, впрочем как и vector!=0.
Тут суть в том, что сравнение плавающих чисел происходит побайтно, и если хоть один из бит в байтах не совпадет, то то, числа будут считаться разными. В тоже время, при вычислениях с плавающими числами может набегать погрешность, и, например, 1 станет 1.00000001 - в принципе числа одинаковые, но hex-виде - это 3F800000 и 3F800001.

З.Ы. Сам не уверен, что и сравнение с MINFLOAT надежно, лучше наверно вообще с 1e-7 сравнивать, хотя вообще-то это зависит от допустимой точности решения кокретной задачи.

Автор: SIMarOK 11.11.2004, 19:52
Код

fabs(vector)>MINFLOAT

А как мне представить этот код со стандартными функциями библиотек <conio.h> и <stdio.h>?smile

Автор: SIMarOK 11.11.2004, 20:02
Посмотрите, добавил заполнение массива. программа работает, но результаты верно выщитывать будет?
Код

# include <stdio.h>
# include <conio.h>
# include <math.h>
# include <values.h>
void main ()
{
float vector;
float max;
float data[5][15];
float proiz;
int j;
int i;
printf("Vvedite massiv:\n");
for(i=0; i<5; i++)
{
for(j=0; j<15; j++)
{
printf(" mas[%d][%d]=", i, j);
scanf("%f", &data[i][j]);
}
}
printf("\nVector:");
for (i=0;i<5;i++)
{
max=data[i][0];
for (j=1;j<15;j++)
  if (data[i][j]>max)
    max=data[i][j]; //íàøëè ìàêñèìàëüíûé ýëåìåíò ñòîëáöà
vector=max- data[i][i];
if (fabs(vector)>MINFLOAT)//âñå-òàêè ïëàâàþùåå ÷èñëî "â ëîá" ñ íóë¸ì ëó÷øå íå ñðàâíèâàòü
  proiz*=vector;
printf(" %d->%+.2f",i,vector);
}
printf(";\tProizved.:%+.2f",proiz);
getch();
}


пасибоsmile

Автор: Adil' 12.11.2004, 09:42
Цитата(SIMarOK @ 11.11.2004, 20:02)
но результаты верно выщитывать будет?
Так скомпили и проверь smile

Автор: SIMarOK 12.11.2004, 10:42
он почему-то произведение не выщитывает...постоянно 0...

Автор: Adil' 12.11.2004, 15:17
так а зачем ты инициализацию float proiz=1; убрал?

Автор: SIMarOK 21.11.2004, 15:25
Всё работает, спасибо, а как его с функциями переделать можно?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)