Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сравнение массивов (Фортран)

22K
25 мая 2007 года
Gloms
34 / / 03.05.2007
Добрые люди, помогите в кратце организовать код небольшой программы, буду очень благодарен вам.
Вообще даны 4 одномерных массива одинаковой длины.
Мне требуется определить степень совпадения информации в этих массивах(попарно), которая определяется как отношение количества одинаковых элементов в 2-х сравниваемых массивах к общему количеству элементов в этих массивах.
Если все элементы одного массива получаются путем умножения на одну и туже величину элементов другого массива (путем прибавления одной и тойже величины к элементам др. массива), то такие массивы тоже считать одинаковыми.

Помогите пожалуйста, если вас не затруднит.
257
27 мая 2007 года
kosfiz
1.6K / / 18.09.2005
тебе точно код нужен? блок-схема не нужна?
[quote=Gloms]Вообще даны 4 одномерных массива одинаковой длины.
Мне требуется определить степень совпадения информации в этих массивах(попарно), которая определяется как отношение количества одинаковых элементов в 2-х сравниваемых массивах к общему количеству элементов в этих массивах[/quote]
старею я что ли - не понял. тебе нужно поиндексное сравнение элементов массивов или просто есть ли элемент данного в другом массиве, т.е. например
1 массив: 1 4 7 5 9 2
2 массив: 3 6 0 2 1 1
тогда совпали три единицы и две двойки? и соответственно степень будет 5/12? так что ли?
[quote=Gloms]Если все элементы одного массива получаются путем умножения на одну и туже величину элементов другого массива (путем прибавления одной и тойже величины к элементам др. массива), то такие массивы тоже считать одинаковыми.[/quote]
ну кажись вот эта функция тебе поможет:
Код:
function ArrayCompare(a,b,n)
integer n,i
real a(n),b(n),d,r
ArrayCompare=.true.
d=a(1)/b(1)
do i=1,n
 if (a(i).ne.(b(i)*d)) then
  ArrayCompare=.false.
  exit
 end if
end do
if (ArrayCompare==.false.) then
ArrayCompare=.true.
d=a(1)-b(1)
do i=1,n
 if (a(i).ne.(b(i)+d)) then
  ArrayCompare=.false.
  exit
 end if
end do
end if
end

вернет .true. если массивы одинаковы по твоим условиям и .false. если различны. a и b - массивы на проверку, n - кол-во элементов в массивах.
22K
28 мая 2007 года
Gloms
34 / / 03.05.2007
Цитата: kosfiz
тебе точно код нужен? блок-схема не нужна?
...



необходима процедура, чтобы при вводе с клавы двух массивов, каждый по 5 элементов происхоило их сравнение. И если например оба массива одинаковые, что выдается запись "5/5" т.е. 5 из пяти совпало. Если в массиве совпало по 1 элементу, то вывод "1/5".
Я вас прошу мне помочь по написанию процедуры, в которой бы происходило сравнение массивов, и вывод количества совпавших элементов. Причем по вышеупомянутому условию одинаковыми могут считаться массивы даже те, в которых эл-ты например умножены на одно и тоже число.
Помогите пожалуйста, буду благодарен, Очень!

257
28 мая 2007 года
kosfiz
1.6K / / 18.09.2005
[quote=Gloms]необходима процедура, чтобы при вводе с клавы двух массивов, каждый по 5 элементов происхоило их сравнение.[/quote]
заполнение массивов сам сделаешь - это просто.
[quote=Gloms]И если например оба массива одинаковые, что выдается запись "5/5" т.е. 5 из пяти совпало. Если в массиве совпало по 1 элементу, то вывод "1/5".[/quote]
вывод в таком виде тоже думаю сам обеспечишь.
[quote=Gloms]Я вас прошу мне помочь по написанию процедуры, в которой бы происходило сравнение массивов, и вывод количества совпавших элементов. Причем по вышеупомянутому условию одинаковыми могут считаться массивы даже те, в которых эл-ты например умножены на одно и тоже число.[/quote]
я впринципе спрашивал о сравнении, но так как ты не уточнил привожу код для поиндексного сравнения:
Код:
function ArrayCompare(a,b,n)
integer n,i,j
real a(n),b(n),d,r
logical t
t=.true.
d=a(1)/b(1)
do i=1,n
 if (a(i).ne.(b(i)*d)) then
  t=.false.
  exit
 end if
end do
if (t==.false.) then
t=.true.
d=a(1)-b(1)
do i=1,n
 if (a(i).ne.(b(i)+d)) then
  t=.false.
  exit
 end if
end do
end if
if (t==.false.) then
j=0
do i=1,n
 if (a(i).eq.b(i)) j=j+1
end do
ArrayCompare=j
else
ArrayCompare=n
end if
end

о параметрах этой функции написано в моём предыдущем посте. вобщем вроде как-то так все и будет.
22K
29 мая 2007 года
Gloms
34 / / 03.05.2007
ааа =) сравнивать необходимо сразу введенные 4 массива: например ввели все 4 массива, далее необходимо ввести напр. 1 и 4 и произойдет сравнивание этих массивов. Помогите пожалуйста это реализовать. Вы мне очень поможите.
257
29 мая 2007 года
kosfiz
1.6K / / 18.09.2005
Цитата: Gloms
ааа =) сравнивать необходимо сразу введенные 4 массива: например ввели все 4 массива, далее необходимо ввести напр. 1 и 4 и произойдет сравнивание этих массивов. Помогите пожалуйста это реализовать. Вы мне очень поможите.


ну так передавай по два массива в написанную мной функцию и все, т.е. ввели тебе 1 и 4 ты соответственно передал в функцию массивы соответствующие этим цифрам и получил ответ: от 0 до n(сколько там элементов в массивах твоих - неважно), потом выдал результат в том виде, в котором нужно. В чем проблема-то???

257
29 мая 2007 года
kosfiz
1.6K / / 18.09.2005
кстати раз тебе нужно будет вводить цифры обозначающие массивы и потом выполнять с массивами определенные действия, то лучше задействовать один массив 4xN, а не четыре одномерных.
22K
30 мая 2007 года
Gloms
34 / / 03.05.2007
Ну мне бы очень пригодилась процедура работы функции сравнения. забиваем массивы, а подскажите пожалуйста как организовать именно этот выбор, например сравнение первого и третьего массива.
257
30 мая 2007 года
kosfiz
1.6K / / 18.09.2005
писал же уже как будет проще http://forum.codenet.ru/showpost.php?p=194952&postcount=7
Код:
real a(5),b(5),c(5),d(5)
real ab(4,5)
integer i,j
................................
заполняешь массивы
................................
ab(1,:)=a
ab(2,:)=b
ab(3,:)=c
ab(4,:)=d
read *,i
read *,j
print *,ArrayCompare(ab(i,:),ab(j,:),5)/5

ну если вывод такой какой есть тебя не устраивает то сделай сам. кстати можно не использовать одномерные массивы, а сразу заполнять двумерный(по коду ab).
22K
31 мая 2007 года
Gloms
34 / / 03.05.2007
Можешь пожалуйста обьяснить, мне не понятна работа функции ArrayCompare (ее принцип, и почему на ней выдается ошибка) и как задать массив a(Nx4)? Обьясни пожалуйста, на примере вышеприведенной задачи.
257
31 мая 2007 года
kosfiz
1.6K / / 18.09.2005
[quote=Gloms]почему на ней выдается ошибка[/quote]
какой у тебя компилятор??? что за ошибка??? что пишет???
[quote=Gloms]и как задать массив a(Nx4)?[/quote]
всмысле задать? ну например:
 
Код:
real ab(4,5)

и зачем тебе Nx4? я же тебе писал просто 4xN имея в ввиду, что вместо N подставишь количество элементов в массивах, тех что одномерные.
далее:
Код:
function ArrayCompare(a,b,n)
integer n,i,j
real a(n),b(n),d,r
logical t
t=.true.                      //предполагаем для начала что массивы равны
d=a(1)/b(1)                 //если один массив результат умножение другого на число, то находим это число
do i=1,n                     //в цикле проверяем каждый эелемент на то, что он результат умножения исходного на некоторое число
 if (a(i).ne.(b(i)*d)) then //если не выполняется условие,то
  t=.false.                     //массивы не равны
  exit                           //выходим из проверки
 end if
end do
if (t==.false.) then        //если массивы не равны по первому условию то проверяем на второе
t=.true.                      //предполагаем что второе условие выполняется
d=a(1)-b(1)                //находим разность соответствующих элементов
do i=1,n                     //проверка аналогичная первой
 if (a(i).ne.(b(i)+d)) then
  t=.false.
  exit
 end if
end do
end if
if (t==.false.) then        //если массивы не равны то считаем степень совпадения информации
j=0
do i=1,n                      //цикл подсчета
 if (a(i).eq.b(i)) j=j+1
end do
ArrayCompare=j            //возвращаем значение
else
ArrayCompare=n           //в том случае если массивы равны, то степень равна n
end if
end
22K
01 июня 2007 года
Gloms
34 / / 03.05.2007
Возможно надоедаю, но мне откровенно не понятен принцип, как забив массивы, потом выборочно их сравнивать. Пожалуйста, если тебя не затруднит, обьясни, будь так любезен.
257
02 июня 2007 года
kosfiz
1.6K / / 18.09.2005
смотрим код в посте http://forum.codenet.ru/showpost.php?p=195079&postcount=9
там объявляются 4 одномерных массива (a, b, c, d) и один двумерный (ab). после того как мы заполнили 4 одномерных массива, мы помещаем значения рамещенные в них в строки двумерного массива и каждому одномерному массиву получается соответствует номер строки двумерного массива, т.е. a-1, b-2, c-3, d-4. тогда мы запрашиваем у пользователя какие массивы сравнивать, и считываем номера, а потом просто обращаемся к определенной строке двумерного массива и вызываем нужную функцию.
22K
04 июня 2007 года
Gloms
34 / / 03.05.2007
Общий код программы: (помогите исправить кое-какие недочеты, пожалуйста)


Код:
program a1
function ArrayCompare(a,b,n)
integer n,i,j
real r
logical t
real a(5),b(5),c(5),d(5)
real ab(4,5)
integer i,j
read *,a
read *,b
read *,c
read *,d
ab(1,:)=a
ab(2,:)=b
ab(3,:)=c
ab(4,:)=d
read *,i
read *,j
print *,ArrayCompare(ab(i,:),ab(j,:),5)/5
t=.true.                      
d=a(1)/b(1)                
do i=1,n                    
 if (a(i).ne.(b(i)*d)) then
  t=.false.                    
  exit                          
 end if
end do
if (t==.false.) then        
t=.true.                      
d=a(1)-b(1)                
do i=1,n                    
 if (a(i).ne.(b(i)+d)) then
  t=.false.
  exit
 end if
end do
end if
if (t==.false.) then      
j=0
do i=1,n                      
 if (a(i).eq.b(i)) j=j+1
end do
ArrayCompare=j            
else
ArrayCompare=n          
end if
end
end program a1


Просто составил вместе ваши подсказки. Не было времени проработать все.
Помогите пожалуйста создать отделюную процедуру, которая бы выбирала 2 заданных массива из 4-х и их сравнивала. Буду очень благодарен.
257
04 июня 2007 года
kosfiz
1.6K / / 18.09.2005
ну например вот так:
Код:
real a(5),b(5),c(5),d(5)
real ab(4,5)
integer i,j
print *, 'zapolnite 4 massiva po 5 elementov v kagdom'
do i=1,5
  read *,a(i)
end do
do i=1,5
  read *,b(i)
end do
do i=1,5
  read *,c(i)
end do
do i=1,5
  read *,d(i)
end do
ab(1,:)=a
ab(2,:)=b
ab(3,:)=c
ab(4,:)=d
100 print *,'vvedite nomera sravnivaemih massivov(cifri ot 1 do 4)'
read *,i
read *,j
print *,'stepen sovpadenia informacii:'
print *,ArrayCompare(ab(i,:),ab(j,:),5)/5
print *,'prodolgit sravnenie ili viiti?(1-viiti; 2-prodolgit)'
read *,i
if (i==2) goto 100
end

function ArrayCompare(a,b,n)
integer n,i,j
real a(n),b(n),d,r
logical t
t=.true.
d=a(1)/b(1)
do i=1,n
 if (a(i).ne.(b(i)*d)) then
  t=.false.
  exit
 end if
end do
if (t==.false.) then
t=.true.
d=a(1)-b(1)
do i=1,n
 if (a(i).ne.(b(i)+d)) then
  t=.false.
  exit
 end if
end do
end if
if (t==.false.) then
j=0
do i=1,n
 if (a(i).eq.b(i)) j=j+1
end do
ArrayCompare=j
else
ArrayCompare=n
end if
end
22K
07 июня 2007 года
Gloms
34 / / 03.05.2007
Тут немножко не то сравнение происходит.
Необходимо, чтобы ответ выходил как количество совпавших элементов. Например если в 2-х сравниваемых массивах было по 3 одинаковых элемента, то на экран выводиться (3/5). Причем по условию элементы могут считаться одинаковыми даже если они умножены на одно и тоже число, либо суммированы с одним и тем же числом.

Например (1,2,3,4,5) и (2,4,6,99,100). Ответ: (3/5).
Подскажи пожалуйста как этот код реализовать. Я буду очень благодарен.
257
07 июня 2007 года
kosfiz
1.6K / / 18.09.2005
[quote=Gloms]Тут немножко не то сравнение происходит.[/quote]
да ты что? а не кажется ли тебе что ты условие немножко, а может и множко изменил? вот первый вариант:
[quote=Gloms]Вообще даны 4 одномерных массива одинаковой длины.
Мне требуется определить степень совпадения информации в этих массивах(попарно), которая определяется как отношение количества одинаковых элементов в 2-х сравниваемых массивах к общему количеству элементов в этих массивах.
Если все элементы одного массива получаются путем умножения на одну и туже величину элементов другого массива (путем прибавления одной и тойже величины к элементам др. массива), то такие массивы тоже считать одинаковыми.[/quote]
а вот новое:
[quote=Gloms]Необходимо, чтобы ответ выходил как количество совпавших элементов. Например если в 2-х сравниваемых массивах было по 3 одинаковых элемента, то на экран выводиться (3/5). Причем по условию элементы могут считаться одинаковыми даже если они умножены на одно и тоже число, либо суммированы с одним и тем же числом.[/quote]
ну а теперь самое интересное
[quote=Gloms]Например (1,2,3,4,5) и (2,4,6,99,100). Ответ: (3/5).[/quote]
ни по первому ни по второму условию ответ неправильный.

кстати, оформление вывода например: 3/5 сделать по предложенному мной коду очень просто сам сделаешь, сейчас программа в таком случае выводит просто 0.6.

разберись с условием!!!
22K
07 июня 2007 года
Gloms
34 / / 03.05.2007
Первое верно : Вообще даны 4 одномерных массива одинаковой длины.
Мне требуется определить степень совпадения информации в этих массивах(попарно), которая определяется как отношение количества одинаковых элементов в 2-х сравниваемых массивах к общему количеству элементов в этих массивах.
Если все элементы одного массива получаются путем умножения на одну и туже величину элементов другого массива (путем прибавления одной и тойже величины к элементам др. массива), то такие массивы тоже считать одинаковыми.

Ну пожалуйста покажи пример кода. Буду признателен.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог