Форум программистов, компьютерный форум CyberForum.ru

cout - C++

Восстановить пароль Регистрация
 
androidos
 Аватар для androidos
29 / 27 / 1
Регистрация: 07.07.2011
Сообщений: 744
13.09.2011, 06:58     cout #1
Всем привет!
В С++ не силён особо, такой вопрос.
Дан массив, все элементы, которые больше 10, заменить на их квадратный корень. Это ок - заменяет. При распечатке печатает массив с заменённым элементом [2 4 5 4 2 4], но и распечатывает такую фигню
C++
1
2.63551e-308 2.63532e-308 4.18301e+137 2.63531e-308 1.47923e-305 2.63544e-308
:
Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
double arr2[]={2.0,4.0,5.0,16.0,2.0,4.0};
    double length2=sizeof(arr2)/sizeof(0);
    for(int i = 0; i<length2; i++)
    {
        if(arr2[i]>10)
        {
            arr2[i] = sqrt(arr2[i]);
            //cout << arr2[i];
            //cout << endl;
 
        }
        
        cout << arr2[i] << "\t";
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.09.2011, 06:58     cout
Посмотрите здесь:

cout vs. std::cout C++
C++ cout
[C++] cout От A до Z и от 0 до 9 C++
C++ new cout
cout C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
13.09.2011, 07:37     cout #2
Цитата Сообщение от androidos Посмотреть сообщение
double length2=sizeof(arr2)/sizeof(0);
Эта строчка что по Вашему значит?
androidos
 Аватар для androidos
29 / 27 / 1
Регистрация: 07.07.2011
Сообщений: 744
13.09.2011, 07:42  [ТС]     cout #3
Длина массива

Добавлено через 40 секунд
аа...ёмое...Ща проверю, может понял

Добавлено через 1 минуту
не знаю тогда, ну длина в инт должна быть
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
13.09.2011, 08:12     cout #4
androidos, правильно записать так:
C++
1
int length = sizeof(arr)/sizeof(double);
Длина не может быть дробным числом. sizeof(0) - это sizeof(int), то есть количество элементов в массиве определяется неправильно, отсюда и выводящийся в консоль мусор. Надо брать отношение от размера всего массива к размеру одного элемента массива. Отсюда три возможных варианта записи:
C++
1
2
3
sizeof(arr)/sizeof(T);
sizeof(arr)/sizeof(*arr);
sizeof(arr)/sizeof(arr[0]);
, где `T' - произвольный тип. Эти записи унимверсальны.
Конкретно в данном случае можно также записать:
C++
1
double length = sizeof(arr)/sizeof(.0);
, так как .0 - это тип double.
androidos
 Аватар для androidos
29 / 27 / 1
Регистрация: 07.07.2011
Сообщений: 744
13.09.2011, 08:30  [ТС]     cout #5
Спасибо, работает. Вообще конструкция для меня новая. в шарпе и на ява там проще, просто в цикле length указываешь и всё ок, а здесь по-новому всё. Если не трудно, помогите разобрать эту строку:
C++
1
int length2 = sizeof(arr2)/sizeof(double);
int length2 = переменная, которая хранит длину
sizeof(arr2) = значит вытащить длину с этого массива, вроде как
sizeof(double) = этот параметр не особо понятен???
До этого делал примерчик маленький:
C++
1
int length = sizeof(arr1)/sizeof(0); //uznaem dlinu massiva
Здесь sizeof(0) - имеется ввиду, что с нулевого элемента как я понял, а в Вашем предложенном варианте мы пишем DOUBLE там(т.е. по идее можно поставить вместо DOUBLE 0.0 ?)...Небольшая путаница, если можно, то ещё раз проясните ситуацию
dihlofos
Бродяга
 Аватар для dihlofos
302 / 256 / 17
Регистрация: 27.08.2010
Сообщений: 553
13.09.2011, 09:03     cout #6
sizeof - возвращает размер в байтах

sizeof(arr2) = количество байтов, занимаемых массивом с именем arr2
sizeof(double) = количество байтов, занимаемых переменной типа double

Размер всего массива делим на размер одного элемента, находим количество элементов в массиве.

Добавлено через 4 минуты
Цитата Сообщение от androidos Посмотреть сообщение
Здесь sizeof(0) - имеется ввиду, что с нулевого элемента как я понял, а в Вашем предложенном варианте мы пишем DOUBLE там(т.е. по идее можно поставить вместо DOUBLE 0.0 ?)...Небольшая путаница, если можно, то ещё раз проясните ситуацию
В качестве аргумента sizeof можно указать переменную или тип данных. Т.е.
sizeof(.0) или sizeof(3.56) или sizeof(double) вернут одно и то же...
androidos
 Аватар для androidos
29 / 27 / 1
Регистрация: 07.07.2011
Сообщений: 744
13.09.2011, 09:06  [ТС]     cout #7
Спасибо, попробую переварить всё это...Может не так всё и сложно
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
13.09.2011, 10:11     cout #8
Цитата Сообщение от androidos Посмотреть сообщение
Может не так всё и сложно
Слушайте. Как уже сказал господин dihlofos sizeof возвращает размер объекта в байтах. Размер int в байтах равен 4.
C
1
2
int arr[5];
int bytes = sizeof(arr);
Следовательно переменная bytes равна 20. То есть 5 элементов по 4 байта. Согласно простой арифметике, чтобы узнать количество элементов в массиве необходимо общее количество байт разделить на количество байт в одном элементе, то есть либо на sizeof(int) - так как элементом массива является переменная типа int, либо на sizeof(arr[0]) - через обращение непосредственно к элементу массива. Для всех остальных типов тоже самое...
Рассмотрим на вашем примере с double.
Размер double в большинстве случаев 8 байт. То есть размер массива double в байтах из 10 элементов равен 80 байт. При применении конструкции sizeof(arr)/sizeof(0) получается результат отличный от ожидаемого. В данном случае `0' является литеральной константой типа int (по умолчанию в языках С/С++). Поэтому выражение раскрывается в sizeof(arr)/sizeof(int) = 80/4, что равно 20. Хотя ожидаемый размер это 10. Если написать sizeof(0.0), то литеральная константа `0.0' (или .0 или 0. что равнозначно) имеет тип double (по умолчанию в языках С/С++). Выражение раскрывается в sizeof(arr)/sizeof(double) = 80/8 и равно 10. Что нам и требовалось.
Цитата Сообщение от androidos Посмотреть сообщение
Здесь sizeof(0) - имеется ввиду, что с нулевого элемента как я понял
Неверно, sizeof является независимым оператором и возвращает размер переданного ему объекта в байтах.
Цитата Сообщение от androidos Посмотреть сообщение
Вообще конструкция для меня новая. в шарпе и на ява там проще, просто в цикле length указываешь и всё ок, а здесь по-новому всё
Для обеспечения подобного поведения в C++ существует классы, в том числе входящие в комплект стандартной библиотеки STL. Аналогом простого массива является класс std::vector.
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <vector>
 
int main() {
    std::vector<int> v(10, 1);
 
    std::cout << "vector's length: " << v.size() << std::endl;
    for (int i = 0; i < v.size(); ++i)
        std::cout << v[i] << ' ';
 }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.09.2011, 10:18     cout
Еще ссылки по теме:

почему то не переводит на другую строку cout << "введенный пункт назначения:" << a[i].pn << ' ' ; cout << "введенный пункт назначения:" << a[i].num C++
cout.setf и cout.precision C++
В чем разница std::cout и просто cout? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
androidos
 Аватар для androidos
29 / 27 / 1
Регистрация: 07.07.2011
Сообщений: 744
13.09.2011, 10:18  [ТС]     cout #9
Спасибо, позновательно. Попробую с вектором поэкспериментировать
Yandex
Объявления
13.09.2011, 10:18     cout
Ответ Создать тему
Опции темы

Текущее время: 14:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru