private string version; // Строка аутентификации файла
private string fileName; // Имя файла со списком
public List()
{
men = new ArrayList(); // Создаем новую коллекцию
bModified = false; // Устанавливаем флаги
bNew = false;
version = "MySoft, Man List v. 1.0";// Строка аутотентификации файла произвольна
fileName = "List.txt"; // Имя файла по умолчанию тоже произвольно
}
public void Mode() // Выбор режима работы
{
Console.WriteLine("\n\t\t Linear List");
while (true) // Цикл опроса команд пользователя
{
switch (Helper.Menu())
{
case 'q': Quit(); return; // Пока такого метода нет
case 's': Show(); break;
case 'a': Add(); break;
case 'd': Delete(); break;
case 'r': Read(); break;
case 'w': Write(); break;
}
}
public void Add()
{
Console.Write("\n\tInsert: Press \"Enter\" to stop inserting\n");
while (true) //==== Бесконечный цикл ввода данных
{
Man m; // Пока неинициализированная ссылка
switch (Helper.ManMenu())// Выбор типа объекта производится на этапе выполнения
{
case 'q': return; // Выбор пользователя: выйти из режима
case 's': m = new Stud(); break; // Выбор пал на студента
case 'p': m = new Prof(); break; // Выбор пал на профессора
default: continue;
}
m.In(); // Здесь работает полиморфизм
men.Add(m); // Добавляем новую ссылку
bModified = true; // Список изменился
}
}
public void Show()
{
// Ваш код
}
public void Quit()
{
if (bModified) // Если список был изменен
{
Console.Write( "\n\t\tList has been changed. Save (y/n)? ");
string s = Console.ReadLine().ToUpper();
if (s.Equals("Y"))
Write();
}
}
public object FileOpen (string fn, bool bRead)
{
object file; // Тип возвращаемого значения (ссылка на объект)
if (bRead) // Если файл открывается в режиме чтения
{
try // Пытаемся создать потокового «читателя»
{
file = new StreamReader(fn);
}
catch (FileNotFoundException e)
{
Console.WriteLine(e.Message);
return null;
}
StreamReader sr = (StreamReader)file; // Специализируем object file (для чтения)
string line = sr.ReadLine(); // Вычитываем первую строку аутентификации файла
if (!line.Equals(version)) // Если это не наш файл, то уходим
{
Console.WriteLine("\nWrong file format: " + fn);
sr.Close();
return null;
}
sr.ReadLine(); // Пропуск пустой строки
}
else // Если файл открывается в режиме записи
{
try // Пытаемся создать потокового «писателя»
{
file = new StreamWriter(fn);
}
catch (IOException e)
{
Console.WriteLine(e.Message);
return null;
}
StreamWriter sw = (StreamWriter)file; // Специализируем объект (для записи)
sw.Write (version + "\n\n"); // Записываем секретную строку и отступ заголовка
}
return file; // Возвращаем ссылку на «читателя» или "писателя" (файл)
}
public void Write()
{
//==== Вставьте код, ориентируясь на подсказки
//==== Если список пуст, то уходим
//==== Имя файла пока пусто
StreamWriter sw = null; // Создаем «писателя»
//===== Пытаемся открыть файл в режими записи
if ((sw = (StreamWriter)FileOpen (fileName, false)) == null)
return;
//===== Просим объекты вывести данные в поток sw
//===== Закрываем поток
Console.WriteLine(fileName + " has been stored");
//===== Корректируем флаги состояния
bNew = false;
bModified = false;
}
public void Read()
{
StreamReader sr = (StreamReader)FileOpen (fileName, true); // Создаем «читателя»
if (sr == null) // Пытаемся открыть файл с именем fileName
{
Console.Write("\nCan not read file: " + fileName);
return;
}
if (men.Count != 0) // Если в памяти есть список, то уничтожаем его
{
Console.WriteLine("Deleting current list");
men.Clear();
}
Console.WriteLine("Reading from: " + fileName); // Готовимся построчно считывать данные
string line;
while ((line = sr.ReadLine()) != null) // Считываем строки текста, пока «читатель» их находит
{
Man m;
switch (line[0]) // В зависимости от первого символа строки
{
case 'S': m = new Stud(); break;
case 'P': m = new Prof(); break;
default: // Реагируйте на ошибку return;
}
m.Read (line); // Просим объект прочесть свои данные
men.Add(m); //Добавляем ссылку в список
}
bModified = false; // Корректируем состояние списка и закрываем поток
bNew = false;
sr.Close();
Console.WriteLine ("\n\nLinear List of Man\n");// Выводим весь список на экран
foreach (Man m in men)
Console.WriteLine(m);
}
public void Delete()
{
//===== Если список пуст, уходим
//===== Пока список не пуст, предлагаем выбрать жертву
while (men.Count > 0)
{
Console.Write("\n\tDelete\t0...{0} (0 - to Quit): ",men.Count);
string s = Console.ReadLine();
int n = Helper.MakeInt(s, 0, men.Count);
if (n <= 0)
break;
//==== Удаляем ссылку на объект из коллекции men
//==== Корректируем состояние списка и показываем его
//===== Выводим результат
}
}
}
Класс List готов. При выбранной тактике управления списком функция Main выглядит просто.
static void Main()
{
List list = new List();
list.Mode();
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.