Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ работа с текстом в графическом режиме

Автор: 18192123 27.02.2007 1:07

Вот такая задачка:
В верхней левой и в правой нижней части экрана произволь-ным цветом создайте две прямоугольных области с одной общей точкой. Залейте их разным цветом и выведите внутри каждой области, соответственно, одно из следующих сообще-ний: «Question 1» и «Question 2»

У меня затруднение с тем, чтобы текст не выходил за пределы прямоугольников...


Uses Crt, Graph;
const x = 320; y = 175;
var
DriverVar, ModeVar, a, b, a_, b_: integer;

begin
clrscr;
Writeln ('vvedite odni razmeri');
readln (a);
readln (b);
Writeln ('teperi sledyuchie');
readln (a_);
readln (b_);

DriverVar := Detect;
InitGraph (DriverVar, ModeVar,'');

SetBkColor(13);
setcolor(15);
bar(x+b,y+a,x,y);
SetTextStyle(0,1,1);
OutTextXY( (x + b) div 2, (y + a) div 2, 'Question 1');
setfillstyle(7,15);
bar(x,y,x-a_,y-b_);
SetTextStyle(0,0,2);
OutTextXY( (x - a_) div 2, (y - b_) div 2, 'Question 2');

readln;

closegraph;
end.



Автор: volvo 27.02.2007 1:14

А теперь скажи, ЧТО надо ввести, чтобы получить ВООБЩЕ какой-нибудь прямоугольник, а не несколько отдельных линий?

И сразу же вопрос №2 - за счет чего ты хочешь

Цитата
чтобы текст не выходил за пределы прямоугольников
? Чтобы все, что НЕ поместилось - обрезалось? Или уменьшать размер шрифта?

Автор: 18192123 28.02.2007 0:22

Цитата(volvo @ 26.02.2007 21:14) *



И спвзу эе вопрос №2 - за счет чего ты хочешь ? Чтобы все, что НЕ поместилось - обрезалось? Или уменьшать размер шрифта?

уменьшать размер шрифта




Добавлено через 2 мин.
Цитата(volvo @ 26.02.2007 21:14) *

А теперь скажи, ЧТО надо ввести, чтобы получить ВООБЩЕ какой-нибудь прямоугольник, а не несколько отдельных линий?


Не пойму смысл этого вопроса! Ведь я использую процедуру для построения именно всего прямоугольника через координаты верхнего левого угла и нижнего правого.

Автор: Алена 28.02.2007 1:16

Цитата
Не пойму смысл этого вопроса!
В программе есть ввод данных? ReadLn запрашивается? Что надо ввести, чтобы получить прямоугольники? При вводе произвольных данных прямоугольников не получается... Скажи ТОЧНО, какие цифры ты вводишь...

Добавлено через 40 сек.
Почему надо все время ДОГАДЫВАТЬСЯ? dry.gif

Автор: 18192123 28.02.2007 2:22

Цитата(Алена @ 27.02.2007 21:16) *

В программе есть ввод данных? ReadLn запрашивается? Что надо ввести, чтобы получить прямоугольники? При вводе произвольных данных прямоугольников не получается... Скажи ТОЧНО, какие цифры ты вводишь...

Добавлено через 40 сек.
Почему надо все время ДОГАДЫВАТЬСЯ? dry.gif

Пусть а=150, b=150, а_=180, b_=90
Почему при произвольных данных прямоугольники не получаются? ведь, в принципе, пользователь может ввести любые параметры для прямоугольников...

Автор: TarasBer 28.02.2007 2:56

Розовый фон. Гламурненько... Глазам неприятно.
СетФиллСтиль - первый параметр - стиль заливки. Вы выбрали заливку клеточками. Второй параметр - цвет.
У меня такой вариант работает:


uses
Crt, Graph;

const
x = 320; y = 240;
S1 = 'Question 1';
S2 = 'Question 2';

var
DriverVar, ModeVar, a, b, a_, b_: integer;
W1, W2: integer;

begin
clrscr;
Writeln ('vvedite odni razmeri');
readln (a);
readln (b);
Writeln ('teperi sledyuchie');
readln (a_);
readln (b_);
DriverVar := Detect;
InitGraph (DriverVar, ModeVar,'');
SetTextJustify(CenterText, CenterText);
setcolor(15);
setfillstyle(1,GREEN);
bar(x+b,y+a,x,y);
SetTextStyle(4,0,4);
W1 := TextWidth(S1);
SetTextStyle(4, 1, a shl 2 div w1);
OutTextXY(x + b shr 1, y + a shr 1, S1);
setfillstyle(1,CYAN);
bar(x,y,x-a_,y-b_);
SetTextStyle(4,0,4);
W2 := TextWidth(S2);
SetTextStyle(4, 0, a_ shl 2 div w2);
OutTextXY(x - a_ shr 1, y - b_ shr 1, S2);
readln;
closegraph;
end.



Я смотрю, в этой теме сплошные кошки на аватарах...

Автор: T i m e 28.02.2007 3:22

Цитата
Я смотрю, в этой теме сплошные кошки на аватарах...

Да уж кошачее собрание... smile.gif Прикольно.
TarasBer, а тебя прога при маленьких значениях всё равно текст за пределы выкидывает... Ну там конечно можно ещё стили менять текста (там ведь в разных стилях размер бывает совсем маленький) и меняя размер можно ущемлять его в прямоугольники или если нельзя ущемить вообще не выводить... Но я сомневаюсь что ему такая намудрённость нужна...

Автор: 18192123 28.02.2007 4:06

Цитата(TarasBer @ 27.02.2007 22:56) *


Вроде поняла..кроме одного момента...

W1 := TextWidth(S1);
SetTextStyle(4, 1, a shl 2 div w1);
OutTextXY(x + b shr 1, y + a shr 1, S1);




Каково назначение здесь первой строки? И откуда shl, shr ?

Автор: volvo 28.02.2007 5:01

Цитата
Каково назначение здесь первой строки?
Вычисление ширины текста, вестимо..

Цитата
И откуда shl, shr ?
А у тебя на клавиатуре кнопка F1 есть? Откуда она там? И самое главное, ЗАЧЕМ? Набери shl в Паскале и нажми Ctrl + F1 - узнаешь, иначе обсуждение очень быстро выйдет за рамки заданной тобой темы...

Автор: 18192123 9.03.2007 2:51

Цитата(volvo @ 28.02.2007 1:01) *



Набери shl в Паскале и нажми Ctrl + F1 - узнаешь, иначе обсуждение очень быстро выйдет за рамки заданной тобой темы...

Не могли бы вы дать ссылку, где об этом можно подробно почитать (а то у меня Паскаль не русифицирован.... unsure.gif )

Автор: Ozzя 9.03.2007 11:28

Цитата(18192123 @ 8.03.2007 23:51) *

Не могли бы вы дать ссылку, где об этом можно подробно почитать (а то у меня Паскаль не русифицирован.... unsure.gif )

http://forum.pascal.net.ru/index.php?showtopic=3224

Автор: 18192123 9.03.2007 23:50


SetTextStyle(4, 1, a shl 2 div w1);



выражение a shl 2 div w1, как я поняла, используется в качестве размера шрифта...
но объясните мне пожалуйста в чём его смысл ? (нашла, что операция shl обеспечивает сдвиг на определенное кол-во разрядов влево)

Автор: TarasBer 10.03.2007 0:29

Цитата(18192123 @ 9.03.2007 19:50) *


SetTextStyle(4, 1, a shl 2 div w1);



выражение a shl 2 div w1, как я поняла, используется в качестве размера шрифта...
но объясните мне пожалуйста в чём его смысл ? (нашла, что операция shl обеспечивает сдвиг на определенное кол-во разрядов влево)

На положительные целые числа операция shl x дейтвует такде, как и умножение на 2 в степени x. А shr x означает делние на 2 в степени x. НО: умножение, а тем более деление может отнимать очень много времени, а побитовый сдвиг делается намного (в несколько десятков раз) быстрее. В маленьких программах разница во времени незаметна, но в серьёзных программах иногда приходится делать всё при помощи быстрых битовых операций.

Автор: Bokul 10.03.2007 0:32

Конечно не по теме, но где можно бы почитать о применении логических операций к числам?

Автор: volvo 10.03.2007 0:33

В поиске есть, suriv спрашивал когда-то, в "Теоретических вопросах" ...

Добавлено через 3 мин.
Здесь тоже было: http://forum.pascal.net.ru/index.php?showtopic=961

Автор: 18192123 10.03.2007 0:43

Цитата(TarasBer @ 9.03.2007 20:29) *

На положительные целые числа операция shl x дейтвует такде, как и умножение на 2 в степени x. А shr x означает делние на 2 в степени x. НО: умножение, а тем более деление может отнимать очень много времени, а побитовый сдвиг делается намного (в несколько десятков раз) быстрее. В маленьких программах разница во времени незаметна, но в серьёзных программах иногда приходится делать всё при помощи быстрых битовых операций.

а почему нужно именно 2 в выражении a shl 2 div w1?

Автор: TarasBer 10.03.2007 0:55

Цитата(18192123 @ 9.03.2007 20:43) *

а почему нужно именно 2 в выражении a shl 2 div w1?

Потому что мне захотелось умножить именно на 2^2=4.

Автор: 18192123 10.03.2007 0:57

Цитата(TarasBer @ 9.03.2007 20:55) *

Потому что мне захотелось умножить именно на 2^2=4.

спасибо! теперь всё ясно!