Начало Вывод на экран файла с самым большим количеством обращений
While(Не дойдем до конца)
Конец
If (элемент больше Max значеня)
Записываем значения
Переходим к след. элементу
да
Нет
N – переменная для задания количества вводимых файлов
Exit – переменная для выхода из программы
Choose – переменная для задания пунктов меню
Dest – переменная используемая при указателе на элемент, который хотим удалить
Name – имя файла
Kolvo – количество обращений к файлу
Date – дата создания файла
*iHead - Адрес на 1 элемент
*iNext - Адрес на текущий элемент
*iCurr - Адрес на следующий элемент
Temp – переменная для смены адреса начала списка
Видалення елементу
Операцію видалення виконує функція Delete. Програма запитує назву файлу і виконує пошук за допомогою функції strcmp. Починаючи з першого елементу функція порівнює властивість name наступного елементу за поточним та значення, що передалося у функцію. Якщо є збіг, встановлюється наступний за поточним на елемент, який знаходиться через один від поточного та видаляється наступний за поточним. Для того, щоб удосконалитися у правильному результаті, в пункті меню обираємо опцію виводу на екран.
Опис вхідних даних
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <Windows.h>
#include <locale>
using namespace std;
struct Bases
{
char name[15];
int kolvo;
char date[15];
void Input(Bases &bases); //Функция ввода данных в структуру
Bases *Next;//Адрес на следующий элемент
};
Bases *iHead;//Адрес на 1 элемент
Bases *iNext;//Адрес на текущий элемент
Bases *iCurr;//Адрес на следующий элемент
void Bases::Input(Bases &bases)//Функция-шаблон для заполнения
{
cout<<"Имя файла: ";cin.getline(name,15);
cout<<"Дата создания: ";cin.getline(date,15);
cout<<"Кол-во обращений: ";cin>>kolvo; cin.ignore();
cout<<" "<<endl;
}
Вхідні данні вводяться з клавіатури користувачем. У цьому допомагає функція Input, яка є оболонкою, та функція Add, яка виконує безпосередньо заповнення списку. Всі змінні заповнюються у форматі символьної строки за для уникнення помилок при введенні.
Приклад заповнення списку:
Опис вихідних даних
Вихідними даними служить виведення на екран повного списку, а також вигляд списку після видалення заданого елемента списку. При цьому вигляд містить імя, дату створення та кількість звернень до файлу у вигляді строки.
Для русифікації була використовувана бібліотека locale для всього документу та функція setlocale(LC_ALL, "Russian") для головної частини, щоб зробити меню російською мовою.
З допомогою cout здійснюється вивод на екран.
Приклад
виведення на екран:
Приклад
видалення фалу:
Приклад виведення на екран файлу з найбільшою кількістю звернень:
Листинг
void Add(Bases &bases)//фукция добавления
{
Bases *temp=new Bases;
temp->Next=iHead; //Указываем, что адрес следующего элемента это начало списка
strcpy_s(temp->name,bases.name);
strcpy_s(temp->date,bases.date);
temp->kolvo=bases.kolvo;
iHead=temp; //Смена адреса начала списка
}
void Delete(char *name)//Функция удаления
{Bases *idest=iHead;//указатель на элемент, который хотим удалить
if(!strcmp(idest->name,name)){
if(idest->Next==NULL){//если после указателя больше ничего нет, то удаляем его
delete(idest);
idest=NULL;
return;}
iCurr=iHead;}//если нет, то текущий элемент принимает адрес первого
for(;iCurr!=NULL;iCurr=iCurr->Next)
{if(strcmp(iCurr->Next ->name, name)==0)
{delete(iCurr);}
if(idest->Next==NULL)iCurr->Next=NULL; //если после текущего ничего нет
else iCurr->Next=idest->Next;//в противном случае идем дальше
if(idest->Next==NULL) iNext=iCurr;
delete(idest);
return;}return;}
int Name(char name[])//функция, возвращающая значения, если существует файл
{if (!iHead) return 0;//если не первый, возвращаем 0
iCurr=iHead;
for(;iCurr!=NULL; iCurr=iCurr->Next){
if (!strcmp(iCurr->name, name)) return 1;}return 0;}
void Show()//функция вывода на экран
{
Bases *temp=iHead; //Объявляем указатель и изначально он указывает на начало
while (temp!=NULL) //Пока по адресу на начало хоть что-то есть
{
cout<<temp->name<<" ";
cout<<temp->kolvo<<" ";
cout<<temp->date<<endl;
temp=temp->Next; //Указываем на следующий адрес из списка
}
}
void Max()//функция вывода на экран максимальных значений
{
Bases *temp=iHead; //Объявляем указатель и изначально он указывает на начало
while (temp->Next)
{ if (temp->kolvo>30 )
{cout<<temp->name<<" ";
cout<<temp->kolvo<<" ";
cout<<temp->date<<endl;
temp=temp->Next; //Указываем на следующий адрес из списка
}
}
}
int main ()
{setlocale(LC_ALL, "Russian");
Bases base;
int N;
int exit=5;
int choose=0;
char dest[10];
while (choose!=exit)
{cout<<" \n"
"Каталог файлов\n"
"Главное меню. Выберите пункт:\n"
" 1-заполнить список;\n"
" 2-удалить файл;\n"
" 3-Вывод на экран файла с самым большиим количеством обращений;\n"
" 4-Вывод списка на экран;\n"
" 5-Выход\n"
"Введите цифру:"; cin >> choose; cin.ignore();
system("cls");//очистка экрана
switch (choose)
{case 1:
cout<<"Введите количество файлов: ";cin>>N;
cin.ignore();
for (int i=0;i<N;i++)
{
base.Input(base);
Add(base);//Передаем в функцию заполнения
} break;
case 2:
cout<<"Введите дату создания файла, которй нужно удалить"<<endl;
cin>>dest;
if (Name(dest)!=0) {
Delete(dest);}else{ cout<<"Такого файла не существует!\n";}
break;
case 3:
Max(); break;
case 4:
Show(); break;
default: if (choose==exit)cout << "Неверный пункт меню! " << choose << endl;}}}
