crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Массивы, Как сздавать массивы в Qt
Dimix
  опции профиля:
сообщение 2.12.2010, 14:54
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 74
Регистрация: 24.11.2010
Пользователь №: 2215

Спасибо сказали: 0 раз(а)




Репутация:   0  


Вопрос простой - Как создать масив от ["A".."Z", "a".."z", "1".."9"]
Что бы можно было вытащить случайный элемент из заданного диапазона?
Как в Qt использовать random()?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 2.12.2010, 15:03
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


вот так можно
std::vector<char> v('Z'-'A'+1 + 'z'-'a'+1+ '9'-'1'+1,0);

for(char c='A'; c<='Z';c++) v.push_back(c);
for(char c='a'; c<='z';c++) v.push_back(c);
for(char c='1'; c<='9';c++) v.push_back(c);

char randomChar=v[qrand()%v.size()];


можно и без вектора, конечно, обойтись. Но придётся вручную вбивать статический массив символов. Но оно того не стОит, если операция разовая
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Dimix
  опции профиля:
сообщение 2.12.2010, 15:23
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 74
Регистрация: 24.11.2010
Пользователь №: 2215

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 2.12.2010, 15:03) *
std::vector<char> v('Z'-'A'+1 + 'z'-'a'+1+ '9'-'1'+1,0);

for(char c='A'; c<='Z';c++) v.push_back(c);
for(char c='a'; c<='z';c++) v.push_back(c);
for(char c='1'; c<='9';c++) v.push_back(c);

char randomChar=v[qrand()%v.size()];

Ого вопрос оказывается не настолько прост. :blink: Я почти ничего не понял из выше приведенного кода.
Что такое std::vector?
Почему диапазон задается задом на пред?
Почему +1+ между диапазонами и что значит 0 в конце?
Почему qrand()?
Что означает %?
Как задать чтоб вывести к примеру 5 произвольных символов?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Dimix
  опции профиля:
сообщение 2.12.2010, 17:47
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 74
Регистрация: 24.11.2010
Пользователь №: 2215

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата
Как задать чтоб вывести к примеру 5 произвольных символов?

С этим вопросом разобрался.
QString ad;
         char randomChar;
         for(int i=0; i=5; ++i){
         randomChar=v[random()%v.size()];
         ad=ad+randomChar;
         };

Только оно почемуто не работает. :unsure:
qrand() - выводит только квадраты;
random() rand() - выводит квадраты и заданый диапазон.

И появились новые вопросы что значит %v.size() Почему size?
Как сделать чтобы оно выводило только Верхний, Нижний регистры латинского алфавита и цыфры?
Отладчик показывает что получено 122 строки с 1 по 60 значение '?', ascii=0
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
512es
  опции профиля:
сообщение 2.12.2010, 18:35
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

Спасибо сказали: 5 раз(а)




Репутация:   0  


http://doc.crossplatform.ru/qt/4.3.2/containers.html
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Dimix
  опции профиля:
сообщение 2.12.2010, 19:07
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 74
Регистрация: 24.11.2010
Пользователь №: 2215

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(512es @ 2.12.2010, 18:35) *

Понятно без документации и книги дальше мне не шагнуть. Спасибо :clapping: буду листать Макса Шлее.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 2.12.2010, 19:14
Сообщение #7


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Dimix, я точно не ошибся ? Надо на языке Си++ ? Или на каком другом ? ))

>>Что такое std::vector?
STL - контейнер, шаблонный класс. Можно заменить статическим массивом, если "не проходили"

>>Почему диапазон задается задом на пред?
>>Почему +1+ между диапазонами и что значит 0 в конце?
символы идут подряд, поэтому я вичислил длину массива под эти символы:

последний_символ-первый_символ+1


>>Почему qrand()?
потому что гладиолус (с) :D
Цитата
int qrand ()
Thread-safe version of the standard C++ rand() function.

Returns a value between 0 and RAND_MAX (defined in <cstdlib> and <stdlib.h>), the next number in the current sequence of pseudo-random integers.

Use qsrand() to initialize the pseudo-random number generator with a seed value.

This function was introduced in Qt 4.2.

See also qsrand().

void qsrand ( uint seed )
Thread-safe version of the standard C++ srand() function.

Sets the argument seed to be used to generate a new random number sequence of pseudo random integers to be returned by qrand().

The sequence of random numbers generated is deterministic per thread. For example, if two threads call qsrand(1) and subsequently calls qrand(), the threads will get the same random number sequence.

This function was introduced in Qt 4.2.

See also qrand().


>>Что означает %?
деление по модулю (то есть остаток от деления)


>>Почему size?
метод такой у вектора - количество элементов в нём
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Obey-Kun
  опции профиля:
сообщение 2.12.2010, 19:30
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 96
Регистрация: 24.3.2010
Пользователь №: 1556

Спасибо сказали: 3 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 2.12.2010, 15:03) *
вот так можно
std::vector<char> v('Z'-'A'+1 + 'z'-'a'+1+ '9'-'1'+1,0);

for(char c='A'; c<='Z';c++) v.push_back(c);
for(char c='a'; c<='z';c++) v.push_back(c);
for(char c='1'; c<='9';c++) v.push_back(c);

char randomChar=v[qrand()%v.size()];


можно и без вектора, конечно, обойтись. Но придётся вручную вбивать статический массив символов. Но оно того не стОит, если операция разовая

Во-первых, почему std::vector, а не QVector?
Во-вторых, раз уж использовать std::vector, то лучше использовать его фичу по контролю размера — использовать метод at(), а не оператор [].
В-третьих, ты забыл про 0. По таблице ASCII, 0 находится перед 1, значит надо for(char c='0'; c<='9';c++).

Кстати, сначала тупил над qrand()%v.size(), пока не понял, что это действительно будет число от 0 до v.size()-1 :). Просто я всегда делаю qRound(max*qrand()/RAND_MAX), но твой подход получше будет :). За это спасибо.

А ещё можно обойтись без массивов. Но если честно, мне код писать лень.

И ещё, автор, не забудь сделать qsrand() :).

Сообщение отредактировал Obey-Kun - 2.12.2010, 20:37
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 2.12.2010, 20:59
Сообщение #9


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Obey-Kun, я пользуюсь STL, так как это стандарт языка. Кутешными контейнерами пользуюсь только при необходимости - когда метод требует ссылку. А "at" тоже не пользуюсь, так как я всегда контролирую индекс (чего и всем советую :) ) Це не фича, а скорость (собственно, привычка контролировать индекс проистекает из того, что я начал пользовать STL с год назад, а до этого активно отрицал, пока вдруг не понял, что это наигрался с низким уровнем до нехочу, а STL - это существенное увеличение скорости написания программ + меньше глюков по невнимательности)

про '0' в условии задачи нету :)

Цитата(Obey-Kun @ 2.12.2010, 21:30) *
qrand()%v.size(), пока не понял, что это действительно будет число от 0 до v.size()-1 . Просто я всегда делаю qRound(max*qrand()/RAND_MAX),

это немного разное:

qrand()/RAND_MAX - обеспечивает коэффициент 0.0<k<1.0 (не ставлю <=, так как такого не бывает в реальности ))) )

N%v.size() - обеспечивает невыход за границу массива (хотя, впрочем, распределение будет примерно таким же)

Сообщение отредактировал Алексей1153 - 2.12.2010, 21:01
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Obey-Kun
  опции профиля:
сообщение 2.12.2010, 22:11
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 96
Регистрация: 24.3.2010
Пользователь №: 1556

Спасибо сказали: 3 раз(а)




Репутация:   0  


Цитата
я пользуюсь STL, так как это стандарт языка. Кутешными контейнерами пользуюсь только при необходимости - когда метод требует ссылку. А

Контейнеры в Qt создали в том числе потому потому, что STL в полной мере реализован не везде. Так что если делать кроссплатформенное ПО, то не вижу смысла от них отказываться. Если честно, я вообще не вижу смысл не использовать все фичи Qt, если в проекте используется Qt.

Цитата
qrand()/RAND_MAX - обеспечивает коэффициент 0.0<k<1.0 (не ставлю <=, так как такого не бывает в реальности ))) )

Упс, я там накосячил ещё и накосячил, верно. Короче, дурацкий у меня подход, qrand()%(max+1) гораздо лучше (если мы хотим число от 0 до max).

Сообщение отредактировал Obey-Kun - 2.12.2010, 22:17
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 15:11