Лекции. Основные понятия и определения
Скачать 1.94 Mb.
|
Вопросы для самопроверки и контроляВопросы для самопроверки1. Что такое блок? 2. Есть ли в языке Basic главная процедура? 3. В каком языке не определено понятие подпрограммы? 4. Что такое указатель на функцию? 5. Чем должны являться выходные скалярные параметры в языке C? 6. Что передается в процедуру, если аргумент – имя массива? Контрольные вопросы1. Чем отличается статическое и динамическое распределение памяти? 2. Что является минимальным элементом структуры в языке C? 3. Зачем нужны процедуры? 4. Укажите отличия передачи аргументов по значению и по адресу. 5. Перечислите различия в инструкциях возврата значения функции в языках Basic и C. 6. Является ли возвращаемое значение функции выходным параметром? 7. Что такое делегат и для чего он нужен? 8. ПРЕПРОЦЕССОРПрепроцессор – это специальная программа, обрабатывающая текст приложения до этапа его трансляции. Основные функции: определение символических констант и включение файлов. В отличие от инструкций управляющие конструкции препроцессора называют директивами. Директивы могут располагаться в произвольном месте программы. 8.1. Определение символических константСимволической(именованной) константой называют имя в тексте программы, которое должно быть заменено на конкретное постоянное значение до трансляции. Их применение позволяет сократить текст программы и сделать ее более ясной. Обычно это некоторые общеупотребительные константы, такие как: π, e и т.п., а также константы, которые могут измениться при модификации программы. Пример. PI=3.141593 TAB_SIZE=100 Признаком директивы является префикс #.Стиль записи: принято записывать символические константы прописными буквами. Область действия директивы: от места ее определения до конца файла исходного кода или отменяющей директивы препроцессора (здесь не рассматривается). С Формат директивы определения символической константы: #define <имя> <постоянное выражение> Пример. #define PI 3.141593 #define EOF (-1) #define PI2 (2*PI) Значение константы желательно заключать в скобки, поскольку при подстановке возможны ошибки. Пример. а) #define E (5+10) б) #define E 5+10 Подстановка 2*E в случае б) даст ошибку. Некоторые определения. Макроопределение – определение имени с помощью директивы #define. Макроподстановка – замена имени в тексте программы на значение соответствующей константы. Макровызов – появление имени символической константы в тексте. Макросредства или макросы – средства, реализующие макроподстановки. Пример. При вычислении квадратичной формы замена размера массивов, равного 4 или 30, на константу SIZE позволяет при модификации программы сделать изменение размера в месте ее объявления, т.е. не будет необходимости поиска и замены всех вхождений данного размера в текст модуля. #define SIZE 30 ............... float matrix(int m, float a[ ][SIZE], float x[ ], float y[ ]){ ………….. } Basic Здесь также существует директива, выполняющая аналогичные функции. Ее формат: #Const <имя>=<постоянное выражение> Пример. #Const PI=3.141593 #Const LEN_A=300 #Const LEN_B=300 #Const LEN_C=( LEN_A+ LEN_B) 8.2. Включение файлов в текст программыФайл – любая совокупность данных, имеющая отдельную спецификацию и включенная в каталог (папку) операционной системы. Формат спецификации: <имя>.<тип (расширение)> Принятые по умолчанию типы файлов: .c - исходный текст на языке C, .cpp - исходный текст на языке C++, .vb - исходный текст на языке Visual Basic.NET, .obj - объектный (оттранслированный) модуль, .exe - загрузочный (выполняемый) модуль, .h - заголовочный (header) файл. C Включение файла в текст программы выполняется с помощью директивы вида: #include {“<спецификация файла>"|<<спецификация файла>>} Пример. #include #include "my.h" Обычно в текст программы включают заголовочные (.h) файлы. В заголовочные файлы принято включать общие для различных процедур символические константы, прототипы функций, другие описания и определения. Очень много .h файлов входят в состав транслятора. Например, stdio.h описывает стандартный пакет библиотечных функций ввода-вывода, в частности функции scanf и printf, math.h содержит прототипы всех библиотечных математических функций, coniow.h – прототипы упоминавшихся выше функций консольного ввода-вывода. В директиве заключение спецификации файла в "..." предписывает искать включаемый файл в папке, где находится вызов программы, а в случае его ненахождения там в определенных в среде разработки папках. Применение для этой цели <...> выполняет поиск файла в папках, определенных в среде разработки. Теперь приведем в качестве примера законченную работоспособную программу. #include #define SIZE 30 #define ESC 27 /*******************************************************/ /* ВЫЧИСЛЕНИЕ КВАДРАТИЧНОЙ ФОРМЫ */ /*******************************************************/ int main( ){ float u[SIZE], // Входной вектор b[SIZE][SIZE], // Входная матрица v[SIZE], // Вектор b*u scalar(int, float [ ], float [ ]);// Скалярное произведение векторов int m, // Размер массивов i, j; bool fl; // true-неправильный ввод void matrix(int, float [ ][SIZE], float [ ], float [ ]); // Умножение матрицы на вектор do{ fl=true; while(fl){ clrscr(); printf("Размер матрицы:"); scanf("%d",&m); if(m<1||m>SIZE){ printf("Размер матрицы должен быть в диапазоне[1:%d]\n", SIZE); getch(); }else fl=false; } printf("Исходный вектор:\n"); for(i=0; i scanf("%f", &u[ i ]); } printf("Исходная матрица:\n"); for(i=0; i for(j=0; j scanf("%f", &b[ i ][ j ]); } } matrix(m, b, u, v ); printf("\n\nКвадратичная форма равна %.5g\n", scalar(m, v, u )); printf(“\nEsc – выход из программы, продолжение – любая клавиша\n”); while(getch( ) !=ESC); }// End main /* Умножение матрицы на вектор */ void matrix(int m, float a[ ][SIZE], float x[ ], float y[ ]){ int i, j; for(i=0; i for(y[ i ]=j=0; j y[ i ]+=a[ i ][ j ]*x[ j ]; } } }// End matrix /* Скалярное произведение векторов */ float scalar(int m, float x[ ], float y[ ]){ int i; for(z=i=0; i z+=x[ i ]*y[ i ]; } return z; }// End scalar Basic. В препроцессоре этой среды разработки существует похожая директива, но ее применение ограниченно и здесь не рассматривается. |