Вопрос № 52278: Здрастауйте!
Сам я только начинаю изучать С++. Начал читать книгу C++ глазами хакера, но вот только непойму, какая версия VC++ применяется к рассмотрению в этой книге. Я ставил и VC++ v.1 и VC++ v.6, интерфейс и синтаксис отличаются от той версии...Вопрос № 52283: Добрый день!
Такой вопрос :как получить псевдо случайные числа например от 0 до 50
используя функцию rand() в таком примере :
char buffer[100];
int cnt;
for (cnt = 0; cnt <100; cnt++)
buffer [cnt] = rand();
м...Вопрос № 52284: Уважаемые эксперты,
Хотелось бы прочитать по с/с++ какую нибудь *классическую книгу(- с таким же авторитетом, как у Кнута.)* Подскажите авторов и названия.
Заранее благодарен....Вопрос № 52295: Доброго всем времени суток!
Не могли бы объяснить разницу между int и int*, char и char*, и т. д. ...Вопрос № 52309: Uvajaemi eksperti pomagite
#include<iostream.h>
#include<conio.h>
using namespace std;
int main()
{
int j;
cout<<"j Raven: "<<j;
getch();
returen 0;
}...Вопрос № 52350: Здравствуйте эксперты.
У меня проблема : может не совсем сюда но программу я буду писать на C++ =) для исправления этой проблемы !
Я пытаюсь поставить на ноутбук драйвера для принтера HP
Драйвера ставятся вместе с программой .
Програм...
Вопрос № 52.278
Здрастауйте!
Сам я только начинаю изучать С++. Начал читать книгу C++ глазами хакера, но вот только непойму, какая версия VC++ применяется к рассмотрению в этой книге. Я ставил и VC++ v.1 и VC++ v.6, интерфейс и синтаксис отличаются от той версии , что рассматривается в книге. Может кто-нибуть читал эту книгу и поиожет мне разобраться?
Отправлен: 16.08.2006, 07:46
Вопрос задал: KuchumHan (статус: Студент)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 10)
Отвечает: gitter
Здравствуйте, KuchumHan!
Если Вы имели в виду книгу Фленова, то, скорей всего, примеры написаны в 2002-й или 2003-й студии
Удачи!
Ответ отправил: gitter (статус: Студент)
Ответ отправлен: 16.08.2006, 10:06 Оценка за ответ: 5 Комментарий оценки: Что за 2002-я 2003-я студия? Поподробней можно?
Ответ отправил: D3rp (статус: 5-ый класс)
Ответ отправлен: 16.08.2006, 12:01 Оценка за ответ: 5 Комментарий оценки: Спасибо
Отвечает: Www2
Здравствуйте, KuchumHan!
C++ бывает не только Visual, есть много других компиляторов. Если обсуждается C++ вообще, то спрашивать какой оно версии некорректно, у C++ нет версии.
Ответ отправил: Www2 (статус: 4-ый класс)
Ответ отправлен: 16.08.2006, 14:07
Вопрос № 52.283
Добрый день!
Такой вопрос :как получить псевдо случайные числа например от 0 до 50
используя функцию rand() в таком примере :
char buffer[100];
int cnt;
for (cnt = 0; cnt <100; cnt++)
buffer [cnt] = rand();
мы получаем только числа от 0 до 32767 .
Заранее спасибо!
Отвечает: Шальков Павел Владимирович
Здравствуйте, Erick_Krause!
Очень просто, используя преобразование: rand()/32767*50.
Ответ отправил: Шальков Павел Владимирович (статус: 6-ой класс)
Ответ отправлен: 16.08.2006, 08:55 Оценка за ответ: 3 Комментарий оценки: rand()/32767*50 получаются только нули! наверно из -за особенностей платформы.
Отвечает: Sergijj
Здравствуйте, Erick_Krause!
Или лучше так:
buffer [cnt] = rand() % 50;
% - Это остаток от деления нацело...
--------- Стучитесь! И Вас откопают...
Ответ отправил: Sergijj (статус: 4-ый класс)
Ответ отправлен: 16.08.2006, 09:44 Оценка за ответ: 4 Комментарий оценки: Точнее buffer [cnt] = rand() % 51; если до 50.
Отвечает: gitter
Здравствуйте, Erick_Krause!
В приложении найдёте пример с генерированием (например, десяти) псевдослучайных чисел на любом заданном интервале (RANGE_MIN, RANGE_MAX)
Пример взят из MSDN
Удачи!
Приложение:
Ответ отправил: gitter (статус: Студент)
Ответ отправлен: 16.08.2006, 09:56 Оценка за ответ: 4 Комментарий оценки: Сложнее но интереснее ! P.S Работает!
Отвечает: Хватов Сергей
Здравствуйте, Erick_Krause!
Смотрите в приложении.
Примечания (по тем ответам, которые уже есть):
- сначала умножайте - не искушайте интеллект компилятора.
- взятие по модулю хуже - у чисел будут слегка неодинаковые вероятности выпадения.
- если умножать на 50, то числа будут от 0 до 49
- 51L - это константа типа long (на случай если у вас 16-битная платформа - вы же ее не указали :-)
Приложение:
Ответ отправил: Хватов Сергей (статус: 1-ый класс)
Ответ отправлен: 16.08.2006, 10:32 Оценка за ответ: 5 Комментарий оценки: Круто!
Отвечает: Шинтяков Дмитрий Васильевич / Ratson
Здравствуйте, Erick_Krause!
Обычно пишут так:
buffer [cnt] = rand()%51;
Идея понятна?
Ответ отправил: Шинтяков Дмитрий Васильевич / Ratson (статус: 1-ый класс)
Ответ отправлен: 16.08.2006, 12:45 Оценка за ответ: 4 Комментарий оценки: Легко и просто!
Отвечает: PROD
Здравствуйте, Erick_Krause!
как вариант
randomize();
char buffer[100];
int cnt;
for (cnt = 0; cnt <100; cnt++)
buffer [cnt] = random(51); /* если требуется от 0 до 50 включительно, если от 1 до 50 то random(50)+1; */
Ответ отправил: PROD (статус: 4-ый класс)
Ответ отправлен: 16.08.2006, 15:17 Оценка за ответ: 4 Комментарий оценки: Всё понятно, кроме randomize()?
Отвечает: Ross
Здравствуйте, Erick_Krause!
Также могу посоветовать последний вариант. Функция randomize() нужна для смены рандома (чтобы случайные числа из раза в раз не повторялись)
Ответ отправил: Ross (статус: 1-ый класс)
Ответ отправлен: 17.08.2006, 01:58 Оценка за ответ: 4 Комментарий оценки: Теперь понятно зачем нужна футкция randomize()
Вопрос № 52.284
Уважаемые эксперты,
Хотелось бы прочитать по с/с++ какую нибудь *классическую книгу(- с таким же авторитетом, как у Кнута.)* Подскажите авторов и названия.
Заранее благодарен.
Отправлен: 16.08.2006, 08:38
Вопрос задал: Bubu (статус: Посетитель)
Всего ответов: 5 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Saw
Здравствуйте, Bubu!
Я бы посоветовал прочитать книги от самого Бьярна Страустрапа, вот тут можно их взять:
http://lib.ru/CPPHB/cppref.txt
http://www.citforum.ru/programming/cpp/aglav.shtml
Ответ отправил: Saw (статус: 3-ий класс)
Ответ отправлен: 16.08.2006, 09:26
Отвечает: Sergijj
Здравствуйте, Bubu!
Программист без Кнута - не настоящий программист!...:)
По С++ (STL) рекомендую пару:
1. Доктор Бьерн Страуструп, "Язык программирования C++" - первое издание легко найти в сети.
2. Скотт Майерс, "Effective STL" (Как на русский название перевели - не помню, кажется "Эффективное программирование STL") - видел только в бумажном виде; но очень рекомендую, особенно в связке со Страуструпом.
Также, если Вам уже знаком С/С++, рекомендую того же Скотта Майерса:
1. Скотт Майерс, "Effective C++"
2. Скотт Майерс, "More effective C++"
Если же не особо знакомы, то рекомендую сначала почитать либо стандарт языка С Кердигана и Ритчи, либо (лучше) Касаткин, "От С до Borland C++" из серии "Библиотека системного программиста" (3 тома, в первом томе соавтор - Вольвачёв) - великолепная книга, но достать очень сложно и видел я её только в бумажном виде.
--------- Стучитесь! И Вас откопают...
Ответ отправил: Sergijj (статус: 4-ый класс)
Ответ отправлен: 16.08.2006, 09:40
Отвечает: gitter
Здравствуйте, Bubu!
В дополнение в предыдущим книгам, рекомендую по С книгу ЯЗЫК С
Б.В. Керниган, Д.М. Ритчи. Её можно найти, например, здесь
Удачи!
Ответ отправил: gitter (статус: Студент)
Ответ отправлен: 16.08.2006, 09:50
Отвечает: Mihasic
Здравствуйте, Bubu!
Если Вы новичок, то рекомендую начинать с чего-то наиболее полного и понятного, например Герберт Шилдт "Полный справочник по C++". По крайней мере после него можно нормально (с пониманием) читать стандарты и книги Бьерна Страуструпа (создателя языка C++).
В качестве второго этапа, рекомендую книгу Джефа Элджера "C++ для професионалов".
Вообще есть много хороших книг, но с этих начинал я, а дальше уже идет опыт, иногда, подчитывание еще чего-нибудь. Самое лучшее обучение, это на практике, т.е. надо самому периодически писать что-то.
Ответ отправил: Mihasic (статус: 5-ый класс)
Ответ отправлен: 16.08.2006, 11:36
Отвечает: Vaga
Здравствуйте, Bubu!
Во-первых, что-нибудь от Б.Страустрапа.
George Shepherd with David Kruglinsky. Programming with Microsoft(r) Visual C++.Net
Б.В.Керниган, Д.М.Ричи. Язык С.
Ален И. Голуб. Правила программирования на Си и Си++.
--------- Вольному - воля
Ответ отправил: Vaga (статус: 1-ый класс)
Ответ отправлен: 16.08.2006, 17:29
Вопрос № 52.295
Доброго всем времени суток!
Не могли бы объяснить разницу между int и int*, char и char*, и т. д.
Отвечает: Saw
Здравствуйте, Долгавин Алексей Сергеевич!
int это целочисленный тип, (т.е. переменные с таким типом могут хранить только целочисленные значения), а int* это тип - указатель на целочисленное значение, т.е. в переменной с таким типом будет хранится указатель на некоторе целое число.
Например:
int a = 5; // целочисленная переменная
int* pointer; // указатель на int
pointer = &a; // (& - операция взятия адреса, нам это нужно для указателя)
*pointer = 0; // теперь a равна 0
тоже самое касается и типов char, char*, только char хранит обычно меньшие целые числа (или код символа, но сути это не меняет) чем int (обычно char это 1 байт т.е. для беззнаковых переменных это 0..255)
Ответ отправил: Saw (статус: 3-ий класс)
Ответ отправлен: 16.08.2006, 10:13
Отвечает: gitter
Здравствуйте, Долгавин Алексей Сергеевич!
Покажу на примере:
int a=10; //объявление целого числа
int* b; //объявление указателя на целое число
b=&a;// теперь в b храниться адрес переменной a, т.е. указывает на то место в памяти где расположено значение переменной a
int* c; // объявление массива целых чисел
c=new int[100];//массив из 100 элементов
int d[3]={1,2,3};
int* e=&d;//переменная e указывает на первый элемент массива d, т.е. e[0]==d[0], e[1]==d[1], e[2]==d[2]
вместо int можно подставить любой тип.
Удачи!
Ответ отправил: gitter (статус: Студент)
Ответ отправлен: 16.08.2006, 10:16
Отвечает: Sergijj
Здравствуйте, Долгавин Алексей Сергеевич!
int - Это целочисленные данные, находящиеся в памяти (занимающие в памяти 2-4 байт, в зависимости от используемой платформы);
*int - Это указатель на целочисленные данные, находящиеся в оперативной памяти.
Например:
unsigned int i = 0;// Объявлена переменная i, которая является целым, беззнаковым числом
unsigned int *ptri = &i;// Объявлен указатель на переменную i, целого беззнакового численного типа, где "&" - операция взятия адреса в памяти переменной i
Итого, * - обозначает УКАЗАТЕЛЬ НА ДАННЫЕ, а не сами данные.
Например, чтобы записать в переменную i значение 5, нужно сделать так:
i = 5;// Это прямое присваивание значения 5 переменной i
*ptri = 5;// Присваивание переменной i значения 5 через указатель; Эту запись нужно расшифровывать так: значению, лежащему в памяти по указателю ptri присвоить 5; т.е., в данном случае, * - является синонимом слов "значению, лежащему по указателю..."
Чтобы получить значение i, нужно:
unsigned int x = i;// Просто присваиваем вновь объявленной переменной x значение переменной i
unsigned int x = *ptri;// Переменной x присваиваем значение в памяти, лежащее по указателю ptri (а так как указатель у нас указывает на i (unsigned int *ptri = &i), то в переменную x загрузится значение переменной i)
С char и char* всё то же самое: char - это тип данных (однобайтовое целое или символ), лежащих в памяти, а char* - это указатель на символьные данные, которые лежат в памяти по адресу, на который указывает char*.
Например:
#include <stdio.h>
const char constString[] = "Test string";// Это символьный массив-константа (массив из символов = строка)
printf("
%s", constString);// Это вывод этой строки; %s - это значит мы должны в параметрах дать _указатель_ на строку, мы его и даём, так как _массив_ в язке С/С++ и _является_указателем_!!!
Т.е., вышеприведённый фрагмент эквивалентен такому фрагменту:
#include <stdio.h>
const char constString[] = "Test string";
const char *str = &constString[0];// В указатель str мы пихаем адрес первого элемента массива constString
printf("
%s", str);// Вывод той же самой строки
char *s;
char c = 't';
s = (char *) str;// Или...
s = &((char *) constString[0]);
s[0] = c;// Заменили первую букву в строке на строчную (вместо прописной)...:)
c = ++s;// В переменную c записали _вторую_ букву строки, т.е. сейчас в переменной c буква 'e', а s указывает не на начало строки, а на её _вторую_ букву!
--------- Стучитесь! И Вас откопают...
Ответ отправил: Sergijj (статус: 4-ый класс)
Ответ отправлен: 16.08.2006, 10:19
Отвечает: Mihasic
Здравствуйте, Долгавин Алексей Сергеевич!
Вообще тема указателей довольно обширная. Есть типизированные и не типизированные указатели:
void *p; // не типизированный
type *p; // типизированный (вместо type - любой тип, кроме void, как встроенный, так и пользовательский)
Далее про типизированные.
Чтобы присвоить указателю какой-то адрес, можно делать так:
type t;
type *pt = &t; // (унарный оператор & - взятие адреса)
Также при помощи указателей можно адресовать массивы:
type x;
type t[10];
type *pt;
pt = t; // на первый элемент
pt = &t[5]; // на шестой элемент
pt++; // на седьмой элемент
*pt = x; // присваиваем седьмому элементу значение x (для type должен присутствовать оператор присваивания)
pt -= 4; // на 4 позиции назад (pt == &t[2])
Также при помощи указателей можно обращаться к полям и методам указываемой структуры или класса через оператор -> (вместо .)
Вообще неплохо бы взять какую-то книжку по C++ и прочитать про указатели.
Ответ отправил: Mihasic (статус: 5-ый класс)
Ответ отправлен: 16.08.2006, 11:26
Отвечает: Шальков Павел Владимирович
Здравствуйте, Долгавин Алексей Сергеевич!
Со звездочкой - это указатели на области памяти, содеражащие значения указанного типа.
Отвечает: Vaga
Здравствуйте, Долгавин Алексей Сергеевич!
http://www.codeproject.com/cpp/pointers.asp по этому поводу.
--------- Вольному - воля
Ответ отправил: Vaga (статус: 1-ый класс)
Ответ отправлен: 16.08.2006, 17:41
Отвечает: C4tnt
Здравствуйте, Долгавин Алексей Сергеевич!
Маленькое дополнение касательно размеров переменных:
Указатель - тоже переменная, которая хранит вполне определённого вида число
В частности на IBM-PC с 32 разрядной архитектурой указатель - это закамуфлированный
long. Длинну указателя в байтах можно узнать так: int* x;cout<<sizeof(x);
В итоге получаем:
int - 2 байта со знаком
char - 1 байт без знака
int* - 4 байта
char* - 4 байта
Эти размеры могут менятся от платформы к платформе!
Например на 64 разрядных процессорах указатели могут стать 8-байтовыми.
--------- Лозунг???
Ответ отправил: C4tnt (статус: 1-ый класс)
Ответ отправлен: 16.08.2006, 21:51
Отвечает: Селиванов Александр Владимирович
Здравствуйте, Долгавин Алексей Сергеевич!
звёздочка означает указатель.
т.е.:
"int a" говорит о том, что переменная "a" целого типа;
"int* a" говорит о том, что переменная "a" содержит указатель (адрес памяти) где хранится целое число. в этом случае под "a" необходимо, прежде чем использовать, выделить память...
например:
int* a; // объявляем
a = new int; // выделяем память
*a = 7; // по адресу из "a" заносим число 7
delete a; // освобождаем память;
ещё вот такой пример:
int a; // переменная
int *b; // указатель
b = new int; // выделяем память
scanf("%i", &a); // считать в "a" челое число (нужно в "scanf" давать адрес переменной - &a означает взятие адреса переменной "а")
scanf("%i", b); // в этом случае адрес брать не нужно, т.к. "b" - указатель (адрес)
delete b; // удаляем
a = 5;
b = &a; // в "b" заносим указатель на "a"
*b = 7; // по адресу из "b" заносим 7 - теперь и "a" равно 7, т.к. "b" указывает на ячейку памяти, где хранится "a"
с "char" ситуация аналогичная, только это не целый тип, а символьный
Отвечает: gitter
Здравствуйте, Talibov Natik Axmedovic!
Это потому что переменная j не проинициализирована.
Удачи!
Ответ отправил: gitter (статус: Студент)
Ответ отправлен: 16.08.2006, 11:50
Отвечает: Mihasic
Здравствуйте, Talibov Natik Axmedovic!
Просто мусор в памяти.
В реальных программах нужно всегда заботится об инициализации переменной до ее использования, чтобы не получать непредсказуемых результатов при работе с ней.
Ответ отправил: Mihasic (статус: 5-ый класс)
Ответ отправлен: 16.08.2006, 11:55
Отвечает: Шинтяков Дмитрий Васильевич / Ratson
Здравствуйте, Talibov Natik Axmedovic!
Вам следует внимательнее читать книжку, по которой вы учите С++.
Запомните: в С++ (и в С) переменные простых типов НЕ ИНИЦИАЛИЗИРУЮТСЯ. (Так селано потому, что на инициализацию требуется время, пусть и минимальное)
Это значит, что в переменной оказывается то значение, которое случайно окзалось в той ячейке памяти, которая под неё отведена. Так что могло получиься и -200, и 65536, вообще что угодно.
Кстати, обратите внимание - ваш компилятор наверняка заругался на то, что вы используете неинициализированную переменную.
Отвечает: Виктор Пырлик
Здравствуйте, Talibov Natik Axmedovic!
Один из вариантов - посмотреть чужой "мусор", "грохнуть" собственный процесс, получить "случайное" число(!!!). и т.д.
Поэтому, неинициализированная переменная - иногда нужная вещь...
--------- Не результат важен, процесс есть двигатель всего!
Ответ отправил: Виктор Пырлик (статус: 2-ой класс)
Ответ отправлен: 16.08.2006, 14:17
Отвечает: Шальков Павел Владимирович
Здравствуйте, Talibov Natik Axmedovic!
Так как переменная i была объявлена, но не проинициализирована, то ее значение может быть абсолютно любым, тем, что хранится в памяти по ее адресу. Поэтому результат может быть не только 2, но и что-нибудь другое.
Здравствуйте эксперты.
У меня проблема : может не совсем сюда но программу я буду писать на C++ =) для исправления этой проблемы !
Я пытаюсь поставить на ноутбук драйвера для принтера HP
Драйвера ставятся вместе с программой .
Программа требует частоту процессора ~233Mhz на ноутбуке 1200Mhz
Вообшем как мне обмануть или хотябы как Windows определяет частоту процессора ?
Реестр не предлагать =) Уже меняли не вышло !
Я понял что программа сверяется по 3 числам и думает что у меня 200 Mhz и не хочет ставится =(
Помогите …
С уважением,
Zmeu =) .
Отвечает: Vaga
Здравствуйте, Tamashev Denis M!
Думаю, что если мешает программа, то надо от нее избавиться. Поищите драйвера для вашего принтера на www.hp.com.
--------- Вольному - воля
Ответ отправил: Vaga (статус: 1-ый класс)
Ответ отправлен: 16.08.2006, 23:28 Оценка за ответ: 3 Комментарий оценки: Думаю я не задавал бы вопрос если она мне была не нужна ! Я ждал более интересного ответа чем избавится от программы на приме подредактировать Какой то файл или ещё что-то ! Спасибо . С уважением, Zmeu.