ДЗ-5-6-7. Задание «Генератор пароля и логина». 2018-19 уч.г.
Необходимо создать программу, которая будет опрашивать пользователя (получать его фамилию, имя и год рождения), генерировать ему логин (на латинице, тогда как ФИО пользователь вводит на русском языке), предлагать ему выбрать сложность пароля и сгенерировать пароль заданной сложности (и/или длины) ИЛИ проверить и принять предложенный самим пользователем пароль. Далее необходимо сохранить пару логин-пароль в текстовые файлы в папку проекта (отдельный файл для логинов LOG.txt, отдельный для паролей PSWD.txt). Также необходимо реализовать процесс авторизации (переход на следующую форму по ранее созданному логину/паролю).
Рекомендации по выполнению:
ДЗ-5. Генерация случайного пароля.
Генерация случайного пароля. Программа должна давать пользователю возможность генерировать пароль различной сложности и длины, в зависимости от настроек, установленных пользователем.
1-й режим: словарь символов включает буквы латинского алфавита (большие и малые) и цифры. Программа может генерировать пароль фиксированной длины (не менее 6 символов) и различной сложности. Сложность задает пользователь. Категории сложности пароля:
|
|
· легкий – только цифры ИЛИ только буквы;
· сложный – цифры, большие и малые буквы.
2-й режим: словарь символов включает буквы латинского алфавита (большие и малые), цифры. Программа может генерировать пароль регулируемой длины (длину пароля задает пользователь, не менее 6 символов) и различной сложности. Сложность задает пользователь. Категории сложности пароля:
· легкий – только цифры ИЛИ только буквы;
· средний – цифры и буквы (буквы могут быть ИЛИ большие, ИЛИ малые);
· сложный – цифры, большие и малые буквы.
ДЗ-6. Транслит.
Транслирование ФИО, написанных на русском языке, в вариант написания латиницей.
Необходимо иметь два словаря (массива строк) типа string:
DRus – словарь букв русского алфавита.
string[] DRus = new string [33]{“а”,”б”,“в” …”э”,”ю”,”я”}; //всего 33 символа, индексы от 0 до 32/
DEng – словарь символов латинского алфавита транслирующих соответствующие русские буквы.
string[] DEng = = new string [33] {“a”,”b”,”c”…”z”}; // ТАК ЗАДАВАТЬ НЕ ВЕРНО!, ведь в таком случае в словаре всего 26 символов, индексы от 0 до 25. Очевидно, что DRus и DEng друг другу НЕ соответствуют, и не понятно, какое символосочетание подходит к русским буквам.
Задавать DEng нужно иначе. Длина данного массива должна быть равна длине массива DRus,и массив должен содержать в соответствии со следованием в DRus букв русского алфавита подходящие сочетания символов из латинского алфавита.
Самое главное – соблюдать четкое соответствие по индексам букв русского алфавита и их транлитных аналогов. Также же важно помнить, что одной букве русского алфавита может соответствовать сочетание нескольких символов алфавита латинского (я – ya, ж – zh и т.д.)
|
|
Index DRus | 0 | 1 | 2 | 3 | … | 30 | 31 | 32 |
а | б | в | г | э | ю | я | ||
a | b | v | g | e | u | ya | ||
Index DEng | 0 | 1 | 2 | 3 | … | 30 | 31 | 32 |
Затем необходимо проходить по строке с русским словом, узнавать индексы каждой русской буквы в слове, и по этим самым индексам подставлять на место русских букв их транслит-аналог.
Для поиска индексов букв слова необходимо использовать двойной цикл: внешний цикл «бегает» по слову, внутренний — по русскому словарю. Сами найденные индексы записываются в массив типа int по длине равный кол-ву букв в слове.
Для подстановки символов используется один цикл. По индексам из массива индексов букв ищутся символы в словаре DЕng и записываются в новую строку.
Пример. Пусть введена фамилия «ямщиков» (поправка на все малые буквы – пусть у нас разрешен только нижний регистр, при выполнении задания лучше учитывать оба регистра). Транслируем это слово:
1. Проверяя каждую букву слова со словарем русский букв, узнаем индексы букв и сохраним их в массив.
Буквы string FirstName = “ямщиков”; | я | м | щ | и | к | о | в |
Индексы букв, найденные в словаре DRus int[] slovoL = new int[slovo.Length]; | 32 | 13 | 26 | 10 | 11 | 15 | 2 |
2. Возьмем найденные индексы, узнаем по ним символы или символосочетания из второго словаря, запишем найденное в новую строку.
string TransFirstName = “”;
//в цикле по длине массива
for (int i=0; i<slovoL.Length; i++)
{ TransFirstName += DEng[slovoL[i]]; }
//данная конструкция позволит подставлять в значение индекса словаря Deng значения из массива slovoL, которые в свою очередь являются индексами оригинальных букв русского словаря, тогда по найденным индексам мы получим символосочетания латинского словаря, соответствующие русским буквам
ДЗ-7. Файлы и авторизация.
Работа с текстовыми файлами.
Чтобы работать с текстовыми файлами, необходимо подключить библиотеку System.IO и использовать классы StreamReader и StreamWriter.
using System.IO; //в самой верхней части программы, подо всеми уже подключенными библиотеками
Подробный пример записи-чтения в файл представлен на диске Q/Groups/ИСАУ/ПЯВУ, папка проекта «Файл».
ДЗ-7. Запись полученных логина и пароля в файл, авторизация по уже имеющимся логин-паролю (чтение файлов)
В корневой папке проекта (имя_проекта/bin/debug), рядом с exe-файлом необходимо создать два текстовых файла (расширение *.txt): первый файл назвать «log», второй файл назвать «pswd». В первый файл будут записываться полученные логины, во второй – полученные пароли.
ВАЖНО! Записывать полученную пару логин-пароль в файлы, соблюдая порядок, иными словами номер записи (номер строки) пароля1 для логина 1 в файлах должен совпадать.
ПРАВИЛЬНО | Имеется три пары логин-пароля: tanya-123456; sunM-654asd; user123-1q2w3e
| НЕ ПРАВИЛЬНО | ||
Файл log.txt | Файл pswd.txt | Файл log.txt | Файл pswd.txt | |
tanya | 123456 | tanya | ||
sunM | 654asd | sunM | 123456 | |
user123 | 1q2w3e | user123 | 1q2w3e |
После того, как логин-пароли записаны, необходимо реализовать метод авторизации. Необходимо вводить логин-пароль, открывать на чтение файл с логинами, искать введенный логин. Если логин найден, то далее необходимо открывать на чтение файл с паролями и по номеру строки найденного логина считывать и сравнивать с введенным пароль. Если все совпадает, пользователю открывается доступ к новой форме. Если не совпадает – программа отказывает в доступе и предлагает зарегистрироваться.
Дополнительные задания (на доп.баллы):
· проверять при записи логин-пароля на уже существующий логин, отказывать в такой записи.
· предлагать пользователю на выбор несколько вариантов логина;
· нарисовать блок-схему работы вашего приложения.
|
|
Подсказка по чтению и записи в текстовый файл (в кавычках указывается полный путь к файлу с его полным именем и расширением)
Записывание
StreamWriter wr = new StreamWriter("file.txt");
wr.WriteLine(textBox1.Text);
wr.Close();
Дописывание
StreamWriter wr = File.AppendText("file_2.txt");
wr.WriteLine(textBox1.Text);
wr.Close();
Чтение до конца
StreamReader re = new StreamReader("file_2.txt");
string s = re.ReadToEnd();
textBox1.Text += s;
listBox1.Items.Add(s);
re.Close();
Чтение построчно
StreamReader re = File.OpenText("file_2.txt");
textBox1.Text = "";
listBox1.Items.Clear();
string s;
while (!re.EndOfStream)
{
s = re.ReadLine();
textBox1.Text += s;
listBox1.Items.Add(s);
}
re.Close();