ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ Государственное образовательное учреждение высшего профессионального образования СА...
5 downloads
210 Views
189KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ Государственное образовательное учреждение высшего профессионального образования САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ
КОМПЬЮТЕРНЫЕ ТЕХНОЛОГИИ В ПРИБОРОСТРОЕНИИ ОСНОВЫ ПРОГРАММИРОВАНИЯ НА С/С++
Методические указания к выполнению лабораторных работ
Санкт-Петербург 2005 1
Составитель канд. техн. наук Е. М. Анодина-Андриевская Рецензент канд. техн. наук С. Д. Субочев Содержат теоретический материал и методические указания к выполнению лабораторных работ по дисциплине «Компьютерные технологии в приборостроении». Предназначены для студентов очной и заочной форм обучения специальностей 1910, 1903, 1902, 5515, изучающих дисциплину «Компьютерные технологии в приборостроении». Подготовлены к публикации кафедрой компьютерных систем автоматизации и рекомендованы к изданию редакционно-издательским советом Санкт-Петербургского государственного университета аэрокосмического приборостроения.
Редактор А. М. Картухина Компьютерная верстка О. И. Бурдиной Подписано к печати 09.11.05. Формат 60´84 1/16. Бумага офсетная. Печать офсетная. Усл. печ. л. 1,74. Уч.-изд. л. 1,93. Тираж 100 экз. Заказ № Редакционно-издательский отдел Отдел электронных публикаций и библиографии библиотеки Отдел оперативной полиграфии ГУАП 190000, Санкт-Петербург, ул. Б. Морская, 67
© ГОУ ВПО «СПбГУАП», 2005 2
ПРЕДИСЛОВИЕ В результате изучения дисциплины «Компьютерные технологии в приборостроении» студенты д о л ж н ы : – получить представление об аппаратных и программных средствах ЭВМ, программных средствах автоматизации математических расчетов; – усвоить основные принципы математического моделирования, алгоритмизации и программирования на языках С/С++; – освоить практические приемы использования систем автоматизации математических расчетов для решения инженерных задач. Дисциплина «Компьютерные технологии в приборостроении» предполагает проведение ряда лабораторных работ. Цель работ: освоение технологии разработки программ с использованием языков программирования С/С++. Методические указания предназначены для выработки у студентов навыков программирования на языках С/С++. В издании рассмотрены основные понятия программирования: – построение программы; – описание типов данных; – организация ввода и вывода данных; – конструкции основных операторов; – организация работы с массивами, структурами и файлами; – особенности работы с функциями; – организация графического вывода данных. 1. ОСНОВЫ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ С/С++ 1.1. Описание языков программирования С/С++ В системы программирования на языках С/С++ входят: – интегрированная среда программирования (программа, содержащая встроенный редактор текстов, подсистему работы с файлами, систему помощи, встроенный отладчик и т. д.); – компилятор исходного текста программы; – редактор связей; – библиотеки заголовочных файлов; – библиотеки функций; – программы-утилиты. Текст программы на языках С/С++ содержит базовые символы, которые можно разделить на следующие группы: – буквы латинского алфавита; 3
– десятичные цифры; – знаки операций; – скобки; – знаки пунктуации; – специальные символы. Комбинации базовых символов без пробелов образуют составные символы. Символы пробела, табуляции, перевода строки, возврата каретки относятся к пробельным символам. Совокупность букв, цифр и знаков подчеркивания, задающая имя переменной, название функции или ключевое слово в программе, называется идентификатором. Ключевые слова – это предопределенные идентификаторы, используемые для составления текста программы. Синтаксически неделимая единица текста программы, имеющая определенный смысл для компилятора, от 1 до нескольких символов алфавита, в том числе знаки пунктуации, скобки, ключевые слова, константы и идентификаторы переменных и функций, называется лексемой. Границами лексем служат пробельные символы или другие лексемы. 1.2. Структура программы на С/С++ Программа на языке высокого уровня содержит формализованный текст, включающий описательные предложения для представления объектов программы и исполняемые предложения (операторы), реализующие алгоритм задачи. Программа на языках С/С++ представляет собой набор функций, т. е. вспомогательных программных единиц. Одна из них является обязательной, за которой закреплено имя main(). Для выделения части кода используются фигурные скобки «{}», конец инструкции отмечается точкой с запятой «;». Комментарии отмечаются знаками «/* */». В С++ возможно также использование знаков «// ». Структура программы: тип main (параметры) /*имя функции, указывающей точку входа*/ { /*блок инструкций*/ инструкция 1; ... инструкция N; return (значение); } “Тип” – это ключевое слово типа для взвращаемого функцией значения или при отсутствии типа ключевое слово void (отсутствие типа). 4
“Параметры” – это необязательный список формальных параметров с их типами. Программа обычно содержит директивы препроцессора – указания для предварительной обработки текста исходного файла перед его компиляцией. Директивой является строка, начинающаяся с символа “#”. Директивы включения файлов позволяют подключить общие файлы заголовков с расширением “.h”, через которые осуществляется доступ к стандартным библиотекам. Формат директивы имеет следующий вид: # include < имя_файла >. Директивы подстановки имен позволяют программисту создавать собственные символические константы и макроопределения для фрагментов исходного текста программы по формату: # define идентификатор текст. 1.3. Представление данных в С/С++ Данные, используемые в вычислительном процессе – это константы и переменные. Константы – это неизменяемые величины в программе, определяемые их типом и формой представления. Определение констант: # define имя_константы значение main() { } В С++ возможен следующий вариант определения констант: main() { const тип1 имя_константы1 = значение1; ... const тип N имя_константыN = значениеN; } Переменные – это данные, значения которых могут меняться в ходе работы программы. Определение переменных: main() { тип1 имя_переменной1_1, ..., имя_переменной1_M; ... тип N имя_переменной N_1, ..., имя_переменной N_M; } 5
В С/С++ типы данных разбиваются на четыре типа: – “пустой” (void), – скалярный (арифметические типы, перечисления, указатели и в С++ – ссылочный тип), – “функция”, – агрегированный (массивы, структуры, объединения и в С++ – классы). Типы подразделяются на основные и производные. К основным относятся void, char, int, float совместно с вариантами short, long, signed, unsigned. Производные – это указатели и ссылки на другие типы, массивы, функции, классы, структуры и объединения. Наиболее распространенные типы констант и переменных в С/C++ приведены в табл. 1. Таблица 1 Oбозначение
Название
Kоличество байт
Примеры использования константы
переменные
символьные данные –128...127
1
#define C 'A' char c const char f = 'A'
unsigned символьные данные char 0...255
1
#define C 'A'
unsigned char c
int
–32768...32767
2
#define I 7
int n
short int
–32768...32767
2
short int k
2
unsigned int i
–2147483648... 2147483647
4
long int j
unsigned 0...4294967295 long
4
unsigned long l
char
unsigned 0...65535 int long int
float
3.4*Е–38... 3.4*Е+38
4
double
1.7*Е–308... 1.7*Е+308
8
double b,d,f
long double
3.4*E–4932... 3.4*Е+4932
10
long double g
6
#define PI 3.14 float a,b
1.4. Ввод и вывод в С/С++ Для реализации функций ввода-вывода необходимо включить в текст программы файлы заголовков stdio.h (подключение функций стандартного ввода-вывода) и conio.h (подключение функций консольного ввода-вывода) с помощью директивы # include: # include <stdio.h>, # include . Стандартный ввод-вывод может быть двух видов: форматированный и неформатированный. Функции ввода и вывода приведены в табл. 2. Таблица 2 ВЫВОД
Функция
Назначение
ВВОД
Примеры Функция использования
Назначение
Примеры использования
Форматированный ввод и вывод (файл заголовков stdio.h) printf("n= %d, scanf printf для ввода scanf("%f", для вывода v= %f",n,v) (формат, (формат, данных &a) данных данные) данные) Строка формата заключается в кавычки и может содержать любой текст и метки, называемые указателями формата. Kаждый указатель формата начинается с символа "%", после которого стоит буква, указывающая тип данных: – %d – целое число – %o – целое число в восьмеричной системе – %u – целое число – %x – целое число в шестнадцатеричной системе – %f – вещественное число типа float или double без знака – %e – вещественное число в экспоненциальной форме – %c – символ – %g – вещественное число в наиболее короткой форме – %s – строка Неформатированный ввод и вывод (файл заголовков stdio.h) для вывода # define C'A' main() на экран char s ='ABC' { для ввода строковых main() char s[15]; gets() строки в литералов, puts() {puts('ABC'); переменную gets(s); констант и puts(C); } переменputs(s);} ных # define C 'A' main() для вывода main() { для ввода с единичного {char l; клавиатуры char с; putchar() getchar() символа на putchar('A'); int i; единичного putchar(C); экран c = getchar(); символа i = getchar();} putchar(l);}
7
Окончание табл. 2 ВЫВОД
Функция
Назначение
ВВОД
Примеры Функция использования
Назначение
Примеры использования
Kонсольный ввод и вывод (файл заголовков conio.h) код нажатой c=getch(); getch() клавиши без для вывода getch(); отображениея единичного putch(C); putch() символа на код нажатой экран getche () клавиши с c=getche(); отображением вывод cputs() строк с указанием вывод соcputs('ABC') цвета текста общений и cprintf("ABC\n\r") и фона cprintf() значений переменных В С++ вводвывод данных любых типов (файл заголовков iostream.h)
}
cout
вывод данных
cout<
cin
ввода данных cin>>C>>p
Перемещением курсора на экране можно управлять с помощью escape-последовательностей: \a – «звуковой сигнал»; \b – «возврат на шаг»; \f – «перевод страницы»; \n – «новая строка»; \r – «возврат каретки»; \t – «горизонтальная табуляция»; \v – «вертикальная табуляция». Escape-последовательности также можно использовать для вывода на экран специальных символов: \’ – одинарная кавычка; \” – двойная кавычка; \\ – обратная косая черта; \? – знак вопроса. Цвет текста задается функцией textcolor (цвет). В качестве параметра “цвет” используются данные табл. 3.
8
Таблица 3 Цвет
Kонстанта
Значение константы
Черный
BLACK
0
Синий
BLUE
1
Зеленый
GREEN
2
Бирюзовый
CYAN
3
Kрасный
RED
4
Сиреневый
MAGNETA
5
Kоричневый
BROWN
6
Светло-серый
LIGHTGRAY
7
Серый
DARKGRAY
8
Голубой
LIGHTBLUE
9
Светло-зеленый
LIGHTGREEN
10
Светло-бирюзовый
LIGHTCYAN
11
Алый
LIGHTRED
12
Светло-сиреневый
LIGHTMAGNETA
13
Желтый
YELLOW
14
Белый
WHITE
15
Цвет фона задается функцией textbackground (цвет). В качестве параметра “цвет” используются данные табл. 4: Таблица 4 Цвет
Kонстанта
Значение константы
Черный
BLACK
0
Синий
BLUE
1
Зеленый
GREEN
2
Бирюзовый
CYAN
3
Kрасный
RED
4
Сиреневый
MAGNETA
5
Kоричневый
BROWN
6
Светло-серый
LIGHTGRAY
7
9
Команда gotoxy(x,y) переводит курсор в позицию с указанными координатами. Координата x задает номер колонки, координата y – номер строки, на пересечении которых находится знакоместо, куда переводится курсор. Команда clrscr() очищает экран и закрашивает его цветом, заданным функцией textbackground (цвет). Команда window(x1, y1, x2, y2) определяет окно – прямоугольная область экрана. Параметры x1, y1 задают координаты левого верхнего угла относительно экрана, параметры x2, y2 – координаты правого нижнего угла. 1.5. Операции в С/С++ Операции в С/С++ можно условно разделить на виды (табл. 5). Таблица 5 Название
Арифметические операции
Действие
+
сложение
–
вычитание
*
умножение
/
деление
Пример
A%(B*((C–D)+(G–F))/P–Q) % остаток от деления нацело ()
Инкремент и декремент
изменение приоритетов
++ увеличение значения --
уменьшение значения
== равно
Операции отношения
Логические операторы
j=--i; j=i--; A==B
>
больше
A>B
<
меньше
A
>= больше или равно
A>=B
<= меньше или равно
A<=B
!= не равно
A!=B
!
логическое "НЕ"
!(A==B)
||
логическое "ИЛИ"
(A!=1)||(B==0)
&& логическое "И"
10
j=++i; j=i++;
(C>25)&&(d<=9)
Окончание табл. 5 Название
Логические операторы
Действие
~
поразрядное "НЕ"
~A
|
поразрядное "ИЛИ"
A|B
& поразрядное "И" ^
Операции присваивания и условия Операции сдвига
Пример
поразрядное исключающее "ИЛИ"
A&B A^B
= присваивание
A=B=C=0
?: условие
C=A>B? A*A+B*B: 0
<< сдвиг влево
B1=B<<1;
>> сдвиг вправо
B2=B>>1;
1.6. Операторы ветвления Операторы ветвления (табл. 6) служат для выбора продолжения вычислительного процесса из группы альтернатив. Таблица 6 Kонструкция
Пример
1. if (a>b) a=b; if (условие) 2. if (i>1 && i<10) { { блок_инструкций; b=a+c; /* инструкции, которые будут выполнены, d=b-10; если значение выражения "условие" не } равно нулю */ } if (условие) { блок_инструкций_1; /* инструкции, которые будут выполнены, если значение выражения "условие" не равно нулю */ } else { блок_инструкций_2;
if (d==0 || d==5) { c=d+1; a=c/b; } else { g=a%n; puts("****"); }
11
Окончание табл. 6 Kонструкция
Пример
/* инструкции, которые будут выполнены, если значение выражения "условие" равно нулю */ } switch (переменная) { case 'значение_1': блок_инструкций_1; break; . . . case 'значение_k': блок_инструкций_k; break; } switch (переменная) { case 'значение_1': блок_инструкций_1; break; . . . case 'значение_k': блок_инструкций_k; break; default: блок_инструкций; break; }
switch (c) { case '1': a=b/10; m=n+1; break; case '2': a=b/20; m=n+2; break; case '3': a=b/30; m=n+3; break; } switch (c) { case '1': a=b/10; m=n+1; break; case '2': a=b/20; m=n+2; break; case '3': a=b/30; m=n+3; break; default: a=0; m=0; break; }
1.7. Операторы цикла Операторы цикла (табл. 7) используются для организации повтора в программе определенных действий. Таблица 7 Kонструкция
Пример
Циклы с фиксированным числом повторений
for (инициализация;условие_выполнения; изменение) { блок_инструкций (тело цикла); } Инициализация – инструкция инициализации счетчика циклов.
12
for (i=1;i<=10; i++) { s=2*i; printf("i=%d, s=%d\n",i,s); }
Окончание табл. 7 Kонструкция
Пример
Циклы с фиксированным числом повторений
Условие_выполнения – выражение, значение которого определяет условие, при котором выполняются инструкции цикла (инструкции цикла выполняются до тех пор, пока условие_выполнения истинно, т. е. не равно нулю). Изменение – инструкция изменения параметров цикла Циклы с поступлением
do { блок_инструкций (тело цикла); } while (условие_повторения); Сначала выполняется тело цикла, затем проверяется значение выражения условие_повторения, и если условие истинно, то инструкции цикла (тело цикла) выполняются до тех пор, пока условие_повторения не станет ложным
i=0; do { s=2*i; printf("i=%d, s=%d\n",i,s); i++; } while(i<=10);
Циклы с предусловием
while (условие_выполнения) { блок_инструкций (тело цикла); } Инструкции цикла (тело цикла) выполняются до тех пор, пока условие_выполнения не станет ложным
i=0; while(i<=10) { s=2*i; printf("i=%d, s=%d\n",i,s); i++; }
1.8. Массивы и строки Массивом называется множество расположенных в памяти друг за другом элементов одного типа, которыми можно оперировать как группой. Элементы массива различаются номерами (индексами). Индексация в С/С++ начинается с нуля. Количество индексов, необходимых для описания массива и организации доступа к элементам массива, определяет размерность массива. Массивы можно условно разделить на одномерные и многомерные. Элементами многомерного массива являются массивы меньшей размерности. 13
Определение массива: тип_значений имя_массива [размер1] [размер2] Пример: int t[30]; float r[4][5]. Существует два способа обращения к элементам массива: – использование индексных выражений имя [индексное выражение]; Пример: t[0]; r[i][j]; – использование указателей и адресных выражений. Указателем называется переменная, с помощью которой можно обращаться к области памяти, отведенной под другую переменную. Определение указателя: тип_переменной *имя_указателя; Пример: int *ui; float *uf. Присвоение указателю значения в виде адреса соответствующей переменной выполняется следующим образом: имя_указателя = & имя_переменной; Пример: ui = &i; uf = &f. Имя массива является адресом первого байта элемента с индексом 0. Адрес элемента вычисляется по следующей формуле: адрес_элемента = имя_массива + индекс*sizeof(тип_массива), где функция sizeof определяет размер элемента в байтах. Адресное выражение образуется с использованием имени массива или указателя на массив. Например: r + i. Доступ к элементам массива через адресное выражение осуществляется с помощью операции разадресации *: *(r + i). Занесение данных в массив осуществляется тремя способами: – инициализацией массива; – использованием функций ввода; – присваиванием значений.
14
Инициализация массива выполняется при описании массива путем задания начальных значений элементов в списке инициаторов, заключенном в фигурные скобки (инициаторы разделяются запятыми). Примеры: Инициализация одномерного массива: – полностью int m[5]={1,2,3,4,5}, – частично int m[5]={1,2} (m[0]=1, m[1]=2, остальные элементы равны 0), – обнуление массива int m[5]={0}. Инициализация двумерного массива: – одним списком int m[2][3]={1,2,3,4,5,6}, – отдельными списками построчно int m[2][3]={{1,2,3},{4,5,6}}, – неполными списками построчно int m[2][3]={{1,2},{4}}, – обнуление массива int m[2][3]={0}. Ввод данных в массив функцией scanf() выполняется поэлементно, для чего используется оператор цикла. Например: for (i=0;i<5; i++) scanf(“%d”,&a[i]); for (i=0;i<5; i++) scanf(“%d”,a+i). Присваивание значений элементам массива выполняется при вычислении выражений, определяющих элементы массива. Например: for (i=0;i<5; i++) a[i]=sin(i)+cos(2*i). В языках программирования C/C++ существуют широкие возможности для работы с символьными массивами. Массив символов называется строкой и описывается следующим образом: char имя [размер]. Строковым литералом называется последовательность символов, заключенных в кавычки. Строковый литерал представляется в памяти как массив элементов типа char, в конце которого помещен символ ‘\0’ (нулевой байт). Инициализация символьного массива осуществляется поэлементно или с использованием строковых литералов. Например: char string [10] = {‘a’,’b’,’c’,’d’,’e’,’f’,’\0'}; char string [10] = ”abcdef”. Для работы со строками можно использовать специальные функции (табл. 8).
15
Таблица 8 Функция
Описание
strcat()
Объединение строк
strncat()
Добавление определенного количества символов одной строки в другую
strcmp()
Сравнение строк
strncmp()
Сравнение определенного количества символов в двух строках
strcmpi()
Сравнение двух строк без учета регистра символов
strcpy()
Kопирование одной строки в другую
strncpy()
Kопирование определенного количества символов из одной строки в другую
strlen()
Определение длины строки
strchr()
Нахождение первого вхождения символа в строку
strrchr()
Нахождение последнего вхождения символа в строку
strset()
Замена символов строки заданным символом
strnset()
Замена определенного количества символов строки заданным символом
strdup()
Дублирование строки
strlwr()
Преобразование строчных символов в прописные
strupr()
Преобразование прописных символов в строчные
1.9. Структуры в С/С++ Структурой называется переменная, включающая в себя переменные различных типов. Определение структуры: struct имя_структуры { тип_1 имя_переменной_1; тип_2 имя_переменной_2; ... тип_N имя_переменной_N; }
16
Пример: struct S_T { char c[20]; float f; int i; } Определение структурных переменных: struct имя_структуры_1 имя_переменной_1_1, ... имя_переменной_1_n; struct имя_структуры_m имя_переменной_m_1, . . . имя_переменной_m_n; Пример: struct S_T s,t; Обращение к структуре: имя_структуры.имя_переменной Пример: s.c = ‘a’; s.f = 0.25; s.i = 3; 1.10. Работа с файлами в С/С++ Файлом называется область на носителе информации, имеющая имя. Для работы с файлами необходимо включить в текст программы файл заголовков STDIO.H с помощью директивы # include: #include <STDIO.H>. Определение указателя на файл: FILE *имя_указателя_1, . . ., *имя_указателя_n; Открытие файла: имя_указателя = fopen(“имя_файла”,”режим_доступа”); Режим доступа к файлу приведен в табл. 9. Таблица 9 Обозначение
Действие
r
Чтение информации из файла в память компьютера
w
Запись данных на диск или вывод на принтер
a
Добавление информации в конец файла
17
В случае успешного открытия файла функция fopen возвращает указатель на поток, из которого можно читать или в который можно записывать. Если эта операция не была выполнена, то функция возвращает NULL. Пример: FILE *f1,*f2,*f3; f1 = fopen(“VVOD.DAT”,”r”); f2 = fopen(“VIVOD.DAT”,”w”); f3 = fopen(“PRN”,”w”); В С++ возможны следующие функции для работы с файлами: ifstream имя_указателя /*чтение файла*/ ofstream имя_указателя /*запись в файл*/ Закрытие файла: fclose(имя_указателя); Пример: fclose(f1); Функции ввода и вывода приведена в табл. 10. Таблица 10 ВЫВОД
Функция
Назначение
построчная fputs( запись в строка, файл или имя_укавывод на зателя) принтер
fputc()
посимвольная запись в файл или на принтер
форматиfprintf (указатель, рованный вывод формат, данные)
ВВОД
Примеры
fputs(l,fp); l-строка, fp-указатель на файл
Функция
fgets( строка, имя_указателя))
fputc(c,fp); fgetc() c-символ, fp-указатель на файл
Назначение
Примеры
построчное fgets(l,fp); считывание l-строка, fp-указатель из файла на файл посимвольное считывание из файла
форматиfscanf fprintf(fp, "%s,%f,%d", (указатель, рованный ввод формат, a,b,c); данные)
c=fgetc(fp); c-символ, fp-указатель на файл fscanf(fp, "%d", &n);
Для записи и чтения структур при работе с файлами используются функции fwrite () и fread () соответственно. Синтаксис функций fwrite () и fread (): fwrite(&имя_структуры, размер_структуры, количество_записываемых_структур, указатель_на_файл),
18
fread(&имя_структуры, размер_структуры, количество_считываемых_структур, указатель_на_файл). Примеры: fwrite(&d,sizeof(d),1,fp), fread(&d,sizeof(d),1,fp). Для определения конца файла используется функция feof(имя_указателя). Она возвращает ненулевое значение, если в результате выполнения последней операции чтения был достигнут конец файла. Пример: feof(f1); Функция ferror (имя_указателя) возвращает ненулевое значение, если последняя операция с файлом завершилась с ошибкой. 1.11. Использование функций в С/С++ Функцией называется логически самостоятельная именованная часть программы, которой могут передаваться параметры и которая может возвращать значение. Структура функции: тип_данных имя_функции (список_аргументов) { описание данных операторы return(выражение) } Поле “тип_данных” задает тип возвращаемого функцией значения. По умолчанию функция возвращает значение типа int. Если поле содержит ключевое слово void, функция не возвращает никакого значения. Поле “имя_функции” – это указатель на функцию. Его значением является адрес точки входа в функцию. Поле “список_аргументов” определяет аргументы, передаваемые в функцию. Поле “список_аргументов” в определении функции называется списком формальных аргументов или параметров. Каждый параметр определяется его типом и именем с возможными модификаторами, описывающими указатель – *, массив – [], функцию – (). Если в функцию не передаются аргументы, значит поле отсутствует или содержит ключевое слово void. Поле “список_аргументов” в определении функции называется списком формальных аргументов или параметров. В соответствие формальным аргументам ставятся значения фактических аргументов, задаваемые при обращении к функции. 19
Совокупность данных в фигурных скобках называется телом функции. Тело функции образует блок (или составной оператор), определяющий ее действия и результаты. Блок может содержать описания используемых в нем переменных, которые являются локальными, если не объявлено иначе. Операторы тела функции выполняются, пока не встретится оператор return (возврат) или конец функции – последняя закрывающая фигурная скобка, при этом управление возвращается в точку вызова функции. Обращение к функции имеет следующий вид: имя_функции (список_аргументов), где “список_аргументов” – последовательность выражений, разделенных запятыми, представляющих фактические параметры, которые должны соответствовать списку формальных параметров. Возможны два способа вызова функции – операнд и оператор. При обработке вызова функции возможны два способа передачи данных в функцию и из функции – по значению и по адресу. В случае передачи данных по значению компилятор, обрабатывая вызов функции, осуществляет запись копий значений фактических параметров во временную память. Формальные параметры при выполнении тела функции работают с копиями аргументов. Таким образом, формальные и фактические параметры изолируются друг от друга, поэтому в теле функции нельзя изменить значение фактического параметра. Такой способ используется, если необходимо сохранить значения фактических параметров после работы вызываемой функции. В случае передачи данных по адресу в качестве аргументов при вызове функции передаются не копии переменных, а копии адресов переменных. Формальный и фактический параметры, используя один и тот же адрес (указатель), получают доступ к общему участку памяти (переменной). После применения операции разадресации в функции можно изменить значение фактического параметра и использовать его как один из результатов функции. Вызов функции с передачей адресов аргументов позволяет разрабатывать функции, имеющие доступ к массивам и другим протяженным объектам данных. При создании программы объект должен описываться или объявляться раньше, чем он используется. Если обращение к функции используется до ее описания, вводится ее объявление с использованием прототипа. Прототип повторяет заголовок функции, за которым ставится разделитель (точка с запятой), т. е. вводится пустой оператор вместо тела функции. Атрибутами объекта являются область действия и время жизни. Областью действия называется часть текста программы, где может быть использован данный объект. Время жизни – это интервал времени, в 20
течение которого значение объекта доступно для использования в некоторой части программы. Время жизни переменной может быть локальным или глобальным. Объект с глобальным временем жизни имеет определенное значение на протяжении всего времени выполнения программы и располагается в выделенной для него памяти. Для локального объекта выделяется новая область памяти при каждом входе в блок и освобождается при выходе из блока, при этом значение объекта теряется. Переменные, описанные в функции, в том числе формальные параметры, имеют локальную область действия. Сами функции в программе являются внешними по отношению друг к другу и имеют глобальное время жизни, т. е. существуют на протяжении всего времени выполнения программы. 1.12. Функции графического режима При работе с функциями графического режима (табл. 11) необходимо использовать заголовочный файл graph.h. Таблица 11 arc
void arc (int x, int y, int Угол Начала, int Угол Kонца, int Радиус)
Вычерчивает дугу с центром в точке с координатами (x, y). Параметры "Угол Начала" и "Угол Kонца" задают круговые координаты начальной и конечной точек линии дуги, которая вычерчивается против часовой стрелки от начальной точки к конечной. Угловые координаты задаются в градусах. Значение угловой координаты возрастает против часовой стрелки. Параметр "Радиус" задает радиус дуги. Линия дуги вычерчивается цветом, заданным функцией setcolor bar
void bar (int x1,int y1, int x2, int y2 )
Вычерчивает закрашенный прямоугольник. Параметры x1 и y1 задают положение левого верхнего угла прямоугольника, x2 и y2 – правого нижнего. Цвет и стиль заливки прямоугольника задаются функцией setfillstyle bar3d
void bar3d (int x1, int y1, int x2, int y2, int Глубина, int В_Грань)
Вычерчивает параллелепипед. Параметры x1 и y1 задают положение левого верхнего угла, а x2 и y2 – правого нижнего угла ближней грани параллелепипеда. Параметр "Глубина" задает расстояние между передней и задней гранями, параметр "В_Грань" определяет, нужно ли вычерчивать границу верхней грани. Если параметр "В_Грань" равен нулю, то линия границы верхней грани не вычерчивается. Цвет и стиль закраски ближней грани параллелепипеда можно задать при помощи функции setfillstyle, цвет линий границы – при помощи функции setcolor
21
Продолжение табл. 11 circle
void circle ( int x, int y, int r)
Вычерчивает окружность радиуса r с центром в точке с координатами (x, y). Цвет окружности можно задать при помощи функции setcolor drawpoly
void drawpoly (int Kол Точек, int *Kоординаты)
Вычерчивает замкнутую ломаную линию, состоящую из отрезков прямых. Параметр "Kол Точек" задает количество точек, в результате последовательного соединения которых получается ломаная. Параметр "Kоординаты" задает массив координат узловых точек ломаной. Нулевой и первый элементы массива "Kоординаты" содержат координаты первой точки (x и y), второй и третий элементы содержат координаты второй точки и т. д. ellipse
void ellipse (int x, int y, int Угол Начала, int Угол Kонца, int Радиус Х, int Радиуc Y)
Вычерчивает эллипс или дугу эллипса с центром в точке с координатами (x, y). Параметры "Угол Начала" и "Угол Kонца" задают круговые координаты начальной и конечной точек линии эллипса, которая вычерчивается против часовой стрелки от начальной точки к конечной. Угловые координаты задаются в градусах. Значение угловой координаты возрастает против часовой стрелки. Параметры "Радиус X" и "Радиус Y" задают горизонтальный и вертикальный радиусы эллипса. Линии эллипса или дуги вычерчиваются цветом, установленным функцией setcolor getmaxx, getmaxy
int getmaxx (void); int getmaxy (void)
Функция getmaxx возвращает координату x крайней правой точки экрана, функция getmaxy – координату y крайней нижней точки экрана getx, gety
int getx (void); int gety (void)
Возвращает координату x (y) указателя ввода graphresult
int graphresult (void)
Возвращает результат (код ошибки) последней выполненной графической операции. Если операция выполнена успешно, функция возвращает ноль. Kод ошибки выполнения графической операции устанавливают функции: bar, bar3d, initgraph, pieslice, setfillpattern, setlinnestyle и др. grapherrormsg char* grapherrormsg (int KодОшибки) Возвращает указатель на строку, содержащую сообщение, соответствующее коду ошибки выполнения графической операции, указанному при вызове функции
22
Продолжение табл. 11 initgraph
void initgraph (int* Driver, int* Mode, char* Path)
Инициализирует графический режим. Параметр Driver определяет драйвер видеосистемы, параметр Mode – режим работы видеосистемы, параметр Path – путь к файлу драйвера. Обычно в качестве параметра Driver используют указатель на целую константу, значение которой равно DETECT. В этом случае функция initgraph сама определяет тип графического адаптера и устанавливает для него наилучший режим line
void line (int x1,int y1, int x2, int y2 )
Вычерчивает линию из точки с координатами x1, y1 в точку с координатами x2, y2. Цвет линии можно задать при помощи функции setcolor, стиль – при помощи функции setlinestyle lineto
void lineto (int x, int y)
Вычерчивает линию от текущего положения указателя вывода до точки, координаты которой указаны при вызове. Линия вычерчивается стилем, установленным функцией setlinestyle. Цвет линии можно задать, вызвав функцию setcolor linerel
void linerel (int dx, int dy)
Вычерчивает линию из точки текущего положения указателя вывода (xt, yt) в точку с координатами (xt+dx, yt+dy), т. е. координаты конца линии задаются в приращениях относительно текущих координат указателя вывода. Линии вычерчиваются стилем, который устанавливается функцией setlinestyle. Цвет линии можно задать, вызвав функцию setcolor. Kоординаты указателя вывода можно получить при помощи функций getx и gety moveto
void moveto (int x, int y)
Перемещает указатель вывода в точку с заданными координатами moverel
void moverel (int dx, int dy)
Перемещает указатель вывода на dx и dy пикселов. Если значение параметра dx (dy) положительное, то указатель перемещается вниз (влево), если отрицательное – вверх (вправо) outtext
void outtext (const char* Текст)
Выводит строку символов "Текст" от текущего положения указателя вывода и перемещает его в точку, расположенную за последним выделенным символом. Строка, передаваемая функции outtext, не должна содержать символов форматирования, например \n. Цвет выводимых символов можно задать при помощи функции setcolor, шрифт – settextstyle
23
Продолжение табл. 11 outtextxy
void outtextxy (int x, int y, const char* Текст)
Устанавливает указатель вывода в точку с координатами (x,y) и выводит от нее строку "Текст", при этом указатель вывода своего положения не меняет, т. е. остается в точке с координатами (x,y). Цвет выводимых символов можно задать при помощи функции setcolor, шрифт – settextstyle pieslice
void pieslice(int x, int y, int Угол Начала, int Угол Kонца, int Радиус)
Вычерчивает дуговой сектор радиуса "Радиус" с центром в точке с координатами (x,y). Параметры "Угол Начала" и "Угол Kонца" задают круговые координаты начальной и конечной точек линии окружности, которая вычерчивается против часовой стрелки от начальной к конечной точке. Угловые координаты задаются в градусах. Значение угловой координаты возрастает против часовой стрелки. Нулевому углу соответствует горизонтальный отрезок, проведенный из точки ( x,y) в сторону возрастания координаты x. Если "Угол Начала" = 0, а "Угол Kонца" = 360 ?, то функция pieslice вычерчивает круг. Сектор закрашивается стилем и цветом, установленными функцией setfillstyle, линия границы вычерчивается цветом, установленным функцией setcolor putpixel
void putpixel (int x, int y, int Цвет)
Окашивает пиксел, точку с координатами (x,y), цветом "Цвет". В качестве параметра "Цвет" обычно используют именованную константу rectangle
void rectangle (int x1, int y1, int x2, int y2)
Вычерчивает прямоугольник. Параметры x1 и y1 задают положение левого верхнего угла прямоугольника, x2 и y2 – правого нижнего. Вид (стиль линии) контура прямоугольника можно задать при помощи функции setlinestyle, цвет – при помощи функции setcolor sector
void sector (int x, int y, int Угол 1, int Угол 2, int Радиус X, int Радиус Y)
Вычерчивает эллиптический (Радиус X ? ?Радиус Y) или круговой (Радиус X = Радиус Y) сектор. Параметры x и y задают координаты центра сектора. Параметры "Угол 1" и "Угол 2" – углы прямых, ограничивающих сектор, параметры "Радиус X" и "Радиус Y" – радиусы эллипса по осям X и Y, из которого вырезается "сектор". Нулевому углу соответствует горизонтальный отрезок, проведенный из точки (x,y) в сторону возрастания координаты x. Если "Угол 1" = 0, а "Угол 2" = 360 ?, то функция sector вычерчивает полный круг (эллипс). Цвет и стиль заливки можно задать при помощи функции setfillstyle, цвет границы сектора – при помощи функции setcolor
24
Окончание табл. 11 setcolor
void setcolor (int Цвет)
Задает цвет вывода текста (функции outtextxy и outtext), вычерчивания линий и фигур (функции line, circle, recktangle и др.). В качестве параметра "Цвет" обычно используют именованную константу (табл. 12) setfillstyle
void setfillstyle (int Стиль, int Цвет)
Устанавливает стиль и цвет заливки (закрашивания), используемый функциями вывода областей (bar, bar3d, sector и др.). В качестве параметра "Стиль" обычно используют одну из именованных констант, список которых приведен в табл. 13. Параметр "Цвет" также задается именованной константой setlinestyle
void setlinestyle (int Тип Линии, int Образец, int Толщина)
Устанавливает стиль вычерчиваемых контуров и линий. Параметр "Тип Линии", в качестве которого обычно используется одна из перечисленных в табл. 14 именованных констант, определяет вид линии. Параметр "Толщина" определяет толщину линии. Линия может быть обычной толщины (константа (NORM_WIDTH) или утолщенная (константа THICK_WIDTH). Параметр "Образец" используется в том случае, если функция setlinestyle устанавливает тип линии, определяемый программистом. Значением параметра "Образец" должна быть четырехразрядная шестнадцатеричная константа, кодирующая отрезок линии длиной в 16 пикселов settexstyle
void settexstyle (int Шрифт. int Ориентация, int Размер)
Устанавливает шрифт, размер и ориентацию текста, выводимого функциями outtextxy и outtext. В качестве параметра "Шрифт" можно использовать одну из перечисленных в табл. 15 констант. В шрифтах, отличных от стандартного (DEFAULT_FONT), букв русского алфавита нет. Параметр "Ориентация" задает ориентацию текста, выводимого функциями outtext и outtextxy. Текст может быть ориентирован обычным образом (значение параметра "Ориентация" в этом случае должно быть равно именованной константе HORIZ_DIR) или вертикально, снизу вверх (в этом случае значение параметра "Ориентация" должно быть равно VERT_DIR)
25
Параметры функции setcolor приведены в табл. 12. Таблица 12 Kонстанта
Цвет
Значение константы
Черный
BLACK
1
Синий
BLUE
2
Зеленый
GREEN
3
Бирюзовый
CYAN
4
Kрасный
RED
5
Сиреневый
MAGENTA
6
Kоричневый
BROWN
7
Светло-серый
LIGHTGRAY
8
Серый
DARKGRAY
9
Голубой
LIGHTBLUE
10
Светло-зеленый
LIGHTGREEN
11
Светло-бирюзовый
LIGHTCYAN
12
Алый
LIGHTRED
13
Светло-сиреневый
LIGHTMAGENTA
14
Желтый
YELLOW
15
Белый (яркий)
WHITE
16
Параметры функции setfillstyle приведены в табл. 13. Таблица 13 Kонстанта
Стиль заполнения области
EMPTY_FILL
Без заливки (сплошная заливка цветом фона)
SOLID_FILL
Сплошная заливка текущим цветом
LINE_FILL
Горизонтальная штриховка
LTSLASH_FILL
Штриховка под углом 45??влево тонкими линиями
SLASH_FILL
Штриховка под углом 45? влево
BKSLASH_FILL
Штриховка под углом 45??вправо тонкими линиями
LTBKSLASH_FILL
Штриховка под углом 45??вправо
HATCH_FILL
Штриховка клеткой
XHATCH_FILL
Штриховка под углом 45??редкой косой клеткой
26
Окончание табл. 13 Стиль заполнения области
Kонстанта
XHATCH_FILL
Штриховка под углом 45??редкой косой клеткой
INTERLEAVE_FILL
Штриховка под углом 45??частой косой клеткой
WIDEDOT_FILL
Заполнение редкими точками
CLOSEDOT_FILL
Заполнение частыми точками
USER_FILL
Тип заполнения определяется программистом
Параметры функции setlinestyle приведены в табл. 14. Таблица 14 Kонстанта
Тип линии
SOLID_LINE
Сплошная, непрерывная
CENTER_LINE
Штрихпунктирная линия
DASHED_LINE
Пунктирная, длина штрихов чуть больше, чем линии типа DOTTED_LINE
USERBIT_LINE
Определенный программистом тип линии
Параметры функции settextstyle приведены в табл. 15. Таблица 15 Kонстанта
Шрифт
Значение
DEFAULT_FONT
0
Стандартный. Kаждый выводимый символ формируется в квадрате размером 8? 8 пикселов
TRIPLEX_FONT
1
Шрифт Triplex
SMALL_FONT
2
Мелкий
SANSSERIF_FONT
3
Шрифт SansSerif
GOTHIC_FONT
4
Готический
2. ПОРЯДОК ВЫПОЛНЕНИЯ ЛАБОРАТОРНОЙ РАБОТЫ Составление программы моделирования работы преобразователя сигнала состоит из этапов. 1. Ввод с клавиатуры исходных данных: – параметров преобразователя; – названий файлов входных и выходных значений. 27
2.Считывание исходных значений из файла в массив. 3.Формироование массива результирующих значений согласно вариантам заданий, приведенным в табл. 16. 4. Вычисление параметров результирующих значений. 5. Запись массива результирующих значений в файл. 6. Построение графиков входных и выходных значений. 7. Формирование структуры, содержащей результаты расчетов. 3. СОДЕРЖАНИЕ ОТЧЕТА 1. Цель работы. 2. Блок-схема алгоритма моделирования работы преобразователя сигнала. 3. Листинг программы моделирования работы преобразователя сигнала. 4. Результаты расчетов. 5. Выводы. 4. ВАРИАНТЫ ЗАДАНИЙ Таблица 16 12
32
3k 1 x, если x 2 0 2 y45 60 – иначе
3k 1 x, если x 7 0 2 y45 60 – иначе
42
52
3 x , если 8 5 9 x 9 5 2 y45
60 – иначе
3 0, если 8 5 9 x 9 5 2 y45
6 x – иначе
62
72
3max(x), если x 7 0 2 y45 6x – иначе
3min(x), если x 9 0 2 y45 6x – иначе
82
92
3sin(x), если x 7 0 2 y45 6x – иначе
3ln(x), если x 7 0 2 y45 6x – иначе
2
12
3min(x) x, если x 2 0 2 y45 60 – иначе
3max(x) 8 x, если x 7 0 2 y45 60 – иначе
112
132
3 8k 1 x, если x 2 0 2 y45 60 – иначе
38k 1 x, если x 7 0 2 y45 60 – иначе
28
Окончание табл. 16 123
143
52 x , если 3 1 4 x 4 1 3 y67 510 – иначе
250, если 3 1 4 x 4 1 3 y67 51 x – иначе
153
163
2max(x), если x 8 0 3 y67 1 3x – иначе
2min(x), если x 4 0 3 y67 13x – иначе
173
183
2sin(x), если x 8 0 3 y67 1 3x – иначе
2ln(x), если x 8 0 3 y67 13x – иначе
193
3
2min(x) 3 x, если x 9 0 3 y67 10 – иначе
2max(x) x, если x 8 0 3 y67 10 – иначе
1
Библиографический список 1. Березин Б. И., Березин С. Б. Начальный курс С и С++. М.: ДиалогМИФИ, 2000. 288 с. 2. Касаткин А. И., Вальвачев А. Н. Профессиональное программирование на языке Си: от Turbo C к Borland C++. М.: Высш. шк., 1992. 240 с. 3. Культин Н. Б. С/С++ в задачах и примерах. СПб.: БХВ-Петербург, 2002. 288 с. 4. Нейбауэр А. Моя первая программа на С/С++. СПб.: «Питер», 1995. 398 с. 5. Прокушев Л. А. Программирование на языке высокого уровня. Метод. указания к выполнению лабораторных работ. СПб.: СПбГУАП, 2002. 68 с.
29
Ñîäåðæàíèå Предисловие ......................................................................... 1. ОСНОВЫ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ С/С++ ............... 1.1. Описание языков программирования С/С++ ...................... 1.2. Структура программы на С/С++ ...................................... 1.3. Представление данных в С/С++ ....................................... 1.4. Ввод и вывод в С/С++ .................................................... 1.5. Операции в С/С++ ........................................................ 1.6. Операторы ветвления .................................................... 1.7. Операторы цикла .......................................................... 1.8. Массивы и строки ......................................................... 1.9. Структуры в С/С++ ...................................................... 1.10. Работа с файлами в С/С++ ........................................... 1.11. Использование функций в С/С++ .................................. 1.12. Функции графического режима ..................................... 2. ПОРЯДОК ВЫПОЛНЕНИЯ ЛАБОРАТОРНОЙ РАБОТЫ ......... 3. СОДЕРЖАНИЕ ОТЧЕТА ................................................... 4. ВАРИАНТЫ ЗАДАНИЙ .................................................... Библиографический список ....................................................
30
3 3 3 4 5 7 10 11 12 13 16 17 19 21 28 28 29 30