Файл: Литература Герберт. Шилдт. С руководство для начинающих.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 16.03.2024

Просмотров: 19

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

КУРС ЛЕКЦИЙ ПО ЯЗЫКУ ПРОГРАММИРОВАНИЯ C++

Первый семестр

Литература


  1. Герберт. Шилдт. С++ руководство для начинающих

  2. Т.А. Павловская. С/С++ Программирование на языке высокого уровня

  3. Никлаус Вирт. Алгоритмы и структуры данных

  4. Т.А. Павловская, Ю.А. Щупак С/C++ Структурное программирование. Практикум

  5. В.В. Лаптев , А.В. Морозов , А.В.Бокова. С++ объектно-ориентированное программирование. Задачи и упражнения

  6. Н. Культин . С/С++ в задачах и примерах

  7. Л.З. Шауцукова. Информатика 10-11



Методическая литература
1. В.С. Кугураков, Р.К. Самитов, В.В. Кугуракова

Практикум на ЭВМ. Методические указанияи задачи для программирования

по теме : Основные структуры управления

2. В.С. Кугураков, Р.К. Самитов, В.В. Кугуракова

Практикум на ЭВМ. Методические указанияи задачи для программирования \

по теме : Циклическая структура управления. Массив как стуктура данных

3. В.С. Кугураков, Р.К. Самитов, Р.Б. Ахтямов, В.Р. Байрашева

Практикум работы на ЭВМ.

Задание 1. Структуры управления и массивы – числовые задачи

4. В.С. Кугураков, Р.К. Самитов, Р.Б. Ахтямов, В.Р. Байрашева

Практикум работы на ЭВМ.

Задание 2. Процедуры и функции

5. В.С. Кугураков, Р.К. Самитов, Р.Б. Ахтямов, В.Р. Байрашева

Практикум работы на ЭВМ.

Задание 3. Представление данных и методы разработки алгоритмов

6. В.С. Кугураков, Р.К. Самитов, Р.Б. Ахтямов, В.Р. Байрашева

Практикум работы на ЭВМ.

Задание 4. Синтаксический анализ простых формальных языков

Лекция№1
Введение в C++
Вычисление объема конуса

Формула:1/3*π*R2*h

π =pi=3.14 определяется как константа
Листинг программы
#include //описание объекта cin и cout

using namespace std;

const double pi=3.14;

imt main() //основная функция

{

double V, h, R; // объявление переменных

cout<<"Enter R= "; //просьба ввести радиус конуса

cin>>R; //ввод данных

cout<<"Enter h= "; //просьба ввести высоту конуса

cin>>h; //ввод данных

V=R*R*h*pi/3;// оператор присваивания

сout<<<<"Enter V= " <
return 0;

}
Рассмотрим каждую строчку отдельно.


  1. #include

В языке С++ определены ряд заголовочных файлов , которые содержат информацию ,

необходимую для программы.

В данном случае #include - директива препроцессора. include – включить

h файл с именем iostream в исходный текст программы. Файл iostream используется для поддержки С++ системы ввода и вывода. В данном случае компилятору необходимо знать описание объектов cin и cout


  1. const double pi=3.14;

Объявление вещественной константы pi
3/ int main()

int – тип функции ( функция возвращает целые значения )

main- имя функции. Выполнение С++- программы начинается и заканчивается выполнением функции main()

4. {

Фигурная открывающая скобка { - начало блока

Блок

{

операторы

}

  1. double V, h, R;

Объявление вещественных переменных


  1. cout<<”Enter R= ”;

Это инструкция вывода символьной константы

<<”Enter R= ” на консоль. При выполнении этой инструкции на экране компьютера появится сообщение Enter R=. В этой инструкции используется оператор вывода <

Он обеспечивает вывод выражения, стоящего с правой стороны , на устройство, стоящего с левой. Слово cout представляет собой встроенный идентификатор ( consol output ),

который означает экран компьютера.

  1. cin>>R;

cin – встроенный идентификатор, в данном случае он связан с клавиатурой.

>> - оператор ввода в С++

Иденитификатор R принимает символы , вводимые с клавиатуры.


  1. V=R*R*h*pi/3

Это выражение представляет собой оператор присваивания.

Вычисляется выражение R*R*h*pi/3 и его значение устанавливается для переменной V (говорят , что переменной V присваивается значение вырыжения R*R*h*pi/3)


  1. }

Закрывающая фигурная скобка } означает конец блока.
Примечание : все инструкции долдны завершаться символом ;

Типичная среда разработки С++
Давайте разберем, поэтапно, создание и исполнение приложения С++ в типичной среде разработки С++. Системы С++ обычно состоит из трех частей: среды разработки, языка и Стандартой библиотеки С++.

Инструменты среды обработки C++

- Borland C++ Builder,

- Microsoft Visual Studia C++ 6

- Microsoft Visual Studia 2010 Express

- Microsoft Visual C++ .NET

( работают под операционной системой Windows)

- GNU C++ в Linux (общее название Unix – подобных операционных систем)
Программы на С++ проходят шесть стадий:

  1. редактирования

  2. препроцессорной обработки

  3. компиляции

  4. компоновки

  5. загрузки

  6. исполнения



Типичная среда
1. Программа создается редактором и сохраняется на диске

Редактор ↔Диск
2. Программа предварительно обрабатывается. Преобразование кода

Препроцессор Диск
3. Объектный код и сохранение его на диске

Компилятор↔ Диск
4. Компоновщик связывает объектный код с библиотеками (редактор связи)

Компоновщик↔Диск
5. Загрузчик создает исполняющий файл и сохраняет на диске. Размещение программы в памяти

Загрузчик Диск



ОЗУ
6. Процессор выбирает каждую инструкцию и выполняет ее, возможно сохраняя новые значения.

Процессор↔ ОЗУ
Стадия 1. Создание программ
Первая стадия состоит в редактировании файла с помощью программ редактора.

С помощью редактора вы вводите программу на С++ ( которую обычно называют исходным кодом) вносите необходимые исправления и сохраняете программу на вторичном запоминающем устройсте , например ,на жестком диске. Файлы исходного кода С++ часто имеют расширение .cpp, .cxx, .C , показывающие, что файл содержит исходный код С++

Стадия 2. Препроцессорная обработка программы
На второй стадии программист дает команду скомпилировать программу. В системе С++ перед началом компиляции автоматически исполняется программа- препроцессорю.

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

Стадия 3. Компиляция программы
На третьей стадии компилятор транслирует программу на С++ в код машинного языка

( называемый также объектным кодом )
Стадия 4. Компоновка.
Четвертая стадия называется компоновкой (linking). Программы С++ обычно содержат ссылки на функции и данные , определяемые в другом месте (или проект содержит несколько cpp файлов) , например , в библиотеках или частных библиотеках группы программистов, работающих над конкретным проектом. Из-за отсутствия этих частей в программах С++ имеются “дыры”. Компоновщик (linker) присоединяет к объектному коду код отсутствующих функций, чтобы создать исполняемый образ. Если программа успешно компилируется и компонуется , образуется исполняемый файл.

Стадия 5. Загрузка
Для того чтобы программа смогла исполняться , необходимо поместить ее в память. Это выполняется программой загрузчиком


Стадия 6. Исполнение
Наконец , компьютер под управлением центрального процессора, исполняет программу одиночными инструкциями.

Переменные
Тип Диапазон Размер

bool true 1; false 0 1байт

char

signed -128 до 127 1байт

unsigned 0 до 255 1 байт

Int

signed mod 232-1 4 байтa

unsigned 0 до 4 294 967 295 4 байтa

Double 3.4e-308-1.7e+308 8 байов

Лекция№2
Алгебра логики

Bool a,y,z

True-истина

False-ложь

Операции

Конъюнкция

&&- *, ^.& -and

Дизъюнкция

||-v-or

Отрицание

!- ⌐X-not


X

Y

X&Y

XVY

X

0

0

0

0

1

0

1

0

1

1

1

0

0

1

0

1

1

1

1

0



Правило де Моргана

⌐XvY= ⌐X&⌐Y ⌐ X&Y= ⌐Xv ⌐Y

X

Y

XVY

XVY

X

Y

X&⌐Y

0

0

0

1

1

1

1

0

1

1

0

1

0

0

1

0

1

0

0

1

0

1

1

1

0

0

0

0



X&(Y v Z)=X&Y v X&Z

X v (Y&Z) =(X v Y) & (X v Z)

X v ⌐X =1

X & ⌐X =0
Импликация

Из X следует Y

X

Y

XY

0

0

1

0

1

1

1

0

0

1

1

1



Пересечение X ^ Y

Объединение X v Y

Пример


D=D1^D1^D2^D3^D4

(X,Y) € D →((X,Y) € D1)& ((X,Y) € D2)& ((X,Y) € D3)& ((X,Y) € D4)

На языке С

(X,Y) € D →(Y>=X-1)&& (Y<=X+1)& & (Y<= -X+1)&& (Y >= -X-1)


D=D1vD1vD2vD3vD4



(X,Y) € D→(Y>=X-1) || (Y<=X+1)|| (Y<= -X+1)|| (Y >= -X-1)



A € X\Y=X ^ Y

X\Y c X ^ Y

X ^ Y c X\Y

Доказательство:

  1. p € X\Y=(p € X)&(p € Y )= p € X ^ Y

  2. p € X ^ Y= (p € X)&(p € Y )= p € X\Y

D1\D2

(X,Y) € D1\D2 =(X,Y) € D1^ D2

((X,Y) € D1)&&((X,Y) € D2)↔ ((X,Y) € D1)&&!(( X,Y) € D2)

Лекция№3
Операторы

Условный оператор

Полный

If ( B) C1; else C2;

если условие В истинно, то выполнится действие C1;

если условие В ложно, то выполнится действие C2;


Неполный

If ( B) C1;



Блочный оператор

if (B) {c1;c2;}

else c3;

*{c1;c2;}-блок операторов



Примеры

1)Вычисление max

x, y

max=max{x, y}


if (x
else max=x;

max=max{x, y, z}

1)



if (x
if (y
else max=y;

else if (x
else max=x;
2)



max=x;

if (max
if (max
3)



if (1) {if (2) 1;}

else 2;

4)

if (1)

if (2) 1;

else 2;

5)

if (1)

{

1;

if (2) {2;3;}

else {4;5;}

6;

}

else

{

if (3)

{

if (4) {3;4;}

}

else 9;

10;

}

6) Решение квадратного уравнения ax2+bx+c=0



#include "stdafx.h"

# include

# include

using namespace std;
int main()

{

double a ,b, c;

double x, d, x1, x2;

cout<<"Enter a=";

cin>>a;

cout<<"Enter b=";

cin>>b;

cout<<"Enter c=";

cin>>c;

if (a==0)

{

if (b==0)

{

if (c==0) cout<<"x-any number"<
else cout<<"no solution"<
}

else

{

x= -c/b;

cout<<"x="<
}

}

else

{

d=b*b-4*a*c;

if (d>=0)

{

x1=( -b+ sqrt(d))/(2*a);

x2= (-b- sqrt(d))/(2*a);

cout<<"x1="<
cout<<"x2="<}

else cout<<"no solution"<
}

cout<
system("pause");

return 0;
}

Примечание

Возведение в степень

b2=pow(b,2)

Нельзя объявлять переменную два раза в одном и том же блоке

int main()

{

int i;

i=5;

{

int i;

i=10;

cout<
}

cout<
system("pause");

return 0;

}
Лекция №4

Системы счисления

Циклы
Десятичная 0,1,2,3,4,5,6,7,8,9

904=9*102+0*10+4*100

Двоичная 0,1

1012=1*22+0*2+1*20=510

Троичная 0,1,2

1013=1*32+0*3+1*30=1010

Шестнадцатеричная 0,1,2,3,4,5,6,7,8,9,A, B, C, D

ABBA16=10*163+11*162+11*16+10*160=40960+2816+176+10=4396210

Перевод вещественных чисел из одной системы в другую

904,90410=1110001000,1112

Перевод целой части

904/2=452 остаток 0

452/2=226 остаток 0

226/2=113 остаток 0

113/2=56 остаток 1

56/2=28 остаток 0

28/2=14 остаток 0

14/2=7 остаток 0

7/2=3 остаток 1

3/2=1 остаток 1

Перевод дробной части

0,904*2=1,808

0,808*2=1,616

0,616*2=1,232

0,232*2=0,464

Перевод из двоичной системы в четверичную, восьмеричную, шестнадцатеричную.

0110111011100011=123232034

= 673438

=6ЕЕ316

10 16 2

0 0 0000

1 1 0001

2 2 0010

9 9 1001

10 А 1010

11 B 1011

12 C 1100

13 D 1101

14 E 1110

15 F 1111
10010=11001002=12104=1448=6416

int x =100

количество байтов=4 байт

1 байт=8 бит 4 байта=32бит

Инверсия битов

0→1

1→0

Прибавляя к коду 1, получаем число в дополнительном коде

0,25*1010-порядок



Мантисса

Double 4 байта

1234 - мантисса

Порядок

Примечание

int x=100; double y=2.5;

y-y+x- тип double
Циклы


1) Цикл с предусловием

while (B) C;



Пустой цикл


Бесконечный цикл




while (B)

{

C1;C2;C3;

}



2) Цикл с постусловием

do C while ( B)




Пример 1

С помощью цикла while вычислить

y=1+2+3+..+n

y=∑in i



#include "stdafx.h"

#include

using namespace std;
int main()

{

int i ,y, n;

cout<<"Enter n=";

cin>>n;

y=0;

i=1;

while (i<=n)

{

y=y+i;

i++;

}

cout<<"y="<
system("pause");

return 0;

}

С помощью цикла do while вычислить

y=1+2+3+..+n


#include "stdafx.h"

#include

using namespace std;
int main()

{

int i ,y, n;

cout<<"Enter n=";

cin>>n;

y=0;

i=1;

do {

y=y+i;

i++;

} while (i<=n);

cout<<"y="<
system("pause");

return 0;

}
Пример 2

y=1/1!+1/2!+1/3!+…1/n!

y=y+1/f - тип double

#include "stdafx.h"

#include

using namespace std;

int main()

{
int i ,f, n;

double y;

cout<<"Enter n=";

cin>>n;

y=0;

i=1;

f=1;

while (i<=n)

{

f=f*i;

y=y+(double)1/f;

i++;

}

cout<<"y="<
system("pause");

return 0;
}
Пример 3

Вычислить y=sin(x)

sin (x) =x -x3/3!+x5/5!-x7/7!+…

sin( x) = ∑0 (-1)i x2i+1 / (2i+1)!
1 способ

step=x

znak=1

fact=1

y=y+ step*znak/fact
#include "stdafx.h"

#include

# include

using namespace std;
int main()

{

int i, n, fact, znak;

double y,x,step;

cout<<"enter x=";

cin>>x;

cout<<"enter n=";

cin>>n;

y=x;

znak=1;

step=x;

factorial=1;

for ( i=1;i<=n;i++)

{

znak=-znak;

step=step*x*x;

fact=fact*2*i*(2*i+1);

y=y+znak*stepen/fact;

}

cout<<"y="<
cout<<"sin(x)= "<
system("pause");

return 0;

}

/////////////////////////////////////////////////////////////////////

Исключения в С++ (exception)

throw  (в переводе — обработать, запустить), 

try (попытка), 

catch (поймать, ловить).

#include "stdafx.h"

#include

# include

using namespace std;
int main()

{

setlocale(LC_ALL,"ru");

int i, n, fact, znak;

double y,x,step;

cout<<"enter x=";

cin>>x;

cout<<"enter n=";

cin>>n;

y=x;

znak=1;

step=x;

fact=1;

for ( i=1;i<=n;i++)

{

znak=-znak;

step=step*x*x;

try

{

fact=fact*2*i*(2*i+1);

if( fact<0) throw 100;

if( fact==0) throw 200;

}

catch(int j)

{

if (fact<0)

{

cout<<" Ошибка №="<
значение факториала"<
cout<<"fact= "<
cout<<" i= "<
//break;

}
if (fact==0)

{

cout<<" Ошибка №="<
значение факториала"<
cout<<"fact= "<
cout<<" i= "<
//break;

}

}
y=y+znak*step/fact;

}

cout<<"y="<
cout<<"sin(x)= "<
system("pause");

return 0;

}
/////////////////////////////////////////////////////////////////////////

2 способ (универсальный для всех рядов )

y= x-x3/3!+x5/5!-x7/7!+…

y=∑0 (-1)i x2i+1 / (2i+1)!= ∑0ti

ti=ti-1*p

p= ti/ ti-1= ((-1)i x2i+1 / (2i+1)!)/ ((-1)i-1 x2i-1 / (2i-1)!)= -x2/2*i*(2*i+1)

#include "stdafx.h"

#include

#include

using namespace std;
int main()

{

setlocale(LC_ALL,"ru");

double y, x, t;

int i, n;

cout<<"введите x=";

cin>>x;

cout<<"введите n=";

cin>>n;

y=x;

t=x;

for ( i=1;i<=n;i++)

{

t= -t*x*x/((2*i+1)*2*i);

y=y+t;

}

cout<<"y="<
cout<<"sin(x)= "<
system("pause");

return 0;
}

Возможные варианты
while- вариант

#include "stdafx.h"

#include

# include

using namespace std;

int main()

{

const double eps=0.001;

double y, x, t;

cout<<"enter x=";

cin>>x;

y=0;

t=x;

int i=1;

while (fabs(t)>eps)

{

y=y+t;

t= -t*x*x/((2*i+1)*2*i);

i++;

}

cout<<"y="< system("pause");

return 0;
}
2) Припомощицикла for

for (int i=1; fabs(t)>eps; i++)

{

t= -t*x*x/((2*i-1)*2*i)

y=y+t;

}

Пример 4
Вычислить косинус

Cos(x)=∑i (-1)i x2i / 2i!

p = -x2 / ((2*i+1)*2*i)

#include "stdafx.h"

# include

using namespace std;
int main()

{double y, x, t; int n;

int n;

cout<<"enter x=";

cin>>x;

cout<<"enter n=";

cin>>n;

y=x;

t=x;

for (int i=1;i<=n;i++)

{

t= -t*x*x/((2*i-1)*2*i)

y=y+t;

}

cout<<"y="<
system("pause");

return 0;
}

Лекция №5

Преобразование типа переменной в программе.

Операторы перехода
Преобразование типа переменной в программе

  1. y=y+static_coast i / (i+1)

  2. y=y+(double) i/(i+1)



Операторы перехода

  1. break

i=1;

while(1)

{

if(i>10) break;

cout<<”i=”<
i++;

}

cout<
результат работы программы:1_2_3_4_5_6_7_8_9_10


  1. continue

for (i=1;i<10;i++)

{

if (i %2) continue;

cout<
}

результат работы программы:2_4_6_8


  1. goto


С помощью инструкции goto и метки можно организовать

следующий цикл на 100 итераций.
i=1;

loop1:

cout<
i++;

if (i<=100) goto loop1;

результат работы программы:1_2_3_4_5_6_7_... _100

Оператор switch (переключатель)

switch (выражение) { case константа 1: [список операторов]

case константа 2: [список операторов]

………………………………………….

case константа n: [список операторов]

default: [список операторов]

}

Переключатель switch
#include "stdafx.h"

# include

# include

# include

using namespace std;
int main()

{

bool t;

int x, y, n, i;

srand (time(0));

int s1=0;

int s0=0;

int s2=0;

cout<<" enter n=";

cin>>n;

i=1;

while ( i<=n )

{

x=rand()%3;

switch (x)

{

case 0: s0++; break;

case 1: s1++; break;

default: s2++;break;

}

cout<
if (i%10==0) cout<
i++;
}

cout<<"s0="<
cout<<"s1="<
cout<<"s2="<
cout<
system("pause");

return 0;

}

Задача 1

Простейший калькулятор
#include "stdafx.h"

# include

using namespace std;
int main()

{

int a,b;

double res;

char op;

cout <<" enter 1 operand: ";

cin>>a;

cout <<" enter sign of operation: ";

cin>>op;

cout <<" enter 2 operand: ";

cin>>b;
if ( (b==0) && (op=='/'))

{

cout<<"деление на 0 "<
system("pause");

exit(-1);

}
bool f=true;

switch (op)

{

case '+' : res=a+b; break;

case '-' : res=a-b; break;

case '*' : res=a*b; break;

case '/' : res=(double) a/b; break;

default:

cout<<"unknown operator"<
f=false;

}

if (f) cout<<"result: "<
system("pause");

return 0;

}

Задача 2

Угадывание числа
#include "stdafx.h"

# include

# include

using namespace std;
int main()

{

bool t;

int x, y, n, i;

srand (time(0));

x=rand()%10+1;

cout<<" the computer define number in the range 1-

10"<
t=false;

cout<<" Guess the number!!! "<
cout<< "You must guess the number the

computer"<
cout<<" enter n=";

cin>>n; //ввод количества попыток

i=1;

while ( i<=n && !t )

{

cout<<"enter number";

cin>>y; //ввод числа пользователем

if (y==x) t=true;

i++;

}

if (t)

{

cout<< "You win! "<
cout<<" The number of attempts i = "<
cout<<"Computer defined number= "<
}

else

{

cout<<"Sorry! The computer number ="<
}

system("pause");

return 0;

}


Задача 3

Определение простого числа
true, если число x простое

T=

false, если число x не является простым
i=2…..sqrt(x)- возможные делители числа х.
Листинг программы

#include "stdafx.h"

# include

# include

using namespace std;

int main()

{

int i,x;

bool t;

cout<<"enter x=";

cin>>x;
if (x<=1) t=false;

else if (x==2) t=true;

else

{

t=true;

for (i=2; i<=sqrt(x) && t; i++)

{

if (x% i==0) t=false;

}

}

if (t) cout<< x<<" -prime"<< endl;

else cout<< x<<" - not prime"<< endl;

system("pause");

return 0;
}
Задача 4.

Вывод строчные букв латинского алфавита и их кодировки.
#include "stdafx.h"

# include

using namespace std;
int main()

{

char ch;

int i;

for ( ch='a';ch<='z';ch++ )

cout<
cout<
for (i='a';i<'a'+26; i++)

cout<
cout<
system("pause");

return 0;

}
Задача 5
Число итераций за 1 сек.

Секундомер

#include "stdafx.h"

#include

#include

#include

using namespace std;

int main()

{

int i, j, k, m;
int l=time (0);

int p=1;// число итераций за 1 сек

while (time (0)-l < 1)

{

cout<
p++;

// system("pause");

}

cout<
// число итераций за 1 сек

cout<
cout<<"hours: minutes: second"<
for(m=0;m<=24;m++)

for(i=0; i<=59; i++)

for(j=0; j<=59;j++)

for (k=1;k<=100000;k++)// задержка

{

cout.fill('0'); cout.width(2);

cout<
cout.fill('0'); cout.width (2);

cout<
cout.fill('0'); cout.width (2);

cout<
}

cout<
system("pause");

return 0;
}

Лекция №6

Массивы

а0, а1, а2,…….аn-1

Массив- конечная именованная последовательность элементов

Описание массива в С++:

Тип имя [размер]

Например:

int a[100] или const int N=100;

int a[N];
Обращение к элементу массива: а[номер].

Одномерный массив – вектор;

Память для элементов массива выделяется подряд

1234

a- указатель-переменная, которая хранит адрес.
Задача 1
Нахождение максимального элемента в массиве

#include "stdafx.h"

# include

using namespace std;
const int n=10; //определяем константой кол-во элементов

int main()

{

int a[n];

int i, max;

//Ввод массива с клавиатуры

cout<<"enter array a"<
for (i=0; i
{

cout<<"a["<
cin>>a[i];

}

//Вывод массива на экран

cout<<"array a"<
for (i=0; i
cout<
cout<max=a[0]; //присваиваем максимуму первый элемент, а затем в

// цикле сравниваем с каждым элементом в цикле

for (i=1; i
if ( max < a[i]) max=a[i] ;

cout<<"max="<
system("pause");

return 0;
}


Примечание

Общая структура решения задач с массивами(сумма, максимальный элемент, упорядочивание массива, сдвиг массива):
1)Описание переменных
2)Ввод данных
3)Соответствующие вычисления
4)Вывод результата

Задача 2

Циклический сдвиг массива влево на одну позицию
Пример

На входе: 5 3 4 2

На выходе: 3 4 2 5
#include "stdafx.h"

# include

using namespace std;
const int n=10;

void main()

{

int a[n];

int i, r;

//Ввод массива с клавиатуры

cout<<"enter array a: "<
for (i=0; i
{

cout<<"a["<
cin>>a[i];

}

r=a[0];

for (i=1; i
a[i-1]=a[i];

a[n-1]=r;

//Вывод массива на экран

cout<<"array a: "<
for (i=0; i
cout<

cout<
system("pause");

return 0;
}
Задача 3

Подсчитать количество максимумов в массиве

#include "stdafx.h"

# include

using namespace std;

int main()

const int n=10;

{

int a[n];

int i, number, max;

//Ввод массива с клавиатуры

cout<<”enter array a”<
for (i=0; i
{

cout<<”a[“<
cin>>a[i];

}

max=a[0];

number=1;

for (i=1; i
if (max< a[i])

{

max=a[i];

number=1;

}

else

if (max==a[i]) number++;

cout<<”max=”<
cout<<”number=”<
system("pause");

return 0;
}


Задача 4

Подсчитать сумму элементов массива
#include "stdafx.h"

# include

using namespace std;
int main()

const int n=10;

{

int a[n];

int i, sum;

//Ввод массива с клавиатуры

cout<<"enter array a: "<
for (i=0; i
{

cout<<"a["<
cin>>a[i];

}

sum=0;

for (i=0; i
sum=sum+a[i]; //возможный вариант y+=a[i];

cout<<"sum="<
system("pause");

return 0;
}
Задача 5

Стратегия вычисления A- и E- кванторов

( проверка существования элемента в массиве)

При вычислении E- квантора булевская переменная задается как false.
При вычислении A- квантора булевская переменная

задается как true.


  1. t=(Ei)[ a[i]<0 ]


t= true, если в массиве существует отрицательный

элемент, в противном случае t=false.
#include "stdafx.h"

# include

using namespace std;
const int n=10;

int main()

{

int a[n];

int i;

bool f=false;

//Ввод массива с клавиатуры

cout<<"enter array a: "<
for (i=0; i
{

cout<<"a["<
cin>>a[i];

}

//Вывод массива на экран

cout<<”array a”<
for (i=0; i
cout<

cout<
for (i=0; i
if (a[i]<0) t=true;

if (t) cout<<"exist"<
else cout<<"not exist"<
system("pause");

return 0;
}


  1. t = (Ai)[ a[i]>=0 ]


t-true, если в массиве все элементы больше

или равны нулю

#include "stdafx.h"

# include

using namespace std;

int main()

const int n=10;

{

int a[n];

int i;

bool p=true;

//Ввод массива с клавиатуры

cout<<"enter array a: "<
for (i=0; i
{

cout<<"a["<
cin>>a[i];

}

//Вывод массива на экран

cout<<"array a: "<
for (i=0; i
cout<

cout<for (i=0; i
if(a[i]<0) p = false;

if (p) cout<<"any"<
else cout<<" not any"<
system("pause");

return 0;
}
Лекция №7

Массивы(продолжение)
Методы сортировки массивов.
Алгоритм сортировки методом нахождения локальных экстремумов

Алгоритм сортировки методом обмена пар

Алгоритм сортировки вставкой
Задача 1

Упорядочить массив по неубыванию.
Алгоритм сортировки методом нахождения локальных экстремумов
Необходимо отсортировать массив удовлетворяющий

условию (Ai)[ a[i]<=a[i+1] ].

( для любого i справедливо а[i]<=a[i+1] )
В цикле проверяем условие,

если a[i] >a[i+1] , то a[i] и a[i+1 ]меняем местами
#include "stdafx.h"

# include

using namespace std;

const int n=10;

int main()

{

int a[n];

int i, j,r;

//Ввод массива с клавиатуры

cout<<"enter array a:"<
for (i=0; i
{

cout<<"a["<
cin>>a[i];

}

//Вывод массива на экран

cout<<"array a:"<
for (i=0; i
cout<

cout<
for(i=0; i
for (j=i+1; j
if (a[i]>a[j])

{

r=a[i];

a[i]=a[j];

a[j]=r;

}

//Вывод массива на экран

cout<<"array a:"<
for (i=0; i
cout<

cout<
system("pause");

return 0;
}

Задача 2.

Алгоритм сортировки методом обмена пар

( метод «пузырька» )
#include "stdafx.h"

#include

using namespace std;
const int n=5;

int main()

{

cout<<" Bubble Sort "<
int i;

int r;

int a[n];

cout<<"enter array a:"<
for(i=0;i
{

cout<<"a["<
cin>>a[i];

}

cout<
cout<<" array a:"<
for(i=0;i
cout<

cout<// BubbleSort

bool t=true;

while (t)

{

t=false;

for(i=0;i
if (a[i]>a[i+1])

{

r=a[i];

a[i]=a[i+1];

a[i+1]=r;

t=true;

}

}

cout<<" After sorting the array a:"<
for(i=0;i
cout<

cout<
system("pause");

return 0;

}

Задача 3.

Алгоритм сортировки вставкой
#include "stdafx.h"

#include

using namespace std;

const int n=5;

int main()

{

int i,j,temp;;

int a[n];

cout<<"enter array a:"<
for (i = 0; i
{

cout<<"a["<
cin >> a[i];

}

cout<<"array a:"<
for (i = 0; i
cout<

cout<
for (i=0; i
{

temp = a[i];// запоминаем i- элемент

j =i-1;//идем начиная с i-1 элемента

while(j >= 0 && a[j] > temp)

// пока не достигли начала массива

// или не нашли элемент меньше или равного i-ому,

// который хранится в переменной temp

{

a[j + 1] = a[j];

// проталкиваем элемент вправо

j--;

}

a[j + 1] = temp;

// возвращаем i элемент

}

// Выводим отсортированный массив

cout<<"sort array a:"<
for (i = 0; i
cout<

cout<
system("pause");

return 0;

}

Лекция

0>

Тема: Одномерные массивы (продолжение )
( Т.М. Павловская С/C++ Программирование на языке высокого

уровня

Тема: Одномерные массивы (стр. 136)

)


Задача

Преобразовать массив таким образом, чтобы в первой половине располагались элементы, стоящие в нечетных позициях, а во второй половине - элементы, стоящие в четных позициях,

//arb2016_pavlovskaya_var7

#include "stdafx.h"

#include

using namespace std;
const int n=7;

int main()

{

int i,temp;;

int a[n];

cout<<"enter array a:"<
for (i = 0; i
{

cout<<"a["<
cin >> a[i];

}

cout<<"array a:"<
for (i = 0; i
cout<

cout<
// if n is even number n=6

/* for(i=1;i
{

temp=a[i];

a[i]=a[n-1-i];

a[n-1-i]=temp;

}

*/

// if n is odd number n=7

for(i=0;i
{

temp=a[i];

a[i]=a[n-i-2];

a[n-i-2]=temp;

}

cout<<" odd i in begin, even i in end a:"<
for (i = 0; i
cout<

cout<
system("pause");

return 0;
}
Задача
Преобразовать массив таким образом, чтобы сначала располагались , элементы по модулю не превышающие 1 , а потом все остальные
//arb2016_pavlovskaya_var8

#include "stdafx.h"

#include

#include

using namespace std;
const int n=7;

int main()

{

int i,j,temp;;

double a[n];

cout<<"enter array a:"<
for (i = 0; i
{

cout<<"a["<
cin >> a[i];

}

cout<<"array a:"<
for (i = 0; i
cout<

cout<
i=0; j=n-1;

while(i<=j)

{

for( ; fabs(a[i])<=1;i++);

for( ; fabs(a[j])> 1;j--);

if (i
{

temp=a[i];

a[i]=a[j];

a[j]=temp;

}

}

cout<<"new array a:"<
for (i = 0; i
cout<

cout<
system("pause");

return 0;
}

Задача

Преобразовать массив таким образом, чтобы элементы равные 0 располагались после всех остальных.


//arb2016_pavlovskaya_var9
#include "stdafx.h"

#include

using namespace std;
const int n=7;

int main()

{

int i,j,temp;;

double a[n];

cout<<"enter array a:"<
for (i = 0; i
{

cout<<"a["<
cin >> a[i];

}

cout<<"array a:"<
for (i = 0; i
cout<

cout<
i=0;

j=n-1;

while(i<=j)

{

for( ; a[i]!=0;i++);

for( ; a[j]==0 ;j--);

if (i
{

temp=a[i];

a[i]=a[j];

a[j]=temp;

}

}

cout<<"new array a:"<
for (i = 0; i
cout<

cout<
system("pause");

return 0;
}
///////////////////////////////////////////////////////////////
Дихотомический поиск числа в упорядоченном массиве

#include

using namespace std;
int main()

{

const int n=10;

int left,right, mid,x;

int a[n]={1,2,3,4,5,6,7,8,9,10};

bool flag=false;

left=0;

right =n-1;

cout<<"enter x=";

cin>>x;

while (!flag && left<=right)

{

mid=(left+right)/2;

if(a[mid]==x) flag=true;

if (x
else left=mid+1;

}

if(flag) cout<
else cout<
array a!"<
system("pause");

return 0;

}

//////////////////////////////////////

Лекция

Двумерные массивы.

В С++ можно использовать многомерные массивы. Двумерный массив представляет собой список одномерных массивов.

Объявление двумерного массива, состоящего из целых чисел с размерностью 5*6: int a[5][6].

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

Задачи с двумерными массивами


  1. Вычислить сумму произведений элементов

y = ∑in-1jn-1aij
#include "stdafx.h"

# include

using namespace std;

const int n=5;

int main()

{

int a[n] [n];;

int i, j, y, p;

//Ввод массива с клавиатуры

cout<<"enter array a: "<
for (i=0; i
for (j=0; j
cin>>a[i][j];
//Вывод массива на экран

cout<<" array a:"<
for (i=0; i
{

for (j=0; j
cout<

cout<
}

y=0;

for (i=0; i
{

p=1;

for (j=0; j
y=y+p;

}

cout<<"y="<
system("pause");

return 0;

}


  1. Найти максимальную из построчных сумм

Y= Max ∑ a[i][j]
#include "stdafx.h"

# include

using namespace std;

const int n=30;

int main()

{

int a[n] [n];

int i, j, y, max;

//Ввод массива с клавиатуры

cout<<"enter array a: "<
for (i=0; i
for (j=0; j
cin>>a[i][j];

//Вывод массива на экран

cout<<"massive a:"<
for (i=0; i
{

for (j=0; j
cout<

cout<
}

max=0;

for (j=0; j
max=max+a[0][j];
for (i=1; i
{

y=0;

for (j=0;j
y=y+a[i][j];

if(y> max) max =y;

}

cout<<"max="<
system("pause");

return 0;

}



  1. EA- и AE–предикаты




  1. AiEj( a[i][j]>0)

В каждой строке матрицы существует хотя бы один положительный элемент.
#include "stdafx.h"

# include

using namespace;

const int n=30;

int main()

{

int a[n] [n];;

int i, j;

//Ввод массива с клавиатуры

cout<<"enter array a: "<
for (i=0; i
for (j=0; j
cin>>a[i][j];

//Вывод массива на экран

cout<<"array a: "<
for (i=0; i
{

for (j=0; j
cout<

cout<
}

bool p=true;

for (i=0;i
{

bool q=false;

for (j=0; j
if (a[i][j]>0) q=true;

p=q;

}

cout<<"p="<


system("pause");

return 0;

}


  1. EiAj[ a[i][j]>0 ]

Существует строка матрицы, состоящая из положительных элементов.
#include "stdafx.h"

# include

using namespace std;

const int n=3;

int main()

{

int a[n] [n];;

int i, j;

//Ввод массива с клавиатуры

cout<<"enter array a: "<
for (i=0; i
for (j=0; j
cin>>a[i][j];

//Вывод массива на экран

cout<<"array a: "<
for (i=0; i
{

for (j=0; j
cout<

cout<
}
bool p=false;

for (i=0;i
{

bool q=true;

for (j=0; j
if (a[i][j]<=0) q=false;

p=q;

}

cout<<"p="<


system("pause");

return 0;
}



  1. AiAj[ a[i][j]>0]

Все элементы матрицы положительны
#include "stdafx.h"

# include

using namespace std;

const int n=30;

int main()

{

int a[n] [n];;

int i, j;

//Ввод массива с клавиатуры

cout<<"enter array a: "<
for (i=0; i
for (j=0; j
cin>>a[i][j];

//Вывод массива на экран

cout<<"array a: "<
for (i=0; i
{

for (j=0; j
cout<

cout<
}
bool p=true;

for (i=0;i
for (j=0; j
if (a[i][j]<0) p= false;

cout<<"p="<


system("pause");

return 0;
}



  1. EiEj[ a[i][j]>0]


В матрице существует хотя бы один положительный элемент
#include "stdafx.h"

# include

using namespace std;

const int n=30;

int main()

{

int a[n] [n];;

int i, j;

//Ввод массива с клавиатуры

cout<<"enter array a: "<
for (i=0; i
for (j=0; j
cin>>a[i][j];

//Вывод массива на экран

cout<<”array a:”<
for (i=0; i
{

for (j=0; j
cout<

cout<
}
bool p=false;

for (i=0;i
for (j=0; j
if (a[i][j]>0) p= true;

cout<<"p="<


system("pause");

return 0;
}



  1. Умножение матриц

С=A*B


#include "stdafx.h"

# include

# include
using namespace std;

const int n=3;

int main()

{

int a[n] [n], b[n] [n], c[n] [n];

int i, j, k;

//Ввод массива с клавиатуры

cout<<"enter array a: "<
for (i=0; i
for (j=0; j
{

cout<<"a["<
cin>>a[i][j];

}

//Ввод массива с клавиатуры

cout<<"enter array b: "<
for (i=0; i
for (j=0; j
{

cout<<"b["<
cin>>b[i][j];

}

//Вывод массива на экран

cout<<"array a: "<
for (i=0; i
{

for (j=0; j
cout<
cout<
}

//Вывод массива b на экран

cout<<"array b: "<
for (i=0; i
{

for (j=0; j
cout<
cout<
}

for (i=0; i
for (j=0; j
{

c[i][j]=0;

for (k=0; k
c[i][j]=c[i][j]+a[i][k]*b[k][j];

}

//Вывод массива на экран

cout<<"array c: "<
for (i=0; i
{

for (j=0; j
cout<
cout<
}

system("pause");

return 0;

}
Лекция
Указатели.
Указатель – это объект, который содержит некоторый адрес памяти. Этот адрес обозначает местоположение в памяти другого объекта, такого как переменная. Если x содержит адрес переменной y, то о переменной x говорят, что она «указывает» на y.

Формат объявления переменной-указателя таков:

Тип *имя переменной.

Использование символа * перед именем переменной в инструкции объявления превращает эту переменную в указатель.
int * x;

x – указатель на int.


Операторы, используемые с указателями.
С указателями используются два оператора ”*” и “&”.

Оператор “&”- унарный. Он возвращает адрес памяти, по которому расположен операнд.

int * ptr;

ptr= &total;

В переменную ptr помещается адрес переменной total.

Второй оперантор работы с указателями (“*”) служит дополнением к первому (“&”). Это также унарный оператор , но он обращается к значению переменной , расположенной по адресу , заданному его операндом. Другими словами, он ссылается на значение переменной , адресуемой заданным указателем. Если перменная ptr содержит адрес перменной total , то при выполнении инструкции

val=*ptr;

будет присвоено значение переменной total, на которую указывает переменная ptr.


Все байты в памяти нумеруются. Номер байта - адрес.

int х=5 – инициализация переменной

int *p- объявление указателя;

p- указатель( адрес)

p=&x- взятие адреса


*p=10 – изменение х через указатель

*-операция разыменования (косвенное присвоение)


#include "stdafx.h"

#include

using namespace std;

int main()

{

int *a = new int; // Объявление указателя для переменной типа int

int *b = new int(5); // Инициализацияуказателя

*a = 10;

*b = *a + *b;

cout << "b is " << *b << endl;

delete b;

delete a;

return 0;

}
Ссылки.
В языке C ссылок нет. С точки зрения реализации, ссылка — это, по сути, указатель, который жестко привязан к области памяти, на которую он указывает, и который автоматически разыменовывается, когда мы обращаемся по имени ссылки
int y=10;

int & x=y;

cout<<"x= "<
* конкретные адреса переменных могут быть другими */

int a;

//переменная с именем "a" типа int размещена по адресу 0xbfd86d6c

int &ra = a;

/* задано альтернативное имя (ra) для переменной по адресу 0xbfd86d6

символ "&" используемый для уже созданного объекта является операцией взятия адреса

(и эта операция не есть ссылка), то есть &a тут означает получить адрес переменной к которому привязано имя "a" */

cout << &a << '\n' << &ra << '\n';

В stdout будет записано:

0xbfd86d6c
0xbfd86d6c

То есть оба имени "a" и "ra" привязаны к одному и тому же адресу.

Ссылки нельзя объявлять без привязки к переменной (то есть не инициализировав при объявлении). После объявления ссылки её невозможно привязать к другой переменной.

Важно отличать ссылки от оператора взятия адреса & (address of). Оператор взятия адреса используется для уже созданного объекта с целью получить его адрес (то есть адрес области памяти, где хранятся значения), а ссылка это только задание альтернативного имени объекта (с точки зрения программиста, а не реализации). Например:

int a; //переменная типа int размещена по адресу 0xbfd86d6c с именем "a"

int b = 3;

/* создан указатель с именем "p" по адресу 0xbf971c4c, значение этого указателя адрес объекта с именем "a" - 0xbfd86d6c (это значение можно будет менять)

*/

int *p = &a;

p = &b; //присваиваем указателю новое значение


Пример 1
#include "stdafx.h"

# include

using namespace std;

int main()

{

int x=10;

int *p;

cout<<"x="<
p=&x;

cout<<"p="<


//p=0X0012FF7C –адрес ячейки памяти, содержащей int x

*p=20;

cout<<"*p="<<*p<
cout<<"x="<
int & r=x; //& r-ссылка

r=50;

cout<<"r="<
cout<<"x="<
x=20;

cout<<"r="<
cout<<"*p="<<*p<system("pause");

return 0;
}
*Примечание

Ссылка -2ое имя Х, r работает как указатель, автоматически разыменовывается. Память под r не выделяется
Пример 2

#include "stdafx.h"

# include

using namespace std;

int main()

{

int a[3]={1,2,3};

cout<<" array a: "<
cout<

cout<<"address a: "<

// address a: 0x0012FF68 0x0012FF6C 0x0012FF70

//Косвенное изменение массива

int *q=a; //q указатель на int

cout<<"q="<
// q= 0x0012FF68 0x0012FF6C 0x0012FF70

cout<<"*q="<<*q<<" "<<*(q+1)<< " "<<*(q+2)<
//*q=1 2 3

*q=904; *(q+1)=905; *(q+2)=906;

cout<<" array a: "<
cout<

// 904 905 906

a[0]=1;

a[1]=2;

a[2]=3;

cout<<"*q= "<<*q<<" "<<*(q+1)<< " "<<*(q+2)<
//*q=1 2 3

system("pause");

return 0;

}


Функции

Основы использования функций.
Функции – это подпрограммы , которые содержат одну или несколько инструкций. Функции называются строительными блоками С++, поскольку программа в С++ , как правило, представляет собой коллекцию функций.


Общий формат С++ функций
Все С++ функции имеют общий формат

Тип_возвращаемого значения имя (список _параметров)

{

// тело функции

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

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

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

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

Если функции не имеют параметров, то круглые скобки остаются пустыми.

В фигурные скобки заключено тело функции. Тело функции составляют С++-инструкции, которые определяют действие функции. Функция завершается ( и управление передается вызывающей процедуре) при достижении закрывающейся скобки или инструкции return

Создание функции.
#include "stdafx.h"

#include

using namespace std;
void myfunc();// прототип функции myfunc()
int main()

{

cout<<"В функции main()."<
myfunc();

cout<<"Снова в функции main()."<
system("pause");

return 0;
}
// Определение функции myfunc()

void myfunc()

{

cout<<"В функции myfunc()."<
}
Использользование аргументов
Функции можно передать одно или несколько значений. Значение передаваемое функции называется аргументом. Таким образом, аргументы представляют собой средсьво передачи инициализации в функцию.

При создании функции, которая принимает одно или несколько аргументов, необходимо объявить переменные, которые получат значения этих аргументов. Эти переменные называются параметрами функции.
#include "stdafx.h"

#include

using namespace std;
void box(int length, int width, int height);// прототип функции
int main()

{

box(7,20,4);

box(50,3,2);

box(8,6,9);

system("pause");

return 0;
}
// Определение функции box()

void box(int length, int width, int height)

{

cout<<"Объем параллелепипеда равен "<< length* width* height

<
}

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


Возврат значений.

Использование функции в выражениях

Правила действия областей видимости функций.
Локальная область видимости
Локальные переменные можно объявлять внутри любого блока.

Сокрытие имен

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

Передача функции массива

Передача функциям строк

Возвращение функциями указателей

Оформление функции в С++

Тип имя функции (список формальных параметров);

Типы функции

int

double

char

void (не возвращает значений)

Функция - именованный набор операторов.

Если р1 и р2 функции, и р1 вызывает р2, то р2 должна быть описана раньше р1.

Если тело функции идет после main() , то перед main() должен стоять прототип функции.

Пример 1

Функция плюс

#include "stdafx.h"

# include

using namespace std;

///////////////////////

void plus (int,int,int); // прототип функции plus, параметры переданы //по значению

////////////////////

void plus1 (int,int,int&); // прототип функции plus1, последний

// параметр передан по ссылке

int plus2(int, int) //результат функции число типа int

////////////////////

int main()

{

int a=4; int b=5; int c=10;

cout<<"plus()"<
plus(a,b,c);

cout<<"c="<
plus1(a,b,c);

cout<<"c="<
int c2=plus2(a,b);

cout<<"c2="<
// Возможен вариант

cout<<"plus2()="<


system("pause");

return 0;

}

/////////////////////////////////////

void plus (int x, int y, int z)

{

cout<<"x="<
cout<<"y="<
cout<<"z="<
z=x+y;

cout<<"z="<
}

/////////////////////////////////////

void plus1 (int x, int y, int &z)

{

cout<<"x="<
cout<<"y="<
cout<<"z="<
z=x+y;

cout<<"z="<
}

/////////////////////////////////////////

int plus2 (int x, int y)

{

cout<<"x="<
cout<<"y="<
cout<<"x+y= "<
return x+y;

}

///////////////////////////////////////
Примечание

При вызове функций plus2() на месте аргументов могут быть любые выражения данного типа.

plus2(a+b*c,2*c);

plus2(5,7);

Передача массивов функции.
Пример 2.
#include "stdafx.h"

#include

using namespace std;

const int n=10;

/////////////////

void create ( int x[], int k);

//возможный вариант void vvod ( int x[n])

void show ( int x[], int k);

int max (int x[], int k);

/////////////////////////

int main()

{

int a[n];

create(a,n);

show ( a, n);

cout<< "max(a,n)= "<
system("pause");

return 0;
}

//////////////////////

void create ( int x[], int k)

{

int i;

for (i=0; i
{

cout<<"x["<
cin>>x[i];}

}

}

///////////////////////

void show ( int x[], int k)

{

int i;

for (i=0; i
cout<
cout<
}

////////////////////////////

int max(int x[], int k)

{

int i;

int m;

m=a[0];

for (i=0; i
if (m
return m;

}

/////////////////////////

Лекция №9

Динамические массивы
Задание статического массива

const int n=10;

int a[n];
Задание динамического массива

int n;

cout<< “Enter n:”;

cin>>n;

int* b //указатель на первый элемент массива

b= new int[n];

delete [] b - после работы программы необходимо освободить память «кучи» от b.

В параметрах функций динамический массив задается так же, как и статический
Выделение динамической памяти для двумерного массива c.
c= new int*[n];

for (i=0;i
c[i]=new int[n];

Особождение динамической памяти для двумерного массива c.
for(i=0;i
delete []c[i];
void vvod ( int x[], int n);

Или

void vvod ( int *x, int n);

void vvod ( int x[n])




Примечание

int*p;

p=new int;

*p=10; (косвенная динамическая память)

delete p ; (возврат памяти)
Задание двумерного динамического массива

Память выделяется в 2 этапа: сначала под столбец указателей на строки, а затем в цикле под каждую строку.

int colstr; colstb;

cout<< "Enter colstr: ";

cin>> colstr;

cout<< "Enter colstb: ";

cin>> colstb;

int **b;

b=new int*[colstr];

for (int i<0;i
b[i]=new int[colstb];
В параметрах функций

void create ( int **x, int n, int m);

void show( int **x, int n, int m);


Указатели на функции как параметры
Указатель на функцию может передаваться в другую функцию в качестве параметра. Например:

#include "stdafx.h"

#include

using namespace std;
int add(int, int);

int subtract(int, int);

int operation(int(*)(int, int), int, int);

int main()

{

int a = 10;

int b = 5;

int result;

result = operation(add, a, b);

cout << "result: " << result << endl;

result = operation(subtract, a, b);

cout << "result: " << result << endl;

system("pause");

return 0;

}

int add(int x, int y)

{

return x + y;

}

int subtract(int x, int y)

{

return x - y;

}

int operation(int(*op)(int, int), int a, int b)

{

return op(a, b);

}
В данном случае первый параметр функции operation - int (*op)(int, int) - представляет указатель на функцию, которая возвращает значение типа int и принимает два параметра типа int. Результатом функции является вызов той функции, на которую указывает указатель.

Определению указателя соответствуют две функции: add и subtract, поэтому их адрес можно передать в вызов функции operation: operation(add, a, b);.

Результат работы программы:

result: 15

result: 5

Другой пример - функция, которая может принимать в качестве параметра некоторое условие:

#include "stdafx.h"



#include

using namespace std;
int isEven(int);

int isPositive(int);

void action(int(*)(int), int[], int);

int main()

{

int nums[] = { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5 };

int n = sizeof(nums) / sizeof(nums[0]);

cout << "Even numbers: " << endl;

action(isEven, nums, n);

cout << "Positive numbers: " << endl;

action(isPositive, nums, n);

system("pause");

return 0;

}
int isEven(int x)

{

return x % 2 == 0;

}
int isPositive(int x)

{

return x>0;

}

void action(int(*condition)(int),int numbers[], int n)

{

for (int i = 0; i
{

if (condition(numbers[i]) != 0)

{

cout << numbers[i] << "\t";

}

}

cout << endl;

}


Первый параметр функции action - указатель int (*condition)(int) представляет функцию, которая принимает целое число и в зависимости от того, соответствует оно условию или нет, возвращает 1 (если соответствует) или 0. На момент определения функции action точное условие может быть неизвестно.

В текущей программе условия представлены двумя функциями. Функция isEven() возвращает 1, если число четное, и 0, если число нечетное. А функция isPositive() возвращает 1, если число положительное, и 0, если отрицательное.

При вызове функции action() в нее можно передать нужное условие: action(isEven, nums, n);. В итоге программа выведет на экран числа из массива nums, которые соответствуют переданному условию:

Even numbers: -4 -2 0 2 4

Positive numbers: 1 2 3 4 5


Задача 1.
Заданы два целочисленных мвссива размерноси n*n.
A*B , если EiAj[ A[i][j] простое число]

Вычислить С=

A+B, прттивном случае
#include "stdafx.h"

# include

# include

# include

using namespace std;
void create ( int **, int);

void show( int **, int);

bool prime (int);

bool EA( int **, int);

void mult ( int **, int**, int**,int);

void add ( int **, int**, int**,int);

/////////////////////////////////////

int main()

{

int n;

cout<<"enter size of array n=";

cin>>n;

int **a, **b, **c;

a= new int*[n];

int i;

for (i=0;i
a[i]=new int[n];

b= new int*[n];

for (i=0;i
b[i]=new int[n];
c= new int*[n];

for (i=0;i
c[i]=new int[n];

cout<<"enter array a:"<
create(a,n);

cout<<"enter array b:"<
create(b,n);
cout<<" array a:"<
show(a,n);

cout<<" array b:"<
show(b,n);

if (EA(a,n)) mult(a,b,c,n);

else add(a,b,c,n);

cout<<"array c: "<
show(c,n);

for(i=0;i
delete []a[i];

delete [] a;

for(i=0;i
delete []b[i];

delete []b;

for(i=0;i
delete []c[i];

delete []c;

system("pause");

return 0;
}

////////////////////////////////

void create(int**x, int n)

{

int i,j;

for (i=0; i
for (j=0; j
{

cout<<"x["<
cin>>x[i][j];

}

}

////////////////////////////

void show(int**x, int n)

{

int i,j;

for (i=0; i
{

for (j=0; j
cout<
cout<
}

}

/////////////////////////////////

bool prime(int x)

{

bool t;

int i;

if (x<=1) return false;

if (x==2) return true;

t=true;

i=2;

while (i<=sqrt(x)&&t)

{

if (x% i==0) t=false;

i++;

}

return t;

}

///////////////////////

bool EA(int**x, int n)

{

bool p,q;

int i,j;

p=false;

for (i=0;i
{

q=true;

for (j=0; j
if (!prime(x[i][j])) q=false;

p=q;

}

return p;

}

//////////////////////////////

void mult ( int **x, int**y, int**z,int n)

{

int i, j, k;

for (i=0; i
for (j=0; j
{

z[i][j]=0;

for (k=0; k
z[i][j]=z[i][j]+x[i][k]*y[k][j];

}

}

/////////////////////////////

void add ( int **x, int**y, int**z, int n)

{

int i, j;

for (i=0; i
for (j=0; j
z[i][j]= x[i][j]+y[i][j];

}

////////////////////////
ALGEBRA OF SETS

Алгебра множеств

Пусть A,B,C ‘элементы P(Z). Z – множество целых чисел.

P(Z) – множество всех подмножеств Z.

Определить операции над множествами.

C=A U B – объединение множеств

C=A ^ B – пересечение множеств

C= A-B – разность множеств

C=(A-B)U(B-A) - симметрическая разность.

#include "stdafx.h"

#include

using namespace std;

/////////////////////////////////

void create_set(int* x,int n)

{

int i,m;

for(i=0;i
x[i]=0;

char ch='y';

while (ch=='y'|| ch=='Y')

{

cout<<"enter element of set m=";

cin>>m;

x[m]=1;

cout<<" continue enter element? – 'y'/'n' ch=";

cin>>ch;

}

}

////////////////////////////////

void show_set(int* x,int n )

{

int i;

cout<<"{ ";

for(i=0;i
if (x[i]) cout<
cout<
}

////////////////////////////////////

void union(int* x,int* y,int* z, int n)

{

int i;

for(i=0;i
z[i]=x[i]||y[i];

}

////////////////////////////////

void intersection(int* x,int* y,int* z, int n)

{

int i;

for(i=0;i
z[i]=x[i]&&y[i];

}

////////////////////////////////

void substruction(int* x,int* y,int* z,int n)

{

int i;

for(i=0;i
z[i]=x[i] && !y[i];

}

////////////////////////////////

void complement(int* x,int* y, int n)

{

int i;

for(i=0;i
y[i]=!x[i];

}

////////////////////////////////

int main()

{

int n;

cout<<" ALGEBRA OF SETS"<
cout<<"enter size universal set n=";

cin>>n;

int* a=new int[n];

int* b =new int[n];

int* c=new int[n];

cout<<"enter elements of set a: "<
create_set(a,n);

cout<<"elements of set a: "<
show_set(a,n);

cout<<"enter elements of set b: "<
create_set(b,n);

cout<<" elements of set b: "<
show_set(b,n);

union(a,b,c,n);

cout<<" elements of set c=aUb: "<
show_set(c,n);
intersection(a,b,c,n);

cout<<" elements of set c=a*b: "<
show_set(c,n);

substruction(a,b,c,n);

cout<<" elements of set c=a-b: "<
show_set(c,n);

complement(a,c,n);

cout<<" elements of set c=!a: "<
show_set(c,n);

system("pause");

return 0;

}

Лекция

Табулирование интегральной функции.
Вычислить значение функции



в заданных точках t1, …, tm с точностью . Входными данными программы являются числа m, a, b, и массив t[1: m]. Выходные данные – массив y[1: m], где . В программе предусмотреть:

- функцию, вычисляющую значение F(x, t), с формальными параметрами x и t;

- функцию вычисления интеграла по одной из квадратурных формул с формальными параметрами: границы интегрирования a, b, точность вычисления интеграла , функция F(x, t) и значение ее параметра t.

Исходные данные


I. Квадратурные формулы для вычисления интеграла (всюду ):

а) формула прямоугольников

;

За приближенное значение интеграла принимается такое, при котором .



II. Подынтегральная функция. Представим

.

Функция (x):

;

Функция (z):

;
III. Числовые данные




a

b



M

t1

t2

t3

t4

t5

t6

а)

0

1

0,1

3

-3,7

1,8

7,2

-

-

-

//Tabulating the integral function

#include "stdafx.h"

#include

#include

#include

#include

#include

using namespace std;

const int lengthColumn=20;

const int Indent=7;

const int lengthTable=43;

//////////////////////////

double Fi(double x)

{

return cos(x)*cos(x);

}

///////////////////////////////

double Psi(double x)

{

return (1-x*x)/(1+x*x);

}

/////////////////////////

double F(double x,double t)

{

return Psi(x)*Fi(x+ t/(1+x*x));

}

///////////////////////////////////////

void create(ifstream &f, double* x, int n)

{

if(!f)

{

cout<<" Can't open file!"<
system("pause");

exit(-1);

}

int i;

for(i=0;i>x[i];

}

/////////////////////////////////////////

void show(ofstream &f, double* x, int n)

{

int i;

for(i=0;i
f<
f<
}

/////////////////////////////////////////

double Integral(double a, double b, double e, double t)

{

double h,J1,J2;

int i,n;

n=1; h=(b-a)/n;

J2=h*F(a+h/2, t);

do

{

J1=J2;

n=n*2;

h=(b-a)/n;

J2=0;

for (i=0;i<=n-1;i++)

J2=J2+F(a+(2*i+1)*h/2,t);

J2=J2*h;

}while (fabs(J2-J1)>e);

return J2;

}

//////////////////////////////////////

void star(ofstream &f, int n, int m)

{

f.width(n);

int i;

for(i=0;i
f<<'*';

f<
}

/////////////////////////////////////

void star1(ofstream &f, int n, int m)

{

f.width(n); f<<'*';

int i;

for(i=0;i
{

f.width(lengthColumn+1);

f<<'*';

}

f<
}

//////////////////////////////////////

void table(ofstream &f,double* x,double* y,int m, char a[2][15])

{

int i;

f<
star(f,Indent+1,lengthTable);

star1(f,Indent+1,2);

f.width(Indent+1);

f<<'*';

for(i=0;i<2;i++)

{

f.width(10);

f<

f.width(11);

f<<'*';

}

f<
star1(f,Indent+1,2);

star(f,Indent+1,lengthTable);

for(i=0;i
{

star1(f,Indent+1,2);

f.width(Indent+1);

f<<'*';

f.width(lengthColumn-5);

f<
f.width(6);

f<<'*';

f.width(lengthColumn-5);

f<
f.width(6);

f<<'*';

f<
star1(f,Indent+1,2);

star(f,Indent+1,lengthTable);

}

}
/////////////////////////////

int main()

{

ifstream in("arb.txt");

ofstream out("integral.txt");

double a,b,eps;

int m,i;

char name_task[80];

char name_t_y[2][15];

in.getline(name_task,80);

for(i=0;i<2;i++)

in>>name_t_y[i];

out<
for(i=0;i<2;i++)

out<
out<in>>a>>b>>eps>>m;

out<<"a= "<

out<<"b= "<
out<<"eps= "<
out<<"m= "< double* t, *y;

t=new double[m];

y=new double[m];

create(in, t,m);

out<<"arguments : "<
show(out,t,m);

for(i=0;i
y[i]=Integral(a,b,eps,t[i]);

out<<"values of the integral function "<
show(out,y,m);

out<
out<
table(out,t,y,m,name_t_y);
in.close();

out.close();

delete []t;

delete []y;

system("pause");

return 0;

}

Файл arb.txt
Tabulating the integral function

t[i] y[i]

0 1 0.001 3 -3.7 1.8 7.2

//////////////////////////////////////

Файл integeral.txt
Tabulating the integral function

t[i] y[i]

a= 0

b= 1

eps= 0.001

m= 3

arguments :

-3.7 1.8 7.2

values of the integral function

0.406703 0.0658141 0.335945

Tabulating the integral function
*******************************************

* * *

* t[i] * y[i] *

* * *

*******************************************

* -3.7 * 0.406703 *

* * *

*******************************************

* 1.8 * 0.0658141 *

* * *

*******************************************

* 7.2 * 0.335945 *

* * *

*******************************************

Вторая версия вычисление интеграла без файла

#include "stdafx.h"

#include

#include

#include

#include

using namespace std;

const int lengthColumn=20;

const int Indent=7;

const int lengthTable=43;

//////////////////////////

double Fi(double x)

{

return cos(x)*cos(x);

}

///////////////////////////////

double Psi(double x)

{

return (1-x*x)/(1+x*x);

}

/////////////////////////

double F(double x,double t)

{

return Psi(x)*Fi(x+ t/(1+x*x));

}

///////////////////////////////////////

void create(double* x, int n)

{

int i;

for(i=0;i
{

cout<<"x["<
cin>>x[i];

}

}

/////////////////////////////////////////

void show( double* x, int n)

{

int i;

for(i=0;i
cout<
cout<
}

/////////////////////////////////////////

double Integral(double a, double b, double e, double t)

{

double h,J1,J2;

int i,n;

n=1;

h=(b-a)/n;

J2=h*F(a+h/2, t);

do

{

J1=J2;

n=n*2;

h=(b-a)/n;

J2=0;

for (i=0;i<=n-1;i++)

J2=J2+F(a+(2*i+1)*h/2,t);

J2=J2*h;

}while (fabs(J2-J1)>e);

return J2;

}

//////////////////////////////////////

void star( int n, int m)

{

cout.width(n);

int i;

for(i=0;i
cout<<'*';

cout<
}


/////////////////////////////////////

void star1( int n, int m)

{

cout.width(n); cout<<'*';

int i;

for(i=0;i
{

cout.width(lengthColumn+1);

cout<<'*';

}

cout<
}

//////////////////////////////////////

void table(double* x,double* y,int m, char a[2][15])

{

int i;

cout<
star(Indent+1,lengthTable);

star1(Indent+1,2);

cout.width(Indent+1);

cout<<'*';

for(i=0;i<2;i++)

{

cout.width(10);

cout<

cout.width(11);

cout<<'*';

}

cout<
star1(Indent+1,2);

star(Indent+1,lengthTable);

for(i=0;i
{

star1(Indent+1,2);

cout.width(Indent+1);

cout<<'*';

cout.width(lengthColumn-5);

cout<
cout.width(6);

cout<<'*';

cout.width(lengthColumn-5);

cout<
cout.width(6);

cout<<'*';

cout<
star1(Indent+1,2);

star(Indent+1,lengthTable);

}

}

/////////////////////////////

int main()

{

double a,b,eps;

int m,i;

char name_task[80];

char name_x_y[2][15]; // x[i] y[i]

cout<<" enter the name of the table"<
cin.getline(name_task,80);//

for(i=0;i<2;i++)

{

cout<<" x[i] y[i] ";

cin>>name_x_y[i];// x[i] y[i]

}

cout<
cout<
for(i=0;i<2;i++)

cout<
cout<
cout<<" a= "; cin>>a;

cout<<" b= "; cin>>b;

cout<<" eps= "; cin>>eps;

cout<<" m= "; cin>>m;

double* t, *y;

t=new double[m];

y=new double[m];

create( t,m);

cout<<"arguments : "<
show(t,m);

for(i=0;i
y[i]=Integral(a,b,eps,t[i]);

cout<<"value of integeral"<
show(y,m);

cout<cout<
table(t,y,m,name_x_y);
delete []t;

delete []y;

system("pause");

return 0;
}

////////////////////////////////////////

Форматированный ввод-вывод данных.
До сих пор при вводе или выводе информация в наших примерах программ действовали параметры форматирования, которые С++-система ввода вывода использует по умолчанию. Но программист может сам управлять форматом представления данных , причем двумя способами. Первый способ предполагает использование функций-членов класса ios, а второй - функций специального типа, именуемых манипуляторами.

Форматирование данных с использованием функций-членов класса ios

В системе ввода-вывода С++ каждый поток связанс набором флагов форматирования информации. В классе ios объявляется перечисление fntflags, в котором определены следующие значения
adjustfield

basefield

boolalpfa

dec

fixed

floatfield

hex

internal

left

oct

right

scientific

showbase

showpoint

showpos

skipws

unitbuf

upprecase
Эти значения используются для установки или очистки флагов форматирования.

Если флаг skipws установлен , то при потоковом вводе данных ведущие пробельные символы , или символы пропуска (т.е. пробелы , символы табуляции и новой строки ), отбрасываются.

…..

Установка и сброс флагов форматирования
Для установки любого флага используется функция setf(), которая является членом класса ios.

Лекция №10

Строки
Чаще всего одномерные массивы используются для создания символьных строк. Первый ( и наиболее популярный ) предполагает , что строка определяется как символьный массив , который завершается символом (‘\0’). Таким образом, строка с завершающим нулем состоит из символов и конечного нуль-символа. Строка С++ - это строка с завершающим нулем.

Однако существует и другой тип представлениястрок в С++.

Он заключается в применении объектов класса string, который является частью библиотеки классов С++. Таким образом, класс string – не встроенный тип.


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

#include "stdafx.h"

#include

using namespace std;
int main()

{

char a[]="KAZAN";

// 0 символ обозначает конец строки.

cout<

system("pause");

return 0;

}


char b[11]; - если нужно ввести 10 символов;

cin>>a; //Ввод строки Kazan State University

cout<
// Массив читается только до пробела.


С++ позволяет определятьстроковые константы (литералы)

Строковый литерал – это список символов, заключенный в двойные кавычки

Например:

"pause"

"Привет"

"Мне нравится С++ "

""

Строка называется нулевой. Она состоит только из одного нулевого символа (признака завершения строки). Нулевые строки используются для представления пустых строк.

Программа 1

#include "stdafx.h"

#include

using namespace std;
int main()

{

const int n=30;

char S[n];

char T[n];

char R[n];

cout << "enter 3 words s=" << endl;

cin>>S;

cout << "string S="<
system("pause");

//Ввод строки Kazan State University

//На экране будет только слово Kazan

cin>>T>>R;

cout<
// эти два слова остались во входном потоке

// они заносятся в переменные Т и R и выводятся

system("pause");

return 0;

}


Программа 2

Функции cin.get(), cin.getline().
//get_getline

#include "stdafx.h"

#include

using namespace std;

int main()

{

const int n=30;

char S[n];

cout<<" new line ch= "<<(int)'\n'<
cout<<" 0-symbol ch= "<<(int)'\0'<cout<< "enter S1="<< endl;

cin.getline(S,n); //Ввод строки Kazan State University

cout<<" S1="<
char V[]="abc";

cout<<"V= "<
cout<
// печатает abc0

system("pause");

return 0;

}

Метод getline считывает из входного потока n-1 символов

или менее ( если символ перевода строки встретится раньше) и записывает их в строковую переменную S. Символ перевода строки тоже считывается (удаляется) из входного потока, но не записывается в строковую переменную, вместо него размещается

завершающий 0.

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

//cinget_get

#include "stdafx.h"

#include

using namespace std;

int main()

{

const int n=30;

char S[n];

cout<<"enter string s= ";

cin.get(S,n);

cout<<" S= "<
cin.get();

cout<<"enter string s= ";

cin.get(S,n);

cout<<" S= "<
system("pause");

return 0;

}

Никогда не обращайтесь к разновидности метода get с двумя аргументами два раза подряд, не удалив \n из входного потока
/После каждого использования cin.get(S,n)

необходимо очищать входной поток от символа начало новой строки, который не снимается функцией cin.get(S,n) при считывании этого символа на экране появляется пустая строка
Во входном потоке остается \n символ новой строки; для того чтобы , снять с потока символ новой строки,

необходимо применить функцию cin.get() без формальных

параметров

Обработка символьной информации.


Задача 1

Задана символьная строка, содержащая

фамилию , имя и отчество.

Создать три символьные строки , содержащие

отдельно фамилию, имя и отчество.
//fio_string

#include "stdafx.h"

#include

using namespace std;

const int n=80;

int main()

{
char a[n],b[n],c[n],d[n];

cout<<" enter fio=";

cin.getline(a,n);

cout<<"a="<

int i,j;

for( i=0;a[i]!=' ';i++) b[i]=a[i];

b[i]='\0';

i++;

j=0;

while(a[i]!=' ')

{

c[j]=a[i];

i++;

j++;

}

c[j]='\0';

i++;

j=0;

while(a[i]!='\0')

{

d[j]=a[i];

i++; j++;

}

d[j]='\0';

cout<<"b="<
cout<<"c="<
cout<<"d="<
system("pause");

return 0;

}

Задача 2
Вывод введенной строки символов в обратном порядке.

Ввод строки в массив.
//gusen_8_1
#include "stdafx.h"

#include

using namespace std;
int main()

{

char str[20];

int i,n;

cout << "Enter string:";

cin >> str;

// Можно ввести не более 19 символов.

// Подсчет количества символов в строке.

// Символ '\0' – признак конца строки.

for(n=0; str[n]!='\0'; n++);

for(i=n-1; i>=0 ;i--)

cout << str[i];

// Посимвольный вывод строки.

cout << endl;

system("pause");

return 0;

}

Задача 3
Вывод введенной строки символов в обратном порядке.

Ввод строки в массив.

Второй вариант программы с использованием библиотеки

работы со строками символов – string.
//gusen_8_2
#include "stdafx.h"

#include

//#include

using namespace std;
int main()

{

char str[20];

int i,n;

cout << "Enter string:";

cin >> str; // Можно ввести не более 19 символов.

// Подсчет количества символов в строке.

n = strlen(str);

for(i=n-1; i>=0 ;i--)

cout << str[i]; // Посимвольный вывод строки.

cout << endl;

system("pause");

return 0;

}
Задача 4
Исключить из строки все символы, не являющиеся

буквами. Ввод строки в массив.
//arb2014_gusen_8_3

#include "stdafx.h"

#include

#include

using namespace std;
int main()

{

const int m=30;

char str[m];

int n;
cout << "Enter string :";

cin >> str; // Можно ввести не более 29 символов.

for (int i=0; str[i] != '\0'; i++)

if ( str[i]>='a' && str[i]<= 'z' || str[i]>='A' && str[i]<= 'Z')

cout << str[i];
cout << endl;

system("pause");

return 0;

}

Задача 5
Определить, является ли введенное слово полиндромом.

Ввод строки в массив.
//arb2014_gusen_8_4

#include "stdafx.h"

#include
using namespace std;

int main()

{

const int m = 20;

char str[m];

int i,n;

bool fl = true;

cout << "Enter string:";

cin >> str; // Можно ввести не более 19 символов.
// Подсчет количества символов в строке.

// Символ ‘\0’ – признак конца строки.

for(n=0; str[n]!='\0'; n++);

for(i=0; i
if (str[i] != str[n-i-1])

fl = false;
cout << (fl ? "Polindrom" : "Non polindrom")<
system("pause");

return 0;

}


Задача 6
Сортировка слова в лексикографическом порядке

методом “пузырька”.

Ввод строки в массив.

//arb2014_gusen_8_5

#include "stdafx.h"

#include

using namespace std;
const int m=20;

int main()

{

char str[m], k;

int i,j,n;

bool fl = true;

cout << "Enter string:";

cin >> str; // Можно ввести не более 19 символов.

// Подсчет количества символов в строке.

// Символ ‘\0’ – признак конца строки.

for(n=0; str[n]!='\0'; n++);

for(i=0;i
{

fl = false;

for(j=0;j
if (str[j] > str[j+1])

{

k=str[j];

str[j]= str[j+1];

str[j+1] = k;

fl = true;

}

}

cout << str << endl;

// Вывод С-строки (последний символ - ‘\0’)

system("pause");

return 0;
}

Задача 7
Дан текст, состоящий из слов, разделенных пробелами и

заканчивающийся точкой.

Вывести на экран этот текст, печатая каждое слово в обратном

порядке.
Чтение производится в буфер (массив) по одному слову.

Длина каждого слова не должна превышать 29 символов.
//arb2014_gusen_8_6

#include "stdafx.h"

#include

#include

using namespace std;
int main()

{

char buf[30];

int n;

bool fl=true;

cout << "Enter text :";

while(fl)

{

cin >> buf; // Чтение слова в массив.

n = strlen(buf); // Возвращает кол-во символов в строке.

if (buf[n-1] == '.')

{

n--;

fl=false;

}

for (int i=n-1; i>=0; i--)

cout << buf[i];

if (fl)

cout << ' ';

}

cout << '\n';

system("pause");

return 0;
}

Задача 8
Дан текст, состоящий из слов, разделенных пробелами и

заканчивающейся точкой. Подсчитать, сколько слов содержит

ровно две буквы m.
Посимвольный ввод входного текста.

Длина слов не ограничена.

Функция get() вводит очередной символ из входного потока

и возвращает его в качестве своего значения.

Функция get(f) вводит символ в переменную f.
//arb2014_gusen_8_7

#include "stdafx.h"

#include

using namespace std;

int main()

{

char symb;

int count_word=0,count_let=0;

cout << "Enter text:";

symb=cin.get(); // Ввод символа (в том числе и пробела)

while (symb != '.')

{

if (symb==' ')

{

if (count_let==2) count_word++;

count_let=0;

}

else

if (symb=='m') count_let++;

symb=cin.get(); // Экв. cin.get(symb);

}

if (count_let==2) count_word++;

cout << "Word count = " << count_word <
system("pause");

return 0;

}

// Другой вариант решения:

// Заголовок цикла while ((symb=cin.get()) != '.') и

// удалить операторы symb=cin.get();

Задача 9
Дан текст, состоящий из строк и заканчивающейся пустой

строкой (‘\n’). Если последний символ строки цифра N, то

первые N символов строки заменить символом &.
Функция getline(buf,size,symb) читает символы из входного

потока, пока не встретится символ symb (включая и его).

Будет прочитано size-1 символов, если symb не встретится.

Вместо symb (или в конце строки) подставляется ‘\0’.

Результат чтения помещается в массив buf.

и возвращает его в качестве своего значения.

//arb2014_gusen_8_8

#include "stdafx.h"

#include

#include

using namespace std;

int main()

{

const int size=100;

char buf[size];

int n,i,lstr;

cout << "Enter text:\n";

while(1)

{

cin.getline(buf, size, '\n');

if (buf[0] == '\0')

break;

lstr=strlen(buf);

if (buf[lstr-1] >= '1' && buf[lstr-1] <= '9') // Если цифра.

n = buf[lstr-1] - '0';

else

n = 0;

for(i=0; i
buf[i] = '&';

cout << "Result :" << endl << buf <
cout<< "Enter new line or press 'Enter' :"<
}

system("pause");

return 0;

}

Задача 10
Подсчитать количество строк, введенных с экрана терминала.
Ввод конца файла с экрана терминала: z в первой позиции

новой строки и

Функция read(buf, size) читает в массив buf или size символов,

или меньшее количество.

Если читается конец файла, то функция gcount() возвращает количество прочитанных символов.
//arb2014_gusen_8_9

#include "stdafx.h"

#include

#include

using namespace std;

int main()

{

const int size=10;

char buf[size];

int n,i,count=0;

cout << "Enter text:"<
while(!cin.eof())

{

cin.read(buf, size);

n=cin.gcount();

for(i=0; i
if(buf[i]=='\n')

count++;

}

cout << "Number of line =" << count <<'\n';

system("pause");

return 0;

}

Лекция №11

Библиотечные функции обработки строк


Операции над строками

Для строк не определена операция присваивания,

поскольку строка является не основным типом данных,

а массивом.



  1. strcpy()

  2. strncpy()


Формат strcpy(to, from)- копирует содержимое строки from в строку to.

to по длине не меньше from.
Присваивание выполняется с помощью функций стандарной библиотеки

или посимвольно "вручную" (что менее предпочтительно,

так как чревато ошибками)

Например, чтобы присвоить строке to строку from, можно воспользоваться функциями strcpy или strncpy:
Функция strcpy(to,from) копирует все символы строки,

yказанной вторым параметром (from), включая завершающий 0, в строку, указанную первым параметром (to).
Функция strncpy(to,from,n) выполняет то же самое, но не более n символов, то есть числа символов ,указанного третим параметром. Если нуль-символ в исходной строке встртится раньше, копирование прекращается, а оставшиеся до n символы строки to заполняются нуль-символами. В противном случае (если n меньше или равно длине строки from) завершающий нуль-символ в to не добавляется.
Обе эти функции возвращают указатель на результирующую строку. Если области памяти , занимаемой строкой-назначением и строкой-источником, перекрываются, поведение программы не определено.



  1. strcat()

Формат strcat(s1, s2)-присоединяет строку s2 к концу строки s1.

Примечание строка s2 не меняется.


  1. strcmp()

Формат strcmp (s1, s2)- сравнивает s1 с s2( лексико-графический)

s1 =s2 функция возвращает 0

s1 >s2 функция возвращает положительное значение

s1

  1. strclen()

strclen(s) – возвращает количество символов , не считая

Программист должен сам заботиться о том , чтобы в строке-приемнике хватило места для строки-источника ( в данном случае при выделении памяти значение переменной m должно быть больше или равно 100), и о том, чтобы строка всегда имела завершающий нуль-символ.

____________________________________________

Внимание

Выход за границы строки и отсутствие нуль-символа являются распространенными причинами ошибок в программах обработки строк.

**************************************************

// Never trouble trouble, till trouble troubles you

// Никогда не беспокойте проблему , пока проблема не //беспокоит Вас
#include "stdafx.h"

#include

#include

using namespace std;

int main()

{

int m;

char a[100] = "Never trouble trouble";

cout<<"Enter length of string m= ";

cin>>m;

char *p = new char[m];

strcpy_s(p,30,a);

cout<<"String p= "<

//char b[100] = "Good day!";

//strncpy(p,b,strlen(b)+1);

//cout<<"String b= "<
system("pause");

return 0;

}
****************************************************

Если задать m=20, то напечатается

"Never trouble trouble" и

"Good day!" и нет никаких сообщений
Если задать m=3, то напечатается

"Never trouble trouble" и

"Good day!" и

сообщения об ошибке и "приложение будет закрыто"

хотя под строку p было выделено 3 байта

*************************************************
// Never trouble trouble, till trouble troubles you

//Никогда не беспокойте проблему, пока проблема не //беспокоит Вас

//arb2014_basic_functions

#include "stdafx.h"

#include

#include

using namespace std;

int main()

{

int m;

char a[100] = "Never trouble trouble";

cout<<"Enter length of string m= ";

cin>>m;

char *p= new char[m];

strcpy(p,a);

cout<<"length p="<cout<<"String p= "<
char b[100] = "Good day!";

strncpy(p,b,strlen(b)+1));

cout<<"String p= "<

system("pause");

return 0;
}
Комментарии.

Введем m=30 и m=3 для первой функции

strcpy(p,a);

cout<<"length p="<
//длина всегда 30 (?)

//arb2009_stroka5_1

#include "stdafx.h"

#include

#include

using namespace std;

int main()

{

char a[100] = "Never trouble trouble";

int m;

cout<<"Enter length of string m= ";

cin>>m;
char *p = new char[m];

char *q = new char [m];

strcpy(p,a);

cout<<"String p= "<
char b[100] = "Good day!";

strncpy(p,b,3);

cout<<"String p= "<

strncpy(q,b,3);

cout<<"String q= "<
system("pause");

return 0;
}

**********************************************

Если введем m=3

оператор:

strcpy(p,a);

cout<<"String p= "<
результат:

String p= Never trouble trouble;
операторы:

char b[100] = "Good day!";

strncpy(p,b,3);

cout<<"String p= "<
результат:

String p= Gooer trouble trouble;
операторы

strncpy(q,b,strlen(b)+1);

cout<<"String q= "<результат

String p= "Good day!";

и сообщение об ошибке
Если введем m=10

Все тоже самое, но нет сообщения об ошибке
Указатель p адресует память, в которую скопировали

строку "Never trouble trouble".

Теперь туда же снова копируем новую строку

"Good day!", но только из этой строки берем 3 символа

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

Будет напечатано Gooer trouble trouble
p |.|------->| Never trouble trouble\0 |

Nev заменяется Goo

p |.|------->| Gooer trouble trouble\0 |
**************************************************


Функции преобразования

Для преобразования строки в целое число используется функция atoi(str).Функция преобразует строку, содержащую символьное представление целого числа, в соответствующее целое число.

Признаком конца числа служит первый символ, который не может быть интерпретирован как принадлежащий числу.

Если преобразование не удалось возвращает 0.
Аналогичные функции преобразования строки в длинное целое число (long) и в вещественное число с двойной точностью (double) называются atol и atof соответственно.

Пример
#include "stdafx.h"

#include

#include

using namespace std;

int main()

{

char a[]= "10) Height-162sm, weight-59.55 kg";

int num;

long height;

double weight;

num = atoi(a);

height = atol(&a[11]);

weight = atof(&a[25]);

cout<


Вычисление многочлена по схеме Горнера

//////////////////////////////////////////

#include "stdafx.h"

#include

#include
using namespace std;

/////////////////

double Gorner(double* a, int n, double x)

{

double s = a[0];

int i;

for (i = 1; i < n; i++)

s = s * x + a[i];

return s;

}

///////////////////////////////////

void Create(ifstream& f, double* x, int n)

{

int i;

for (i = 0; i < n; i++)

f >> x[i];

}

//////////////////////////////
void Show(ofstream& f, double* x, int n)

{

int i;

for ( i = 0; i < n; i++)

f << x[i] << ' ' ;

f << endl;

}

/////////////////////////////////

int main()

{

ifstream in("in.txt");

ofstream out("out.txt");
if (!in)

{

cout << "Can't open file! " << endl;

system("pause");

exit(-1);

}
int n, m;

cout<<"Введите размерность коэффициентов n= " ;

cin >> n;

double* a = new double[n];

cout << "Введите размерность аргументов m= " ;

cin >> m;

double* x = new double[m];

double* y = new double[m];

Create(in, a, n);

Create(in, x, m);

out<<" Коэффициенты многочлена: "<< endl;

Show(out, a, n);

out << "Аргументы многочлена: "<
Show(out, x, m);

int i;

for ( i = 0; i < n; i++)

y[i] = Gorner(a, m, x[i]);

out << "Значения многочлена: " << endl;

Show(out, y, m);

delete []a;

delete []x;

delete []y;
in.close();

out.close();

system("pause");

return 0;

}
Входной файл in.txt

5 4 3 2 1

1 2 3 4 5 0.6 0.7 1 0 1
Выходной файл out.txt

Коэффициенты многочлена:

5 4 3 2 1

Аргументы многочлена:

1 2 3 4 5 0.6 0.7 1 0 1

Значения многочлена:

15 129 547 1593 3711 4.792 6.4425 15 1 15

Лекция

Форматирование

Создать массив ( целый и вещественный ) в зависимости от флагов форматирования
#include "stdafx.h"

#include

#include

#include //манипуляторы

using namespace std;
const int n=10;

void create(ifstream&f, int x[n]);

void create(ifstream&f, double x[n]); // перегрузка функции create

void show(ofstream&f, int x[n], int k);

void show(ofstream&f, double x[n], int k);

// перегрузка функции show
int main()

{

ifstream in1("in1.txt");

ifstream in2("in2.txt");

ofstream out1("out1.txt");

ofstream out2("out2.txt");

out1.setf( ios::left); //установить флаг форматирования

out1.setf( ios::show pos) ;

out1.setf( ios::oct);

out1.unset( ios::oct);

out1.setf( ios::right);

out2.setf( ios::saentific);

// saentific-плавающая точка; fixed-фиксированная точка

out2.unset( ios:: saentific);

//установка точности

out2. precision(2);

double b[n];

int a[n];

create (in1,a);

in1.close();

show(out1,a);

out1.close();

create (in2,b,20);

in2.close();

show(out2,b,20);

out2.close();

system("pause");

return 0;
}

/////////////////////////////////////

void create(ifstream&f, int x[n])

{int i;

for (i=0;i
f>>x[i];

}

////////////////////////////////////

void create(ifstream&f, double x[n])

{int i;

for (i=0;i
f>>x[i];

}

//////////////////////////////

void show(ifstream&f, int x[n], int k)

{ int i;

for (i=0; i
{

f. width(k);

f.fill(‘#’);

f<
}

////////////////////////////////////

void show(ifstream&f, double x[n], int k)

{ int i;

for (i=0; i
{

f. width(k);

f.fill(‘#’);

f<
}

////////////////////////////////

Файловый ввод-вывод.
Задача 1
// Поиск минимального элемента в массиве.

// Ввод массива из файла fstream.h

// Вывод на экран iostream.h
#include "stdafx.h"

#include

#include

using namespace std;
int main()

{

int i, min, mas[10];

ifstream myin("test.txt"); //Открытие файла для ввода.

for(i=0;i<10;i++)

myin >> mas[i];
min=mas[0];

for(i=1;i<10;i++)

if (mas[i]
min=mas[i];

cout << "min = " << min << '\n';

system("pause");

return 0;
}

Задача 2
// Приближенное вычисление 1/x

// Последовательности {ак} и {вк} заданы рекуррентно: а0 =1,

// в0=1-х; (0
// ак= ак-1(1+вк-1), вк2к-1, к=1,2,…

// Вычислить аn для наименьшего n, при котором вn ≤ ∂ (∂>0).

// Ввод значения переменной х с экрана iostream.h

// Вывод всех членов последовательностей a и b,

// а также результата в файл fstream.h
#include "stdafx.h"

#include

#include

using namespace std;
const double eps= 0.001;

int main()

{

double a=1, b, x;

ofstream myout("result.txt"); //Открытие файла для вывода.

cout << "Enter x:";

cin >> x;

if (x<=0 || x>=2)

cout << "not decision";

else

{

b=1-x;

do

{

a=a*(1+b);

b=b*b;

myout << "a = " << a << " b = " << b << endl;

}

while(b>eps);

myout << "1/x=" << a << endl;

cout<<Проверка Вычислений "<< 1/x <
}

system("pause");

return 0;

}


Задача 3
// Запись вектора в обратном порядке

// Файловый ввод-вывод fstream.h

#include "stdafx.h"

#include

#include

using namespace std;
const int SIZE= 9;

int main()

{

int i, k, mas[SIZE];

ifstream myin("test.txt"); //Открытие файла для ввода.

ofstream myout("result.txt"); //Открытие файла для вывода.

for(i=0;i
myin >> mas[i];

for(i=0;i
{

k=mas[i];

mas[i]= mas[SIZE-i-1];

mas[SIZE-i-1] = k;

}

for(i=0;i
myout << mas[i] << " ";

cout<
system("pause");

return 0;
}


Задача 4
// Транспонирование матрицы.

// Файловый ввод-вывод fstream.h

#include "stdafx.h"

#include

#include

using namespace std;

int main()

{

int i, j;

const int n = 4;

double b[n][n], x;

ifstream myin("test.txt"); //Открытие файла для ввода.

ofstream myout("result.txt"); //Открытие файла для вывода.

for (i = 0; i < n; i++)

for (j = 0; j < n; j++)

myin >> b[i][j];

for (i = 0; i < n - 1; i++)

for (j = i + 1; j < n; j++)

{

x = b[i][j];

b[i][j] = b[j][i];

b[j][i] = x;

}

myout << "Транспонированная матрица :”<
for (i = 0; i < n; i++)

{

for (j = 0; j < n; j++)

myout << b[i][j] << ' ';

myout << endl; // Построчный вывод матрицы.

}

system("pause");

return 0;

}

Задача 5
/* Дан текст, состоящий из слов, разделенных пробелами.

Выполнить форматирование текста, печатая в каждой строке

не более SIZE символов.

*/

// Чтение производится в буфер (массив) по одному слову.

// Длина каждого слова не должна превышать 29 символов.

// Файловый ввод-вывод fstream.h
#include "stdafx.h"

#include

#include

#include

using namespace std;
const int SIZE =30;

int main()

{

char buf[30];

int n, len=0;

ifstream myin("text.txt");

ofstream myout("result.txt");

myin >> buf;

while( !myin.eof() )

{

n = strlen(buf);

if (len+n <= SIZE)

len=len+n+1;

else

{

len=n+1;

myout << '\n';

}

myout << buf << ' ';

myin >> buf;

}

system("pause");

return 0;

}

Задача 6
/* В упакованном представлении текста – цифра “К” означает

К-кратное повторение следующей за ним буквы. Например,

текст “3bc3a” интерпретируется как ”bbbcaaa”.

Выполнить распаковку текста, считая, что символы символы- цифры рядом не встречаются. */

// Посимвольный ввод входного текста.

// Длина слов не не ограничена.

// Функция get() вводит очередной символ из входного потока

// и возвращает его в качестве своего значения.

// Функция put(f) вводит символ f в выходной поток.

// Файловый ввод-вывод.
#include "stdafx.h"

#include

#include

using namespace std;
int main()

{

char symb;

int n, i;

ifstream myin("text.txt");

ofstream myout("result.txt");

symb=myin.get();

while( !myin.eof() )

{

if ( symb >='0' && symb <='9')

{

n = symb - '0';

symb=myin.get();

if (!myin.eof() )

for(i=1; i<=n; i++)

myout.put(symb);

}

else

myout.put(symb); // Вывод символа в файл.

symb=myin.get();

}

system("pause");

return 0;
}

Задача 7
/* Дан текст, состоящий из слов, разделенных пробелами.

В каждой строке текста первое и последнее слово поменять

местами.

*/

#include "stdafx.h"

#include

#include

#include

using namespace std;
int main()

{

const size=81; // Длина строки не более 80 символов.

char buf[size];

int n, i;

int first; // Позиция начала первого слова строки

int count_first; // Кол-во символов первого слова

int last; // Позиция окончания последнего слова

int count_last; // Кол-во символов последнего слова

ifstream myin("text.txt"); // Открытие файла для ввода

ofstream myout("result.txt"); // Открытие файла для вывода

while( !myin.eof() )

{ // Чтение строки в буфер

myin.getline(buf, size, '\n');

n=strlen(buf); // n – кол-во символов в buf (без ‘\0’)

// Вывод начальных пробелов строки

for(i=0; i<=n; i++)

if(buf[i]==' ')

myout.put(buf[i]);

else

break;

if(buf[i]=='\0') // Если пустая строка

{

myout.put('\n');

continue; // Переход к следующей итерации цикла

}

first=i; // Позиция начала первого слова строки

count_first=1;

// Подсчет кол-ва символов в первом слове

for(i=first+1; i
if(buf[i]!=' ' && buf[i]!='\0')

count_first++;

else

break;

// Пропуск пробелов в конце строки

for(i=n-1; i>=0 && buf[i]==' '; i--);

last=i; // Позиция окончания последнего слова строки

count_last=0;

// Подсчет кол-ва символов в последнем слове

for(i=last; i>=0; i--)

if(buf[i]!=' ')

count_last++;

else

break;

// Если в строке только одно слово

if(first+count_first > last-count_last)

myout << buf << '\n'; // Вывод всей строки без изменений

else

{ // Вывод последнего слова

for(i=last-count_last+1; i<=last; i++)

myout.put(buf[i]);

// Вывод “середины” строки

for(i=first+count_first; i<=last-count_last; i++)

myout.put(buf[i]);

// Вывод первого слова

for(i=first; i
myout.put(buf[i]);

myout << '\n';

}

}
system("pause");

return 0;
}


Задача 8
// Подсчет количества строк, слов и символов в тексте

#include "stdafx.h"

#include

#include

using namespace std;
const int SIZE=512;

int main()

{

int nl=0; // Кол-во строк

int nw=0; // Кол-во слов

int nc=0; // Кол-во символов

int n,i;

char buf[SIZE]; // Размерность физического блока на диске

bool inword=false; // Находимся в слове

ifstream myin("text.txt");

while( !myin.eof() )

{

myin.read(buf, SIZE); // Чтение в буфер

n=myin.gcount();

nc+=n;

for(i=0; i
{

if(buf[i]=='\n')

++nl;

if(buf[i]=='\n' || buf[i]==' ')

inword=false;

else

if (!inword)

{

inword=true;

++nw;

}

}

}

cout<<"Lines= "<
cout<<"Words= "<
cout<<"Symbols= "<
system("pause");

return 0;

}
Задача
#include "stdafx.h"

#include

#include

using namespace std;
int main()

{

int a=904;

double b=905.906901;

cout<
cout<
cout<
cout<
cout<system("pause");

return 0;

}


Лекция

Файловый ввод и вывод (продолжение)

на примере печати таблицы

«Успеваемость на факультете ВМК»
//arb2009_table_file_VMK
#include "stdafx.h"

#include

#include

#include

#include

using namespace std;
const int numberCourse=5;

const int numberMark=4;

const int lengthIndent=7;// длина абзаца

const int lengthTable=56;// длина таблицы

const int lengthColumn=10;// длина колонки

/////////////////////////////////////////////////

void star(ofstream &f,int n,int m)

{

f.width(n);

int i;

for (i=0;i
f<<'*';

f<
}

///////////////////////////////////////////////

void star1(ofstream &f,int n)

{

int i;

f.width(n);

f<<"*";

f.width(lengthColumn+1);

f<<"*";
for (i=0;i
{

f.width(lengthColumn+1);

f<<'*';

}

f<
}

///////////////////////////////////////////////////////////////

int main()

{

char name_Course[numberCourse][15];

char name_Mark[numberMark][20];

int number_Student[numberCourse][numberMark];

char name_Faculty[80];

int Total[numberMark];

ifstream in("arb.txt");

ofstream out("vmk.txt");

int i,j;

in.getline(name_Faculty,80);

for (i=0;i
in>>name_Course[i];
for (i=0;i
in>> name_Mark[i];
for (i=0;i
for (j=0;j
in>> number_Student[i][j];

in.close();

out<
out.width( lengthTable + 4 );

out<
out<star(out,lengthIndent+1,lengthTable);//

star1(out,lengthIndent+1);
out.width(lengthIndent+1);

out<<"*";

out.width(lengthColumn+1);

out<<"*";
for(i=0;i
{

out<<" "<
out.width(lengthColumn-strlen(name_Mark[i]));

out<<"*";

}

out<star1(out,lengthIndent+1);

star(out,lengthIndent+1,lengthTable);
for(i=0;i
{

star1(out,lengthIndent+1);

out.width(lengthIndent+1);

out<<"*";

out<<" "<
out.width(lengthColumn-strlen(name_Course[i]));

out<<"*";
for(j=0;j
{

out<
out<
out<<"*";

}

out<
star1(out,lengthIndent+1);

star(out,lengthIndent+1,lengthTable);

}
for(j=0;j
{

Total[j]=0;

for(i=0;i
Total[j]+=number_Student[i][j];

}

star(out,lengthIndent+1,lengthTable);

star1(out,lengthIndent+1);
out.width(lengthIndent+1);

out<<"*"<<" Total *";

for(j=0;j
{

out<
out<
out<<"*";

}

out<
star1(out,lengthIndent+1);

star(out,lengthIndent+1,lengthTable);

out<
system("pause");

return 0;
}


Файл arb.txt
Session results on Faculty of Computer Science(VMK)

first second third fourth fifth

perfect good satisf poor

2 3 4 5

2 3 3 3

3 3 3 3

3 3 3 3

3 3 3 3

Файл vmk.txt

Session results on Faculty of Computer Science(VMK)






perfect

good

satisfy

poor

first

2

3

4

5

second

2

3

3

3

third

3

3

3

3

fourth

3

3

3

3

fifth

3

3

3

3

Total:

13

15

16

17


Лекция

Задана квадратная матрица из положительных целых чисел. Вычислить
op1(A), prime(SP(A[i][j]))

A=

op2(A), otherwise.
prime(SP(A[i][j])) – сумма( по i) произведение (по j) A[i][j]

есть простое число.

Операция op1(A)- транспонированная матрица A.

Операция op2(A) - i –ая строка матрицы A сдвигается циклически влево на 1 позицию, если она содержит число, сумма цифр, которого является простым число, и

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

//arb2015_mas_bool

#include "stdafx.h"

#include

#include

#include

using namespace std;

////////////////////////////////////

void create(ifstream &f,int** x, int n)

{

int i,j;

for(i=0;i
for(j=0;j
f>>x[i][j];
}

///////////////////////////

void show(ofstream &f,int** x, int n)

{

int i,j;

for(i=0;i
{

for(j=0;j
f<
f<
}
}

///////////////////////////

int sum_cifr(int x)

{

int s=0;

while(x>0)

{

s=s+x%10;

x=x/10;

}

return s;
}

/////////////////////////////

int sum_mult(int** x, int n)

{

int i,j;

int s=0;

int p;

for(i=0;i
{

p=1;

for(j=0;j
p=p*x[i][j];

s=s+p;

}

return s;

}

/////////////////////////////

bool prime(int x)

{

int i;

if (x<=1) return false;

if(x==2)return true;

bool p=true;

for(i=2;i<=sqrt(x) && p;i++)

if (x%i==0)p=false;

return p;

}

/////////////////////////////

bool f1(int**x, int n)

{

return prime(sum_mult(x,n));

}

////////////////////////////

bool f2(int*x, int n)

{

int j;

bool p=false;

for(j=0;j
if (prime(sum_cifr(x[j]))) p=true;

return p;

}

////////////////////////////

void shift_left(int* x,int n)

{

int r,i;

r=x[0];

for(i=0;i
x[i]=x[i+1];

x[n-1]=r;

}

////////////////////////////

void shift_right(int* x,int n)

{

int r,i;

r=x[n-1];

for(i=n-1;i>0;i--)

x[i]=x[i-1];

x[0]=r;

}

////////////////////////////

void op1(int** x,int n)

{

int i,j;

for(i=0;i
for(j=i+1;j
{

int r=x[i][j];

x[i][j]=x[j][i];

x[j][i]=r;

}

}

///////////////////////////////

void op2(int** x,int n)

{

int i;

for(i=0;i
if (f2(x[i],n)) shift_left(x[i],n);

else shift_right(x[i],n);

}

////////////////////////////////

int main()

{

int n,i;

int** a;

ifstream in("arb.txt");

ofstream out("out.txt");

if(!in)

{

cout<<"can't open file!"<
exit(-1);

}

cout<<"enter size of array n=";

cin>>n;

a=new int*[n];

for(i=0;i
a[i]=new int[n];

create(in,a,n);

out<<"array a:"<
show(out,a,n);


if(f1(a,n))op1(a,n);else op2(a,n);

out<<" new array a:"<
show(out,a,n);

in.close();

out.close();

for(i=0;i
delete [] a[i];

delete []a;
system("pause");

return 0;
}
Файл arb.txt

1 22 33

4 5 6

7 8 9
Файл out.txt

array a:

1 22 33

4 5 6

7 8 9

new array a:

33 1 22

5 6 4

8 9 7

1.8 Преобразование матрицы.

По заданной матрице А (размерности nn) вычислить новую матрицу X:



где Е1 и Е2 - заданные преобразования матрицы А. Входными данными программы являются: число n и элементы матрицы А; выходными  элементы матрицы X.

В программе предусмотреть:

- процедуру вычисления матрицы Е1(А) с формальными параметрами: размерность матрицы m, массивы А и В (исходная матрица и вычисляемая);

- процедуру-функцию булевского типа вычисления значения предиката с формальными параметрами: размерность матрицы и массив ее элементов.

Исходные данные

I. Две различные операции Е1 и Е2 над вещественными матрицами из следующего списка:

б) умножение на 3 всех элементов тех и только тех строк, в которых диагональный элемент больше 1;

е) преобразование в симметричную с сохранением элементов, находящихся справа от главной диагонали;

III. Предикат P(A) на вещественных матрицах:

а) все определители второго порядка положительны (т.е.

;

IV. Числовые данные. Размерность матрицы n = 5, 6, 7 или 8, а элементы матрицы выбираются произвольно.
//arb2014_semestr_task_array

#include "stdafx.h"

#include

#include

#include

using namespace std;
void create(ifstream &f , int** x, int n )

{

int i,j;

for(i=0;i
for(j=0;j
f>>x[i][j];
}

////////////////////////////////

void show(ofstream &f , int** x, int n )

{

int i,j;

for(i=0;i
{

for(j=0;j
f<
f<
}

f<
}

////////////////////////////////

void E1(int** x, int** y, int n)

{

int i,j;

for(i=0;i
{

if (x[i][i]>1)

for(j=0;j
else

for(j=0;j
}

}

//////////////////////////////////

void E2(int** x, int** y, int n)

{

int i,j;

for(i=0;i
for(j=0;j
if (i>=j)

{

y[i][j]=x[i][j];

y[j][i]=y[i][j];

}

}

///////////////////////////////

bool AA(int** x, int n)

{

bool p=true;

int i,j;

for(i=0;i
for(j=0;j
if ( x[i][j]*x[i+1][j+1] - x[i+1][j]*x[i][j+1]<=0) p=false;

return p;

}

//////////////////////////////////

int main()

{

ifstream in("arb.txt");

ofstream out("out.txt");

int** a,**b;

int n,i;

cout<<"enter size of array n=";

cin>>n;

a=new int* [n];

for(i=0;i
a[i]=new int[n];

b=new int* [n];

for(i=0;i
b[i]=new int[n];

create(in ,a,n);

in.close();

out<<"array a:"<
show(out,a,n);

if( AA(a,n)) E1(a,b,n); else E2(a,b,n);

out<<"array b:"<
show(out,b,n);

out.close();

system("pause");

return 0;

}
Файл “arb.txt”

3 2 1

3 3 2

2 3 3
Файл “out.txt”

array a:

3 2 1

3 3 2

2 3 3
array b:

9 6 3

9 9 6

6 9 9

Лекция_Новые_функции_int**_create(ifstream_f_,_int_n_)_int**_add(int**_x,_int**_y,_int_n)'>Лекция

Новые функции
int** create(ifstream &f , int n )

int** add(int** x, int** y, int n)

int** subtr (int** x, int**y, int n)

int** mult (int** x, int**y, int n)
Память под массив выделяется внутри функции и функция create возвращает указатель на массив.

Функции add, subtr,mult – возвращают указатель на массив, можно использовать выражения d=mult(add(a,b,n),a,n);

//arb2014_array_3_function

#include "stdafx.h"

#include

#include

#include

using namespace std;
int** create(ifstream &f , int n )

{

int i,j;

int **x=new int*[n];

for(i=0;i
x[i]=new int[n];

for(i=0;i
for(j=0;j
f>>x[i][j];

return x;

}

void show(ofstream &f , int** x, int n )

{

int i,j;

for(i=0;i
{

for(j=0;j
f<
f<
}

f<
}

////////////////////////////////

int** add(int** x, int** y, int n)

{

int i,j;

int **z=new int*[n];

for(i=0;i
z[i]=new int[n];

for(i=0;i
for(j=0;j
z[i][j]=x[i][j]+y[i][j];

return z;

}

//////////////////////////////////

int** subtr (int** x, int**y, int n)

{

int i,j;

int **z=new int*[n];

for(i=0;i
z[i]=new int[n];

for(i=0;i
for(j=0;j
z[i][j]=x[i][j]-y[i][j];

return z;

}

/////////////////////////////

int** mult(int** x, int**y, int n)

{

int i,j,k;

int **z=new int*[n];

for(i=0;i
z[i]=new int[n];

for(i=0;i
for(j=0;j
{

z[i][j]=0;

for(k=0;k
z[i][j]=z[i][j]+x[i][k]*y[k][j];

}

return z;

}

///////////////////////////////

int main()

{

ifstream in1("arb1.txt");

ifstream in2("arb2.txt");

ofstream out("out.txt");

int** a,**b, **c;

int n,i;

cout<<"enter size of array n=";

cin>>n;

a= create(in1 ,n);

b= create(in2 ,n);

in1.close();

in2.close();

out<<"array a:"<
show(out,a,n);

out<<"array b:"<
show(out,b,n);

c=add(a,b,n);

out<<"array c=a+b c:"<
show(out,c,n);

c=add(c,c,n);

out<<"array c=c+c c:"<
show(out,c,n);
c=subtr( add(c,c,n), add(a,c,n),n);

out<<"array c=(c+c)-(a+c) c:"<
show(out,c,n);

int** d =mult(a,b,n);

out<<"array d=a*b d:"<
show(out,d,n);

d=mult(add(a,b,n),a,n);

out<<"array d=(a+b)*a d:"<
show(out,d,n);

out.close();

}
Файл arb1.txt

1 1 1 1

1 1 1 1

1 1 1 1

1 1 1 1
Файл arb2.txt

1 1 1 1

1 1 1 1

1 1 1 1

1 1 1 1
Файл out.txt

array a:

1 1 1 1

1 1 1 1

1 1 1 1

1 1 1 1
array b:

1 1 1 1

1 1 1 1

1 1 1 1

1 1 1 1
array c=a+b c:

2 2 2 2

2 2 2 2

2 2 2 2

2 2 2 2
array c=c+c c:

4 4 4 4

4 4 4 4

4 4 4 4

4 4 4 4
array c=(c+c)-(a+c) c:

3 3 3 3

3 3 3 3

3 3 3 3

3 3 3 3
array d=a*b d:

4 4 4 4

4 4 4 4

4 4 4 4

4 4 4 4
array d=(a+b)*a d:

8 8 8 8

8 8 8 8

8 8 8 8

8 8 8 8

Лекция
Структуры и перечисления.

Структура Employee - работник

Перечисление transport – транспортное средство

Структуры ( struct)

В отличие от массивов, все элементы которого однотипны структура может содержать элементы разных типов. В языке С++ структура является видом класса и обладает всеми его свойствами, но во многих случаях достаточно использовать структуры , как они определены в языке С.

struct имя_типа

{

тип_1 элемент_1;

тип_2 элемент_2;

…….

тип_n элемент_n;

};
Элементы структуры называются полями структуры и могут иметь любой тип, кроме типа этой же структуры, но могут быть указателями на него.
Для переменных одного и того же структурного типа определена операция присваивания, при этом происходит поэлементное копирование. Структуру можно передавать в функцию и возвращать в качестве значения функции.
Доступ к полям структуры выполняется с помощью операции выбора . (точка) при обращении к полю через имя структуры и -> при обращении через указатель.
struct Worker

{

char fio[30];

int code;

double salary;

}

Worker worker, staff[100],*ps;

worker.fio="Иванов";

staff[8].code=123;

ps->salary=12000;
Если элементом структуры является другая структура, то доступ к ее элементам выполняется через две операции выбора
struct A { int a; double k;};

struct B { A a; double x;};
B x[2];

x[0].a.a=1;

x[1].x=0.1

//arb2014_struct_employeе_2
#include "stdafx.h"

#include

#include

using namespace std;
const int K=80;

const int N=5;
enum status { Boss=1,Accountant,Secretary,It ,Office};

struct Employee

{

int Id;

char Name[K];

double Salary;

status Status;

};
int main()

{

int i;

Employee emp[N];

for(i=0;i
{

emp[i].Id=i+1;

cout<<"enter name "<
cin.getline(emp[i].Name,80);

cout<<" enter salary "<< emp[i].Name<<" : ";

cin>>emp[i].Salary;
int st;

do

{

cout<<"enter status of employee (1..5) st= ";

cin>>st;

} while ( st<1 || st>5 );

emp[i].Status =(status)st;

cin.get();// снимает с потока символ «новая строка»

}
cout<
for(i=0;i
{

cout<
<
switch (emp[i].Status)

{

case Boss: cout<<"Boss"<
case Accountant: cout<<"Accountant"<
case Secretary : cout<<"Secretary"<
case It : cout<<"It"<
case Office : cout<<"Office"<
default: ; break;

}

}

}
1>