Запись и удаление файлов с гибкого магнитного диска - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. У меня в проге 3 проблеммы.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
 
typedef struct Knot {
    char naz[40];
    char priz[10];    
    int dec;
    struct Knot *prev;
    struct Knot *next;
    } Katalog;
 
Katalog * dobavposled(Katalog *end);   //dobavit strukturu poslednei
void show(Katalog *first); //vyvod na ekran
Katalog * udaliperv(Katalog *first,int *d);   //osvobozhdaet pamyat' pervoi struktury
Katalog * udaliposled(Katalog *end,int *d);   //osvobozhdaet pamyat' posledney struktury
int udalipkey(Katalog *pkey,int *d);//osvobozhdaet pamyat' po abresu na strukturu 
int vernyipkey(Katalog *first,Katalog *pkey);//proveryaet pravilnost' vvoda pkey
Katalog * findpkeydec(Katalog *first,const char dc[40]); //nahodit znachenie v spiske
float Sum(Katalog *first);
void ZANSVOB(Katalog *first);
Katalog *Triproverki(Katalog *first);
Katalog *empties(Katalog *first);
 
main()
{   printf("razmer faila ot 18 do 32768 bytes\n\n"); 
    Katalog *end, *first, *pkey;
    float su,ost;
    int k,f,Z=5,r=0,i,a;
    char m[40];
    srand(time(NULL));
    first=(Katalog *)malloc(sizeof(Katalog));
    
    while (r==0)
 {printf("Vvedite razmer 1 faila\n");
    scanf("%i",&a);
    if ((a<18)||(a>32768)) 
    printf("Ne pravilno vveden razmer\n");
    else
  {printf("Vvedite nazvanie 1 faila\n");
    scanf("%s",first->naz);
    first->dec=a;
    first->prev=NULL;
    first->next=NULL;
    end=first;
    r=1;
           
    for(i=1;i<Z;i++)
        {
        printf("vvedi nazvanie %i faila\n",i+1);
        printf("vvedi razmer %i faila\n",i+1);
        end=dobavposled(end);
        }

    while (k!=5)
    {   
        su=Sum(first);   
        if (su>368640)
       {printf("FATAL ERROR!DISK PEREPOLNEN.");
       system("PAUSE");
       break;
       }
        ZANSVOB(first);
        show(first);
        ost=368640-su;
        printf("Ostalos mesta za poslednim failom %f \n\n",ost);
        printf("\n1)dobavit fail\n2)udalit pervyi\n3)udalit posledniy\n"
        "4)udalit fail\n5)Vyhod\n"
        "\nvvedite nomer komandy: ");
        scanf("%d",&k);
        switch (k)
        {
            case 1:printf("vvedite razmer faila\n");
                   printf("vvedite nazvanie faila\n");
                   first=Triproverki(first);
                   break;
            case 2: first=udaliperv(first,&i);
                    break;
            case 3: end=udaliposled(end,&i);
                    break;
            case 4: printf("\nVvedite nazvanie faila: ");
                    scanf("%s",&m);
                    pkey=findpkeydec(first,m);
                    if (vernyipkey(first,pkey))
                    {
                        f=udalipkey(pkey,&i);
                        if (f == 1)
                            first=udaliperv(first,&i);
                        else if (f == 2)
                            end=udaliposled(end,&i);
                    }
                    else
                        printf("\nTakogo faila v spiske net\n");
                    break;
            case 5:break;
            case 6:su=Sum(first);
                   printf("%f",su);
        }
    }
    
  }
 }
}

Katalog * dobavposled(Katalog  *end)
{
    Katalog * newend;
    newend=(Katalog *)malloc(sizeof(Katalog));
    scanf("%s",&newend->naz);
    scanf("%i",&newend->dec);    
    newend->prev=end;
    newend->next=NULL;
    end->next=newend;
    return newend;
}
void show(Katalog *first)
{
    Katalog *t;
    int i=1;
    t=first;
     printf("\nNUM\tNAZVANE\t     RAZMER\t       PRIZNAK \n");
    while (t != NULL) {
        printf("%d)\t%s\t       %i\t       %s\t\n",
        i,t->naz,t->dec,t->priz);
        t=t->next;
        i++;
    }
    return;
}
Katalog * udaliperv(Katalog *first,int *d)
{
    Katalog *newfirst;
    char *FREE="empty";
    strcpy(first->naz,FREE);
    return(first);
}
Katalog * udaliposled(Katalog *end,int *d)
{
    Katalog * newend;
    *d=end->dec;
    newend=end->prev;
    newend->next=NULL;
    free(end);
    return newend;
}
int udalipkey(Katalog *pkey,int *d)
{char *FREE="empty";
    if ((pkey->prev) == NULL)
        return 1;
    else if ((pkey->next) == NULL)
        return 2;
    else
    {  strcpy(pkey->naz,FREE);
       return 0;
    }
}
int vernyipkey(Katalog *first,Katalog *pkey)
{
    Katalog *t;
    t=first;
    while (t != NULL)
    {
        if (t == pkey)
            return 1;
        else t=t->next;
    }
    return 0;
}
Katalog * findpkeydec(Katalog *first,const char dc[40])
{
    Katalog * t;
    t=first;
    while(t !=NULL)
    {
        if (strcmp(t->naz,dc)==0)
            return t;
        else
            t=t->next;
    }
    return NULL;
}
float Sum(Katalog *first)
{ Katalog *p;
  float s;
  p=first;
  while (p!=NULL)
  {s+=p->dec;
  p=p->next;
  }
  return(s);
  s=0;
  }  
void ZANSVOB(Katalog *first)
{ Katalog *u;
char *FREE="empty",*Sv="SVOBODEN",*Zan="Zanyat";
u=first;
while(u!=NULL)
 {if (strcmp(u->naz,FREE)==0)
  strcpy(u->priz,Sv);
 else
  strcpy(u->priz,Zan);
u=u->next;
 }
}    
 
Katalog *Triproverki(Katalog *first)
{ Katalog *p,*newfail;
  char *FREE="SVOBODEN";
  newfail=(Katalog *)malloc(sizeof(Katalog));
  scanf("%i",&newfail->dec);
  scanf("%s",&newfail->naz);
  p=first;
  while (p!=NULL)
 {if ((strcmp(p->priz,FREE)==0)&&(p->prev==NULL)&&(p->dec>newfail->dec))
    {p->dec=p->dec-newfail->dec;
     newfail->next=p;
     newfail->prev=NULL;
     p->prev=newfail;
   return newfail;}
  else if ((strcmp(p->priz,FREE)==0)&&(p->prev!=NULL)&&(p->dec>newfail->dec))
  {p->prev->next=newfail;
  newfail->prev=p->prev;
  newfail->next=p;
  p->prev=newfail;
  p->dec=p->dec-newfail->dec;
  return newfail;}
  else if (p->next==NULL) 
  {newfail->prev=p;
  newfail->next=NULL;
  p->next=newfail;
  return newfail;}
  p=p->next;
 }    
}
 
/*Katalog *empties(Katalog *first)
{ Katalog *p;
  char *FREE="SVOBODEN";
  p=first;
  while (p!=NULL) 
 {if ((strcmp(p->priz,FREE)==0)&&(strcmp(p->next->priz,FREE)==0))
  {
  p->next=p->next->next;
   p->dec=p->dec+p->next->dec; 
   free(p->next);
  } 
   p=p->next;
  }
return(p);
}*/
1)Некорректно работает функция суммирования Sum(иногда при проверке выдает Fatal error!,хотя сумма явно меньше 368640) 2)Неправильно работает функция Triproverki(при добавлении в конец и середину стирает предыдущие файлы) 3)Неработает функция empties, которая должна суммировать освободившиеся соседние участки диска компилирую на dev-cpp. В этой проге всего лишь модель заполнения/очищения диска. Заранее спасибо, извините если слишком кривой код.

Решение задачи: «Запись и удаление файлов с гибкого магнитного диска»

textual
Листинг программы
scanf("%s",&newfail->naz);

Объяснение кода листинга программы

В данном коде, скорее всего, происходит следующее:

  1. Вводится строка с названием файла с помощью функции scanf().
  2. Полученная строка сохраняется в переменной newfail->naz. newfail - это структура данных, в которой хранится информация о файле. naz - это поле структуры, в которое записывается название файла.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5