1 Востаннє редагувалося ivannamukolaivna3 (09.05.2017 21:15:37)

Тема: Початківець пишу на мові сі, завдання на списки

Створений список повинен підтримувати такі можливості.
Додавання нових елементів шляхом введення з клавіатури.
Відображення всього писку на екрані консолі.
Збереження списку в файл (двійковий режим)
Читання всього списку із файлу (текстовий і двійковий режими).
Читання запису файлу з довільним номером.
Пошук інформації у списку деякого текстового і числового поля
(поля вибираються самостійно і реалізуються два окремих методу).
Програму реалізувати у вигляді кількох файлів.
Знаю жахливо написано і помилок уйма, чи не будете ви люб'язні пояснити мені і виправити помилки

#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;
}

2 Востаннє редагувалося LoganRoss (09.05.2017 21:02:31)

Re: Початківець пишу на мові сі, завдання на списки

ivannamukolaivna3 написав:

До захисту роботи підготувати звіт і архів з файлами коду.

Ви пропонуєте ще звіт до лаб вам робити?

ivannamukolaivna3 написав:

Знаю жахливо написано і помилок уйма, чи не будете ви люб'язні пояснити мені і виправити помилки

Було б добре, якби ви вказали ці помилки.

Прихований текст

Чомусь мені здається що ви цей код десь здерли і хочете, щоб хтось його переробив.

P.S. Хм, цікаво, чому тут помилка?

char the student ticket[40];

В цілому код правильний, але так як ви його навіть не дивилися, то, звісно, не могли помітити що десь завалялася кома або збилося форматування коду, а деякі функції взагалі не реалізовані.

3

Re: Початківець пишу на мові сі, завдання на списки

це просто жах читати код і російською коментарі

Подякували: koala1

4

Re: Початківець пишу на мові сі, завдання на списки

ну одна з помилок: конфліктні типи 'GetStudent, як її виправити?

5

Re: Початківець пишу на мові сі, завдання на списки

ivannamukolaivna3 написав:

ну одна з помилок: конфліктні типи 'GetStudent, як її виправити?

Тут ви викликали функцію

GetStudent(p, 3, InStream)

Перегружені дві функції:

int GetStudent(SStudent *p, FILE*f);
int GetStudent(SStudent *p,int N, FILE*f);

Очевидно, що викликатися має друга, визначення якої у вас закоментовано.

Подякували: ivannamukolaivna31

6

Re: Початківець пишу на мові сі, завдання на списки

SStudentList*SearchResult= FindStudentInArrayList("ant", p,3);

   і ще одна помилка: 'FindStudentInArrayList' не був оголошений в цій області, теж не розумію як її виправити