Память под массив выделяется внутри функции и функция create возвращает указатель на массив.

Функции add, subtr,mult – возвращают указатель на массив, можно использовать выражения d=mult(add(a,b,n),a,n);

 

//arb2014_array_3_function

#include<iostream>

#include<fstream>

#include<iomanip>

using namespace std;

 

int** create(ifstream &f , int n )

{

int i,j;

int **x=new int*[n];

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

x[i]=new int[n];

 

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

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

f>>x[i][j];

return x;

}

 

 

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

{

int i,j;

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

{

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

f<<setw(5)<<x[i][j];

f<<endl;

}

f<<endl;

}

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

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

{

int i,j;

int **z=new int*[n];

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

z[i]=new int[n];

 

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

for(j=0;j<n;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<n;i++)

z[i]=new int[n];

 

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

for(j=0;j<n;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<n;i++)

z[i]=new int[n];

 

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

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

{

z[i][j]=0;

for(k=0;k<n;k++)

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

}

return z;

}

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

void 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:"<<endl;

show(out,a,n);

out<<"array b:"<<endl;

show(out,b,n);

 

c=add(a,b,n);

out<<"array c=a+b c:"<<endl;

show(out,c,n);

c=add(c,c,n);

out<<"array c=c+c c:"<<endl;

show(out,c,n);

 

c=subtr( add(c,c,n), add(a,c,n),n);

out<<"array c=(c+c)-(a+c) c:"<<endl;

show(out,c,n);

 

int** d =mult(a,b,n);

out<<"array d=a*b d:"<<endl;

show(out,d,n);

 

d=mult(add(a,b,n),a,n);

out<<"array d=(a+b)*a d:"<<endl;

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<iostream>

#include<iomanip>

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;

};

 

void main()

{

 

int i;

Employee emp[N];

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

{

emp[i].Id=i+1;

cout<<"enter name "<<emp[i].Id<<" of employee: ";

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<<setw(10)<<"Id"<<setw(10)<<"Name"<<setw(10)<<"Salary"<<setw(15)<<"Status"<<endl;

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

{

cout<<setw(10)<<emp[i].Id<<setw(10)<<emp[i].Name

<<setw(10)<<emp[i].Salary<<setw(15);

switch (emp[i].Status)

{

case Boss: cout<<"Boss"<<endl; break;

case Accountant: cout<<"Accountant"<<endl; break;

case Secretary : cout<<"Secretary"<<endl; break;

case It : cout<<"It"<<endl; break;

case Office : cout<<"Office"<<endl; break;

default: ; break;

}

}

}

Перечисления

Дни недели

 

 

//arb2015_enum_day_of_week

#include<iostream>

using namespace std;

 

enum days_of_week { Sun, Mon, Tue, Wed, Thu,Fri,Sat };

void main()

{

days_of_week day1,day2;

day1=Mon;

day2=Thu;

int diff=day2-day1;

cout<<" the difference in days = "<<diff<<endl;

if (day1<day2) cout<<" day1 comes before day2"<<endl;

}

 

Тип перечисление

 

В С++ можно определить список именованных целоцисленных констант. Такой список называется перечислением. Эти константы

Можно использовать везде , где допустимы целочисленные значения ( например, в целочисленных выражениях).

Перечисления определяются с помощью ключевого слова enum,

а формат их определения имеют такой вид

enum имя_типа { список_перечисления } список_переменных;

Под элементом список _перечисления понимается список разделенных запятыми имен , которые представляют значения перечисления. Элемент список_переменных необязателен, поскольку переменные можно объявлять позже , используя имя_типа перечисления.

 

В следующем примере используется перечисление transport и две переменные типа transport с именами t1и t2.

 

enum transport {car, truck, airplane, train, boat };

transport t1 , t2;

t1 = airplane;

 

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

cout<< car<<’ ‘<<train;

на экран будут выведены чиса 0 и 3.

Несмотря на то , что перечислимые константы автоматически преобразуются в целочисленные , обратное преобразование автоматически не выполняется. Например, следующая инструкция некорректна.

 

t2=1;// ошибка

 

Эта инструкция вызовет во время компиляции ошибку, поскольку автоматического преобразования целочисленных значений в значения типа transport не существует. Откорректировать предыдущую инструкцию можно с помощью операции приведения типов

 

T2= (trunsport) 1;

Теперь переменная t2 будет содержать значение truck, поскольку эта transport-константа связывается со значением 1.

Используя инициализатор, можно указать значение одной или нескольких перчислимых констант. Это делается так : после соответствующего элемента списка перчисления ставится знак равенства и нужное целое число. При использовании инициализатора следующему ( после инициализированного ) элементу списка присваивается значение , на единицу превышающее предыдущее значение инициализатора.

 

enum transport {car, truck, airplane=10, train, boat } ;

 

Теперь все имена перечисления transport имеют следующие значения

сar 0

truck 1

airplane 10

train 11

boat 12

 

//arb2014_type_enum

#include<fstream>

using namespace std;

 

void main()

{

ofstream out("out.txt");

 

enum transport {car, truck=2,airplane=10, train, boat };

transport t1,t2;

out<<"airplane=10 airplane= "<<airplane<<endl;

out<<"airplane=10 airplane+10” <<airplane+10<<endl;

t2=truck;

t2=(transport)((int)t2 +2);

out<<" t2=(transport)((int)t2 +2) t2= "<<t2<<endl;

out.close();

}

 

 

enum transport {car, truck=2,airplane=10, train, boat };

 

Файл out.txt

airplane=10 airplane= 10

airplane=10 airplane+10 = 20

t2=(transport)((int)t2 +2) t2= 4

 

Примечание: именованной константы со значением 4 нет в перечислении.

 

Тип union – объединение

Объединение - это область памяти которуюразделяют несколько различных переменных. Объединение создается с помощью ключевого слова union.Его объявление подобно объявлению структуры.

union utype

{

short int I;

char ch;

};

 

Здесь объявляется объединениея, в котором значение типа short int и значение типа char разделяют одну и туже область памяти. Необходимо сразу же прояснить один момент: невозможно сделать так, чтобы объединение хранило и целочисленное значение , и символ одновременно, поскольку переменные i и ch (в памяти ) накладываются друг на друга. Но программа в любой момент времени может обрабатывать информацию

 

//arb2014_struct_union2

#include<iostream>

#include<fstream>

#include<iomanip>

using namespace std;

void main()

{

struct strtype

{

int x;

union

{

short int age;

char title[30];

};

};

int n;

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

cin>>n;

strtype* a= new strtype[n];

 

ifstream in("arb.txt");

ofstream out("out.txt");

int i;

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

{

int y;

in>>y;

if(y==0) in>>a[i].age; else in>>a[i].title;

a[i].x=y;

}

in.close();

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

{

out<<a[i].x<<setw(20);

if(a[i].x) out<<a[i].title; else out<<a[i].age;

out<<endl;

}

out.close();

}

 

n=20

Файл arb.txt

 

0 23 1 boss 0 17 1 it 1 office 1 landlord 0 20 1 sportsmen

0 23 1 boss 0 17 1 it 1 office 1 landlord 0 20 1 sportsmen

0 23 1 boss 0 17 1 it 1 office 1 landlord 0 20 1 sportsmen

0 23 1 boss 0 17 1 it 1 office 1 landlord 0 20 1 sportsmen

 

Файл out.txt

0 23

1 boss

0 17

1 it

1 office

1 landlord

0 20

1 sportsmen

0 23

1 boss

0 17

1 it

1 office

1 landlord

0 20

1 sportsmen

0 23

1 boss

0 17

 

Лекция №13

Структуры

Структуры - тип данных, определяемые пользователем

 

Задача 1.