- •2. Структура программы
- •2.1. Объявление переменной
- •2.1.1. Константы
- •2.1.2. Объявление typedef
- •2.2. Объявление и определение функции
- •2.2.1. Встраиваемые функции
- •2.2.2. Параметры функций по умолчанию
- •2.2.3. Параметры программы
- •2.2.4. Функции с переменным числом параметров
- •2.3. Препроцессор
- •2.3.1. Включение файлов
- •2.3.2. Макроподстановки
- •2.3.3. Условная компиляция
- •3. Пример
- •Первый вариант – обычный способ
- •Второй вариант – как на Паскале
- •Третий вариант – весь алгоритм помещен в заголовок цикла for
- •3.2. Функция с переменным числом параметров, аналогичная функции printf
- •Тема 1.1. Структура программы. Типы данных
Второй вариант – как на Паскале
#include <cstdio> #include <math.h>
void main() { double a, b, e, x, c, fa, fc; int n;
printf("Введите границы отрезка и точность: "); scanf("%lf%lf%lf", &a, &b, &e); n = 0; while (fabs(a - b) > e) { c = (a + b) / 2; fa = f(a); fc = f(c); if (fa * fc < 0) b = c; else a = c; n++; } x = (a + b) / 2; printf("Корень уравнения = %lf\nЧисло итераций = %d\n", x, n); }
|
Третий вариант – весь алгоритм помещен в заголовок цикла for
#include <cstdio> #include <math.h>
void main() { double a, b, e, x, c, fa, fc; int n;
printf("Введите границы отрезка и точность: "); scanf("%lf%lf%lf", &a, &b, &e); for (n = 0; fabs(a - b) > e; c = (a + b) / 2, fa = f(a), fc = f(c), fa * fc < 0 ? b = c : a = c, n++) ;
x = (a + b) / 2; printf("Корень уравнения = %lf\nЧисло итераций = %d\n", x, n); } |
// Для объединения нескольких операторов // в выражении приращения цикла for используется // операция последовательного вычисления |
3.2. Функция с переменным числом параметров, аналогичная функции printf
#include <cstdio> #include <stdarg.h>
void print(char *format, ...);
void main() { int a = 45, b = 87; double f = 2.75;
print("dfd", a, f, b); }
void print(char * format, ...) { va_list list; int n, i; double f;
va_start(list, format); for (i = 0; format[i]; i++) switch(format[i]) { case 'd': n = va_arg(list, int); printf("%d\n", n); break; case 'f': f = va_arg(list, double); printf("%lf\n", f); break; } va_end(list); }
|
// Переменная для работы со списком аргументов
// Инициализация указателя на список аргументов
// Выбираем очередной параметр
// Выбираем очередной параметр
// Сброс указателя на список аргументов в NULL
|
1.1. Структура программы на языке С++
Любая программа на языке С++ представляет собой одну или несколько функций. В любой программе обязательно должна быть одна функций main(). C этой функции начинается выполнение программы. Правилом хорошего тона в программировании является разбиение задачи на подзадачи, и в главной функции чаще всего должны быть операторы вызова других функций. Общую структуру любой программы на языке Си можно записать следующим образом. Объявление глобальных переменных Тип_ результата main(Список_переменных) { Операторы } Тип_результата f1(Список_переменных) { Операторы } Тип_результата f2(Список_переменных) { Операторы } ... Тип_результата fn(Список_переменных) { Операторы } Здесь Тип_результата - тип возвращаемого функцией значения. В простейшем случае программа на языке Си состоит из одной функции main, в этом случае структура программы будет такой. int main() { Операторы }
1.2. Пример простейшей программы на языке С++
Перед тем, как перейти к подробному изложению основ языка, рассмотрим пример программы на С++. Задача № 1.1. Известны длины двух катетов прямоугольного треугольника. Найти длину гипотенузы, площадь прямоугольника и величины его углов. #include <stdio.h> #include <math.h> int main() { float a,b,c, alf,bet,s; printf("A="); scanf("%f",&a); printf("B="); scanf("%f",&b); s=a*b/2; c=pow(a*a+b*b,0.5); alf=atan(a/b); bet=3.14159/2-alf; printf("\n A=%5.2f \t B=%5.2f \t C=%5.2f \n",a,b,c); printf("\nS=%5.2f \t alf=%3.0f \t bet=%3.0f\n", s,alf*180/3.14159,bet*180/3.14159); } Листинг 1.1. Рассмотрим подробно текст программы. Строки 1-2. Указывают компилятору (а точнее препроцессору), что надо использовать функции из библиотек, stdio.h и math.h. В данном случае они необходимы для выполнения операторов ввода scanf и вывода printf (stdio.h) и математических функций возведения в степень pow и вычисление арктангенса atan (math.h). Строка 5. Описание вещественных переменных a,b,c,alf,bet,s. Строка 6. Оператор вывода строки символов А=. Строка 7. Оператор ввода вещественного числа a. В этом операторе (а точнее в функции scanf) должны быть два параметра:
строка, в которой указывают типы вводимых переменных, перед кодом типа должен быть символ %; символ f используется для указания вещественного типа, d – для целого типа;
список адресов вводимых переменных, для вычисления адреса переменной используется символ &.
Строка
8.
Оператор вывода строки символов B=.
Строка
9.
Оператор ввода вещественного числа
b.
Строка
10.
Оператор присваивания для вычисления
площади треугольника по формуле
.
В операторе присваивания могут
использоваться знаки операций: +,
-, *, /.
Строка
11.
Оператор присваивания для вычисления
гипотенузы с использованием теоремы
Пифагора. Функция pow(x,y)
используется в Си для вычисления
xy.
Строка
12-13.
Операторы присваивания для вычисления
углов α и β по формулам
.
Строки
14-15.
Функции вывода результатов на экран. В
функции вывода printf
должны быть два параметра:
строка вывода, в которой вместо выводимых переменных указываются их типы, между символом % и кодом формата можно указывать формат вывода, который в случае вывода вещественных чисел имеет вид m.n (m - количество позиций в числе, n – количество позиций в дробной части числа); в строке вывода могут использоваться можно поставить знаки: \n перевод строки, \t – табуляция.
список выводимых переменных.
Строка комментариев в Си начинается символами //. Мы рассмотрели простейшую программу на языке С++, состоящую из операторов ввода данных, операторов присваивания (в которых происходит расчет по формулам) и операторов вывода. Рассмотренные в первой программе операторы ввода-вывода являются операторами классического C, в дальнейшем мы рассмотрим и операторы С++. Рассмотрим основные этапы обработки программы на языке С++ и формирования машинного кода.
Сначала программа обрабатывается препроцессором, который выполняет директивы препроцессора, в нашем случае это директивы включения заголовочных файлов (файлов с расширением h) - текстовых файлов, в которых содержится описание используемых библиотек. В результате формируется полный текст программы, который поступает на вход компилятора.
Компилятор разбирает текст программ на составляющие элементы, проверяет синтаксические ошибки и в случае их отсутствия формирует объектный код (файл с расширением obj).
Компоновщик подключает к объектному коду программы объектные модули библиотек и других файлов (если программа состоит из нескольких файлов) и генерирует исполняемый код программы (файл с расширением exe), который уже можно запускать на выполнение.
