Методические указания к выполнению лабораторных работ по курсу «Программирование»


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

к выполнению лабораторных работ по курсу «Программирование»

для студентов направления 6.050201 «Системная инженерия»

 

 

 

Методические указания к выполнению лабораторных работ по курсу «Программирование» для студентов направления 6.050201 «Системная инженерия» / Сост. Довгалец С.М., Маслий Р.В. — Винница: ВНТУ, 2015. — 77 с.

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

содержание

 

 

Порядок выполнения лабораторных и контрольных работ Лабораторная работа №1.Работа в текстовом редакторе Лабораторная работа №2.Линейная структура Лабораторная работа №3. Операторы выбора

Лабораторная работа №4. Операторы цикла Лабораторная работа №5.одномерные массивы

Лабораторная работа №6. Алгоритмы поиска и сортировки Лабораторная работа №7.Многомерные массивы Лабораторная работа №8. функции

Лабораторная работа №10. Указатели Лабораторная работа №11.Работа с файлами

Порядок выполнения лабораторных и контрольных работ

Лабораторные работы состоят из нескольких программ, задач к ним. Студент должен создать, наладить и сохранить в рабочем каталоге программы в точном соответствии с приведенными в лабораторных работах текстами программ (выходные программы), проделать и проанализировать результаты их работы. Разработать для каждой исходной программы самостоятельное задание. Продемонстрировать преподавателю работу программ.

 

общие сведения

Программа на языке Си всегда содержит одну главную функцию main ().Ключевое слово void означает, что функция main () не возвращает никаких параметров.Тело функции всегда находится в блоке программы, который ограничен открывающей и закрывающей скобками {…}.

Основные типы данных. Определение основных (базовых) типов данных осуществляется с помощью ключевых слов. Для типов с плавающей точкой (действительных) используются ключевые слова float, double, long double, для целых типов — char, int, short, long со служебными словами signed и unsigned, которые указывают, что целый переменная считается знаковой или беззнаковое.Операция sizeof вычисляет размер в байтах участка памяти, которая занята переменной указанного типа или типу данных.

Операторы ввода и вывода данных. Для вывода на экран монитора используются функции printf () puts () putchar () и др.Функции putchar () puts () имеют только один параметр и выводят соответственно символы и строки, но не обеспечивают вывод числовых данных.Функция printf () используется для форматированного вывода на экран всех типов данных с помощью спецификаторов.

Спецификатор формата начинается с символа%, после которого стоит символ, указывающий тип данных:% d — целое число; % ld — длинное целое число типа long int; % u — беззнаковое целое число; % f — действительное число типа float;

% lf — действительное число типа Doubl; % Lf — длинное действительное число типа long double; % e — действительное число в экспоненциальной форме; % c — символ; % s — строка; % o — целые числа в восьмилетней системе счисления; % x — целые числа в 16-летней системе счисления; % p — адрес переменной в 16-летней системе счисления.

Основные функции ввода данных с клавиатуры scanf (), gets (), getchar ().Функция getchar () не имеет параметров и вводит символы, функция gets () имеет один параметр вводит строки.Функция scanf () осуществляет преобразование формата с помощью спецификаторов и может иметь несколько аргументов, позволяя тем самым вводить значения числовых, символьных переменных и строк.Спецификаторы формата аналогичные (но не полностью) тем, что используются функцией вывода printf ().

Операторы условия.Условный оператор if … else выбирает один из двух вариантов последовательности вычислений и имеет следующий синтаксис:

if (выражение_1) вираз_2 else вираз_3

Если выражение_1 не равно 0, то выполняется вираз_2, иначе (если

выражение_1 равен 0) выполняется вираз_3.

Конструкция if … else может содержать операторы ввода-вывода значений, выполнения математических операций или вызовы собственных функций, а также и другую инструкцию if.

Если в программе надо учесть более трех возможных вариантов, целесообразно использовать оператор множественного выбора switch.Синтаксис этого оператора следующий:

switch (перемикаючий_вираз)

{case константний_вираз_1: оператори_1; break; case константний_вираз_2: оператори_2; break;

. . .

default: оператори_ n + 1;}

Оператор switch передает управление том оператору, константное выражение которого совпадает с значениями переключающего выражения.Если значение переменной не удовлетворяет условиям одной из ветвей case, выполняется ветвь, обозначенная меткой default.Если вы пропустили оператор break, компьютер выполнит все операторы, которые содержатся в соответствующей ветке case и других ветвях, до первого встреченного в тексте break.

Операторы цикла. Язык Си (Си ++) имеет три оператора, с помощью которых можно организовать циклы: for, while, do … while.

Цикл с оператором for чаще используется в случае, когда известно точное количество повторов нужно выполнить.Этот оператор синтаксис:

for (инициализация_циклу; условие, список выражений) тело_цикла

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

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

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

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

Имя массива является указателем-константой, значением которого является адрес первого элемента массива.   Так что это значение нельзя изменить.

Например, если открывается массив в виде int arr [10], то этим определяется не только выделение памяти для десяти элементов массива, но и для указателя с именем arr, значение которого равно адресу первого (нулевого) элемента массива.Поскольку имя массива является указателем, то его значение можно присваивать другим указателям. Таким образом, возможны следующие конструкции:

int arr [10]; int * ptr = arr;

* Arr = 2; arr [0] = 2;

* (Arr + 0) = 2;

* Ptr = 2; ptr [0] = 2;

* (Ptr + 0) = 2;

все они приводит к одинакового результата — начальном элемента массива присваивается значение 2.В данных конструкциях указатель ptr, связанный с массивом, не является константой, его размер не равна длине массива.С элементами массивов, связанными с указателями, можно работать с помощью индексов и с использованием операции разыменования. Итак правильными будут записи для доступа к элементам: ptr [i], * (ptr + i), i [ptr], * (i + ptr).

Инициализация массивов. Присвоение начальных значений элементам массивов при их объявлении, то есть инициализация массивов, может осуществляться по умолчанию и явно.

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

int a [5] = {2,5,7,9,1}; // Пример с полным списком

int b [7] = {5,7,9}; // Пример с неполным списком

В последней строке другие четыре элемента массива b [7] будут иметь значение или нулевые (внешний и статический массивы), или их значения будут неопределенные (автоматический массив).

Второй случай — без указания размера массива. Компилятор определяет число элементов массива по списку инициализации:

int c [] = {5,7,9,8}; // Массив из четырех элементов

Символьные массивы. Последовательность символов, которая находится в парных двойных кавычках, в языке Си называется строкой.Строка отображается в памяти как массив элементов типа char, в конце которого находится символ ‘\ 0’ (иногда такой массив называют ASCIIZ-строкой).Адрес первого символа может использоваться для инициализации массива типа char, в этом случае имя массива и адрес первого символа становятся синонимами.Например:

char str [5] = «name»; char str [] = «name»;

char str [5] = { ‘n’, ‘a’, ‘m’, ‘e’, ​​’\ 0′};

Адрес первого элемента строки может использоваться для инициализации указателя типа char, например

char * strptr = «name»;

В этом случае переменная — указатель strptr (но не указатель-константа) получает значение, равное адресу символа ‘n’, а сама строка располагается в сегменте данных загрузочного модуля программы.

Массивы указателей. В языке Си определены массивы указателей. Примером определения массива из пяти указателей на объекты типа int есть запись: int * array [5]; Имя массива — array, он содержит пять элементов типа int *.Выражение (array + 1) соответствует смещению в памяти на sizeof (int *) байтов от начала массива.

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

char * name [] = { «Иванов», «Петр», «Егорович»};

При таком определении в памяти выделяется 3 * sizeof (char *) байт для указателей name [0] name [1], name [2], 7 байт — для срочного литерала «Иванов», 6 — для «Петр» и 9 — для «Егорович».

лабораторные работы

Лабораторная работа №1. Работа в текстовом редакторе

 

Цель и задачи:

Научиться набирать и форматировать текст в текстовом редакторе.

Порядок исполнения и отчетности

1. Создать тестовый файл в Блокноте, и написать в нем свою автобиографию, в которой нужно указать:

дату и место своего рождения;

информацию о школе в которой учились;

короткую информации о своей семью;

достижения в учебе (участия в олимпиадах)

спортивные достижения;

количество баллов ВНО;

в которые ВУЗы прошли по рейтинга;

2. Сохранить тестовый файл в папке своей бригады.

3. Создать текстовый файл в WordPad, скопировать набранный текст с Блокнота и осуществить следующее его форматирования:

шрифт — Times New Roman;

размер шрифта — 14;

выравнивание — по левому края.

выделить жирным шрифтом дату и место рождения;

выделить курсивом количество баллов ВНО;

4. Создать текстовый файл в Microsoft Word, скопировать в него отформатированный текст с WordPad. Осуществить следующую смену форматирования:

выравнивание — по ширине.

5. Создать таблицу, в которой создать гиперссылки на текстовые файлы с автобиографиями всех студентов подгруппы. Формат таблицы указанный на рис. 1.

 

 

 

 

Рисунок 1 — Формат таблицы с гиперссылками на текстовые документы Итог

Уметь осуществлять элементарное форматирование текста в текстовых редакторах.

контрольные вопросы

1. Как изменить шрифт в WordPad?

2. Как выделить текст курсивом, жирным или подчеркнутым в WordPad ?

3. Чем отличается текстовый редактор от текстового процессора?

4. Для чего предназначен Блокнот ?

5. Для чего предназначен WordPad ?

6. Копирование текста в WordPad?

7. Как вставить формулу в Microsoft Word ?

8. Способы сохранения документа в Microsoft Word Вы знаете ?

9. Как проверить орфографию в Microsoft Word?

10. Способы создания таблиц в Microsoft Word Вы знаете ?

Лабораторная работа №2. линейная структура

 

Цель и задачи:

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

Теоретические сведения и методические указания

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

Формально при построении схем линейных алгоритмов используются три символа (рисунок 1):

    • терминатор;
    • ввод / вывод;
    • процесс.

Рисунок 1 — Символы, которые используются при построении схем линейных алгоритмов

Символ «Терминатор» начинает и завершает любую схему алгоритма. В нем записывается соответствующее слово: «Начало» или «Конец». От блока «Начало» отходит только одна линия. Внутри символа «Вот / вывод» записываются значения, вводимые в алгоритм (программу) или выводятся из него. При этом указывается соответствующее слово: «Вот» или «Вывод».

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

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

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

Рисунок 2 — Иллюстрация правила выставления стрелок на концах соединительных линий в схеме алгоритма

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

Рисунок 3 — Пример использования соединительного символа

Порядок исполнения и отчетности

1. Создать программу на языке С согласно варианту использовав среда программирования Dev-C ++ 4.0.

2. Откомпилировать и отладить программу.

3. Разработать набор тестов и проверить работу программы на них.

4. Ответить на контрольные вопросы.

5. К каждой программы составить схему программы.

6. сделать выводы.

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

 

варианты заданий

Вариант 0.

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

Входные данные: Координаты углов: х1, у1 — -2 5,

х2, у2 — 7 января;

х3, у3 — 5 -3.

Исходные данные:

Площадь треугольника — 23,56 кв. см.

 

2. Написать программу пересчета величины временного интервала, заданного в минутах, в величину, выраженную в часах и минутах.

Входные данные:

Временной интервал — 150 минут. Исходные данные:

150 минут — это 20 ч. 30 мин. итог

После выполнения лабораторной работы студент должен уметь создавать программы с линейной структурой на языке С.

 

Вариант 1.

1. Написать программу вычисления площади параллелограмма.входящие данные:

Длина — 9 см; Ширина — 7,5 см; Исходные данные:

Площадь параллелограмма — 67,50 кв. см.

 

2. Написать программу вычисления сопротивления электрической цепи, состоящий из двух параллельно соединенных сопротивлений.

Входные данные:

Размер первого сопротивления — 15 Ом; Размер второго сопротивления — 20 Ом; Исходные данные:

Сопротивление цепочки — 8,57 Ом.

 

Вариант 2.

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

Входные данные: Длина — 9 см; Ширина — 7,5 см; Высота — 5 см.

Исходные данные:

Объем — 337,50 куб. см.

 

2. Написать программу вычисления сопротивления электрической цепи, состоящий из двух последовательно соединенных сопротивлений.

Входные данные:

Размер первого сопротивления — 15 Ом; Размер второго сопротивления — 27,3 Ом; Исходные данные:

Сопротивление цепочки — 42,30 Ом

 

Вариант 3.

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

Длина — 9 см; Ширина — 7,5 см; Высота — 5 см.

Исходные данные:

Площадь поверхности — 90,00 кв. см.

 

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

Напряжение — 36 В; Сопротивление — 1500 Ом; Исходные данные:

Сила тока — 0,024 А.

 

Вариант 4.

1. Написать программу вычисления объема куба. входящие данные:

Длина ребра — 9,5 см; Исходные данные:

Объем куба — 857,38 куб. см

 

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

Входные данные:

Масштаб карты — 120.

Расстояния между точками, изображенных населенных пунктов — 3,5 см.

Исходные данные:

Расстояние между населенными пунктами — 420 км.

 

Вариант 5.

1. Написать программу вычисления объема цилиндра. входящие данные:

Радиус основания — 5 см; Высота цилиндра — 10 см. Исходные данные:

Объем цилиндра — 1570,80 куб. см.

 

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

Входные данные:

Расстояние до дачи — 67 км.

Расход бензина — 8,5 л. на 100 км. Цена литра бензина — 6,5 грн.

Исходные данные:

Поездка на дачу туда и обратно — 74,04 грн.

Читать  Тест Основы алгоритмизации – Программирование на языке PASCAL

 

Вариант 6.

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

Входные данные:

Цена тетради — 2,75 грн.; Количество тетрадей — 5; Цена карандаша — 0,85 грн.; Количество карандашей — 2.

Исходные данные:

Стоимость покупки — 15,45 грн.

 

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

Входные данные:

Длина дистанции — 1000 м. Время — 3 мин. 25 сек ..

Исходные данные:

Вы пробежали со скоростью — 17,56 км / час

 

Вариант 7.

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

Входные данные:

Цена тетради — 2,75 грн.; Цена обертки — 0,85 грн.; Количество комплектов — 7 шт. Исходные данные:

Стоимость покупки — 22,75 грн ..

 

2. Написать программу вычисления объема цилиндра.входящие данные:

Радиус основания — 5,5 см. Высота цилиндра — 7 см. Исходные данные:

Объем цилиндра — 665,23 куб. см.

 

Вариант 8.

1. Написать программу вычисления стоимости некоторого количества (по весу) яблок.входящие данные:

Цена одного килограмма яблок — 8,5 грн.; Вес яблок — 2,3 кг;

Исходные данные:

Стоимость покупки — 19,55 грн.

 

2. Написать программу вычисления площади поверхности цилиндра.входящие данные:

Радиус основания — 5,5 см. Высота цилиндра — 7 см. Исходные данные:

Площадь поверхности — 431,97 кв. см.

 

Вариант 9.

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

Входные данные:

Длина двух сторон треугольника — 25,17 см.;

Величина угла между сторонами треугольника — 30 градусов. Исходные данные:

Площадь треугольника — 106,25 кв. см.

 

2. Написать программу пересчета расстояния с верст в километры (1 верста

— это 1066,8 м.)

Входные данные:

Расстояние в милях — 100. Исходные данные:

100 верст — это 106,8 км

контрольные вопросы

1. Дайте определение линейного алгоритма и назовите основные символы, которые используются при построении схем программ линейных алгоритмов;

2. Перечислите и охарактеризуйте основные числовые типы данных языка С.

Лабораторная работа №3. Операторы выбора

Цель и задачи:

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

Теоретические сведения и методические указания

Язык программирования С включает три вида управляющих структур (операторов), которые работают на основе выбора альтернатив: оператор if (конструкция if — else), тернарный оператор (?:) И оператор switch (конструкция switch — case).

 

Условный оператор if (конструкция if — else)

Конструкция с одиночным оператором if предназначена для выполнения команды или блока команд в зависимости от того, истинным или ложным заданный логическое выражение — «условие».Общий формат такой конструкции имеет следующий вид:

 

if ( выражение ) true-оператор; else false-оператор;

 

Если логическое выражение является истинным, будут выполняться действия из перечня действий 1, если ложным — из перечня действий 2, то есть записанные в блоке оператора else.Общая схема программы оператора if-else представлена на рис 1.

 

 

 

 

 

 

 

 

 

 

   

 

Рисунок 1 — Общая схема программы оператора if-else

 

пример:

 

printf ( «Введите возраст: ‘); scanf ( «% i», & Age)

if (Age> = 18)

{

printf ( «Вы — совершеннолетний человек \ n»);

}

else

{

printf ( «Вы — несовершеннолетний человек \ n»);

}

 

Если нет необходимости указывать перечень действий, которые нужно выполнить в случае ошибочности условия, то оператор if записывается:

 

if (Выражение) true-оператор;

 

Такая конструкция соответствует схеме программы, представленной на рисунке 2.

 

Рисунок 2 — Общая схема программы оператора if

Логическое выражение, которое обрабатывается оператором if, может принимать два значения: «истина» и «ложь», однако вообще, с точки зрения компилятора истинно любое ненулевое значение, а ложным — нулевое.Это означает, что проверка вида:

if (x <> 0) …

 

( «Если x не равен нулю») можно заменить на более сжатую, хотя и менее наглядную:

if (x) …

 

В этом случае, если переменная x содержит произвольное число, которое отличается от нуля, оно будет считаться равным значению «истина» с соответствующими последствиями.

Аналогично, условие вида: if (x == 0) …

 

может быть заменена на if (!x) …

(Читается «если не-Икс»). Тогда нулевое значение переменной x, которое символизирует «ложь», операцией логического отрицания — «!» — будет преобразовано в «истину» и наоборот.

пример:

 

printf ( «Введите стартовый капитал фирмы, грн: ‘); scanf ( «% i», & StartMoney)

if (!StartMoney)

{

printf ( «Если капитала нет, невозможно работать дальше \ n»);

}

else

{

 

Тернарный оператор (? 🙂

 

Тернарный оператор позволяет заменить конструкцию if — else более компактным записи.Формат турнирных оператора имеет следующий вид:

 

(Логическое выражение)? действие 1: действие 2,

 

После проверки значения логического выражения в случае его истинности выполняется действие 1, а в случае ошибочности — действие 2.

 

пример:

 

(Age> = 18)? printf ( «Совершеннолетний»): printf ( «Несовершеннолетний»)

 

Оператор множественного ветвления swicth

 

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

 

if (DayNumber == 1) printf ( «Понедельник») else if (DayNumber == 2) printf ( «Вторник») else if (DayNumber == 3) printf ( «Среда») else if (DayNumber == 4) printf ( «Четверг») else if (DayNumber == 5) printf ( «Пятница»)

else if (DayNumber == 6) printf ( «Суббота») else printf ( «Воскресенье»)

 

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

 

switch (выражение)

{

case константное выражение 1: набор операторов 1; break; case константное выражение 2: набор операторов 2; break; case константное выражение n: набор операторов n; break; default: набор операторов по умолчанию;

}

 

Конструкция switch — case работает следующим образом.Целочисленный выражение последовательно сравнивается с константным значением 1, 2 и т. Д. Если некоторое значение k совпадает со значением выражения, то выполняется соответствующее действие k, после чего оператор break передает управление за пределы блока switch.Если среди констант не нашлось равной выражения, то управление передается на метку default.При отсутствии этой метки управление передается за пределы блока switch.

На рис. 3 представлена общая схема программы оператора множественного ветвления switch.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
   

 

Рисунок 3 — Общая схема программы оператора множественного ветвления switch

Таким образом, реализация проверки на примере о днях недели на основе оператора switch иметь следующий вид:

 

swicth (DayNumber)

{

case 1: printf ( «Понедельник») break; case 2: printf ( «Вторник») break; case 3: printf ( «Среда») break; case 4: printf ( «Четверг») break; case 5: printf ( «Пятница») break; case 6: printf ( «Суббота») break; default: printf ( «Воскресенье»)

}

Порядок исполнения и отчетности

1. Создать программу на языке С согласно варианту использовав среда программирования Dev-C ++ 4.0.

2. Откомпилировать и отладить программу.

3. Разработать набор тестов и проверить работу программы на них.

4. Ответить на контрольные вопросы.

5. К каждой программы составить схему программы.

6. сделать выводы.

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

 

варианты заданий

 

Вариант 0.

Написать программу, которая запрашивает у пользователя номер дня (1-30) июня текущего года и выводит соответствующую номера название дня недели.

 

Вариант 1.

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

 

Вариант 2.

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

«Решетку» N x N, в диапазоне 0 <N <200. Например, при N = 2 ответ 12.

Проверять соответствие входных данных заданному диапазону.

 

Вариант 3.

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

 

Вариант 4.

Написать программу вычисления стоимости покупки с учетом скидки. Скидка в 3% предоставляется, если стоимость покупки больше 500 гривен, в 5% если стоимость больше 1000 гривен.

 

Вариант 5.

Написать программу вычисления стоимости катания на коньках в ледовом комплексе. Входные данные — время пребывания на катке, вид карты (VIP- карта — 20% скидка от базовой стоимости в час, Premium-карта — 10% скидка от базовой стоимости в час, Base-карта — базовая стоимость в час).

 

Вариант 6.

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

 

Вариант 7.

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

 

Вариант 8.

Написать программу, которая после введенного с клавиатуры числа (в диапазоне от 1 до 99), обозначающий денежную единицу, дописывает слова «копейка» в правильной форме.Например 5 копеек, 3 копейки тому подобное.

 

Вариант 9.

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

 

После выполнения лабораторной работы студент должен:

1. Знать таблицы истинности для логических операций и побитовых логических операций.

2. Уметь использовать логические операции для написание программ с разветвлением вычислительных процессов на языке программирования С.

3. Уметь создавать программы с разветвлением вычислительных процессов используя операторы выбора if, if-else, switch на языке программирования С.

контрольные вопросы

1. Какие операторы выбора существуют в языке С ?

2. Какую роль играет оператор if при написании программ ?

3. Тип выражения имеет оператор условия ?

4. Как выполняется работа оператора if ?

5. Обязательно должны присутствовать все ветви оператора if ?

6. Допускается вложенность операторов if ?

7. Какая глубина вложений допускается ?

8. Сколько операторов может содержать каждая из ветвей оператора if ?

9. Что нужно сделать, когда в каждой ветке надо выполнить не один, а больше операторов?

10. Какое правило применяется во избежание неоднозначности использования зарезервированного слова else?

11. Какую роль выполняет оператор switch ?

12. Тип выражения имеет «селектор» оператора switch ?

13. Сколько меток может содержать каждая из ветвей оператора switch ?

14. Как выполняется работа оператора switch ?

15. Когда эффективно использовать оператор switch ?

16. Сколько операторов может иметь каждая из ветвей оператора switch ?

17. Какого типа могут быть метки в операторе switch ?

18. Операторы выбора используют операторы отношения.              Какие операторы отношение Вы знаете ?

19. Типы операндов допустимые в операторах отношения, и результат будут иметь эти отношения ?

20. Какого типа операнды могут быть использованы в операторах отношения ?

21. Каким образом выполняется сравнение строчных данных ?

22. Логические операции выполняются в языке С ?

23. Какой приоритет имеют логические операции по сравнению с операциями отношения ?

24. Имеют место какие-то особенности при выполнении логических операций ?

25. Какая разница между моделями полного вычисления логических выражений и по короткой схеме?

26. В каких случаях уместна короткая схема вычисления логических выражений ?

27. В каких случаях уместна полная схема вычисления логических выражений ?

28. Какой приоритет имеют логические операции по сравнению с арифметическими операциями?

29. В основе которых алгоритмов лежат операторы отношения ?

30. Постройте таблицы истинности логических функций НЕТ, ИЛИ, И.

 

контрольные упражнения

1. С помощью операторов выбора и присваивания записать фрагмент программы, который вычисляет значение переменной n по следующему правилу:

n + 1 при i = 1 или и = 5

n a + b при i = 7 или и = 12

a — b в Других случаях

 

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

n + 1 при a> 0 ib = 0

при a <= 0 ib = 0

a — b в Других случаях

3. С помощью операторов выбора и присваивания записать фрагмент программы, который вычисляет значение переменной n по следующему правилу:

1 при i = 1 или 2 или 7

n               2 при i = 10

в других случаях

 

4. Изобразить фрагмент схемы программы, который соответствует следующему фрагменту программы:

if (c <3) if (c == 2) a ++; else b ++; a + = 1;

 

5. Изобразить фрагмент схемы программы, который соответствует следующему фрагменту программы:

if (c <3) if (c == 2) a ++; b ++; a + = 1;

 

6. Изобразить фрагмент схемы программы, который соответствует следующему фрагменту программы:

if (c <3) if (c == 2) a ++; else b ++; if (c <2) c ++; a + = 1;

 

7. Изобразить фрагмент схемы программы, который соответствует следующему фрагменту программы:

if (c <3) if (c == 2) a ++; else b ++; if (c <2) c ++; else a + = 1; {C ++; b ++; }

 

8. Ввести и напечатать значения элементов массива вещественного типа с размером 10. Вычислить и напечатать количество отрицательных элементов массива.

9. Ввести и напечатать значения элементов массива вещественного типа с размером 20. Вычислить и напечатать индекс наименьшего элемента массива.

10.Ввести и напечатать значения элементов массива целого типа с размером

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

11.Ввести и напечатать значения переменных a, b, c действительного типа. Вычислить и напечатать, сколько между ними отличных от нуля.

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

13.Ввести и напечатать значения переменных a, b, c действительного типа. Вычислить количество положительных значений среди заданных и напечатать ответ.

14.Ввести и напечатать значения переменных x действительного типа. Вычислить и напечатать, значение функции y = | x |.

15.Вывести и напечатать значение x действительного типа.Вычислить и напечатать значения в:

+ 1

 

при х> 0 при х 0

— 1

при x <0

Лабораторная работа №4. Операторы цикла

Цель и задачи:

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

Теоретические сведения и методические указания

Циклические структуры (циклы) позволяют программисту определить действия, которые необходимо повторять, пока некоторое условие остается истиной. Язык С обеспечивает три типа циклических структур, которые строятся на операторах for, while и do — while, а также два оператора, предназначенные для изменения последовательности выполнения цикла: break и continue.

 

Оператор цикла for

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

 

for (выражение 1; выражение 2, выражение 3)

{

тело цикла;

}

 

Оператор работает таким образом, что «выражение 1» будет выполнен только один раз в момент входа в цикл, «выражение 3» будет выполняться в конце каждого шага цикла, а сам цикл будет продолжаться до тех пор, пока «выражение 2″ имеет значение » истина «(то есть вообще любое, видзначне от нуля). При этом проверка значения «выражения 2» осуществляется перед выполнением тела цикла. Это означает, что цикл на основе оператора for является циклом с предусловием, то есть циклом «ПОКА».

Общая схема программы оператора цикла for представлена на рис.1.

Рисунок 1 — Общая схема программы оператора цикла for

Гибкость оператора for в языке программирования С позволяет строить на его основе даже такие конструкции, которые на первый взгляд могут показаться бессмысленными, например

 

for (;;)

 

что означает бесконечный цикл.

Понятно, что подобные «экзотические» конструкции применяются довольно редко. На практике используется следующий формат оператора for:

 

for (инициализация счетчика, проверка счетчика, изменение счетчика)

{

тело цикла;

}

 

пример:

 

S = 0.0;

k = 1;

// цикл, в котором переменная-счетчик i

// будет последовательно приобретать значение 0, 1, 2, …, n — 1 for (i = 0; i < n; i ++)

{

S + = pow (x, i) * sin (x) / k; k * = (i + 1);

}

 

В приведенном примере последнее значение, которое вступит переменная-счетчик i, равна n — 1.  Сразу после вступления счетчиком значения n выражение «i <n» станет ложным и цикл прекратится.

 

Цикловой оператор while

Оператор while как и оператор for предназначен для организации циклов с предусловием и имеет следующий формат:

 

while (выражение)

{

тело цикла;

}

 

В отличие от оператора for, оператор while автоматически выполняет только одну операцию перед каждым шагом цикла: проверяет значение

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

Цикл продолжается до тех пор, пока выражение имеет истинное значение. пример:

S = 0.0;

k = 1;

i = 0;

// ПОКА i <n цикл продлится while (i <n)

{

S + = pow (x, i) * sin (x) / k; k * = ++ i;

}

 

Общая схема программы оператору цикла while изображена на рис.2.

Рисунок 2 — Общая схема программы оператора цикла while

Цикловая конструкция do-while

 

Принцип работы конструкции do — while аналогичный оператору while, однако эта конструкция предназначена для организации циклов с постусловием (циклов «К») и имеет следующий формат:

 

do {

тело цикла;

} While (выражение);

 

пример:

 

S = 0.0;

k = 1;

i = 0;

// тело цикла будет повторяться до тех пор … do {

S + = pow (x, i) * sin (x) / k; k * = (i ++ + 1);

// пока i <n

} While (i <n)

 

Общая схема и развернутые схемы программ оператору цикла do — while

изображены на рис.3.

 

 

 

 

   

 

 
   

 

 
   

 

 

 

 

 

а) б)

Рисунок 3 — Схемы программ оператора цикла do-while

На рисунке 3а) изображена общая схема программы оператора цикла while, схему программы на рисунке 3б) можно интерпретировать как развернутую схему программы оператора for.

 

оператор break

 

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

пример:

 

S = 0;

// ненулевое значение считается истиной,

// поэтому данный цикл является бесконечным while (1)

{

printf ( «Введите очередной номер (ноль — завершение): ‘); scanf ( «% i», & num)

// если введено ноль — прервать цикл if (!num) break;

S + = num;

}

printf ( «Сумма введенных чисел равна% i», S);

 

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

 

S = 0;

do {

printf ( «Введите очередной номер (ноль — завершение): ‘); scanf ( «% i», & num)

S + = num;

} While (num)

printf ( «Сумма введенных чисел равна% i», S);

 

оператор continue

 

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

пример:

S = 0;

for (int i = 0; i <10; i ++)

{

printf ( «Введите% i-е число:» i) scanf ( «% i», & num)

// если введено отрицательное число —

// перейти к следующему шагу цикла if (num <0) continue;

S + = num;

}

printf ( «Сумма введенных чисел равна% i», S);

 

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

 

S = 0;

for (int i = 0; i <10; i ++)

{

printf ( «Введите% i-е число:» i) scanf ( «% i», & num)

if (num> = 0) S + = num;

}

printf ( «Сумма введенных чисел равна% i», S);

 

Порядок исполнения и отчетности

1. Создать программу на языке С согласно варианту использовав среда программирования Dev-C ++ 4.0.

2. Откомпилировать и отладить программу.

3. Разработать набор тестов и проверить работу программы на них.

4. Ответить на контрольные вопросы.

5. К каждой программы составить схему программы.

6. сделать выводы.

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

варианты заданий

 

Вариант 0.

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

 

Вариант 1.

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

 

Вариант 2.

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

*

***

******

***

*

 

Вариант 3.

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

Вариант 4.

Написать программу, которая выводит таблицу значений функции y = -2,4x 2 + 5x-3 в диапазоне от -2 до +2 с шагом 0,5.

 

Вариант 5.

Написать программу, которая вычисляет сумму первых членов ряда: 1 + 1/2 + 1/3 + 1/4 + …Количество добавленных членов ряда задается во время работы программы.

 

Вариант 6.

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

 

Вариант 7.

Написать программу, которая вычисляет число «Пи» с заданной пользователем точностью. Для вычисления числа «Пи» нужно воспользоваться частичной суммой ряда 4-4 / 3 + 4 / 5-4 / 7 + 4 / 9-4 / 11 + …. Точность вычисления определяется количеством членов ряда.

 

Вариант 8.

Написать программу проверки знания таблицы умножения.  Программа должна вывести 10 примеров и выставить оценку: за 10 правильных ответов — «отлично», за 9 и 8 — «хорошо», 7 и 6 — «удовлетворительно», за 6 и менее — «не удовлетворительно».

 

Вариант 9.

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

 

итог

После выполнения лабораторной работы студент должен уметь:

1. Использовать логические операции для написания программ с разветвлением вычислительных процессов на языке программирования С.

2. Создавать программы с циклическими вычислительными процессами используя операторы цикла for, while, do while на языке программирования С.

контрольные вопросы

1. Что называется циклом ?

2. Для чего нужен счетчик цикла ?

3. Общий формат оператора for ?

4. Как выполняется работа оператора while ?

5. Какую роль выполняет оператор do while ?

6. Какая разница между while и do while ?

7. Как выполняется работа оператора break ?

8. Как выполняется работа оператора continue ?

9. Как называются такие логические операции как &&, ||,! ?10.Общий формат оператора while?11.Общий формат оператора do while.

12.Каким образом используются логические операции такие как &&, ||,! в операторах for, do while, while.

 

контрольные упражнения

 

1. Найти ошибку в каждом из следующих фрагментов кода:

a. Вывод в цикле на экран значений счетчика: for ( x = 100, x > = 1, x ++ )

printf ( «% d \ n», x);

 

b. Следующий код должен выводить, является ли данное целое число парным или нечетным:

swich (value% 2) {

case 0: printf ( «Even integer \ n»); case 1: printf ( «Odd integer \ n»);

}

 

c. Следующий код должен выводить нечетным целое число от 999 до 1:

for ( x = 999; x> = 1, x + = 2 ) printf ( «% D \ n», x ) ;

d. Следующий код должен добавлять целые числа от 100 до 150: for ( x = 100; x <= 150; x ++ )

total + = x;

 

2. Напишите операторы for, которые выводят следующие последовательности значений: a.1, 2, 3, 4, 5, 6, 7

b.  3, 8, 13, 18, 23

c.  20, 14, 8, 2, 4, -10

d.  19, 27, 35, 43, 51

3. Дано следующее определение: int k;

При каких исходных значениях k приведенный ниже цикл будет выполняться бесконечно:

do

{

k ++;

} While (k> -5)

возможны варианты ответов : При k <= …, или при k> = …., или таких k НЕ существует.

 

a. int k;

При каких исходных значениях к приведен ниже цикл будет выполняться бесконечно:

while (k <12);

 

возможны варианты ответов : При k <= …, или при k> = …., или таких k НЕ существует

 

4. Сколько раз будет выполнено тело приведенного ниже цикла ? for ( int k = 4; k <17; k + = 3 )

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

5. пусть данные переменные: int k, n ;

Укажите, что напечатает следующий фрагмент программы (ниже знак ^ означает пробел ):

printf ( «\ N% 3s \ n » «-» ) for ( k = 5, k > 5, k— )

{

n = 6 — k; printf ( «% I ^^% d ^% 2s ^^», k, n «-«)

}

6. пусть данные переменные:

int k, n;

Укажите, что напечатает следующий фрагмент программы (ниже знак ^ означает пробел ):

 

printf ( «\ n% -3.2s \ n», «*****») for (k = 5, k> 5, k—)

{

n = 6 — k; printf ( «% I ^^% 0.4d ^% 2s ^^», k, n «-«)

}

 

7. Сколько раз будет выполнено тело приведенного ниже цикла.

int c = 3;

for (int k = 4; k <17; k + = 3, c + = 2);

Какое значение будет иметь сменные с после выхода из цикла?

8. Изобразить фрагмент схемы программы, отвечающий вправе 1.b.

9. Изобразить фрагмент схемы программы, отвечающий вправе 1.c.

10. Изобразить фрагмент схемы программы, отвечающий вправе 2.a.

11. Изобразить фрагмент схемы программы, отвечающий вправе 2.d.

12. Изобразить фрагмент схемы программы, отвечающий вправе 2.e.

Лабораторная работа №5. одномерные массивы

Цель и задачи:

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

 

Теоретические сведения и методические указания

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

Свойства массивов:

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

 

 

Рисунок 1 — Иллюстрация принципа расположения массива в памяти

Объявления и инициализация массивов

Объявления массивов в общем виде осуществляется по следующим форматом:

 

<Тип данных> <название> [размерность];

 

примеры:

 

/ * Массив чисел типа int на 150 элементов * / int Balls [150];

/ * Массив чисел типа float на 8 элементов * / float Value [8];

Инициализация массива при объявлении может быть выполнена с помощью так называемого списка инициализаторов, например

 

int X [5] = {2, 1, 8, 100, 45};

 

 

Обработка массивов

Обычно обработка массивов осуществляется в циклах; при этом верхняя и / или нижняя граница цикла определенным образом «привязывается» к количеству элементов в массиве.

 

Порядок исполнения и отчетности

1. Создать программу на языке С согласно варианту использовав среда программирования Dev-C ++ 4.0

объявить одномерный статический массив из десяти элементов типа int;

заполнить массив с клавиатуры;

результаты вычислений на экран.

2. Откомпилировать и отладить программу.

3. Разработать набор тестов и проверить работу программы на них.

4. Ответить на контрольные вопросы.

5. сделать выводы.

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

варианты заданий

 

Вариант 0.

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

1) минимальный по модулю элемент массива;

2) сумму модулей элементов массива, расположенных после первого элемента равна нулю.

 

Вариант 1.

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

1) сумму отрицательных элементов массива;

2) произведение элементов массива, расположенных между максимальным и минимальным элементами.

 

Вариант 2.

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

1) сумму положительных элементов массива;

2) произведение элементов массива, расположенных между максимальным и минимальным по модулю элементами.

Вариант 3.

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

1) произведение элементов массива с четными номерами;

2) сумму элементов массива, расположенных между первым и последним нулевыми элементами.

 

Вариант 4.

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

1) сумму элементов массива с нечетными номерами;

2) сумму элементов массива, расположенных между первым и последним отрицательными элементами.

 

Вариант 5.

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

1) максимальный элемент массива;

2) сумму элементов массива, расположенных до последнего положительного элемента .

 

Вариант 6.

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

1) минимальный элемент массива;

2) сумму элементов массива, расположенных между первым и последним положительными элементами.

 

Вариант 7.

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

1) номер максимального элемента массива;

2) произведение элементов массива, расположенных между первым и вторым нулевыми элементами.

 

Вариант 8.

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

1) номер минимального элемента массива;

2) сумму элементов массива, расположенных между первым и вторым отрицательными элементами.

 

Вариант 9.

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

1) максимальный по модулю элемент массива;

2) сумму элементов массива, расположенных между первым и вторым положительными элементами.

итог

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

контрольные вопросы

1. Что такое массив?

2. Что такое одномерный массив?

3. Какие правила оформления массивов?

4. Для чего используется массив типа char?

5. Какими способами можно инициализировать элементы массивов?

6. Когда и для чего используется ключевое слово static?

7. Как обратиться к элементу массива ?

8. Как с помощью функции scanf ввести с клавиатуры массив символов ?

9. Как инициализировать массив при откровении ?

10.В чем разница между ссылкой на седьмой элемент массива и на элемент массива номер семь?

контрольные упражнения

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

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

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

4. Написать программу, которая вычисляет сумму положительных элементов массива.

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

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

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

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

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

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

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

12. Написать программу, которая сжимает массив путем удаления из него всех элементы, модуль которых не превышает 1; элементы, которые освободились в конце вектора, заполнить нулями.

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

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

15. Написать программу, которая сжать массив путем удаления из него всех элементы, модуль которых находится в интервале [a, b]; элементы, освободившихся в конце вектора, заполнить нулями.

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

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

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

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

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

21. Написать схему программы из упражнения № 1.

22. Написать схему программы из упражнения № 4.

23. Написать схему программы из упражнения № 10.

24. Написать схему программы из упражнения № 14.

25. Написать схему программы из упражнения № 16.

26. Написать схему программы из упражнения № 19.

27. Задано массив: double mas [50]; Написать фрагмент программы, которая напечатает с новой ленты значения элементов массива по четыре элемента в ленте и по двадцать позиций на элемент.Значения, напечатаются прижимать к правой границе поля вывода, а в дробной части печатать 6 цифр.Решить задачу с помощью цикла do..while.

Лабораторная работа №6. Алгоритмы поиска и сортировки

 

Цель и задачи:

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

Теоретические сведения и методические указания

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

 

Оценка алгоритмов сортировки

Алгоритмы сортировки оцениваются по скорости выполнения и эффективности использования памяти:

  • Час- основной параметр, характеризующий быстродействие алгоритма. Называется также вычислительной сложностью. Для упорядочения важные худшая, средняя и лучшая поведение алгоритма в терминах мощности входного множества А. Если на вход алгоритма подается множество A, то обозначим n = | A |.   Для типичного алгоритма хорошая

поведение — это

(n log n), а плохое поведение — это

(n 2).идеальная

поведение для упорядочения — (n).

  • Память — ряд алгоритмов требует выделения дополнительной памяти под временное хранение данных.   Как правило, эти алгоритмы требуют

(log n) памяти.При оценке не учитывается место, которое занимает исходный массив и независящие от входной последовательности затраты, например, на

хранения кода программы (так как все это потребляет (1)).алгоритмы

сортировка, не потребляют дополнительной памяти, относят к сортировок на месте.

 

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

массивов. Сложность алгоритма — (n 2).

Схема программы пузырьковой сортировки представлена ​​на рис. 1.

 

Рисунок 1 — Схема программы пузырьковой сортировки

Сортировка выбором — алгоритм сортировки, который относится к неустойчивым алгоритмов сортировки.на массиве с n элементов есть время

выполнение в лучшем, среднем и худшем случаях — (n 2 ) , Предполагая что сравнение выполняются за постоянный время.

Схема программы сортировки выбором представлена ​​на рис. 2.

 

 

 

 

 

 

 

 

 

 

 

 

 

 
   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рисунок 2 — Схема программы сортировки выбором

Сортировка вставками — простой алгоритм сортировки.Хотя этот алгоритм сортировки в эффективности более сложным у него есть ряд преимуществ:

  • эффективен на небольших наборах данных, на наборах до десятков элементов может оказаться лучшим;
  • эффективен на наборах данных уже частично отсортированы;
  • это устойчивый алгоритм сортировки (не меняет порядок элементов уже отсортированы)
  • может сортировать список по мере получения;
  • использует (1) временной памяти включая стек;
  • минусом является высокая сложность алгоритма — (n 2 ) .

Схема программы сортировки вставками представлена ​​на рис. 3.

 

 

Рисунок 3 — Схема программы сортировки вставками

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

Бинарный поиск — классический алгоритм поиска элемента в отсортированном массиве.

Пусть дано массив A, переменные Lb и Rb содержат, соответственно, левую и правую границы массива (индексы), в котором находится нужный нам элемент, в переменной key сохраняется искомое число.Работа алгоритма начинается с исследования среднего элемента массива, индекс которого исчисляется как M = (Lb + Rb) / 2. Если искомое значение key меньше среднего элемента A [M], осуществляется переход к поиску в правой половине массива, где все элементы меньше только проверенного.Другими словами, значением Lb становится (M-1) и на следующей итерации осуществляется поиск только в правой половине массива.Таким образом, в результате каждой проверки вдвое сужается область поиска.

Схема программы бинарного поиска представлена ​​на рис. 4.

 

 

 

 

 

 

 

 

 

 

 

 

 
   

 

 

 

 

 

 

 

 

 
   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рисунок 4 — Схема программы бинарного поиска

Порядок исполнения и отчетности

1. Создать программу на языке С согласно варианту использовав среда программирования Dev-C ++ 4.0

a. объявить одномерный статический массив из десяти элементов типа int;

b. заполнить массив с клавиатуры;

c. отсортировать массив и найти введено с клавиатуры число указанными в вариантах алгоритмами;

d. вывести на экран отсортированный массив;

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

f. вывести на экран сообщение о наличии или отсутствии чисел, удовлетворяющих условию поиска (для бинарного поиска) .

2. Откомпилировать и отладить программу.

3. Разработать набор тестов и проверить работу программы на них.

4. Ответить на контрольные вопросы.

5. сделать выводы.

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

варианты заданий

 

Вариант 1.

Отсортировать массив по росту.              Алгоритм сортировки —

«Пузырьковый».  Метод поиска — бинарный.

 

Вариант 2.

Отсортировать массив по убыванию.              Алгоритм сортировки —

«Пузырьковый».  Метод поиска — бинарный.

 

Вариант 3.

Отсортировать массив по росту. Алгоритм сортировки — «вставкой». Метод поиска — линейный.

 

Вариант 4.

Отсортировать массив по убыванию. Алгоритм сортировки — «выбором». Метод поиска — линейный.

 

Вариант 5.

Отсортировать массив по росту.              Алгоритм сортировки —

«Пузырьковый». Метод поиска — линейный.

 

Вариант 6.

Отсортировать массив по убыванию. Алгоритм сортировки — «вставкой». Метод поиска — бинарный.

 

Вариант 7.

Отсортировать массив по росту. Алгоритм сортировки — «выбором». Метод поиска — бинарный.

Вариант 8.

Отсортировать массив по убыванию. Алгоритм сортировки — «выбором». Метод поиска — бинарный.

 

Вариант 9.

Отсортировать массив по убыванию.      Алгоритм сортировки —

«Пузырьковый».

итог

После выполнения лабораторной работы студент должен уметь создавать программы, которые реализуют алгоритмы сортировки (пузырьковый, выбором, вставкой) и поиска (линейный, бинарный) на языке программирования С.

контрольные вопросы

1. Что такое сортировка массивов?

2. Виды сортировки Вы знаете?

3. Что такое внешнее сортировка?

4. Что такое внутреннее сортировка?

5. Что такое пузырьковая сортировка?

6. Использование сортировки по убыванию и алгоритмы их развязку?

7. Использование сортировки по возрастанию и алгоритмы их развязку?

8. Что такое сортировка методом выбора?

9. Что такое линейный Поиск?

10. Что такое бинарный Поиск?

контрольные упражнения

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

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

Лабораторная работа №7. многомерные массивы

 

Цель и задачи:

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

Теоретические сведения и методические указания

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

Рисунок 1 — Иллюстрация принципа хранения двухмерную массива в памяти ПК

 

Объявления и инициализация массивов

Объявления массивов в общем виде осуществляется по следующим форматом:

 

<Тип данных> <название> [размерность 1] [размерность 2] … [размерность N];

 

примеры:

/ * Матрица чисел типа double (5 строк и 10 колонок) * / double MatrixA [5] [10];

/ * Трехмерный массив чисел типа char (7 на 7 в 10, всего 490 чисел) * /

char Cube [7] [7] [10];

 

Инициализация массива при объявлении может быть выполнена с помощью так называемого списка инициализаторов, например

 

float C [3] [2] = {{0.1, 0.2}, {0.7, 1.3}, {1.9, -0.4}};

 

Обработка массивов

Обычно обработка массивов осуществляется в циклах; при этом верхняя и / или нижняя граница цикла определенным образом «привязывается» к количеству элементов в массиве. Рассмотрим, например, фрагмент программы, в котором исчисляется сумма элементов квадратной матрицы x размером 10 × 10, расположенных над главной диагональю:

 

int x [10] [10];

// если размер матрицы изменится, в следующем цикле

// необходимо будет изменить верхнюю границу for (i = 0; i <9; i ++)

{

// если размер матрицы изменится, в следующем цикле

// необходимо будет изменить верхнюю границу for (j = i + 1; j <10; j ++)

{

S + = x [i] [j];

}

}

 

В данном примере внешний цикл меняет номер строки — i — от первого до предпоследнего (в последней строке над главной диагональю не расположен ни одного элемента), а внутренний цикл меняет номер столбца — j — от (i + 1) -го до последнего.Если размер матрицы при решении конкретной задачи станет другим, изменения следует внести в каждый цикл, которых в программе может быть много (как минимум два цикла для заполнения матрицы, два цикла — для вывода на дисплей), что неудобно. Если же размер матрицы будет задан проименованы константой, достаточно будет изменить значение только этой константы:

const int n = 20; // изменения вносятся только здесь int x [n] [n];

// параметры следующего цикла

// не зависящие от размера матрицы for (i = 0; i <n — 1; i ++)

{

// параметры следующего цикла

// не зависящие от размера матрицы for (j = i + 1; j <n; j ++)

{

S + = x [i] [j];

}

}

Порядок исполнения и отчетности

1. Создать программу на языке С согласно варианту использовав среда программирования Dev-C ++ 4.0

2. объявить двумерный массив array [5] [5] типа int;

3. заполнить массив с клавиатуры;

4. результаты вычислений на экран.

5. Откомпилировать и отладить программу.

6. Разработать набор тестов и проверить работу программы на них.

7. изобразить схему программы.

8. Ответить на контрольные вопросы.

9. сделать выводы.

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

варианты заданий

 

Вариант 0.

Написать программу, которая должна выполнять следующие действия:

1. Подносить к квадрату все отрицательные элементы массива и добывать корень из всех положительных элементов.

2. Вычислять сумму обратной диагонали массива.

 

Вариант 1.

Написать программу, которая должна выполнять следующие действия:

1. Вычислять сумму положительных и отрицательных элементов массива.

2. Заменять нулями отрицательные элементы массива.

 

Вариант 2.

Написать программу, которая должна выполнять следующие действия:

1. Считать количество элементов массива, которые находятся в заданном с клавиатуры диапазоне. Если таких элементов больше половины заменить их единицами.

2. Вычислять количество четных чисел массива.

 

Вариант 3.

Написать программу, которая должна выполнять следующие действия:

1. Осуществлять сортировку элементов главной диагонали массива по росту.

2. Вычислять количество нечетных чисел массива.

 

Вариант 4.

Написать программу, которая должна выполнять следующие действия:

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

2. Все нечетные элементы массива заменять нулями.

 

Вариант 5.

Написать программу, которая должна выполнять следующие действия:

1. Вычислять сумму элементов, находящихся выше побочной диагонали массива.

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

 

Вариант 6.

Написать программу, которая должна выполнять следующие действия:

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

2. Побочное диагональ массива заполнять нулями.

 

Вариант 7.

Написать программу, которая должна выполнять следующие действия:

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

2. Главную диагональ массива заполнять нулями.

 

Вариант 8.

Написать программу, которая должна выполнять следующие действия:

1. Все отрицательные элементы массива заменять заданным с клавиатуры числом.

2. Вычислять сумму каждой ленты массива.

 

Вариант 9.

Написать программу, которая должна выполнять следующие действия:

1. Менять местами две ленты, в которых находятся минимальный и максимальные элементы массива.              Если минимальный и максимальный

элементы находятся в одной ленте выводить на экран соответствующее сообщение.

2. Вычислять среднее арифметическое элементов массива.

 

итог

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

контрольные вопросы

1. Что такое многомерный массив ?

2. Для чего используются многомерные массивы ?

3. Сколько индексов может иметь многомерный массив ?

4. Как инициализируется многомерный массив ?

5. Как инициализировать двумерный массив при откровении ?

контрольные упражнения

1. Заполнить двумерный массив размером 5 на 5 единицами в шахматном порядке?

2. Заполнить двумерный массив размером 5 на 5 единицами по главной диагонали?

3. Заполнить двумерный массив размером 5 на 5 единицами по побочной диагонали?

Лабораторная работа №8. функции

 

Цель и задачи:

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

Теоретические сведения и методические указания

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

<Имя типа> <название функции> (параметр1, параметр2 …) {тело функции}

 

Пример программы с функцией, которая осуществляет сложение двух цифр:

#include <stdio.h>

 

int addition (int a, int b)

{

int r; r = a + b; return (r)

}

int main ()

{

int z;

z = addition (5,3)

printf ( «Функция возвращает значение% и» z) return 0;

}

 

Функция main начинается с объявления переменной z типа int.Сразу после этого осуществляется вызов функции addition.Сходство между структурой вызова функции и объявлением самой функции изображена на рис. 1:

 

Рис 1.

В функции main осуществляется вызов функции addition, ей передаются через параметры два значения: 5 и 3, соответствуют параметрам int а и int b в объявлении функции addition.

В точке, в которой функция addition вызывается из main управление передается функции addition.Значение обоих аргументов (5 и 3) будут скопированы в локальные переменные int а и int b в пределах функции addition.

Функция addition объявляет локальную переменные int r, выполняет выражение r = а + b, в результате чего в r будет присвоено значение 8, так как значения параметров a и b, были 5 и 3 соответственно.

Следующая строка кода: return (r)

завершает функцию addition, и возвращает значение обратно в функцию main.Далее программа выполняется с того же места, на котором она была прервана вызовом функции addition.Значение возвращаемого из функции является значением функции, вызывается (рис 2.). Чтобы объяснить это иначе, можно себе представить, что вызов функции addition (5,3) буквально заменяется значением я, которое она возвращает (8).

 

Рис. 2

Следующая строка кода выводит на экран значение переменной z: printf ( «Функция возвращает значение% и» z)

Порядок исполнения и отчетности

1. Написать программу, которая демонстрирует работу функции заданной согласно варианту использовав среда программирования Dev-C ++ 4.0.

2. Откомпилировать и отладить программу.

3. Разработать набор тестов и проверить работу программы на них.

4. Ответить на контрольные вопросы.

5. сделать выводы.

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

варианты заданий

 

Вариант 0.

Написать рекурсивную функцию power (base, exponent), которая возвращает значение base exponent.

Например, power (3, 4) = 3 * 3 * 3 * 3. Пусть exponent является целым, большим или

равным 1.

Подсказка: шаг рекурсии мог бы использовать соотношение base exponent = base * base exponent, а завершающей условием будет случай, когда значение exponent станет равным 1.

 

Вариант 1.

Как известно, свойство последовательности чисел Фибоначчи: 0, 1, 1, 2, 3, 5, 8, 13, 21, … состоит в том, что каждое следующее число является суммой двух предыдущих.

Написать Нерекурсивные функцию fibonacci (n), что вычисляет n-никак число Фибоначчи.

 

Вариант 2.

Самый общий делитель (НОД) двух целых чисел является самым большим целым числом, на которое делится каждое из двух чисел.

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

 

Вариант 3.

Самый общий делитель целых чисел х и у является крупнейшим целым числом, на которое делятся и х и у.

Написать рекурсивную функцию gcd, что возвращает наибольший общий делитель х и у и программу, которая использует эту функцию.Рекурсивное определение функции gcd выглядит следующим образом: если в равен 0, то gcd (x, y) является х, иначе gcd (x, y) является gcd (y, х% у), где% — операция деления по модулю.

 

вариант 4

Целое число называют простым, если оно делится только на 1 и на само себя. Например, 2, 3, 5 и 7 являются простыми, а 4, 6, 8 и 9 — нет.

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

 

Вариант 5.

Целое число называют совершенным числом, если сумма его делителей, включая 1 (но не само число), равна этому числу. Например, 6 является совершенным числом, поскольку 6 = 1 + 2 + 3.

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

 

Вариант 6.

Написать функцию, которая получает время в качестве трех целых аргументов (часы, минуты и секунды) и возвращает число секунд с момента, когда часы «пробил 12».

 

Вариант 7.

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

 

Вариант 8.

Написать функцию gualityPoints, которая вводит средний балл студента и возвращает 4, если средний балл студента составляет 90-100, 3, если 80-89, 2,

если 70-79, 1, если 60-69, и 0, если средний балл ниже 60.

 

Вариант 9.

Написать программу, которая моделирует подбрасывание монеты. Для каждого подбрасывания монеты программа должна печатать слова «Heads» или «Tails» (орел или решка). Пусть программа подбросит монету 100 раз и сочти число выпадений для каждой стороны монеты. Программа должна вызывать отдельную функцию flip, не получает никаких аргументов и возвращает 0 для решки и 1 для орла.

 

 

итог

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

1. Что такое функция ?

2. Где и как вызываются функции ?

3. Что является аргументом функции ?

4. Написать общий формат нахождения функции ?

5. Что может сделать вызвана функция ?

6. Что такое прототип функции ?

7. Для чего предназначены компиляторы в функции ?

8. Где находятся прототипы функций rand и srand, и что это такое ?

контрольные упражнения

1. Найдите ошибку в фрагменте программы:

a. int g (void)

{

printf ( «Inside function g \ n»);

{

printf ( «Inside function h \ n»);

}

}

b. int sum (int x, int y)

{

int result; result = x + y;

 

c. void f ( float a ) ;

{

float a;

printf ( «% F», a) }

 

2. Напишите функцию distance, которая вычисляет расстояние между двумя точками с координатами (x1, y1) и (x2, y2).Все числа и значения возвращаемые должны иметь тип float.

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

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

5. Подсчитать в одномерном массиве целого типа размером 100 элементов количество нулевых значений.

6. Написать функцию с двумя параметрами логического типа, возвращает значение в соответствии по следующей таблице истинности (таблица 1).

Таблица 1

параметры возвращен результат
первый второй
False False False
False True False
True False True
True True False

параметры и результаты — целого типа: false соответствует нулю и true — нулевым значением.

 

Лабораторная работа №10. указатели

Цель и задачи:

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

Теоретические сведения и методические указания

Указатель — это переменная, значением которой является адрес другой переменной.Так как указатель может ссылаться на переменные различных типов, с указателем в языке Си связывается тип того объекта, на который он ссылается.Для описания указателей используется операция косвенной адресации *.Например, указатель целого типа uk описывается так:

int * uk;

Унарная операция &, примененная к некоторой переменной, показывает, что нам нужен адрес этой переменной, а не ее текущее значение. Если переменная uk объявлена как указатель, то оператор присваивания uk = & x означает: «взять адрес переменной x и присвоить его значение переменной-указателю uk».

Унарная операция * применена к указателю, обеспечивает доступ к содержимому ячейки памяти, на которую ссылается указатель. Например, * uk можно описать словами как «то, что содержится по адресу, на который указывает uk».Указатели могут использоваться в выражениях. Если. например, переменная uk указывает на целое x, то * uk может во всех случаях использоваться вместо x; так, * uk 1 увеличивает x на единицу, а * uk = 0 равносильно x = 0.Два оператора присваивания uk = & x; y = * uk; выполняет то же самое, что и один оператор y = x.Польза от применения указателей в таких ситуациях, мягко говоря, невелика.

Наиболее полно их преимущества при обработке массивов и, в частности, символьных строк.Указатели и массивы тесно связаны друг с другом. Прежде чем рассмотреть эту связь подробно, отметим, что если uk — некоторый указатель, то uk ++ увеличивает его значение и он теперь указывает на следующий, соседний объект.Значение uk используется в выражении, а затем увеличивается.Аналогично определяются операции uk—, ++ uk, —uk.В общем случае указатель uk можно добавлять до целого числа i.Оператор uk + = i передвигает ссылки на i элементов относительно текущего значения.Эти конструкции подчиняются правилам адресной арифметики.

А теперь вернемся к массивам. Пусть имеется описание int a [5].Оно определяет массив размером 5 элементов, то есть пять последовательных расположенных ячеек памяти a [0], a [1], a [2], a [3], a [4].Адрес i-го элемента массива равна сумме адреса начального элемента массива и смещение этого элемента на i единиц от начала массива.Это достигается индексированием: a [i] — i-й элемент массива.Но доступ к любому элементу массива может быть выполнен и с помощью указателей, причем, более эффективно. если uk — указатель на целое, описан как int * uk, то uk после выполнения

операции uk = & a [0] содержит адрес a [0], а uk + i указывает на i-й элемент массива.Таким образом, uk + i является адресом a [i] ячейки массива, а * (uk + i) — содержанием i-го элемента (операции * и & более приоритетными, чем арифметические операции).Поскольку имя массива в программе отождествляется с адресом его первого элемента, то выражение uk = & a [0] эквивалентно следующем: uk = a.Поэтому значение a [i] можно записать как * (a + i).Применив к этим двум элементов операцию взятия адреса, получим, что & a [i] и a + i идентичны.

Порядок исполнения и отчетности

1. Создать программу на языке С согласно варианту использовав среда программирования Dev-C ++ 4.0

a. для решения задачи использовать динамический массив;

b. массив задать с клавиатуры;

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

2. Откомпилировать и отладить программу.

3. Разработать набор тестов и проверить работу программы на них.

4. Ответить на контрольные вопросы.

5. сделать выводы.

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

варианты заданий

 

Вариант 0.

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

 

Вариант 1.

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

 

Вариант 2.

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

 

Вариант 3.

Написать программу, которая преобразует массив таким образом, чтобы сначала располагались элементы, которые отличаются от максимального не больше чем на 20%, а затем все остальные.

Вариант 4.

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

 

Вариант 5.

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

 

Вариант 6.

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

 

Вариант 7.

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

 

Вариант 8.

Написать программу, которая удаляет все элементы, модуль которых находится в интервале [a, b]; элементы, которые высвободились в конце массива заполнить нулями.

 

Вариант 9.

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

 

итог

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

контрольные вопросы

1. Что такое указатель ?

2. Назовите три основных значения указателя ?

3. Что должно быть операндом операции ?

4. Что такое операция * ?

5. Назовите четыре способа передачи указателя в функцию ?

6. Операции могут выполняться вместе с указателями ?

7. Для чего предназначен указатель типа void * ?

8. Что такое имя массива ?

контрольные упражнения

1) Что напечатает следующая программа?

 

# Include <stdio.h>

int Array [ ] = { 0, 4, 5, 2, 3 }; int main ( void)

{

int Index, * Pointer;

for ( Index = 0; Index <= 4, Index + = 2 ) printf ( » % 3d «, * (Array + Index—) )

printf ( «\ n»); Pointer = Array + 1,

for (Index = 0; Index <= 2;)

printf ( » % 3d «, Pointer [ ++ Index ] ) printf ( «\ N» )

return 0;

}

 

2) Что напечатает следующая программа?

 

# Include <stdio.h>

int Array [ ] = { 1, 2, -7, 4, 3 };

int main (void)

{

int Index, * Pointer;

for ( Index = 0; Index <= 4, Index + = 2 ) printf ( » % 3d «, Array [ Index] )

printf ( «\ n»); Pointer = Array + 1,

for (Index = 0; Index <= 2; ++ Index) printf ( » % 3d «, Pointer [ ++ Index ] )

printf ( «\ N» ) return 0;

}

 

3) Что напечатает следующая программа?

 

# Include <stdio.h>

int Array [ ] = { 1, 4, 7, 2, 3 }; int main ( void)

{

int Index, * Pointer;

for ( Index = 1, Index <= 4, Index + = 1 ) printf ( » % 3d «, Array [ ++ Index] )

printf ( «\ n»); Pointer = Array;

for (Index = 0; Index <= 2; ++ Index) printf ( » % 3d «, Pointer [ Index ++ ] )

printf ( «\ N» ) return 0;

}

 

4) Что напечатает следующая программа?

 

# Include <stdio.h>

int Array [ ] = { 1, 4, 5, 12 3};

int main (void)

{

int Index, * Pointer;

for (Index = 1; Index <= 4; Index + = 1) printf ( «% 3d», * (Array + Index ++))

printf ( «\ n»); Pointer = Array + 1,

for (Index = 0; Index <= 2; ++ Index) printf ( » % 3d «, Pointer [ ++ Index ] )

printf ( «\ N» ) return 0;

}

 

5) Что напечатает следующая программа?

 

# Include <stdio.h>

int Array [ ] = { 0, 4, 5, 2, 3 }; int main (void)

{

int Index, * Pointer;

for ( Index = 0; Index <= 4, Index + = 2 ) printf ( » % 3d «, * (Array + Index ++) )

printf ( «\ n»); Pointer = Array + 1,

for (Index = 0; Index <= 3; Index ++) printf ( » % 3d «, Pointer [ ++ Index ] )

printf ( «\ N» ) return 0;

}

Лабораторная работа №11.  Работа с файлами

Цель и задачи:

Научиться создавать и отлаживать программы, в которых осуществляется работа с файлами (чтение / запись) на языке программирования С.

Теоретические сведения и методические указания

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

Использование файлов целесообразно в случае:

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

В языке С используются такие функции библиотеки stdio.h для работы с текстовыми файлами: fopen, fscanf, fprintf, fclose.

Для работы с текстовыми файлами сначала нужно объявить файловую переменную, которая является указателем на файл:

FILE * <файловая переменная>;

 

Например, объявление файловой переменной f: FILE * f;

 

Затем нужно открыть файл и связать его с файловой переменной использовав функцию fopen:

файловая переменная = fopen ( «путь к файлу», «режим доступа»);

 

Например, открываем файл in.txt для считывания: f = fopen ( «D: \\ in.txt», «r»);

 

Функция fopen возвращает указатель на структуру типа FILE при успешном открытии файла, и NULL в противном случае

В таблице 1 указаны режимы доступа, которые применяются в функции fopen.

Таблица 1

режим доступа описание
r Файл открывается для чтения
r + Файл открывается для чтения и записи
w Открывается пустой файл для записи
w + Открывается пустой файл для чтения и записи
a Файл открывается для дозаписи в конец файла

 

Режим открытие может также содержать символы t (текстовый файл) и b (двоичный файл), указывая на тип файла, который открывается: rb, wb, ab, rt, at, rb +, wb +, ab + и тому подобное.

Для проверки подлинности или правильности открытия файла можно использовать такой фрагмент кода:

 

if ((fopen ( «D: \\ in.txt», «r»)) == NULL)

 

{Printf ( «Ошибка при открытии файла»); return 0;

}

 

Пример открытия файла out.txt для записи: f2 = fopen ( «D: \\ out.txt», «w»);

 

Общий прототип функции считывания из файла fscanf:

 

fscanf (файловая переменная, лента форматирования, список адресов переменных)

 

 

Пример, считывание из файла данных в переменные a и b типа int: fscanf (f, «% i% i», & a, & b);

 

Общий прототип функции записи в файл fprintf:

 

fprintf (файловая переменная, лента форматирования, список переменных)

 

Пример записи в файл значений переменных a и b типа int: fscanf (f2, ‘% i% i «, a, b)

 

Общий прототип функции закрытия файла fclose: fclose (файловая переменная)

Пример, закрытие файла: flose ();

 

Порядок исполнения и отчетности

1. Создать программу на языке С согласно варианту использовав среда программирования Dev-C ++ 4.0

2. для хранения данных о планшетных сканеры описать структуру следующего вид:

i. struct scan_иnfo {

ii. char model [25]; // наименование модели

iii. иnt prиce; // цена

iv. double x_sиze; // горизонтальный размер области сканирования

v. double y_sиze; // вертикальный размер области сканирования

vi. иnt optr; // оптический разрешение

vii. иnt grey; // число градаций серого

viii. };

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

4. Откомпилировать и отладить программу.

5. Разработать набор тестов и проверить работу программы на них.

6. Ответить на контрольные вопросы.

7. сделать выводы.

8. Отчет по лабораторной работе должен состоять из титульного листа, листингов программ, заключений по работе.

варианты заданий

 

Вариант 1.

1. Написать функцию, записывает в текстовый файл данные о сканере с приведенной структуры.

2. Написать функцию, извлекает из этого файла данные о сканере в структуру типа scan_иnfo. Обязательный параметр — номер необходимой записи. Функция должна возвращать нулевое значение, если чтение прошло успешно, и -1 в противном случае.

3. Привести пример программы, создающей файл с данными о сканерах, (данные вводятся с клавиатуры) — 6-8 записей, и выводит на дисплей данные о запрашиваемый запись.

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

 

Вариант 2.

1. Написать функцию, записывает в текстовый файл данные о сканере из приведенной структуры.

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

3. Привести пример программы, создающей файл с данными о сканерах (данные вводятся с клавиатуры) как минимум восьми записей и осуществляя его сортировки.

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

 

Вариант 3.

1. Написать функцию, сортирует записи в описанном выше текстовом файле по наименованию модели сканера.

2. Привести пример программы, создающей файл с данными о сканерах, (данные вводятся с клавиатуры) как минимум восьми записей, и осуществляет его сортировки.

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

 

Вариант 4.

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

2. Написать функцию, вытягивает данные о сканере из описанного выше текстового файла в структуру типа scan иnfо. Обязательный параметр — номер необходимой записи. Функция должна возвращать нулевое значение, если считывания прошло успешно, и -1 в другом случае.

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

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

 

Вариант 5.

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

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

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

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

 

Варианте 6.

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

2. Написать функцию, запрашивает данные о сканере в режиме диалога и замещает запись в текстовом файле по заданному номеру. Обязательный параметр — номер записи, замещается. Функция должна возвращать нулевое значение, если запись прошла успешно, и -1 в другом случае.

3. Привести пример программы, создающей файл с данными о сканерах (данные вводятся с клавиатуры) как минимум восьми записей, и осуществляет вставку новых данных о сканер.

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

 

Вариант 7.

1. Написать функцию, записывает в текстовый файл данные о сканере с приведенной структуры.

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

3. Привести пример программы, создающей файл с данными о сканерах (данные вводятся из текстового файла) — 6-8 записей, и дополняет файл записями о 2-3 сканеры, вводимых с клавиатуры.

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

 

Вариант 8.

1. Написать функцию, записывает в текстовый файл данные о сканере из приведенной структуры.

2. Написать функцию, вводит данные о сканере с клавиатуры в структуру типа scan_иnfo и дописывает в конец файла эти данные.

3. Привести пример программы, создающей файл с данными о сканерах (данные вводятся из текстового файла) — 6-8 записей, и дополняет этот файл 1-2 новыми записями, вводятся с клавиатуры.

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

 

Вариант 9.

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

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

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

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

 

итог

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

контрольные вопросы

1. Что такое файл ?

2. Для чего предназначен файл и его использование ?

3. Что такое символы ?

4. Что такое поле ?

5. Что называется наиболее популярный тип организации записей в файле ?

6. Что называют группой связанных между собой файлов ?

7. Назовите функции языка С используемые для работы с файлами ?

контрольные упражнения

 

1. В файле операционной системы «Test1.in» есть 5 лент, каждая из которых имеет длину сторон прямоугольников (значение длины разделены двумя пробелами ).

написать:

    • определение массива структур для хранения указанных длин сторон прямоугольника, их площадь и периметр;
    • фрагмент программы для чтения длины стороны прямоугольника из файла операционной системы «Test1 .in»;
    • фрагмент программы, которая вычисляет и печатает площади и периметры прямоугольников в файл операционной системы «Test1.out».

 

2. В текстовом файле «Test2 .in» есть информация о квартире, которая имеет следующий вид:

01 Комната 15

…….

05 Кухня 5

 

Каждая лента имеет сведения по одной комнате: первые две позиции — порядковый номер комнаты, третья позиция — «пробел», с поз. 4 начинается название комнаты длиной не более 15 символов, с поз. 21 — метраж комнаты.

написать:

  • определение массива структур для хранения указанных данных и фрагмент программы для чтения данных о квартире с файла «Test2.in»;
  • фрагмент программы для нахождения и печати общего метража данной квартиры в файл «Test2.out»

 

3. Что будет выведено в файл следующим фрагментом программы: float r;

int i = 17;

r = 1.5f * 2.0elf;

fprintf (stdout, «* r =% 5.2e ^% s ^ * i =% — + d \ n *% — 3s \ n», r, «_», i, «*»,)

 

4. Что будет выведено в файл следующим фрагментом программы: float r;

int i = 17; r = 1.5f * 2.0;

fprintf (stdout, «* r =% 5.2f ^% 5s ^ * i =% — + 10d \ n *% — 30s \ n», r, «_», i, «*»,)

Лабораторная работа №12. Обработка символьной информации

Цель и задачи:

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

Теоретические сведения и методические указания

Если в программе нужно работать со строками, их объявляют как массивы символов.В таком массиве для каждого символа строки (правильнее: кода символа) отводится своя ячейка, а последний элемент содержит символ конца строки — «\ 0» (код нуль).

Для хранения кодов символов наиболее хорошо подходит тип данных, в литературе называют символьным: char.

Символьный массив объявляется и инициализируется по схеме, общей для массивов произвольного типа, например:

 

/ * Объявления символьного массива на 50 элементов * / char FirstName [50];

// Массив Greeting1 содержит коды символов ‘H’, ‘e’ … * / char Greeting1 [] = { «H», «e», «l», «l», «o»};

/ * Массив Greeting2 идентичен по содержанию массива Greeting1 потому что код буквы ‘H’

— 72, «e» — 101 … * /

char Greeting2 [] = {72, 101, 108, 108, 111};

 

Для удобства компиляторы С / С ++ позволяют инициализировать символьные массивы не только обычным путем, продемонстрированным в предыдущем примере, но и следующим образом:

 

char StreetName [] = «ул. Метростроительная пятой «;

 

Для массива StreetName компилятор автоматически выделяет память в размере

24 байта (длина инициализуючого строки плюс один байт — символ завершения строки).

При вводе строки с клавиатуры с помощью функции scanf оператор получения адреса — & — не нужен, так как идентификатор массива фактически представляет собой адрес его начала:

 

char FirstName [20];

scanf ( «% s», FirstName)

 

Обработка символьных массивов — строк в целом выполняется аналогично обработке массивов другого типа, однако комплект средств разработки C / C ++ включает заготовочные модуль string.h, в состав которого входят функции,

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

Таблица 1

прототип функции описание
void * memcpy (void * dest, const void

* Src, int n);

Копирование одного массива в другой
char * strcpy (char * dest, const char

* Src)

Копирование одной строки в другой
char * strcat (char * dest, const char

* Src)

Конкатенация (сцепление) двух строк
char * strchr (const char * s, int c) Поиск символа в строке
int strcmp (const char * s1, const char

* S2)

сравнение строк
int strlen (const char s) Вычисления длины строки
char * strlwr (char * s) Преобразование символов строки в маленькие
char * strrev (char * s) Инверсия строки (перестановка всех символов в обратном порядке)
char * strset (char * s, int ch) Заполнение строки заданным символом
char strstr (const char * s1, const char

* S2)

Поиск одной строки в другом
char * strupr (char * s) Преобразование символов строки в большие

 

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

 

Порядок исполнения и отчетности

1. Создать программу на языке С согласно варианту использовав среда программирования Dev-C ++ 4.0

2. с помощью текстового редактора создать файл, содержащий текст, длина которого не превышает 1000 символов (длина строки текста не должна превышать 70 символов)

3. имя файла должно иметь расширение dat.

4. Откомпилировать и отладить программу.

5. Разработать набор тестов и проверить работу программы на них.

6. Ответить на контрольные вопросы.

7. сделать выводы.

8. Отчет по лабораторной работе должен состоять из титульного листа, листингов программ, заключений по работе.

варианты заданий

 

Вариант 0.

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

 

Вариант 1.

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

 

Вариант 2.

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

 

Вариант 3.

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

 

Вариант 4.

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

 

Вариант 5.

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

 

Вариант 6.

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

 

Вариант 7.

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

 

Вариант 8.

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

Вариант 9.

Написать программу, которая в файле все вхождения a заменяет на b.

Словосочетание a и b задаются с клавиатуры.

 

 

итог

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

контрольные вопросы

1. Выполняющего функции islower?

2. Выполняющего функции atoll?

3. Выполняющего функции gets?

4. Выполняющего функции sprintf?

5. Выполняющего функции strstr?

6. Выполняющего функции atoi?

7. Выполняющего функции atof?

8. Выполняющего функции putchar?

9. Выполняющего функции getchar? 10.Выполняющего функции puts? 11.Выполняющего функции sscanf? 12.Выполняющего функции strcat? 13.Что выполняет функция strcmp? 14.Выполняющего функции memcpy? 15.Выполняющего функции memmove? 16.Выполняющего функции memcmp? 17.Выполняющего функции memchr? контрольные вопрос

1. Скопируйте ленту, которая хранится в массиве s2 в массив s1.

2. Введите с клавиатуры ленту текста массив s1 не используя функцию scanf.

3. Определите длину ленты в s1 и выведите результат.

литература

1. Касаткин А.И., Вальвачев А.Н.Профессиональное программирование на языке Си: Вот Turbo C Borland C ++. -Мн .: Выш. школа, 1992. — 240 с.

2. Подбельский В.В. Язык Си ++: Учебн. пособие. — второй изд., Перераб. и доп.

— М .: Финансы и статистика, 1996. — 590 с.

3. Березин Б.И., Березин С.Б. Начальный курс С и С ++. — М .: ДИАЛОГ- МИФИ, 1998. — 288 с.

4. Уинер Г. Язык Турбо Си. / Перев. с англ. — М .: Мир, 1991. -384 с.

5. Романовская и др. Программирование в среде Си для ПЭВМ ЕС. — М .: Финансы и статистика, 1991.

1. Кнут Д.              Искусство программирования на ЭВМ. т.1, Основные алгоритмы./ Пер. с англ. — М: Мир, 1976.

2. Кнут Д. Искусство программирования на ЭВМ. т.2, Получисленные алгоритмы. / Пер. с англ. — М: Мир, 1976.

3. http://void.net.ua/The_C_Programming_Language.html.

4. http://publications.gbdirect.co.uk/c_book/.

5. http://www.scribd.com/doc/16306895/Draft-ANSI-C-Rationale

6. http://www.cplusplus.com/doc/tutorial/

 

Дополнительная литература

1. Берри Р., Микинз Б. Язык Си. Введение для программистов. / Пер. с англ. — М .: Финансы и статистика, 1988.

2. Джехан Н. Программирование на языке Си. / Пер. с англ. — М .: Радио и связь, 1988.

3. Керниган Б., Ритчи Д. Язык программирования Си. / Пер. с англ. — М .: Финансы и статистика, 1992.

4. Техника программирования на Turbo C.- М .: И.В.К. — Софт, 1991.

5. Языки программирования Ада, Си, Паскаль. Сравнение и оценка. / Под ред. А.Фьюэра, Н.Джеханы. — М .: Радио и связь.

 

[Всего голосов: 4    Средний: 5/5]