Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2013, 15:54   #1
danila_r
Новичок
Джуниор
 
Регистрация: 31.10.2013
Сообщений: 1
По умолчанию Линейные списки

Задание : в файловой системе каталог файлов организован как линейный список.
Для каждого файла в каталоге содержатся следующие сведения :
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 - верно.
Помогите пожалуйства подправить код программы, не могу сообразить где именно ошибка.
danila_r вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Линейные списки С++ неПрограммистка12 Помощь студентам 0 06.05.2012 16:48
Линейные списки. Rediska512 Паскаль, Turbo Pascal, PascalABC.NET 1 30.03.2012 21:54
Линейные списки Anny_Apple Паскаль, Turbo Pascal, PascalABC.NET 0 04.04.2011 22:18
Линейные списки Rusl92 Паскаль, Turbo Pascal, PascalABC.NET 3 26.04.2010 09:24