nixp.ru v3.0

22 мая 2017,
понедельник,
20:19:59 MSK

DevOps с компанией «Флант»
anonymous написал 16 апреля 2005 года в 15:09 (738 просмотров) Ведет себя неопределенно; открыл 1814 темы в форуме, оставил 5575 комментариев на сайте.

Помогите пожалуйста…

Требуется найти количество элементов в заданной строке прямоугольной целочисленной матрицы, кратных целому числу N.

Все бы ничего, да не могу понять: как кратность оформить…

Genie

кратность — это деление без остатка.

на сях, к примеру:

if (M % N == 0) {
// тут если кратно
} else {
// в противном случае
}
Uncle Theodore

В Фортране, если я не ошибаюсь, остаток от деления A на B вычисляется функцией MOD(A,B)

Good Luck,

UT

anonymous

To Uncle Theodore:

мне не остаток нужно найти, а проверить кратно ли данное число какому то другому числу…

To Genie:

(M % N == 0) — меня % немного пугает (мы о таком даже не слышали, да и Си не проходили). А есть ли что нибудь подобное на фортране?

Так как в фортране проверить кратен ли элемент какому то числу или нет? Может кто нибудь сможет код сообразить? :)

Feuerbach

Клиника.

Тебе ж все объяснили. Комбинируешь посты Genie и UT и радуешься :)

Пишешь что-то типа if MOD(A,B) = 0 или как там у вас на фортране — оно и дает делимость A на B.

myst
ART1984
To Uncle Theodore:

мне не остаток нужно найти, а проверить кратно ли данное число какому то другому числу…

To Genie:

(M % N == 0) — меня % немного пугает (мы о таком даже не слышали, да и Си не проходили). А есть ли что нибудь подобное на фортране?

Так как в фортране проверить кратен ли элемент какому то числу или нет? Может кто нибудь сможет код сообразить? :)

Это какое-то изощерённое издевательство или ты реально тупой?

anonymous
myst
Это какое-то изощерённое издевательство или ты реально тупой?

Не, я не тупой… :) Просто иногда долго доходит…

Вроде уже врубился, что если эти два ответа объединить, то получистя то, что я спрашивал, но до сих пор еще не уверен, что мысли мои идут в правильном направлении…

anonymous

Но все равно всем спасибо за помощь и добрые отклики… :)

anonymous

Пожалуйста, помогите!

У меня такое задание:

Головная программа должна определять в какой строке матрицы A(6,4) наибольшее количество элементов, кратных 7.

Функция должна вычислять количество элементов в заданной строке прямоугольной целочисленной матрицы, кратных целому числу N.

Составил я программу, но она выдает неправилные результаты. :(

Долго искал, в чем проблема, но так и не понял… :(

Вот текст программы:

Program ART

Implicit None

Integer N, M(6,4), K, i, max, kol

Open(1,FILE=’In.txt’) ! файл с исходным массивом

Open(2,FILE =’Out.txt’) ! результирующий файл

Read(1,*)M

Write(2,*)’Исходная матрица:'

Write(2,«(<4>(1x,I2))»)M

N=7

Write(2,«(’N=’,I2)»)N

Max=kol(M(1,1:4),N)

Write(2,*)’мах=’,k

Do i=2,6

K=kol(M(i,1:4),N)

Write(2,*)’мах=’,k

If (K>max) max=k

EndDo

Write(2,*)Max

End Program ART

Integer Function Kol(Mas,N1)

Integer N1, Mas(1:4) !Mas — массив, N1- число кратности

!Kol — Количество элементов в заданной строке прямоугольной целочисленной матрицы, кратных числу N

Kol=0

Do i=1,4

if (MOD(Mas(i),N1)==0) Kol=Kol+1

EndDo

End Function Kol

Может сможете объяснить тугодуму, в чем проблема?

Genie

ну, так как всё вроде бы на первый взгляд правильно, то ошибка, видимо, кроется вот в этом:

if (MOD(Mas(i),N1)==0) Kol=Kol+1

разве можно использовать Kol в качестве слагаемого в правой части присваивания?

собственно, надо создать отдельную переменную, ей присвоить начальное значение 0, в цикле именно её изменять при необходимости, а уж перед самым выходом использовать оператор присваивания значению функции значения этой переменной, хранящей результат.

anonymous

Переделал вот так:

Integer Function Kol(Mas,N1)

Integer N1, K1, Mas(1:4) !Mas — массив, N1- число кратности

!Kol — Количество элементов в заданной строке прямоугольной целочисленной матрицы, кратных числу N

K1=0

Do i=1,4

if (MOD(Mas(i),N1)==0) K1=K1+1

EndDo

Kol=K1

End Function Kol

Но все равно не работает, выдает те же самые результаты :(

Genie

«неправильные» результаты — это какие?

просто тогда не понятно, в каком месте имеет место быть глюк.

приведи файл входной (матрицу) и что программа тебе выдаёт

тогда и будет несколько более понятно, что к чему

для проверки, вставь вывод остатков для диагностики

anonymous

Входной файл:

1 1 3 4

5 6 1 7

9 1 2 3

4 7 7 1

8 9 1 1

1 1 5 6

Вывел он вообще непонятно что:

Исходная матрица:

1 1 3 4

5 6 1 7

9 1 2 3

4 7 7 1

8 9 1 1

1 1 5 6

N= 7

мах= 0

мах= 2

мах= 1

мах= 0

мах= 0

мах= 0

2

А про вывод остатков не очень понял ???

Genie
Max=kol(M(1,1:4),N)

Write(2,*)’мах=’,k

ндаа.. непорядок, а? ;) Max=… и следом вывод k, которое заведомо 0. ;)

Do i=1,4

if (MOD(Mas(i),N1)==0) Kol=Kol+1

EndDo

End Function Kol

а тут какая i берётся? и что по возвращении из функции в основном блоке творится?

пошагово, от начала и до конца…. :D

anonymous

Если бы я сам понимал что творю… :)

Как функции создавать вообще не знаю, лекции у нас по ним еще не скоро будут, а лабораторную работу уже сейчас делать надо… Посидел, почитал про функции и получилось то, что видно выше… :)

Genie
ндаа.. непорядок, а? ;) Max=… и следом вывод k, которое заведомо 0. ;)

Это я проверку делал, что он мне выдаст при каждом проходе цикла…

anonymous

Элементы матрицы во входном файле произвольные, но удовлетворяющие условию: тип integer, матрица(6,4).

Главная программа:

Max=kol(M(1,1:4),N) !Функция Kol вычисляет количесво элементов первой строчки массива, кратных числу N

Write(2,*)’мах=’,k !Выводим это количество, так, для проверки

Do i=2,6 !Делаем то же самое с остальными строчками

K=kol(M(i,1:4),N)

Write(2,*)’мах=’,k !выводим тоже для проверки

If (K>max) max=k !Сравниваем с предыдущими значениями для нахождения максимального значения

EndDo

Write(2,*)Max !И выводим этот максимум (это и есть цель программы)

Функция:

Integer Function Kol(Mas,N1) !Kol — Количество элементов в заданной строке прямоугольной целочисленной матрицы, кратных числу N

Integer N1, K1, j, Mas(1:4) !Mas — массив, N1- число кратности, i — количесво элементов в строке

!Kol — Количество элементов в заданной строке прямоугольной целочисленной матрицы, кратных числу N

K1=0

Do j=1,4

if (MOD(Mas(j),N1)==0) K1=K1+1

EndDo

Kol=K1

End Function Kol

anonymous

Ошибочка: уже не i — количесво элементов в строке, а j!

myst
Как функции создавать вообще не знаю, лекции у нас по ним еще не скоро будут, а лабораторную работу уже сейчас делать надо…

Так что же ты народ баламутиш?! Напиши без ф-ций, или разберись с ф-циями нормально, или подожди, когда препод расскажет про них, или стрельни у кого готовую лабу…

Genie
Max=kol(M(1,1:4),N) !Функция Kol вычисляет количесво элементов первой строчки массива, кратных числу N

Write(2,*)’мах=’,k !Выводим это количество, так, для проверки

ууу… а где это видно, что в Max и k будет одно и то же значение — число кратных к N чисел из первой строки матрицы M?

<font color=«red»>Будет выводиться постоянно для любого ряда чисел значение <font size=«+2»>0</font></font>

Напиши без ф-ций

ну, неплохой вариант ;)

по крайней мере, если будет работать… это будет не так плохо :)

anonymous

Готовую лабу я стрельнуть не могу (а то бы уже давно это сделал и не баламутил бы народ… :) )

Без функций тоже нельзя обойтись: цель работы — научить меня создавать функции и пользоваться ими.

И у нас такой отстой в образовании получается: почти по всем предметам лабораторные и практические занятия намного перегоняют лекции. Получается самообразование… :(

Чуть переделал кусок с max и k, если не так сделал, то не понимаю, что пытается сказать Genie:

Max=kol(M(1,1:4),N)

Write(2,*)’мах=’,max

Do i=2,6

K=kol(M(i,1:4),N)

If (K>max) max=k

Write(2,*)’мах=’,max

EndDo

Write(2,*)’Максимальное кол-во эл-в, кратных N:’,max

Результат все равно какой-то странный:

Исходная матрица:

1 1 3 4

5 6 1 7

9 1 2 3

4 7 7 1

8 9 1 1

1 1 5 6

N= 7

мах= 0

мах= 2

мах= 2

мах= 2

мах= 2

мах= 2

Максимальное кол-во эл-в, кратных N: 2

Не пойму, откуда берется 2 во второй строчке?

Genie

честно говоря, хня такая…. пока сам не добрался до f77, не понял, что к чему… да и не собираюсь — хватит того, что я таки взялся и поставил g77…

в общем, вот этот

$ cat art.F
      function kol(Mas,N1)
      integer Mas(1:4),N1,J,K1
        K1=0
        write(2,"(4x,I2)")Mas
        do J=1,4
          if(MOD(Mas(J),N1)==0)K1=K1+1
        enddo
        write(2,*)K1
        kol=K1
      end
      program art
      integer N,M(1:6,1:4),K,I,Max
        open(1,FILE="art.i.txt")
        open(2,FILE="art.o.txt")
        read(1,*)M
        write(2,*)"Исходная матрица:"
        write(2,*)M
        N=7
        write(2,"('N=',I2)")N
        K=0
        Max=0
        do I=1,6
          K=kol(M((I-1)*4+1,1),N)
          if(Max
        enddo
        write(2,*)Max
        stop
      end


делает то, что требуется на заданной матрице.

anonymous

To Genie:

Огромнейшее спасибо!!! :)

Правда пришлось немного потрудиться с текстом (мне приходится делать в Microsoft Developer Studio

Fortran 90, а он этот текст отказывался принимать), но это ерунда, уже справился, главное что работает!!! :)

В ближайшем будущем, возможно, еще помощи попрошу. Вы уж не гневайтесь… :)

Осталось еще 2 лабы:

Решение задач с использованием подпрограмм

Решение задач с производными типами данных

Да здравствуют гении программирования, готовые помочь!!! Пока вы есть, жизнь бедного студента будет не так сложна… :)

myst

Слушай, перец! Купи ты себе книжку по Фортрану и разберись как следует. А то, понимаешь, ему услугу сделали, а он «Всего две лабы осталось»… Вот обрадовал-то, а! Если не в состоянии сам свои лабы делать, то нехер учиться там, где учишся; иди на другую специальность…

anonymous

Ну не получается по книгам, у меня их много, да что толку… :( живое общение нужно, а его нет… :(

А по моей специальности программирование вообще не нужно, просто это общеобразовательный предмет… :)

<робкий шепот из под стола>: To Genie: а можно задать маленький вопросик?

K=kol(M((I-1)*4+1,1),N)

сижу ломаю голову, как M((I-1)*4+1,1) может работь (хотя вижу, что работает)???

Может у меня неправильные представления о многомерных массивах?

Я то считал, что нужно задавать что-то типа М(I,1:4), чтобы передать строку в функцию.

А тут я в растерянности: он же должен, допустим, для I=6 получить M((6-1)*4+1,1)=M(21,1)

И это ведь будет всего один элемент: в 21 строке, в 1 столбце. Но строк у меня уж точно не 21, а столбцов побольше 1. И программа выдает по 4 элемента. И уж совсем не понятно, каким образом он находит элементы M(6,2), M(6,3), M(6,4). В чем же секрет?

P.S. Просьба сильно не ругаться… :)

Genie
<робкий шепот из под стола>: To Genie: а можно задать маленький вопросик?

K=kol(M((I-1)*4+1,1),N)

сижу ломаю голову, как M((I-1)*4+1,1) может работь (хотя вижу, что работает)???

способ появился эмпирически, на основании вывода программы (отладочный вывод — вещь нужная и полезная).

Может у меня неправильные представления о многомерных массивах?

не знаю, у кого именно — но, судя по всему — непорядок с представлением этих массивов — именно у фортрана.

хотя — я фортран не изучал, и такой тонкости могу просто не знать. скорее всего — это именно особенность представления у фортрана.

почитай документацию ;)

И это ведь будет всего один элемент: в 21 строке, в 1 столбце.

будь это какой другой язык программирования — я бы тоже так и подумал.

но, как видно из отдалки, при указании M(I,1) получается несколько не то, что надо.

впрочем, может надо указывать M(1:4,I) и матрицу транспонировать?

будет время и желание — проверю..

счас я несколько не в том состоянии, чтобы довольно рационально соображать… как-то не способствуется оно сегодна…. ;)

А то, понимаешь, ему услугу сделали, а он «Всего две лабы осталось»…

уймись. ;)

либо лучше покажи книжку «Фортран в примерах». ;)

myst

http://www.ibiblio.org/pub/languages/fortran/unfp.html

http://www.aspire.cs.uah.edu/textbook/index_f77.html

не про F, но примеры на нём вроде, да и вообще классика:

http://ask.km.ru/books/teops/

anonymous

To myst: спасибо, обязательно посмотрю…

To Genie: Действительно, фортран — ненормальный язык!

Нормальные языки вводят массивы по строкам, а фортран — по столбцам.

А учитывая то, как у меня ввод был оформлен (никакого оформления), он не просто вводил по столбцам, но еще и прыгал через каждые 6 элементов при обращении к массиву.

Если ввод правильно оформить (запихнуть read в цикл с переменной по строкам и внутренним циклом с переменной по столбцам), то и работать с массивом можно так, как в других языках:

Do I=1,6

Read(1,*)(M(I,J),J=1,4)

EndDo

K=kol(M(I,1:4),N)

В общем, с этим я разобрался… :)

anonymous

Подскажите пожалуйста: каким образом можно удалить из матрицы столбцы, содержащие нулевые элементы?

anonymous

Program Lab4

Implicit none

Real R,Xc,Yc,x,y

Real Pt(1:8,1:2)

Integer I, K1, K2

open(1,FILE=«In.txt»)

open(2,FILE=«Out.txt»)

Do I=1,8

Read(1,*)Pt(I,:)

EndDo

Write(*,*)’Введите радиус круга:'

Read(*,*)R

Write(*,*)’Введите координаты центра круга (X,Y):'

Read(*,*)Xc,Yc

K1=0

K2=0

Do I=1,8

X=Pt(I,1)

Y=Pt(I,2)

If (Pri(R,Xc,Yc,x,y)) then

K1=K1+1

Else

K2=K2+1

EndIF

EndDo

If (K1>K2) then

Write (2,*)’Внутри точек больше, чем снаружи'

Else

Write (2,*)’Снаружи точек больше, чем внутри'

EndIF

End Program Lab4

Logical function pri(R1,Xc1,Yc1,x1,y1)

Real R1,Xc1,Yc1,x1,y1

Pri=(Xc1+x1)**2+(Yc1+y1)**2-R1**2 <= 0

End Function pri

Выдается ошибка: implicit type for PRI

В чем может быть ошибка? Типы я вроде правильно расставил…

Genie
Выдается ошибка: implicit type for PRI

попробовать добавить скобки в присваивании значения сравнения:

Pri= <font color=«red»>(</font> (Xc1+x1)**2+(Yc1+y1)**2-R1**2 <= 0 <font color=«red»>)</font>

если это не исправит ситуацию, то действовать при помощи конструкции if-then.

или функцию какую, проверяющую знак аргумента использовать (вероятно — с дополнительным инвертированием логического значения)

anonymous

не, не помогает.

По моему там че-то возмущается насчет типов аргументов и функции.

Если функция и аргументы вещественного типа, то программа работает, но это лишние вычисления.

А как же быть, если аргументы функции вещественного типа, а функция логического? Ведь может же такое быть?