Федеральное агентство по образованию
Сарапульский политехнический институт (филиал)
Государственного образовательного учреждения
высшего профессионального образования
"Ижевский государственный технический университет"
Методические указания
к лабораторным работам
по дисциплине «Программирование на языке высокого уровня»
для студентов очной и заочной форм обучения
специальности 230101
«Вычислительные машины, комплексы, системы и сети»
Сарапул, 2009
Составитель
Данное пособие предназначено для приобретения практических навыков подготовки, отладки и решения задач на языке программирования высокого уровня С/С++. Методические указания содержат пояснения и рекомендации по выполнению лабораторных работ, темы которых относятся к структурному программированию: стандартные типы данных, основные конструкции (операторы), функции и модули, массивы, строки, структуры (записи), файлы, динамические структуры данных.
Подготовлено кафедрой «Конструирование и производство радиоаппаратуры»
СОДЕРЖАНИЕ
Лабораторная работа №1. Изучение функций ввода-вывода языка Си | 4 |
Лабораторная работа №2. Линейные программы | 4 |
Лабораторная работа №3. Разветвляющиеся программы | 4 |
Лабораторная работа №4. Циклические программы | 4 |
Лабораторная работа №5. Работа с графикой | 4 |
Лабораторная работа №6. Обработка массивов | 4 |
Лабораторная работа №7. Обработка строк | 4 |
Лабораторная работа №8. Подпрограммы и модули | 4 |
Лабораторная работа №9. Обработка файлов записей | 4 |
Лабораторная работа №10. Обработка текстовых файлов | 4 |
Лабораторная работа №11. Динамические списки | |
Лабораторная работа №12. Иерархические структуры данных | 4 |
Лабораторная работа №13. Рекурсивные алгоритмы | 4 |
Лабораторная работа № 1
Изучение функций ввода-вывода языка Си
Цели работы:
Изучить структуру программы на языке Си;
Изучить простые типы данных языка Си;
Изучить способы ввода и вывода чисел, символов и строк с использованием стандартных функций ввода-вывода.
Краткие теоретические сведения
Язык программирования Borland Turbo C++ позволяет создавать программы, работающие в среде ОС MS DOS. Типовая структура программы выглядит следующим образом:
// Подключение модулей, используемых в программе
#include “Имя_включаемого_файла”
#include <Имя_включаемого_файла>
...
// Объявления глобальных объектов (констант, переменных, типов данных)
typedef Описание_типа Имя_типа; // Определение пользовательского типа данных
...
#define Имя_макроса Последовательность_символов // Определение макроса
...
Имя_типа Переменная1, Переменная2, ...; // Объявление глобальных переменных
...
const Имя_типа Имя=Значение1, ...; // Объявление глобальных констант
...
Тип Имя_функции(Список параметров) { // Определение функции
Тело функции
}
...
// Основная функция, с которой начинается выполнение программы
main() {
тело главной функции
}
...
#undef Имя_макроса // Отмена определения макроса
...
Тип Имя_функции(Список параметров) { // Определение функции
Тело функции
}
...
Символы «//» обозначают то место строки, начиная с которого располагается комментарий (неисполняемая часть программы). Рекомендуется в начале программы размещать комментарии, содержащие информацию о назначении программы, авторах, связях с другими программами, форматах входных и выходных данных. Комментарий, размещаемый в нескольких строках заключается в специальные скобки: /* текст комментария */.
С символа «#» начинаются директивы препроцессора (см. ниже).
Включаемые файлы – это файлы, подобной структуры, за исключением функции main. Их можно называть модулями. Если такой файл содержит только описания переменных, констант, типов данных и заголовки функций, его называют заголовочным файлом. Заголовочные файлы в языке Си имеют расширение «.h». Реализация функций часто размещается в одноименных файлах с расширением «.с» или «.срр». В принципе, программист может создавать свои модули и сохранять их в файлах с любым расширением.
Имя включаемого файла записывается либо в угловых скобках, либо в двойных кавычках. В настройках среды Turbo C++ (команда Options / Directories) есть поле Include Directories, в котором через символ «;» указывают список каталогов для поиска включаемых файлов. При указании имени включаемого файла в угловых скобках он ищется последовательно в списке этих каталогов. При указании имени включаемого файла в кавычках он ищется сначала в активной директории, а затем - в том же списке каталогов. Если файл не найден, выдается сообщение об ошибке. В угловых скобках обычно указывают стандартные модули, а в кавычках – файлы пользователей.
Примеры:
#include <stdio. h>
#include ”MyModule. cpp”
Макросы (макроопределения) позволяют сократить текст программы за счет многократного использования короткого имени макроса вместо длинного выражения. С помощью макроса можно задать константу или выражение, а также аналог функции (при использовании макроса с параметрами).
Примеры:
#define N 100 // константа N = 100
#define STR ”Turbo C++ 3.0” // строковая константа
// макрос с параметрами А и В – вычисляет большее из них
#define MAX(A, B) ((A)>(B))?(A):(B)
В последнем примере аргументы макроса заключаются в скобки, так как при его вызове вместо них могут быть записаны выражения.
Примеры использования макросов:
Float Amp[N]; // Объявление массива Amp из 100 вещественных чисел
Puts(STR); // Вывод строки
Printf(”Максимум из X*X и Y+Y+Y = %d”, MAX(X*X, Y+Y+Y)); // Вывод результата
Макросы в программе действуют до тех пор, пока не встретится директива #undef.
Препроцессор – это специальная программа, которая запускается перед компилятором. Его задача – собрать все тексты модулей в один текст, предназначенный для конкретной версии языка, машины в зависимости от выполнения директив условной компиляции. Кроме этого, препроцессор заменяет все использования макросов на конкретные выражения языка программирования. Только после этого сформированный текст переводится компилятором и компоновщиком в исполняемый код программы (EXE-файл).
Оператор typedef позволяет задать новое имя типу данных (синоним). Например:
typedef unsigned long int dword;
// теперь в программе везде можно использовать «dword» вместо «unsigned long int» для обозначения целых чисел от 0 до 4 миллиардов.
Описания переменных, констант, типов, макросов и функций могут чередоваться, но есть одно правило:
ЛЮБОЙ ОБЪЕКТ ДОЛЖЕН БЫТЬ ОПИСАН ДО ЕГО ПЕРВОГО ИСПОЛЬЗОВАНИЯ В ПРОГРАММЕ.
Надо сказать, что на самом деле в языке Си нет именованных констант. Это название условное. Когда константа задается с помощью макроса, она может быть переопределена ниже с помощью директивы #define. Когда константа задается с помощью модификатора const для переменной, она может изменяться не программой, но какими-то внешними событиями.
Программа на языке Си состоит из функций. Все функции находятся на одном уровне, то есть нет функций, описываемых внутри других функций, как в языке Паскаль. Но из любой функции могут вызываться другие функции, в том числе функция может вызывать сама себя (рекурсивная). Одни функции предназначены для выполнения действий (в языке Паскаль они называются процедурами), другие – для возврата результата, а некоторые выполняют и то и другое.
Функция main является точкой входа в программу (ей передается управление после запуска программы). По умолчанию она имеет тип результата int (целый), который может использоваться внешней средой (операционной системой или вызвавшей ее программой). Можно заменить тип функции main на void (пустой). У функции main могут быть аргументы, которые передаются в командной строке DOS. В остальном функция main ничем не отличается от других функций.
Кроме глобальных объявлений, которые действуют во всех функциях программы, описанных ниже по тексту, есть и локальные. Локальные объявления констант, типов, переменных действуют внутри своего блока. Блок заключается в фигурные скобки { }. Это может быть тело функции, цикла, ветвь условного оператора и т. п. Формат объявлений везде одинаков. Если одинаковое имя объявляется несколько раз, то внутри блока используется локальное имя, а за его пределами – глобальное.
Пример:
#include <stdio. h>
int x=99;
...
main() {
int x=10;
printf(”x=%d \n”, x);
{
float x=4.7;
printf(”x=%f \n”, x)
}
printf(”x=%d \n”, x+2);
}
Программа выведет на экран числа:
10
4.700000
12
Другие функции используют значение х=99, если в них не объявлена своя переменная х. Любая функция может изменить значение 99 на другое.
Соглашения об именах
- Идентификаторы (имена переменных, типов, функций, меток и т. п.) должны иметь длину не более 31 символа;
- Имя должно начинаться с латинской буквы;
- Имена могут содержать латинские буквы, цифры и знак подчеркивания;
- Имена не могут содержать пробелов;
- Зарезервированные Си имена могут начинаться с символов подчеркивания;
- Прописные и строчные буквы в именах различаются;
- При объявлении идентификатора программист должен следить за тем, чтобы имя не совпадало с уже существующим именем в подключенных модулях (без крайней необходимости) или названием оператора.
Типы данных языка Turbo С++ 3.0:
Обозначение типа | Диапазон значений | Размер | Точность |
Целочисленные | |||
char | -128...127 | 1 байт | |
unsigned char | 0...255 | 1 байт | |
int | 2 байта | ||
unsigned int | 0...65535 | 2 байта | |
long int | -... | 4 байта | |
unsigned long int | 0... | 4 байта | |
Вещественные | |||
float | 3.4е-38...3.4е+38 | 4 байта | 5-6 |
double | 1.7е-308...1.7е+308 | 8 байт | 14-15 |
long double | 3.4е-4932...3.4е+4932 | 10 байт | 18-19 |
Пустой | |||
void |
Типы char и unsigned char могут использоваться и для коротких целых чисел, и для символов. В языке Си нет разницы между символом и кодом символа. Интерпретация числа как символа или кода зависит от формата функций ввода-вывода.
Тип void используется для функций, не возвращающих значения, для указания пустого списка аргументов, как базовый тип для указателей на область памяти.
Для организации строк используется либо массив типа char, либо указатель на тип char.
Ввод и вывод
В языке Turbo C++ применяются две формы ввода-вывода:
потоковый ввод-вывод, поддерживаемый библиотекой iostream. h
ввод-вывод через стандартные функции Си (библиотеки stdio. h и conio. h).
Важнейшей функцией для ввода является scanf, а для вывода – printf. Это – функции форматного ввода-вывода, то есть, они позволяют интерпретировать входные и выходные данные как информацию различного типа, при выводе организовывать выравнивание данных и ограничивать точность.
scanf - Ввод с клавиатуры (Прототип в stdio. h)
Синтаксис
scanf(строка форматов, &переменная1, &переменная2, ...);
Для ввода строк символ & не обязателен.
Строка форматов может быть задана строковой переменной, хотя чаще используется непосредственно строковый литерал.
Количество переменных должно совпадать с количеством спецификаций формата.
Спецификации формата.
% число_символов [образец] символ_типа (для строк)
% число_символов символ_типа (для других типов данных)
Символ типа | Ожидается на входе | Тип аргумента |
d, i | Десятичное целое | Int |
ld, li | Десятичное длинное целое | Long |
u | Десятичное целое без знака | Unsigned int |
lu | Десятичное целое без знака | Unsigned long |
o | Восьмиричное целое | Int |
lo | Восьмиричное длинное целое | Long |
x | Шестнадцатиричное целое | Int |
lx | Шестнадцатиричное длинное целое | Long |
e, f, g | Число с плавающей запятой | float |
le, lf, | Число с плавающей запятой | double |
Le, Lf, Lg | Число с плавающей запятой | long double |
с | Символ | Char |
s | Cтрока символов | Указатель на массив символов (char arg[]) |
p | Шестнадцатиричное число в виде ZZZZ | Указатель на объект (near*) |
fp | Шестнадцатиричное число в виде YYYY:ZZZZ | Указатель на объект (far*) |
При выводе чисел, содержащих буквы, регистр символов (E | e) зависит от регистра в спецификации формата функции printf.
Адресный аргумент является указателем на массив символов (сhar arg[]).
Размер массива size должен быть не менее (n+1) байт, где n -
длина строки s (в символах). Поле ввода завершается пробелом
или символом перехода на новую строку (\n). Ограничитель
строки (\0) автоматически добавляется в строку после
считывания и хранится в последнем элементе массива.
%[образец] преобразование
Набор символов, заключенных в квадратные скобки, может
вводиться по формату s. Адресный аргумент является указателем
на массив символов (char arg[]).
Квадратные скобки заключают в себя набор символов, определяе-
мых как "образец", или множество допустимых символов, из кото-
рых должна состоять вводимая строка (поле ввода).
Если первым символом в скобках является символ (^), то вво-
диться будут все ASCII-символы из входного потока, кроме зак-
люченных в скобки. (Обычно сам символ (^) включается в набор
допустимых входных символов, если он не встречается в скобках
еще раз, не на первой позиции).
Поле ввода является строкой, не разделенной неотображаемыми
символами. Функция...scanf считывает соответствующее поле
ввода до первого символа, не являющегося элементом допустимого
набора символов (или элементом инвертированного набора).
Приведем два примера этого типа преобразования:
%[abcd] - определяет, что входное поле должно состоять из
символов a, b,c или d.
%[^abcd]- определяет, что входное поле долхно состоять из
любых символов, кроме a, b,c или d.
Вы можете также использовать ограничитель диапазона символов
(цифровых или буквенных) в наборе символов. Например, для
выбора всех десятичных цифр вы должны определить набор
символов следующим образом:
%[]
или тот же самый набор можно определить следующим образом:
%[0-9]
Для выбора алфавитно-цифровых символов вы можете использовать
следующие краткие записи:
%[A-Z] Выбирает все буквы верхнего регистра
%[0-9A-Za-z] Выбирает все десятичные цифры и все буквы
(верхнего и нижнего регистров)
%[A-FT-Z] Выбирает все буквы верхнего регистра от A
до F и от T до Z
При определении диапазонов символов в наборах действуют
следующие правила:
- символ, предшествующий дефису (-), должен быть лексически
меньшим, чем символ после дефиса.
- дефис не должен быть ни первым, ни последним символом
набора (в противном случае это означает, что ограничитель
диапазона не задан ).
- символы по обе стороны от дефиса должны быть граничными
символами диапазона и не должны принадлежать другому
диапазону.
Ниже приводятся несколько примеров, в которых дефис обознача-
ет только символ дефиса, а не диапазон между двумя символами:
%[-+*/] Четыре арифметических действия
%[z-a] Символы z,- и a
%[+0-9-A-Z] Символы + и -, и диапазоны от 0 до 9 и от A до Z
%[^-0-9+A-Z] Все символы, кроме + и -, а также кроме символов
из диапазонов от 0 до 9 и от A до Z
Функция scanf считывает строку до 1-го пробела. Следующее набранное слово автоматически будет прочитано следующей функций scanf. Для чтения строк, содержащих пробелы, нужно указать в образце его 16-ричный ASCII-код (\x20).
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 |


