Скачиваний:
3
Добавлен:
20.06.2014
Размер:
6.65 Кб
Скачать
#include <stdio.h>
#include <stdlib.h>
#include "functions.h"

data* addFromKeyborad()
{
	data* temp = (data*) malloc(sizeof(data));
	printf("Введите фамилию: ");
	scanf("%s", temp->lastName);
	printf("Введите рейтинг: ");
	scanf("%i", &temp->rating);
	temp->next = NULL;
	temp->prev = NULL;
	return temp;
}

void postCheck(int* choose, int from, int to)
{
	while (((*choose) < from) || ((*choose) > to))
	{
		printf("Действие выбрано неверно, выберите действие заново: ");
		scanf("%i", choose);
	}
}

void callAdd2ListMenu(int* choose)
{
	printf("Куда вы хотите добавить данные?\n\r1.В начало списка\n\r2.В конец списка\n\r3.В определенное место списка\n\rВаш выбор: ");
	scanf("%i", choose);
	postCheck(choose, 1, 3);
	if ((*choose) == 1) return;
	else if ((*choose) == 2)
	{
		(*choose) = -1;
		return;
	}
	else
	{
		printf("Введите номер позиции для вставки элемента: ");
		scanf("%i", choose);
		while ((*choose) < 1)
		{
			printf("Позиция не может быть меньше еденицы, выберите позицию заново: ");
			scanf("%i", choose);
		}
		return;
	}
}

void add2List(info* Info, data* newElem, bool autoMode)
{
	int position = -1;
	if (!autoMode) callAdd2ListMenu(&position);
	if ((Info->first == NULL) && (Info->last == NULL)) // если нет ни начала, ни конца :)
	{
		Info->first = newElem;
		Info->last = newElem;
		newElem->next = NULL;
		newElem->prev = NULL;
		return;
	}
	if (position == 1) // если добавление в начало списка
	{
		newElem->next = Info->first;
		Info->first->prev = newElem;
		Info->first = newElem;
		newElem->prev = NULL;
		return;
	}
	else if (position == -1) // если добавление в конец списка
	{
		newElem->prev = Info->last;
		Info->last->next = newElem;
		Info->last = newElem;
		newElem->next = NULL;
		return;
	}
	else
	{
		data* temp = Info->first;
		for(int i = 0; i < position-1; i++)
		{
			if(temp->next == NULL)
			{
				printf("Ошибка. Такого элемента нет, данные не будут добавлены.\n\r\n\r");
				return;
			}
			temp = temp->next;
		}
		newElem->prev = temp->prev;
		newElem->next = temp;
		temp->prev->next = newElem;
		temp->prev = newElem;
		return;
	}
}

void addFromTXT(char* name, info* Info)
{
	FILE* fp = fopen(name, "r");
	if(fp == NULL) 
	{
		printf("Ошибка открытия исходного файла\n\r\n\r");
		return;
	}
	while(!feof(fp))
	{
		data* temp = (data*) malloc(sizeof(data));
		if(fscanf(fp, "%i:%s\n", &temp->rating, temp->lastName) == EOF)
		{
			printf("Файл пуст\n\r\n\r");
			fclose(fp);
			return;
		}
		add2List(Info, temp, true);
	}
	fclose(fp);
}

void add2TXT(char* name, info* Info)
{
	if ((Info->first == NULL) && (Info->last == NULL))
	{
		printf("Данных для добавления нет\n\r\n\r");
		return;
	}
	FILE* fp = fopen(name, "w");
	data* temp = Info->first;
	while(true)
	{
		fprintf(fp, "%i:%s\n", temp->rating, temp->lastName);
		if(temp->next == NULL)
		{
			printf("Данные в файл успешно добавлены\n\r\n\r");
			fclose(fp);
			return;
		}
		temp = temp->next;
	}
}

void addFromBin(char* name, info* Info)
{
	FILE* fp = fopen(name, "rb");
	if(fp == NULL) 
	{
		printf("Ошибка открытия исходного файла\n\r\n\r");
		return;
	}
	while(!feof(fp))
	{
		data* temp = (data*) malloc(sizeof(data));
		if(!(fread(temp, sizeof(data), 1, fp)))
		{
			printf("Данные в файл успешно добавлены\n\r\n\r");
			fclose(fp);
			return;
		}
		add2List(Info, temp, true);
	}
}

void add2Bin(char* name, info* Info)
{
	if ((Info->first == NULL) && (Info->last == NULL))
	{
		printf("Данных для добавления нет\n\r\n\r");
		return;
	}
	FILE* fp = fopen(name, "wb");
	data* temp = Info->first;
	while(true)
	{
		fwrite(temp, sizeof(data), 1, fp);
		if(temp->next == NULL)
		{
			printf("Данные в файл успешно добавлены\n\r\n\r");
			fclose(fp);
			return;
		}
		temp = temp->next;
	}
}

void cleanData(info* Info)
{
	if ((Info->first == NULL) && (Info->last == NULL))
	{
		printf("Данных для очистки нет\n\r\n\r");
		return;
	}
	else
	{
		data* temp = Info->first;
		while(true)
		{
			if(temp->prev) free(temp->prev);
			if(temp->next == NULL)
			{
				free(temp);
				Info->first = NULL;
				Info->last = NULL;
				printf("Данные успешно очищены\n\r\n\r");
				return;
			}
			temp = temp->next;
		}
	}
}

void callPrint2ScreenMenu(int* choose)
{
	{
	printf("Откуда вы хотите считать данные?\n\r1.С начала списка до конца\n\r2.С конца до начала\n\r3.С определенного элемента списка\n\rВаш выбор: ");
	scanf("%i", choose);
	postCheck(choose, 1, 3);
	if ((*choose) == 1) return;
	else if ((*choose) == 2)
	{
		(*choose) = -1;
		return;
	}
	else
	{
		printf("Введите номер элемента, с которого начинать чтение: ");
		scanf("%i", choose);
		while ((*choose) < 1)
		{
			printf("Позиция не может быть меньше еденицы, выберите позицию заново: ");
			scanf("%i", choose);
		}
		return;
	}
}
}

void printList2Screen(info* Info)
{
	int position;
	if ((Info->first == NULL) && (Info->last == NULL))
	{
		printf("Данных для вывода нет\n\r\n\r");
		return;
	}
	callPrint2ScreenMenu(&position);
	printf("Фамилия\t\tРейтинг\n\r");
	if (position == 1)
	{
		data* temp = Info->first;
		while (true)
		{
			printf("%s\t%i\n\r", temp->lastName, temp->rating);
			if(temp->next == NULL) return;
			temp = temp->next;
		}
	}
	else if (position == -1)
	{
		data* temp = Info->last;
		while (true)
		{
			printf("%s\t%i\n\r", temp->lastName, temp->rating);
			if(temp->prev == NULL) return;
			temp = temp->prev;
		}
	}
	else
	{
		data* temp = Info->first;
		for(int i = 0; i < position - 1; i++)
		{
			if(temp->next == NULL)
			{
				printf("Элемента с таким номером не существует\n\r\n\r");
				return;
			}
			temp = temp->next;
		}
		while(true)
		{
			printf("%s\t%i\n\r", temp->lastName, temp->rating);
			if(temp->next == NULL) return;
			temp = temp->next;
		}
	}
}

int callMenu()
{
	int mode = -1;
	printf("---------------------------\n\r1.Ввод данных\n\r2.Очистить даные\n\r3.Вывод данных\n\r4.Выход\n\rНомер действия: ");
	scanf("%i", &mode);
	postCheck(&mode, 1, 4);
	if (mode == 1)
	{
		printf("Как вы хотите ввести данные?\n\r1.Из текстового файла\n\r2.Из двоичного файла\n\r3.С клавиатуры\n\rНомер действия: ");
		scanf("%i", &mode);
		postCheck(&mode, 1, 3);
		return mode + 4;
	}
	else if (mode == 3)
	{
		printf("Как вы хотите вывести данные?\n\r1.В текстовый файл\n\r2.В двоичный файл\n\r3.На экран\n\rНомер действия: ");
		scanf("%i", &mode);
		postCheck(&mode, 1, 3);
		return mode + 7;
	}
	return mode;
}
Соседние файлы в папке Лабораторная работа №3 Вариант 2.5 (листинг)