Задание : в файловой системе каталог файлов организован как линейный список.
Для каждого файла в каталоге содержатся следующие сведения :
1) имя файла;
2) дата создания;
3) количество обращений к файлу.
Составить программу , которая обеспечивает:
1) начальное формирование каталога файлов;
2) вывод каталога файлов;
3) удаление файлов, дата создания которых меньше заданной;
4) выборку файла с наибольшим количеством обращений.
Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.
Код программы:
Код:
#include <stdafx.h>
#include <iostream> //подключение текстового файла для работы со стандартными объектами и операциями с потоками ввода/вывода
using namespace std; //выбор пространства имен std
struct data// структура, описывающая дату
{
int day;// день
int mon;// месяц
int year;// год
};
struct file// структура, описывающая файл
{
char name[20];// имя
data date;// дата
int kol;// количество обращений
void in()// функция ввода даты
{
cin>>date.day;// ввод дня
cin>>date.mon;// ввод месяца
cin>>date.year;// ввод года
}
void out()// функция вывода даты
{
cout<<date.day<<" ";// вывод дня
cout<<date.mon<<" ";// вывод месяца
cout<<date.year<<" ";// вывод года
}
};
file *a;// массив файлов
int n;// кол-во файлов
int operator <(file a,file b)// оператор "меньше" для дат
{
if((a.date.year<b.date.year)
|| ((a.date.year==b.date.year)&&(a.date.mon<b.date.mon)) // где || - логическое "или", а && - логич. "и"; происходит сравнение строки файла А со строкой файла В
||((a.date.year==b.date.year)&&(a.date.mon==b.date.mon)||(a.date.day<b.date.day))) return 1;
else return 0;
}
int operator >(file a,file b) // оператор 'больше' для кол-ва обращений
{
if(a.kol>b.kol) return 1; else return 0;
}
void del(int k) // функция удаления файла с датой создания, которая меньше заданной
{
file *b=new file[n-1];
int r=0;
for(int i=0;i<(n-1);i++)
{
if(i<k)r=0;else r=1;
b[i]=a[i+r];
}
a=b;
--n;
}
int main(){ // главная функция в программе
wcout.imbue(locale(".866"));// установка локализации для русского языка
wcout<<L"Введите кол-во файлов: "; //обеспечение диалога с пользователем на русском языке
cin>>n; // ввод данных
a=new file[n]; // создание нового файла с каталогом
for(int i=0;i<n;i++){
wcout<<L"Введите имя файла № "<<i+1<<L": "; //обеспечение диалога с пользователем на русском языке
cin>>a[i].name;
wcout<<L"Введите дату создания файла № "<<i+1<<L" (дд мм гггг): "; //обеспечение диалога с пользователем на русском языке
a[i].in(); //вызов функции ввода даты
wcout<<L"Введите кол-во обращений к файлу № "<<i+1<<" : "; //обеспечение диалога с пользователем на русском языке
cin>>a[i].kol;
cout<<endl;
}
wcout<<L"Вывод каталога файлов\n"; //обеспечение диалога с пользователем на русском языке
for(int i=0;i<n;i++){
cout<<i+1<<endl<<"\t"<<a[i].name<<endl<<"\t";
a[i].out(); // вызов функции вывода даты
cout<<endl<<"\t"<<a[i].kol<<endl;
}
wcout<<L"Удаление файлов, дата создания которых меньше заданной :\n\t введите дату: "; //обеспечение диалога с пользователем на русском языке
file temp; //создание временных файлов, которые впоследствии будут удалены, т.к. их дата меньше заданной
temp.in();
for(int i=0;i<n;i++)
{
if(a[i]<temp)del(i);
}
wcout<<L"Оставшиеся файлы\n"; //обеспечение диалога с пользователем на русском языке
for(int i=0;i<n;i++){
cout<<i+1<<endl<<"\t"<<a[i].name<<endl<<"\t";
a[i].out(); // вызов функции вывода даты
cout<<endl<<"\t"<<a[i].kol<<endl;
}
wcout<<L"Файл с наибольшим количеством обращений\n"; //обеспечение диалога с пользователем на русском языке
file max=a[0];
for(int i=1;i<n;i++)if(a[i]>max)max=a[i];
cout<<"\t"<<max.name<<endl<<"\t";
max.out();
cout<<endl<<"\t"<<max.kol<<endl;
system("pause"); // задержка экрана консоли
}
Программа делает всё кроме удаления файлов, дата создания которых меньше заданной. То есть, например:
вбиваю даты для каждого из 3-х файлов:
01 01 2001
02 02 2002
03 03 2003
Заданная дата (удаление файлов, дата создания которых меньше заданной): 02 03 2002
Но программа все равно выводит два файла:
02 02 2002 - что не верно
03 03 2003 - верно.
Помогите пожалуйства подправить код программы, не могу сообразить где именно ошибка.