Форум
» Назад на решение задач по физике и термеху
Регистрация | Профиль | Войти | Забытый пароль | Присутствующие | Справка | Поиск

» Добро пожаловать, Гость: Войти | Регистрация
    Форум
    Информационные технологии
        Турбо Паскаль. Программирование на Pascal
Отметить все сообщения как прочитанные   [ Помощь ]
» Добро пожаловать на форум "Информационные технологии" «

Переход к теме
<< Назад Вперед >>
Несколько страниц [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 ]
Модераторы: paradise, KMA
  

VANEK


Новичок

Люди ПОЖАЛУЙСТА ПОМОГИТЕ : Получить на экране рисунок лампочки со спиралью. Обеспечить возможность "зажигать" и "гасить" нарисованную лампочку: включение и выключение лампочки должно выполнятся с клавиатуры, спираль зажженной и погашенной лампочек окрашивается в разные цвета

Всего сообщений: 1 | Присоединился: май 2007 | Отправлено: 24 мая 2007 22:35 | IP
Ridge



Новичок

Посмотри выше на сообщения КМА
Начинай делать и выкладывай код, кто чем сможет тем и поможет. А иначе даже просто-напросто думать и не хочется над твоей задачей.

Всего сообщений: 19 | Присоединился: май 2007 | Отправлено: 24 мая 2007 23:05 | IP
KMA



Долгожитель

Ridge, не знаю насколько это верно, но так как я понял задание, тебе не принципиально, что делать с двумя массивами, поэтому у меня родилась инженерная мысль.

На первом этапе формируем массив, состоящий из последовательности чисел треугольника Паскаля, кроме стоящих с боку 1. Т. е.

1  1 1   2   3 3   4 6 4   5 10 10 5 и т. д.

На втором этапе, мы в новый массив просто приписываем 1, со всех сторон. Даю код, комментов, правда немного оставил, но думаю, сойдет.

Code Sample:
program threeUnglePascal; 
uses crt;
const n=10;
{количество строк треугольника}
Type mas=array [1..100] of word; {на счет адекватности размера массива не уверен, не считал, сколько должно быть элементов, если что подгонишь сам}

VAR a, b: mas;
      i, j, k, buf_k, l: byte;

{процедура, которая выводит на экран итоговый массив}
procedure showMas (m: mas);
Var i, k, j: byte;
Begin
    i:=1;
{начинаем с 1 элемента массива}
    for j:=1 to n do
     begin
      for k:=1 to j do
       begin
{соответственно j элементов в j строке}
        write (m[ i ], ' ');
        inc (i)
       end;
      writeLn
     end
End;


BEGIN
    clrScr;

    {создаем последовательность чисел см. выше}
    b[1]:=1;
    b[2]:=1;
    b[3]:=1;
    b[4]:=2;
    i:=5;
{начнем с 5 элемента}
    k:=2; {первоначально в строке 2 числа 3 и 3, потом это количество чисел в строке будет расти, по принципу, новая строка +1 число в строке}
    l:=2; { это есть разность между индексами элементов массива, чтобы прибавлять то что в "строчке сверху", дабы получить "элемент снизу"}
    for j:=3 to n do {начинаем с 3 строки}
     begin
      b[ i ]:=j;
{записываем первое "граничное" число, скажем для 3 строки оно 3, для 4 -- 4 и т. д. }
      inc (i);
      buf_k:=k;
{сохраняем значение k в новой переменно}
      while ((buf_k-2)>0) do {т. к. краевые числа мы заполняем в первом цикле, то количество чисел в строке, заполняемые во втором цикле нужно уменьшить на 2}
       begin
        b[ i ]:=b[i-l+1]+b[i-l];
        inc(i);
        dec (buf_k);
{заполнили новое число, уменьшили, количество заполняемых на 1, для текущей строки}
       end;
      b[ i ]:=j
;{опять заполняем краевое число}
      inc(i);
      inc (k);
{в следующей строке элементов будет на 1 больше}
      inc (l); {cдвинется так же смещение, для одномерного массива, которое отвечает за сумму двух "верхних" чисел}
     end;

    {теперь прибавим к полученному массиву единички с боку, записывая все в новый массив}
    a[1]:=1;
    a[2]:=1;
    a[3]:=1;
    i:=4;
{начинаем с 4 элемента записывать все в массив а}
    l:=4; {так же начинаем запись из массива b в массив а при чем начинаем сразу же с 4 элемента}
   
    for j:=3 to n do
     begin
      a[ i ]:=1;
{прибавляем 1 сбоку}
      inc (i);
      for k:=1 to j-2 do
       begin
        a[ i ]:=b[l];
{"наполняем" треугольник}
        inc (l);
        inc (i);
       end;
      a[ i ]:=1;
{и в конце то же прибавим 1}
      inc (i);
     end;
     
    showMas (a);
{покажем треугольник на экран}
    readLn;
END.



Хочу сказать, что код далеко не идеален (он работающий, это я могу гарантировать), но его всегда можно подработать. Общие закономерности я выразил, тебе лишь стоит подобрать конкретные числа. А так вроде все. Устраивает?.. если нет, то скажи что.


(Сообщение отредактировал KMA 25 мая 2007 1:57)

Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 25 мая 2007 1:48 | IP
KMA



Долгожитель

kub, твое сообщение:

Но какой-то косяк с srez может посмотрите(в srez запоминаются все символы которые были при всех вызовах проги, srez вроде не обнуляется так сказать


Я не удивился бы, если бы Паскаль даже матом на тебя ругнулся. Ты сам думай, srez, то что возвращается процедурой, она является ЛОКАЛЬНОЙ, а в модуле, возвращать локальные переменные в основных подпрограммах модуля для главной программы, крайне НЕ рекомендуется.

Поэтому, если так хочешь, то, измени просто текст заголовка подпрограммы на следующее:

Code Sample:
procedure b(s1,s2,s3:string;  
var srez:set of char);


Хотя может заругаться, лучше все же создать тип  
Code Sample:
TYPE setChars=set of char;  
procedure b(s1,s2,s3:string;
var srez: setChars);



И в основной программе, нужно будет добавить после VAR cледующие:

Code Sample:
VAR srez: set of chars;



Должно заработать.


(Сообщение отредактировал KMA 25 мая 2007 2:14)

Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 25 мая 2007 2:10 | IP
Ridge



Новичок

Процедура тоже тоже слишком круто, КМА, спасибо конечно, но не совсем то. Ладно, задание конечно интересное, но я  с ним поостыл. Я может сейчас посижу и выложу недоделаный код проги с 2мя одномерными, вдруг у тебя есть идеи?

Всего сообщений: 19 | Присоединился: май 2007 | Отправлено: 25 мая 2007 22:43 | IP
KMA



Долгожитель


Процедура тоже тоже слишком круто, КМА, спасибо конечно, но не совсем то.


Что значит не совсем, то, если не нравиться процедура, то это же легко переделать. Просто подставь, то что в процедуре (от Begin до End), и вместо m напиши  а. И все. И программа без процедуры. Если трудно могу переписать код. Но в принципе, сама процедура только выводит на экран в удобной форме для чтения массив. Основной код без процедур написан. И разобраться ты в нем должен был без проблем.

Что именно ты хотел сделать двумя одномерными, я вроде ими и сделал???

Видишь ли, я могу представить как работать в одном массиве (по сути это измененная программа, где треугольник паскаля храниться в одном массиве). А два зачем? Нет, если задание: "Сделать при помощи двух одномерных", то задача решена, и ее код выше. Если же есть какие-то дополнительные требования, то нужно было их сразу выкладывать. Тебе и другим делают то, что ты сам попросишь. Если надо что-то менять, то скажи что именно не так?

Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 26 мая 2007 1:24 | IP
Ridge



Новичок

КГМ, ну я задание то писал 2 раза. Но! Я сдал уже 2мерный массив, а нужно эту же прогу переделать под 2 одномерных и один одномерный так, чтобы они были максимально схожи

Всего сообщений: 19 | Присоединился: май 2007 | Отправлено: 26 мая 2007 2:17 | IP
kub


Новичок

Я тут прогу написал может проверите, протестируете
вот условие:
Написать программу построения графика функции. Вывод графика осуществляется в созданном на экране окне, в другом окне выполнить вывод уравнения функции с конкретными значениями параметров. Выполнить смену 3-х экранов с конкретными значениями параметров.
“Бабочка”:
X=sin(At + B)cos(Ct), Y=sin(At + B)sin(Dt), A>0, B>0, C>0, D>0, 0<=t<=2пи

вот код:
Uses Crt, Graph;



var GraphDriver, GraphMode, ErrorCode : Integer;



   Center_x, Center_y, {Координаты центра координатной сетки}

   Width_x, Height_y : integer; {Ширина и высота координатной сетки для

    масштабирования значений аргумента и функции}



procedure InitGrp;

begin

{ драйвер и режимы по умолчанию }

GraphDriver := Detect;

{ драйвер egavga.bgi в текущей папке }

InitGraph(GraphDriver, GraphMode, 'egavga.bgi');

ErrorCode := GraphResult;

{ обработка ошибки }

if ErrorCode <> grOK then begin

  Writeln('Graphics error: ', GraphErrorMsg(ErrorCode));

  CloseGraph;

  Halt(1);

  end;

end;



const {Шаг наращивания t. Чем меньше, тем более плавно рисуется график.

      В данном случае принимается дискретность - 200 шагов}

     Td = 2*Pi / 200;



var

   X, Y, A, B, C, D, t, y_scale : real;

   {Переменные для хранения координат построения графика}

   xx, yy : integer;

   {Вспомогательные переменные}

   sA, sB, sC, sD : string;



Begin

Clrscr;

Write('Enter A>0:');

Readln(A);

Write('Enter B>0:');

Readln(B);

Write('Enter C>0:');

Readln(C);

Write('Enter D>0:');

Readln(D);





{Задаём исходные данные для тестирования алгоритма программы}

{A:=2;

B:=3;

C:=4;

D:=5;

}



{Загружаем графический драйвер и включаем графический режим}

InitGrp;



{Устанавливаем параметры координатной сетки исходя из максимального

разрешения установленного граф.режима}

Center_x := GetMaxX div 2;

Center_y := GetMaxY div 2;

Width_x := (GetMaxX div 2) - 50;

Height_y := (GetMaxY div 2) - 50;

{Предполагаем, что максимальное значение U(t) не превысит 20, поэтому

вычисляем масштабный коэффициент для вывода графика функции}

y_scale:=Height_y/1;



{Рисуем оси координат белым цветом}

SetColor(white);

Line(Center_x+Width_x,Center_y,Center_x-Width_x,Center_y);

Line(Center_x,0,Center_x,Center_y+Height_y);



{Рисуем график функции красным цветом}

SetColor(red);



t:=0; {Начальное значение времени}

repeat

 {Вычисляем значения функции}

 X:=sin(A*t + B) * cos(C*t);

 Y:=sin(A*t + B) * sin(D*t);

 {Поскольку в графическом режиме координаты по вертикали растут сверху вниз, то

  параметр Y следует не складывать, а отнимать от осевой координаты Center_y }

 xx:=trunc(Center_x + X * Width_x);

 yy:=trunc(Center_y - Y * y_scale{Height_y});

 if t=0 then MoveTo(xx,yy)

    else LineTo(xx,yy);

 t:=t+Td; {Наращиваем t}

until t>2*Pi;



{Получаем символьный вид параметров A,B,C,D}

Str(A:2:2,sA);

Str(B:2:2,sB);

Str(C:2:2,sC);

Str(D:2:2,sD);



{Задаём координату высоты вывода уравнения функции}

yy:=Center_y+Height_y+10;

OutTextXY(0,yy,'X=Sin(' + sA + '*t+' + sB + ')*Cos(' + sC + '*t)');



{Переходим на следующую строку и выводим вторую половину уравнения}

yy:=yy+10;

OutTextXY(0,yy,'Y=Sin(' + sA + '*t+' + sB + ')*Sin(' + sD + '*t)');



readln;

{Выходим из граф. режима в текстовый режим}

CloseGraph;

End.


Всего сообщений: 10 | Присоединился: апрель 2007 | Отправлено: 26 мая 2007 23:06 | IP
KMA



Долгожитель

kub, давай только честно, эту прогу писал не ты сам. Во всяком случае ее большую часть. Это писал довольно хороший программист, и скорее всего это книжный пример, потому как где-то я этот код видел.

Что я могу сказать. Если обрабатывать ошибки, дак все. Поставиь условие на то, что А, В, С > 0. А так программа работает.

Если честно не совсем понятно, что ты хотел услышать в адрес программы. Тебя что-то в ней не устраивает?

Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 27 мая 2007 0:42 | IP
KMA



Долгожитель

Ridge, так они и похожи. Алгоритм ведь везде одинаков, складываешь два "верхних" значеня, получаешь нынешний. Оно так и есть. По другому, я думаю, трудновато будет реализовать. Во всяком случае, приведенную мной программу, можно преборазовать, чтобы работать с одномерным массивом. Если надо, могу ее выложить.

И еще, что значит "похожи"? Ты же сам реально понимаешь, что двумерный, это матрица,  и там можно выделять как верхние так и нижние строки, а вот одномерный массив на это не способен. Ты что хочешь чтобы получилось в итоге. Просто вывести треугольник, или же в конечном итоге, чтобы он был полностью записан в массив, а затем выведен.

Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 27 мая 2007 0:48 | IP

Эта тема закрыта, новые ответы не принимаются

Переход к теме
<< Назад Вперед >>
Несколько страниц [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 ]

Форум работает на скрипте © Ikonboard.com