Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Двумерные массивы с функциями, Построение вектора из квадратной матрицы 
:(
    Опции темы
SIMarOK
Дата 10.11.2004, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 25.10.2004

Репутация: нет
Всего: нет



Я не понимаю как начать программу с функциями. может кто подсказать? Спасибоsmile

По данной квадратной матрице построить вектор, элемент которого равен разности между максимальным элементом соответствующего столбца матрицы и элементом этого столбца, лежащем на главной диагонали. Найти произведение ненулевых элементов полученного вектора. Число строк матрицы не более 15. Формат числа ±ц.цц. smile
PM MAIL   Вверх
Monomah
Дата 11.11.2004, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 30.9.2004

Репутация: нет
Всего: нет



А матрица записана в файле или уже есть готовый двумерный массив? Если нада считать из файла, то тут можно использовать 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];
}
конец программы


если нада на функции разбить, то например можно нахождение максимального числа в столбце вынести в отдельную функцию
PM MAIL   Вверх
SIMarOK
Дата 11.11.2004, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 25.10.2004

Репутация: нет
Всего: нет



Цитата(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;
}


PM MAIL   Вверх
Adil'
Дата 11.11.2004, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 26.8.2004
Где: Питер

Репутация: 6
Всего: 15



К чему заботиться о наименьшем допустимом значении - обычно максимальным назначают нулевой элемент массива и начинают поиск с первого. Да и циклы построения вектора и вычисления произведения ненулевых элементов этого вектора можно объединить в один, и массив 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>

Это сообщение отредактировал(а) Adil' - 11.11.2004, 17:59


--------------------
Удачи
PM MAIL WWW   Вверх
Monomah
Дата 11.11.2004, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 30.9.2004

Репутация: нет
Всего: нет



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

А так может быстрее будет?
Цитата
if (vector!=(float)(0))
?
PM MAIL   Вверх
Adil'
Дата 11.11.2004, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 26.8.2004
Где: Питер

Репутация: 6
Всего: 15



Цитата(Monomah @ 11.11.2004, 18:24)
if (vector!=(float)(0))

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

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


--------------------
Удачи
PM MAIL WWW   Вверх
SIMarOK
Дата 11.11.2004, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 25.10.2004

Репутация: нет
Всего: нет



Код

fabs(vector)>MINFLOAT

А как мне представить этот код со стандартными функциями библиотек <conio.h> и <stdio.h>?smile
PM MAIL   Вверх
SIMarOK
Дата 11.11.2004, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 25.10.2004

Репутация: нет
Всего: нет



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

# 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

Это сообщение отредактировал(а) SIMarOK - 11.11.2004, 20:05
PM MAIL   Вверх
Adil'
Дата 12.11.2004, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 26.8.2004
Где: Питер

Репутация: 6
Всего: 15



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



--------------------
Удачи
PM MAIL WWW   Вверх
SIMarOK
Дата 12.11.2004, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 25.10.2004

Репутация: нет
Всего: нет



он почему-то произведение не выщитывает...постоянно 0...

Это сообщение отредактировал(а) SIMarOK - 12.11.2004, 10:42
PM MAIL   Вверх
Adil'
Дата 12.11.2004, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 26.8.2004
Где: Питер

Репутация: 6
Всего: 15



так а зачем ты инициализацию float proiz=1; убрал?



--------------------
Удачи
PM MAIL WWW   Вверх
SIMarOK
Дата 21.11.2004, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 25.10.2004

Репутация: нет
Всего: нет



Всё работает, спасибо, а как его с функциями переделать можно?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0806 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.