Функция f(x,y)=sqrt((1+cos(2*x))/y); Интервал [pi/4;pi] Начальное условие y(a)=1 Пишет ошибка в 44 строке.
program kursovaya_Runge_Kutt_Eiler; uses crt,graphABC; const h=0.001; var i,j,p:integer; n,q:real; s:string; < Строка >r1,r2,r3,r4,yi,xi,dy,xm,ym:real; a:array[0..1000] of real; b:array[0..1000] of real; a1:array[0..1000] of real; b1:array[0..1000] of real; function f(x,y:real):real; begin f:=sqrt((1+cos(2*x))/y); end; begin clrscr; xi:=Pi/4; yi:=1; i:=0; j:=0; xm:=Pi/4; ym:=1; q:=0.4; writeln(‘Метод Рунге-Кутты:’); writeln(‘№=’,i, ‘ | ‘,’x=’,xi:5:3, ‘ | ‘,’y=’,yi:5:3); repeat r1:=h*f(xi,yi); r2:=h*f(xi+h/2,yi+r1/2); r3:=h*f(xi+h/2,yi+r2/2); r4:=h*f(xi+h,yi+r3); dy:=(r1+2*r2+2*r3+r4)/6; yi:=yi+dy; xi:=xi+h; a[i]:=xi; b[i]:=yi; i:=i+1; if i mod 100=0 then < Вывод результатов >writeln(‘№=’,i, ‘ | ‘,’x=’,xi:5:3, ‘ | ‘,’y=’,yi:5:3); until xi>Pi; readln; writeln(‘Метод Эйлера:’); writeln(‘№=’,j, ‘ | ‘,’x=’,xm:5:3, ‘ | ‘,’y=’,ym:5:3); repeat ym:=ym+h*f(xm,ym); xm:=xm+h; a1[j]:=xm; b1[j]:=ym; j:=j+1; if j mod 100=0 then < Вывод результатов >writeln(‘№=’,j, ‘ | ‘,’x=’,xm:5:3, ‘ | ‘,’y=’,ym:5:3); until xm>Pi; < Построение графика функции >SetWindowHeight(700); SetWindowWidth(900); SetPenColor(clBlack); SetPenWidth(2); line(180,75,900,75); line(220,0,220,700); line(220,0,220-10,10); line(220,0,220+10,10); line(900,75,900-10,75-10); line(900,75,900-10,75+10); for p:=1 to 8 do begin line(220+75*p,70,220+75*p,80); line(215,75+75*p,225,75+75*p); end; TextOut(205,80,’0′); TextOut(880,55,’x’); TextOut(225,15,’y’); for p:=1 to 8 do begin str(q:4:1,s); TextOut(220+75*p,55,s); q:=q+0.4; end; q:=-0.8; for p:=1 to 8 do begin str(q:4:1,s); TextOut(180,750-75*p,s); q:=q+0.1; end; for p:=1 to 8 do begin SetPenColor(clGreen); SetPenWidth(1); line(200,75+75*p,900,75+75*p); line(220+75*p,0,220+75*p,700); end; while p begin n:=750; Setpixel(round(a[p]*(n/4)+220),round(abs(b[p]*n)+77),clRed); Setpixel(round(a1[p]*(n/4)+220),round(abs(b1[p]*n)+77),clBlue); p:=p+1; end; readln; end.
Код к задаче: «Найти ошибку в программе и исправить её»
Листинг программы
Как исправить ошибку с условием в Pascal.
program kursovaya_Runge_Kutt_Eiler; uses crt,graphABC; const h=3*pi/4000; var i,j,p:integer; n,q:real; s:string; < Строка >r1,r2,r3,r4,yi,xi,dy,xm,ym:real; a:array[0..1000] of real; b:array[0..1000] of real; a1:array[0..1000] of real; b1:array[0..1000] of real; function f(x,y:real):real; begin f:=sqrt((1+cos(2*x))/y); end; begin clrscr; xi:=Pi/4; yi:=1; i:=0; j:=0; xm:=Pi/4; ym:=1; q:=0.5; writeln(‘Метод Рунге-Кутты:’); writeln(‘№=’,i, ‘ | ‘,’x=’,xi:5:3, ‘ | ‘,’y=’,yi:5:3); repeat r1:=h*f(xi,yi); r2:=h*f(xi+h/2,yi+r1/2); r3:=h*f(xi+h/2,yi+r2/2); r4:=h*f(xi+h,yi+r3); dy:=(r1+2*r2+2*r3+r4)/6; yi:=yi+dy; xi:=xi+h; a[i]:=xi; b[i]:=yi; i:=i+1; if i mod 100=0 then < Вывод результатов >writeln(‘№=’,i/100, ‘ | ‘,’x=’,xi:5:3, ‘ | ‘,’y=’,yi:5:3); until xi>Pi; readln; writeln(‘Метод Эйлера:’); writeln(‘№=’,j/100, ‘ | ‘,’x=’,xm:5:3, ‘ | ‘,’y=’,ym:5:3); repeat ym:=ym+h*f(xm,ym); xm:=xm+h; a1[j]:=xm; b1[j]:=ym; j:=j+1; if j mod 100=0 then < Вывод результатов >writeln(‘№=’,j/100, ‘ | ‘,’x=’,xm:5:3, ‘ | ‘,’y=’,ym:5:3); until xm>Pi; < Построение графика функции >SetWindowHeight(700); SetWindowWidth(900); SetPenColor(clBlack); SetPenWidth(2); line(180,600,900,600); line(220,0,220,700); line(220,0,220-10,10); line(220,0,220+10,10); line(900,600,900-10,600-10); line(900,600,900-10,600+10); for p:=1 to 7 do begin line(220+75*p,595,220+75*p,605); line(215,0+75*p,225,0+75*p); end; TextOut(205,580,’0′); TextOut(880,580,’x’); TextOut(225,15,’y’); for p:=1 to 7 do begin str(q:4:1,s); TextOut(220+75*p,580,s); q:=q+0.5; end; q:=0.5; for p:=1 to 7 do begin str(q:4:1,s); TextOut(180,595-75*p,s); q:=q+0.5; end; for p:=1 to 8 do begin SetPenColor(clGreen); SetPenWidth(1); line(200,75+75*p,900,75+75*p); line(220+75*p,0,220+75*p,700); end; while p begin n:=175; Setpixel(round(a[p]*(n/4)+700),round(abs(b[p]*n)+77),clRed); Setpixel(round(a1[p]*(n/4)+700),round(abs(b1[p]*n)+77),clBlue); p:=p+1; end; readln; end.
Источник: studassistent.ru
Pascal. Урок 1.3 Поиск ошибок
Найти ошибку в паскаль программе
Задача: Файл input.dat содержит несколько строк текста. Слова в тексте могут
разделяться пробелами и знаками препинания. Переписать текст в файл
output.dat, удалив из него все слова, начинающиеся и заканчивающиеся
одной и той же буквой.
Сама программа ошибки не выдает, НО не выводит то, что содержиться во втором файле(если поменять условие в function check_word_has_duplicates, то все ок). ПОМОГИТЕ! Преподаватель сказал разбираться самому, сижу 3 день. Думаю ошибка в функции function check_word_has_duplicates. Делал по примеру похожей программы, которую нашел в интернете, немного поменял и ничего не работает.
const letters = [‘а’,’о’,’у’,’ы’,’э’,’я’,’ю’,’ё’,’и’,’е’, ‘А’,’О’,’У’,’Ы’,’Э’,’Я’,’Ё’,’Ю’,’И’,’Е’, ‘A’,’E’,’I’,’O’,’U’,’Y’, ‘y’,’e’,’u’,’i’,’o’,’a’, ‘й’, ‘ц’, ‘к’, ‘н’, ‘г’, ‘ш’, ‘щ’, ‘з’, ‘ф’, ‘в’, ‘х’, ‘п’, ‘р’, ‘л’, ‘д’, ‘ж’, ‘ч’, ‘с’, ‘м’, ‘т’, ‘б’, ‘Й’, ‘Ц’, ‘К’, ‘Н’, ‘Г’, ‘Ш’, ‘Щ’, ‘З’, ‘Х’, ‘Ф’, ‘В’, ‘П’, ‘Р’, ‘Л’, ‘Д’, ‘Ж’, ‘Ч’, ‘С’, ‘М’, ‘Т’, ‘Б’, ‘Q’, ‘W’, ‘R’, ‘T’, ‘P’, ‘S’, ‘D’, ‘F’, ‘G’, ‘H’, ‘J’, ‘K’, ‘L’, ‘Z’, ‘X’, ‘C’, ‘V’, ‘B’, ‘N’, ‘M’, ‘q’, ‘w’, ‘r’, ‘t’, ‘p’, ‘s’, ‘d’, ‘f’, ‘g’, ‘h’, ‘j’, ‘k’, ‘l’, ‘z’, ‘x’, ‘c’, ‘v’, ‘b’, ‘n’, ‘m’]; punc = [‘.’, ‘,’, ‘ ‘, ‘-‘, ‘;’, ‘:’, ‘?’]; function check_word_has_duplicates(OneWord: string): boolean; begin check_word_has_duplicates := false; for var i := 1 to length(OneWord) — 1 do begin if (OneWord in letters) and (OneWord[1]<>OneWord[length(OneWord)]) then begin check_word_has_duplicates := true; break end end; end; function find_word(s: string; i: integer): string; var OneWord: string; begin OneWord := »; while (i
Последний раз редактировалось Dima4565; 22.09.2020 в 18:14 .
Регистрация: 23.10.2010
Сообщений: 2,237
function check_word_has_duplicates(OneWord: string): boolean; begin check_word_has_duplicates := false; for var i := 1 to length(OneWord) — 1 do begin if (OneWord in letters) and (OneWord[1]<>OneWord[length(OneWord)]) then begin check_word_has_duplicates := true; break end end; end;
Покажите мне, где в теле цикла используется переменная i?
Цикл здесь не нужен.
Достаточно оператора if . else .
2. В условии сказано, что «слова». Нет смысла проверять символ слова на вхождение в множество.
3.
function find_word(s: string; i: integer): string;
Вы ожидаете, что эта функция вернёт вам i. Не знаю как в вашем Паскале, но в нормальном Паскале это не произойдёт. Параметр задан неверно:
function find_word(s: string; var i: integer): string;
В нормальном — так.
Попробуйте исправить, для начала, это.
PS: Дальше пока не смотрел.
Источник: www.programmersforum.ru
Поиск ошибок в программе. Часть 2
Последовательно выполните следующее.
1. Напишите, что выведет эта программа при вводе числа 128.
2. Приведите пример такого трёхзначного числа, при вводе которого программа выдаёт верный ответ.
3. Найдите все ошибки в этой программе (их может быть одна или несколько). Известно, что каждая ошибка затрагивает только одну строку и может быть исправлена без изменения других строк. Для каждой ошибки:
1) выпишите строку, в которой сделана ошибка;
2) укажите, как исправить ошибку, т.е. приведите правильный вариант строки.
Достаточно указать ошибки и способ их исправления для одного языка программирования.
Обратите внимание, что требуется найти ошибки в имеющейся программе, а не написать свою, возможно, использующую другой алгоритм решения. Исправление ошибки должно затрагивать только строку, в которой находится ошибка.
- Решение: Для решения таких заданий очень важно понимать, как должна выглядеть правильно написанная программа. Давайте разберёмся.В программу вводится число N. Далее проверяется каждый разряд числа, и если он кратен 2, то значение переменной sum должно увеличиваться на 1. Выполним задания последовательно. 1. Напишите, что выведет эта программа при вводе числа 128. Переменная sum изначально равна 1. Рассмотрим каждый повтор цикла: 1 повтор цикла: digit := n mod 10 = 128 mod 10 = 8 условие digit mod 2 = 0 выполняется, к переменной sum прибавляется значение digit, то есть sum := 1 + 8 = 9 N := N div 10 = 128 div 10 = 12 2 повтор цикла: digit := n mod 10 = 12 mod 10 = 2 условие digit mod 2 = 0 выполняется, к переменной sum прибавляется значение digit, то есть sum := 9+2 = 11 N := N div 10 = 12 div 10 = 1 3 повтор цикла: digit := n mod 10 = 1 mod 10 = 1 условие digit mod 2 = 0 не выполняется N := N div 10 = 1 div 10 = 0 Цикл завершен, на экран вывелось значение sum, то есть 11. Ответ: 112. Приведите пример такого трёхзначного числа, при вводе которого программа выдаёт верный ответ. Разберемся, как на самом деле работает программа. Во-первых, переменная sum изначально равна 1, во-вторых, к sum прибавляются все четные цифры числа. То есть мы должны найти такое число, количество четных разрядов которого равно сумме четных разрядов +1. Казалось бы, задача невыполнимая, но не стоит забывать, что цифра 0 четна, и мы можем её использовать в числе. Нам нужно трёхзначное число, значит максимальный результат, который может быть выведен при его вводе — 3, то есть все разряды должны быть четные. Для этого отлично подходит число 200, так как 1+2+0+0 = 3, и число 200 содержит ровно три четных разряда. Ответ: 2003. Найдите все ошибки в этой программе. Так как мы ищем количество, то переменная sum изначально должна быть равна 0, а не 1. То есть строку sum := 1; нужно заменить на sum := 0; Так как мы ищем количество, то каждый раз, когда выполняется условие, переменная должна увеличиваться на 1, а не на разряд числа. То есть строку sum := sum + digit; нужно заменить на sum := sum + 1; Ответ:
sum := 1; ===> sum := 0;sum := sum + digit;===> sum := sum + 1;
Источник: egeikt.wordpress.com