Students Опубликовано 3 ноября, 2008 Жалоба Поделиться Опубликовано 3 ноября, 2008 Помогите составить алгоритм, что то я совсем не попал в эту тему ( Задание: не нашел кнопку редактировать сообщение Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 3 ноября, 2008 Жалоба Поделиться Опубликовано 3 ноября, 2008 (изменено) Students: var n:integer; z,e,p,s:real;beginWrite('z='); Readln(z); Write('e='); ReadLn(e); WriteLn(' n p s');n:=0; p:=z; s:=p;repeat Writeln(n:3,p:10:5,s:10:5); n:=n+1; p:=-p*z*z/(2*n)/(2*n+1); s:=s+p until abs(p)<=e;ReadLnend. P.S. Надо было попадать в тему Заказы "Сделайте все за меня". Там все такие задачки. Изменено 3 ноября, 2008 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
Students Опубликовано 4 ноября, 2008 Автор Жалоба Поделиться Опубликовано 4 ноября, 2008 Извиняюсь, не заметил тему. я в паскале не очень силен :D мне бы алгоритм, как и что мы делаем, что бы просчитать все это, или хотябы код проги на Си. спасибо Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 4 ноября, 2008 Жалоба Поделиться Опубликовано 4 ноября, 2008 Паскаль и есть язык для записи алгоритмов. Он возник как некоторое расширение (в основном средствами ввода и вывода) из Алгола (algorithmic language), который был разработан специально для публикации алгоритмов. Переписать текст на C, естественно, несложно, но C - как раз язык, более близкий к машинному, чем к записи алгоритмов. #include <stdio.h>#include <math.h>int main(){int n; float z,e,p,s;printf("z="); scanf("%f",&z); printf("e="); scanf("%f",&e); printf("\n n p s\n"); n=0; s=p=z;do {printf("%3i %10.5f %10.5f\n",n,p,s); n++; s+=p=-p*z*z/(2*n)/(2*n+1);} while (fabs(p)>e);getchar(); getchar(); return 0;} Ссылка на комментарий Поделиться на другие сайты Поделиться
Students Опубликовано 6 ноября, 2008 Автор Жалоба Поделиться Опубликовано 6 ноября, 2008 мне в рограмме надо использовать цикл с предусловием а не с постуслоувием вот я переделал #include <stdio.h> #include <math.h> #include <conio.h> main () { int n=0; float eps,z,p,s; printf("z= e="); scanf("%f%f",&z,&eps); s=p=z; while(fabs(p)>e) { p=-p*z*z/(2*n)/(2*n+1); s+=p; n++; } printf("s=%8.5f n=%3i; eps=%8.4f",s,n,eps); getch(); } но прога не работает, просто виснет и все ( Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 6 ноября, 2008 Жалоба Поделиться Опубликовано 6 ноября, 2008 Ну, во-первых, подозреваю, что ты привел неточный текст проги. Эта прога зависнуть не может :dontgetit:, поскольку не запустится, пока ты e не переименуешь в eps. Во вторых, когда она запустится, первое, что ты делаешь в цикле, это делишь p на 0, поскольку при первом выполнении цикла n равно 0. Соответственно ничего хорошего ожидать не приходится... Ссылка на комментарий Поделиться на другие сайты Поделиться
Students Опубликовано 6 ноября, 2008 Автор Жалоба Поделиться Опубликовано 6 ноября, 2008 ну во первых я просто опечатался хотел написать eps а написал е, просто у меня на форуме нет кнопки редактировать во вторых, пробовал присовит н константу1 без результатно нткак не пойму в чом дело вроде все должно выполнятся а не выполняеся ( короче все разобрался в чом проблема все решил, Троль спасибо за помощь =) наконецто разобрался в циклах с итерационным методом вычесляния Ссылка на комментарий Поделиться на другие сайты Поделиться
Students Опубликовано 13 ноября, 2008 Автор Жалоба Поделиться Опубликовано 13 ноября, 2008 тут возник такой вопрос... например при большом значении Z выводится неправельный результат например если Z>20 то функция Sin(z) находится неправельно, скажите что нужно сделать что бы sin(z) находился верно при больших значения Z. :blink: Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 13 ноября, 2008 Жалоба Поделиться Опубликовано 13 ноября, 2008 Students: У каждой программы свои ограничения по точности результатов и диапазону вводимых данных, в данном случае ты выходишь за эти ограничения. Конкретно, для вычисления суммы ряда при аргументе 20 не хватает точности float, промежуточные члены ряда слишком велики. Если заменить в программе тип представления чисел с float на double (при этом также надо заменить в scanf и printf формат ввода-вывода с f на lf), то при 20 или даже при 30 получится правильный результат. Однако уже при sin(40), к примеру, точности double тоже нехватит. А чтобы правильный результат получался практически в любом диапазоне значений аргумента синуса, следует предварительно привести аргумент к более ограниченному диапазону, для чего нужно в исходной (можно и в откорректированной на double программе тоже) заменить оператор s=p=z; на s=p=z=fmod(z,2*M_PI); На самом деле в условии должно было быть, для каких значений аргумента и с какой точностью должен считаться синус. Компьютер работает не с числами, а с моделями чисел с ограниченными точностью и диапазоном, и если этого не учитывать, то часто получится чепуха. Чтобы программировать математические вычисления на компьютере, надо знать не только математику и язык программирования, но и вычислительную математику и соответствующие алгоритмы, обходящие эти проблемы. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти