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
|
|
|