Алгоритм - последовательность действий, в результате которых из исходных данных получается искомый результат.
Графическое построение алгоритма:
-операция
-ввод-вывод
-начало и конец
-условие
-вывод на печать
-цикл
Система программирования – совокупность языка программирования и вирт. машины, обеспеч. вып. написанных на данном языке программ.
Вирт. машина содержит: транслятор (компилятор, интерпретатор), библиотеки стандартных программ, отладчик, компоновщик.
Состав языка С++:
Алфавит (состоит из прописных и строчных букв, арабских цифр, пробелов и разделит. символов, спец. символов);
Идентификатор (имя) – послед. букв, цифр и спец. символов. Первым симв. может быть буква или подчёркивание. (первые 32 симв. – значимые);
Ключевые слова (auto, double, int struct, else, long, switch, typedef, char, extern, void, case, float, default, for, signed, do if, sizeof, enum, short, while, break, return, union, continue);
Знаки операций – один или несколько символов, определяющих действия над операндами. Арифметич. операции: +, -, /, *. %-остаток от целочисл. деления; операции присваивания (=);
Программа сост. из одной или нескольких функций, main() – обязат.;
Структура программы:
-директивы препроцессора, -описание типов пользователя, -прототипы функции, -описание глобальных переменных, -тело функции;
Описание глобальных переменных – вне всех функций и один раз.
Операция присваивания:
операнд 1=операнд 2
оп.1 – только переменная, оп.2 – константа, переменная, выражение, функция.
Формы оп. присваивания (арифм. операц. с присваив.):
сложение с замещением, вычитание с замещением, умножение с замещением, деление с замещением, а%=с – устанавливает а равным остатку от деления на с.
Инкремент – увеличивает значение своего операнда на 1, декремент – уменьшает на 1.(префиксная форма – сначала действие, затем операнд используется, в постфиксной наоборот)
Функции библиотеки math.lib:
Переменная – именованная область памяти компьютера (значение переменной изменяется при работе программы).
Арифметические операции: +, -, *, /, %, ++, --.
Преобразование типов:
Неявное: char -> short -> int -> long -> float -> double -> long double;
Явное: static_cast <тип> (переменная);
Операция – действие, выполняемое над операндами, каждая операция обозначается определённым знаком.
Выражение – конструкция языка (формула) для вычисления значения в соответствии со значением операндов.
Базовые типы данных:
int целые (-32768 до 32767)
short (-||-)
long ( -2147483648 до 214748364)
char (-128 до 127)
bool (true, false)
double вещественные (1,7*10-308 до 1,7*10308)
float (3,14*10-38 до 3,14*1038)
long double (3,4*10-4932 до 3,4*104932)
Операции сравнения:
== - равенство (выводится 1, если true); != - неравенство; < - меньше; > - больше; <= - меньше или равно;
>= - больше или равно;
Логические операции:
Отрицание !; конъюнкция && (и); дизъюнкция || (или);
Побитовые операции (работают с числами побитово):
~ - (не) каждый бит меняет своё знач. на противопол.; & - (и) выполняет и с парами битов левого и правого операнда; |- (или); ^ - исключающее или (true, если истинным является только какой-то один); >> - сдвигает биты левого операнда на число разрядов правого;
Блок – составной оператор, состоит из одного или большего числа операторов любого типа, заключённых в фигурные скобки.
Оператор безусловной передачи управления goto:
goto метка; метка: оператор;
Оператор условного перехода if else: Оператор альтернативного выбора switch:
if (условие) оператор 1; switch (выражение)
else оператор 2; { case константа 1: оператор 1;
case константа N: оператор N;
default: оператор}
Тернарный оператор «?:»:
выражение 1 ? выражение 2 : выражение 3;
Компактная форма условного оператора if else.
Операторы передачи управления:
continue; (используется только внутри циклов) – досрочное завершение текущего шага и переход к следующему.
break; позволяет выйти из блока.
Операция последовательного вычисления «,»:
-организация строгой последовательности вычисления выражений.
выражение 1, выражение 2, … , выражение N;
Оператор с предусловием while:
while (выражение) код цикла; (вычисляется выражение, если выражение истинно – выполняется код цикла и управление переходит к началу цикла)
Оператор с постусловием do while:
do код цикла; while (выражение); (выполняется код цикла, а затем, если выражение истинно, выполняется ещё раз)
Оператор с предусловием и коррекцией for:
for(выражение 1; выражение 2; выражение 3) код цикла;
(если выражение 2 истинно, то выполняется код цикла и выражение 3)
Декларация статических массивов:
тип идентификатор [размер]; – одномерный массив;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
с[0] c[2]
тип идентификатор [размер 1][размер 2]…[размер N]; - многомерный;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
c[0][0] c[0][1] c[0][2] c[1][0] c[1][1] c[1][2]
обращение – по индексу;
Ввод-вывод массивов осуществляется циклом.
Генерация последовательности случайных чисел:
функции: rand()-генерирует случайное число из диапазона от 0 до RAND_MAX;
srand()-изменяет начальное число генератора псевдослучайных чисел;
time()-возвращает текущ. календ. время, если время не задано возвращ. число -1.
Основные алгоритмы работы с массивами:
Сумма элементов: s=0; for(int i=0;i<n;i++) s+=a[i];
Произведение элементов: s=1; for(int i=0;i<n;i++) s*=a[i];
Нахождение максимального и минимального: max=min=a[0]; for(int i=1;i<n;i++)
{ if(a[i]<min) min=a[i]; else if(a[i]>max) max=a[i];}
Нахождение среднего значения: for(int i=0;i<n;i++) s+=a[i]; s/=n;
Указатель:
тип *идентификатор; (тип указателя должен совпадать с типом переменной, адрес которой он хранит)
Операции с указателями:
& - получить адрес переменной;
* - получить значение переменной по её адресу;
= - присвоить указателю адрес переменной;
++ - увеличить на 1(после увеличение указатель будет указывать на след. элемент массива)
-- - на предыдущий элемент массива;
+ - увеличить указатель на целое значение;
+= - увеличить существующий указатель на целое значение;
- - уменьш. указат. на целое значение или вычесть другой указ., если указ. на элементы одного и того же массива;
-= - -||- /существующий указатель/
сравнения;
new – выделение памяти (указатель на начало выделенного блока памяти);
delete – освобождение памяти (освободить выдел. блок и сделать указат. недоступным);
Указатель типа void применяется, если тип объекта заранее неизвестен.
Указатель на объект содержит адрес объекта известного типа.
Инициализация указателя нулевым значением: тип *идентификатор = NULL; - ни на что не указывает;
Идентификатор одномерного массива – адрес его первого элемента.
a[i]~*(a+i);
Создание двумерного динамического массива:
double **mas;
mas=new double*[n];
for(i=0;i<n;i++) mas[i]=new double[m];
Освобождение памяти:
for(i=0;i<n;i++) delete []mas[i];
delete []mas;
mas=NULL;
Функции библиотеки malloc.lib:
void *malloc (size) – выделяет область памяти размером size байт и возвращ. адрес выдел. блока памяти; void *calloc (n,size) - выделяет область памяти размером n блоков по size байт (под массивы); void *realloc(*u,size) – измен. размер памяти связ. с указателем u на новое число байт; void free(*u) – освобождает участок памяти, связ. с указателем *u;
Строка:
char имя строки [размер];
строка обязательно заканчивается нулевым символом “\0”;
Функции библиотеки string.lib:
Структура – объединяет логически связанные данные разных типов и представляет собой набор переменных, которые объединены общим именем.
Отдельн. данные – поля.
Вложенные структуры – элементы структуры тоже структуры.
struct идентификатор {тип эл.1 имя эл.1;
тип эл.2 имя эл.2;};
(struct Address{…}a; ~ Address a;) – структурная переменная.
Операция точка(.) – для доступа к элементам структуры по имени переменной типа структуры; (cin>>a.city>>a.street)
Операция стрелка(->) – для доступа к элементам структуры через указатель на переменную;(Address *p=new Address; cin>>p->city>>p->street;)
Присваивание структур (Address copy; copy=a;copy=*p;)
Объединения(union):
Размещают под одним именем совокупность данных таким образом, что размер выдел. памяти был достаточен для размещения данного, имеющего max размер. Используется в случае, когда отдельные поля существуют в различные моменты времени. union имя{набор полей};
Перечисления(enum):
Задают множество значений для заданной пользователем переменной.
enum имя{набор значений};
Функция – именованная группа операторов, которая выполняет обработку данных и которую можно неоднократно вызывать из различных частей программы.
тип имя (список типов параметров); - прототип функции (объявление).
тип имя (тип параметра идентифик. параметра) {тело функции} – определение ф-и.
Вызов функции:
имя (список параметров/*может отсутствовать*/)
(*указатель на функцию) (спис. пар.)
Передача данных в функцию:
по значению: формальному параметру присваивается копия фактического. Внутри функции изменения происходят с копией.
по ссылке: так же, как и по указателю. Но у ссылки нет адреса.
по указателю: внутри функции открывается доступ к фактическому параметру. Все изменения отражаются на работе фактического параметра.
Параметры ф-и по умолчанию:
Константное значение. Записывается в прототипе ф-и после типа и знака =. Используется, если при вызове не указывается фактический параметр.
Перегрузка функции:
Возможность называть несколько разных функций одним и тем же именем (для void): void func (void); void func (int n); void func (double d) – разные ф-ии.
Передача массивов в функцию:
в качестве параметра – адрес массива. В качестве ещё одного параметра – размер.
void func (const int* p, int size)
Функции с переменным числом параметров:
При вызове функции с переменным числом параметров в вызове этой функции задается любое требуемое число аргументов. В объявлении и определении такой функции переменное число аргументов задается многоточием в конце списка формальных параметров или списка типов аргументов.
Указатели на функции:
тип (*переменная-указатель)(список параметров)-прототип;
переменная-указатель=ID функции – устанавливаем указатель на функцию;
Классы памяти - определяет время существования и область видимости программного объекта.
auto-локальные объекты, объявленные в коде функции, extern-позволяет функции использовать внешнюю переменную, даже если она определяется позже в этом или другом файле,static-в статической памяти, время жизни - постоянное,register-объекты целого типа и символы – в регистровой памяти.
Область действия объекта - часть кода программы, в которой его можно использовать. Переменная может быть локальной (внутренней) и глобальной (внешней).
Время жизни: постоянное – в течение выполнения программы, временное – в течение выполнения функции (блока) программы.
Функции библиотеки stdio.lib:
scanf - вводит строку до появления пробела
gets – ввод строки, которая может содержать пробелы
printf, puts – вывод строк
putc - записывает символы в файл
getc – берёт символы из файла
Директивы препроцессора:
#include – включает в текст программы содержимое указанного файла.
#define (#define идентификатор текст) – заменяет все последующие вхождения идентификатора на текст.
#undef – (#undef идентификатор) отмена действий #define.
1) min и max значение эл. одномерного массива
min=max=a[0];
for(i=1;i<n;i++){if(a[i]<min)min=a[i];else if(a[i]>max)max=a[i];}
2) отсортировать элементы по возрастанию
for(i=0;i<n-1;i++)
for(j=0;j<n;j++)
if(a[i]>a[j]) {t=a[i]; a[i]=a[j]; a[j]=t;}
3) удалить из одномерного массива все отрицат. числа
for(i=0;i<n;i++)
if(a[i]<0)
{ for (j=i+1;j<n;j++) a[j-1]=a[j]; n--; i--;}
4) расположить эл. массива в обратном порядке
for(i=0;i<n/2;i++) {t=a[i];a[i]=a[n-i-1]; a[n-i-1]=t;}
5) элементы массивов упорядочены по возрастанию. Объединить элем. этих 2х массивов в один так, чтобы он был тоже упорядочне по возраст
k=i=j=0;
while(i<n&&j<n) {if(x[i]<y[j]) {z[k]=x[i];i++;} else{z[k]=y[j];j++;} k++; }
while(i<n) {z[k]=x[i];i++;k++;}
while(j<n){z[k]=y[j];j++;k++}
6) ДВУМЕРН. Найти сумму эл. лежащ. на главной диагонали
s=0;
for(i=0;i<n;i++)s+=a[i][i];
7)Найти сумму элементов на побочной диагонали
s=0;
for(i=0;i<n;i++) s+=a[i][n-i-1];
8)Переставить местами две строки с номерами k1 и k2
for(j=0;j<m;j++) { t=a[k1][j]; a[k1][j]=a[k2][j]; a[k2][j]=t}
9)найти сумму элементов выше главной диагонали
s=0;
for(i=0;i<n-1;i++)
for(j=i+1;j<m;j++) s+=a[i][j];
10)выше побочной
s=0;
for(i=0;i<n-1;i++)
for(j=0;j<m-i-1;j++) s+=a[i][j];
11)транспонировать массив относительно главной диаг.
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++) { t=a[i][j]; a[i][j]=a[j][i]; a[j][i]=t;}
12) относительно побочной
for(i=0;i<n-1;i++)
for(j=0;j<n-i-1;j++) { t=a[i][j]; a[i][j]=a[n-j-1][m-i-1]; a[n-j-1][m-i-1]=t;}
13) сумму элементов леж. ниже главной и побочной
s=0;
for(i=n/2+1;i<n;i++)
for(j=n-1;j<i;j++) s+=a[i][j];
Параметры по значению:
#include <math.h>
#include <iomanip.h>
#include <iostream.h>
double fun(double,double,double,int,double);
int main()
{
double a,b,h,x,s;
int n;
cout<<"enter a ";
cin>>a;
cout<<"enter b ";
cin>>b;
cout<<"enter h ";
cin>>h;
cout<<"enter n ";
cin>>n;
cout<<setw(3)<<"x"<<setw(15)<<"S(x)"<<endl;
for(x=a;x<b+h/2.;x+=h)
{
s=fun(a,b,h,n,x);
cout<<setw(3)<<x<<setw(15)<<s<<endl;
}
return 0;
}
double fun(double a,double b,double h,int n,double x)
{
int j;
double s= /*Начальные значкния*/,c= /*Начальные значкния*/;
for(j=1;j<n;j++)
{
c*=/*Рекурентная часть*/;
s+=c/*Не рекурентная часть*/;
}
return s;
}
По ссылке:
#include <math.h>
#include <iomanip.h>
#include <iostream.h>
double fun(double &,double &,double &,int &,double &);
Int main()
{
double a,b,h,x,s;
int n;
cout<<"enter a ";
cin>>a;
cout<<"enter b ";
cin>>b;
cout<<"enter h ";
cin>>h;
cout<<"enter n ";
cin>>n;
cout<<setw(3)<<"x"<<setw(15)<<"S(x)"<<endl;
for(x=a;x<b+h/2.;x+=h)
{
s=fun(a,b,h,n,x);
cout<<setw(3)<<x<<setw(15)<<s<<endl;
}
return 0;
}
double fun(double &a,double &b,double &h,int &n,double &x)
{
int j;
double s=1/*Начальные значкния*/,c=1/*Начальные значкния*/;
for(j=1;j<n;j++)
{
c*=pow(x,2)/(2*j*(2*j-1))/*Рекурентная часть*/;
s+=c/*Не рекурентная часть*/;
}
return s;
}
По указателю:
#include <math.h>
#include <iomanip.h>
#include <iostream.h>
double fun(double* ,double* ,double* ,int* ,double* );
Int main()
{
double a,b,h,x,s;
int n;
cout<<"enter a ";
cin>>a;
cout<<"enter b ";
cin>>b;
cout<<"enter h ";
cin>>h;
cout<<"enter n ";
cin>>n;
cout<<setw(3)<<"x"<<setw(15)<<"S(x)"<<endl;
for(x=a;x<b+h/2.;x+=h)
{
s=fun(&a,&b,&h,&n,&x);
cout<<setw(3)<<x<<setw(15)<<s<<endl;
}
return 0;
}
double fun(double *a,double *b,double *h,int *n,double *x)
{
int j,m;
double y;
m=static_cast<int>(*n);
y=static_cast<double>(*x);
double s=1 /*Начальные значения*/,c=1 /*Начальные значения */;
for(j=1;j<m;j++)
{
c*=pow(y,2)/(2*j*(2*j-1))/*Рекурентная часть*/;
s+=c/*Не рекурентная часть*/;
}
return s;
}
Список товаров…
#include <iomanip.h>
#include <iostream.h>
#include <string.h>
#include <stdio.h>
Int main()
{
struct sklad
{
Int data,cena,kolvo;
char naim[40];
}spisok[100];
int i,n;
cout<<"vvedite kol-vo predmetov"<<endl;
cin>>n;
for (i=0;i<n;i++)
{
cout<<"vvedite naimenovanie: "; cin>>spisok[i].naim;
cout<<"vvedite kolichestvo edinic: "; cin>>spisok[i].kolvo;
cout<<"vvedite ceny: "; cin>>spisok[i].cena;
cout<<"vvedite daty: "; cin>>spisok[i].data;
}
for (i=0;i<n;i++)
if (spisok[i].data>30 && spisok[i].cena>100000)
cout<<setw(10)<<spisok[i].naim<<" "<<"kolichestvo edinic:"<<spisok[i].kolvo<<endl;
return 0;
}
Справочная автовокзала…
#include <iostream.h>
#include <iomanip.h>
#include <stdio.h>
#include <string.h>
Int main()
{
struct xx
{
int num;
char pnaz[20];
int ot, pr;
}
xxx[100];
int i,n,k=0;
cout<<"Vvedite kol-vo reisov: ";
cin>>n;
for(i=0;i<n;i++)
{
cout<<"Nomer avt: "; cin>>xxx[i].num;
puts("Punkt naznachenia"); gets(xxx[i].pnaz);
cout<<"Vvedite vremya otpravlenia: "; cin>>xxx[i].ot;
cout<<"Vvedite vremya pribitiya: "; cin>>xxx[i].pr;
cout<<endl;
}
for(i=0;i<n;i++)
if(xxx[i].ot>13 && xxx[i].ot<17)
k++;
cout<<"Kol-vo iskomich reisov: "<<k<<endl;
return 0;
}
Книги…
#include <iomanip.h>
#include <iostream.h>
#include <string.h>
#include <stdio.h>
Int main()
{
struct biblioteka
{
Int god,nomer;
char avtor[40],nazv[40];
}kniga[100];
int i,n,g;
cout<<"vvedite kol-vo knig"<<endl;
cin>>n;
for (i=0;i<n;i++)
{
puts("vvedite avtora: "); gets(kniga[i].avtor);
puts("vvedite nazvanie: "); gets(kniga[i].nazv);
cout<<"vvedite registracionnbIi nomer: "; cin>>kniga[i].nomer;
cout<<"vvedite god izdaniia: "; cin>>kniga[i].god;
}
cout<<"zadaite nygnbIi god"; cin>>g;
for (i=0;i<n;i++)
if (kniga[i].god<g)
cout<<setw(10)<<kniga[i].nazv<<" "<<kniga[i].avtor<<endl;
return 0;
}
Абитуриенты…
#include <iomanip.h>
#include <iostream.h>
#include <string.h>
#include <stdio.h>