@Muriam

Какова роль указателей в сложных структурах данных?

Почему часто удобно обращаться к данным через указатель? Что в этом коде обозначает p ?

#include <iostream>
#include <conio.h>
#include <cstring> //для ф-ции strcmp
#define N 8


using namespace std;

/*структура базы данных*/
struct dataBase
{
	char name[33];
	unsigned short int sumContribution;
	char date[9];
	char advocate[23];
};


/*прототипы*/
bool ReadBase(struct dataBase *p, int* indArr, int* indArr2);
int output(dataBase *db, int* indArr);
int bubbleSortName(dataBase *db, int* indArr);
int bubbleSortSum(dataBase *db, int* indArr);


/* чтение базы из файла */
bool ReadBase(dataBase *p, int* indArr, int* indArr2) //указатель на переменную с типом структуры, указатель на индексные массивы
{
	FILE *base = fopen("base3.dat", "rb");
	if (base == NULL) { cout << "ошибка!" << endl; return 1; }
	for (int i = 0, advSize = 22, nameSize = 32, dateSize = 8; i<N; i++)
	{
		fread(p[i].name, sizeof(char), nameSize, base);  //(где 1 - количество ячеек пам¤ти, 32 - количество символов в ячейках)
		fread(&(p[i].sumContribution), sizeof(unsigned short int), 1, base);
		fread(p[i].date, sizeof(char), dateSize, base);
		fread(p[i].advocate, sizeof(char), advSize, base);
		p[i].name[nameSize] = 0;
		p[i].advocate[advSize] = 0;
		p[i].date[dateSize] = 0;
		indArr[i] = i; //создание индексного массива
		indArr2[i] = i; //создание индексного массива2
	}
	fclose(base);
	return 0;
}

/* вывод на экран */ 
int output(dataBase *db, int* indArr)
{

	for (int i = 0; i<N; i++)
	{
		int pos = indArr[i];
		cout << db[pos].name << "\t" << db[pos].sumContribution << "\t" << db[pos].date << "\t" << db[pos].advocate << endl;

	}

	cout << "_______________________________________________________________________________" << "\n" << endl;

	return 0;
}


/* сортировка методом пузырька по фамилии вкладчика (name) */
int bubbleSortName(dataBase *db, int* indArr)
{
	int temp;
	for (int i = 0; i<N - 1; i++)
	{
		for (int j = 0; j<N - 1 - i; j++)
			if (strcmp(db[indArr[j]].name, db[indArr[j + 1]].name)>0) //сравниваем элементы массива, через индексный массив
			{
				// меняем элементы местами. Элементы массива db фактически не перемещаются, но мы меняем их порядок в индексном массиве.
				temp = indArr[j];
				indArr[j] = indArr[j + 1];
				indArr[j + 1] = temp;
			}

	}

	return 0;
}


/* сортировка методом пузырька по сумме вклада (sumContribution) */
int bubbleSortSum(dataBase *db, int* indArr)
{
	int temp2;
	for (int i = 0; i<N-1; i++)
	{
		for (int j = 0; j<N-1; j++)
			if (db[indArr[j]].sumContribution > db[indArr[j + 1]].sumContribution) //сравниваем элементы массива, через индексный массив 
		 
			{
				// меняем элементы местами. Элементы массива db фактически не перемещаются, но мы меняем их порядок в индексном массиве
				temp2 = indArr[j];
				indArr[j] = indArr[j + 1];
				indArr[j + 1] = temp2;
			}

	}
	
	return 0;	
}


int main()
{		
	dataBase* db = new dataBase[N]; //создание динамического массива db
	int* indArr = new int[N]; //индексный массив динамический indArr
	int* indArr2 = new int[N]; //индексный массив динамический indArr2

	/* вызов функции чтения из файла */
	ReadBase(db, indArr, indArr2); 
	/* вывод на экран */
	output(db, indArr);  

	
	/* вызов функции сортировки пузырьком по имени */
	bubbleSortName(db, indArr); 	
	/* вывод на экран */
	output(db, indArr);  

	
	/* вызов функции сортировки пузырьком по сумме вклада */
	bubbleSortSum(db, indArr2); 
	/* вывод на экран */
	output(db, indArr2);
	


	delete [] db;
	getch();
	return 0;
}
  • Вопрос задан
  • 44 просмотра
Пригласить эксперта
Ответы на вопрос 1
@pestunov
1. Указатели позволяют осуществлять динамическое распределение памяти, что дает возможность задавать размер массива в процессе работы программы. Классический массив в качестве размера принимает только константу, требующую инициализации в коде, т.е. перед запуском программы.

2. Указатели позволяют передавать массивы в качестве аргументов в функции без необходимости их копирования. Вообще, имя массива - это указатель на его первый элемент.

Хотя в твоем коде можно было бы обойтись и без указателей. Особого эффекта они не дают. Размер массива у тебя постоянный.

Во многих более новых (по сравнению с Си) языках, таких как Java, C# и пр. работа с указателями вообще закрыта, но технологически почти все делается через них (см. "ссылочные типы").
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы