Опубликован: 07.03.2015 | Уровень: для всех | Доступ: свободно | ВУЗ: Компания ALT Linux
Лекция 9:

Структуры в языке C++

< Лекция 8 || Лекция 9: 12345 || Лекция 10 >
Аннотация: В этой главе дано описание структурного типа данных. Этот тип предназначен для представления сложных данных и создания новых типов. Приведены примеры использования структур для работы с комплексным числом. Описана библиотека языка C++, позволяющая работать с комплексными числами

9.1 Общие сведения о структурах

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

Для того, чтобы объявить переменные структурного типа, вначале нужно задать новый тип данных, указав имя структуры и её элементы. Элементы структуры называются полями, и могут иметь любой тип данных кроме типа этой же структуры. Далее приведён пример создания структурного типа student, полями которого являются фамилия студента, шифр группы, год начала обучения и оценки по четырём предметам:

struct student
{
//Поля структуры:
char fio [ 30 ];
char group [ 8 ];
int year;
int informatika, math, fizika, history;
}

На основании созданного структурного типа данных можно описать переменные типа student:

student Vasya; //Переменная Vasya типа student.
student ES [ 50 ]; //Массив, элементы которого имеют тип student.
student *x; //Указатель на тип данных student

Обращаются к полям переменной структурного типа так:

имя_структуры.поле

Например,

Vasya.year; //Обращение к полю year переменной Vasya.
ES[4].math; //Обращение к полю math элемента ES[4].

Задача 9.1. Задано n комплексных чисел, которые хранятся в двоичном файле. Найти значение наибольшего модуля среди заданных чисел.

Напомним, что комплексные числа это числа вида z=a+b\cdot i, где a и b — действительные числа, а i — мнимая единица, i^2=-1. Комплексное число расширяет понятие действительного числа. Если действительное число — это любая точка на числовой прямой, то под комплексным числом понимают точку на плоскости (рис. 9.1). Модуль комплексного числа z вычисляют по формуле |z|=\sqrt{a^2+b^2}.

Для решения задачи 9.1 разработаны две программы. Первая создаёт файл исходных данных, вторая получает из него информацию и обрабатывает её в соответствии с поставленной задачей.

Далее приведён текст программы создания двоичного файла с n комплексными числами. В файл complex.dat будет записано число n, а затем последовательно комплексные числа.

#include <iostream>
#include <fstream>
using namespace std;
int main ( )
{
	//Структура Комплексное число.
	struct complex
	{
		//Поля структуры:
		double Re; //Действительная часть.
		double Im; //Мнимая часть.
	};
	complex p; //Переменная для хранения комплексного чисела.
	int i, n;
	FILE *f;
	cout<<" n = "; cin>>n;
	f=fopen ( " complex.dat ", " wb " );
	fwrite (&n, sizeof ( int ), 1, f );
	for ( i =0; i<n; i++)
	{
		cout<<"Введите комплексное число\n ";
		//Ввод комплексного числа:
		cin>>p.Re; //действительная часть,
		cin>>p.Im; //мнимая часть.
		//Вывод комплексного числа.
		cout<<p.Re<<" + "<<p.Im<<" i "<<endl;
		//Запись комплексного числа в двоичный файл.
		fwrite (&p, sizeof ( complex ), 1, f );
	}
	fclose ( f );
	return 0;
}
Геометрическая модель комплексного числа a + b · i

Рис. 9.1. Геометрическая модель комплексного числа a + b · i
Геометрическая интерпретация комплексно-сопряжённого числа

Рис. 9.2. Геометрическая интерпретация комплексно-сопряжённого числа

Следующая программа считывает информацию из файла complex.dat — количество комплексных чисел в переменную n, а сами комплексные числа в массив p. Затем происходит поиск комплексного числа с максимальным модулем в массиве p.

#include <iostream>
#include <math.h>
using namespace std;
int main ( )
{
	struct complex
	{
		double Re;
		double Im;
	};
	complex *p;
	int i, n, nmax;
	double max;
	FILE *f;
	f=fopen ( " complex.dat ", " rb " );
	fread (&n, sizeof ( int ), 1, f );
	p=new complex [ n ];
	fread ( p, sizeof ( complex ), n, f );
	//Поиск комплексного числа с максимальным модулем
	max=sqrt ( p[0].Re*p[0].Re+p[0].Im*p[0].Im );
	for ( i =1,nmax=0; i<n; i++)
		if ( sqrt ( p[i].Re*p[i].Re+p[i].Im*p[i].Im )>max)
		{
			max=sqrt ( p[i].Re*p[i].Re+p [i].Im*p[i].Im );
			nmax= i;
		}
	cout<<" max = "<<max<<" \t nmax = "<<nmax<<endl;
	fclose ( f );
	return 0;
}
< Лекция 8 || Лекция 9: 12345 || Лекция 10 >
Сергей Радыгин
Сергей Радыгин

Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке?

Тип приложения - не Qt,

Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.

 

Юрий Герко
Юрий Герко

Кому удалось собрать пример из раздела 13.2 Компоновка (Layouts)? Если создавать проект по изложенному алгоритму, автоматически не создается  файл mainwindow.cpp. Если создавать этот файл вручную и добавлять в проект, сборка не получается - компилятор сообщает об отсутствии класса MainWindow. Как правильно выполнить пример?