Инструкции C++
Условная инструкция Формат: if (условие) оператор; else оператор; Пример: if (i!=0) { if (j) j++; if(k) k++; else if(p) k--; } else i--; Формат: switch (выражение) { case константа: набор операторов; break; … default: набор операторов; } Инструкция выбора
Циклы С предусловием: while (условие) оператор; С постусловием: do оператор; while (условие); Пересчетного типа: for(инициализация;условие;приращение)оператор;
Инструкции перехода break; Пример: for(int I=0; I0) continue; goto loop_exit; } loop_exit: … Инструкция безусловного перехода Формат: goto метка; Используется только в случаях крайней необходимости! break; }
Функции Функция до её использования должна быть описана или объявлена в виде (имена параметров игнорируются): Прототип_функции; Функция должна быть описана только один раз в виде: Прототип_функции { тело_функции } Формат прототипа: Тип_возвращаемого_значения имя(список_параметров) Формат списка параметров: тип имя_аргумента,…,тип имя_аргумента Функцию можно определить со спецификатором inline inline int fac(int n) {return (n
Возвращаемое значение Любая функция, если она не объявлена как void, должна возвращать значение. Это значение задается в инструкции return выражение; - инициализации неименованной переменной возвращаемого типа. Функция может иметь несколько инструкций return. Если функция не возвращает значения, то выражение в инструкции return может быть пустым или вызовом функции типа void.
Пример. int fac(int n) { if(n>1) return n*fac(n-1); return 1; } Ошибка. int* fp(void) {int& fr(void) { int local=1; return &local; return local; }} Возвращается адрес локальной переменной, которая будет уничтожена. Значение, на которое будет указывать этот адрес, будет меняться непредсказуемо!
Передача аргументов По значению void val(int i) { i++; } void main() { int k=0; val(k); cout
Функции с неопределенным числом аргументов #include #include int average( int first,... ); void main() { cout
Аргументы функции main #include void main(int n,char* s[]) {cout
Ввод/вывод Ввод-вывод на консоль. Файловый ввод-вывод.
Ввод/вывод символов int getchar();int putchar(int); #include void main() { int c; while(c=getchar()) putchar(c); } #include void main() { int c; while((c=getchar())!=EOF) putchar(c); } int getch(); int getche();
Ввод-вывод строк char *gets(char*)int puts(char*) #include void main() { char s[80]; gets(s); puts(s); } NB: gets(); - не проверяет выход за границы массива!
Форматированный ввод/вывод int printf(const char*,…)int scanf(const char*,…) Спецификаторы преобразования: %c – символ; %s – строка; %d или %i – десятичное целое со знаком; %u – десятичное целое без знака; %о – восьмеричное без знака; %х или %Х – шестнадцатеричное без знака; %е или %Е – вещественное в форме с плавающей точкой; %f – вещественное в форме с фиксированной точкой; %g или %G = %f или %e, зависит от того, какая форма короче; %p – указатель; % – знак %.
Форматированный ввод/вывод int printf(const char*,…)int scanf(const char*,…) ::= h | l | L | F | N | | # | - | + | ::=.* |. ::= * | | 0
Пример #include void main() {int i1,i2; double a=0.1e-6; char s[80]; scanf(%d %d %s,&i1,&i2,s), printf(i1=%i i2=%i %5.7s %s\n,i1,i2,s,s); printf("%10g %10g\n",a,1000*a); printf("%#0*.*g\n",i1,i2,a); printf("%-20g%c\n",a,'*'); } i1=21 i2= e e-07 1e-07 *
Файловый ввод/вывод fopen(); fputc(); или putc(); fputs(); fprintf(); rewind(); fseek(); remove(); fclose(); fgetc(); или getc(); fgets(); fscanf(); feof(); ftell(); ferror(); FILE *имя;
Открытие файла fopen(const char* Имя, const char* Режим); rbОткрыть текстовый/двоичный файл для чтения; wbСоздать текстовый/двоичный файл для записи; abДобавить в конец текстового/двоичного файла; r+bОткрыть текстовый/двоичный файл для чтения/записи; w+bСоздать текстовый/двоичный файл для чтения/записи a+bДобавить в конец текстового/двоичного файла или создать текстовый/двоичный файл для чтения/записи Прямой доступ fseek(FILE * Уф, long число_байт, int Точка_отсчета ); Точка отсчета:SEEK_SETОт начала файла SEEK_CURОт текущей позиции SEEK_ENDОт конца файла
Пример #include void main() { FILE *fp; char ch; if(!(fp=fopen("file.dat","r+"))) { printf("File open error!\n"); exit(1); } for(int i=0;i
Полиморфизм – один интерфейс, множество методов void print(long);// печать целого void print(char*);// печать символьной строки void print(float);// печать вещественного Проблема: print(10); 1.Не требуется преобразования типа (int и const int). 2.Существует стандартное преобразование типа с расширением точности (int в long). 3.Тоже с возможной потерей точности (double в int). 4.Преобразование типа определено пользователем. 5.С переменным числом аргументов.
Указатель на функцию #include double I(double a,double b,int n,const double (&F)(double)) {double h=(b-a)/n--,s=(F(a)+F(b))/2; while(n--) s+=F(a+=h); return s*h; } double f(double x) { return x; } void main() {cout
Макросы Расширение исходного кода #include #include имя_файла Вставить определение Определить константу #define имя_макроса список_лексем #define va_list void* #define sqr(x) (x)*(x) #define имя константа #define array_size 128 NB!#define sqr(x) x*x A=sqr(a+b); // A=a+b*a+b; Условной компиляции #if#ifdef#ifndef … #else#elif … #endif
Библиотечные функции #include #define eof (-1) int getchar(void); int putchar(int); int printf(char*,…); int scanf(char*,…); #include double sin(double); double cosh(double); double exp(double); double sqrt(double); double pow(double,double); #include #define NULL 0 char* strcpy(char*, const char*); int strcmp(const char*,const char*); int strlen(const char*); char* strstr(const char*,const char*); #include int getch(void); int getche(void); int putch(int); void gotoxy(int,int);
От проектирования процедур к организации данных #include struct complex { double re,im; }; void main(void) {complex a; a.re=1.; a.im=2.; cout
Инкапсуляция #include struct complex { double re,im; void assign(double r,double i) { re=r; im=i; } void print(void); }; void complex::print(void) { cout
Сокрытие данных #include struct complex { private: double re,im; public: void assign(doble r,double i) { re=r; im=i; } void print(void); }; void complex::print(void) { cout
Конструкторы class complex { double re,im; public: complex(double r=0.,double i=0.) { re=r; im=i; } void print(void) const; }; void complex::print(void) const { cout
Преобразование типов class complex { double re,im; public: complex(double r=0.,double i=0.) { re=r; im=i; } operator double() { return sqrt(re*re+im*im); } void print(void) const; }; void complex::print(void) const { cout
Перегрузка операторов class complex { double re,im; public: complex(double r=0.,double i=0.) { re=r; im=i; } operator double() { return sqrt(re*re+im*im); } complex operator +(double b){ return complex(re+b,im); } complex operator+(complex a) { return complex(a.re+re,a.im+im); } void print() const { cout
Дружественные функции class complex { double re,im; public: complex(double r=0.,double i=0.) { re=r; im=i; } operator double() { return sqrt(re*re+im*im); } friend complex operator+(double,complex); complex operator +(double b){ return complex(re+b,im); } complex operator+(complex a) { return complex(a.re+re,a.im+im); } void print() const { cout
Перегрузка оператора
Шаблон template class complex { T re,im; public: complex(T r=0, T i=0) { re=r; im=i; } operator T() { return sqrt(re*re+im*im); } complex operator+(T b){return complex (re+b,im); } complex operator+(complex a) {return complex (re+a.re,im+a.im); } friend ostream& operator &); }; template ostream& operator & a) { s
Пример