Сравнение массивов (Фортран)
Вообще даны 4 одномерных массива одинаковой длины.
Мне требуется определить степень совпадения информации в этих массивах(попарно), которая определяется как отношение количества одинаковых элементов в 2-х сравниваемых массивах к общему количеству элементов в этих массивах.
Если все элементы одного массива получаются путем умножения на одну и туже величину элементов другого массива (путем прибавления одной и тойже величины к элементам др. массива), то такие массивы тоже считать одинаковыми.
Помогите пожалуйста, если вас не затруднит.
[quote=Gloms]Вообще даны 4 одномерных массива одинаковой длины.
Мне требуется определить степень совпадения информации в этих массивах(попарно), которая определяется как отношение количества одинаковых элементов в 2-х сравниваемых массивах к общему количеству элементов в этих массивах[/quote]
старею я что ли - не понял. тебе нужно поиндексное сравнение элементов массивов или просто есть ли элемент данного в другом массиве, т.е. например
1 массив: 1 4 7 5 9 2
2 массив: 3 6 0 2 1 1
тогда совпали три единицы и две двойки? и соответственно степень будет 5/12? так что ли?
[quote=Gloms]Если все элементы одного массива получаются путем умножения на одну и туже величину элементов другого массива (путем прибавления одной и тойже величины к элементам др. массива), то такие массивы тоже считать одинаковыми.[/quote]
ну кажись вот эта функция тебе поможет:
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 - кол-во элементов в массивах.
...
необходима процедура, чтобы при вводе с клавы двух массивов, каждый по 5 элементов происхоило их сравнение. И если например оба массива одинаковые, что выдается запись "5/5" т.е. 5 из пяти совпало. Если в массиве совпало по 1 элементу, то вывод "1/5".
Я вас прошу мне помочь по написанию процедуры, в которой бы происходило сравнение массивов, и вывод количества совпавших элементов. Причем по вышеупомянутому условию одинаковыми могут считаться массивы даже те, в которых эл-ты например умножены на одно и тоже число.
Помогите пожалуйста, буду благодарен, Очень!
заполнение массивов сам сделаешь - это просто.
[quote=Gloms]И если например оба массива одинаковые, что выдается запись "5/5" т.е. 5 из пяти совпало. Если в массиве совпало по 1 элементу, то вывод "1/5".[/quote]
вывод в таком виде тоже думаю сам обеспечишь.
[quote=Gloms]Я вас прошу мне помочь по написанию процедуры, в которой бы происходило сравнение массивов, и вывод количества совпавших элементов. Причем по вышеупомянутому условию одинаковыми могут считаться массивы даже те, в которых эл-ты например умножены на одно и тоже число.[/quote]
я впринципе спрашивал о сравнении, но так как ты не уточнил привожу код для поиндексного сравнения:
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
о параметрах этой функции написано в моём предыдущем посте. вобщем вроде как-то так все и будет.
ну так передавай по два массива в написанную мной функцию и все, т.е. ввели тебе 1 и 4 ты соответственно передал в функцию массивы соответствующие этим цифрам и получил ответ: от 0 до n(сколько там элементов в массивах твоих - неважно), потом выдал результат в том виде, в котором нужно. В чем проблема-то???
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).
какой у тебя компилятор??? что за ошибка??? что пишет???
[quote=Gloms]и как задать массив a(Nx4)?[/quote]
всмысле задать? ну например:
и зачем тебе Nx4? я же тебе писал просто 4xN имея в ввиду, что вместо 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
там объявляются 4 одномерных массива (a, b, c, d) и один двумерный (ab). после того как мы заполнили 4 одномерных массива, мы помещаем значения рамещенные в них в строки двумерного массива и каждому одномерному массиву получается соответствует номер строки двумерного массива, т.е. a-1, b-2, c-3, d-4. тогда мы запрашиваем у пользователя какие массивы сравнивать, и считываем номера, а потом просто обращаемся к определенной строке двумерного массива и вызываем нужную функцию.
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-х и их сравнивала. Буду очень благодарен.
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
Необходимо, чтобы ответ выходил как количество совпавших элементов. Например если в 2-х сравниваемых массивах было по 3 одинаковых элемента, то на экран выводиться (3/5). Причем по условию элементы могут считаться одинаковыми даже если они умножены на одно и тоже число, либо суммированы с одним и тем же числом.
Например (1,2,3,4,5) и (2,4,6,99,100). Ответ: (3/5).
Подскажи пожалуйста как этот код реализовать. Я буду очень благодарен.
да ты что? а не кажется ли тебе что ты условие немножко, а может и множко изменил? вот первый вариант:
[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.
разберись с условием!!!
Мне требуется определить степень совпадения информации в этих массивах(попарно), которая определяется как отношение количества одинаковых элементов в 2-х сравниваемых массивах к общему количеству элементов в этих массивах.
Если все элементы одного массива получаются путем умножения на одну и туже величину элементов другого массива (путем прибавления одной и тойже величины к элементам др. массива), то такие массивы тоже считать одинаковыми.
Ну пожалуйста покажи пример кода. Буду признателен.