Форум программистов, компьютерный форум, киберфорум
Наши страницы
Fortran
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/16: Рейтинг темы: голосов - 16, средняя оценка - 4.75
Danaida1990
0 / 0 / 0
Регистрация: 27.02.2014
Сообщений: 56
1

Цикл do while

22.10.2014, 13:18. Просмотров 3237. Ответов 16
Метки нет (Все метки)

Здравствуйте, уважаемые форумчане. Помогите, пожалуйста, разобраться с циклом do while на примере простенькой программки. Имеется число а, которое изначально задается, а зависит от x и x также зависит от а. Необходимо: пока выполняется условие находить а и соответствующее ему x, т.е. а должно перезаписываться. Тут где-то ошибка или я чего-то не понимаю, направьте пожалуйста на верный путь.
Fortran
1
2
3
4
5
6
7
8
9
10
implicit  none
real a,x
print*,'enter a'
read*,a
 do while(x < 2)                         
   x=(1/3)*a
  a = (1/3)*x + a                                     
    print *,'x=',x,'a=',a  
 end do                              
end
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2014, 13:18
Ответы с готовыми решениями:

Создать программу по всем 3 видам циклов...цикл с параметром,цикл с условием,цикл,и цикл с предусловием...
Найти сумму чисел 1 в квадрате до 10 c квадрате...операцию возведению в степень...

Цикл с предусловием, цикл с постусловием и цикл с параметром
Объясните пожалуйста как делать эти циклы. У меня не получается. Можете сделать...

Цикл: Вычислить значение выражения. Как вывести формулу и сделать цикл while?
Последовательно вводятся N целых чисел. Найти минимальное из них. ...

Написать в турбо паскале, Цикл с параметром, Цикл, с постусловием, и с предусловием пожалуйста

Как реализовать бесконечный цикл While, но чтобы этот цикл не грузил процессор?
Допустим есть цикл: while (1) { ... } Как сделать так, чтобы...

16
frostyfull
33 / 33 / 8
Регистрация: 13.06.2014
Сообщений: 509
22.10.2014, 13:24 2
Danaida1990, я не знаю что это за язык, но мне кажется ошибка в проверке
при создании переменных запиши в них нулевые значения, т.к. при первом выполнении цифра 2 сравнивается с пустотой
0
Krasme
3417 / 2731 / 968
Регистрация: 02.02.2014
Сообщений: 7,473
22.10.2014, 13:29 3
Цитата Сообщение от Danaida1990 Посмотреть сообщение
do while(x < 2)
или все же проверка должна быть по а
Fortran
1
do while(а < 2)
0
Danaida1990
0 / 0 / 0
Регистрация: 27.02.2014
Сообщений: 56
22.10.2014, 13:34  [ТС] 4
Проверка должна быть именно по x (зависит от а), величина а должна как бы переприсваиваться и на основании каждого нового значения а вычисляется x; если условие не выполняется, то последнее вычисленное значение а используется дальше
0
Krasme
3417 / 2731 / 968
Регистрация: 02.02.2014
Сообщений: 7,473
22.10.2014, 13:40 5
замените дробь
Fortran
1
1/3
на
Fortran
1
1./3
без точки идет целочисленное деление и в результате имеем ноль, с точкой имеем вещественный результат.
1
Danaida1990
0 / 0 / 0
Регистрация: 27.02.2014
Сообщений: 56
22.10.2014, 13:46  [ТС] 6
Спасибо, заработало! Получается, если в любой программе есть дробь подобного вида, то независимо от типа объявляемых переменных нужно ставить точку?
0
Krasme
3417 / 2731 / 968
Регистрация: 02.02.2014
Сообщений: 7,473
22.10.2014, 13:53 7
Danaida1990, все зависит от поставленной задачи. иногда нужно иметь целую часть дроби, тогда точка не нужна.
0
Danaida1990
0 / 0 / 0
Регистрация: 27.02.2014
Сообщений: 56
23.10.2014, 11:04  [ТС] 8
И снова требуется помощь на примере фрагмента программы. В основной программе в этом примерном блоке не происходит перезаписывания ini, из-за этого вычисляется значение om_, например равное 0.4, и всё. Дальше программа оставляет исходный массив ini. Подскажите, пожалуйста, отчего может быть ошибка?
Fortran
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 ini = reshape(ini_st, forma)
 fin = reshape(fin_st, forma)
 do 652 while (om_ > 0.01)
  do i = 1, 3
  do k = 1, m
    vector (i,k) = fin(i,k)-ini(i,k)
  end do
  end do
...................................................
    om_ = sqrt(om(1)**2 + om(2)**2 + om(3)**2) !om зависят от ini
  do i = 1, 3
  do j= 1, chislo_atomov
    ini(i,j) = cos(om)*ini(i,j) 
  end do
  end do
 652 continue
0
Krasme
3417 / 2731 / 968
Регистрация: 02.02.2014
Сообщений: 7,473
23.10.2014, 12:07 9
Danaida1990, сужу только по вашему фрагменту.
Цитата Сообщение от Danaida1990 Посмотреть сообщение
om_ = sqrt(om(1)**2 + om(2)**2 + om(3)**2) !om зависят от ini
здесь вычисляется om_ с черточкой, имеется массив om.
Цитата Сообщение от Danaida1990 Посмотреть сообщение
ini(i,j) = cos(om)*ini(i,j)
здесь имеем величину om - не массив и без черточки, не вижу его определения.
вывод: в цикле cos(om)=cos(0)=1. оттого ini не пересчитывается.
0
Danaida1990
0 / 0 / 0
Регистрация: 27.02.2014
Сообщений: 56
23.10.2014, 12:12  [ТС] 10
Это я виновата, попутала, там тоже om_ должно стоять, om - это вектор, om_ - это его длина. Вычисление координат самого вектора запутанное и не влияет на тот факт, что om и om_ зависят от ini.
0
Krasme
3417 / 2731 / 968
Регистрация: 02.02.2014
Сообщений: 7,473
23.10.2014, 12:22 11
Danaida1990, уточняю: вы исправили в цикле om на om_ , и программа стала считать так, как надо?
0
Danaida1990
0 / 0 / 0
Регистрация: 27.02.2014
Сообщений: 56
23.10.2014, 12:29  [ТС] 12
К сожалению нет. Может ли это быть из-за того, что массив ini_st я считываю из файла? Хотя по идее ini должен замениться на новый в строке
Fortran
1
  vector (i,k) = fin(i,k)-ini(i,k)
0
Krasme
3417 / 2731 / 968
Регистрация: 02.02.2014
Сообщений: 7,473
23.10.2014, 13:05 13
Цитата Сообщение от Danaida1990 Посмотреть сообщение
по идее ini должен замениться на новый в строке
Код Fortran
1
* vector (i,k) = fin(i,k)-ini(i,k)
интересно, каким образом? вы в цикле получаете новый массив vector=fin-ini.
и еще: а вы вообще по условию
Цитата Сообщение от Danaida1990 Посмотреть сообщение
do 652 while (om_ > 0.01)
попадаете? не видно, что до этого длина вектора как-то вычисляется..

Не по теме:

без программы целиком какое-то гадание на кофейной гуще получается... :facepalm:

1
Danaida1990
0 / 0 / 0
Регистрация: 27.02.2014
Сообщений: 56
23.10.2014, 13:17  [ТС] 14
Т.е. я правильно понимаю, что мне в цикле нужно задать массив ini? Длина вектора действительно вычисляется в одной из последних строк цикла и до этого нигде не фигурирует, om_ выступает как бы к качестве фильтра (т.е. мне нужно присвоить om_ какое-то значение?)

Не по теме:

я это понимаю программа большая (1500 строк)...

0
Krasme
3417 / 2731 / 968
Регистрация: 02.02.2014
Сообщений: 7,473
23.10.2014, 13:21 15
Цитата Сообщение от Danaida1990 Посмотреть сообщение
om_ = sqrt(om(1)**2 + om(2)**2 + om(3)**2)
попробуйте эту строку продублировать перед
Цитата Сообщение от Danaida1990 Посмотреть сообщение
do 652 while (om_ > 0.01)
если вектор om где-то раньше у вас считается.

в противном случае, напишите просто om_=1, чтобы войти в цикл while.
1
Danaida1990
0 / 0 / 0
Регистрация: 27.02.2014
Сообщений: 56
23.10.2014, 13:25  [ТС] 16
Сейчас попробовала задать om_ = 1 и всё получилось, огромное Вам спасибо за помощь!
0
Krasme
23.10.2014, 13:43     Цикл do while
  #17

Не по теме:

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

0
23.10.2014, 13:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2014, 13:43
Привет! Вот еще темы с ответами:

Почему если условие входа в цикл не выполняется, функция заново входит в цикл
Сам код: private void traverse_node(TreeControlItem node) { ...

Алгоритм с применением вложенных базовых структур «цикл с предусловием» или «цикл с постусловием»
Разработать алгоритм с применением вложенных базовых структур «цикл с...

Цикл: Как грамотно организовать цикл с получением количества верных и неверных ответов?
Доброго времени суток, товарищи. Вот есть у меня два рандомно генерируемых...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru