Форум программистов, компьютерный форум CyberForum.ru

Задача на линейные списки - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
danila_r
0 / 0 / 0
Регистрация: 30.10.2013
Сообщений: 13
31.10.2013, 15:44     Задача на линейные списки #1
Задание : в файловой системе каталог файлов организован как линейный список.
Для каждого файла в каталоге содержатся следующие сведения :
1) имя файла;
2) дата создания;
3) количество обращений к файлу.
Составить программу , которая обеспечивает:
1) начальное формирование каталога файлов;
2) вывод каталога файлов;
3) удаление файлов, дата создания которых меньше заданной;
4) выборку файла с наибольшим количеством обращений.

Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.


Код программы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#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 - верно.
Помогите пожалуйства подправить код программы, не могу сообразить где именно ошибка.

Добавлено через 23 часа 46 минут
Помогите исправить программу пожалуйста!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.10.2013, 15:44     Задача на линейные списки
Посмотрите здесь:

C++ Сформировать два списка из элементов исходного
Линейные списки C++
Добавить в конец списка L1 все элементы списка L2 C++
C++ Линейные списки
C++ линейные списки в Си
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vivo
23 / 23 / 2
Регистрация: 27.09.2009
Сообщений: 101
31.10.2013, 17:41     Задача на линейные списки #2
Можно вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int operator <(file a,file b)// оператор "меньше" для дат
{
    if(a.date.year<=b.date.year)
    {
        if(a.date.mon<b.date.mon) return 1;
        if(a.date.mon==b.date.mon)
        {
            if(a.date.day<b.date.day) return 1;
        }
        return 0;
    }
    
    return 0;
}
Вместо for:
C++
1
2
3
4
5
6
7
    j=0;
 
    while(j<n)
    {
        if(a[j]<temp)del(j);
        j++;
    }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;
    j = k-1;
    --n;
}
danila_r
0 / 0 / 0
Регистрация: 30.10.2013
Сообщений: 13
31.10.2013, 19:16  [ТС]     Задача на линейные списки #3
Спасибо, не очень понял куда цикл вместо for записать, если можно, скиньте исправленный код программы. Заранее спасибо!
Vivo
23 / 23 / 2
Регистрация: 27.09.2009
Сообщений: 101
31.10.2013, 19:58     Задача на линейные списки #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#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 j;
 
int operator <(file a,file b)// оператор "меньше" для дат
{
    if(a.date.year<=b.date.year)
    {
        if(a.date.mon<b.date.mon) return 1;
        if(a.date.mon==b.date.mon)
        {
            if(a.date.day<b.date.day) return 1;
        }
        return 0;
    }
    
    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;
    j = k-1;
    --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();
    
    //ВОТ ТУТ ЭТОТ ЦИКЛ
    j=0;
    while(j<n)
    {
        if(a[j]<temp)del(j);
        j++;
    }
 
    
    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"); // задержка экрана консоли
}
Вы перемудрили с функцией сравнения, не стал разбираться в чем. А с циклом получалось то, что когда вы удаляли например первый элемент, переносили все значения и уменьшали n, НО у вас в цикле for i увеличивалось и получалось так, что ваш алгоритм забывал про значение, которое перемещалось на место удаленного. Для спасибо есть кнопочка
LarsaTz
0 / 0 / 0
Регистрация: 22.03.2016
Сообщений: 7
04.06.2016, 14:24     Задача на линейные списки #5
помогите переделать на С#
Yandex
Объявления
04.06.2016, 14:24     Задача на линейные списки
Ответ Создать тему
Опции темы

Текущее время: 20:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru