Другое > Hard'n'Soft
Вспоминаем Turbo Pascal и решаем задачи на нём
<< < (11/15) > >>
igarexa:
Народ, помогите пожалуйста кто может.
Паскаль не может скомпилировать написанное: выводит на непонятную мне ошибку:
iganew.pas(5.20) Fatal: Syntax error, 'identifier' excepted but ":" found

На эту строчку:
var A, Pie, Sie, Z,: real;

А именно на двоеточие, но ведь там ведь вроде всё в порядке. Как же так?

Если необходимо, могу весь код сюда кинуть.
paul_met:

--- Цитата: igarexa ---var A, Pie, Sie, Z,: real;
--- Конец цитаты ---
Убери запятую после "Z".
igarexa:
paul_met, благодарю!  :) и как же я так не догнал... ладно пойду дальше разбираться с ошибками...
igarexa:
Блин, не могу никак сделать что бы всё идеально работало... Помогите пожалуйста разобраться с заданием. Алгоритм придумал, блок схему нарисовал, код написал как смог, но вычисления неправильные делает. Подскажите в чем же дело, где у меня ошибка?
Задание с латышского языка, переведу как понял на русский для вас.

Квадрат характеризует сторона А, периметр P и площадь S. Точность с (плавающей точкой?) проверяется значением Z. Ввести A, P, S, Z значения. Вычислить P, S, и сравнить с введёнными значениями, проверить с точностью Z, если не правильно - попросить ввести значения снова.

Алгоритм я понял такой:


Sr и Pr я назвал так реальные значения площади и периметра, вычисляемые по формулам.
Sie и Pie я назвал вводимые нами значения


Код я написал такой:
--- Код: ---Program Kvadrat;
Uses Crt;
Label Vvod_dannih;
Label Vse_rabotaet;
Label Variants1;
Label Variants2;
var A, Pie, Sie, Z, Pr, Sr: real;

Begin
clrscr;
Vvod_dannih: Writeln('Vvedi neobhodimie dannie');
Writeln('Vvedi storonu A');
Readln(A);
Writeln('Vvedi perimetr P');
Readln(Pie);
Writeln('Vvedi ploshadj S');
Readln(Sie);
Writeln('Vvedi to4nostj Z');
Readln(Z);
Pr := A*4;
Sr := A*A;

if( A<0 ) or ( Pie <0 ) or ( Sie <0 ) or ( Z <0 ) then
  begin
    writeln('Nelza vvoditj negativnie 4isla' );
    goto Vvod_dannih;
   end;


if (Pr > Pie) and (Sr > Sie) then
begin
   goto Variants1;
end
else
begin
   goto Variants2;
end;
Variants1:
begin
  if ((Pr - Pie) <=Z ) and ((Sr - Sie) <=Z )  then
  begin
    writeln ('To4nostj pozvolaet');
        goto Vse_rabotaet;
    end
         else
    begin
    writeln ('To4nostj ne pozvolaet');
         goto Vvod_dannih;
    end;

if (Pr < Pie) and (Sr < Sie) then
   goto Variants2;

Variants2:
if ((Pie - Pr) <=Z ) and ((Sie - Sr) <=Z )  then
begin
    writeln ('To4nostj pozvolaet');
        goto Vse_rabotaet;
         end

         else
         begin
    writeln ('To4nostj ne pozvolaet');
         goto Vvod_dannih;
         end;

end;
Vse_rabotaet: Writeln('Vse rabotaet!');
Readln;
End.

--- Конец кода ---

Буду рад любой помощи..



То есть, если возмём сторону A=3, то реальный периметр (Pr)=12 и реальная площадь (Sr)=9
если я ввожу P=10 и S=7 точность Z=2, то он разрешает такие значения.
если я ввожу P=10 и S=7 точность Z=1, то он не разрешает такие значения.
То есть здесь всё в порядке, но:
если я ввожу P=12 и S=7 точность Z=1, то он  разрешает такие значения. Программа видит что одно значение годится для такой точности, и значит этого достаточно, но в этом случае S не должно подходить.


Кстати, за это время нашёл 1 недочёт, и исправил уже. В вариантах надо было сделать <=Z (меньше или равно Z, а не просто меньше).
Planestranger:
неправильно. а если у тебя введенный периметр будет больше вычисленного, а площадь меньше?
разницу бери по модулю для проверки, и тогда будет достаточно одного условного оператора.
igarexa:
lost_hero, у меня на такой случай,  если введённые данные больше реальных, программа вычисляет по другой формуле, то есть "введённые - реальные" а не "реальные - введённые", сейчас проверил, и когда вводимые больше реальных, программа работает безотказно при любых значениях.

Но да, ты прав, с модулями было бы намного лучше. Спасибо.


То есть есть 1 проблемный случай: при условиях того что вводимые данные меньше реальных, и если хоть 1 значение удовлетворяет заданной точностью, то программа пишет что всё в порядке.

Конечно я могу надеяться что профессор просто не заметит и не проверит этот случай  :D
igarexa:
Всё, засада... Оказывается, я неправильно понял задачу. А именно момент про точность. Точность надо задавать количеством цифр после запятой...

Но по идее всё остальное зато уже понятно.

Поэтому у меня только один вопрос. Да и то небольшой:
Как сделать так, что бы при заданной точностью (например 0.001), проверялось определённое значение.
В смысле, как задать это свойство какому либо значению?
gepar:
Вообще точность подразумевает дисперсию (разброс) значения.
igarexa:
Всем привет... снова я   :blush:

Помогите пожалуйста с заданием в паскале, уже сколько времени сижу, не могу никак догнать как его сделать.
Задание двумерного массива.
По идее, надо лишь составить алгоритм заполнения двумерного массива. Только я никак не могу додуматься как его сделать.
У меня есть пример как он составляется по горизонтали:

wrk:=1;                                     
for i:=1 to 6 do {cikl po strokam}         
begin
j:=5-i; if j<1 then j:=1;                   
while(j <= 7-i) do {cikl po kolonnam}     
begin               
ms[i,j]:=wrk;
wrk:=wrk+1;                                     
j:=j+1
end;
end;

{ . . . 1 2 3 . . . . }
{ . . 4 5 6 . . . . . }
{ . 7 8 9 . . . . . . }
{101112 . . . . . . . }
{1314 . . . . . . . . }
{15 . . . . . . . . . }
{ . . . . . . . . . . }
{ . . . . . . . . . . }
{ . . . . . . . . . . }
{ . . . . . . . . . . }


А надо, что бы составлялось вот так:
{ . . 1 . . . . . . . }
{ . . 2 7 . . . . . . }
{ . . 3 813 . . . . . }
{ . . 4 91419 . . . . }
{ . . 510152025 . . . }
{ . . 611162126 . . . }
{ . . .12172227 . . . }
{ . . . .182328 . . . }
{ . . . . .2429 . . . }
{ . . . . . .30 . . . }

Добрался до того, что бы вводить по вертикали, первая колонна заполняется правильно, остальное - нет...

Выложил файл .pas , думаю с ним разобраться легче с программой. http://ifolder.ru/27046988

Большая помощь помочь мне :)

Такс... сделал несколько ошибок когда отправлял задание. Отправил то, над чем уже работал, соответственно внёс там изменения.
Сейчас уже всё исправил, перезалил заново .pas файл, на правильный.
gepar:
igarexa,какое-то странное у тебя задание, не алгоритмическое я бы сказал, почему данные вводить нужно именно с 3ей строки и почему только до 6 в столбец мы считаем? А если у нас строк меньше (2) например, а если столбцов меньше (2), тогда что? Вот есть у нас матрица 2x2, что тогда твой алгоритм будет делать, ничего? Ты бы лучше задание написал, а не то как ты его понимаешь.
igarexa:
gepar, Да вот такое дали.. это кстати только А часть, Б часть ещё более странное, там вообще заполняется по спирали... но это уже другой вопрос.

Пишу задание:

Разработать программу, которая в двумерном массиве заполняет указанные элементы значениями 1, 2, 3, 4, 5,.... по вертикали. В программе нельзя использовать операторы присвоения, для заполнения массива, которые не находятся в теле цикла.
И соответственно картинка:
{ . . 1 . . . . . . . }
{ . . 2 7 . . . . . . }
{ . . 3 813 . . . . . }
{ . . 4 91419 . . . . }
{ . . 510152025 . . . }
{ . . 611162126 . . . }
{ . . .12172227 . . . }
{ . . . .182328 . . . }
{ . . . . .2429 . . . }
{ . . . . . .30 . . . }

Ну и нам дали другой вариант, для примера, я его уже выкладывал на http://ifolder.ru/27046988
HoRRoR:
Мне такое решение нравится:

--- Код: ---  for i := 0 to 29 do
  begin
    y := i div 6 + i mod 6;
    x := i div 6 + 2;
    arr[y, x] := i + 1;
  end;

--- Конец кода ---
igarexa:
HoRRoR, Спасибо, попробую разобраться с этим :) хотя пока не особо ясно
HardWareMan:
Набрал ради теста вариант хоррора:

Результат работы:

Работает, можно пользовать. :3
gepar:

--- Цитата: igarexa ---Разработать программу, которая в двумерном массиве заполняет указанные элементы значениями 1, 2, 3, 4, 5,.... по вертикали. В программе нельзя использовать операторы присвоения, для заполнения массива, которые не находятся в теле цикла.
--- Конец цитаты ---
Картинка не соответствует заданию так как три точки подразумевают дальнейшую прогрессию, а не только цифру 6, скорее всего они подразумевают 1,2,3,4,5,...,n где n - количество строк. Также в задании не указано что значения должны заполнятся именно с 3 строки матрицы что подразумевает заполнение с начала матрицы... Но так как сдавать это не мне то можешь воспользоваться и вариантом HoRRoR'а  ;)
igarexa:
gepar, ну даже не знаю, я с листа переписывал, если что, проблемы профессора :)
HardWareMan, Спасибо ;) так стало понятнее :) Выводит то что как раз хочу видеть, щас заточу под пример который нам дали, для маскировки  :D Надеюсь со вторым вариантом уже разберусь.

HoRRoR,HardWareMan,gepar, Благодарю за помощь и отзывчивость!  :)
HoRRoR:
Кстати, чтобы не писать "if xxx < 10 then write(' ', xxx)" можно писать "write(xxx:2)". Поправьте, если не во всех паскалях так.
HardWareMan:

--- Цитата: HoRRoR от 19 Ноябрь 2011, 19:21:02 ---Кстати, чтобы не писать "if xxx < 10 then write(' ', xxx)" можно писать "write(xxx:2)". Поправьте, если не во всех паскалях так.

--- Конец цитаты ---
Ах да, уже забывать начинаю. Все верно.
igarexa:
HoRRoR, да спасибо, так и сделал :) как раз в примере задания так и надо было сделать. По идее программа готова, щас допишу протокол с блок-схемой, и задание выполнено :)
HoRRoR:

--- Цитата: HardWareMan от 19 Ноябрь 2011, 22:42:35 ---Ах да, уже забывать начинаю. Все верно.

--- Конец цитаты ---
Я вот вспоминал, как массивы объявлять :lol:
Хотя несколько лет на Delphi кодил...
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии