скачать рефераты
  RSS    

Меню

Быстрый поиск

скачать рефераты

скачать рефератыУчебное пособие: Язык прораммирования С++

Учебное пособие: Язык прораммирования С++

Лекция 1. Структура программы

1. Простейшая программа на языке С++

Программа на языке С++, как и на уже знакомом вам Паскале, содержит две основные части:

объявление данных, с которыми будут производиться некоторые действия (вычисления, вывод на экран и т.п.);

операторную часть, которая задает последовательность действий, выполняемых с этими данными.

Объявление переменной содержит описание ее типа и имя переменной. Приведем примеры объявления.

Cтрока объявления

int R;

состоит из имени переменной R и служебного слова int, которое указывает, что в переменной R можно хранить целые числа.

В строке

float S;

тип данных задается служебным словом float, который указывает, что в переменной с именем S могут храниться вещественные числа то есть числа, которые могут содержать как целую, так и дробную часть. При записи вещественных чисел на Си целую и дробную часть можно разделять точкой (например, 1.25 – это одна целая двадцать пять сотых), а можно, как и в Паскале, использовать экспоненциальную форму записи.

Операторная часть программы обязательно содержит так называемую «главную функцию»:

void main(void)

{

}

Функция начинается с заголовка void main(void), вид которого пока можно просто запомнить. Между фигурными скобками находятся операторы программы, каждый из которых обязательно заканчивается точкой с запятой. Оператор задает действия, которые надо выполнить с одной или несколькими переменными.

 Объявления переменных могут размещаться как до главной функции, так и внутри нее, после фигурной скобки.

Рассмотрим пример первой программы на языке С++:

int R1;

int R2;

int Sum;

void main(void) {

R1=5;

R2=230;

Sum=3*R1+R2;

}

Можно считать, что при запуске программы ее работа начинается с выполнения первого из этих операторов оператора присваивания R1=5; При его выполнении в переменную R1 записывается число 5. Это число будет храниться в R1 до тех пор, пока какой-нибудь другой оператор не запишет туда другое число. Операторы выполняются один за другим в порядке их записи:

второй оператор занесет число 230 в R2;

при выполнении оператора Sum=3*R1+R2; вычислится арифметическое выражение 3*5+230 и полученное значение 245 запишется в переменную Sum. При записи арифметических выражений используются общепринятые обозначения операций: + сложение,- вычитание, * умножение и / деление как целых, так и вещественных чисел.

Рассмотрение первого примера закончим следующими замечаниями.

1. Язык С++ создан в результате развития языка С. Эти языки настолько близки, что рассмотренная выше программа выглядит одинаково на обоих языках. Для перехода от языка С++ к С достаточно изменить в исходном файле расширение СPP на C. Приведенный пример скомпилируется без ошибок тем же компилятором, но как программа на C. В дальнейшем мы будем считать, что изучаем язык C++, но будем указывать, какие из изучаемых элементов и синтаксических правил различны для С и С++.

2. Имя переменной – это последовательность букв и цифр, начинающаяся с буквы. Таким образом, Ab32 – это допустимое имя языка, а 1А недопустимое, т.к. начинается не с буквы. В С и С++ прописная и строчная буквы считаются различными, поэтому Ab32 и ab32 это разные имена двух разных переменных.

3. Несколько переменных одинакового типа можно объявить одной строкой, перечислив их через запятую, например,

int R1,R2;.

При объявлении переменных им можно сразу присваивать начальные значения:

int R1=10,R=21;.

Если значения не присвоены, и переменные, как в данном примере, объявлены вне главной функции, в них в начале работы программы хранятся нули. Если переменная объявляется без инициализации внутри функции, в ней может оказаться любое значение.

4. Как и в языке Паскаль, вещественные и целочисленные переменные имеют различное представление в памяти машины, но данные вещественных и целых типов совместимы по присваиванию. Это означает, что применение в программе оператора R1=2.51; не будет считаться ошибкой. Если в программе объявлена вещественная переменная

float V,

то можно выполнить присваивание R1=V1.

Замечание. Компилятор Visual С++, разработанный фирмой Microsoft, выводит в таких ситуациях предупреждение

warning C4244: '=': conversion from 'float' to 'int', possible loss of data

Компилятор BC.exe фирмы Borland не выводит даже предупредительных сообщений.

Если оператор присваивания

R1=V1

записывает в целочисленную переменную вещественное число, то компилятор автоматически организует вызов функции преобразования представления числа, которая получает целое число отбрасыванием дробной части вещественного. Таким образом, значение V1 равное 3.1, преобразуется в 3. Из 3.9 также будет получено число 3.

2. Вывод данных на экран

Рассмотренная выше первая программа производит вычисления, но не предусматривает задания человеком исходных данных с клавиатуры и вывода результатов на экран дисплея.

Для ввода исходных данных в программе можно использовать оператор вызова функции форматного ввода scanf(), а для вывода - оператор вызова функции форматного вывода printf().

В следующем примере при запуске программы на экран выводится приглашение «Ведите два числа», в ответ на которое человек должен набрать на клавиатуре два целых числа, разделив их пробелом или нажатием клавиши Enter. Программа вычисляет сумму и произведение этих чисел и выводит их на экран:

#include <stdio.h>

int Sum, Mul, R1,R2;

void main(void)

{ printf("Введите два числа ");

scanf(“ %d %d”, &R1,&R2);

Sum=R1+R2;

Mul=R1*R2;

printf(“Сумма равна %d Произведение равно %d”, Sum,Mul);

}

Рассмотрим пример более подробно.

Оператор printf("Введите два числа "); выводит на экран заключенную в кавычки строку текста. Эта строка задает формат вывода данных. Кроме обычного текста в строке формата могут присутствовать записанные после знака % латинские буквы d, f, i, s и другие.

В последнем операторе программы

printf(“Сумма равна %d Произведение равно %d”, Sum,Mul);

знаками % в строке отмечаются те места, где программа вставит в строку значения переменных, причем записанная после процента буква d указывает, что это будут целые числа. В этом же операторе после строки формата перечислены через запятую выводимые переменные. На месте первого процента будет выведено значение из переменной Sum, а на месте второго – из переменной Mul.

Кстати, то же самое средствами языка С++ можно записать компактнее с использованием операции вывода в поток:

cout<<“Сумма равна=”<< Sum <<”Произведение равно=”<<Mul;

Если в программе объявлена вещественная переменная, пусть

float fVar=3.5;,

то при выводе значения fVar на экран в строке формата после процента указывают букву f: printf(“ %f”,fVar);.

При вводе данных, как и при выводе, указывают строку формата и имена переменных, в которые занесутся введенные с клавиатуры значения. В операторе

Scanf (“ %d %d”, &R1,&R2);

из строки формата “ %d %d” видно, что далее будут указаны имена двух переменных целого типа. Следует только заметить, что перед именами переменных нужно записывать значки & - операции получения адреса.

Замечание.

Если в программе используются вызовы функций ввода-вывода (таких, как scanf() или printf()) то для их правильной обработки компилятором в программу надо включить строку #include <stdio.h>.

Для использованием операции ввода и вывода в поток необходимо вставить в программу следующую строку:

#include <iostream.h>

В интегрированной среде Си есть подкаталог include, в котором находятся текстовые файлы с расширением h. Они называются заголовочными файлами, среди них находится и файл stdio.h. Перед компиляцией исходный текст программы на языке Си просматривается специальной программой, которая называется препроцессором.

Встретив строку #include <stdio.h> препроцессор находит на диске файл stdio.h и включает его целиком в нашу программу вместо этой строки. А уже после этого файл обрабатывается компилятором и переводится в машинные коды.

Если просмотреть содержимое файла stdio.h, в нем можно найти строки

int _Cdecl printf(const char _FAR *__format,...);

int _Cdecl scanf (const char _FAR *__format,...);,

ради которых stdio.h был включен в исходный текст программы.

Это так называемые прототипы функций, которые нужны компилятору, чтобы правильно сформировать вызовы функций printf() и scanf(). Кроме них stdio.h содержит константы, описания типов данных, прототипы других функций, применяемых при стандартном вводе или выводе данных. (Потому он так и называется – сокращение от standard input output).

3. Стандартные функции

При составлении выражений в языке Си используется много разнообразных стандартных функций. Как мы помним, функция – это записанная отдельно от основного текста часть программы, которая вызывается оператором вызова функции – записывается имя функции, после которого в скобках записываются фактические параметры (значения аргументов функции). Так, если в программе объявлены переменные

float Res,V1=9;

то в арифметических выражениях можно использовать вызов функций вычисления синуса sin(V1), косинуса cos(V1) квадратного корня sqrt(V1) и пр. При выполнении оператора

Res = 2*sqrt(V1);

вычисляется квадратный корень изV1 - вещественное число 3, умножится на два и результат запишется в переменную Res. То есть, при вызове функции вычисляется ее значение (принято говорить, что функция возвращает вычисленное значение в ответ на вызов) и это значение используется в выражении как обычная переменная.

При составлении программы можно использовать вызовы:

log(V1) – вычисления натурального логарифма,

log10(V1) – вычисления десятичного логарифма,

exp(V1) – вычисления показательной функции с основанием e,

asin(V1), atan(V1) – вычисления арксинуса и арктангенса.

При использовании прямых и обратных тригонометрических функций угол задается и получается в радианах.

Функция может иметь несколько параметров. Например, функция atan2(y,x), которой передается два вещественных аргумента, вычисляет арктангенс угла, лежащего в прямоугольном треугольнике с катетами x,y против стороны y, причем второй аргумент x может быть равным нулю (при этом арктангенс будет равен π/2).

Прототипы математических функций находятся в заголовочном файле math.h. Если программа использует вызовы стандартных математических функций, то для их правильной обработки компилятором в программу надо включить строку

#include <math.h>.

Вспомним, что по умолчанию компилятор преобразует вещественное число в целое отбрасыванием дробной части Если программисту необходим другой способ округления, он должен включить в свою программу заголовочный файл с прототипами математических функций и вызвать функцию округления вещественного числа с недостатком

R1=floor(V1); или с избытком r=ceil(S);.

Для округления до ближайшего целого нет стандартной функции, но можно выполнить оператор

R1=floor(V1+0.5);

Как и в Паскале, можно узнать, сколько байтов требуется для хранения переменной, применив к ней операцию sizeof(). Объявим переменные

int A,B;

float C;

Операторы

A=sizeof(int);

A=sizeof(B);

дадут одинаковый результат – размер переменной типа int.

Оператор A=sizeof(C); запишет в A число 4 – размер переменно типа float.

4. Реализация функций в тексте программы

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

Любая функция, как и главная функция main() состоит из заголовка и заключенного в фигурные скобки тела функции. Пусть, например, нам необходима функция area (l,w) вычисления площади прямоугольного участка по его длине l и ширине w. Эта функция может быть реализована следующим образом

float area(int x, int y)

{float s;

s= x*y;

return s;

}

Заголовок состоит из имени функции, после которого следует заключенный в скобки список формальных параметров (в данном случае это целочисленные параметры int x и int y). Перед именем функции указывается тип возвращаемого функцией значения. В данном примере слово float указывает, что функция вычислит площадь в виде вещественного, а не целого числа.

В фигурных скобках, как и в главной функции, находятся объявления переменных и операторы, реализующие вычисление функции. Вычисления должны обязательно заканчиваться оператором return, возвращающим вычисленное значение. В данном примере оператор возвращает значение, помещенное в переменную s. Но вместо переменной можно также записывать выражение, например, приведенную выше функцию можно было реализовать так:

float area(int x, int y)

{return x*y;

}

В функции main мы использовали обозначение void и вместо возвращаемого значения и вместо списка параметров – это тоже тип данных, не знаю, как его лучше называть, то ли пустой, то ли неопределенный это пустые, не имеющие значения данные. Неизвестно даже, сколько байтов нужно для их хранения – поэтому и объявить переменную типа void нельзя. Этот тип указывают как раз там, где обычно ожидают какого-нибудь значения, а его нет. То есть, заголовок void main(void), указывает, что функция main не получает параметров и не возвращает значения. (На Паскале такая конструкция называлась бы процедурой без параметров). Поместим вызов нашей функции в главную программу:

void main(void)

{float A,B;

int b,R;

b = 4;

A = area(5,b);

B = area(20,30);

}

При выполнении программы сначала оператором b=4; в переменную b занесется число четыре. Следующий оператор вызовет вычисление функции area (5,b); для того, чтобы записать ее значение 25 в переменную A.

Выполнение операции вызова функции area(5,b) заключается в следующем:

– программа перестает выполнять операторы главной функции main() и переходит к выполнению функции area(), при этом ей передаются указанные при вызове значения параметров – в параметр x запишется число 5, а в параметр y значение переменной b – число четыре;

– выполняется первый оператор, записанный в теле функции area(), то есть строка s= x*y;. При этом функция вычислит произведение 5*4 и запишет его в переменную s.

– у нас очень короткая функция, но в общем случае операторы функции выполняются до тех пор, пока не встретится оператор выхода из функции return;

– в этом операторе после слова return помещается выражение, определяющее значение функции. Выполнение оператора заключается в вычислении выражения и возврате в то место, откуда функция вызывалась, но уже с результатом значением функции.

Как видим, из описания самой функции нельзя увидеть, чему равны параметры x и y. Они потому и называются формальными, что получают фактические значения только во время выполнения программы – в момент вызова функции. Так, при следующем вызове B=area(20,30); формальные параметры x и y получат значения 20 и 10. Как мы помним из предыдущих глав, процедуры и функции тем и хороши, что позволяют проделывать одни и те же действия, но с разными исходными данными.

Страницы: 1, 2, 3, 4


Новости

Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

  скачать рефераты              скачать рефераты

Новости

скачать рефераты

© 2010.