Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2011, 01:34   #1
Sadist989
Пользователь
 
Аватар для Sadist989
 
Регистрация: 12.08.2010
Сообщений: 14
Вопрос Массивы

Учусь я программировать на C++ и читаю я книгу "C++ без страха" и при изучении массивов там есть написанная программа под названиям "На сколько случайное является число является случайным?" вот собственно и код этой программы:
Код:
#include "stdafx.h"
#include "iostream"
#include "math.h"
#include "time.h"
using namespace std;

int rand_0toN1 (int n);
int hits[10];

int main () {
	int i, n, r;
	srand(time(NULL)); // Установка начального числа для генерации случайных чисел.
	cout << "Enter number of trials to run and press Enter: ";
	cin >> n;
	// Выполнить n попыток. Для каждой попытки получить число от 0 до 9,
	// после чего инкрементировать соответствующий элемент в массиве hits.
	for (i = 1; i <= n; i++) {
		r = rand_0toN1(10);
		hits[r]++;
	}
	// Напечатать все эелементы массива hits, вместе 
	// с отношением между попаданиями и ОЖИДАЕМЫМИ попаданиями (n / 10)
	for (i = 0; i < 10; i++) {
		cout << i << ": " << hits[i] << " Accuracy: ";
		cout << static_cast<double>(hits[i]) / (n / 10) << endl;
	}
	return 0;
}

// Функция Random 0-to-N1.
// Генерирует случайное целое число в диапазоне от 0 до N - 1.
int rand_0toN1 (int n) {
	return rand() % n;
}
и у меня возник один вопрос по по поводу этой программы, я не совсем понимаю что делает этот кусок кода:
Код:
for (i = 1; i <= n; i++) {
    r = rand_0toN1(10);
    hits[r]++; вот что это делает?
}
Какой элемент инкрементирует, если у нас элементы массива не объявлены? Или я что то не так понимаю как надо
Помогите разобратся пожалуйста, напишите какое то обяснение
Sadist989 вне форума Ответить с цитированием
Старый 28.05.2011, 04:27   #2
Mahin
Пользователь
 
Регистрация: 18.11.2009
Сообщений: 39
По умолчанию

при объявлении int hits[10] в памяти выделилось 10 фрагментов по 2 байта, в каждый из них сразу вносится значение 0

Последний раз редактировалось Mahin; 28.05.2011 в 05:07.
Mahin вне форума Ответить с цитированием
Старый 28.05.2011, 10:58   #3
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от Mahin Посмотреть сообщение
при объявлении int hits[10] в памяти выделилось 10 фрагментов по 2 байта, в каждый из них сразу вносится значение 0
Не правда.

Во-первых, какой именно размер типа int - неизвестно. На большинстве современных платформ - 4 байта. Но это не важно

Во-вторых, при объявлении массива память заполняется случайными величинами, так называемым "машинным мусором", и ничего не обнуляется. Вот эти случайные величины автор и инкрементит.
Подход, надо сказать, весьма странный, обычно работа с мусором никогда не производится, я бы так не стал делать во всяком случаи
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 28.05.2011, 13:33   #4
Sadist989
Пользователь
 
Аватар для Sadist989
 
Регистрация: 12.08.2010
Сообщений: 14
По умолчанию

Нет все правильно написано и работает, а при объявлении массива все элементы массива инициализируются 0, потому что массив объявлен глобально, так сказать не в функции, если он был бы объявлен в функции тогда все элементы массива были бы "мусором".

Вы мне пожалуйста поконкретнее ответьте на вопрос...
Sadist989 вне форума Ответить с цитированием
Старый 28.05.2011, 20:33   #5
Mahin
Пользователь
 
Регистрация: 18.11.2009
Сообщений: 39
По умолчанию

нифига не мусором, объяви массив и в мэйне выведи его без обработки, получишь заданное размером количество нулей. хотя, может это зависит от компилятора...
Mahin вне форума Ответить с цитированием
Старый 28.05.2011, 21:20   #6
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

ISO C++:
Цитата:
If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate.
Однако, POD-типы, объявленные глобально, действительно инициализируются нулями.
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 29.05.2011, 00:16   #7
Sadist989
Пользователь
 
Аватар для Sadist989
 
Регистрация: 12.08.2010
Сообщений: 14
По умолчанию

Столько профессионалов на форуме и не кто не может мне помочь, очень прошу потому что если я не буду знать как это работает у меня нет смысла читать дальше книгу.
____________
Помогите пожалуйста...
Sadist989 вне форума Ответить с цитированием
Старый 29.05.2011, 00:43   #8
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Да что вам не ясно? Я все объяснил в своем первом посте в этой теме. Единственное в чем ошибся - это в том, что массив изначально заполнен нулями, а не случайными величинами
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 29.05.2011, 00:59   #9
Sadist989
Пользователь
 
Аватар для Sadist989
 
Регистрация: 12.08.2010
Сообщений: 14
По умолчанию

for (i = 1; i <= n; i++) {
r = rand_0toN1(10);
hits[r]++; как оно работает не могу понять и все
}

Какой элемент инкрементирует, если у массива не объявлены элементы? hits[r(допустим сюда попало случайное число 7)] ++ - тогда что дальше он инкрементит?
Sadist989 вне форума Ответить с цитированием
Старый 29.05.2011, 01:21   #10
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Sadist989

Какой элемент инкрементирует

элемент с индексом r

у массива не объявлены элементы?

это бред. читай учебник по C++, раздел массивы.

hits[r(допустим сюда попало случайное число 7)] ++ - тогда что дальше он инкрементит?

если r превышает размер массивы - то случайную ячейку памяти.
Rififi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массивы cuba_35 Помощь студентам 1 12.11.2010 06:04
Динамические массивы и массивы варианты N@stya Помощь студентам 0 11.06.2010 21:09
С++, Массивы, динамические массивы. -Sunshine- Помощь студентам 1 19.04.2010 02:17
Даны одномерные массивы А и В. Сформировать массивы, состоящие из элемент LyaLya Помощь студентам 15 20.12.2009 14:12