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

Nbsp; МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ     РОССИЙСКИЙ ХИМИКО-ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ ИМ. Д.И. МЕНДЕЛЕЕВА   НОВОМОСКОВСКИЙ ИНСТИТУТ  

ПРОГРАММИРОВАНИЕ ТИПОВЫХ АЛГОРИТМОВ ЦИКЛИЧЕСКОЙ СТРУКТУРЫ

 

МЕТОДИЧЕСКИЕ УКАЗАНИЯ

 

Новомосковск 2004


УДК 681.3

ББК  32.97

   М 864

 

РЕЦЕНЗЕНТЫ:

канд. техн. наук, доцент Новомосковского института
Российского химико-технологического университета
им. Д.И. Менделеева
Прохоров В.С.

канд. техн. наук, доцент Новомосковского института
Российского химико-технологического университета
им. Д.И. Менделеева
А.Г. Лопатин

 

Составители: В.П. Мочалин, А.С. Тивиков

 

М 864 Программирование типовых алгоритмов циклической структуры. Методические указания/ РХТУ им. Д.И. Менделеева. Новомосковский институт; Сост.: В.П. Мочалин, А.С. Тивиков , Новомосковск, 2004, 28 с.

 

 

В методических указаниях рассмотрены основные методы алгоритмизации и способы программирования на языке QBasic. В данной части учебного пособия освещены особенности программирования типовых алгоритмов циклической структуры.

Методические указания предназначены для студентов всех специальностей заочной формы обучения, обучающихся по дисциплине «Информатика» и изучающих язык программирования QBasic. Методические указания могут быть использованы студентами дневной и вечерней формы обучения и другими категориями пользователей при изучении языка программирования QBasic

 

УДК 681.3

ББК 32.97

 

 

  ã Российский химико-технологический университет им. Д.И. Менделеева, Новомосковский институт, 2004

 


Предисловие

Настоящие методические указания являются продолжением серии пособий, предназначенных для студентов заочного факультета специальностей 250100, 250300, 250600, 250800 и содержащих разъяснения и рекомендации по выполнению заданий в контрольной работе № 1 по информатике. Они могут быть использованы также студентами дневной и вечерней формы обучения для подготовки к выполнению лабораторных работ по разделам информатики, посвященным программированию алгоритмов циклической структуры.

Предлагаемые вашему вниманию методические указания являются дополнением к учебному пособию [1], в котором приводятся сведения по языку программирования QBASIC. Методические указания содержат разъяснения и примеры выполнения заданий, а также набор индивидуальных заданий, включающий 30 вариантов заданий по каждой из рассматриваемых тем: «Табулирование простейших функций» и «Табулирование сложных функций с использованием типовых алгоритмов». Данное пособие – второе из серии планируемых к изданию, которые должны охватить все темы, включенные в контрольную работу у заочников, в практические и лабораторные занятия у студентов дневной и вечерней формы обучения.

Введение

Вычислительный процесс называют циклическим, если он содержит многократные вычисления по одним и тем же математическим зависимостям, но для различных значений входящих в них величин (переменных). Многократно повторяемые участки вычислений называют циклами, а переменные, изменяющиеся в цикле, переменными цикла. Программы, содержащие циклы также называются циклическими.Алгоритм циклической структуры в наиболее общем виде должен содержать:

1) подготовку цикла: задание начальных значений: переменным цикла перед первым его выполнением;

2) выполнение вычислений цикла (тело цикла): действия, повторяемые в цикле для различных значений переменных цикла;

3) модификацию (изменение) значений переменных цикла перед каждым новым его повторением;

4) управление циклом: проверку условия продолжения (или окончания) цикла и переход на начало тела цикла, если выполняется условие продолжения цикла (или выход из цикла по его окончании).

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

Цикл называется детерминированным, если число повторений тела цикла заранее известно или определено. Такие циклы часто называют также циклами со счетчиком или арифметическими. Число повторений тела цикла в этом случае подсчитывается с помощью специальной переменной (счетчика), для которой известны начальное и конечное (пороговое) значения, шаг ее изменения. Управление циклом осуществляется на основании сравнения текущего значения счетчика с заданным порогом. Переменную-счетчик часто именуют параметром цикла, а сам цикл — циклом с параметром.

Для схематического представления цикла с параметром в блок-схемах используют специальный блок заголовка цикла - блок модификации, внутри которого указывают имя переменной-счетчика цикла, начальное значение счётчика цикла; конечное значение счётчика цикла; приращение счётчика цикла. Пример изображения блока начала цикла с параметром-переменной цикла X представлен на рис. 1.

 

 


Рис. 1. Пример изображения блока начала цикла с параметром

Циклические алгоритмы реализуется программно с помощью операторов цикла. Для всех операторов цикла характерны общие правила:

1) повторяющиеся вычисления записываются только один раз;

2) вход в цикл допускается только через его заголовок (начало);

3) необходимо предусматривать выход из цикла или по его естественному завершению, или по оператору перехода.

В языке QBASIC имеются следующие операторы цикла:

1. Оператор цикла с параметром FOR … NEXT

2. Операторы цикла с условием DO … LOOP, WHILE … WEND.

Для программирования циклов с известным числом повторений следует применять оператор цикла с параметром. Этот оператор предусматривает повторное выполнение некоторого другого оператора (или группы операторов) с одновременным изменением по правилу арифметической прогрессии значения, присваиваемого управляющей переменной (параметру) этого цикла. В языке QBasic это синтаксическая конструкция FOR… NEXT (см. [1]).

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

В языке QBasic для организации итерационных циклов следует использовать синтаксические конструкции DO- LOOP, WHILE- WEND – операторы цикла, предназначенные для организации циклических вычислений с прекращением цикла по задаваемому условию (см. [1]).

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

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

В задачах, предлагаемых для решения в контрольной работе студентов-заочников и в лабораторных работах студентов дневного и вечернего факультетов по темам «Табулирование … функции …», предусматривается использование таких типовых алгоритмов:

a) табулирование функции – вычисление таблицы зависимости значений заданной функции от значений аргумента.

b) вычисление суммы конечного числа слагаемых, вычисляемых по заданному выражению;

c) вычисление произведения конечного числа сомножителей, вычисляемых по заданному выражению.

Алгоритм табулирования функции в простейшем случае может состоять из следующей последовательности действий:

1) Задать начальное и конечное значения аргумента функции, значение приращения аргумента (обозначим эти величины, например, как a , b , h).

2) Задать аргументу функции начальное значение (если обозначить аргумент x, то это действие можно записать как x = a).

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

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

5) Увеличить текущее значение аргумента на заданное приращение и полученное значение запомнить как новое значение аргумента (это действие можно записать как x = x + h).

6) Проверить, не превысило ли текущее значение аргумента его конечного значения. Если не превысило, то вернуться к пункту 3 данного алгоритма и повторить выполнение действий с 3 по 6, если превысило, то завершить выполнение алгоритма.

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

Алгоритм вычисления суммы (произведения) конечного числа слагаемых (сомножителей), вычисляемых по заданному выражению, может состоять из следующей последовательности действий:

1) Задать начальное значение для суммы, равное нулю, для произведения-единицы.

2) Задать начальное значение для параметра цикла.

3) Вычислить значение слагаемого (для суммы) или сомножителя (для произведения) при текущем значении параметра цикла.

4) Полученное значение слагаемого (сомножителя) сложить (перемножить) с текущим значением суммы (произведения), после чего результат запомнить как новое значение суммы (произведения).

5) Изменить значение параметра цикла на величину приращения и запомнить полученный результат как новое значение параметра цикла.

6) Проверить, не превысило ли текущее значение параметра цикла его конечного значения. Если не превысило, то вернуться к пункту 3 данного алгоритма и повторить выполнение действий с 3 по 6, если превысило, то завершить выполнение алгоритма.

Рассмотрим примеры применения операторов цикла при программировании указанных типовых алгоритмов.

Пример 1. Табулирование функции с применением операторов цикла FOR- NEXT.

 Вычислить таблицу значений функции Y= X2, при начальном значении аргумента XН=0, конечном значении аргумента XК=1, с шагом D X=0.1.

Решение. Для заданной функции необходимо построить таблицу зависимости значения функции Y от аргумента X. Алгоритм решения задачи табулирования функции был рассмотрен выше. Блок-схема алгоритма табулирования заданной в примере 1 функции представлена на рис. 2.

 

 

 


Рис. 2. Блок-схема решения задачи табулирования функции (пример 1)

По блок-схеме, представленной на рис. 2 напишем программу, заменяя блоки с записанными внутри них выражениями на подходящие операторы языка программирования QBASIC, соблюдая все правила формирования синтаксических конструкций и записи операторов (см. [1]). Для реализации циклического алгоритма, изображенного блоками 3-5 применим операторы цикла FOR-NEXT. Программа решения примера 1 представлена на рис.3.

REM Табуляция функции Y=X^2 -пример 1                 ‘ Блок 1

INPUT “ Введите значения xn, xk, dx: ”; xn, xk, dx ‘            Блок 2

FOR x=xn TO xk STEP dx                                                 ‘ Блок 3

y = x^2                                                                                 ‘ Блок 4

PRINT “ x = ”; x; “ y= ”; y                                                  ‘ Блок 5

NEXT x                                                             ‘ Возврат на блок 3

END                                                                                     ‘ Блок 6

Рис. 3. Программа решения задачи табулирования функции (пример 1)

В результате выполнения программы будут получены следующие результаты.

 

x=0 y=0
x=0.1 y=0.01
x=0.2 y=0.04
x=0.3 y=0.09
x=0.4 y=0.16
x=0.5 y=0.25
x=0.6 y=0.36
x=0.7 y=0.49
x=0.8 y=0.64
x=0.9 y=0.81
X=1 Y=1

Пример 2. Вычисление суммы конечного числа слагаемых.

Вычислить:

 

 

Решение. Запись Σ (сигма) в задаче означает следующее:

 

 

Решение задачи сводится к организации цикла по i. При каждом прохождении цикла значение S должно увеличиваться на очередное слагаемое (смотри рассмотренный ранее алгоритм вычисления суммы конечного числа слагаемых). Перед накоплением сумма равна нулю, т.е. S=0.

Блок-схема алгоритма вычисления суммы конечного числа слагаемых, вычисляемых по заданному в примере 2 выражению, представлена на рис. 4.

По блок-схеме, представленной на рис. 4 напишем программу, заменяя блоки с записанными внутри них выражениями на подходящие операторы языка программирования QBASIC, соблюдая все правила формирования синтаксических конструкций и записи операторов (см. [1]). Для реализации циклического алгоритма, изображенного блоками 2-4 применим операторы цикла FOR-NEXT. Программа решения примера 2 представлена на рис.5.

 

 

 

 

 


Рис.4. Блок-схема задачи вычисления суммы конечного числа слагаемых (пример 2)

REM Вычисление суммы конечного числа слагаемых -пример 2

S=0                                                                                    ‘ Блок 2

FOR i=1 TO 20                                                                 ‘ Блок 3

S=S+1/(i+1)                                                                       ‘ Блок 4

NEXT i                                                           ‘ Возврат на блок 3

PRINT “ S=”;S                                                                 ‘ Блок 4

END                                                                                        ‘ Блок 5

Ответ. S=2.645359

 

Рис. 5. Программа решения задачи вычисления суммы конечного числа слагаемых (пример 2)

 

Пример 3. Вычисление произведения конечного числа сомножителей. Вычислить:

Решение. Запись “произведение П” в задачеозначает следующее:

Задача сводится к организации цикла по k. При каждом прохождении цикла произведение умножается на очередной сомножитель. До входа в цикл необходимо задать Р=1, т.е. произведение перед накоплением равно единице.

Блок-схема алгоритма вычисления произведения конечного числа сомножителей, вычисляемых по заданному в примере 3 выражению, представлена на рис. 6.

 

 


Рис.6. Блок-схема вычисления произведения конечного числа сомножителей (пример 3)

Программа решения примера 3 представлена на рис.7.

 

 

REM Вычисление произведения -пример 3                 ‘ Блок 1

P=1                                                                                    ‘ Блок 2

FOR K=7 TO 24                                                                ‘ Блок 3

P=P*(K^2+1)/( K^2+2)                                                     ‘ Блок 4

NEXT K                                                          ‘ Возврат на блок 3

PRINT “ P=”;P                                                                       ‘ Блок 4

END                                                                                        ‘ Блок 5

Ответ. p=0.8949325

Рис. 7. Программа решения задачи вычисления произведения конечного числа сомножителей (пример 3)

Пример 4. Рассмотрим пример, в котором применяются все рассмотренные выше типовые алгоритмы.

Вычислить таблицу функции c=F(x), заданной следующим выражением:

Заданы начальное, конечное значение и приращение аргумента: Xн=1, Xк=2, ΔX=0.2.

Решение. Алгоритм решения данной задачи можно представить в виде трех частей: в первой части производится вычисление суммы, во второй части – расчет произведения, в третьей части вычисляется функция c=F(x):

,

Следует обратить внимание на то, что в задаче используются вложенные циклы: вычисление функции осуществляется во внешнем цикле, расчет суммы и произведения – во внутреннем цикле.

Первая часть задачи представляет собой типовой алгоритм вычисления суммы конечного числа слагаемых. Необходимо вычислить . В рабочей части внутреннего цикла производится накопление суммы слагаемых. Формула накопления суммы будет иметь вид: . Эта формула имеет тот смысл, что к предыдущему значению суммы прибавляется очередное слагаемое и полученный результат считается новым значением суммы. Процесс накопления суммы продолжается при изменении параметра цикла от 11 до 20 (параметром цикла является переменная n, начальное значение которой равно 11, конечное значение – 20, шаг изменения параметра цикла равен 1). Цикл будет закончен тогда, когда будут просуммированы все слагаемые, т.е. когда n>20. Для правильной организации расчетов первоначальное значение суммы (до начала цикла) принимается равным нулю.

 

 

 


 


 

 


 

 


 


Риc. 8. Блок-схема решения примера 4

Вторая часть задачи представляет собой типовой алгоритм вычисления произведения конечного числа сомножителей. Необходимо вычислить . Эта задача сводится к организации цикла по k. При каждом прохождении цикла произведение умножается на очередной сомножитель. До входа в цикл необходимо задать Р=1. Выражение для накопления произведения будет иметь вид:

В третьей части задачи организуется внешний цикл с параметром цикла х, начальное значение которого равно XН=1, конечное – XК=2, шаг изменения параметра цикла равен D X=0,1. Во внешнем цикле осуществляется вычисление функции с=F(x). Блок-схема алгоритма решения рассматриваемой задачи изображена на риc. 8. Программа решения примера 4 представлена на рис.9.

 

REM Табуляция функции с=F(x)-пример 4                   ‘ Блок 1

INPUT “ Введите значения xn, xk, dx: ”; xn, xk, dx ‘            Блок 2

FOR x=xn TO xk STEP dx                                                 ‘ Блок 3

s=0                                                                                       ‘ Блок 4

FOR n=11 TO 20                                                                 ‘ Блок 5

s=s+(x-n)/n^2                                                                       ‘ Блок 6

NEXT n                                                             ‘ Возврат на блок 5

p=1                                                                                       ‘ Блок 7

FOR k=7 TO 14                                                                   ‘ Блок 8

p=p*(k+x)/ k                                                                        ‘ Блок 9

NEXT k                                                             ‘ Возврат на блок 8

c=( EXP(x) + COS( ( x-1 ) ^ 0.36 ) ^ 2 ) / ( s + 2*p )        ‘ Блок 10

PRINT “ x = ”; x; “ c = ”; c                                                ‘ Блок 11

NEXT x                                                             ‘ Возврат на блок 3

END                                                                                    ‘ Блок 12

Рис. 9. Программа решения примера 4

После выполнения программы получим следующий результат:

 

x=1 с=1.014998
x=1.2 с=0.9314256
x=1.4 с=0.9072192
x=1.6 с=0.9086618
x=1.8 с=0.927774
x=2 С=0.982573

 


 

КОНТРОЛЬНЫЕ ВОПРОСЫ

1. Определение циклического вычислительного процесса.

2. Структура циклического вычислительного процесса.

3. Виды циклов, их характеристики.

4. Циклы До и Пока, особенности структуры.

5. Какие данные необходимы для организации цикла?

6. Что такое управляющая переменная цикла?

7. Организация цикла типа FOR…NEXT.

8. Организация цикла типа DO-LOOP.

9. Организация цикла типа WHILE-WEND.

10. Типовой алгоритм вычисления суммы N слагаемых.

11. Типовой алгоритм вычисления произведения N сомножителей.

12. Алгоритм табулирования функции.

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

1. Мочалин В.П., Жульнев В.В. Основы алгоритмического языка программирования QBasic. Курс лекций. Издание 2-е, перераб.: Учебное пособие. РХТУ им. Д.И.Менделеева, Новомосковский институт. Новомосковск, 2000.- 106 с.

2. Бобровский С.И. Программирование на языке QBasic для школьников и студентов. “ДЕСС” “Инфорком-Пресс”. М.: 1999.-207 с.

3. Каспер Э. Освоим QBasic играючи!-М.: Горячая линия-Телеком, Радио и связь, 1999.-264 с.

 


ОГЛАВЛЕНИЕ

Предисловие……………………………………………………………….. 3
Введение……………………………………………………………………. 3
1. Типовые циклические алгоритмы вычисления таблицы функции, суммы и произведения…………………………………………………..   5
2. Контрольные вопросы………………………………………………….. 14
Библиографический список……………………………………………….. 14
Оглавление…………………………………………………………………. 15
Приложение 1……………………………………………………………… 16
Приложение 2……………………………………………………………… 17

 


ПРИЛОЖЕНИЯ

ПРИЛОЖЕНИЕ 1

Задание по теме «Табулирование простейших функций»

Составить алгоритм и программу табулирования функции y=f(x) (табл. П.1.) в указанном интервале значений аргумента с заданным числом точек табулирования с использованием оператора цикла.

Таблица П.1.

Варианты индивидуальных заданий.

Функция Интервал табулирования функции [a;b] Число точек
1 0,5; 1,0 10
2 0,6; 1,0 8
3 0,5; 1,0 10
4 5,0; 5,8 8
5 0,6;0,8 5
6 1,5; 2,0 10
7 1,0; 2,0 10
8 0,5; 4,0 14
9 0; 1,0 10
10 1,5;1,6 5
11 0,1;0,8 7
12 0,75;1,0 5
13 0;1,0 10
14 0,7;0,9 5
15 1,5;1,7 10
16 0,75;1,25 10
17 0,5;1,0 10
18 0,5;0,6 5
19 0,7;0,8 5
20 0,6;1,1 10

 

Продолжение таблицы П.1.

Уравнение Интервал табулирования функции [a;b] Число точек
21 0,2;0,7 10
22 0;0,8 8
23 0,2;0,4 5
24 1,8;2,0 10
25 0;1,0 20
26 0;0,8 8
27 0,6;0,8 5
28 0;0,9 9
29 0,2;0,4 10
30 0,5;1,0 10

 

ПРИЛОЖЕНИЕ 2

Задание по теме «Табулирование сложных функций с использованием типовых алгоритмов»

Составить алгоритм и программу табулирования функции (табл. П.2.) в указанном интервале значений аргумента с заданным шагом табулирования.

Таблица П.2.

Варианты индивидуальных заданий

Уравнения

Начальное значение, шаг, конечное значение

Табулировать функцию
1

хН=1; Dх=0.1; хК=2

Z=f(x)
2  

хН=1; Dх=0.2; хК=4.4

Z=f(x)

Продолжение таблицы П.2.

Уравнения

Начальное значение, шаг, конечное значение Табулировать функцию
3

b=1.5  a=2

yН=10; Dy = -0.1; yК=9 z=f(y)
4

хН=0.1;Dх=0.01; хК=0.23 y=f(x)
5

хН=0; Dх = -0.2; хК = -2 z=f(x)
6

хН=1; Dх = -0.5; хК = -3 F=f(x).
7

zН=2; Dz = 0.5; zК = 6,5 y=f(z)
8

a=1

хН=1.1; Dх = -0.05;  хК = 0.1 y=f(x)
 

 

   

Продолжение таблицы П.2.

Уравнения

Начальное значение, шаг, конечное значение Табулировать функцию
9

хН=1; Dх = 0.2;  хК = 3.4 y=f(x)
10

aН=1; Da = 0.1; aК = 2 P=f(a)
11

A=0.5

 

xН=0.5; Dx = 0.1; xК = 1.5 y=f(x)
12

yН=1; Dy = 0.1; yК = 2 z=f(y) .
13

a=3,5; c=50; d=0,01

xН=3; Dx = 0.1; xК = 4    y=f(x)
14

a=0,91×10-2.

xН=0; Dx = 1; xК = 6;   y=f(x)
 

 

   

Продолжение таблицы П.2.

Уравнения

Начальное значение, шаг, конечное значение Табулировать функцию
15

a=2

xН=2; Dx = 0.1; xК = 3; z=f(x) .
16

zН=1.1; Dz = 0.1;  zК = 2.2 x=f(z)
17

xН=1; Dx = 0,1; xК = 2. y=f(x)
18

 

 

xН=10; Dx = -1; xК = 0. z=f(x)

Продолжение таблицы П.2.

Уравнения

Начальное значение, шаг, конечное значение Табулировать функцию
19

xН=2; Dx = 0.1; xК = 3 y=f(x)
20

y=3

xН=0; Dx = 0.1; xК = 1; z=f(x)
21

a=3,2.

xН=1; Dx = 0.5; xК = 7 z=f(x)
22

 

zН=10; Dz = -0.5;  zК = -1.5 a=f(z)
23

  xН=0.5; Dx = 0.3;  xК = 1.7     z=f(x)

Продолжение таблицы П.2.

Уравнения

Начальное значение, шаг, конечное значение

Табулировать функцию
24

yН=2; Dy = 0.2; yК = 4

z=f(y)
25

xН=1; Dx = 0.5;

 xК = 12

y=f(x) .
26 a=1.5

xН=1; Dx = 1.5; xК = 16

z=f(x) .
27      

xН=1; Dx = 0.1; xК = 2

 

c=f(x)
   

 

   

 

Продолжение таблицы П.2.

Уравнения

Начальное значение, шаг, конечное значение

Табулировать функцию
  8 a=1,5.

zН=1; Dz = 0.1; zК = 2;

y=f(z) .
29 a=2

 

 

bн=1 bk=2 Db=0.1

 

 

z=f(b) .
30 a=1,44.

xН=2; Dx = -0,1; 

 xК = 0,1;

 

z=f(x)
         

 

Учебное издание

 

Мочалин Владимир Петрович

Тивиков Алексей Сергеевич

 


Дата добавления: 2019-02-22; просмотров: 1518; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!