Запись и удаление файлов с гибкого магнитного диска - C (СИ)
Формулировка задачи:
Здравствуйте. У меня в проге 3 проблеммы.
1)Некорректно работает функция суммирования Sum(иногда при проверке выдает Fatal error!,хотя сумма явно меньше 368640)
2)Неправильно работает функция Triproverki(при добавлении в конец и середину стирает предыдущие файлы)
3)Неработает функция empties, которая должна суммировать освободившиеся соседние участки диска
компилирую на dev-cpp. В этой проге всего лишь модель заполнения/очищения диска.
Заранее спасибо, извините если слишком кривой код.
#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); }*/
Решение задачи: «Запись и удаление файлов с гибкого магнитного диска»
textual
Листинг программы
scanf("%s",&newfail->naz);
Объяснение кода листинга программы
В данном коде, скорее всего, происходит следующее:
- Вводится строка с названием файла с помощью функции scanf().
- Полученная строка сохраняется в переменной
newfail->naz
.newfail
- это структура данных, в которой хранится информация о файле.naz
- это поле структуры, в которое записывается название файла.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д