Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 69 из 87<  1 ... 66  67  68  69  70  71  72 ... 87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Junior
Статус: Не в сети
Регистрация: 07.07.2008
всем большое спасибо за ответы,разобрался ;)



Партнер
 

Member
Статус: Не в сети
Регистрация: 14.01.2008
Не нашел темы по шарпу, да тут, вообщем то, не в .NET дело
Код:
internal string GeneratePassword(byte Length, bool Upcase, bool Lowcase, bool Num)
        {
            Random Randomizer = new Random();
            string Password = null;
            byte x;

            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


 

Member
Статус: Не в сети
Регистрация: 14.01.2008
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


 

Member
Статус: Не в сети
Регистрация: 14.01.2008
Код:
byte i = 1;

            do
            {
                switch (Convert.ToByte(Randomizer.Next(1, 4)))
                {
                    case 1:
                        if (Num)
                            Password += Convert.ToString(Randomizer.Next(0, 10));
                        else
                            continue;
                        break;

                    case 2:
                        if (Upcase)
                            Password += Convert.ToChar(Randomizer.Next(65, 91));
                        else
                            continue;
                        break;

                    case 3:
                        if (Lowcase)
                            Password += Convert.ToChar(Randomizer.Next(97, 123));
                        else
                            continue;
                        break;
                }
                i++;
            }
            while (i <= Length);
Спасибо за помощь! :beer:


 

Member
Статус: Не в сети
Регистрация: 10.12.2003
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);

            genFuncs = new Dictionary<CharType, Func<char>>(){
                {CharType.Lowcase, () => Convert.ToChar(rnd.Next(97, 123))},
                {CharType.Upcase,  () => Convert.ToChar(rnd.Next(65,  91))},
                {CharType.Num,     () => Convert.ToChar(rnd.Next(48,  58))}};
        }

        public string GeneratePassword(byte Length, CharType charTypes)
        {
            var genFuncs = charTypes.GetAllSelectedItems<CharType>().Select(ct => this.genFuncs[ct]).ToArray();

            var pswd = new StringBuilder(Length);
            for (var i = 0; i < Length; i++)
                pswd.Append(genFuncs[getRandom(genFuncs.Length)]());

            return pswd.ToString();
        }
    }


Последний раз редактировалось theone 13.08.2010 2:31, всего редактировалось 2 раз(а).

 

Member
Статус: Не в сети
Регистрация: 22.02.2008
Откуда: ниоткуда
theone писал(а):
Я бы сделал так:

Программящий на стандартных C/C++ большую часть кода тут просто не поймёт :-)


 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
Ну ребята... Неужели сложно вмолотить все допустимые символы в пароле в const char fuckingChars[N], а рандомом выбирать их по индексу и вбивать в результирующую строку -> минимум кода->минимум ошибок->максимум производительности.
Если нужно генерить опционально, то можно организовать выборку по диапазонам, короче там фантазия разгуляйся...


 

Member
Статус: Не в сети
Регистрация: 13.06.2007
Откуда: UK/Glasgow
Фото: 0
Какой-то этот с++ замудрённый, очень писать много. Может мне и Delphi хватит, там поменьше писанины будет?

_________________
-=AMD POWER FAN CLUB=-


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
SwiPTorrent
Цитата:
Может мне и Delphi хватит, там поменьше писанины будет?

нет. А зачастую и больше :-)

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Junior
Статус: Не в сети
Регистрация: 14.09.2009
Добрый вечер!
Поделитесь, пожалуйста, идейкой для реализации сей задачи! =)

-Какой из элементов (введённых с клавиатуры пользователем) меньше всего отличается от среднеарифметического значения всего массива?


 

Member
Статус: Не в сети
Регистрация: 17.10.2005
мдааа. Считаешь сумму пока вводят числа, делишь на количество элементов. Проходишься по циклу второй раз и находишь число с наименьшей разностью его и среднего арифметического. Необходимо следить за переполнением суммы. Чего тут сложного??


 

Junior
Статус: Не в сети
Регистрация: 14.09.2009
Delin писал(а):
мдааа. Считаешь сумму пока вводят числа, делишь на количество элементов. Проходишься по циклу второй раз и находишь число с наименьшей разностью его и среднего арифметического. Необходимо следить за переполнением суммы. Чего тут сложного??

я не конкретизировал свой вопрос, извините! "наименьшей разностью его и среднего арифметического" эту часть я делал через модуль.


 

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
В обращении ко мне используйте Сэр. (с) Я


 

Member
Статус: Не в сети
Регистрация: 20.03.2009
Откуда: Санкт-Петербург
R3laX
Вот код
Код:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char *clone(char *str){
  char *result;
  int length;
  length = strlen(str);
  result =(char *) malloc(length+1);
  strcpy(result, str);
  return result;
}


void main()
{

char token[81];
char * word;
char c;
for(int i=0;i<81;i++)
   token[i]='\0';
for(int i=0;i<81;i++)
{
   if((c=getchar())=='\n')
      break;
   token[i]=c;
}
word=clone(token);
printf("%s",word);
}



Написано result = malloc(length+1);, а надо result = (char *) malloc(length+1);
Ну и массивчик token я сначало '\0' заполнил, а то он в конце выводит ненужные нули.

_________________
Задачи бывают простыми и очень простыми...


 

Member
Статус: Не в сети
Регистрация: 07.01.2010
а в конце token точно \0 есть? валится скорее всего на strlen, если того самого нуля нету, т.к. потенциально можно забубенить туда 81 символ:
Код:
for(int i=0;i<81;i++)
{
   if((c=getchar())=='\n')
      break;
   token[i]=c;
}

поменяй вот в этом цикле 81 на 80. вместо первого цикла можно использовать замечательную функцию memset


 

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


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 69 из 87<  1 ... 66  67  68  69  70  71  72 ... 87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan