anonymous
написал 16 апреля 2005 года в 15:09 (3193 просмотра)
Ведет себя
неопределенно; открыл 1814 темы в форуме, оставил 5575 комментариев на сайте.
Помогите пожалуйста…
Требуется найти количество элементов в заданной строке прямоугольной целочисленной матрицы, кратных целому числу N.
Все бы ничего, да не могу понять: как кратность оформить…
Последние комментарии
- OlegL, 17 декабря 2023 года в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
кратность — это деление без остатка.
на сях, к примеру:
В Фортране, если я не ошибаюсь, остаток от деления A на B вычисляется функцией MOD(A,B)
Good Luck,
UT
To Uncle Theodore:
мне не остаток нужно найти, а проверить кратно ли данное число какому то другому числу…
To Genie:
(M % N == 0) — меня % немного пугает (мы о таком даже не слышали, да и Си не проходили). А есть ли что нибудь подобное на фортране?
Так как в фортране проверить кратен ли элемент какому то числу или нет? Может кто нибудь сможет код сообразить? :)
Клиника.
Тебе ж все объяснили. Комбинируешь посты Genie и UT и радуешься :)
Пишешь что-то типа if MOD(A,B) = 0 или как там у вас на фортране — оно и дает делимость A на B.
Это какое-то изощерённое издевательство или ты реально тупой?
Не, я не тупой… :) Просто иногда долго доходит…
Вроде уже врубился, что если эти два ответа объединить, то получистя то, что я спрашивал, но до сих пор еще не уверен, что мысли мои идут в правильном направлении…
Но все равно всем спасибо за помощь и добрые отклики… :)
Пожалуйста, помогите!
У меня такое задание:
Головная программа должна определять в какой строке матрицы 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
Может сможете объяснить тугодуму, в чем проблема?
ну, так как всё вроде бы на первый взгляд правильно, то ошибка, видимо, кроется вот в этом:
разве можно использовать Kol в качестве слагаемого в правой части присваивания?
собственно, надо создать отдельную переменную, ей присвоить начальное значение 0, в цикле именно её изменять при необходимости, а уж перед самым выходом использовать оператор присваивания значению функции значения этой переменной, хранящей результат.
Переделал вот так:
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
Но все равно не работает, выдает те же самые результаты :(
«неправильные» результаты — это какие?
просто тогда не понятно, в каком месте имеет место быть глюк.
приведи файл входной (матрицу) и что программа тебе выдаёт
тогда и будет несколько более понятно, что к чему
для проверки, вставь вывод остатков для диагностики
Входной файл:
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
А про вывод остатков не очень понял ???
ндаа.. непорядок, а? ;) Max=… и следом вывод k, которое заведомо 0. ;)
а тут какая i берётся? и что по возвращении из функции в основном блоке творится?
пошагово, от начала и до конца…. :D
Если бы я сам понимал что творю… :)
Как функции создавать вообще не знаю, лекции у нас по ним еще не скоро будут, а лабораторную работу уже сейчас делать надо… Посидел, почитал про функции и получилось то, что видно выше… :)
Это я проверку делал, что он мне выдаст при каждом проходе цикла…
Элементы матрицы во входном файле произвольные, но удовлетворяющие условию: тип 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
Ошибочка: уже не i — количесво элементов в строке, а j!
Так что же ты народ баламутиш?! Напиши без ф-ций, или разберись с ф-циями нормально, или подожди, когда препод расскажет про них, или стрельни у кого готовую лабу…
ууу… а где это видно, что в Max и k будет одно и то же значение — число кратных к N чисел из первой строки матрицы M?
<font color=«red»>Будет выводиться постоянно для любого ряда чисел значение <font size=«+2»>0</font></font>
ну, неплохой вариант ;)
по крайней мере, если будет работать… это будет не так плохо :)
Готовую лабу я стрельнуть не могу (а то бы уже давно это сделал и не баламутил бы народ… :) )
Без функций тоже нельзя обойтись: цель работы — научить меня создавать функции и пользоваться ими.
И у нас такой отстой в образовании получается: почти по всем предметам лабораторные и практические занятия намного перегоняют лекции. Получается самообразование… :(
Чуть переделал кусок с 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 во второй строчке?
честно говоря, хня такая…. пока сам не добрался до f77, не понял, что к чему… да и не собираюсь — хватит того, что я таки взялся и поставил g77…
в общем, вот этот
делает то, что требуется на заданной матрице.
To Genie:
Огромнейшее спасибо!!! :)
Правда пришлось немного потрудиться с текстом (мне приходится делать в Microsoft Developer Studio
Fortran 90, а он этот текст отказывался принимать), но это ерунда, уже справился, главное что работает!!! :)
В ближайшем будущем, возможно, еще помощи попрошу. Вы уж не гневайтесь… :)
Осталось еще 2 лабы:
Решение задач с использованием подпрограмм
Решение задач с производными типами данных
Да здравствуют гении программирования, готовые помочь!!! Пока вы есть, жизнь бедного студента будет не так сложна… :)
Слушай, перец! Купи ты себе книжку по Фортрану и разберись как следует. А то, понимаешь, ему услугу сделали, а он «Всего две лабы осталось»… Вот обрадовал-то, а! Если не в состоянии сам свои лабы делать, то нехер учиться там, где учишся; иди на другую специальность…
Ну не получается по книгам, у меня их много, да что толку… :( живое общение нужно, а его нет… :(
А по моей специальности программирование вообще не нужно, просто это общеобразовательный предмет… :)
<робкий шепот из под стола>: 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. Просьба сильно не ругаться… :)
способ появился эмпирически, на основании вывода программы (отладочный вывод — вещь нужная и полезная).
не знаю, у кого именно — но, судя по всему — непорядок с представлением этих массивов — именно у фортрана.
хотя — я фортран не изучал, и такой тонкости могу просто не знать. скорее всего — это именно особенность представления у фортрана.
почитай документацию ;)
будь это какой другой язык программирования — я бы тоже так и подумал.
но, как видно из отдалки, при указании M(I,1) получается несколько не то, что надо.
впрочем, может надо указывать M(1:4,I) и матрицу транспонировать?
будет время и желание — проверю..
счас я несколько не в том состоянии, чтобы довольно рационально соображать… как-то не способствуется оно сегодна…. ;)
уймись. ;)
либо лучше покажи книжку «Фортран в примерах». ;)
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/
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)
В общем, с этим я разобрался… :)
Подскажите пожалуйста: каким образом можно удалить из матрицы столбцы, содержащие нулевые элементы?
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
В чем может быть ошибка? Типы я вроде правильно расставил…
попробовать добавить скобки в присваивании значения сравнения:
если это не исправит ситуацию, то действовать при помощи конструкции if-then.
или функцию какую, проверяющую знак аргумента использовать (вероятно — с дополнительным инвертированием логического значения)
не, не помогает.
По моему там че-то возмущается насчет типов аргументов и функции.
Если функция и аргументы вещественного типа, то программа работает, но это лишние вычисления.
А как же быть, если аргументы функции вещественного типа, а функция логического? Ведь может же такое быть?