Untitled

mail@pastecode.io avatar
unknown
c_cpp
7 months ago
5.8 kB
3
Indexable
Never
#include <iostream>
#include <string>


// ВОТ СЮДА СВОЮ СТРУКТУРУ ВПИШИ. НЕКОТОРЫЕ МЕТОДЫ МОГУТ ОТЛИЧАТЬСЯ.
struct blog {
	char* FIO;
	int fio_length;
	unsigned int posts_count;
	unsigned int raiting_place;
};

blog* createBlogsArray(int blogs_count) {
	return new blog[blogs_count];
}

void copyBlogs(blog* from, blog* to, int blogs_cnt) {
	for (int i = 0; i < blogs_cnt; i++) {
		to[i] = from[i];
	}
}

void deleteBlogsArray(blog* blogs_array) {
	delete[] blogs_array;
}

char* resizeFIO(char *fio, int current_len) {
	char* new_fio = new char[current_len + 1];
	for (int i = 0; i < current_len; i++) {
		new_fio[i] = fio[i];
	}
	delete[] fio;
	return new_fio;
}


blog findByFIO(blog* blogs, int blogs_count, std::string finding) {
	for (int i = 0; i < blogs_count; i++) {
		blog b = blogs[i];
		bool is_correct = 1;
		for (int j = 0; j < b.fio_length; j++) {
			if (b.FIO[j] != finding[j]) {
				is_correct = 0;
				break;
			}
		}
		if (is_correct) return b;
	}
	return { NULL, -1, 0, 0 };
}

blog findByNumeric(blog* blogs, int blogs_count, int field_id, int finding) {
	for (int i = 0; i < blogs_count; i++) {
		blog b = blogs[i];
		int field = 0;
		switch (field_id) {
		case 1:
			field = b.posts_count;
			break;
		case 2:
			field = b.raiting_place;
			break;
		default:
			field = b.posts_count;
			break;
		}
		if (field == finding) {
			return b;
		}
	}
	return { NULL, -1, 0, 0 };
}

void fillBlog(blog &new_blog, bool is_edit = 0) {
	if (is_edit) {
		delete[] new_blog.FIO;
	}
	std::string sfio;
	char* fio;
	int strlen = 0;
	unsigned int posts_count = 0;
	unsigned int raiting_place = 0;

	printf("Введите название блога: ");
	std::cin >> sfio;
	strlen = sfio.length();
	fio = new char[strlen];
	
	for (int i = 0; i < strlen; i++) {
		fio[i] = sfio[i];
	}

	printf("Введите количество постов в блоге: ");
	std::cin >> posts_count;
	
	printf("Введите место блога в рейтинге: ");
	std::cin >> raiting_place;
	
	new_blog = { fio, strlen, posts_count, raiting_place };
}

blog* addBlog(blog* blogs, blog newBlog, int n) {
	blog* new_blogs_array = createBlogsArray(n + 1);
	copyBlogs(blogs, new_blogs_array, n);
	new_blogs_array[n] = newBlog;
	deleteBlogsArray(blogs);
	return new_blogs_array;
}

void showBlog(blog showing_blog) {
	printf("{");
	for (int i = 0; i < showing_blog.fio_length; i++) {
		printf("%c", showing_blog.FIO[i]);
	}
	printf("; %d; %d}\n", showing_blog.posts_count, showing_blog.raiting_place);
}

void setBlogValuesById(blog** blogs, int id) {
	blog editableBlog = *blogs[id];
	fillBlog(editableBlog, 1);
	*blogs[id] = editableBlog;
}

void showControls() {
	printf("\n\n1. Добавить блог.\n2. Заменить значения массива по идентификатору.\n3. Поиск по номеру поля.\n4.Обмен значениями между элементами массива.\n5.Сортировка по количеству записей по убыванию.\n6.Вывод одного элемента массива.\n7.Не пытайся покинуть ОМСК!\n");
}

void readWriteField(blog* blogs, int blogs_count) {
	int index = 0;
	int operation = 0;
	printf("Введите индекс элемента: ");
	std::cin >> index;

	if (index > blogs_count) {
		printf("Индекс больше возможного. Всего %d элементов\n", blogs_count);
		return;
	}

	printf("Введите номер операции, 1 – установка, 2 – получение: ");
	std::cin >> operation;

	switch (operation) {
	case 1:
		setBlogValuesById(&blogs, index);
		break;
	case 2:
		showBlog(blogs[index]);
		break;
	}

}

void searchByField(blog* blogs, int blogs_count) {
	int field_number = 0;
	blog founded = {};
	printf("Введите номер поля, по которому будет выполняться поиск: ");
	std::cin >> field_number;
	printf("Введите значение поля, которое нужно найти: ");
	if (field_number == 0) {
		std::string search_str;
		std::cin >> search_str;
		founded = findByFIO(blogs, blogs_count, search_str);
	}
	else {
		int field_value = 0;
		std::cin >> field_value;
		founded = findByNumeric(blogs, blogs_count, field_number, field_value);
	}
	if (founded.fio_length == -1) {
		printf("\nВНИМАНИЕ: Блог с таким значением не существует!\n");
	}
	else {
		printf("Найден блог с такими значениями: ");
		showBlog(founded);
	}
}

int main() {
	bool is_working = 1;
	int blogs_count = 0;
	char command = '\0';
	setlocale(LC_ALL, "ru-ru");
	blog* blogs = NULL;
	while (is_working) {
		showControls();
		printf("Выберите команду:");
		std::cin >> command;
		blog new_blog = {};
		switch (command)
		{
		case '1':
			fillBlog(new_blog);
			if(findByNumeric(blogs, blogs_count, 2, new_blog.raiting_place).FIO != NULL){
				// Если место в рейтинге занято
				printf("\n\nНе удалось добавить блог. Место в рейтинге занято.\n\n");
			}
			else {
				//Если место в рейтинге не занято
				blogs = addBlog(blogs, new_blog, blogs_count);
				blogs_count++;
				printf("\nУспешно добавлен блог со значениями полей:\n");
				showBlog(new_blog);
			}
			break;
		case '2':
			if (blogs_count == 0) {
				printf("У вас нет элементов. Добавьте их, используя команду 1.\n");
			}
			else {
				readWriteField(blogs, blogs_count);
			}
			break;
		case '3':
			searchByField(blogs, blogs_count);
			break;
		case '7':
			is_working = 0;
			break;
		default:
			break;
		}
	}
}
Leave a Comment