Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


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





Поделиться с друзьями:


Дата добавления: 2016-12-06; Мы поможем в написании ваших работ!; просмотров: 364 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Наглость – это ругаться с преподавателем по поводу четверки, хотя перед экзаменом уверен, что не знаешь даже на два. © Неизвестно
==> читать все изречения...

2613 - | 2186 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.012 с.