Требования к оформлению отчета



Отчет по лабораторной работе должен содержать следующие разделы:

· титульный лист;

· цель работы:

· задание на лабораторную работу;

· техническое описание выполненного задания;

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

· выводы по проделанной работе.

Задание на работу

1. Cпроектировать структуру stack (стек LIFO) для использования в программах. Хранилище данных – статический массив.

2. Cпроектировать структуру stack (стек LIFO)для использования в программах. Хранилище данных – динамический массив.

3. Cпроектировать структуру queue (очередь FIFO) для использования в программах. Хранилище данных – статический массив.

4. Cпроектировать структуру queue (очередь FIFO) для использования в программах. Хранилище данных – динамический массив.

5. Cпроектировать структуру типа бинарное дерево для использования в программах. Хранилище данных – статический массив. Порядок обхода – левое поддерево-правое поддерево- узел.

6. Cпроектировать структуру типа бинарное дерево для использования в программах. Хранилище данных – динамический массив.

Порядок обхода – правое поддерево-левое поддерево- узел.

7. Cпроектировать структуру типа бинарное дерево для использования в программах. Хранилище данных – статический массив.

Порядок обхода – левое поддерево- узел-правое поддерево.

8. Cпроектировать структуру типа бинарное дерево для использования в программах. Хранилище данных – динамический массив.

Порядок обхода – правое поддерево-узел-левое поддерево.

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

1. Чем отличается прототип и определение функции?

2. Как указать значения параметров функции по умолчанию?

3. Для чего нужны прототипы функций?

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

5. Что такое перегрузка функций?

6. Что такое формальные и фактические параметры?

Лабораторная работа № 6.
Ввод-вывод по стандарту ANSI C

Цель работы

Освоить методы ввода-вывода из библиотеки ввода-вывода, описанную стандартом ANSI C.

Теоретические сведения

Форматный вывод данных (функции printf() и fprintf()).

Для вывода форматированных данных, как правило, применяются функции printf() и fprintf(). Первая записывает данные в поток stdout, а вторая — в указанный файл или поток. Аргументами функции printf() являются строка форматирования и список выводимых переменных. (В функции fprintf() первый аргумент — указатель файла.) Для каждой переменной из списка задание формата вывода осуществляется с помощью следующего синтаксиса:

%[флаги][ширина][.точность][{h | l}]спецификатор

В простейшем случае указывается только знак процента и спецификатор, например %f. Обязательное поле спецификатор указывает на способ интерпретации переменной: как символа, строки или числа (таблица 1). Необязательное поле флаги определяет дополнительные особенности вывода (таблица 2).

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

Необязательное поле точность интерпретируется следующим образом:

· при выводе чисел формата е, Е и f определяет количество цифр после десятичной точки (последняя цифра округляется);

· при выводе чисел формата g и G определяет количество значащих цифр (по умолчанию 6);

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

· при выводе строк определяет максимальное количество символов, лишние сим­волы отбрасываются (по умолчанию строка выводится, пока не встретится символ \0).

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

Необязательные модификаторы h и l определяют размерность целочисленной переменной: h соответствует ключевому слову short, а l — long.

Таблица 1. Спецификаторы типа переменной в функциях printf() и fprintf()

Спецификатор Тип Формат вывода
c int Символ (переменная приводится к типу unsignedchar)
d, i int Знаковое десятичное целое число
o int Беззнаковое восьмеричное целое число
u int Беззнаковое десятичное целое число
x int Беззнаковое шестнадцатеричное целое число (в качестве цифр от 10 до 15 используются буквы «abcdef')
X int Беззнаковое шестнадцатеричное целое число (в качестве цифр от 10 до 15 используются буквы «ABCDEF»)
e double Знаковое число с плавающей запятой в формате [ - ] т. ddde xxx, где т — одна десятичная цифра, ddd— ноль или более десятичных цифр (количество определяется значением поля точность, нулевая точность подавляет вывод десятичной точки, по умолчанию точность — 6), 'е' — символ экспоненты, ххх — ровно три десятичные цифры (показатель экспоненты)
E double То же, что и е, только вместо символа 'е' применяется 'Е'
f double Знаковое число с плавающей запятой в формате [ - ] mmm.ddd, где mmm — одна или более десятичных цифр, ddd — ноль или более десятичных цифр (количество определяется значением поля точность, нулевая точность подавляет вывод десятичной точки, по умолчанию точность — 6)
g double Знаковое число с плавающей запятой в формате f или е; формат е выбирается, если показатель экспоненты меньше -4 или больше либо равен значению поля точность; десятичная точка не ставится, если за ней не следуют значащие цифры; хвостовые нули не выводятся
G double То же, что и g, но при необходимости выбирается формат Е, а не е
n int * Ничего не выводится; количество символов, выведенных к данному моменту функцией, записывается в переменную
p void * Адрес, содержащийся в указателе (отображается в формате х)
s char * Строка символов; вывод осуществляется до тех пор, пока не будет обнаружен символ \0 или число символов не станет равным значению поля точность

 

Таблица 2. Флаги в функциях printf() и fprintf()

Флаг Назначение
- Если число выведенных символов оказывается меньше указанного, результат выравнивается по левому краю поля вывода (по умолчанию принято правостороннее выравнивание)
+ При выводе знаковых чисел знак отображается всегда (по умолчанию знак устанавливается только перед отрицательными числами)
0 Если значению поля ширина предшествует символ '0', выводимое число дополняется ведущими нулями до минимальной ширины поля вывода (по умолчанию в качестве заполнителей применяются пробелы); при левостороннем выравнивании игнорируется
пробел Если выводится положительное знаковое число, перед ним ставится пробел (по умолчанию пробел в таких случаях не ставится); игнорируется при наличии флага +
# Для чисел формата о, х и X означает добавление ведущих 0, 0х и 0Х соответственно (по умолчанию отсутствуют); для чисел формата е, Е, g, G и f задает присутствие десятичной точки, даже когда за ней не следуют значащие цифры (по умолчанию точка в таких случаях не ставится); для чисел формата g и G предотвращает отбрасывание хвостовых нулей (по умолчанию отбрасываются)

Форматный ввод

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

Функция scanf(), как и ее «родственники» fscanf() и sscanf(), в качестве аргумента принимает такого же рода строку форматирования, что и функция printf(), осуществляющая вывод данных, хотя имеются и некоторые отличия. Для примера рассмотрим следующее выражение:

scanf("%2d%5s%4f", sivalue, psz, &fvalue);

Данная функция считывает целое число, состоящее из двух цифр, строку из пяти символов и число с плавающей запятой, образованное не более чем четырьмя символами (2,97, 12,5 и т.п.). Все аргументы, перечисленные после строки форматирования, должны быть указателями, т.е. содержать адреса переменных. Другое выражение:

scanf(" \"%[^А-Zа-z-] %*[-] %[^\"]", ps1, ps2);

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

Управляющая последовательность %[^A-Za-z-] говорит о том, что в строку рs1 нужно вводить все, кроме букв и символа дефиса (-). Квадратные скобки, в которых на первом месте стоит знак крышки (^), определяют диапазон символов, из которых не должна состоять вводимая строка. В данном случае в диапазон входят буквы от 'А' до 'Z' (дефис между ними означает «от и до») и от 'а' до 'z', а также сам дефис. Если убрать знак ^, то, наоборот, будут ожидаться только буквы и символы дефиса. В конец прочитанной строки добавляется символ \0. Если во входном потоке вслед за открывающей кавычкой первыми встретятся буква или дефис, выполнение функции scanf() завершится ошибкой и в переменные ps1 и рs2 ничего не будет записано, а сама строка останется в буфере потока. Чтение строки ps1 продолжается до тех пор, пока не встретится один из символов, указанных после знака ^.

Вторая управляющая последовательность %*[-] говорит о том, что после чтения строки ps1 должна быть обнаружена группа из одного или нескольких дефисов, которые необходимо пропустить. Символ звездочки (*) указывает на то, что данные должны быть прочитаны, но не сохранены. Отметим два важных момента.

Если после строки ps1 первой встретится буква, а не дефис, выполнение функции scanf() завершится ошибкой, в переменную ps2 ничего не будет записано, а сама строка останется в буфере потока.

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

Последняя управляющая последовательность %[^\»] указывает на то, что в строку ps2 нужно считывать все символы, кроме двойных кавычек, которые являются признаком завершения ввода.

Для полной ясности приведем пример входной строки:

"65---ААА"

Вот что будет получено в результате: *psl= 65, *ps2 = ааа.

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

sscanf(psz,"%d", &ivalue);


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

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






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