Познавательно для школьника

11 Окт »

Археометрия — «рацемизация» аминокислот

Автор: Основной язык сайта | В категории: Популярно о химии
1 кол2 пара3 трояк4 хорошо5 отлично (Еще не оценили)
Загрузка...

Еще одна область археометрии — «рацемизация» аминокислот. Во всякой кости, даже ископаемой, сохраняется небольшое количество белков, молекулы которых состоят из аминокислот. Оптически они дают две зеркальные структуры, называемые правой и левой в зависимости от того, как расположены группы по отношению к центральному атому углерода. У человека все аминокислоты правые. Но если аминокислоту предоставить самой себе, она будет медленно стремиться к восстановлению нормального равновесия с левой.

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

[smszamok]

рацемизуются (рацем — это соединение правой и левой аминокислот, когда они достигают равновесия). Следовательно, можно достоверно определить, к какому времени относится смерть. Так как этот метод открывает большие возможности для определения времени, его сегодня широко и повсеместно применяют: достаточно найти в точно определенном археологическом слое часть скелета человека или животного, чтобы датировать черепки и другие предметы.

Для датирования черепков применяется еще один новый способ — метод свечения. Еще с доисторического времени человек изготовлял сосуды и другие предметы из обожженной глины. Обжиг глиняного изделия в определенном смысле ставит на нуль «атомные часы» (это название рождено фантазией специалистов). О чем идет речь? В любом минерале, содержащемся в глине, из которой делают керамику, электроны смещены, атомная структура в своем роде нарушена. Объясняется это тем, что минерал подвергается бомбардировке космическими лучами. Каждая радиоактивная бомбардировка оставляет след на смещенных электронах. Когда глину нагревают для обжига, эти электроны возвращаются на свои места и высвобождают энергию, испускающую свет. Действительно, общеизвестно, что при нагревании любой предмет в определенный момент начинает светиться и, чем выше температура, тем ярче свечение.

Таким образом, в новом керамическом изделии нет смещенных электронов. Но за время пребывания в земле оно вновь подвергается бомбардировке космических лучей и электроны опять срываются с мест. Если взять изделие из керамики и нагреть до определенной температуры, оно будет испускать весь свет, произведенный смещенными электронами. Количество испускаемого света зависит от времени, которое изделие пробыло в земле. Метод довольно прост, но нужно уметь точно рассчитывать годовую дозу получаемых объектом космических лучей. Сделать это нелегко, поскольку нужно принимать во внимание разные факторы.

Ядерные методы применяются и непосредственно в консервационных работах. Например, гамма-излучением можно стерилизовать объект, подвергшийся плесени или нападению бактерий, таким образом, что он остается без изменений внутри и будет убито все, что находится на поверхности. Теоретически такая стерилизация менее вредна, чем обычно применяемые дезинфицирующие средства, но ее применение на практике вызывает сомнения, так как гамма-лучи оказывают воздействие на строение материала, что в будущем может привести к химическим реакциям, являющимся следствием начального повреждения.

Весьма интересны, наконец, современные методы, применяемые в Гренобле французскими ядерщиками. Они укрепляют разрушающиеся материалы, вводя внутрь еще не полиме-ризованную пластмассу и полимеризуя ее затем уже в самом материале.

Чудо святой Анны. Возможности, предоставляемые наукой и техникой, почти неограниченны. Химики способны удалить с камня плесень, воспрепятствовать росту на нем вредной растительности или уничтожить ее, не нанося ему ущерба; архитекторы могут построить, как это делается в храме Боробудур, арматуру и залить бетон в стены; укрепить фундамент, если он ослаб или подмыт. Я был в Варшаве, когда видный польский архитектор Цибаровский» занимался спасением от неминуемой гибели церкви святой Анны, которая находится в нескольких шагах от гостиницы «Бристоль», где я останавливался.

Эта операция заняла видное место в анналах истории охраны памятников, и о ней стоит напомнить. Построенная в 1454 году, дважды реконструированная и расширенная в XVII и XVIII веках, эта великолепная варшавская церковь возвышается на крутом берегу Вислы. В 1949 году заметили, что северо-восточной части здания грозит опасность обрушиться в реку вместе с выступом берега, на- котором она построена. Подземные воды, просочившиеся в песчаные пласты, лежащие над пластами глины, вызвали оползень. Чтобы укрепить склон, у подножия откоса была возведена мощная железобетонная стена длиной 50 метров. Кроме того, чтобы не допустить нового сползания, которое могло бы произойти вследствие геологической перфорации, у церкви на склоне холма было забито два ряда свай (залитых бетоном стальных труб). Одновременно приступили к просушиванию почвы методом электрического осмоса (то есть посредством алюминиевых электродов «боксити-зировали» землю) и цементации фундамента церкви на глубине восьми метров.

За месяц удалось добиться полной стабилизации грунта. Через два месяца церковь святой Анны, окруженная на уровне земной поверхности короной из железобетона, вновь открыла свои двери. Сегодня специалисты не одобряют применения электроосмоса, потому что нет гарантий продолжительности его стабилизирующего действия. Однако, если придерживаться фактов, следует констатировать, что со времени спасательной операции прошло 30 лет, а состояние фундамента знаменитой церкви не внушает никаких опасений.

Стоит вспомнить и еще об одной операции, проведенной несколько лет назад группой чехословацких инженеров в деревне Мост, недалеко от границы с Германской Демократической Республикой. Геологи обнаружили, что через этот населенный пункт проходит богатый пласт лигнита. Предполагая использовать месторождение для обеспечения топливом электростанции, правительство приняло решение снести деревню. Но там стояла исключительно красивая старинная церковь; понимая ее ценность и считаясь с чувствами верующего населения, власти решили не разрушать ее. Она была передвинута на километр по методу, который специалисты считают шедевром инженерного искусства. Все операции производились с чрезвычайной точностью при помощи электронного мозга, который управлял системой домкратов, поднимая или опуская их в зависимости от рельефа местности и таким образом постоянно поддерживая гигантское сооружение в абсолютно горизонтальном положении. Однако стоило ли прилагать столько изобретательности и труда ради нескольких миллионов тонн лигнита и не лучше ли было бы оставить деревню и ее прекрасную церковь на прежнем месте?

[/smszamok]

Таких примеров использования научных и технических достижений можно привести множество. Успехи современной техники, помогают нам укрепить подточенные временем старые стены и памятники. Когда-то на сооружение дворцов, храмов, соборов уходили годы, десятилетия и даже века. Но чтобы разрушить их, во время второй мировой войны хватало нескольких минут и одной бомбы или снаряда. Потом люди вновь тратили силы и огромное количество денег на реконструкцию или восстановление изуродованного. Уже после войны, в наше время подобное упорство может показаться несколько странным. Люди словно опасаются, что, оставив шедевры прошлого на произвол судьбы, они потеряют часть своей души.

11 Окт »

Когда вода — враг

Автор: Основной язык сайта | В категории: Популярно о химии
1 кол2 пара3 трояк4 хорошо5 отлично (1голосов, средний: 5,00 out of 5)
Загрузка...

Иногда процесс образования сернокислых солей идет и на неизвестняковых камнях, например на пористых песчаниках. Однако в этом случае в корках всегда обнаруживается высокое содержание сульфата кальция, порождаемое соседством известняков. Любопытное явление, именуемое разложением, наблюдается также на некоторых типах кирпичей, уложенных на известняковых породах.

Бывает и так, что камни разлагаются не сульфатом кальция, а другими солями. Эти растворимые соли, попадающие из почвы (щелочные и щелочноземельные нитраты, сульфаты и хлориды), кристаллизуются на поверхности материала, причем во время роста кристаллов образуются силы, достаточные, чтобы разорвать внутреннее сцепление в камне и разрушить его. Именно это случилось в

[smszamok]

Мохенджодаро, который тоже будет важным этапом нашего путешествия. Руины этого крупного города в долине реки Инд, восходящие к временам четырехтысячелетней давности, были открыты в 1922—1930 годах.

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

Почвенные воды всегда оказывали решающее разрушительное воздействие на строительные материалы, вызывая сульфатное выветривание камня или выпадение солевых кристаллических осадков. В самом деле, вода действует и как растворитель, и как переносчик тех веществ, которые затем оседают в соединительных швах и пустотах в самом камне. В частности, ученым удалось установить, что размягчение форм ассирийских скульптур из алебастра явилось следствием превращения известняковой породы в растворимый бикарбонат кальция.

Еще один страшный враг камня — холод. Известно, что, если наполненную водой бутылку оставить при низкой температуре, она разрывается, так как, замерзая, жидкость увеличивается в объеме на девять процентов. То же явление происходит и в порах материалов. Доказано, что в результате быстрого замерзания воды при минус пяти градусах создается давление порядка 500 килограммов на квадратный сантиметр. Такое давление может вызвать растрескивание многих горных пород.

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

Таким образом, разрушение камней чаще всего является следствием комбинированного воздействия атмосферных агентов (воды, температуры, ветра) в сочетании с деятельностью живых организмов. К этим двум факторам порой добавляются такие катаклизмы, как землетрясения и извержения вулканов, военные действия и легкомыслие людей, которые никогда не думают о невероятной хрупкости своих памятников.

Угроза бульдозера. В Европе материальные остатки культур как свидетельства истории человечества оказались в центре внимания в период итальянского Возрождения. В Новом Свете первые археологические работы провел Томас Джефферсон, который в конце XVIII века обнаружил в Виргинии древнее поселение американских индейцев. По мере развития народов и культур, возникновения новых городов и освоения все более обширных земель неизбежным становилось разрушение старинных центров или зданий и памятников, и человечество лишалось части своего исторического и художественного достояния.

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

После окончания \ второй мировой войны все интенсивнее развивается процесс индустриализации. Происходят беспрецедентные изменения в окружающей среде, в результате чего историческое и художественное наследие оказывается в опасности. Это побуждает власти всех стран и крупные международные организации, прежде всего ЮНЕСКО, составлять опись понесенного ущерба, изучать его причины и координировать действия по охране памятников, как мы увидим ниже, в международном масштабе. Стало ясно (хотя далеко не все признают это), что, если мы хотим сохранить наше прошлое, необходимо радикально изменить наш образ жизни и развитие общества и разработать модели прогресса, принимая во внимание природу и все созданное людьми на протяжении тысячелетий.

В 1965 году профессор Джон О. Брью, известный ученый, директор Музея Пибоди Гарвардского университета, в статье, подготовленной для ЮНЕСКО , набросал впечатляющую картину опасностей, угрожающих сокровищам культуры вследствие осуществления технических проектов, в особенности крупномасштабных. Самая страшная угроза исходит от плотин, возводящихся для орошения, производства электроэнергии и защиты от наводнений. Плотины создают водохранилища, часто затопляющие обширные • области, где иногда оказываются остатки культур прошлого. Полагают, что в бассейне Большой Миссури около четырех пятых доисторических поселений было расположено у самых берегов реки или вдоль ее крупных притоков. В результате строительства плотин в течение последних 30 лет были затоплены все известные археологические объекты, представляющие собой наследие, оставленное нам пятью основными доисторическими культурами. В Египте дело кончилось лучше. Асуанская рлотина создала водохранилище, протянувшееся на 500 километров от первого до третьего порога Нила. Но мобилизация мировой общественности, с энтузиазмом откликнувшейся на призыв ЮНЕСКО, позволила не только спасти храмы Абу-Симбела, но еще до затопления обследовать территорию, на которой в течение по меньшей мере полумиллиона лет жили люди.

В 1976 году к тому же способу прибегли, чтобы спасти от неминуемой гибели остатки доисторических культур в районе Сальто-Гранде, где Аргентина и Уругвай строят гигантскую плотину. Первые же раскопки доказали существование здесь когда-то населенных центров, где устанавливались контакты между племенами охотников. Эти охотники стали потом земледельцами и поселились в пампе на территории нынешних Аргентины и Бразилии. Раньше об этих поселениях было почти или ничего неизвестно. В ходе последующих раскопок (их вела международная экспедиция, включающая французских, канадских, аргентинских и бразильских археологов) на берегах притока реки Уругвай были обнаружены камни с насечкой, скрытые под слоем вулканического пепла девя-титысячелетней давности. Камни, доказывающие присутствие в этих местах человека во времена, когда, как предполагалось, его еще здесь не было, найдены на этой территории и в других местах. На одной или на обеих сторонах плоских камней вырезаны геометрические рисунки, но пока неясно, что они означают.

Но самым сенсационным открытием в этих районах были человеческие останки. На одном из островов реки Уругвай найдено 81 захоронение, содержащее не целые скелеты, а кучки костей. Анализы показали, что обитатели этих мест придерживались обычая перед захоронением расчленять мертвецов и красить останки веществом цвета охры. В более позднюю эпоху прах стали предавать земле в керамических урнах. Три таких сосуда, найденных на острове Арриба, как установлено, относятся ко времени появления испанцев, так как наряду с медными украшениями там были обнаружены стеклянные бусины того же типа, какие конкистадоры раздавали индейцам. Однако существовали не только эти два способа захоронения. В ходе раскопок найден целый скелет, погребенный в горизонтальном положении и покрытый той же желтоватой краской, но вместо черепа у него была груда раковин. Эдакое сюрреалистическое творение, достойное фантазии какого-нибудь доисторического Сальвадора Дали!

Часто невосполнимый ущерб причиняет историческому наследию строительство шоссейных дорог. Широкие автострады, создание карьеров для добычи щебня наносят огромные раны сельской местности. Безжалостно уничтожается все стоящее на пути. В большинстве стран, где есть могильные курганы, строители стремятся разбросать их, а камни пустить в дело. Наиболее скандальная история произошла в Хараппе, в Пакистане. Этот город, руины которого насчитывают несколько тысячелетий, был обнаружен случайно. Когда у строителей железной дороги Карачи — Лахор стало не хватать материала для возведения насыпи, они начали искать поблизости что-либо подходящее для этой цели и обнаружили множество красных кирпичей. Эти кирпичи были слеплены и обожжены доисторическими людьми, давшими жизнь великой Хараппс-кой цивилизации.

[/smszamok]

Практически все, что мы строим (нефте- и газопроводы, высоковольтные линии электропередачи, новые жилые районы, железные дороги, аэропорты, промышленные предприятия, военные объекты), калечит или может искалечить наше прошлое. Обычно мы даже не представляем себе, какого размаха достигли подобные работы в последние десятилетия и какое огромное пространство они охватывают.

В заключение напомним о том, какой вред причинили каменоломни. В ряде западноевропейских стран, особенно в Италии, Франции, ФРГ и Великобритании, в результате эксплуатации каменоломен были изуродованы красивейшие ландшафты, разрушены многие памятники времен палеолита. И каждый раз, уничтожая такое наследие, мы лишаем себя возможности познать часть самих себя.

1 кол2 пара3 трояк4 хорошо5 отлично (Еще не оценили)
Загрузка...

Параметр-значение сообщает подпрограмме «собственную» сменную. В начале выполнения вызова подпрограммы этой сменной присваивается значение аргумента. Соответствующим аргументом может быть произвольное выражение того же типа, что и тип параметра (или типа, совместного за присваиванием с типом параметра).

Примеры аргументов, которые є выражениями, нам знакомые из вызовов стандартных подпрограмм: sqrt(b*b-4*a*c) , chr (ord ( ‘ 0 ‘ ) +1) , writeln (x*x) и т.п..

В вызовах нашей процедуры min первые два аргументы тоже могут быть произвольными выражениями типа integer, например min (10+х,3*х,v), где х, v — имена целых сменных.

Этот способ передачи данных в подпрограмму называется подстановкой аргумента на место параметра по значению.

ПОДСТАНОВКА ЗА ССЫЛКОЙ

Параметр-сменная во время выполнения подпрограммы обозначает одну и ту же сменную, которую обозначает соответствующий ему аргумент, указанный в вызове. Чтобы обеспечить это, к памяти подпрограммы передается ссылка на эту сменную. Соответствующим аргументом может быть ім ‘я ЗМІННОЇТОГО же типа, что и у параметра.

Примеры аргументов, которые отвечают параметрам параметр-сменным: readln(a,b,c) или іпс(х), а также третий аргумент в вызовах нашей процедуры min.

Этот способ передач данных в подпрограмму называется подстановкой аргумента на место параметра за ссылкой.

ЧТО ВЫБИРАТЬ?

Если после вызова подпрограммы используется старое значение аргумента или аргументом может быть произвольное выражение, ему имеет відпо-;»;Яати параметр-значение.

Вспомогательные алгоритмы, или подпрограммы

Если после вызова подпрограммы должны использоваться новое значение аргумента, полученное при выполнении вызова, то параметр надо объявить как параметр-тінну.

Первое правило имеет исключения, связанные с массивами (см. раздел 7). Параметры х и у процедуры min (см. выше) иллюстрируют первое правило, параметр z — второе.

ПАРАМЕТРА-КОНСТАНТЫ

В языке Turbo Pascal есть еще один разновидность параметров — параметра-константы; они объявляются со словом const в начале. Аргументом для них может быть произвольное выражение того же типа, что и параметр.

Подстановка происходит так. Значение аргумента исчисляется и запоминается в участке памяти подпрограммы, которая вызывает (аналогично к параметров, а в подпрограмму, которая вызвана, передается ссылка на этот участок (как для параметр-сменных). Итак, этот механизм разрешает использовать аргументы-выражения и не требует копирования их значений к памяти вызова подпрограммы. Присваивание параметрам-константам запрещено; их обнаруживает транслятор.

1 кол2 пара3 трояк4 хорошо5 отлично (Еще не оценили)
Загрузка...

Функция является второй разновидностью подпрограммы. Вызов функции является выражением (числовым, булевим и т.п.). Значением этого выражения становится значение, которое исчисляется при выполнении вызова функции и в некоторый специальный способ возвращает в программу.

Пример 1. Вспомним вычисление минимального с двух целых значений. Результатом этого вычисления есть одно скалярное значение (число), которое удобно использовать как выражение, например, указать его как аргумент в вызове процедуры writeln.

В приведенной выше процедуре min нужное значение возвращало в память программы как значение аргумента, соответствующего параметр-сменной. Тем не менее это возвращение можно организовать иначе. Рассмотрим программу вычисления минимального с двух заданных целых чисел с помощью функции.

program MinOfTwoNumbers; var a, b : integer;

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

function min(x,y : integer) : integer;

begin

if x<y then min:=x else min:=y

end;

Begin

wrіteln(‘Задайте два целых числа:’)

readln(arb);

{вызов функция-аргумент в вызове процедуры}

writeln(‘Минимальное Из них: ‘, min(a,b));

End.H

Подпрограмма, что является функцией, начинается служебным словом function. После дужек с параметрами записывается двоеточие и тип значения, которое возвращает из вызова функции.

Возвращение значения происходит по помощи специальной сменной, которую обозначает имя функции (в приведенном примере это min). В теле функции обязательно должны быть операторы присваивания с именем функции в левой части, причем при выполнении вызова должны выполняться хотя бы один из них. Окончательное значение этой сменной возвращает из вызова функции.

Проиллюстрируем выполнение приведенной программы, считая, что сменные а таЬ во время введения получают значение 1 и 2. Сменная, одноименная с функцией, имеет «собственную» участок пам ‘яти и в таблице обозначенная min. min. Когда заканчивается вызов min, п значения присваивается дополнительной сменной, которая есть в «машинной» программе и обозначенная «Аргумент writeln» (см. табл. на с. 106).

Вызов функции является выражением и может быть частью более сложного выражения (мы видели это раньше, используя стандартные функции).

Примеры использования вызовов min

1.         Если с какой-то целью нам надо вычислить квадрат значения, которое возвращает из вызова min, или прибавить к нему 1, можно написать выражение sqr (тел (a,b)) или, соответственно,min (a,b) +1.

2.         Для вычисления минимального с трех целых значений a, b, с можно записать такие вызовы функции min.

m:=min(a,b);  m:=min(m,c)

Вместе с тем, минимальное с трех целых значений a, b, с является значением выражения min (min (а,b) , с). При его вычислении, когда начинает выполняться «внешний» вызов min, надо вычислить значения первого аргумента, а им есть «внутренний» вызов min (a,b). Поэтому выполняется этот «внутренний» вызов. Лишь потом значения, которые возвращает из него, присваивается первому параметру в выполнении «внешнего» вызова.

Аналогично минимальное с четырех значений задает выражение min (min (a,b) ,min (c,d)).

Пример 2. Прочитать длины четырех отрезков (гарантированиный, что это попарно разные додатні целые числа) и вычислить количество треугольников, которые из них можно образовать.

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

Напишем функцию, которая вычисляет признак,  можно ли с трех отрезков образовать треугольник. Но возвращать из нее будем не булеве значение этого признака, а целое (0 отвечает false, 1 — true). Это разрешит просто напечатать сумму этих признаков:

program NumberOfTriangles;

var a, b, c, d : integer; function triangle(x, y, z : integer) : integer; begin

triangle:=ord{(x+y>z) and (x+z>y) and (y+z>x)) end; Begin

wrіteln(‘Задайте четыре додатних целых числа:’) readln(a,b,crd);

wrіteIn(‘Количество треугольников: ‘, triangle(a,b,c)+triangle(a,b,d)+ triangle(a,c,d)+triangle(b,c,d)) End.

Имя функции, записанное на месте выражения (по правую сторону в операторе присваивания, в условии разветвления или цикла, как аргумент в вызове и т.п.), обозначает вызов этой функции. Если эта функция имеет параметры, а в выражении записано лишь ее имя, это является синтаксической ошибкой.

Записывать имя функции в вызовах процедур введение запрещено (в отличие от записи в левых частях операторов присваивания).

9 Окт »

Пирамидальная сортировка

Автор: Основной язык сайта | В категории: Изучаем информатику
1 кол2 пара3 трояк4 хорошо5 отлично (Еще не оценили)
Загрузка...

Описанное здесь сортировка в среднем медленнее, чем быстрое, хотя и имеет сложность в наиболее плохом случае B(n\ogn) . Тем не менее этот алгоритм применяется для сортировки файлов и решение некоторых других задач. Пирамидальная сортировка (или сортировка с помощью груды) использует бинарное дерево (пирамиду). Рассмотрим цс понятие. Расположим элементы массива с индексами 1..к строками, удваивая количество элементов в строках: в первой строке — первый элемент (с индексом 1), во второму — с индексами 2 и 3, в третьему — с индексами 4-7, дальше— 8-15 и т.п.. Последняя строка может остаться неполным, Например, при п = 10 будет образована пирамида индексов, как на рисунке.

Рассмотрим пирамиду как бинарное дерево с корнем наверху и листвой внизу. Дерево образовано узлами, которые відловідають индексам, и связями между ними — дугами. Корнем дерева является узел 1. Узлы 2 и С назовем сыновьями узла І (их отца), узлы 4 и 5 — сыновьями 2 и т.п.. Узлы, которые не имеют сынов, называются листками (на рисунке это узлы 6-10. Итак, если узел и имеет сынов, то ими есть узлы с индексами 11 и 2/ + 1, а его отцом является узел с индексом / div 2.

Дальше будем рассматривать узлы дерева, которые содержат значение элементов массива с соответствующими индексами, Для сортировки важным есть упорядочения значений в массиве, за который при каждому возможному и исполняется неровность А\\ div 2] >/4[j], т.е. «сын не больше отца». Это свойство не касается лишь корня дерева, поскольку он не имеет отца. Дерево с этим свойством называют правильным, или правильной грудой. Рассмотрим пример правильного дерева, которое отвечает последовательности значений

Сортировка с помощью груды использует то, что корень правильной груды содержит ее максимальное значение. Сначала в массиве образуем правильную груду, дальше поменяем местами значения первого элемента массива (корня дерева) и последнего. Наибольшее значение займет «свое» последнее место в массиве, и дальше о нем можно забыть. Среди сдачи элементов массива восстановим основное свойство груды и обменяем местами значения первого элемента и теперь уже предпоследнего, и так будем действовать дальше, пока дерево не сократится до одного элемента. procedure   heapSort(var   A:alnt;   n:word);

var   j:word;    {индекс   последнего} begin

build(A,n);    {начальное   построение   хупи} for   j:=n   downto   2   do   begin swap(A[l],A[j]);

rebuild(A,1,j-1)    {восстановление  правильности} end end;

Сначала уточним процедуру rebuild восстановление правильности груды. Если значение в корневом узле изменилось, основное свойство в нем может не выполняться, поэтому по потребности больший из сынов обменивается с отцом, после чего основное свойство проверяется и восстанавливается для сына. Действия из восстановление правильности груды в части массива А]/], …, A[d] нетрудно уточнить рекурсивной процедурой.

  • procedure   rebuild(var  A:alnt;   f,d:word); var   maxSon:word;    {индекс   максимального   сына} begin
  • maxSon:=f;
  • if    (2*f<=d)and(A[f]<A[2*f])
  • then  maxSon   :=   2*f;
  • if    (2*f+K=d) and(A[maxSon]<A[2*f+1])
  • then maxSon:=2*f+1; if   maxSonOf   then   begin swap(A[f] r[maxSon]) ; rebuild<A,maxSon,d); end; end;
  • Приведенная процедура является примером так называемой «хвостовой ре-курсії», когда после рекурсивного вызова нет никаких действий. В подобных ситуациях рекурсию можно заменить циклом, условие завершения которого отвечает условию «дна рекурсн». Очевидно также, что перестройку дерева можно закончить, если значение максимального сына и отца местами не обменивались. В этой ситуации, чтобы прекратить выполнение цикла, присвоим индекса «отца» f значение за пределами части массива, который перестраивается. Итак, приведем нерекурсивный вариант процедуры rebuild, procedure   rebuild(var   A.alnt;    f,d:word); var  maxSon:word;    {индекс   максимального   сына} begin
  • while (2*f<=d)do begin
  • maxSon:=f;
  • if   <M?]<A[2*ff]) then maxSon:=2*f;
  • if    (2*f+K=d)andCA[raaxSon]<   A[2*f+1]) then maxSon:=2*f+l; if   maxSonOf   then  begin swap(A[f],A[maxSon]);
  • f :=maxSon  -{дальше  перестройка пирамиды сына} end
  • else   f:=d+l; end;
  • {2*f   >  d   или   A[f]    >= A[maxSon]} end;

В конце концов уточним начальное построение груды за процедурой build. Заметим, что в массиве с п элементами максимальным ‘индексом узла-отца есть п div 2. Итак, последовательно образуем правильные груды в піддеревах, корнями которых являются узлы п div 2, п div 2 — и,…, 1. Это разрешит утверждать, что построенный массив представляет собой правильную груду.

  • procedure build(var A:alnt; n:word); var и:word;
  • begin
  • for i:=n div 2 downto 1 do
  • rebuild(A,i,n); {перестройка чаотини массива}
  • end;

Оценим сложность алгоритма. Очевидно, что она прямо пропорциональная общему количеству вызовов rebuild. При выполнении build процедура rebuild вызывается п div 2 раза, а при выполнении цикла for процедуры treeSort — еще л — 2 раза, т.е. общее количество вызовов процедуры rebuild из других процедур есть ®(п).

Оценим сложность выполнения одного вызова процедуры rebuild. Заметим, что в цикле значения сменной f не менее чем удваивается, а цикл не будет продлеваться, если это значение станет больше d, которое не больше г. Итак, таких удвоений не может быть больше чем |_log2 п\ . Количество действий в теле цикла является константой, поэтому общая сложность имеет оценку 0{n\ogn). Высотой узла дерева называют количество ребер в наиболее длинном пути из этой вершины вниз к листкам; высоту корня называют высотой дерева. Дерево, которое образовано как пирамида с п узлов, имеет высоту log2 п .

9 Окт »

Быстрая сортировка

Автор: Основной язык сайта | В категории: Изучаем информатику
1 кол2 пара3 трояк4 хорошо5 отлично (Еще не оценили)
Загрузка...

Первый алгоритм быстрой сортировки 1960 года разработал Ч.А.Р. Хоар (CA.R.Hoare). Этот алгоритм есть одним из найпопу-лярніших, поскольку сравнительно нескладный в реализации, хорошо работает на разнообразных видах входных данных и не требует огромных объемов дополнительной памяти (кроме относительно небольшого стека).

Идея быстрой сортировки такая. В некоторый способ выбирается эталонное значение есть. Значение элементов массива А обмениваются так, что массив разбивается на две участка — левую и правую. Элементы в левом участке имеют значение не больше есть, а в правой — не меньше. После этого достаточно отдельно отсортировать эти две участка.

Существует простой, но довольно эффективный способ выбора есть в участке массива A[L],…, A[R]: есть = A[(L+R) div 2]. Для разбивки используются два индекса — «левый курсор» и и «правый курсор» j. Сначала i=L, j=R; дальше они двигаются навстречу друг другу в такой способ. Значение меньше есть («хорошие») в левой части пропускаются, а на «плохому» движение останавливается. Аналогично после этого в правой части пропускаются значение, которые большие есть. Если и еще не стал больше j, то это означает, что оба они указывают на «плохие» значение. Эти значения обмениваются местами, а курсоры сдвигают навстречу друг другу. Движение курсоров продлевается, пока и не станет больше j. Тогда все элементы от A[L] к А[ j] имеют значение не больше есть, а все от А [и] к A[R] — не меньше. Эти две участка, если их длина больше 1, делятся и сортируются рекурсивно. Если же участок имеет длину 1, то ее уже отсортировано.

Оформим сортировка части массива A [L], …, A[R] такой процедурой:

  • procedure   quicksort(var  A:alnt;   L,R:word); var   e:integer;    {эталонное   значение} и,j:word;    {левый   и   правый   курсоры) begin
  • и:=L;   j:=R; e:=A[(i + j)    div   2] ; while   i<=j   do begin
  • while  A[i]<e   do   inc(i); while   A[j]>e   do   dec(j); if   i<=j   then  begin swap(A[i],A[j]); inc(i);   dec(j); end; end;
  • {i  >  j};
  • if L<j {сортировать левый участок) then quicksort(A,L,j); if i<R {сортировать правый участок) then quicksort(А,и,R); end;

Оценим сложность приведенной реализации быстрой сортировки. Пусть массив А имеет п элементов. В наиболее плохом случае в каждом вызове процедуры quicksort эталонным значением есть меньше всего в участке от A. [L] AO[R] , и разбивка участка массива длиной т дает участка длиной 1 и т — 1, Поскольку т = п, п—1, …, 2, глубина рекурсии достигает 0(и), и при каждом значении т разбивка участка длиной т имеет сложность ОБ(т). Тогда суммарная сложность имеет оценку 0 (w) + 9 (« -1)+…+Є>(2) = 0(л2) .

Тем не менее описанный наиболее плохой случай в реальных данных практически никогда не случается. Для подавляющего большинства данных разбивки участка массива дает две участка с приблизительно равными длинами. Поэтому размеры массивов, которые сортируются, при переходе на следующий уровень рекурсии уменьшаются приблизительно вдвое. Итак, в среднем количество уровней рекурсии оценивается как 0(log п). Очевидно, что на каждом равные рекурсии суммарная сложность есть 0(п), поэтому общая сложность в среднем имеет оценку 0(nlogn).

Многочисленные практические исследования свидетельствуют, что приведенный алгоритм в среднем работает быстрее, чем другие алгоритмы сортировки, которые имеют сложность наиболее плохого случая O(n)ogri) . Быстрая сортировка не сохраняет взаимного порядка одинаковых значений, т.е. есть неустойчивым.

Для выбора эталонного значения существует много способов, а не только выбор A[(L + R)/2). Если эталонным есть одно со значений в сортированной части массива, ведь это разрешает не беспокоиться о предотвращении выхода за границы сортированной часть и не проверять дополнительных условий.

Выбор «золотой середины» (значение, которое должных быть посредине, или медиана) требует немалых дополнительных усилий и может вообще ухудшить оценку сложности. Тем не менее довольно эффективным есть выбор среднего с трех значений — первого (с индексом L), последнего {R) и срединного ((І + R)/2). Для этого перед выбором эталону их можно обменять местами таким образом.

  • if  A[L]   >  A[(L+R)    div   2]
  • then   swap (A[L] ,A[ (L+R)   div   2] ) ;
  • if   A[(L+R)    div   2]    >  A[R]
  • then   swap   (A[(L+R)   div   2],A[R]>;
  • if  A[L]    >  A[(L+R)    div   2]
  • then   swap(A[L],A[(L+R)    div  2]);
  • e   := A[(L+R)   div   2];

Еще два способа выбора эталонное значение приведено в задачах к этой главе.

Итеративная версия алгоритма. Запишем итеративную процедуру, в которой явным образом реализуем обработку стека, необходимую для выполнения рекурсивной процедуры. Смоделируем программный стек с помощью массива Stack, в котором будем сохранять левые и правые границы сортированных підмасивів. Сначала присвоим элементам массива Stack значение 0 с помощью стандартной подпрограммы f illchar.

  • procedure   Quicksort(var  A:alnt;   nrword); var   i,   j,   L,   R,   top   :   word; e   :   integer;
  • Stack   :   array[1..N_max,1..2]   of   word; Begin
  • FillChar(Stack,SizeOf (Stack) ,0) ;
  • top:=l;    {индекс   верхушки   стека}
  • Stack[top,1]    :=  1;   Stack[top,2]    := N;
  • while   top>0   do
  • begin
  • L:«Stack[top,1]; R:=Stack[top,2];
  • dec(top);
  • e:=A[(L+R) div 2];
  • и:»L; j:=R;
  • repeat
  • while (A[i]<e) do inc(i); while (A[j]>e) do dec(j); if i<=j then begin Swap(A[i],A[j]); inc(i); dec(j); end; until i>=j; if L<j then begin inc(top);
  • Stack[top,1]:=L; Stack[top,2]:=j; end;
  • if i<R then begin inc(top); Stack[top,1]:=i; Stack[top,2]:=R;
  • end; End; End;
9 Окт »

Сортировка «слиянием»

Автор: Основной язык сайта | В категории: Изучаем информатику
1 кол2 пара3 трояк4 хорошо5 отлично (Еще не оценили)
Загрузка...

В основе алгоритмов сортировки «слиянием» лежит объединение двух упорядоченных последовательностей в одну. Это похоже на перестройку двух колон учеников, выстроенных за ростом, в одну. Ученики, первые в своих колонах, сравниваются; вышей становится в новую колонну, другой остается первым в своей. После этого в колонне, из которой пошел ученик, следующий за ростом учений становится первым. Снова сравниваются первые, и так они действуют, пока в одной из колон никого не останется — тогда сдача другой колонны перейдет в хвост новой без изменения порядка.

Пусть в массиве А з элемента A [L ] начинается упорядоченный участок длиной m-L + 1, а из элемента А [га+1] — участок длиной R-m. Под упорядоченным участком (отрезком или серией) понимаем участок, который не является частью другого упорядоченного участка. Например, длина таких упорядоченных участков равняется m-L + 1 = 3 и R-m = 3.

  • из
  • L         m         m+1     R
  • Они объединяются в такой участок длиной R-L+1 во вспомогательном массиве В.
  • 13
  • L         m         m+1     R
  • Рассмотрим процедуру слияния в массив Z пары сопредельных участков массива X, в котором левая содержит индексы от L до т, а права — відт+1 flo.
  • procedure  merge(var   X,Z:aInt;   L,m,R:word); var   k:word;    {индекс   в целевом  массиве} и, j:-word;   {индексы  в половинах) begin
  • и:=L;   j:=т+1; for   k: =L   to   R  do
  • {заполнение элементов Z[L], …, Z[R]) if и>m then
  • begin Z[k]:=X[j]; inc(j) end else if j>r then
  • begin Z[k]:=X[i], inc(i) end
  • Сортировка линейных массивов
  • else   if   X[i]<X[j]    then
  • begin   Z[k]:=X[i];   inc(i)    end else  begin   Z[k]:=X[j];   inc(j)   end end;
  • Очевидно, тело цикла выполняется R — L + І раз, и каждый раз выполняется 0(1) элементарных действий. Итак, сложность выполнения вызова процедуры merge есть &(R-L + l).

Алгоритм сортировки слиянием заключается в повторении таких шагов слияния пар. В массиве происходит поиск пары сопредельных упорядоченных участков, которые объединяются в один участок вспомогательного массива, например, с помощью процедуры merge. Потом происходит поиск и объединяется следующая пара и т.п.. Возможно, в конце останется участок, который не имеет пары, — ее будет скопировано без перемен. На следующем шаге происходит подобное слияние пар участков вспомогательного массива в основной. Шаги повторяются, пока какой-либо из массивов не превратится на один упорядоченный участок. Если это вспомогательный массив, он копируется в основной. Продемонстрируем выполнение алгоритма на массиве А = < 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1> длиной п = 11.

Упорядоченные последовательности выделены дужками < >, пары участков, которые объединяются, отделенные «;», В— имя вспомогательного массива.

  • А = «11Х10>; <9><8>; <7><6>; <5><4>; <3><2>; <1»
  • В= «10, 11X8, 9>; <6, 7X4, 5>; <2, 3><1»
  • Л = «8, 9, 10, 11X4, 5, 6, 7>;<1,2, С»
  • Я = «4, 5,6, 7, 8, 9, 10, 11X1,2,3»
  • Л = <1,2, 3, 4, 5,6, 7, 8, 9, 10, 11>

Как видим, массив отсортирован за четыре шага слияния.

После первого шага слияния длина упорядоченных участков не меньше 2 (за исключением, возможно, «хвоста» длиной 1), после второго — не меньше 4 (кроме, возможно, «хвоста» меньшей длины) и т.п.. Итак, после /-го шага длина упорядоченных участков, кроме, возможно, «хвоста», не меньше 2′. Пусть п — количество элементов массива. На последнему, к-му, шаге объединяются две участка; первая из них имеет длину не меньше 24″1, причем 2*»1 < г.  Итак, количество шагов к < log« + l. За счет возможного дополнительного копирования количество шагов надо увеличить на 1, но оценка 0(logn) сохранится. На каждом шаге общее количество элементарных действий есть 0(и), поэтому сложность алгоритма — 0(и • log п).

Реализуем алгоритм сортировки слиянием с помощью процедуры sortByMrg. Шаг слияния участков одного массива в другого оформим функцией mergeStep. Она возвращает признак того, что на шаге слияния было найдено хотя бы одну пару упорядоченных участков. Если пара не найдено, то массив, начальный в вызове функции, отсортировано. На непарных шагах слияния функция mergeStep выполняет слияние участков основного массива А у вспомогательный массив В, на парных — наоборот. Якшо массив, начальный в вызове mergeStep, оказался отсортированным на парном шаге слияния, значит, это массив В, и его надо скопировать в основной массив А, А если на непарном шаге, то это массив А, и больше ничего делать не надо.

Пара сопредельных упорядоченных участков и-елементного массива (первый из них начинается индексом left) ищет функция findPair. Она возвращает признак того, что пар найден. Правые границы участков сохраняются в ее параметрах mid и right. Если после ее вызова исполняется условие (lef t=l) and (right=n), то пара не найдено, т.е. массив отсортирован. Для слияния используем процедуру merge (см. выше). Вспомогательная процедура копирования участка массива в другой массив copy Аг есть очевидной.

  • procedure copyAr<var X,r:alnt;
  • left,right:word)); var и:word; begin
  • for i:= left to right do Y[i]:= X[i] end; function findPair(var X:alnt; n,left:word;
  • var mid, right   word): boolean; {функция возвращает признак «того, что пара сопредельных упорядоченные участки найдены} begin
  • findPair := false; if left <= n then
  • Сортировка линейных массивов
  • begin
  • mid := left;
  • while (mid<n)and(X[mid]<=X[mid+1]) do
  • inc(mid); {(mid=n) or (X[mid]>X[mid+l])} if mid~n    {правая граница — конец массива} then right:=mid else
  • begin {поиск правой границы} findPair := true; right := mid+1; while(right<n)and(X[right]<=X [right+1])
  • do inc(right); {(right=n) or (X[right]>X[right+l]} end; end; end;
  • function mergeStep(var X,Y:aInt; n.word): boolean;
  • {функция возвращает признак того, что слияние массива X в массив Y состоялось} var left,mid,right:word; begin
  • mergestep:=true; left:=l;
  • while findPair(X,n,left,mid,right) do begin merge(X,Y,left,mid,right) ; left:=right+l end;
  • {последний вызов findPair возвратил false} if (left=l)and(right=n)
  • then mergeStep:=false {массив X отсортировано} else if left<=n
  • then copyAr(X,Y,left,n); {копирование «хвоста»} end;
  • procedure sortByMrg(var A:alnt; n:word); var B:alnt;    {вспомогательный массив}

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

9 Окт »

Алгоритмы сортировки вставками

Автор: Основной язык сайта | В категории: Изучаем информатику
1 кол2 пара3 трояк4 хорошо5 отлично (Еще не оценили)
Загрузка...

Алгоритмы сортировки вставками отличаются от приведенных выше алгоритмов тем, что ищутся не «элементы для мест», а «места для элементов». Из семейства этих алгоритмов рассмотрим алгоритм прямых вставок. В массиве выделяем две части: отсортированную и нет. Сначала отсортированная часть содержит только первый элемент (сам по себе благоустроенный). Дальше каждый раз берем

[smszamok]

первое значение и «перетягиваем» его к отсортированной так, чтобы она не потеряла благоустроенности. Для этого передвигаем текущее значение по левую сторону до тех пор, пока оно не займет свое правильное место в отсортированной части массива, т.е. когда значение по левую сторону и по правую сторону текущего будут стоять «правильно» относительно него. Итак, элемент «вставляется» в отсортированную часть массива (откуда и название метода).

  • procedure insertSort(var A:alnt; n:word);
  • var и, k : word; begin
  • for k:=2 to n do begin и : =k; while (A[i]<A[i-l])and(i>l) do begin
  • swap(A[i], A[i-1]); dec(i); end; end; end;

Поскольку сдвиг элемента на одну позицию по левую сторону «стоит» три команды присваивания, рекомендуем запомнить эталонный элемент (тот, для которого ищется место в отсортированной части) в дополнительной сменной. Тогда сдвиг можно выполнить одним присваиваниям, а запам’ятований элемент потом одним присваиваниям поставить на уволенное место.

  • procedure insertSort (var A:alnt; n-.word);
  • var i, k : word; etalon : integer; begin
  • for k:=2 to n do begin etalon:=A[k]; i:=k;
  • while (i>l) and (A[i-1]>etalon) do begin A[i]:=A[i-l]; dec(i);
  • end;
  • А[и] :=etalon; end; end;

Сложность этого метода также имеет оценку Щп2). В нем, как и в сортировке «пузырьком», выполняется много обменов соседних элементов. В 1959 году Д.Шелл предложил усовершенствование алгоритма прямых вставок. Его идея — сравнивать элементы, которые находятся на определенном расстоянии один от другого и уменьшать это расстояние.

Рассмотрим пример. Пусть массив имеет такой вид: 44     55      12      42      94      18      06      67 Сначала отдельно сгруппируем и упорядочим с помощью прямых вставок элементы, которые находятся на расстоянии 4 (четвертное упорядочение). В этом примере восемь элементов, поэтому группы содержат по два элемента.

  • 1
  • 1
  • 55
  • 94
  • f
  • 67
  • 44      18      06      42
  • Теперь сгруппируем элементы на расстоянии 2 [двойное упорядочение). Имеем две группы по четыре элемента.
  • J          и          І           \
  • Об      18      12      42      44      55      94      67
  • t           и          t           t
  • В конце концов, выполним обычное (одинарное) упорядочение, сравнивая соседние элементы.
  • 06     12      18      42     44      55      67      94 З описанного понятно, что начальное расстояние h = и/2. После каждого прохода она уменьшается вдвое.
  • procedure ShellSort(var A:alnt; n:word); var и, j, h : word; temp   integer; begin
  • h := n div 2; while h>0 do begin ,  for и := h to n-h+1 do
  • begin
  • j:=i; temp:=А[и];
  • while (j>=h)and(temp<A[j-h]) do begin A[j]:=A[j-h]; dec(j,h); end;
  • A[j] := temp; end;
  • h := h div 2; end; end;

[/smszamok]

Итак, идея метода Шелла: изменить массив так, чтобы каждая группа элементов на расстоянии h была благоустроенной. Это разрешает за некоторого ряда расстояний сравнения h, последняя из которых равняется единице, получить упорядоченный массив. Но какую последовательность шагов следует избрать? Было изобретено много рядов расстояний h, которые хорошо зарекомендовали себя, но наилучшей среди них нет. Доказано лишь, что лучшие результаты дают расстояния, которые не являются делителями одна одной. В основном используют нисходящие геометрические прогрессии, поскольку в этой ситуации количество шагов близкое к log г.

9 Окт »

Задача для самостоятельного выполнения

Автор: Основной язык сайта | В категории: Изучаем информатику
1 кол2 пара3 трояк4 хорошо5 отлично (Еще не оценили)
Загрузка...

Предусмотреть возможность прибавлять к таблице строки. Подсказка. Разместить на форме еще две кнопки Button2 («Добавить»), Button3 («Изъять») и компонент Edit 1 для введения названия страны, которая будет прибавляться к таблице .Для компонентов Button создать процедуры обработки события OnClick (см. листинг программы).

Листинг программы:

unit olimp_;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

Grids, StdCtrls, ExtCtrls;

type

private

public

end; var

Forml: TForml; implementation {$R *.DFM}

 

procedure TForml.FormActivate(Sender: TObject);
begin

tabl.Cells[0,0]:

= ;

tabl.Cells[1,0] :

=1Золотых’;

tabl.Cells[2,0]:

=’Серебряных’;

tabl.Cells[3,0]:

= ЛБронзовых’;

tabl.Cells[4,0]:

= ‘Всего медалей’ ;

tabl.Cells[5,0]:

=’Баллов’;

tabl.Cells[0,1]:

= ‘Украина’ ;

tabl.Cells[0,2]:

=’Белоруссия’;

tabl.Cells[0,3] :

=’Англия’;

tabl.Cells[0,4] :

=’Германия’;

tabl.Cells[0,5]:

=’Италия’;

tabl.Cells[0,6] :

=’Китай’;

tabl.Cells[0,7]:

=’Корея’;

tabl.Cells[0,8]:

—  Куба’ ;

tabl.Cells[0,9]:

=’Нидерланды’ ;

tabl.Cells[0,10]

: = ‘Россія’;

tabl.Cells[0,11;

:=’США’ ;

tabl.Cells[0/12]

:=’Франция’;

tabl.Cells[0,13:

:=’Япония’;
  • end;
  • procedure TForml.ButtcnlClick(Sender: TObject);
  • // процедура для кнопки «Итог»
  • var
  • c,r:integer; {номер столбика и номер строки таблицы}
  • s:integer;// всего медалей у команды
  • р:integer;// баллов у команды
  • m:integer;// номер ряда с максимальным количеством баллов
  • buf :array[0. .5] of string; // буфер для обмена строк
  • и:integer;// номер строки — используется в упорядочении
  • begin
  • for r:=l to tabl.rowcount do // обработать все строки
  • begin s: =0;
  • //общее количество медалей
  • for с:=1  to 3 do
  • if tabl.cells[c,r] <> ЛЛ
  • then s:=s+StrToInt(tabl.cells[c,r])
  • else tabl.cells[c,r]: = v 0′;
  • // общее количество баллов
  • p:=7*StrToInt(tabl.cells[1,r])+
  • 6*StrToInt(tabl.cells[2,r])+
  • 5*StrToInt(tabl.cells[3,r]);
  • // вывод результатов
  • tabl.cells[4,r]:=IntToStr(s); // всего медалей
  • tabl.cells[5,r]:=IntToStr(p); // всего баллов end;
  • {упорядочение таблицы за спаданием — по 5-му столбику} // упорядочение методом выбора for r:=l to tabl.rowcount-1 do begin
  • m:=r; // наибольший элемент — в r-му строке for i:=r to tabl.rowcount-1 do
  • if StrToInt (tabl. cells [5, i])> StrToInt (tabl. cells [5,m]) then m:=i; if r <> m then begin
  • for c:=0 to 5 do
  • begin buf[c]:=tabl.Cells[c,r]; tabl.Cells[c,r]:=tabl.Cells[c,m]; tabl.Cells[c,ml:=buf[c];
  • end; end; end; end;
  • procedure TForml.Button2Click(Sender: TObject); / / процедура для кнопки «Добавить» begin
  • if Editl.Text=vv then begin
  • MessageDlg(‘Введите название страны!’, mtError, [mbOK] ,0) ;

 

 

 

 

 

 

exit; end;

  • (вставка нового пустого рядха в конец таблицы}
  • (если таблица на момент внесения новых данных порожняво новый рядох не прибавляется}
  • if (Tabl.RowCount<>2> or (Tabl .Cells (0 ,1]<>Л ‘} then Tabl.RowCount:=Tabl.RowCount+1;
  • // заполнение каморок последней строки таблицы
  • Tabl.Cells[0,Tabl.RowCount-1]:=Editl.text;
  • // добавленная строка становится текущим
  • Tabl.Row:=Tabl.RowCount-1;
  • Editl.Text: v;
  • end;
  • procedure TForml.Button3Click(Sender: TObject);
  • // процедура для кнопки «Изъять»
  • var и:integer;
  • begin
  • (если в таблице есть только два строки, то строка не изымается, а очищується}
  • if Tabl.RowCount=2 then begin Tabl.Rows[1].Clear; exit ;
  • end;

// сдвиг рядхів вверх,   начиная  с  текущего

for i:=tabl.Row to tabl.RowCount-1 do Tabl.Rowsfi]:=Tabl.Rows[i+l];

//изъятие последней строки

tabl.RowCount:=tabl.RowCount-1;

end;

end.

9 Окт »

Организация работы с таблицами и базами данных

Автор: Основной язык сайта | В категории: Изучаем информатику
1 кол2 пара3 трояк4 хорошо5 отлично (Еще не оценили)
Загрузка...

Анализ проекта. Для реализации проекта скористатиємось одн им из средств среды программирования Delphi — компонентом StringGrid (вкладыш палитры компонентов Additional), который служит для отображения данных в виде таблицы. Этот компонент имеет много свойств, Рассмотрим свойства компонента, которые будем использовать в нашем проекте:

  • ColCount ‘— содержит количество столбиков в таблице;
  • RowCount — содержит количество строк в таблице;
  • FixedCols — содержит количество фиксированных по левому краю столбиков;
  • FixedRows — содержит количество фиксированных по верхнему краю строк;
  • FixedColor- задает цвет фиксированных элементов таблицы;
  • Color — задает цвет таблицы;
  • Rows — содержит список столбиков;
  • Row — содержит номер строки, в которой находится избранная каморка;
  • Cells — дает возможность обратиться к конкретной каморке за указанными номером столбика и номером строки;

Options. goEditing -дает возможность «разрешить» (значение True) или «запретить» (значение False) выполнять редактирование каморок таблицы.

Для обрамления формы олимпийской символикой воспользуемся компонентом Shape, что служит для размещения на форме геометрических фигур — прямоугольника, круга, квадрата, эллипса. Разместим на форме пять компонентов Shape и установим для этих компонентов соответствующие значения определенных свойств для отображения пятерых цветных кругов одного размера.

Алгоритм разработки проекта

  • Создать папку D:\Delphi\Pract_22.
  • Загрузить среду визуального программирования Delphi.
  • Разместить на форме визуальные компоненты StringGridl, Buttonl, Shapel-Shape5; установить этим компонентам значения свойств согласно таблице 22.
  • Для формы Forml создать процедуру обработки события OnActivate, в которой заполнить каморки фиксированной строки и фиксированного столбика (см. лістинг программы).
  • Создать для кнопки Buttonl процедуру обработки события OnClick, которая содержит вычисление общего количества полученных медалей и количества набранных баллов, а также команды упорядочения таблицы за спаданием по столбику «Баллы» (см. листинг программы).

Разработка проекта «Рейтинг стран по результатам олимпийских

  

  

  

  

 

  

 

  

 

 

  

 

  

 

  

 

  

 

  

 

Компонент

Вкладыш окна «Инспектор объектов» (Object Inspector) Свойство (Properties) / Событие (Events) Значение свойства/ обработка события (тело процедуры обработки события’)
Formal Properties Caption Рейтинг стран по результатам олимпийских соревнований
Color По выбору
Font Шрифт, размер, цвет по выбору

StringGridl

Properties ColCount 6
Row Count 14
Name Tabl
FixedCols 1
FixedRows ]
FixedColor По выбору
Color По выбору

Options.goEditin

True
Button 1 Properties Caption Итог
Font Шрифт, размер, цвет по выбору
Shapel-Shape5 Properties Shape StCircle
Pen.Color По выбору
Pen.Sty]e psSolid тип—тип линии (сплошная)
Pen. Width 5 — толщина линии
Brusn.Style bsClear -нет закрашивания фигуры

Сохранить проект в папке D:VDelphi\Pract_22. Запустить проект и проверить правильность его выполнения.




Всезнайкин блог © 2009-2015