Показать полную графическую версию : помогите сделать блок-схему
winston07
01-12-2013, 19:59
ещё вот вопрос как бы к этому примеру подойти?
http://saveimg.ru/thumbnails/01-12-13/fc9c41ca1cbf773b491a77531df96049.jpg (http://saveimg.ru/show-image.php?id=f9698b66d6039b94a68aede4e2391e23)
AMDBulldozer
01-12-2013, 20:13
как бы к этому примеру подойти? »
Нарисуйте блок-схему для такого псевдокода:
int i, n, k=-1;
float Y, X0, deltaX[n];
Y=X0;
for (i=0;i<n;i++) {
Y += k * deltaX[i];
k *= -1;
}
Это при условии, что индекс начинается с 1. Если с нуля, то k=1;
Это лет 30 назад можно было рассуждать об ошибках округления. »
Ух ты какие мы грамотные…:) А вот “невежды” по вашему на DxDy по сию пору рассуждают --- лезут в дебри относительно теории погрешностей и машинно-зависимые константы упоминают...
Упрекните и их в невежестве, только учтите что там далеко не студенты…
Всё работало отлично, пока не пришлось работать с физическими величинами в мелком масштабе (порядок величины в единицах СИ — ). Такие переменные пришлось сравнивать с нулём по-другому
сравнение double в c++ (http://dxdy.ru/topic52329.html)
PS Я такой Ваш ответ примерно и предполагал... Хотя в принципе мы говорим примерно об одном и том же, но на разных языках. Вот только контекст не наработан. А блок-схемы я не признаю (уже писал об этом...). --- Уж если припрёт, то буду рисовать графы с вершинами и рёбрами и для себя чёртиков на полях и в скобках рисовать…
PPS Надеюсь, что с моим основным тезисом, что "тут очень не просто..." Вы согласитеь...
winston07
01-12-2013, 20:57
вот,что-то такое вышло
http://saveimg.ru/thumbnails/01-12-13/70092ef48397be4731c456bd7888d783.jpg (http://saveimg.ru/show-image.php?id=fff87e66113667a623eba77bf50ac558)
AMDBulldozer
01-12-2013, 21:13
winston07, неверно.
Переменная i инициализируется один раз. А не каждый раз в цикле. Иначе у Вас вообще никогда цикл не завершится. В цикле Y суммируется с самим Y и элементом массива дельта х. Печать Y производится после выхода из цикла, а не каждый раз в его теле.
Примерно так:
i=0; k=-1;
|
Y=X0;
| да
|<---------------------
Y=Y+k*DeltaX[i]; |
k~=1; |
i=i+1; |
| |
i<n?------------------
| нет
печать Y
|
конец
Проверку i<n можно поставить в начале. В конец я её перенес, чтобы проще было рисовать.
winston07
01-12-2013, 21:26
AMDBulldozer,
http://saveimg.ru/thumbnails/01-12-13/e122a3808e107c8642280ef80a896b26.jpg (http://saveimg.ru/show-image.php?id=715677dee2988779001a6589300952c0)
AMDBulldozer
01-12-2013, 21:39
winston07, нет, простите. Это не имеет ничего общего с тем, что я нарисовал. Попробуйте просто нарисовать схему из моего предыдущего сообщения.
winston07
01-12-2013, 21:50
AMDBulldozer,
http://saveimg.ru/thumbnails/01-12-13/eed4758112b44c2ed4c4cc56dcf97b58.jpg (http://saveimg.ru/show-image.php?id=cee27aec55ad13c16db40548d7eb7e47)
AMDBulldozer
01-12-2013, 22:04
winston07, да, переменную k можно вообще убрать. Я её по привычке запихнул.
Но! Что у вас неправильно:
1. Печать Y производится единственный раз после перехода по ветке "нет". У Вас она стоит в ветке "да".
2. k можете вообще убрать - у Вас там возведение в степень, поэтому промежуточная переменная не нужна
3. У Вас написано "Y=X+(-1)^i+DeltaX". Тут сразу две ошибки:
3.1 Y надо суммировать не с X, а с самим собой - значение этой переменной накапливается в цикле. А у Вас она каждый раз инициализируется заново. То есть "Y=Y+...", а не "Y=X+..."
3.2 Я так понял, что DeltaX - это массив. В Вашей задаче у него есть индекс "i". В то время как у переменной "y" его нет. То есть надо просуммировать дельта x при всех заданных i. Тогда на схеме должно быть тоже "дельта x" с индексом i. А у Вас этого индекса нет.
Итого получается: "Y=Y+(-1)^i+DeltaX[i]".
Эта схема соответствует такой формуле:
winston07
01-12-2013, 22:15
AMDBulldozer, вот так должно быть?
http://saveimg.ru/thumbnails/01-12-13/f5499b58b3f947e4ed170ff1cbe532f6.jpg (http://saveimg.ru/show-image.php?id=ffa5e50aad8da8fcf0407a03b515f0ad)
AMDBulldozer
01-12-2013, 22:17
winston07, да, только в самом начале рядом с Y=X0 поставьте еще I=0, а то у Вас эта переменная не инициализирована.
Ай, нет!!! Не обратил внимания - от прямоугольника "I=I+1" срелка должна идти не вниз на выход, а опять вверх, перед сравнением.
winston07
01-12-2013, 22:29
AMDBulldozer, вот так
http://saveimg.ru/thumbnails/01-12-13/db819ac00ec4ff79ddfd6a3123db00d5.jpg (http://saveimg.ru/show-image.php?id=36fb62e3b9f1f73968c3cd798916c9ad)
AMDBulldozer
01-12-2013, 22:36
winston07, ну вот уже ПОЧТИ правильно!!! Только I=0 должно быть не в сравнении, а перед ним. Там, где Y=X0. И на всякий случай советую сохранить прикрепленный файл с формулой http://forum.oszone.net/attachment.php?attachmentid=107456&d=1385923271
В матанализе в таком контексте использование индекса "i" означает суммирование по всем его значениям. Если имеется в виду какое-то конкретое значение индекса, он указывается и в левой части равенста тоже: "y i-тое". Но поскольку я не телепат и не могу думать за автора задания, надо на всякий случай иметь с собой формулу по которой Вы составили блок-схему.
Если выяснится, что автор имел в виду более простой вариант - не суммирование, а значение при конкретном i, Вы всё равно будете в выигрыше, поскольку получится, что решили более сложную задачу.
winston07
01-12-2013, 22:39
все всем спасибо большое! :)
winston07
01-12-2013, 22:49
http://saveimg.ru/thumbnails/01-12-13/a8e8889e5b874f138440b994265b838c.jpg (http://saveimg.ru/show-image.php?id=9b7538a9fbfff2df2a1c506a1ab80d1d)
winston07
01-12-2013, 22:54
а все понял,спасибо большое :)
AMDBulldozer
02-12-2013, 05:35
Блин. Что-то сейчас мне начало казаться, что я всё-таки неправильно понял задачу и что надо было не вычислять Y в цикле, а выполнить самое простое и тупое вычисление y по предложенной формуле. А подвох был в том, что по условиям задачи i должно быть целым числом и именно на это его и надо было проверять: "(int)i == i".
Это подсказали даже два раза: когда в формуле i использовался в качестве показателя степени (если i действительное число, то (-1)^i комплексное) и когда i выступал в виде индекса (индекс должен быть целым).
Но эти два флудера в ветке уже успели настолько достать своими повторениями о "невозможножности равенства двух действительных чисел", что у меня совсем вылетело из головы, что числа в условии задачи типа, в общем случае, не имеют и что могут быть специально сформулированы условия при которых надо проверять наличие исключений из этого общего правила.
Черт, они даже меня сумели в результате запутать. Я расстроен.
winston07, Нарисуй, что получилось. У меня есть подозрение, что ты не просёк фишку с блок-схемами и у тебя есть ошибки в схемах.
winston07
02-12-2013, 16:22
pva, вот, если есть возможность пожалуйста исправте если есть ошибки на самой картинке и скиньте
http://saveimg.ru/thumbnails/02-12-13/ff24ea019144ee7637aef7704c384e46.jpg (http://saveimg.ru/show-image.php?id=f3f00edb3ad71b7f56b3a47363926edd)
http://saveimg.ru/thumbnails/02-12-13/defffdb306b59cbc91e73b022dba0409.jpg (http://saveimg.ru/show-image.php?id=c41b1717dd6f04f1740fc065c0cb2238)
http://saveimg.ru/thumbnails/01-12-13/12d820976a7fc155de6106c09b3b6d00.jpg (http://saveimg.ru/show-image.php?id=b710427c63f0cd96d2565b6af1f2c3ec)
http://saveimg.ru/thumbnails/01-12-13/db819ac00ec4ff79ddfd6a3123db00d5.jpg (http://saveimg.ru/show-image.php?id=36fb62e3b9f1f73968c3cd798916c9ad)
winston07, Скидывать мне пока некогда...
Но вот смотрите --- мы здесь с коллегами много нафлудили про ошибки и в часности про абсолютные/относительные ошибки вычилений. Но какой либо .оценки их я не вижу...
Второе, что бросается в глаза --- алгоритм ветвится и просто идёт на выход... Это как в песок --- ни сообщений ни кодов возврата нет... Такого точно быть не должно...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.