WWW.KN.LIB-I.RU
БЕСПЛАТНАЯ  ИНТЕРНЕТ  БИБЛИОТЕКА - Различные ресурсы
 

«Рецензент Доктор физико-математических наук, профессор ТГТУ С.М. Дзюба Составители: И.А. Елизаров, С.Б. Путин, С.А. Скворцов, А.А. Третьяков, С.И. ...»

ИЗДАТЕЛЬСТВО ТГТУ

УДК 004.43:004.021

ББК 973-018.1

Е511

Рецензент

Доктор физико-математических наук, профессор ТГТУ

С.М. Дзюба

Составители:

И.А. Елизаров, С.Б. Путин, С.А. Скворцов,

А.А. Третьяков, С.И. Татаренко

Е51 Программирование и основы алгоритмизации : метод. указания / сост. : И.А. Елизаров, С.Б. Путин, С.А. Скворцов, А.А.

Третьяков, С.И. Татаренко. – Тамбов : Изд-во Тамб. гос. техн.

ун-та, 2007. – 40 с. – 100 экз.

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

Предназначены для студентов 1 курса очной формы обучения специальностей 220301, 080800.

УДК 004.43:004.021 ББК 973-018.1 © ГОУ ВПО "Тамбовский государственный технический университет" (ТГТУ), 2007 Министерство образования и науки Российской Федерации ГОУ ВПО "Тамбовский государственный технический университет"

ПРОГРАММИРОВАНИЕ И ОСНОВЫ АЛГОРИТМИЗАЦИИ

Методические указания к лабораторным работам для студентов 1 курса очной формы обучения специальностей 220301, 080800 Тамбов Издательство ТГТУ Учебное издание

ПРОГРАММИРОВАНИЕ И

ОСНОВЫ АЛГОРИТМИЗАЦИИ



Методические указания

Составители:

ЕЛИЗАРОВ Игорь Александрович, ПУТИН Сергей Борисович, СКВОРЦОВ Сергей Александрович ТРЕТЬЯКОВ Александр Александрович, ТАТАРЕНКО Сергей Иванович Редактор Т.М. Г л и н к и н а Инженер по компьютерному макетированию М.Н. Р ы ж к о в а Подписано к печати 07.05.2007 Формат 60 84/16. 2,32 усл. печ. л. Тираж 100 экз. Заказ № 336 Издательско-полиграфический центр Тамбовского государственного технического университета 392000, Тамбов, Советская, 106, к. 14

ВВЕДЕНИЕ

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

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

–  –  –

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

Оператор присваивания можно назвать основным в любом языке программирования.

Оператор присваивания: переменная=выражение Оператор выполняется следующим образом. Вычисляется значение выражения, после чего переменная получает вычисленное значение. При этом тип выражения должен быть совместим с типом переменной.

Пример оператора присваивания:

x = (y + z) / (2 + z*10) – 3;

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





Арифметическое выражение – выражение числового типа (целого или дробного). Идентификатор целого типа: int, дробного типа float или double.

Арифметические операции. К арифметическим операциям языка С относятся: – вычитание и унарный минус; + сложение; * умножение; / деление; % деление по модулю; ++ увеличение на единицу; – – уменьшение на единицу.

1. Основные математические функции языка С

–  –  –

Стандартные математические функции языка С описаны в библиотеке math.h. Основные функции представлены в табл. 1.

Старшинство операций (по убыванию приоритета): Вычисления функций ( ) []. - * & ! ~ ++ -- sizeof * / % + – = = == != & ^ | && || ?: =+ =- =* =/ =% = = =& =^ =| = П р и м е р 1.1. Записать математические выражения в виде арифметических выражений языка С.

–  –  –

Ввод данных с клавиатуры и их вывод на дисплей производится путем обращения к стандартным функциям ввода / вывода, описанным в библиотеке: stdio.h Функция форматного ввода: scanf(), вывода printf().

П р и м е р 1.1:

scanf("%d",&x);

где %d – формат вводимого числа (%d – целое десятичное число типа int; %с – символ типа сhar; %lf – число типа double и т.д.); & – операция взятия адреса; x – имя вводимой переменной.

printf("Число равно %d",x);

где %d – формат выводимого числа; x – имя выводимой переменной; "Число равно" – произвольный текст.

Структура программы на языке С:

# includeимя файла(библиотеки) описание макроопределений описание функций объявление глобальных переменных main() { объявление локальных переменных тело программы return; }

П р и м е р 1.2. Выполнить вычисление по формуле:

–  –  –

# includestdio.h # includemath.h main() { double x,y,z;

printf("Введите х и y");

scanf("%lf%lf",&x,&y);

z=fabs(x*x+y*y);

printf("z равно %lf",z);

return;

}

–  –  –

Задание 2

1. Вычислить периметр и площадь прямоугольного треугольника по заданным длинам двух катетов a и b.

2. Заданы координаты трех вершин треугольника ( x1, y1 ), ( x2, y2 ), ( x3, y3 ). Найти его периметр и площадь.

3. Вычислить длину окружности и площадь круга одного и того же заданного радиуса R.

4. Вычислить расстояние между двумя точками с данными координатами ( x1, y1 ) и ( x2, y 2 ).

5. Даны два действительных числа x и y. Вычислить их сумму, разность, произведение и частное.

6. Дана длина ребра куба. Найти площадь грани, площадь полной поверхности и объем этого куба.

7. Дана сторона равностороннего треугольника. Найти площадь этого треугольника, его высоты, радиусы вписанной и описанной окружностей.

8. Известна длина окружности. Найти площадь круга, ограниченного этой окружностью.

9. Найти площадь кольца, внутренний радиус которого равен r, а внешний – заданному числу R ( R r ).

10. Треугольник задан величинами своих углов и радиусом описанной окружности. Найти стороны треугольника.

11. Найти площадь равнобедренной трапеции с основаниями a и b и углом при большем основании a.

12. Вычислить корни квадратного уравнения ax 2 + bx + c = 0, заданного коэффициентами a, b и c (предполагается, что a 0 и что дискриминант уравнения неотрицателен).

13. Дано действительное число x. Не пользуясь никакими другими арифметическими операциями, кроме умножения, сложения и вычитания, вычислить за минимальное число операций 2 x 4 3 x 3 + 4 x 2 5 x + 6.

14. Найти площадь треугольника, две стороны которого равны a и b, а угол между этими сторонами q.

15. Дано a. Не используя никаких функций и никаких операций, кроме умножения, получить a 8 за три операции; a10 и a16 за четыре операции.

16. Найти сумму членов арифметической прогрессии, если известны ее первый член, знаменатель и число членов прогрессии.

17. Найти все углы треугольника со сторонами a, b, c. Предусмотреть в программе перевод радианной меры угла в градусы, минуты и секунды.

18. Три сопротивления R1, R2, R3 соединены параллельно. Найдите сопротивление соединения.

19. Текущее показание электронных часов: m часов (0 m 23), n минут (0 n 59), k секунд (0 k 59). Какое время будут показывать часы через p ч q мин r c ?

20. Составить программу вычисления объема цилиндра и конуса, которые имеют одинаковую высоту H и одинаковый радиус основания R.

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

22. Дана величина A, выражающая объем информации в байтах. Перевести A в более крупные единицы измерения информации.

23. Составить программу для вычисления пути, пройденного лодкой, если ее скорость в стоячей воде v км/ч, скорость течения реки w км/ч, время движения по озеру t1 ч, а против течения реки – t 2 ч.

24. Дано x. Получить значения 2 x + 3x 2 4 x 3 и 1 + 2 x + 3 x 2 + 4x 3 с наименьшим числом произведенных операций.

–  –  –

Основные сведения Для программирования ветвящихся алгоритмов применяются условный оператор и оператор выбора.

Условный оператор имеет следующий формат:

if(логическое выражение) оператор 1;

else оператор 2;

Операторы 1 и 2 могут быть простыми или составными. Если логическое выражение, выступающее в качестве условия ветвления, принимает значение 0 (ложно), то выполняется оператор 2, если 1 (истина) – оператор 1.

Неполная форма условного оператора:

if(логическое выражение) оператор;

П р и м е р 2.1.

Из трех данных вещественных чисел x, y, z выбрать наибольшее.

# includestdio.h void main() { double x,y,z,max;

printf("Введите х y z");

scanf("%lf%lf%lf",&x,&y,&z);

if(x=y) if(x=z) max=x;

else max=z;

else if(y=z) max=y;

else max=z;

printf("Максимальное значение=%lf",max);

} Оператор выбора позволяет программировать ветвления по многим направлениям. Этот оператор организует переход на одну из нескольких ветвей в зависимости от значения заданного выражения (селектора выбора).

Формат оператора выбора:

switch(выражение) { case constant1: последовательность операторов; break;

….

case constantN: последовательность операторов; break;

default: последовательность операторов;

}

Условная операция имеет три операнда:

условие?оператор 1:оператор 2;

Вычисляется условие. Если условие истинно, то выполняется оператор 1 и его результат есть результат операции.

П р и м е р 2.2.

с = (a + b) == 0? 3:5; Если сумма а и b равна нулю, то с будет равно 3, иначе с = 5.

Практические задания

1. Даны две точки A ( x1, y1 ) и B ( x2, y2 ). Составить алгоритм, определяющий, которая из точек находится ближе к началу координат.

2. Имеется пронумерованный список деталей: 1) шуруп, 2) гайка, 3) винт, 4) гвоздь, 5) болт. Составить программу, которая по номеру детали выводит на экран ее название.

3. Даны целые числа m, n. Если числа не равны, то заменить каждое из них одним и тем же числом, равным большему из исходных, а если равны, то заменить числа нулями.

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

5. Написать программу, которая по номеру месяца выдает название следующего за ним месяца (при m = 1 получаем февраль, 4 – май).

6. Подсчитать количество отрицательных чисел среди чисел а, b, c.

7. Подсчитать количество целых чисел среди чисел а, b, c.

8. Определить, делителем каких чисел а, b, c является число k.

9. Перераспределить значения переменных x и y так, чтобы в x оказалось большее из этих значений, а в y – меньшее.

10. Определить правильность даты, введенной с клавиатуры (число – от 1 до 31, месяц – от 1 до 12). Если введены некорректные данные, то сообщить об этом.

11. Написать программу, распознающую по длинам сторон среди всех треугольников прямоугольные. Если их нет, то вычислить величину угла с.

12. Найти max { min (a, b), min (c, d )}.

13. Даны четыре точки A1 ( x1, y1 ), A2 ( x2, y2 ), A3 ( x3, y3 ), A4 ( x4, y4 ). Определить, будут ли они вершинами параллелограмма.

14. Даны три точки A ( x1, y1 ), B ( x2, y2 ), C ( x3, y3 ). Определить, будут ли они расположены на одной прямой. Если нет, то вычислить угол ABC.

15. Даны действительные числа а, b, c. Удвоить эти числа, если a b c, и заменить их абсолютными значениями, если это не так.

16. Для целого числа k от 1 до 99 напечатать фразу "Мне k лет", учитывая при этом, что при некоторых значениях k слово "лет" надо заменить на слово "год" или "года". Например, 11 лет, 22 года, 51 год.

17. Даны три положительных числа а, b, c. Проверить, могут ли они быть длинами сторон треугольника. Если да, то вычислить площадь этого треугольника.

18. Написать программу решения уравнения ax3 + bx = 0 для произвольных a и b.

19. Дан круг радиуса R. Определить, поместится ли правильный треугольник со стороной a в этом круге.

20. В небоскребе N этажей и всего один подъезд; на каждом этаже по 3 квартиры; лифт может останавливаться только на нечетных этажах. Человек садится в лифт и набирает номер нужной ему квартиры M. На какой этаж должен доставить лифт пассажира?

21. Написать программу, которая по введенному номеру единицы измерения (1 – дециметр, 2 – километр, 3 – метр, 4 – миллиметр, 5 – сантиметр) или длине отрезка L выдавала бы соответствующее значение длины отрезка в метрах.

22. Дана точка A ( x, y ). Определить, принадлежит ли она треугольнику с вершинами в точках ( x1, y1 ), ( x2, y2 ), ( x3, y3 ).

23. Написать программу решения системы линейных уравнений:

a1x + b1 y = c1;

a2 x + b2 y = c2.

24. Заданы координаты вершин прямоугольника: ( x1, y1 ), ( x2, y2 ), ( x3, y3 ), ( x4, y4 ). Определить площадь части прямоугольника, расположенной в I координатной четверти.

–  –  –

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

Цикл с параметром имеет следующую форму записи:

for(выражение 1;условие;выражение 2) тело цикла;

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

П р и м е р 3.1.

Вычислить сумму чисел от 1 до заданного числа n.

# includestdio.h void main() { int i,n,s;

printf("Введите n");

scanf("%d",&n);

s=0;

for(i=1;i=n;i=i+1) s=s+i; или for(i=1;i=n;s+=i++);

printf("Сумма равна %d",s);

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

П р и м е р 3.2.

Вывести на экран таблицу умножения.

# includestdio.h void main() { int i,j;

for(i=1;i=9;i++) { printf("\n");

for(j=1;j=9;j++) printf(" %d",i*j);

} }

Цикл с предусловием имеет следующий формат:

while(условие) тело цикла;

Вычисляется условие. Если оно истинно, то выполняется тело цикла и осуществляется переход в начало цикла для очередной проверки условия.

П р и м е р 3.3.

Вычислить сумму чисел от 1 до заданного числа n.

# includestdio.h void main() { int a,s;

printf("Введите n");

scanf("%d",&n);

s=0;

a=1;

while(a=n) { s=s+a;

a=a+1;

} printf("Сумма равна %d",s);

}

Цикл с постусловием имеет следующий формат:

do тело цикла while(условие);

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

П р и м е р. Вычислить сумму чисел от 1 до заданного числа n.

# includestdio.h void main() { int a,s;

printf("Введите n");

scanf("%d",&n);

s=0;

a=1;

do{ s=s+a;

a=a+1;

} while(a=n);

printf("Сумма равна %d",s);

} Внутри цикла может использоваться оператор continue, который вызывает пропуск всех операторов до конца цикла с последующим продолжением цикла.

–  –  –

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

Переменная с индексом – идентификатор компоненты массива. Формат записи:

имя массива[индекс], где индекс может быть выражением целого типа.

Описание массива определяет базовый тип, имя массива и размер. Описание массива помещается в разделе объявления переменных и имеет вид:

базовый тип имя[размер];

Примеры объявления одномерного массива имеют вид:

int a[8]; – объявлен массив c именем a, состоящий из восьми элементов типа int;

int x,a[8],c,v; – массив объявляется наряду с объявлением переменных x, c, v;

int a[4]={3,8,2,6}; – непосредственное заполнение массива данными в момент объявления.

Примеры объявления многомерного массива имеют вид:

int a[3][4]; – объявлен двумерный массив c именем a размером 3 4, состоящий из элементов типа int;

int x,a[8][5],c,v; – массив объявляется наряду с объявлением переменных x, c, v;

int a[4][2]={{3,8},{2,6},{1,5},{8,5}}; – непосредственное заполнение массива данными в момент объявления;

int a[3][4][2]; – объявлен трехмерный массив c именем a размером 3 4 2, состоящий из элементов типа int.

Индексация элементов массива имеет значение 0 для первого элемента массива.

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

П р и м е р 4.1.

Ввести десять чисел, отсортировать их и вывести на дисплей.

# includestdio.h void main() { int i,j,a[10],p;

for(i=0;i10;i++) scanf("%d",&a[i]);

for(i=0;i9;i++) { for(j=0;j9;j++) { if(a[j]=a[j+1]) { p=a[j];

a[j]=a[j+1];

a[j+1]=p;

} } } printf("%d",a[i]);

} П р и м е р 4.2. Заполнить двумерный массив 10 10 значением 5.

# includestdio.h void main() { int i,j,a[10][10];

for(i=0;i10);i++) for(j=0;j10);j++) a[i][j]=5;

} Динамическое определение массива происходит в ходе выполнения программы. Размер массива определяется значением некоторой переменной.

П р и м е р 4.3.

Работа с одномерным динамическим массивом.

# includestdio.h # includestdlib.h – подключение библиотеки для динамического выделения памяти void main() int *p; – объявление указателя на динамический массив { int t,i;

printf("\nВведите размер массива");

scanf("%d",&d); – определение размера будущего массива p=malloc(t*sizeof(int)); – размещение массива for(i=0;it;i++) a[i]=t*t; – работа с массивом { printf("\n %d",a[i]); – вывод массива на дисплей } free(p); – освобождение памяти, занимаемой массивом } Практические задания

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

Даны две последовательности a1 a2... an и b1 b2... bm.

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

2. Составить программу, которая заполняет квадратную матрицу порядка n натуральными числами 1, 2, 3, …, n 2, записывая их "по спирали".

3. Сортировка выбором. Дана последовательность чисел a1, a2,..., an. Требуется расположить элементы по убыванию. Для этого в массиве, начиная с первого, выбирается наибольший элемент и ставится на первое место, а первый – на место наибольшего. Написать алгоритм сортировки выбором.

4. Задана квадратная матрица. Переставить строку с максимальным элементом на главной диагонали со строкой с заданным номером m.

5. Сортировка обменами. Дана последовательность чисел a1, a2,..., an. Требуется представить числа в порядке возрастания. Для этого сравниваются два соседних числа ai и ai +1. Если ai ai +1, то делается перестановка. Так продолжается до тех пор, пока все элементы не будут расположены в порядке возрастания. Составить алгоритм сортировки, подсчитывая при этом количество перестановок.

6. Вычислить сумму и число положительных элементов матрицы A [ N, N ], находящихся над главной диагональю.

7. Сортировка вставками. Дана последовательность чисел a1, a2,..., an. Требуется представить числа в порядке возрастания. Делается это следующим образом. Пусть a1, a2,..., ai – упорядоченная последовательность, т.е. a1 a2... ai.

Берется следующее число ai +1 и вставляется в последовательность так, чтобы новая последовательность была тоже возрастающей. Процесс производится до тех пор, пока все элементы от i + 1 до n не будут перебраны.

8. Дана целая квадратная матрица п-го порядка. Определить, является ли она магическим квадратом, т.е. такой, в которой суммы элементов во всех строках и столбцах одинаковы.

9. Сортировка Шелла. Дан массив n действительных чисел. Требуется упорядочить его по возрастанию. Делается это следующим образом: сравниваются два соседних элемента ai и ai +1. Если ai ai +1, то продвигаются на один элемент вперед. Если ai ai +1, то производится перестановка и сдвигаются на один элемент назад.

10. Дан целочисленный массив A [ n ], среди элементов есть одинаковые. Создать массив из различных элементов A[ n ].

11. Дан массив натуральных чисел. Найти сумму элементов, кратных данному K.

12. В целочисленной последовательности есть нулевые элементы. Создать массив из номеров этих элементов.

13. Дана последовательность целых чисел a1, a2,..., an. Выяснить, будет ли она возрастающей.

14. Дана последовательность чисел a1, a2,..., an. Заменить все ее члены, большие данного Z, этим числом. Подсчитать количество замен.

15. Дан массив действительных чисел размерностью N. Подсчитать, сколько в нем отрицательных, положительных и нулевых элементов.

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

17. В одномерном массиве все отрицательные элементы переместить в начало массива, а остальные – в конец с сохранением порядка следования. Дополнительный массив заводить не разрешается.

18. Дана матрица A размера n m. Определить количество элементов массива больших заданного элемента массива.

19. Получить матрицу, в которой крайние элементы равны 1, а остальные 0.

20. Определить максимальный и минимальный элемент в матрице m n.

21. Дана действительная квадратная матрица порядка n. Преобразовать матрицу по правилу: строку с номером n сделать столбцом с номером n.

22. Дана действительная матрица размером n m. Требуется преобразовать матрицу: поэлементно вычесть последнюю строку из всех строк, кроме последней.

23. Упорядочить по возрастанию элементы каждой строки матрицы размером n m.

24. Дана действительная матрица порядка 2n. Получить новую матрицу, переставляя ее блоки размера n n крест – накрест.

–  –  –

Как видно из примера 5.1, описание функции может быть произведено до и после функции main, а объявление функции, т.е. задание ее прототипа необходимо производить до функции main. В примере 5.1 прототипом функции является строка double fn(double x,double y).

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

Одним из способов объявления такой функции является строка:

тип имя функции(тип элементов массива *имя массива);

П р и м е р 5.2.

Объявить функцию, в качестве аргумента которой используется массив с именем ar, состоящий из 10 элементов типа int.

1 способ: void sort(int *ar); 2 способ: void sort(int ar[]); 3 способ: void sort(int ar[10]);

–  –  –

Основные сведения Доступ к файлам. Для работы с файлом необходимо открыть файл с помощью функции fopen из стандартной библиотеки stdio.h. Функция fopen берет внешнее имя, проводит некоторые обслуживающие действия и возвращает внутреннее имя ("указатель файла"), которое должно использоваться при последующих чтениях из файла или записях в него.

Указатель файла описывается следующим образом:

FILE *идентификатор;

Такая запись означает, что идентификатор является указателем на FILE (структура, описанная в stdio.h и содержащая информацию об открытом файле) и fopen возвращает указатель на FILE.

Например, FILE *fd;

Обращение к функции fopen в программе имеет вид:

fd = fopen(name,mode);

где name – имя файла, которое задается в виде символьной строки, mode – режим открытия, который также является символьной строкой. Допустимыми режимами являются: чтение ("r"), запись ("w") и добавление ("a").

При открытии несуществующего файла он будет создан (если это возможно).

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

Функция fclose является обратной по отношению к fopen; она разрывает связь между указателем файла и внешним именем.

Основные функции для чтения/записи из/в файл.

–  –  –

П р и м е р 6.2.

Вывод на экран содержимого файла.

#include stdio.h main() { char c;

FILE *fd;

fd=fopen("file_name.txt","r"); – открываем файл fale_name.txt if(fd==NULL) { printf("\n Ошибка открытия файла");

return;

} c=getc(fd);

while(c!=EOF) – сравниваем c с константой – конец файла { printf("%c",c);

c=getc(fd);

} fclose(fd);

return;

}

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

int fseek (FILE *fd, long offset, ing origin);

В этом случае текущая позиция в файле с дескриптором fd смещается на величину offset относительно места, заданного аргументом origin: 0 (SEEK_SET) – от начала, 1 (SEEK_CUR) – от текущей позиции, 2 (SEEK_END) – от конца файла. Последующее чтение или запись будут начинаться с новой позиции.

П р и м е р 6.3.

Функция чтения любого количества символов, начиная с произвольного места в файле.

#include stdio.h int get (FILE *fd, long pos, int n) { char *s;

if (fseek(fd,pos,0)=0) – установка позиции return (fgets(s,n+1,fp));

else return (-1);

} Практические задания

1. Произвести слияние двух текстовых файлов. Имена файлов вводятся с клавиатуры.

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

3. Разработать программу управления матрицами (добавление и удаление строк или столбцов). Матрица хранится в файле.

4. Разработать программу удаления в тексте, содержащемся в файле, лишних пробелов.

5. Разработать программу удаления в тексте, содержащемся в файле, всех пробелов.

6. Напишите программу, которая выводит на экран содержимое текстового файла.

7. Напишите программу, которая вычисляет среднее арифметическое чисел, находящихся в файле.

8. Напишите программу, которая позволяет просматривать текстовые файлы (выводит на экран содержимое файла), например, файлы исходных программ С++.

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

10. Напишите программу, которая дописывает в находящийся на диске файл имя, фамилию и номер телефона, например, вашего товарища. Если файла на диске нет, то программа должна создать его. В файле все записи должны находиться последовательно в одной строке.

11. Выбросить из текста, находящегося в файле, заданный знак, где бы он не встречался.

12. Удалить из текста, находящегося в файле, каждое четное предложение.

13. В тексте перед каждым предложением, в котором встречается заданное слово, поставить восклицательный знак "!"

14. Отформатировать текст, находящийся в файле, следующим образом: каждое предложение должно иметь свой порядковый номер; начинаться с красной строки.

15. Определить, равны ли два заданных файла.

16. Заменить заданное слово в тексте, находящемся в заданном файле, на другое слово.

17. Напечатать самое длинное слово, найденное в тексте, находящемся в заданном текстовом файле.

18. Перед каждым символом поставить порядковый номер в тексте. Текст находится в заданном текстовом файле.

19. Если строка начинается с цифры, то перед ней поставить левую круглую скобку, а в конец строки – правую круглую скобку. Текст находится в заданном текстовом файле.

20. Подсчитать число цифр в данном тексте и их сумму. Текст находится в заданном текстовом файле.

21. Определить, какая буква чаще всего встречается в тексте, находящемся в заданном текстовом файле.

22. Напечатать самое длинное слово, найденное в текстовом файле.

23. Во всех словах заменить первую букву на последнюю, а последнюю на первую. Текст расположен в заданном файле.

24. Определить, встречается ли заданное слово в текстовом файле. Если да, то сколько раз.

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

–  –  –

Основные сведения

Чаще всего строки символов описываются как массивы:

char a[40], *b;

В переменной a можно хранить строки с максимальной длиной 39 символов. Один байт в строках символов отдается под нулевой символ.

Переменная b является указателем на строку символов:

b="Кафедра ИПУ";

Основные функции для работы со строками и описанные в библиотеке string.h:

1. strcpy

Прототип функции strcpy:

char* strcpy(char *target, const char *source);

Функция копирует строку source в строку target. Функция предполагает, что целевая строка имеет размер, достаточный для того, чтобы вместить содержимое строки-источника.

П р и м е р 7.1:

char name[41] ;

strcpy(name, "Borland C++ 5");

2. strdup Копирует одну строку в другую, при этом отводит необходимое количество памяти для целевой строки.

Прототип функции strdup:

char* strdup(const char *source);

Функция копирует строку source и возвращает указатель на строку-копию.

П р и м е р 7.2:

char *string1 = "Монархия в Испании";

char *string2;

string2 = strdup(string1);

3. strncpy Копирует заданное количество символов из одной строки в другую.

Прототип функции strncpy:

char * strncpy(char *target, const char *source, size_t num);

Функция копирует num символов из строки source в строку target. Функция не выполняет ни усечение, ни заполнение строки.

П р и м е р 7.3:

char str1[] = "Pascal";

char str2[] = "Hello there";

strcnpy(strl, str2, 5);

4. strlen Возвращает количество символов в строке, в которое не включается нуль-терминатор.

Прототип функции strncpy таков:

size_t strlen (const char *string);

Функция strlen возвращает длину строки string. size_t — это имя, приписанное типу unsigned int оператором typedef.

П р и м е р 7.4:

char str[] = "1234567890";

size_t i;

i = strlen(str);

5. strcat

Прототип функции strcat таков:

char *strcat(char *target, const char *source);

Функция добавляет к содержимому целевой строки содержимое строки-источника и возвращает указатель на целевую строку. Функция предполагает, что целевая строка может вместить содержимое объединенной строки.

П р и м е р 7.5:

char string[81] ;

strcpy(string, "Turbo");

strcat (string, " C++");

6. strncat Добавляет к содержимому целевой строки указанное количество символов из строки-источника.

Прототип функции strncat:

char *strncat(char *target, const char *source, size_t num);

Функция добавляет к содержимому целевой строки num символов из строки-источника и возвращает указатель на целевую строку.

П р и м е р 7.6:

char strl[81] = "Hello I am ";

char str2[41] = "Ivan Petrov";

strncat(strl, str2, 5);

7. strcmp Выполняет сравнение двух строк с учетом регистра символов.

Прототип функции strcmp:

int strcmp(const char *strl, const char *str2);

Функция сравнивает строки strl и str2. Возвращает в качестве результата сравнения целую величину:

0 когда strl меньше, чем str2;

= 0 когда strl равна str2;

0 когда strl больше, чем str2.

П р и м е р 7.7:

char stringl[] = "Borland C++";

char string2[] = "BORLAND C++";

i = strcmp(string1, string2);

8. stricmp Аналогична strcmp, но выполняет сравнение двух строк, не учитывая регистра символов.

9. strncmp Аналогична strcmp, но выполняет сравнение заданного количества символов двух строк с учетом регистра символов.

Прототип функции strncmp:

int strncmp(const char *strl, const char *str2, size_t num);

Функция сравнивает первые num символов строк strl и str2.

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

Прототип функции strnicmp:

int strnicmp(const char *strl, const char *str2, size_t num);

Функция сравнивает первые num символов строк strl и str2, не делая различия в регистре символов.

11. strlwr

Прототип функции strlwr:

char* strlwr (char *source);

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

П р и м е р 7.8:

char str[] = "HELLO THERE";

strlwr(str);

12. strupr

Прототип функции strupr:

char* strupr(char *source);

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

П р и м е р 7.9:

char str[] = "Borland C++";

strupr(str);

13. strrev

Прототип функции strrev:

char* strrev(char *str);

Функция обращает порядок символов в строке str и возвращает указатель на строку str.

П р и м е р 7.10:

char str[] = "Hello";

strrev(str) ;

14. strchr Определяет первое вхождение символа в строку.

Прототип функции strchr:

char* strchr(const char *target, int c);

Функция находит первое вхождение символа с в строку target. Функция возвращает указатель на символ в строке target, который соответствует заданному образцу с. Если символ с в строке не обнаруживается, функция возвращает 0.

П р и м е р 7.11:

char str[81] = "Borland C++";

char *strPtr;

strPtr = strchr(str, '+');

15. strrchr Определяет последнее вхождение символа в строке.

Прототип функции strrchr:

char* strrchr(const char *target, int c);

Функция находит последнее вхождение символа с в строку target. Функция возвращает указатель на символ в строке target, который соответствует заданному образцу с. Если символ с в строке не обнаруживается, функция возвращает 0.

П р и м е р 7.12:

char str[81] = "Borland C++ is here";

char* strPtr;

strPtr = strrchr(str, '+');

16. strspn Возвращает число символов с начала строки, совпадающих с любым символом из шаблона.

Прототип для функции strspn:

size_t strspn(const char *target, const char *pattern);

Функция strspn возвращает число символов от начала строки target, совпадающих с любым символом из шаблона pattern.

П р и м е р 7.13:

char str[] = "Borland C++ 5";

char substr[] = "narlBod";

int index;

index = strspn(str, substr);

17. strcspn Просматривает строку и выдает число первых символов в строке, которые не содержатся в шаблоне.

Прототип функции strcspn:

size_t strcspn(const char* str1, const char* str2);

Функция strcspn просматривает строку str1 и выдает длину подстроки, отсчитываемой с начала строки, символы которой полностью отсутствуют в строке str2.

П р и м е р 7.14:

char strng[] = "The rain in Spain";

int i = strcspn(strng, " in");

18. strpbrk Просматривает строку и определяет первое вхождение любого символа из образца.

Прототип функции strpbrk:

char* strpbrk(const char* target, const char* pattern);

Функция strpbrk ищет в строке target первое вхождение любого символа из образца pattern. Если символы из образца не содержатся в строке, функция возвращает 0.

П р и м е р 7.15:

char *str = "Hello there how are you";

char *substr = "hr";

char *ptr;

ptr = strpbrk(str, substr);

19. strstr

Прототип функции strstr:

char* strstr(const char *str, const char *substr);

Функция ищет в строке str первое вхождение подстроки substr. Функция возвращает указатель на первый символ найденной в строке str подстроки substr. Если строка substr не обнаружена в строке str, функция возвращает 0.

П р и м е р 7.16:

char str[] = "Hello there! how are you";

char substr[] = "how";

char *ptr;

ptr = strstr (str, substr);

20. strtok Разбивает строку на подстроки на основании заданного набора символов-ограничителей. Подстроки иногда называются лексемами.

Прототип функции strtok:

char* strtok(char *target, const char * delimiters);

Функция разбивает строку на лексемы, согласно символам-ограничителям, заданным в параметре delimeters. Функция strtok вводит символ '\0' после каждой лексемы.

П р и м е р 7.17:

#include stdio.h #include string.h int main() { char *str = "(Base_Cost + Profit) * Margin";

char *tkn = "+*()";

char *ptr = str;

printf("%s\n", str);

// Первый вызов функции ptr = strtok(str, tkn);

printf("Лексемы этой строки: %s", ptr);

while (ptr) { // Первый аргумент должен быть равен нулю if ((ptr = strtok(0, tkn)) != 0) printf (",%s", ptr);

} printf("\n");

return 0;

} Практические задания

1. Написать программу, которая запрашивает имя пользователя и здоровается с ним.

2. Напишите программу, которая вычисляет длину введенной с клавиатуры строки.

3. Напишите программу, которая выводит на экран сообщение в "телеграфном" стиле: буквы сообщения должны появляться по одной, с некоторой задержкой.

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

5. Написать программу, которая выводит на экран первую часть таблицы кодировки символов (символы с кодами от 0 до 127). Таблица должна состоять из восьми колонок и шестнадцати строк. В первой колонке должны быть символы с кодом от 0 до 15, во второй – от 16 до 31 и т.д.

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

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

8. Написать программу, которая проверяет, является ли введенная с клавиатуры строка целым числом.

9. Написать программу, которая проверяет, является ли введенная с клавиатуры строка двоичным числом.

10. Написать программу, которая проверяет, является ли введенная с клавиатуры строка шестнадцатеричным числом.

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

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

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

14. Написать программу, которая преобразует введенное пользователем десятичное число в число в указанной системе счисления (от 2 до 10).

15. Написать программу, которая преобразует введенное пользователем десятичное число в шестнадцатеричное.

16. Написать программу, которая вычисляет значение выражения N0O1N1O2 … OkNk, где Ni – целое одноразрядное число; Oi – один из двух знаков простейших арифметических действий: сложения (+) или вычитания.

17. Заданное число, от 1 до 1999, напечатать римскими цифрами X, L,V, I и т.д.

18. С клавиатуры вводится строка символов. Вывести на экран все согласные символы, встречающиеся в строке.

19. С клавиатуры вводится строка символов. Вывести на экран все гласные символы, встречающиеся в строке.

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

21. Написать программу, которая во введенной с клавиатуры строке преобразует буквы русского алфавита в латинские.

22. Написать программу, которая во введенной с клавиатуры строке меняет четные слова с нечетными.

23. Напишите программу, в которой с клавиатуры вводятся две строки символов. К строке с наибольшей длиной добавить текст, содержащийся в другой строке.

24. Напишите программу, в которой с клавиатуры вводятся две строки символов. К строке с наименьшей длиной добавить текст, содержащийся в другой строке.

–  –  –

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

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

Инициализация графического режима

Для этого используется функция initgraph, имеющая следующий синтаксис:

void far initgraph(int far *graphdriver, int far *graphmode, char far *pathtodriver) Функция initgraph инициализирует графическую систему путем загрузки графического драйвера с диска и переводит систему в графический режим.

Параметры функции:

– *pathodriver – определяет маршрут, по которому initgraph будет искать графические драйверы (если строка пуста, то поиск осуществляется в текущем каталоге);

– *graphdriver – целое, которое определяет используемый графический драйвер;

– *graphmode – целое, которое определяет исходный графический режим (если *graphdriver не равен DETECT, *graphmode устанавливается в наивысшее разрешение, допустимое для данного драйвера).

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

–  –  –

П р и м е р 7.1. Программа, инициализирующая и деинициализирующая графический режим (в программе используется автоопределение режима):

#include graphics.h #include stdlib.h #include stdio.h #include conio.h int main(void) { int graphdriver = DETECT, gmode, errorcode;

initgraph(&graphdriver,&gmode,"");

errorcode = graphresult(); – получение результата инициализации if(errorcode != grOk) – если ошибка */ { printf("Ошибка :%s\n",grapherrormessage(errorcode));

printf("Для останова нажмите любую клавишу\n");

getch();

return(1); – завершение с кодом ошибки } line(0,0,getmaxx(),getmaxy()); – построение диагональной линии getch();

closegraph();

return 0;

}

–  –  –

Практические задания Разработать программу построения графика функции, заданной в соответствии с вариантом. Границы исследуемого участка функции (min x и max x), масштаб по осям ОХ и OY задаются пользователем с клавиатуры.

Предусмотреть вывод координатных осей на экран и их разметку в соответствии с заданными масштабом и границами.

СПИСОК ЛИТЕРАТУРЫ

1. Березин, Б.И. Начальный курс С и С++ / Б.И. Березин, С.Б. Березин. – М. : Диалог – МИФИ, 1996. – 288 с.

2. Громов, Ю.Ю. Программирование на языке СИ : учебное пособие / Ю.Ю. Громов, С.И. Татаренко. – Тамбов, 1995. – 169 с.

3. Жешке, Р. Толковый словарь стандарта языка Си / Р. Жешке. – СПб. : Питер, 1994.

4. Информатика : задачник-практикум. В 2 т. / под ред. И.Г. Семакина, Е.К. Хеннера. – М. : Бином; Лаборатория Знаний, 2002. – 304 с.

5. Касаткин, А.И. Профессиональное программирование на языке С. От Turbo C к Borland С++ / А.И. Касаткин. – Минск : Высшая школа, 1995.

6. Керниган, Б. Язык программирования С / Б. Керниган, Д. Ритчи. – 2-е изд. – М. : Финансы и статистика, 1992.

7. Кузнецов, С.Д. Турбо С / С.Д. Кузнецов. – М. : Малип, 1991. – 70 с.

8. Собоцинский, В.В. Практический курс Turbo C++ / В.В. Собоцинский. – М. : Свет, 1993.

СОДЕРЖАНИЕ

ВВЕДЕНИЕ ………………………………………………………………... 3 Лабораторная работа 1. ПРОГРАММИРОВАНИЕ ЛИНЕЙНЫХ АЛГОРИТМОВ ………………………………... 3 Лабораторная работа 2. ПРОГРАММИРОВАНИЕ ВЕТВЯЩИХСЯ АЛГОРИТМОВ ……………………………….. 8 Лабораторная работа 3. ПРОГРАММИРОВАНИЕ ЦИКЛИЧЕСКИХ АЛГОРИТМОВ ……………………………….. 11 Лабораторная работа 4. РАБОТА С МАССИВАМИ …………………... 15 Лабораторная работа 5. РАБОТА С ФУНКЦИЯМИ …………………… 20 Лабораторная работа 6. РАБОТА С ФАЙЛАМИ ………………………. 22 Лабораторная работа 7. РАБОТА СО СТРОКАМИ СИМВОЛОВ ……. 26 Лабораторная работа 8. РАБОТА С ГРАФИКОЙ ……………………… 34 СПИСОК ЛИТЕРАТУРЫ ………………………………………………… 38



Похожие работы:

«"Информатика и ИКТ" для студентов 1 курса Раздел 4. Технологии создания и преобразования информационных объектов Лекция 1. Тема 4.1 Понятие об информационных системах и автоматизаци...»

«МЕЖГОСУДАРСТВЕННЫЙ СОВЕТ ПО СТАНДАРТИЗАЦИИ. МЕТРОЛОГИИ И СЕРТИФИКАЦИИ (МГС) INTERSTATE COUNCIL FOR STANDARDIZATION. METROLOGY AND CERTIFICATION (ISC) ГОСТ МЕЖГОСУДАРСТВЕННЫЙ ISO/HL7 21731 — СТАНДАРТ Информатизация здоровья HL7, ВЕРСИЯ 3 Эталонная информационная модель Выпуск 1 (ISO/HL7 21731:2006, ЮТ) Издание оф...»

«Министерство образования Республики Беларусь Учреждение образования "Белорусский государственный университет информатики и радиоэлектроники" Кафедра физики ЛАБОРАТОРНАЯ РАБОТА № 2.20 ИЗУЧЕНИЕ ДИФРАКЦИИ СВЕТА НА УЛЬТРАЗВУКОВОЙ ВОЛНЕ МЕТОДИЧЕСКОЕ ПОСОБИЕ Минск БГУИР 2012 Лабораторная раб...»

«Засухина Елена Семеновна Быстрое автоматическое дифференцирование в задачах оптимального управления Специальность 01.01.09 Дискретная математика и математическая кибернетика Автореферат диссертации на соискание ученой степени кандидата физико-математических наук Москва – 2007 Работа выполнена в Вычислительном...»

«Правительство Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования "Санкт-Петербургский государственный университет" Кафедра Системного Программирования Дерюгин Денис Евгеньевич Реализация виртуальной файловой системы для ОС...»

«ISSN 2079-3316 ПРОГРАММНЫЕ СИСТЕМЫ: ТЕОРИЯ И ПРИЛОЖЕНИЯ № 3(17), 2014, C.??—?? УДК 004.75 С. Ю. Волков, О. В. Сухорослов Реализация запуска многовариантных расчетов на платформе Everest АННОТАЦИЯ. Многовариантные расчеты являются чрезвычайно важным классом приложений, обычно определяемых как набор вычислительных задач, определенных на...»

«МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Беловский институт (филиал) федерального государственного бюджетного образовательного учреждения высшего профессионального образования "Кемеровский государствен...»

«Тренировочная работа по ИНФОРМАТИКЕ 11 класс 18 марта 2016 года Вариант ИН10403 Выполнена: ФИО_ класс Инструкция по выполнению работы Работа состоит из двух частей, включающих в себя 27 заданий. Часть 1 содержит 23 задания с кратким ответом. Часть 2 содержит 4 задания с развёрнуты...»

«Правительство Санкт-Петербурга Комитет по информатизации и связи СПб ГУП "СПб ИАЦ" Межведомственная автоматизированная информационная система предоставления в Санкт-Петербурге государственн...»

«Учреждение образования "Белорусский государственный университет информатики и радиоэлектроники" УТВЕРЖДАЮ Проректор по учебной работе Е.Н. Живицкая 20.03.2017 г. Регистрационный № УД-1-673/уч. "Технология программно-управляемых электронных средств" Учебная...»

«ДОКЛАДЫ БГУИР №2 ЯНВАРЬ–МАРТ УДК 621.317.846 РАЗРАБОТКА И МЕТРОЛОГИЧЕСКОЕ ОБЕСПЕЧЕНИЕ ИЗМЕРИТЕЛЬНОЙ АППАРАТУРЫ В МИЛЛИМЕТРОВОМ ДИАПАЗОНЕ ДЛИН ВОЛН А.В. ГУСИНСКИЙ, М.Ю. ДЕРЯБИНА, А.М. К...»

«mi М $/ М И Н И С ТЕРС ТВ О ПУТЕЙ СООБЩ ЕН ИЯ СССР ^ ^ МОСКОВСКИЙ ОРДЕНА ЛЕНИНА И ОРДЕНА ТРУДОВОГО КРАСНОГО ЗНАМЕНИ ИНСТИТУТ ИНЖЕНЕРОВ ЖЕЛЕЗНОДОРОЖНОГО ТРАНСПОРТА Кафедра прикладной математики МЕТОДИЧЕСКИЕ УКАЗАНИЯ К ЛАБОРАТОРНОМУ ПРАКТИКУ...»

«БЕЗРОДНЫХ Сергей Игоревич Сингулярная задача Римана Гильберта и ее приложение 01.01.03 математическая физика АВТОРЕФЕРАТ диссертации на соискание ученой степени кандидата физико–математических наук Москва 2006 Работа выполнена в Вычислительном центре им. А.А. Дородницына Россий...»

«МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Беловский институт (филиал) федерального государственного бюджетного образовательного учреждения высшего профессионального образования "Кемеровский государственный университет" Кафедра математики и естественных наук Рабочая программа дис...»

«МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Алексеевский филиал федерального государственного автономного образовательного учреждения высшего профессионального образования "Белгородский государственный национальный исследовательский университет" (АФ НИУ "БелГУ") УТВЕРЖДАЮ Заместитель директора по уче...»








 
2017 www.kn.lib-i.ru - «Бесплатная электронная библиотека - различные ресурсы»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.