Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 501
от 21.08.2006, 21:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 360, Экспертов: 57
В номере:Вопросов: 6, Ответов: 29


Вопрос № 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
Здравствуйте, KuchumHan!
vs2002 - vc++ 6, vs2003.net - vc++ 7
Ответ отправил: 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 .
Заранее спасибо!
Отправлен: 16.08.2006, 08:34
Вопрос задал: Erick_Krause (статус: Посетитель)
Всего ответов: 7
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Шальков Павел Владимирович
Здравствуйте, 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*, и т. д.
Отправлен: 16.08.2006, 09:46
Вопрос задал: Долгавин Алексей Сергеевич (статус: 1-ый класс)
Всего ответов: 8
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: 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

Отвечает: Шальков Павел Владимирович
Здравствуйте, Долгавин Алексей Сергеевич!
Со звездочкой - это указатели на области памяти, содеражащие значения указанного типа.
Ответ отправил: Шальков Павел Владимирович (статус: 6-ой класс)
Ответ отправлен: 16.08.2006, 16:10

Отвечает: 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" ситуация аналогичная, только это не целый тип, а символьный
Ответ отправил: Селиванов Александр Владимирович (статус: 2-ой класс)
Ответ отправлен: 17.08.2006, 06:32


Вопрос № 52.309
Uvajaemi eksperti pomagite

#include<iostream.h>
#include<conio.h>
using namespace std;

int main()
{
int j;

cout<<"j Raven: "<<j;

getch();

returen 0;
}

rezultat rave
""j Raven: 2""

Vopros a 2 otkuda v zalas?????
Отправлен: 16.08.2006, 11:43
Вопрос задал: Talibov Natik Axmedovic (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: 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, вообще что угодно.

Кстати, обратите внимание - ваш компилятор наверняка заругался на то, что вы используете неинициализированную переменную.
Ответ отправил: Шинтяков Дмитрий Васильевич / Ratson (статус: 1-ый класс)
Ответ отправлен: 16.08.2006, 12:49

Отвечает: Виктор Пырлик
Здравствуйте, Talibov Natik Axmedovic!
Один из вариантов - посмотреть чужой "мусор", "грохнуть" собственный процесс, получить "случайное" число(!!!). и т.д.
Поэтому, неинициализированная переменная - иногда нужная вещь...
---------
Не результат важен, процесс есть двигатель всего!
Ответ отправил: Виктор Пырлик (статус: 2-ой класс)
Ответ отправлен: 16.08.2006, 14:17

Отвечает: Шальков Павел Владимирович
Здравствуйте, Talibov Natik Axmedovic!
Так как переменная i была объявлена, но не проинициализирована, то ее значение может быть абсолютно любым, тем, что хранится в памяти по ее адресу. Поэтому результат может быть не только 2, но и что-нибудь другое.
Ответ отправил: Шальков Павел Владимирович (статус: 6-ой класс)
Ответ отправлен: 16.08.2006, 16:16


Вопрос № 52.350
Здравствуйте эксперты.
У меня проблема : может не совсем сюда но программу я буду писать на C++ =) для исправления этой проблемы !
Я пытаюсь поставить на ноутбук драйвера для принтера HP
Драйвера ставятся вместе с программой .
Программа требует частоту процессора ~233Mhz на ноутбуке 1200Mhz
Вообшем как мне обмануть или хотябы как Windows определяет частоту процессора ?
Реестр не предлагать =) Уже меняли не вышло !
Я понял что программа сверяется по 3 числам и думает что у меня 200 Mhz и не хочет ставится =(
Помогите …
С уважением,
Zmeu =) .
Отправлен: 16.08.2006, 17:55
Вопрос задал: Tamashev Denis M (статус: 2-ой класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Vaga
Здравствуйте, Tamashev Denis M!
Думаю, что если мешает программа, то надо от нее избавиться. Поищите драйвера для вашего принтера на www.hp.com.
---------
Вольному - воля
Ответ отправил: Vaga (статус: 1-ый класс)
Ответ отправлен: 16.08.2006, 23:28
Оценка за ответ: 3
Комментарий оценки:
Думаю я не задавал бы вопрос если она мне была не нужна !
Я ждал более интересного ответа чем избавится от программы на приме подредактировать
Какой то файл или ещё что-то !
Спасибо .
С уважением,
Zmeu.


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.35 от 27.07.2006
Яндекс Rambler's Top100

В избранное