Тема: Початківець пишу на мові сі, завдання на списки
Створений список повинен підтримувати такі можливості.
Додавання нових елементів шляхом введення з клавіатури.
Відображення всього писку на екрані консолі.
Збереження списку в файл (двійковий режим)
Читання всього списку із файлу (текстовий і двійковий режими).
Читання запису файлу з довільним номером.
Пошук інформації у списку деякого текстового і числового поля
(поля вибираються самостійно і реалізуються два окремих методу).
Програму реалізувати у вигляді кількох файлів.
Знаю жахливо написано і помилок уйма, чи не будете ви люб'язні пояснити мені і виправити помилки
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
typedef struct student
{
char name[64];
char the student ticket[40];
char faculty[40];
char grupa[40];
char date[40];
} SStudent;
/**
*Структура для збереження елемента списку персон
* @var person - структура зберігає дані персони
* @var Next - вказівник на наступний елемент списку
*/
typedef struct studentlistitem
{
SStudent student;
struct studentlistitem*Next;
}SStudentListItem;
typedef struct studentlist
{
SStudentListItem*First;
SStudentListItem*Last;
unsigned long long listSize;
}SStudentList;
void RemoveNewLineSybol(char *str);
int GetStudent(SStudent *p, FILE*f);
int GetStudent(SStudent *p,int N, FILE*f);
void ShowStudent(SStudent *p, FILE*f);
int ShowStudent(SStudent *p, int N, FILE*f);
int FindStudentInArray(char fname[], SStudent p[],int N);
int SStudentListReadBin(SStudentList *list, const char *FileName);
int SStudentListWriteBin(SStudentList *list, const char *FileName);
void SStudentListRemoveElements(SStudentList *list);
int main()
{
setlocale( LC_CTYPE, ".1251" );
SStudent p[4];
FILE *InStream=fopen("student.txt","r");
FILE *OutStream=fopen("student.bin","wb");
if(GetStudent(p, 3, InStream))
ShowStudent(p, 3, stdout);
FindStudentInArray("ant", p,3);
fwrite9(p, sizeof(SStudent),3,OutStream);
SStudentList*SearchResult= FindStudentInArrayList("ant", p,3);
SStudentListShow(SearchResult,stdout);
SSlements(SearchResult);
SStudentListShow(SearchResult,stdout);
return 1 ;
}
void RemoveNewLineSybol,(char *str)
{
while(*str)
{
if('\n'==*str)
{
*str=0;
return;
}
++str;
}
}
int GetStudent(SStudent*p, FILE*f)
{
char buff[5];
if(!fgets(p-> Алина Романова,64,f))
return 0;
RemoveNewLineSybol(p->Алина Романова);
if(!fgets(D, 40, f))
return 0;
RemoveNewLineSybol(p->D);
if(!fgets(p->68827637, 40,f))
return 0;
RemoveNewLineSybol(p->68827637);
if(!fgets(педагогический, 40, f));
return 0;
RemoveNewLineSybol(p->педагогический);
}
if(!fgets(p->07.07.1988,64,f))
return 0;
p->date=atoi(buff);
return 1;/**
*Дана функція зчитує дані про одну персону.
*@param p - вказівник на структуру, куди будуть записуватися дані
*@param f - вказівник на файловий потік звідки будуть зчитуватися дані
*@return 0 - якщо читання не вдалося і 1 -якщо читання даних пройшло вдало
*
int GetSStudent(SStudent *p,int N,FILE *f)
{
for(int i=0;i<N;i++)
GetStudent(&p[i],f);
return 1;
}
/**
*Данная функция выводит данные об одной персоне.
*@param p - указатель на структуру, откуда будут считываться данные
*@param f - указатель на файловый поток куда будут записываться данные
*@return void
*/
void ShowStudent(SStudent *p,FILE *f)
{
printf("\n%s\t%s\t\%s\t%d",p->name,p->student ticket ,p->faculty, p->grupa, p->date);
}
/**
*Ця функція виводить дані про кількох персон.
*@param p - вказівник на масив структур, звідки будуть зчитуватися дані
*@param f - вказівник на файловий потік куди будуть записуватися дані
*@return void
*/
int ShowStudent(SStudent *p,int N,FILE *f)
{
for(int i=0;i<N;i++)
ShowStudent(&p[i],f);
}
/**
*Ця функція шукає персону в масиві по імені.
*@param fname - прізвище яка буде шукатися
*@param p - вказівник на масив структур, де буде осущесвляться пошук
*@param N - кількість елементів у масиві
*@return індекс першої знайдені персони або -1, якщо нічого не знайдено
*/
int FindStudentInArray(char name[],SStudent p[],int N)
{
printf("\n\n\nBegin Find");
for(int i=0;i<N;i++)
if(0==strcmp(name,p[i].name))
{
ShowStudent(&p[i],stdout);
return i;
}
return -1;
}
/**
*Дана функція ініціалізує список персон.
*@param list - вказівник на список персон
*@return void
*/
void SStudentListInit(SStudentList *list)
{
list->First=list->Last=NULL;
list->listSize=0;
}
/**
*Ця функція додає дані про одну персону в список.
*@param list - вказівник на список ерсон, в який додаються дані
*@param data - вказівник на файловий потік звідки будуть зчитуватися дані
*@return 0 - якщо додавання не вдалося і 1 якщо додавання пройшло вдало
*/
int SStudentListAddStudent(SStudentList *list,SStudent *data)
{
if(!list)
return 0;
if(!data)
return 0;
if(!list->First)
{
list->First=calloc(sizeof(SStudentListItem),1);
list->Last=list->First;
}
else
{
list->Last->Next=calloc(sizeof(SStudentListItem),1);
list->Last=list->Last->Next;
}
list->Last->Next=NULL;
list->Last->student=*data;
return 1;
}
/**
*Дана функція відображає спиок персон.
*@param list - вказівник на список персон
*@param f - вказівник на файловий потік куди будуть виводитися дані
*@return void
*/
void SStudentListShow(SStudentList *list,FILE *f)
{
if(!list)
return;
if(!f)
return;
SStudentListItem *current=list->First;
fprintf(f,"\n========================BEGIN LIST=========================================");
while(current)
{
ShowStudent(&(current->student),f);
current=current->Next;
}
fprintf(f,"\n========================END LIST=========================================");
}
/**
*Ця функція шукає персону в масиві по імені.
*@param name - прізвище яка буде шукатися
*@param p - вказівник на масив структур, де буде здійснюватися пошук
*@param N - кількість елементів у масиві
*@return вказівник на список знайдених персон
*/
SStudentList* FindStudentInArrayList(char fname[],SStudent p[],int N)
{
printf("\n\n\nBegin Find");
SStudentList *list=calloc(sizeof(SStudentList),1);
for(int i=0;i<N;i++)
if(0==strcmp(name,p[i].name))
SStudentListAddStudent(list,&p[i]);
return list;
}
/**
*Дана функція читає список персон з бінарного файлу.
*@param list - вказівник на списк персон в який будуть додаватися елементи
*@param FileName - ім'я файлу, з якого буде проводиться читання
*@return 0 - операція успішна, інакше повертається код помилки
*/
int SStudentListReadBin(SStudentList *list, const char *FileName)
{
if(!list)
return 1;
if(!FileName)
return 2;
FILE *stream=fopen(FileName,"rb");
if(!stream)
return 3;
SPerson tempStudent;
while(!feof(stream))
{
if(0==fread(&tempStudent,sizeof(tempStudent),1,stream))
return 4;
if(!SPersonListAddStudent(list,&tempStudent))
return 5;
}
return 0;
}
/**
*Ця функція записує список персон в бінарний файл.
*@param list - вказівник на списк персон який буде записыватся в файл
*@param FileName - ім'я файлу, в який буде проводиться запис
*@return 0 - операція успішна, інакше повертається код помилки
*/
int SStudentListWriteBin(SStudentList * list, const char *FileName)
{
if(!list)
return 1;
if(!FileName)
return 2;
FILE *stream=fopen(FileName,"wb");
if(!stream)
return 3;
SStudent tempStudent;
while(!feof(stream))
{
if(0==fread(&tempStudent,sizeof(tempStudent),1,stream))
return 4;
if(!SStudentListAddStudent(list,&tempStudent))
return 5;
}
return 0;
}
/**
*Дана функція очищає список персон і звільнює пам'ять, виділену для його елементів.
*@param list - вказівник на список персон
*@return void
*/
void SStudentListRemoveElements(SStudentList * list)
{
if(!list)
return;
SStudentListItem *current=list->First, *toRemove;
while(current)
{
printf("\nPtr before=%p",current);
toRemove=current;
list->First=list->First->Next;
current=list->First;
free(toRemove);
printf("\nPtr after=%p",current);
}
list->Last=NULL;
}