Реферат по предмету "Информатика, программирование"


Язык прораммирования С++

Лекция1. Структура программы
1. Простейшаяпрограмма на языке С++
Программа на языке С++, как и на ужезнакомом вам Паскале, содержит две основные части:
объявление данных, с которыми будутпроизводиться некоторые действия (вычисления, вывод на экран и т.п.);
операторную часть, которая задаетпоследовательность действий, выполняемых с этими данными.
Объявление переменной содержитописание ее типа и имя переменной. Приведем примеры объявления.
Cтрока объявления
intR;
состоит из имени переменной R и служебного слова int, которое указывает, что в переменнойR можно хранить целые числа.
В строке
floatS;
тип данных задается служебным словом 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. Несколько переменных одинакового типа можнообъявить одной строкой, перечислив их через запятую, например,
intR1,R2;.
При объявлении переменных им можносразу присваивать начальные значения:
intR1=10,R=21;.
Если значения не присвоены, ипеременные, как в данном примере, объявлены вне главной функции, в них в началеработы программы хранятся нули. Если переменная объявляется без инициализациивнутри функции, в ней может оказаться любое значение.
4. Как и в языке Паскаль, вещественные и целочисленныепеременные имеют различное представление в памяти машины, но данные вещественных и целых типов совместимыпо присваиванию. Это означает, что применение в программе оператора R1=2.51; не будет считаться ошибкой.Если в программе объявлена вещественная переменная
floatV,
то можно выполнить присваивание 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
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.
Кстати, то же самое средствами языкаС++ можно записать компактнее с использованием операции вывода в поток:
coutSumMul;
Если в программе объявленавещественная переменная, пусть
float fVar=3.5;,
то при выводе значения fVar на экран в строке формата после процентауказывают букву f: printf(“ %f”,fVar);.
При вводе данных, как и при выводе,указывают строку формата и имена переменных, в которые занесутся введенные склавиатуры значения. В операторе
Scanf (“ %d %d”, &R1,&R2);
из строки формата “ %d %d” видно, что далее будут указаны имена двух переменных целоготипа. Следует только заметить, что перед именами переменных нужно записыватьзначки & — операции получения адреса.
Замечание.
Если в программе используются вызовыфункций ввода-вывода (таких, как scanf()или printf()) то для их правильной обработкикомпилятором в программу надо включить строку #includestdio.h>.
Дляиспользованием операцииввода и вывода в поток необходимо вставить в программу следующую строку:
#includeiostream.h>
В интегрированной среде Си естьподкаталог include, в котором находятся текстовые файлыс расширением h. Они называются заголовочнымифайлами, среди них находится и файл stdio.h. Перед компиляцией исходный текстпрограммы на языке Си просматривается специальной программой, котораяназывается препроцессором.
Встретив строку #include препроцессор находит на диске файл stdio.h и включает его целиком в нашупрограмму вместо этой строки. А уже после этого файл обрабатываетсякомпилятором и переводится в машинные коды.
Если просмотреть содержимое файла stdio.h, в нем можно найти строки
int _Cdecl printf(constchar _FAR *__format,...);
int _Cdecl scanf (constchar _FAR *__format,...);,
ради которых stdio.h былвключен в исходный текст программы.
Это так называемые прототипы функций,которые нужны компилятору, чтобы правильно сформировать вызовы функций printf() и scanf(). Кроме них stdio.hсодержит константы, описания типов данных, прототипы других функций,применяемых при стандартном вводе или выводе данных. (Потому он так иназывается – сокращение от standard input output).
3. Стандартные функции
При составлении выражений в языке Си используется много разнообразных стандартныхфункций. Как мы помним, функция – это записанная отдельно от основного текстачасть программы, которая вызывается оператором вызова функции – записываетсяимя функции, после которого в скобках записываются фактические параметры(значения аргументов функции). Так, если в программе объявлены переменные
floatRes,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 .
Вспомним, что по умолчанию компиляторпреобразует вещественное число в целое отбрасыванием дробной части Еслипрограммисту необходим другой способ округления, он должен включить в своюпрограмму заголовочный файл с прототипами математических функций и вызватьфункцию округления вещественного числа с недостатком
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)
{returnx*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. Как мы помним из предыдущих глав, процедуры и функциитем и хороши, что позволяют проделывать одни и те же действия, но с разнымиисходными данными.
Замечание. Когда компилятор переводитстроки языка С++ в машинные коды, он, как и мы, просматривает программу сверхувниз. Поэтому, к моменту вызова функции area() он уже обработал описание функции и знает, чтофункция должна получать в качестве параметров два целых числа и возвращатьвещественный результат. Поэтому если вставить в программу операторы
R=area(20,30,70);
B=area(2.5,10);
компилятор распознает в них ошибкипрограммиста. В первом операторе то, что указан лишний параметр, а такжевещественный результат пытаются записать в целочисленную переменную, а вовтором то, что функции передается вещественный параметр.
Если мы запишем функцию area() после главной, то во времяобработки оператора A=area(5,b); у компилятора еще не будет информации для проверкиправильности вызова.
Так что же, мы не можем поместитьфункцию вычисления площади после главной функции? Можем, но заголовок функции area()придется написать еще раз,как показано ниже:
float area(int x, int y);
void main(void) {
float A,B;
int b,R
b=4; A=area(5,b); B=area(20,30);
}
float area(int x, int y){
float s;
s= x*y;
return s;
}
В первой строке программы записанзаголовок float area(int x, int y);. Точка с запятой в конце заголовка говорит о том, что нижене будет тела функции. Это только предописание, или прототип функции,позволяющий проверить правильность ее вызова. Сама функция описана послеглавной программы.
Прототипы написанных в программенестандартных функций тоже можно поместить в заголовочный файл, например, myproto.h. Он обычно имеет расширение h и называется (от слова header) заголовочным файлом. В исходный текст программыпомещают строку #include “myproto.h”.
Напомним, что перед компиляциейпрограммы ее исходный текст подвергается предварительной обработке –прекомпиляции. Прекомпилятор (он же препроцессор) просматривает текст файла,находит строчки, которые начинаются со слова #include (чтобы их легче находить, в строке перед этим словомнельзя писать ничего, кроме пробелов) и заменяет строчку текстом из указанногов ней заголовочного файла. Файл stdio.h препроцессор должен искать вподкаталоге include среды разработки, а файл myproto.h обычно находится в текущем каталоге – там же, где исходныйтекст программы. Чтобы указать, где следует искать заголовочный файл, имя stdio.h пишется в угловых скобках, а имя myproto.h вкавычках.
Кроме вставки в текст содержимоговключаемых файлов, препроцессор совершает и другие действия. Пусть в тексте программынесколько раз встречается число 32.5, но мы хотим писать его символическоеобозначение, например, ABC.Для этого достаточно вставить в текст строку
#defineABC32.5
Препроцессор просмотрит весь следующий за ней текст и везде,где встретится имя ABC заменит его на32.5.
Рассмотрим в качестве примераследующую задачу:
Ввести с клавиатуры радиус круга ивывести на экран его площадь. Вычисление площади оформить в виде функции.
Для решения задачи создадим заголовочный файл round.h следующего содержания:
#define Pi 3.141592653
float Round(int);
Тогда текст программы будет иметьследующий вид:
#include
#include “round.h”
int r;
float S;
void main(void)
{
printf(“Введитерадиус»);
scanf("%d",&r);
S=Round(r);
printf("Радиус%d \n площадь%g \n", r, S);
}
float Round(int p)
{ return Pi*p*p;
}
Строка #include “round.h” включит в текст этой программыпрототип функции и константу Pi.

Замечания
1. В настоящее время различные фирмыпредлагают разные версии компиляторов для языка C++. Для проверки приводимых примеров в среде MS DOS мы будем использовать компилятор фирмы Borland а для среды Windows – VisualС++ фирмы Microsoft. Создатели языков высокого уровнястремятся к тому, чтобы написанная на данном языке программа одинакововыполнялась под управлением разных операционных систем и на компьютерах сразличной архитектурой. Но идеально переносимого (мобильного) текста программобычно не получается. Например, при использовании компилятора Borland C++ объявлять константу Pi нет необходимости. В файле math.hзначения ,/2,1/ и прочие определены следующимобразом:
#define M_PI 3.14159265358979323846
#define M_PI_2 1.57079632679489661923
#define M_PI_4 0.785398163397448309616
#define M_1_PI 0.318309886183790671538
#define M_2_PI 0.636619772367581343076
#define M_1_SQRTPI 0.564189583547756286948
#define M_2_SQRTPI 1.12837916709551257390.
Правда, имена выбраны таким образом,что не каждый найдет эти константы. Но в файле math.h, которыйиспользует Visual C++, таких констант нет. В разных версиях могут отличаться нетолько содержимое, но и состав заголовочных файлов. Например, файл mem.h есть в Borland C++, и отсутствуетв Visual C++. Но прототипы функций, описанные в mem.h, можно найти в файле memory.hсреды Visual C++.
2. В языке Паскаль можно быловставить описание одной функции внутрь другой. В Си все функции равноправны,вложенные функции недопустимы.
3. В Паскале и многих других языкахпредусмотрена возможность создания функций и процедур. В языке Си есть толькофункции. Аналогом процедуры языка Паскаль в Си является функция, невозвращающая никакого значения. Допустим, нам очень часто приходится выводитьна экран предложение: ВВЕДИТЕ ЧИСЛО и мы хотим оформить его в виде функции,вызов которой должен иметь вид In();.Следует отметить, что язык Си рассматривает круглые скобки как операцию вызовафункции. Поэтому даже при отсутствии параметров оператор вызова функциизаписывается с круглыми скобками. Реализация такой функции будет иметь вид:
voidIn(void)
{printf(“ВВЕДИТЕ ЧИСЛО”);
return;
}
Словом void, означающее пустой, не имеющий никакого значения типданных, здесь указано, что функция In не получает параметров и не возвращает значения. Строчку return в этой функции можно было не писать– функция завершится, когда вычислительный процесс дойдет до закрывающейфигурной скобки.

Лекция 2.Технология разработки программ
 
1. Создание программ для выполнения в среде MSDOS
Рассмотрим минимальные сведения осреде разработки фирмы Borland,необходимые для построения программы и ее отладки. Пусть на компьютере ужеустановлено необходимое программное обеспечение в каталоге BC. Обычно активизация среды разработкивыполняется запуском находящейся в подкаталоге Bin этого каталога программы BC.exe. При этом наэкран выводится главное окно среды, показанное на рис. 1.
/>
Рис. 1 — Главноеокно интегрированной среды Borland C
Верхняя строкаокна занята основным меню, выбор в нем каждого из пунктов File, Edit, Search и др. приводит кпоявлению подменю, пункты которого позволяют вызывать выполнение группы близкихпо назначению операций. На рисунке отображена ситуация, когда вызвано подменюведения программных проектов. (Далее, для указания выбранной операции будемуказывать пункт основного меню и пункт подменю, разделяя их знаком /. Например,Project/Open project – создать новыйпроект или открыть существующий.
Большие программные системы обычносостоят из нескольких файлов – исходных модулей. Каждый исходный модулькомпилируется отдельно, а потом полученные объектные модули объединяются компоновщикомв один исполняемый модуль.
Для того, чтобы объединить несколькофайлов в единую программу, в среде Borland С++ создается проект — отдельный файл с расширением PRJ. Чтобы открыть существующий проектили создать новый следует выбрать пункт меню Project, а в нем подпункт OpenProject.
Проект содержит список файлов,которые надо объединить в одну программу, и другую информацию, например, списококон, открываемых при вызове проекта. Если открыть проект Max_Arr.prj,откроются сразу два окна, показанные на рис. 1.
В меню есть пункты Project/AddItemи Project/DeleteItem при помощи которых можно добавить или удалить файл изпроекта.
(Замечание – я давно не работал в DOS, открыл подменю проект, а пункты внем серые, неактивные, я не могу добавить в проект еще один файл. Чтобыпользоваться этими пунктами, должно быть открыто показанное в нижней частирисунка окно проекта со списком входящих в него файлов. Если на экране этогоокна нет, оно открывается выбором в меню пункта Windows/Project).
Для создания проекта разделимрассмотренную выше программу на три файла:
в заголовочный файл iRound.h поместим определение числа π и предописание функции вычисления площади круга:
#define Pi 3.141592653
double Round(int);
В файл fRound.cppвыделим исходный текст функции вычисления площади:
#include«iRound.h»
double S;
double Round(int p)
{
return Pi*p*p;
}
Главна функция будет находиться вфайле mRound.cpp:
#include
#include«Round.h»
int r;
double S;
void main(void)
{printf("Введитерадиус");
scanf("%d",&r);
S=Round(r);
printf("Радиус%d \n площадь%g \n", r, S);
getchar();
getchar();
}
Для создания проекта, включающегофайлы mRound.cpp и fRound.cpp необходимо выполнить следующуюпоследовательность действий:
подготовить показанные выше файлы сисходными модулями проекта. Для этого можно использовать любой текстовыйредактор, но удобно пользоваться редактором среды разработки (Пунктом File/New создать пустой файл и ввести текст файла, пользуясьпри необходимости копирования блоков текста других операций редактированиявозможностями подменю Edit);
выбором пунктаProject/OpenProjectсоздать новый проект (для этого воткрывшемся диалоговом окне следует ввести имя нового проекта);
при помощи пункта Project/AddItemвключить в проектмодули fRound.cpp и
mRound.cpp (заголовочный файл включать необязательно,препроцессор будет искать его в текущем каталоге даже при отсутствии в спискемодулейпроекта);
используя пункт Compile/Make получить исполняемый модуль программы. Вместообращения к пунктам меню можно использовать быстрый вызов функций средыразработки при помощи “горячих клавиш”. Если проект открыт, то по нажатиюклавиши F9 модули проекта файлы скомпилируются(на диск запишутся результаты компиляции — объектные файлы mRound.obj и fRound.obj). Далее эти файлы скомпонуются водин exe-файл (исполняемый модуль).
выбором пункта Run/Run программа запускается на выполнение. Если исполняемыймодуль надо скомпоновать и сразу же выполнить, нажимают сочетание клавиш Ctrl/F9.
Использование проекта значительнооблегчает разработку больших многомодульных программных систем. В частности,если после выполнения полного цикла разработки программы от подготовки исходныхмодулей до запуска готовой программы, один из исходных модулей. корректируется(выявлены ошибки или изменились требования к реализованным в нем функциям),будет обеспечена минимизация затрат ресурсов компьютера на обновлениепрограммы. Интегрированная среда разработки сравнивает даты создания исходных иобъектных модулей. При создании исполняемого модуля заново компилируются толькоте файлы проекта, у которых дата создания исходного модуля позже даты созданияобъектного объектного.
Кроме того, в проект можно включатьподготовленные отдельно объектные модулю (без включения исходных). Отдельныемодули проекта могут быть написаны на языке ассемблера (при этом в составесреды должен быть tasm.exe и необходимо правильно настроитьпункты меню Transfert).
 
2. Создание программ для выполнения в среде Windows
Начинающему программисту сложносочетать освоение нового языка и технологии разработки приложений дляоперационной системы Windows.В связи с тем, что Windows – системамногозадачная и многооконная, она использует свои процедуры ввода-вывода вместостандартных, определенных синтаксисом языка программирования, будь это Паскаль,С++, Бейсик и пр. Применение используемых в ней средств построения меню,диалоговых окон и других элементов человеко-машинного интерфейса требует, чтобыразработчик уже имел определенную квалификацию.
Чтобы изучать основы программированиялучше создавать консольные приложения Windows. Консольное приложение, это программа, осуществляющая выводв текстовое окно, аналогичное экрану дисплея при работе с MS DOS, работа которой возможна без применения специфическихсредств взаимодействия с операционной системой.
Покажем последовательность действийдля создания консольного приложения в среде Visual С++ версии 6.
При запуске среды разработки на экранвыводится главное окно среды (рис 2) с пунктами меню, позволяющими, выполнятьосновные действия по разработке приложения:
читать, редактировать и записывать надиск текстовые файлы;
создавать проекты из несколькихисходных модулей;
компилировать файлы проекта исоздавать исполняемый модуль;
выполнять программы в автоматическоми отладочном режимах.

/>
Рис. 2 — Окносреды Visual C++
Пункты меню, которые выполняютсянаиболее часто, дублируются пиктограммами. Обозначения пиктограмм верхнего рядастандартны для офисных и других приложений фирмы Microsoft.
Во втором ряду показаны пиктограммы,щелчком на которых можно выполнить следующие действия (перечисляем слева направо):
компиляцию исходного текста иполучение объектного модуля;
компоновку исполняемого модуля изобъектных;
прерывание и отмену выполняемойоперации (компиляции, компоновки или отладки программы);
выполнение исполняемого модуля вавтоматическом режиме – восклицательный знак;
выполнение исполняемого модуля вотладочном режиме (с остановкой на контрольных точках);
установку контрольных точек – значокв виде ладони.
Программист может перемещать панелиинструментов с пиктограммами по экрану, изменять по своему вкусу составпиктограмм, вынесенных на панель инструментов. Эти операции выполняются выборомпункта Customize подменю Tools.
При выборе пункта меню File появляется показанное на этом жерисунке подменю, содержащее пункты New, Open, Close, Open WorkSpaсe и др. Для создание нового проекта и новой рабочей области(подкаталога с файлами проекта) необходимо выбрать пункт New, при этом появится диалоговое окно New.
Как видно из рис 2, в этом окне можновыбрать одну из нескольких вкладок. В частности, для создания и включения впроект новых файлов, надо выбрать вкладку Files. На рисунке показана ситуация, когда пользовательсоздает новую рабочую область и проект. Имя Console0 нового проекта и подкаталога для его размещения записанов поле Project Name, путь к создаваемому подкаталогу задан в поле Location. В основном поле вкладки цветомвыделен тип создаваемого проекта. Выделена строкаWin32 Console Application, привыборе которой создается проект приложения, работающего в текстовом окне,аналогичном экрану MS DOS, и использующему для вывода на экрани ввода с клавиатуры стандартные операторы языка С++. (Для создания оконногоприложения следовало выбрать пункт Win32 Application, а один из двух последних пунктоввыбирается при создании библиотек). После нажатия не поместившейся на рисункекнопки OK и ответа на два дополнительныхвопроса будет создан пустой проект, в который надо включить файлы с исходнымитекстами программ на языке С++.
После этого можно заново выбратьпункты меню File/New но в появившемся окне New уже выбрать вкладку File. Из множества предложенных вариантов, часть изкоторых показана на рис. 3 нам потребуется указывать заголовочные файлы C/C++ HeaderFile или файлы с исходным текстом С++ SourceFile. В данном случае выбран исходныймодуль и задано его имя main.По нажатию кнопки OK модуль будет нетолько создан, но и (как показывает флажок Add Project) включен в состав проекта.
/>
Рис. 3 — Типыфайлов
После создания пустого файлавыбранного типа, в левом поле окна среды разработки (см. рис. 4), отображающемсостав проекта, появится имя включенного в проект файла main.cpp, а в правом поле можно набирать и редактироватьисходный текст модуля.
/>
Рис. 4 — Отображение состава проекта

На рис 1.4 показано то состояниеокна, когда пользователь уже набрал программу вывода на экран 25 строк текста идаже выполнил компиляцию модуля. Поэтому в нижнем поле мы видим сообщение отом, что в результате компиляции ошибок не обнаружено.
Далее можно выполнить компоновкуисполняемого модуля или, щелчком по пиктограмме с восклицательным знаком,одновременно компоновку и пуск программы.
На рисунке 4 показана ситуация, когдапользователь навел на восклицательный знак курсор мыши, пиктограмма выделиласьв виде рельефной кнопки и под ней появилась подсказка ExecuteProgram, объясняющая назначение кнопки. Еслищелчком по этой кнопке запустить выполнение программы в автоматическом режиме,мы получим результат ее работы в консольном окне, показанный на рис 5.
Это текстовое окно, имитирующееработу программы с символьным дисплеем в среде MS DOS.
/>
Рис. 5 — Видконсольного окна

Следует заметить,что при выводе на экран строки текста, например, операторами
char s=”Примертекста”;
printf (s);
мы увидим непонятные символы. Причинав том, что для полноты имитации текстового режима оператор printf(s) использует принятую в MS DOS кодовую страницу CP866. Это можно проверить, вызвав стандартную функцию Res =GetConsoleOutputCP() (о кодовых страницах см. лекции по Паскалю). Но посколькукомпилятор при кодировании строки применяет страницу 1251 русифицированной ОС Windows, на экран невозможно вывести русскийтекст. Чтобы вывести русские буквы абвгд, строку придется закодировать так:
char s[]={0xa0,0xa1,0xa2,0xa3,0xa4,10,0};
Обратите внимание, на подсказка нарис. 1.4. Она сообщает, что действия, выполняемые щелчком по кнопке свосклицательным знаком, продублированы горячими клавишами Ctrl/F5. Аналогичные подсказки закреплены за каждой световойкнопкой, со средой разработки поставляется также обширная справочнаядокументация, в результате процесс разработки и отладки программ осваиваетсязначительно быстрее при практической работе за компьютером, чем при чтенииучебника. Поэтому здесь отметим только, что пошаговое выполнение программы беззахода в процедуры выполняется по нажатию функциональной клавиши F10, с заходом в процедуры F11, а автоматическое выполнение достроки, в которой установлен курсор, запускается сочетанием клавиш Ctrl/F10.

Лекция 3.Знакомство с операторами языка
 
1. Условный оператор
Мы помним, что операторы программызадают последовательность действий, которую надо выполнить с объявленными в нейпеременными. Часто она заранее точно неизвестна и определяется уже во времяработы по результатам предыдущих вычислений.
Пусть, например, необходимовычислить подоходный налог с заработка, размер которого хранится в переменной Z. Сотрудник имеет право на льготы поналогу, суммарный размер которых хранится в переменной L.
Если заработок больше суммы льгот (тоесть Z>L), налог берется в размере N=13*(Z-L)/100. Когда сумма разрешенных льготбольше, чем заработок, применение этого выражения даст отрицательный Поэтому они могут участвожениярезультат. Это означает, что налог не взимается, то есть, при ZL, значение N=0.
Заметим, что в С++ знаки , больше — это операции, дающие целочисленный результат… Если условие,заданное операцией сравнения, выполняется, результат операции равен единице,если не выполняется – нулю. То есть, при вычислении выражения Z>L получим единицу, если Z больше, чем L. ВС++ нет логического типа данных, поэтому вполне допустимо написать выражение (Z>5)+(Z>L). Взависимости от значений переменных вычисление этого выражения даст значения 0,1 или 2.
Рассмотрим программу, которая вводитзначения Z и L с клавиатуры и вычисляет сумму налога условным оператором:
#include
int Z,L,N;
voidmain(void)
{
printf(“\nВведите сумму заработка и размерльгот”);
scanf("%d%d",&Z,&L);
if(L
else N=0;
printf(“ Налогравен%d руб.”, N);
getchar();
getchar();
}
Для сравнения посмотрите, как тот жеввод с клавиатуры выполнить с использованием потока:
cin>>Z>>L;
Выполнение оператора if(L
заключается в следующем:
– вычисляется выражение, записанное вскобках;
– если результат не равен нулю,выполняется оператор после скобок, если равен нулю – оператор, записанный послеelse.
Замечания
1. Выше мы использовали записьусловного оператора в виде
if(выражение>) оператор1>else .
Можно использовать также краткуюформу условного оператора if(выражение>)оператор>. Здесь отсутствует ветвь else, поэтому при равенстве выражениянулю не выполняется никаких действий.
2. В языке Паскаль точка с запятойявляется разделителем между операторами, а в С++ она является неотъемлемойчастью оператора. Поэтому в Паскале знак ‘;’ перед else не ставится (слово else само по себе является хорошимразделителем), а в данном примере точка с запятой перед else указана, так как она часть оператораN=13*(Z-L)/100;.
3.В языке С++ строчная исоответствующая ей прописная буквы – это разные символы. Поэтому врассмотренном примере нельзя объявить переменные int Z, L, N;, а потом записать оператор n=13*(z-l)/100;.
4. Мы помним, что происходит призавершении программы вычисления площади, приведенной в параграфе 1. Завершаясь,главная функция main() возвращаетуправление тому, кто ее запускал. Если программу запускали из оболочки типа Norton Commander, на экране очень быстро промелькнутвыводимые программой числа и мы опять увидим окна Norton Commander, если программа запускается из средыразработки, появится окно редактора с исходным текстом. Чтобы пользовательвидел на экране результат, в конце программы вставляется дополнительныйоператор ввода символа. При выполнении этого оператора программа незавершается, пока пользователь не нажмет кнопку клавиатуры и на экране виднырезультаты вычислений.
Среди функций стандартноговвода-вывода есть функция getchar();, которая вводит один символ. Впредыдущем примере, чтобы приостановить программу она записана дважды. Одиноператор не приостановит программу по следующей причине:
В начале программы функция scanf("%d%d",&Z,&L); вводит с клавиатуры два числа Z и N. Ее особенностью является то, что при вводе числа функцияотбрасывает все предшествующие первой цифре коды пробела, табуляции, переводастроки и возврата каретки, потом вводит цифры числа, пока не будет нажатаклавиша Enter. Код этой клавиши функция scanf() использует как признак конца вводачисла, но оставляет во входном потоке. Это значит, что код Enter функция как бы и не вводила – онпоступит следующему оператору ввода данных.
Следующим оператором ввода являетсявызов getchar(). Он получит и введет код Enter, оставшийся не обработанным функцией scanf(), и только второй операторgetchar() будет ожидать ввода человеком следующего символа.
Два оператора getchar() не украшаютнашу программу, кроме того, как любая функция стандартного ввода, getchar()отображает символ на экране, и после нажатия клавиши, например, буквы А, ждетеще и нажатия клавиши Enter,как признака завершения ввода. Поэтому в дальнейшем мы будем пользоватьсяфункцией консольного ввода символа getch().
Покажем применение консольного вводана примере применениякраткой формы условного оператора для определения наибольшего из трех чисел.Ниже представлена программа, которая вводит с клавиатуры три числа a, b, c, большее из нихзаписывает в переменную max,после чего ожидает нажатия любой клавиши:
#include
#include
int a,b,c;
void main(void)
{
clrscr();
scanf("%d%d%d",&a,&b,&c);
int max=a;
if(a
if(c>max) max =c;
printf("%d",max);
getch();
}
В среде Borland C оператор #include вставляет в исходный текст программы прототипы всехфункций консольного ввода-вывода. Мы с ними знакомы – это те функции, которые вПаскале реализованы модулем Crt.Надо только записывать их имена строчными буквами: clrscr() – очистить экран, gotoxy(x,y) –переместить курсор и т.д.
Только паскалевским функциям проверкинажатия клавиши KeyPressed и вводасимвола ReadKey в С++ даны другие имена – здесь ониназываются kbhit() и getch(). Функция getch() вводит символ без эхо-отображения и не ожидает нажатия Enter.
Не совсем понятно, почему еедостаточно вызвать один раз. Кратко (не требуя полного понимания) на это можнопока ответить так. Входной поток стандартного ввода-вывода, это массив байтов,в котором операционная система накапливает введенные символы, не передавая ихоператорам ввода из входного потока до нажатия Enter. Консольные же функции читают символы не из входногопотока. Они опрашивают непосредственно клавиатуру. Поэтому давно нажатаяклавиша Enter не оказывает никакого действия наработу функции getch(). Функция getch() ожидает нажатия клавиши, а код Enter так и остается непрочитанным избуферной области оперативной памяти, которую мы называем входным потоком.
2. Оператор цикла в форме for
Объявим целочисленную переменную I и рассмотрим оператор цикла напримере вывода на экран десяти чисел, кратных трем:
int I;
for(I=1;I
printf(“%d”,3*I);
Как и в Паскале, оператор состоит из:
– заголовка цикла for(I=1;I
– многократно повторяемого тела цикла– оператора printf(“%d”,3*I).
Заголовок состоит из служебного словаfor и трех взятых в скобки выражений,которые определяют, сколько раз будет повторяться тело цикла, и как будет изменятьсяпараметр цикла I.
Первое выражение I=1 выполнится один раз (до первоговыполнения тела цикла) и определит начальное значение параметра цикла.
Перед каждым выполнением тела циклавычисляется второе выражение (обычно там помещается проверка какого-то условия)и если условие не выполняется (значение выражения равно нулю), циклзавершается. Если условие выполнено (результат вычисления выражения не равеннулю), выполняется тело цикла.
После каждого выполнения тела циклавычисляется третье выражение, которое обычно изменяет значение параметра цикла.
Как видим, в данном случае параметр I будет изменяться от одного до 10,при этом выводимое на экран значение 3*I, будет кратно трем. Результаты экзаменов показывают, чтоиногда у студентов вызывают затруднения даже такие простые задачи. Поэтомурассмотрим несколько похожих примеров.
1. Те же числа, но в обратном порядкеможно вывести оператором
for(I=10;I;I=I-1)
printf(“%d”,3*I);
Оператор интересен тем, что вторымвыражением является не проверка условия, а просто переменная I. Когда она станет равной нулю, циклзавершится.
2. Язык С++ предоставляет большую посравнению с Паскалем свободу при реализации заголовка цикла. В частности,параметр цикла может быть вещественным числом, разрешено пропускать в заголовкецикла любое из выражений (а может, это называется записывать пустое выражение,потому что символы; пишутся обязательно). Следующий фрагмент показывает решениезадачи с пропущенным первым выражением:
floatI=1;
for(;I
printf(“%f”,3*I);.
3. Можно пропустить также третьевыражение и изменять переменную I в теле цикла:
float I=1;
for(;I
{I=I+1;
printf(“%d”,3*I);
}.
Как и в Паскале, циклическиповторяется только один записанный после заголовка оператор. Если надоповторять несколько операторов, они объединяются фигурными скобками в блок. Вданном случае
{
I=I+1;
Printf (“%d”,3*I);
} — это блок операторов. Блок языка С отличается отсоставного оператора Паскаля тем, что в блоке после открывающей фигурной скобкиможно размещать объявления переменных. Такие переменные остаются видимымитолько в пределах того блока, где они объявлены (с понятиями области видимостии времени жизни переменных мы знакомились при изучении Паскаля).
В отличие от С, язык С++ разрешает объявлять переменные влюбом месте, кроме управляющих конструкций операторов. Например, нельзяобъявлять переменную в условном операторе (в круглых скобках после if).
Но параметр цикла можно объявлять непосредственно в заголовке(хотя заголовок – это управляющая конструкция цикла):
for(int i=0; i
При этом переменная i будет доступна не только в этом цикле, но и во всех последующихоператорах до конца блока.
4. Если опустить в заголовке все три выражения, результатвычисления второго пустого выражения считается ненулевым и мы получаембесконечный цикл. В этом случае для решения задачи можно применить операторпринудительного завершения оператора цикла — break:
intI=1;
for(;;) //Такой заголовок приводит кбесконечному повторению тела цикла.
{ if(I>10) break; //Выполнение оператора break вызывает завершение цикла
// и переход к следующему после циклаоператору.
I=I+1;
printf(“%d”,3*I);
}.
Знакомясь с оператором break языка Паскаль, мы отмечали, что его не было вавторской версии языка, его заимствовали из языка Си.
5. При решении данной задачи студенты часто пытаются в телецикла дополнительно изменять значения I, чтобы они были кратны трем. В теле цикла при этом выводится значение I а не 3*I, например, так:
int I;
for(I=1;I
{ printf(“%d”, I);
I=I+3;}
Это неправильное решение, так как неучитывается что в каждом проходе к I, будет прибавлять единицу заголовок цикла, и еще три прибавится в телецикла. Проверьте самостоятельно сколько и каких чисел выведет на экранприведенный выше оператор.
Если не хочется применять длиннуюоперацию умножения, цикл следует записать так: for(I=3;II=I+3) printf(“%d”, I);.
6. Выведем на экран первые десятьэлементов последовательности
½,1/4, 1/6, 1/8…
Типичная ошибка при решении этойзадачи приводит к выводу на экран значения 2-n. Элементы данной последовательностивычисляются оператором
floatI
for(I=1;II=I+1) printf(“%f”, 1/(2*I));
или, без использования умножения:
floatI, s=0;
for(I=1;I
{ s=s+2;
printf(“%f”, 1/s);
}.
Чтобы выводить на экран значения 2-n, следует делить на 2 предыдущеевычисленное значение степени:
float I, s=1;
for(I=1;I
{ s=s/2;
printf(“%f”, s);
}
Несколько замечаний по форматированиювывода
Предыдущий фрагмент выводитвычисленные значения степени одной строкой.
Запишем программу вывода значений 2-n полностью и будем выводитьпоказатель и три варианта значения степени, использующие различные спецификациивывода
#include
#include
int i;
float s=1;
void main(void)
{ clrscr();
for(i=1;i
{
printf("\n -%d cтепень\
равна%06.2f %6.2e %-6.3g",i-1,s,s,s);
s=s/2;
}
getch();
}
При пуске программа выведет на экранследующий текст:
-0 cтепень равна 001.00 1.00e+00 1
-1 cтепень равна 000.50 5.00e-01 0.5
-2 cтепень равна 000.25 2.50e-01 0.25
-3 cтепень равна 000.12 1.25e-01 0.125
-4 cтепень равна 000.06 6.25e-02 0.0625
-5 cтепень равна 000.03 3.12e-02 0.0312
-6 cтепень равна 000.02 1.56e-02 0.0156
-7 cтепень равна 000.01 7.81e-03 0.00781
-8 cтепень равна 000.00 3.91e-03 0.00391
-9 cтепень равна 000.00 1.95e-03 0.00195
-10 cтепень равна 000.00 9.77e-04 0.000977
-11 cтепень равна 000.00 4.88e-04 0.000488
12 cтепень равна 000.00 2.44e-04 0.000244
-13 cтепень равна 000.00 1.22e-04 0.000122
-14 cтепень равна 000.00 6.10e-05 6.1e-05
-15 cтепень равна 000.00 3.05e-05 3.05e-05
Здесь каждое вычисленное значениевыводится с новой строки. Мы знаем, что для перевода курсора на следующуюстроку на экран следует вывести символ с кодом 10, а для перемещения в началостроки – символ с кодом 13. Но у этих символов нет изображения, которое можновставить текстовым редактором в выводимую строку. Если мы напишем printf(“10строка”), то в начале строкибудут два символа ‘1’,’0’с кодами 49 и 48, а не символ перевода строки с кодом10. Для включения в строку специальных символов в С++ используют букву, передкоторой записан знак \. Например, \n понимается компилятором, как символ с кодом 10, \r – символ с кодом 13, \а – символ скодом 7 (звонок) и т.д. Чтобы включить в строку знак \, его приходится записатьдважды \\. Из-за этого путь к файлу filename.dat, которыйнаходится в каталоге ABC,на языках С, С++ приходилось задавать так:
C:\\ABC\\filename.dat.
Таким образом, знак \n в программе вывода значений степени– это символ перевода строки.
Оператор вывода printf("\n -%d cтепень равна %06.2f %6.2e %-6.3g ",i-1,s,s,s); содержит очень много букв, поэтому он записан в двестроки.
printf("\n -%d cтепень
равна %06.2f %6.2e %-6.3g ",i-1,s,s,s);
Для перехода в редакторе текста на новую строку мы нажимаемклавишу Enter, у нее тоже есть код, которыйвставляется в строку после слова «степень». Но этого кода не должно быть встроке, выводимой во время работы программы. Чтобы компилятор выбросил изстроки код клавиши Enter, мы вводим\, а потом нажимаем Enter. (То есть,сочетание \включает код перевода строки в исходный текст, но подавляет его вкомпилированной строке).
Вычисленная степень s выводится на экран три раза. Все триспецификации %f %g предназначены для вывода вещественных чисел:
%f предписывает выводить число без множителя 10n с шестью знаками после десятичнойточки, последняя цифра округляется;
%e предписывает всегда выводить число в экспоненциальной форме (c множителем 10n);
%g сохраняет не больше шести значащих цифр результата (в%f шесть цифр только в дробной части, аздесь всего шесть, включая целую и дробную часть, но значащих цифр). Для оченьмаленького числа запишутся нули, а потом 6 цифр. Кроме того, в данном форматеавтоматически из двух вариантов представления числа – экспоненциального и сдесятичной точкой, автоматически выбирается тот, который запишется короче.
В нашем примере после знака % передбуквой записаны цифры:
%6.2f означает, что на число (включая точку) отведено шестьпозиций, из них две после точки. Если перед первым числом написать 0, %06.2f, в незаполненные старшие разрядызапишутся нули (как в нашем примере);
%6.3g означает, что числу отводится не менее шестизнакомест, но от числа сохраняется не более трех значащих цифр. На примерераспечатки мы не видим, что числу отведено шесть позиций, потому что столбецпоследний и число выравнивается не по правому, а по левому краю области печати.Указание выравнивать число по левому краю дано знаком минус в спецификации%-6.3g.

Лекция 4.Работа с массивами
 
1. Одномерные массивы
Массив, это совокупность однотипныхэлементов, объединенных общим именем.
Например, десять целых чисел,объединенных именем Mas, объявляютсяследующим образом:
intMas[10];То же, что на Паскале Mas: array [0..9] of integer;.
В объявлении записывают типэлементов, имя массива и, в квадратных скобках, количество элементов.
Элементами массивов могут быть нетолько числа. Можно например, объявить массив, состоящий из массивов. Нельзяобъявлять массивы, элементами которых являются функции или данные типа void.
Массив можно передать функции какпараметр, но функция не может возвращать массив в качестве результата своейработы.
Объявление массива можно совместить сего инициализацией, перечислив значения элементов в фигурных скобках:
intA[5] ={2,-3, 0,0,7};
В операторной части программы приобращении к отдельным элементам указывают имя массива и номер элемента вквадратных скобках. Элементы массива нумеруются начиная с нуля, т.е. оператор
printf(“%d”,A[0]);
выведет на экран первый элемент,число 2, а оператор
printf(“%d”,A[4]);
выведет последний элемент, число 7.Элемента A[5] в массиве A нет.
При инициализации массивов язык Сипозволяет большую свободу, чем Паскаль. В частности, не обязательно перечислятьзначения всех элементов. В объявлении
floatM1[10]={4, 2.5, 0.3}; семь последних элементовавтоматически заполнятся нулями. Самостоятельно проверьте, можно ли пропускатьэлементы, если они не последние, например, разделяя отсутствующие элементызапятыми:
float M2[10]={4, 2.5,0.3,,0,,,,20.3};.
Если при инициализации перечисленывсе элементы — можно не указывать размер массива: ar[]={2,7,9,3,1};. Заметим, что размер массива можноне указывать также если массивобъявлен, как параметр функции или если объявляется ссылка на массив,определенный в другом файле. Пусть, например, наш проект состоит из двух файлов(A.cpp, B.cpp). Если A.cpp мы объявилимассив float M1[10], то в B.cpp для работы с этим массивом можнозаписать строку
extern float M1[];,
которая указывает, что массив внешний– объявление массива сделано в другом файле. При необходимости можно указать иразмер массива extern float M1[10], но инициализацию при ссылке на внешний массив (как ина любую внешнюю переменную) повторять нельзя.
Рассмотрим в качестве примера решениеследующей задачи:
– объявить массив из пяти целыхчисел;
– заполнить элементы массива данными,вводимыми с клавиатуры;
–вывести элементы массива на экран;
найти сумму положительных элементов ивывести ее на экран.
#include
#include
int ar[5];
void main(void)
{ clrscr();
printf(«Enter fivenumbers»);//Это я по словарю привыкаю к английским словам
for(inti=0;ii++) scanf("%d",&ar[i]); //Объявленная здесь переменная i видна и дальше.
float Sum=ar[0];
for(i=1;i0)Sum=Sum+ ar[i];
for(i=0;i
printf(«The sum is%f»,Sum);
getch();
}
Решим задачу поиска элементов смаксимальным значением в массивах, состоящих из целых чисел. Для этогореализуем функцию поиска максимального элемента в виде отдельного файла
int MaxArr(int Mas[],intR=10) //Файл Max_Arr.cpp
{ int Max=Mas[0];
for(int i=1;iMax)Max=Mas[i];
return Max;
}
Первый параметр функции MaxArr(),– это массив из целых чисел, авторой – количество элементов массива. Размерность массива не указана, поэтомуфункция может находить максимальный элемент в любом массиве, состоящем из целыхчисел. Язык C++ позволяет при описании функцииуказывать после параметра его значение по умолчанию (параметру R по умолчанию присвоено значение 10).В этом случае при вызове функции можно не указывать один или несколькопоследних параметров, имеющих заданные по умолчанию значения.
Ниже приведена программа,использующая данную функцию для вывода на экран максимальных элементов двухмассивов разного размера.
#include
#include
int MaxArr(int Mas[],intR=10); Это шаблонзаголовка. В нем можно опускать имена формальныхпараметров и писать только их типы, например,
int MaxArr(int[],int=10);
void main(void)
{ clrscr();
int M1[5]={-3,5,0,15,6};
intM2[10]={13,25,0,15,-36};
intMax2=MaxArr(M2); МассивM2 состоит из 10 элементов, поэтомуможно передавать только первый параметр.
printf("\n В первом массиве %d \
Во втором массиве %d",MaxArr(M1,5), Max2); getch();
}
Сравните с языком Паскаль – там приописании формального параметра типа массив, требовалось указывать имя параметраи имя предварительно описанного типа передаваемого массива. Из-за этого наПаскале для работы с массивами разных размеров требовалось иметь отдельныефункции. Но зато на Си программист может ошибиться и задать больше или меньшеэлементов, чем есть в массиве. Заметим, что можно указать в заголовке функцииразмерность массива:
int MaxArr(int Mas[10],int R=10);
Но даже и в этом случае компилятор непроизводит контроль соответствия размера указанного в заголовке размеру реальнопередаваемого массива – предоставляя программисту большие возможности, язык С++возлагает на него большую ответственность за работу программы.
Замечание. Если производитсяобращение к переменной, объявленной в другом модуле проекта, надо указать, чтоона внешняя, например, extern int M. Имена функций видны везде, нужноуказывать лишь прототип функции.
2. Многомерные массивы
Как и в языке Паскаль, в С++и многомерные массивыконструируют, объявляя массив, элементы которого тоже массивы. Так:
– одномерный массив int A[10]; — это набор из 10 целых чисел;
– двумерный массив int A2[10][3]; — это массив из 10 элементов, а каждый элемент A2[i] массив из трех целых чисел;
– int A3[10][3][5]; это массив из 10 элементов, а каждый элемент A3[i] — двумерный массив размером 35;.
Двумерные массивы используются дляработы с матрицами и другими прямоугольными таблицами. Для того, чтобы впрограмме на языке С++ объявить прямоугольную матрицу
t00 t01t02 t03
T =t10 t11t13 t12
t20 t21t22 t23,
надо указать, из элементов какоготипа (целых или вещественных) она состоит, дать ей имя, указать сколько в нейстрок и столбцов. Если показанная выше таблица содержит вещественные числа, ееобъявление будем иметь вид:
double T[3][4];
где 3 –количество строк, а 4 – столбцов.В языке Паскаль для каждого индекса указывался интервальный тип данных,задающий начальное и конечное значения, в С++ строки и столбцы всегданумеруются с нуля, поэтому пишется только их количество.
Чтобы задать конкретный элементмассива, надо указать номер строки, в которой находится этот элемент, и номерстолбца. Так, элемент, который находится во второй строке и третьем столбценадо обозначать T[1][2]. Можно рассуждать ииначе:
– выбираем элемент массива, указавего индекс — T[1];
– T[1] это массив из четырех чисел, выбираем элемент массива T[1], указав его индекс — T[1][2].
 В Паскале, чтобы увеличить сходство операторовпрограммы с математической записью элементов матриц, разрешалось перечислятьиндексы массива через запятую. В С++ это недопустимо. Особенно неприятно, чтокомпилятор, встретив обозначение M [1,2] будетсчитать, что это M[2] и присинтаксическом контроле может не выдать ошибку.
Объявление двумерного массива такжеможно совмещать с его инициализацией:
intMas[3][4]= {{2, 7, 9,4},
{1,3},
{3,3,3,3}}
Правила инициализации вытекают изсоответствующих правил для одномерных массивов.
Двумерный массив – это одномерныймассив, элементами которого являются строки матрицы. А при инициализацииодномерного массива в фигурных скобках (в примере это внешние скобки)перечисляются через запятую значения элементов массива. Но каждый элемент – этотоже массив. Поэтому его значение – последовательность чисел, взятая в фигурныескобки. Как показано во второй строке, можно перечислять не все элементы строкиматрицы – недостающие автоматически заполнятся нулями.
В сделанном выше объявлении массиваможно не указывать число строк:
int Mas[][4]= {{2,7… и т д.
В памяти элементы массиварасполагаются по строкам, сначала элементы первой строки, потом второй и т. д.Для многомерных массивов (у которых больше двух индексов) это правилоформулируется так:
– при размещении первым записываетсяв память элемент, у которого все индексы равны нулю;
– далее пробегаем последний (правый)индекс от нуля дот максимального значения;
– потом увеличиваем на единицупредпоследний индекс и заново изменяем последний от нуля до единицы;
– когда предпоследний индексдостигнет максимального значения, увеличиваем третий справа индекс и так далее.
Таким образом, в двумерном массивецелых чисел размером MN элемент с индексами i,j смещен на N*sizeof(int) i+ sizeof(int)*jбайтов от начала массива.
Учитывая построчное расположениеэлементов в памяти, в языке разрешено перечислять при инициализации элементыодной строкой. Тот же массив, что показан выше, можно было объявить так:
int Mas[][4]= {2, 7, 9,4, 1,3,0,0, 3,3,3,3};, но оставлятьнезаполненными элементы второй строки уже нельзя. В этом случае тоже можно неуказывать первую размерность. Последняя строка может быть не полной — приобъявлении
int Mas[][4]={1,2,3,4, 1,3} компилятор будет отсчитывать почетыре числа в строке и создаст матрицу
1 2 3 4
1 3 0 0.
Вывести элементы двумерного массивана экран можно различными способами.
Удобно организовать цикл по строкам ивложить в него цикл по столбцам
for(int i=0; i
for (j=0;j
Можно также учесть, что в массиве 12чисел и сделать цикл от нуля до 12, но при этом придется использовать новуюарифметическую операцию % (получение остатка от деления целых чисел)
for(inti=0; ii=i+1) printf(“%5d”,Mas[i/4][i%4]);.
Оба приведенные выше цикла будутпечатать элементы массива в одну строку.
Если мы хотим выводить массив в видепрямоугольной таблицы, перед каждой следующей строкой (или после каждой строки)массива надо вывести на экран символ перевода курсора \n., как показано ниже:
for(int i=0; i
{
for (j=0;j
printf(“\n”);
}
Объясните, как изменится работапрограммы, если в этом фрагменте удалить фигурные скобки.
Помню, в школе нас учили решатьалгебраические уравнения методом подстановки и методом алгебраическогосложения. В ВУЗе в курсе алгебры мы узнаем, что решение систем линейныхуравнений школьным методом алгебраического сложения называется методом Гаусса,а также знакомимся с алгоритмами вычисления определителя и обратной матрицы.Они основаны на последовательности шагов, заключающихся в умножении элементовстроки на константу и прибавлении к соответствующим элементам другой строки тоже матрицы.
Составим, для примера, программурешения систем уравнений методом Гаусса и решим систему:
1.7x1 + 10.0x2 — 1.3x3 + 2.1x4 = 3.1
3.1x1 + 1.7x2 — 2.1x3 + 5.4x4 = 2.1
3.3x1 — 7.7x2 + 4.4x3 — 5.1x4= 1.9
10.0x1 — 20.1x2 + 20.4x3 + 1.7x4 = 1.8
При решении системы все ее числовыекоэффициенты можно хранить в массиве, объявленном как doublea[4][5]. Столбец свободных членов системы –это элементы a[I][4], где I=0,...,3.
Методом Гаусса основано напоследовательности преобразований системы, не изменяющих ее корней.
Если прибавить к левой и правой частиуравнения одно и то же число, его корни не изменяются. (Когда x1 x2… xn– это корни уравнения, его левая иправая части равны. Поэтому к одном уравнению можно, не изменяя корней,прибавить другое, умноженное на числовой коэффициент).
В методе Гаусса решение системы из n уравнений получается за n шагов.
На шаге номер k:
уравнение номер k делится на коэффициент a[k][k] – диагональный элемент матрицы становитсяравным единице;
потом (для всех i ≠ k) куравнению номер i прибавляетсяуравнение номер k умноженное наминус a[i][k]. Врезультате в столбце k всекоэффициенты, кроме расположенного на диагонали, станут равными нулю (дляручного счета указанные на данном шаге действия выполняются только для значенийi>k, но нам удобнее заменить нулями все коэффициенты столбца,кроме одного).
После того, как циклом, изменяющим k от нуля до n-1 выполнится nописанных выше шагов, в каждой строке коэффициенты при всех неизвестных, кромеодного, будут равны нулю – это и есть решение.
Проделаем описанные преобразованиядля заданного уравнения.
Разделим все коэффициенты первойстроки на a[0][0]=1.7. Первое уравнениеприобретет вид:
x1+5.882x2 — 0.7647x3 +1.235x4 =1.824
Теперь, чтобы в уравнении 2 получитьнулевой коэффициент при x1, все элементы первого уравненияумножаем на a[1][0]=3.1 и отнимаем от второго,получим
0x1 — 16.54 x2 + 0.2706 x3 + 1.571 x4 = 3.553
и так далее.
Программа, реализующая данныйалгоритм, оказывается заметно короче его описания:
#include
#include
doublea[4][5]={{1.7, 10.0, -1.3, 2.1, 3.1}, //Записали систему уравнений
{1, 1.7, -2.1, 5.4, 2.1},
{3.3, -7.7, 4.4, -5.1, 1.9},
{10.0,-20.1, 20.4, 1.7, 1.8}};
voidprint(void) //Вывод таблицы коэффициентов оформили в виде функции.
{ for(int i=0;i
printf("%8.4lg",a[i][j]);printf("\n");}
printf("\n");
}
void main (void)
{
clrscr();
print(); //Вывели исходную таблицу
for(intk=0;kk++) //Цикл по числу уравнений
{ double Kf=a[k][k];
for(int j=0;jПолучаем единицу приxk
for(inti=0;ii++)
{ //Во всех уравнениях, кроме k-го делаем коэффициент при xk равным нулю.
Kf=a[i][k];
if(i!=k) for(j=0;j
}
print();//Вывели таблицусо столбцом изнулей.
}
getch();
}
В приведенной программе делитель a[k][k]; предварительнозаписывается в отдельную переменную: Kf=a[k][k];.
Объясните, почему нельзя отказатьсяот использования промежуточной переменной Kf, записав вместо оператора a[k][j]=a[k][j]/Kf; оператор a[k][j]=a[k][j]/ a[k][k];.
Далее показаны результаты вывода наэкран.
Исходная таблица
1.7 10 -1.3 2.1 3.1
3.1 1.7 -2.1 5.4 2.1
3.3 -7.7 4.4 -5.1 1.9
10 -20.1 20.4 1.7 1.8
Результат обработки при k=0 (сравните с ручным счетом)
1 5.882 -0.7647 1.235 1.824
0 -16.54 0.2706 1.571 -3.553
0 -27.11 6.924 -9.176 -4.118
0 -78.92 28.05 -10.65 -16.44
Результат обработки при k=1
1 0 -0.6684 1.794 0.5596
-0 1 -0.01636 -0.09498 0.2149
0 0 6.48 -11.75 1.708
0 0 26.76 -18.15 0.523
Результат обработки при k=2
1 0 0 0.5818 0.7358
0 1 0 -0.1247 0.2192
0 0 1 -1.814 0.2636
0 0 0 30.37 -6.529
Результат обработки при k=3
1 0 0 0 0.8608
0 1 0 0 0.1924
0 0 1 0 -0.1263
0 0 0 1 -0.215
Проверьте, что подстановка вуравнения значений x0=0.8608, x1=0.1924,
x2=-0.1263, x3=-0. 215 дает тождества.
Самостоятельно измените функциюпечати так, чтобы вместо таблиц на экран выводились уравнения (со знакамидействий и обозначениями неизвестных).
Заметим, что программа завершитсяаварийно, если в исходной системе на главной диагонали будет нулевой элемент.
Чтобы этого не случилось можнопереставить уравнения местами.
Пример программы, реализующеймодификацию данного алгоритма нечувствительную к нулевым элементам (методЖордана-Гаусса находится на диске в папке JrdGauss, в тексте учебника мы его разберемпри знакомстве с оконным интерфейсом ОС Windows).


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

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.