Задать вопрос
@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;
}
  • Вопрос задан
  • 46 просмотров
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Python-разработчик
    10 месяцев
    Далее
  • Skillfactory
    DevOps-инженер
    6 месяцев
    Далее
  • Нетология
    Python-разработчик с нуля
    6 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
@pestunov
1. Указатели позволяют осуществлять динамическое распределение памяти, что дает возможность задавать размер массива в процессе работы программы. Классический массив в качестве размера принимает только константу, требующую инициализации в коде, т.е. перед запуском программы.

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

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

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

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

Похожие вопросы
ITK academy Воронеж
от 50 000 до 90 000 ₽
ITK academy Нижний Новгород
от 80 000 до 120 000 ₽