Помогите найти ошибки
Вернули к.р. по программированию. Вот делаю работунад ошибками, но с некоторыми задачками разобраться не могу, не понимаю почему они неправильны решены.
Просьба укажите мне на мои ошибки.
За ранее СПАСИБО.
Задание1
b=(x-y)(sin2Z+tg2Z)
x=17,421
y=10,365
z=0,828
Program Exp;
var x, y, Z, B: real;
x:=17.421; y:= 10.365; Z=0.828;
B:=abs (x-y)* ((sin(Z)*sin(Z)*sin(Z))/(Sin(Z)/cos(Z)));
writeln (‘B=’, B:15:4);
end.
_________________________________________________
Задание 2
A= X≥Z X=0,625
y=10,365; Z=0,828
B=sin2Z+tg(x+y), X<Z X=17,421
Program Exp2;
Var X,Y,Z,A,B: real;
Begin
write (‘input X,Y,Z:’);
if x > =Z then
begin
x:=0.625; y:=10.365; Z:=0.828;
A:=(sqrt y + (y+1)* (y+1)* (y+1));
writeln (‘A=’, A:15:4);
end
else
iFX<Z then
begin
X:=17.421; Y:=10.365; Z=0.828;
B:= (sin(x) * sin(x) *Z)+(sin(x)/cos(x))+(sin(y)/cos(y));
writeln (‘B=’, B:15:4);
end;
end.
_________________________________________________
3. Задание
Для одномерного массива Х вещественного типа (массив размерностью N<10 задается студентом) и при А=7 необходимо выполнить задание и вывести на экран полученные результаты.
Найти номер элемента с максимальным значением
Program Mas;
type mass=array <0...9> of real;
var
col_vo: integer;
temp, namb: real;
i: integer;
begin
writeln (‘input mas:’);
for i:=0 to 9 do
begin
readln (mass);
end;
temp:=0;
for i=0 to 9 do
degin
if (mass > temp) then temp:= mass ;
end;
writeln(‘max element of mas;’ ,temp);
readln ();
end.
Задание1
b=(x-y)(sin2Z+tg2Z)
x=17,421
y=10,365
z=0,828
Program Exp;
var x, y, Z, B: real;
x:=17.421; y:= 10.365; Z=0.828;
B:=abs (x-y)* ((sin(Z)*sin(Z)*sin(Z))/(Sin(Z)/cos(Z)));
writeln (‘B=’, B:15:4);
end.
Ошибки в Твоем примере: нету BEGIN, формула у тебя получилась B = |x-y|*(sin(z)^3 / tg(z).
CONST
x = 17.421;
y = 10.365;
z = 0.828;
VAR
b:real;
BEGIN
b := (x-y)*(sin(2*z) + sin(2*z)/cos(2*z));
Writeln('b=', b:15:4);
END.
P.S. не помню только правильно ли то что sin(2z) = cos(2z)/sin(2z)
3. Задание
Для одномерного массива Х вещественного типа (массив размерностью N<10 задается студентом) и при А=7 необходимо выполнить задание и вывести на экран полученные результаты.
Найти номер элемента с максимальным значением
Program Mas;
type mass=array <0...9> of real;
var
col_vo: integer;
temp, namb: real;
i: integer;
begin
writeln (‘input mas:’);
for i:=0 to 9 do
begin
readln (mass);
end;
temp:=0;
for i=0 to 9 do
degin
if (mass > temp) then temp:= mass ;
end;
writeln(‘max element of mas;’ ,temp);
readln ();
end.
Ошибки: <0...9> - на сколько помню в паскале такими скобками не оперируют.
type mass=array <0...9> of real; - тут Ты только описал тип mass, но не где не сделал переменную этого типа.
temp:=0; - ты сразу присваиваеш эталонному значению 0. И потом проверяеш его со всеми элементами. Но это не правильно, ведь элементы массива могут оказаться отрицательными числами и тогда програма выдаст неправильный результат ( 0 )
VAR
X:ARRAY[1..10] of real;
Pos, i, N:integer;
Max:real;
BEGIN
Write('N=');
Readln(N);
for i:=1 to N do begin
Write('X[',i,'] = ');
Readln(X);
end;
Max := X[1];
Pos := 1;
for i:=2 to N do begin
if(X > Max) then begin
Max := X;
Pos : = i;
end;
end;
Writeln('Max = ', Max, ' Pos = ', Pos);
END.
При всем желании не смог сформулировать задачу. Условие корявое. Реализация вообще как бы к другому условию. Вобщем задачку сформулируй грамотно.
Задача 2:
При всем желании не смог сформулировать задачу. Условие корявое. Реализация вообще как бы к другому условию. Вобщем задачку сформулируй грамотно.
Matush спасибо, с первой задачей я уже вроде разобралась сама.
2 задача дается с таким условием.
пытаюсь исправить...
Задается одномерный массив из 18 элементов. Требуется определить номер элемента, наименее отклоняющегося от числа 5, а также номер элемента наименее отклоняющегося т числа 10.
program prim;
Type=array [0...17] of integer;
var
temp, temp1,rez_a,rez_b,pos_b,pos_a: integer;
procedure modul (matrix: c);
begin
temp:=20;
temp1:=20;
writeln(‘input mas c:’);
for x:= 0 to 17 do
readln (matrix [x]);
for x:=0 to 17 do
begin
rez_a: abs(5 - matrix[x]);
if rez_a<temp then
begin
temp:=rez_a; pos_a:=x;
end;
rez_b=abs(10-matrix[x]);
if rez_b<temp1 then
begin
temp1:= rez_b; pos_b:=x;
end;
end;
writeln (‘positsion for 5:’, pos_a+1);
writeln (‘positsion for 10:’, pos_b+1);
end.
__________________________________________________
Дана матрица из 6 строк и 5 столбцов. Для каждой строки вводится номер элемента, на который необходимо разделить элементы этой строки. Полученную матрицу напечатать. Исключить деление на ноль.
Program X;
uses forms;
var
a: array [1...6, 1...5] of real;
k,i,j: integer; z: real;
begin
writeln (‘Vvedite elementi matrici 6x5’);
for i:=1 to 6 do
for j:= 1 to 5 do
real (a[i,j]);
for i:=1 to 6 do
begin (‘Vvedite N elementa delenia dla ‘,i,’ stroki);
read (k);
for j:=1 to 5 do
if a [i,k]<>0 then
a [i,j]:=a [i,j]/a[i,k]
else
a[i,j]:=0;
end;
for i:=1 to 6do
begin
writeln (‘’);
for j:= 1to 5 do
write (‘ ’, a [i,j]);
end;
readln; readln;
end.
Matush спасибо, с первой задачей я уже вроде разобралась сама.
2 задача дается с таким условием.
Ну ежеле с таким, тогда попробую ее понять:
A= X≥Z X=0,625
y=10,365; Z=0,828
B=sin2Z+tg(x+y), X<Z X=17,421
эту тексту я понимаю так:
если X>=Z тогда X=0,625
y=10,365; Z=0,828 в другом случае X=17,421.
Откуда берутся X и Z? очевидно вводятся. А Y? При выполнении условия он станет 10.365, а при не выполнении? Опять же с потолка?
Смотрим на Твой код (если не обращать внимания на ошибки):
считываем X, Y, Z если X>=Z тогда делаем такое:
x=0.625; y=10.365; Z=0.828;
a = корень(y) + (y+1)^3;
если же X<Z тогда:
X=17.421; Y=10.365; Z=0.828;
B= sin(x)^2 * Z + tg(x)+tg(y);
В Твоем решении просматривается такое условие:
y=10.365; Z=0.828;
X≥Z X=0,625 A=sqrt(y)+(y+1)^3 // X тогда не нужен
X<Z X=17,421 B=sin2Z+tg(x+y)
Тогда решение будет таким:
CONST
y = 10.365;
z = 0.828;
VAR
A, B, x:real;
BEGIN
Write('x=');
Readln(x);
if(x>=z) then begin
A := sqrt(y)+(y+1)*(y+1)*(y+1);
Writeln('A=',A);
end else begin
x := 17.421;
B := sin(2*z)+sin(x+y)/cos(x+y);
Writeln('B=',B);
end;
END.
Вот еще 2 задачи, которые отказались засчитать. Главное, что поставили минус, а где и именно какие ошибки я совершила не указали...
пытаюсь исправить...
Задается одномерный массив из 18 элементов. Требуется определить номер элемента, наименее отклоняющегося от числа 5, а также номер элемента наименее отклоняющегося т числа 10.
begin
temp:=20;
for x:=0 to 17 do
begin
rez_a: abs(5 - matrix[x]);
if rez_a<temp then
begin
temp:=rez_a; pos_a:=x;
end;
end;
writeln (‘positsion for 5:’, pos_a+1);
end.
я чуть чуть сократил текст первой задачи, чтобы яснее был разбор алгоритма. как я понял, ты считаешь отклонение элемента х от 5 и сравниваешь его с эталонным значение temp. а откуда взялось temp = 20? за это и минус. намек ясен? или пояснить?
Задается одномерный массив из 18 элементов. Требуется определить номер элемента, наименее отклоняющегося от числа 5, а также номер элемента наименее отклоняющегося т числа 10.
Type=array [0...17] of integer; {неверно}
var
temp, temp1,rez_a,rez_b,pos_b,pos_a: integer;
procedure modul (matrix: c); {неверно, тут ты принимаеш в качестве параметра в переменную c типа matrix, но ведь такого типа нет}
begin
{тут ты изначално береш отклонение от 5 и от 10 равное 20. Так неправильно, ведь отклонение может быть и больше}
temp:=20;
temp1:=20;
writeln(‘input mas c:’);
for x:= 0 to 17 do
readln (matrix [x]);{ну, ок будем считать что matrix - непонятно откуда взялся и является массивом}
for x:=0 to 17 do
begin
rez_a: abs(5 - matrix[x]); {не : а := }
if rez_a<temp then
begin
temp:=rez_a; pos_a:=x;
end;
rez_b=abs(10-matrix[x]); {не = а := }
if rez_b<temp1 then
begin
temp1:= rez_b; pos_b:=x;
end;
end;
writeln (‘positsion for 5:’, pos_a+1);
writeln (‘positsion for 10:’, pos_b+1);
end. {тут, только конец процедуры, потому надо не . а ;}
{ну а где само тело програмы?}
Ошибок много, часть из них помоему от невнимательности, другая часть от непонимания дела.
uses forms; {???}
var
a: array [1...6, 1...5] of real; {точек много}
k,i,j: integer; z: real;
begin
writeln (‘Vvedite elementi matrici 6x5’);
for i:=1 to 6 do
for j:= 1 to 5 do
real (a[i,j]); {не real а read}
for i:=1 to 6 do
begin (‘Vvedite N elementa delenia dla ‘,i,’ stroki);
read (k);
for j:=1 to 5 do
if a [i,k]<>0 then a [i,j]:=a [i,j]/a[i,k]
else a[i,j]:=0;
end;
for i:=1 to 6 do
begin
writeln (‘’);
for j:= 1 to 5 do
write (‘ ’, a [i,j]);
end;
readln; readln;
end.
Если исправить синтаксические ошибки, то все ОК
синтаксические ошибки - Бог с ними...
Naina, представь, что у тебя твой массив будет состоять из элементов... ну скажем больше 26. тогда твоя программа не заработает.
правильно - начать обработку массива не с нулевого элемента, а с первого. а за эталон взять отклонение нулевого элемента.
Matush, все испортил, я хотел, чтобы девушка сама догадалась :)
Ну, это еще кто испортил (читай внимательно пост где я сказал, чтоб она сама исправила).
синтаксические ошибки - Бог с ними...
А вот и нет.
правильно - начать обработку массива не с нулевого элемента, а с первого. а за эталон взять отклонение нулевого элемента.
Нумеровать с нулевого элемента мог бы и не советовать - это никак нельзя в ВУЗах. Сам знаеш какие приподы.
Ну, это еще кто испортил (читай внимательно пост где я сказал, чтоб она сама исправила).
согласен. да и говорил то я в шутку.
А вот и нет.
сначала алгоритм, потом - синтаксис. правильный синтаксис - рука набьется постепенно (да и компилер материть будет). а вот мышление сразу надо правильное формировать.
Нумеровать с нулевого элемента мог бы и не советовать - это никак нельзя в ВУЗах. Сам знаеш какие приподы.
забыл, что это паскаль, извините. :) я всю жизнь на С-подобном писал...
begin (‘Vvedite N elementa delenia dla ‘,i,’ stroki);
read (k);
for j:=1 to 5 do
if a [i,k]<>0 then a [i,j]:=a [i,j]/a[i,k]
else a[i,j]:=0;
end;
Если исправить синтаксические ошибки, то все ОК
я бы не сказал, что "все ОК".
во-первых. написано "исключить деление на 0". но это же не значит, что нужно обнулять все элементы строки, если элемент, на который делим равен 0.
во-вторых, в данной реализации - лишняя работа выполняется. если a[i,k] = 0, тогда нужно завершать обрабоку данной строки сразу, а не проходить всю строку. я вижу два варианта решения задачи:
1. выполнять проверку элемента-делителя при вводе числа и, если введеный индекс указывает на 0, просить повторить ввод
2. проверять перед проходом строки делитель и, если он нулевой, пропускать строку.
код, если нетрудно пишите сами, я слабо помню паскаль.
во-вторых, в данной реализации - лишняя работа выполняется. если a[i,k] = 0, тогда нужно завершать обрабоку данной строки сразу, а не проходить всю строку.
Так и думал что мне кто-то про это притыкнет.
Это на работоспособность не влияет (только не надо сейчас про оптимизацию рассказывать)
На счет обнулений, то тоже считаю что все ок. По крайней мере ошибки выполнения не будет.
Так и думал что мне кто-то про это притыкнет.
Это на работоспособность не влияет (только не надо сейчас про оптимизацию рассказывать)
На счет обнулений, то тоже считаю что все ок. По крайней мере ошибки выполнения не будет.
у нас за такой код тоже зачетов не ставили. в таком варианте, препод может спросить - "а зачем вы обнуляете элементы? а вдруг вам потом они понадобятся??". и он будет прав. так что извини, но ты не прав. это плохой стиль программирования. а одна из задачь ВУЗа - привить хороший стиль.
"а зачем вы обнуляете элементы? а вдруг вам потом они понадобятся??"
Сегодня я не хочу быть неправым, хочу быть левым, а потому:
в условии сказано исключить деление на ноль. А что делать если там как раз деление на ноль? Несказано ведь. По этому можно либо сказать преподу что условие не однозначно и задачу я решить не могу, либо придумать что делать с делением на ноль.
К примеру я рядок не обнуляю, а оставляю как есть. Тот же Твой припод может сказать: а почему в этом рядке все цифры остались как и были?
Короче. На счет этого вопроса можно спорить вечно. Флудить и флудить. Но сегодня я уйду с работы считая что я прав :)
Еще раз спасибо