for (byte i = 1; i <= Length; i++) { reset: x = Convert.ToByte(Randomizer.Next(1, 4)); switch (x) { case 1: if (Num) Password += Convert.ToString(Randomizer.Next(0, 10)); else goto reset; break;
case 2: if (Upcase) Password += Convert.ToChar(Randomizer.Next(65, 91)); else goto reset; break;
case 3: if (Lowcase) Password += Convert.ToChar(Randomizer.Next(97, 123)); else goto reset; break; } }
return Password; }
Можно ли это дело организовать без goto? А то индусятина..
Advanced member
Статус: Не в сети Регистрация: 30.08.2003 Откуда: Санкт-Петербург
Whistler-X можно. Суть алгоритма в виде псевдокода может быть изложена? Или в виде графа? А то мне вникать в .NET влом. Понимаю, что генерация функция пароля с хитрым рандомайзом...
_________________ {:€ дед в законе :-) нородный окодемег почетный пользователь OpenSuSE 11.3 Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad
Root Сначала рандомно генерятся числа от 1 до 3, что является случайным выбором типа символа. Далее через case получаются символы: генерятся числа, затем конвертируюся в соответсвующий по ASCII-коду символ (не относится к цифрам). Соль в том, что юзер может в гуе выбрать типы используемых символов, таким образом, если выпал тип символа, не выбранный юзером - goto на рандомизацию типа символа заново
Advanced member
Статус: Не в сети Регистрация: 30.08.2003 Откуда: Санкт-Петербург
Whistler-X сделать проще можно. Во-первых, цикл переписать не в виде for, что ограничивает кол-во итераций, а в виде do{}while с выходом по превышению кол-ва сгенерированных символов. Во-вторых, в начале цикла всегда будет выбор типа символа. В третьих, если тип генерируемого символа выбран неверно (не выбран юзером), то одной простой командой continue попадаем на следующие итерацию цикла. Соответственно, есть ненулевая вероятность того, что рандомайз во второй раз выберет допустимый тип Заодно почитайте справку про break. В конце тела цикла - обязательно length++.
_________________ {:€ дед в законе :-) нородный окодемег почетный пользователь OpenSuSE 11.3 Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad
Whistler-X Все равно "индусятина": 1) Random должен создаваться один раз, а не при каждом выполнении функции. 2) Строка должна наращиваться через StringBuilder. 2) Switch - говнокод. 3) Непонятные константы (1, 2, 3), обозначающие тип симолов - говнокод. 4) Множество аргументов (bool Upcase, bool Lowcase, bool Num) - говнокод. Надо использовать битовое поле или хотя бы коллекцию.
Я бы сделал так: #77
Код:
public static class EnumExtensions { public static IEnumerable<T> GetAllSelectedItems<T>(this Enum value) { foreach (var item in Enum.GetValues(typeof(T))) if (value.HasFlag((Enum)item)) yield return (T)item; } }
class PasswordGenerator { [Flags] public enum CharType : byte { Upcase = 1, Lowcase = 2, Num = 4 };
private readonly Random rnd = new Random(); private Func<int, int> getRandom; private Dictionary<CharType, Func<char>> genFuncs;
public PasswordGenerator() { getRandom = (i) => i == 0 ? 0 : rnd.Next(0, i);
Member
Статус: Не в сети Регистрация: 15.02.2009 Откуда: Лангепас
Ну ребята... Неужели сложно вмолотить все допустимые символы в пароле в const char fuckingChars[N], а рандомом выбирать их по индексу и вбивать в результирующую строку -> минимум кода->минимум ошибок->максимум производительности. Если нужно генерить опционально, то можно организовать выборку по диапазонам, короче там фантазия разгуляйся...
мдааа. Считаешь сумму пока вводят числа, делишь на количество элементов. Проходишься по циклу второй раз и находишь число с наименьшей разностью его и среднего арифметического. Необходимо следить за переполнением суммы. Чего тут сложного??
мдааа. Считаешь сумму пока вводят числа, делишь на количество элементов. Проходишься по циклу второй раз и находишь число с наименьшей разностью его и среднего арифметического. Необходимо следить за переполнением суммы. Чего тут сложного??
я не конкретизировал свой вопрос, извините! "наименьшей разностью его и среднего арифметического" эту часть я делал через модуль.
Member
Статус: Не в сети Регистрация: 03.06.2008 Откуда: Rep. of Ireland Фото: 8
Язык С:
Код:
тут немного кода{ char token[81]; char * word; в token хранится 1 слово(не важно какое, но короче 80-ти знаков). word=clone(token); и ещё немного кода }
Код:
char *clone(char *str){ char *result; int length; length = strlen(str); result = malloc(length+1); strcpy(result, str); return result; }
Вопрос собственно, что будет в word после этого? Пытаюсь его вывести на экран printf("%s\n", word); (я так думаю, оно все еще стринг?) результат Segmentation fault. Этот код с clone был дан и вроде как, его надо использовать(не обязательно), но вписать в свой код я его так и не смог...
_________________ ЖК трое суток с целью обучения хорошим манерам (ибо просил не называть меня на "ты") (c) exodi В обращении ко мне используйте Сэр. (с) Я
Написано result = malloc(length+1);, а надо result = (char *) malloc(length+1); Ну и массивчик token я сначало '\0' заполнил, а то он в конце выводит ненужные нули.
_________________ Задачи бывают простыми и очень простыми...
Member
Статус: Не в сети Регистрация: 03.06.2008 Откуда: Rep. of Ireland Фото: 8
/0 в токен точно есть, т.к я вставлял while с проверкой на /0 и подсчетом знаков перед тем, как послать его в clone. Я хочу word запихнуть в array(что бы там был список слов), но я не понимаю зачем мне clone делать и что он делает...
_________________ ЖК трое суток с целью обучения хорошим манерам (ибо просил не называть меня на "ты") (c) exodi В обращении ко мне используйте Сэр. (с) Я
Member
Статус: Не в сети Регистрация: 09.01.2009 Откуда: Москва
1)Как создать статический массив в какой-то функции и вернуть его в точку вызова функции? Я так понимаю просто создать массив и вернуть его адресс не получится, т.к. когда закончит работать функция, то в ней удалится этот массив? Кроме выделения памяти(new int[]) для массива есть еще простой способ это сделать?
2) Выделяю память в main для массива и в том же main удаляю, а как удалить массив, который был создан в функции, если в этой же функции мне его нельзя удалять(он используется еще в других функциях)? У меня ошибка при удалении массива.
Advanced member
Статус: Не в сети Регистрация: 30.08.2003 Откуда: Санкт-Петербург
test'~3 Вы вообще понимаете смысл слова "статический"?
Цитата:
2) Выделяю память в main для массива и в том же main удаляю, а как удалить массив, который был создан в функции, если в этой же функции мне его нельзя удалять(он используется еще в других функциях)? У меня ошибка при удалении массива.
Как-как... Например, использовать умные указатели и счетчики ссылок. Еще мысль - стековые (локальные) переменные удаляются при выходе за пределы их области определения. Следовательно, стековый объект грохнется сам, когда функция, в которой он определен закончится. Поэтому удобно реализовывать хитрые классы-обертки, которые будут автоматом делать некоторые вещи. А для передачи массивов между функциями можно извернуться так: передавать каждый раз объект. При этом в каждой новой функции он может конструироваться заново, но с нужным Вам содержимым. Главное тут разобраться как все происходит и не запутаться... Еще лучше - давайте конкретный пример, а там подумаем, что лучше сделать в конкретной ситуации.
_________________ {:€ дед в законе :-) нородный окодемег почетный пользователь OpenSuSE 11.3 Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения