Память под массив выделяется внутри функции и функция 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.