Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие_2_изд_испр.doc
Скачиваний:
4
Добавлен:
01.05.2025
Размер:
2 Мб
Скачать
☆

Вопросы для самопроверки и контроля Вопросы для самопроверки

  1. Что такое блок?

  2. Есть ли в языке Basic главная процедура?

  3. В каком языке не определено понятие подпрограммы?

  4. Что такое указатель на функцию?

  5. Чем являются выходные скалярные параметры в языке C?

  6. Что передается в вызываемую процедуру, если аргумент – имя массива?

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

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

  2. Что является минимальным элементом структуры программы в языке C?

  3. Зачем нужны процедуры?

  4. В чем отличие передачи аргументов по значению от передачи по адресу?

  5. Перечислите различия в инструкциях возврата значения функции в языках Basic и C.

6. Является ли возвращаемое значение функции выходным параметром?

8. Препроцессор

Этот раздел касается только языков C и C++. Препроцессор – это специальная программа, обрабатывающая текст приложения до этапа его трансляции. Основные функции: определение символических констант и включение файлов. В отличие от инструкций управляющие конструкции препроцессора называют директивами (признак директивы: символ "#" в первой позиции). Действие директивы (область действия) распространяется до конца файла, содержащего текст программы (если не встретится специальная отменяющая директива). Директивы могут располагаться в произвольном месте программы.

8.1. Определение символических констант

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

Пример.

PI=3.141593 TAB_SIZE=100

Стиль записи: принято записывать символические константы прописными буквами. В примере с вычислением квадратичной формы замена размера массивов, равного 4, на константу SIZE позволяет при модификации программы сделать изменение размера в одном месте.

Формат директивы определения символической константы:

#define <имя> <постоянное_выражение>

Пример.

#define PI 3.141593

#define EOF (-1)

#define PI2 (2*PI)

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

Пример.

а) #define E (5+10)

б) #define E 5+10

Подстановка 2*E в случае б) даст ошибку.

Некоторые определения.

Макроопределение – определение имени с помощью директивы #define.

Макроподстановка – замена имени в тексте программы на значение соответствующей константы.

Макровызов – появление имени символической константы в тексте.

Макросредства или макросы – средства, реализующие макроподстановки.

Пример.

#define SIZE 10

...............

float maxmatr(float a[ ][SIZE], int *k, int *l){

…………..

}

8.2. Включение файлов в текст программы

Файл – любая совокупность данных, имеющая отдельную спецификацию и включенная в каталог (папку) операционной системы. Формат спецификации: <имя>.<тип (расширение)>

Принятые по умолчанию типы файлов для языков C и C++:

.c - исходный текст на языке C,

.cpp - исходный текст на языке C++,

.obj - объектный (оттранслированный) модуль,

.exe - загрузочный (выполняемый) модуль,

.h - заголовочный (header) файл.

Включение файла в текст программы выполняется с помощью директивы вида:

#include {"<спецификация_файла>"|<<спецификация_файла>>}

Пример.

#include <stdio.h>

#include "my.h"

Обычно в текст программы включают другие программные файлы (.c или .cpp) или заголовочные (.h) файлы. В заголовочные файлы принято включать общие для различных процедур символические константы, прототипы функций, другие описания и определения. Очень много .h файлов входят в состав транслятора, например, stdio.h описывает стандартный пакет библиотечных функций ввода-вывода, в частности функции scanf и printf, math.h содержит прототипы всех библиотечных математических функций.

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

Теперь приведем в качестве примера законченную работоспособную программу.

#include <stdio.h>

#define SIZE 4

/*******************************************************/

/* ВЫЧИСЛЕНИЕ КВАДРАТИЧНОЙ ФОРМЫ */

/******************************************************/

void main(void){

float u[SIZE], /* Входной вектор */

b[SIZE][SIZE], /* Входная матрица */

v[SIZE], /* Вектор b*u */

z, /* Результат */

scalar(float [ ], float [ ]); /* Скалярное произведение векторов */

int i, j;

void matrix(float [ ][SIZE], float [ ], float [ ]);

printf("Исходный вектор:\n");

for(i=0; i<SIZE; i++){

scanf("%f", &u[ i ]);

}

printf("Исходная матрица:\n");

for(i=0; i<SIZE; i++){

for(j=0; j<SIZE; j++){

scanf("%f", &b[ i ][ j ]);

}

}

matrix(b, u, v );

z=scalar(v, u );

printf("\n\n\nКвадратичная форма равна %.5g\n", z);

}/* End main */

/* Умножение матрицы на вектор */

void matrix(float a[ ][SIZE], float x[ ], float y[ ]){

int i, j;

for(i=0; i<SIZE; i++){

for(y[ i ]=j=0; j<SIZE; j++){

y[ i ]+=a[ i ][ j ]*x[ j ];

}

}

}/* End matrix */

/* Скалярное произведение векторов */

float scalar(float x[ ], float y[ ]){

int i;

for(z=i=0; i<SIZE; i++){

z+=x[ i ]*y[ i ];

}

return z;

}/* End scalar */

Вопросы для самопроверки и контроля

Вопросы для самопроверки

  1. С какой позиции записываются директивы препроцессора?

  2. Какова область действия директивы?

  3. Можно ли обойтись без директивы #include в языке C?

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

  1. Что такое препроцессор?

  2. В чем выгода применения директивы #define?

  3. В каких заголовочных файлах находятся прототипы математических функций и функций ввода-вывода?

9. СТИЛЬ ПРОГРАММИРОВАHИЯ

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

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