Pascal, немогу изменить программу

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Kot.Merlin, 15 May 2009.

  1. Kot.Merlin

    Kot.Merlin New Member

    Joined:
    14 May 2009
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Приветствую вас.
    Нужна помощь в изменение программы.
    Суть состоит в том, что выделенная часть программы ищет наименьшее значение из параллельных плоскостей.
    Нужно изменить на функцию так, чтобы она выбирала из значений те, которые больше заданного числа и выводила их на экран.
    Program PLOSKOSTY;
    {РАЗРАБОТАЛ: КУЧЕРОВ.С.Г, ГР.6122, ФРТ.}
    {ПРОГРАММА ВЫПОЛНЯЕТ ПОИСК ПЛОСКОСТЕЙ,// XoY, ПАРАЛЛЕЛЬНЫЕ ПЛОСКОСТИ И
    МИНИМАЛЬНОЕ РАССТОЯНИЕ МНЖДУ ПАРАЛЛЕЛЬНЫМИ ПЛОСКОСТЯМИ}
    USES CRT; {Подключение модуля работы с экраном}

    CONST
    MAX=20; {Максимальное количество плоскостей}
    EPS=0.0000000001; {Точность определения параллельных плоскостей}

    TYPE
    EQUATION_MATR=ARRAY[1..4] OF REAL; {Тип для массива коэф. одной плоскости}
    COEF_MATR=ARRAY[1..MAX] OF EQUATION_MATR; {Тип для массива коэф. всех плоскостей}
    PARXY_MATR=ARRAY[1..MAX] OF INTEGER; {Тип для массива номеров плоскостей, // XoY}
    PAR_PL_MATR=ARRAY[1..MAX,1..2] OF INTEGER; {Тип для массива номеров параллельных плоскостей}
    DIST_MATR=ARRAY[1..MAX] OF REAL; {Тип для массива расстояний}

    var
    inputFile:TEXT; {Входной файл}
    outFile:TEXT; {Файл результатов}
    N, {Количество плоскостей}
    XY, {Кол. плоскостей, // XoY}
    PP: integer; {Кол. параллельных плоскостей}
    EQU:EQUATION_MATR; {Коэф. одной плоскости}
    COEF:COEF_MATR; {Коэф. всех плоскостей}
    PARXY:pARXY_MATR; {Номера плоскостей, // XoY}
    PAR_PL:pAR_PL_MATR; {Номера параллельных плоскостей}
    DIST: DIST_MATR; {расстояния между параллельными плоскостями}
    A, B, C, D: integer; {Коэффициенты}
    E:REAL; {Погрешность оценки параллельных плоскостей}
    MIN_DIST:REAL; {Минимальное расстояние}
    MINPL1,MINPL2:INTEGER; {Номера плоскостей между которыми мин. расст.}
    CH : INTEGER; {Символ для ввода}

    {-------Подпрограмма поиска плоскостей, // XoY--------}
    PROCEDURE PARAL_XY(COEF:COEF_MATR;N:INTEGER;VAR PARXY:pARXY_MATR; VAR XY:INTEGER);

    VAR
    I,J:INTEGER; {Рабочие переменные}

    BEGIN
    J:=0; {Установка начальных значений}
    FOR I:=1 TO N DO
    BEGIN
    IF COEF[I,1]=0 THEN {Проверка }
    BEGIN { условия }
    IF COEF[I,2]=0 THEN { А=0 и В=0}
    BEGIN
    J:=J+1;
    PARXY[J]:=I {Запись номера плоскости, // XoY}
    END
    END
    END;
    XY:=J
    END;

    {------Подпрограмма поиска параллельных плоскостей--------}
    PROCEDURE PARAL_PL(COEF:COEF_MATR;N:INTEGER;E:REAL;VAR PAR_PL:pAR_PL_MATR;VAR DIST:DIST_MATR;VAR PP:INTEGER);

    VAR
    CONDITION, {Условия }
    CONDITION1, { параллельности }
    CONDITION2: BOOLEAN; { плоскостей }
    I,J : INTEGER; {Рабочие переменные}

    BEGIN
    PP:=0; {Установка начальных значений}
    {Проверка параллельности плоскостей}
    FOR I:=1 TO N-1 DO
    BEGIN
    FOR J:=I+1 TO N DO
    BEGIN
    CONDITION1:=ABS(COEF[I,1]*COEF[J,2]-COEF[I,2]*COEF[J,1]) < E;
    CONDITION2:=ABS(COEF[I,1]*COEF[J,3]-COEF[I,3]*COEF[J,1]) < E;
    CONDITION:=CONDITION1 AND CONDITION2;
    IF CONDITION THEN
    {Плоскости параллельны}
    BEGIN
    PP:=PP+1;
    PAR_PL[PP,1]:=I; {Запись номеров }
    PAR_PL[PP,2]:=J; { параллельных плоскостей }
    {Вычисление расстояния между параллельными плоскостями}
    DIST[PP]:=ABS( COEF[I,4]/SQRT(SQR(COEF[I,1])+
    SQR(COEF[I,2])+SQR(COEF[I,3]))-
    COEF[J,4]/SQRT(SQR(COEF[J,1])+
    SQR(COEF[J,2])+SQR(COEF[J,3])))
    END
    END
    END
    END;

    {----------Процедура вывода результатов в файл------------}
    PROCEDURE OUT_TO_FILE(COEF:COEF_MATR; N:INTEGER);
    {-----Вывод исходных данных-----}
    BEGIN
    WRITELN(outFile,' ');
    WRITELN(outFile,' ИСХОДНЫЕ ДАННЫЕ ');
    WRITELN(outFile,' ');
    WRITELN(outFile,'КОЛИЧЕСТВО ПЛОСКОСТЕЙ N=',N);
    WRITELN(outFile,' ');
    WRITELN(outFile,' НОМЕР КОЭФФИЦИЕНТЫ');
    WRITELN(outFile,'ПЛОСКОСТИ A B C D');

    FOR I:=1 TO N DO
    BEGIN
    EQU:=COEF;
    WRITE(outFile,' ',I,' ');
    FOR J:=1 TO 4 DO
    WRITE(outFile,' ',EQU[J]:8:3,' ');
    WRITELN(outFile,' ');
    END;
    WRITELN(outFile,' ');
    {-----Вывод результатов-----}
    WRITELN(outFile,' ');
    WRITELN(outFile,' РЕЗУЛЬТАТЫ ');
    WRITELN(outFile,' ');

    IF XY > 0 THEN
    {Есть плоскости, // XoY}
    BEGIN
    WRITELN(outFile,' ПЛОСКОСТИ, // XoY ');
    WRITELN(outFile,' ');
    WRITELN(outFile,' НОМЕР КОЭФФИЦИЕНТЫ');
    WRITELN(outFile,'ПЛОСКОСТИ A B C D');
    WRITELN(outFile,' ');
    FOR I:=1 TO XY DO
    BEGIN
    EQU:=COEF[PARXY];
    WRITE(outFile,' ',PARXY,' ');
    FOR J:=1 TO 4 DO
    WRITE(outFile,' ',EQU[J]:8:3,' ');
    WRITELN(outFile,' ');
    END
    END
    ELSE {Нет плоскостей, // XoY}
    WRITELN(outFile,' ПЛОСКОСТЕЙ, // XoY, НЕТ');

    WRITELN(outFile,' ');

    IF PP > 0 THEN
    {Есть параллельные плоскости}
    BEGIN
    WRITELN(outFile,' ПАРАЛЛЕЛЬНЫЕ ПЛОСКОСТИ');
    WRITELN(outFile,' ');
    WRITELN(outFile,' НОМЕР КОЭФФИЦИЕНТЫ');
    WRITELN(outFile,'ПЛОСКОСТИ A B C D');
    WRITELN(outFile,' ');

    FOR I:=1 TO PP DO
    BEGIN
    EQU:=COEF[PAR_PL[I,1]];
    WRITE(outFile,' ',PAR_PL[I,1],' ');
    FOR J:=1 TO 4 DO
    WRITE(outFile,' ',EQU[J]:8:3,' ');
    WRITELN(outFile,' ');
    EQU:=COEF[PAR_PL[I,2]];
    WRITE(outFile,' ',PAR_PL[I,2],' ');
    FOR J:=1 TO 4 DO
    WRITE(outFile,' ',EQU[J]:8:3,' ');
    WRITELN(outFile,' ');
    WRITELN(outFile,'---------------------------------------------------------');
    WRITELN(outFile,' ')
    END;
    WRITELN(outFile,' СРЕДИ ПАРАЛЛЕЛЬНЫХ ПЛОСКОСТЕЙ НАИМЕНЬШЕЕ РАССТОЯНИЕ');
    WRITELN(outFile,' МЕЖДУ ПЛОСКОСТЯМИ ',MINPL1,' И ',MINPL2,' , РАВНОЕ D=',MIN_DIST:8:3);
    END
    ELSE {Параллельных плоскостей нет}
    WRITELN(outFile,'ПАРАЛЛЕЛЬНЫХ ПЛОСКОСТЕЙ НЕТ');

    END;

    {-----------Процедура вывода результатов на экран---------------}
    PROCEDURE OUT_TO_MONITOR(COEF:COEF_MATR; N:INTEGER);

    BEGIN
    {-----Вывод исходных данных-----}
    WRITELN;
    WRITELN(' ИСХОДНЫЕ ДАННЫЕ ');
    WRITELN;
    WRITELN('КОЛИЧЕСТВО ПЛОСКОСТЕЙ N=',N);
    WRITELN;
    WRITELN(' НОМЕР КОЭФФИЦИЕНТЫ');
    WRITELN('ПЛОСКОСТИ A B C D');

    FOR I:=1 TO N DO
    BEGIN
    EQU:=COEF;
    WRITE(' ',I,' ');
    FOR J:=1 TO 4 DO
    WRITE(' ',EQU[J]:8:3,' ');
    WRITELN;
    END;
    WRITELN;
    {-----Вывод результатов-----}
    WRITELN;
    WRITELN(' РЕЗУЛЬТАТЫ ');
    WRITELN;

    IF XY > 0 THEN
    {Есть плоскости, // XoY}
    BEGIN
    WRITELN(' ПЛОСКОСТИ, // XoY ');
    WRITELN;
    WRITELN(' НОМЕР КОЭФФИЦИЕНТЫ');
    WRITELN('ПЛОСКОСТИ A B C D');
    WRITELN;
    FOR I:=1 TO XY DO
    BEGIN
    EQU:=COEF[PARXY];
    WRITE(' ',PARXY,' ');
    FOR J:=1 TO 4 DO
    WRITE(' ',EQU[J]:8:3,' ');
    WRITELN;
    END
    END
    ELSE {Нет плоскостей, // XoY}
    WRITELN(' ПЛОСКОСТЕЙ, // XoY, НЕТ');

    WRITELN;

    IF PP > 0 THEN
    {Есть параллельные плоскости}
    BEGIN
    WRITELN(' ПАРАЛЛЕЛЬНЫЕ ПЛОСКОСТИ');
    WRITELN;
    WRITELN(' НОМЕР КОЭФФИЦИЕНТЫ');
    WRITELN('ПЛОСКОСТИ A B C D');
    WRITELN;

    FOR I:=1 TO PP DO
    BEGIN
    EQU:=COEF[PAR_PL[I,1]];
    WRITE(' ',PAR_PL[I,1],' ');
    FOR J:=1 TO 4 DO
    WRITE(' ',EQU[J]:8:3,' ');
    WRITELN;
    EQU:=COEF[PAR_PL[I,2]];
    WRITE(' ',PAR_PL[I,2],' ');
    FOR J:=1 TO 4 DO
    WRITE(' ',EQU[J]:8:3,' ');
    WRITELN;
    WRITELN('---------------------------------------------------------');
    WRITELN
    END;
    WRITELN(' СРЕДИ ПАРАЛЛЕЛЬНЫХ ПЛОСКОСТЕЙ НАИМЕНЬШЕЕ РАССТОЯНИЕ');
    WRITELN(' МЕЖДУ ПЛОСКОСТЯМИ ',MINPL1,' И ',MINPL2,' , РАВНОЕ D=',MIN_DIST:8:3);
    END
    ELSE {Параллельных плоскостей нет}
    WRITELN('ПАРАЛЛЕЛЬНЫХ ПЛОСКОСТЕЙ НЕТ')
    END;

    {-----Подпрограмма поиска наименьшего расстояния между плоскостями----}
    FUNCTION MIN_OF_DIST(DIST:DIST_MATR;PP:INTEGER): INTEGER;

    VAR
    I : REAL; {Расстояние}
    J : INTEGER; {Рабочая переменная}

    BEGIN
    I:=DIST[1]; {Установка начальных значений}

    FOR J:=2 TO PP DO
    BEGIN
    IF I > DIST[J] THEN
    BEGIN
    I:=DIST[J];
    MIN_OF_DIST:=J {Присвоение меньшего значения}
    END
    END
    END;
    {--------Тело основной программы--------}
    BEGIN
    CLRSCR; {Очистка экрана}
    {-----Связывание с файлом исходных данных-----}
    { $I- }
    Assign(inputFile,'C:\IN1.TXT');
    RESET(inputFile);
    { $I+ }
    IF IORESULT <> 0 THEN {Проверка связи с файлом}
    BEGIN
    WRITELN(' НЕТ ВХОДНОГО ФАЙЛА ');
    HALT(1) {Завершение программы}
    END;

    {---Чтение исходных данных---}
    WRITELN('Меню выбора исходных данных. Нажмите:');
    WRITELN(' 1 - если данные находятся в файле IN.TXT');
    WRITELN(' 2 - если вы хотите ввести исходные данные вручную');

    READ( CH );
    CASE CH OF
    1: BEGIN
    READLN(inputFile,N);

    FOR I:=1 TO N DO
    BEGIN
    FOR J:=1 TO 4 DO
    READ(inputFile, EQU[J]);
    READLN(inputFile);
    COEF:=EQU
    END
    END;

    2: BEGIN
    WRITELN('Введите количество плоскостей');
    READ(N);
    WRITELN('Введите коэффициенты плоскостей');
    {Ввод коэффициентов}
    FOR I:=1 TO N DO
    BEGIN
    FOR J:=1 TO 4 DO
    READ(EQU[J]);
    COEF:=EQU
    END
    END;
    END;

    {-----Обработка исходных данных-----}
    PARAL_XY(COEF,N,PARXY,XY); {Обращение к подпрограмме PARAL_XY}
    E:=EPS;
    PARAL_PL(COEF,N,E,PAR_PL,DIST,PP); {Обращение к подпрограмме PARAL_PL}
    IF PP > 0 THEN
    BEGIN
    MIN_DIST:=DIST[MIN_OF_DIST(DIST,PP)]; {Минимальное расстояние}
    MINPL1:=PAR_PL[MIN_OF_DIST(DIST,PP),1]; {Плоскости, между которыми}
    MINPL2:=PAR_PL[MIN_OF_DIST(DIST,PP),2]; { минимальное расстояние }
    END;

    WRITELN('Программа обработала исходные данные, выберите метод вывода результатов');
    WRITELN(' Нажмите:');
    WRITELN(' 1 - если хотите вывести результаты на экран');
    WRITELN(' 2 - если хотите вывести результаты в файл OUT.TXT');
    WRITELN(' 3 - если хотите вывести результаты и на экран, и в файл OUT.TXT');

    READ( CH );
    CASE CH OF
    1: BEGIN
    CLRSCR;
    OUT_TO_MONITOR(COEF,N); {Обращение к подпрограмме OUT_TO_MONITOR}
    READLN;
    READLN;
    END;
    2: BEGIN
    ASSIGN(outFile,'H:\OUT.TXT'); {Связывание с файлом результатов}
    REWRITE(outFile); {Открытие файла}
    OUT_TO_FILE(COEF,N); {Обращение к подпрограмме OUT_TO_FILE}
    CLOSE(outFile)
    END;
    3: BEGIN
    ASSIGN(outFile,'H:\OUT.TXT'); {Связывание с файлом результатов}
    REWRITE(outFile); {Открытие файла}
    OUT_TO_FILE(COEF,N); {Обращение к подпрограмме OUT_TO_FILE}
    CLOSE(outFile);
    CLRSCR; {Очистка экрана}
    OUT_TO_MONITOR(COEF,N); Обращение к подпрограмме OUT_TO_MONITOR}
    READLN;
    END
    END;
    CLOSE(inputFile); {Закрыть исходный файл}

    End. {Конец программы}