Добавил:
Valeriya
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №3 Вариант 2.5 (листинг) / functions
.cpp#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 (листинг)