Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Одномерные динамические массивы. Хочу разобраться в коде. 
V
    Опции темы
max29
Дата 7.5.2016, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 16.4.2016

Репутация: нет
Всего: нет



Вот программа:
Код

    int n;
    cout<<"Vvedite kol-vo elementov";
    cin>>n;
    int i, ineg;
    float sum, *a=new float[n];
    cout<<"Vvedite elementi massiva"<<endl;
    for(i=0; i<n; i++)cin>>a[i];
    for(i=0; i<n; i++)
        if ( a[n] < 0 )ineg=i;
    for(sum=0; i=ineg+1; i<n, i++)
        sum += a[n];
    cout<<"Summa :"<<sum<<endl;
    system("pause");
    return 0;


У меня пару вопросов: что делает код на строке 5(т.е. в чём смысл присваивать значению по адресу "а"----- (new float[n]) когда самому (new float[n]-у) ничего не присваивается если ошибаюсь поправьте меня). И почему программа не работает как надо?
что не так написано? Желательно наглядно показать в правильном виде программы. Буду благодарен.

Вот задача по этой программе: 
Написать прог-му. для вещественного массива из (n) элементов определяющую сумму его элементов расположенных правее последнего отрицательного элемента.

 smile 

Это сообщение отредактировал(а) max29 - 7.5.2016, 13:26
PM MAIL   Вверх
feodorv
Дата 7.5.2016, 13:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(max29 @  7.5.2016,  13:13 Найти цитируемый пост)
т.е. в чём смысл присваивать значению по адресу "а"

"a" присваивается адрес массива (n значений типа float).
Надеюсь, так будет более понятно:
Код
float *a;
a = new float[n];



Цитата(max29 @  7.5.2016,  13:13 Найти цитируемый пост)
когда самому (new float[n]-у) ничего не присваивается

В каком смысле? При выделении памяти (то есть new) сама выделяемая память (float[n]) редко когда инициализируется какими-либо значениями. Но вот позже в коде элементам массива присваиваются значения, считанные со стандартного ввода:
Цитата(max29 @  7.5.2016,  13:13 Найти цитируемый пост)
    for(i=0; i<n; i++)cin>>a[i];
Итого: имеем выделенный массив с инициализированными элементами. Чудненько же)))


Цитата(max29 @  7.5.2016,  13:13 Найти цитируемый пост)
И почему программа не работает как надо?
Обычно это означает ошибки в программе. Ну, например, переменная ineg не инициализирована при объявлении:
Цитата(max29 @  7.5.2016,  13:13 Найти цитируемый пост)
    int i, ineg;
Далее ей присваивается значение только в том случае, ести во введённом с клавиатуры массиве значений есть отрицательная величина:
Цитата(max29 @  7.5.2016,  13:13 Найти цитируемый пост)
    for(i=0; i<n; i++)
        if ( a[n] < 0 )ineg=i;
А если таковой нет? Чему тогда равно значение ineg? Какому-то мусору... Как после этого делать дальнейшее суммирование?
Цитата(max29 @  7.5.2016,  13:13 Найти цитируемый пост)
    for(sum=0; i=ineg+1; i<n, i++)
        sum += a[n];



Более того, в момент определения значения ineg отсутствует выход из цикла. В результате, вместо того, чтобы определить индекс первого отрицательного значения в массиве, определяется индекс последнего отрицательного значения (если такой, конечно, существует; если нет, то значение ineg остаётся неопределенным). Хотя задачу Вы не сформулировали, может быть, нужен как раз последний отрицательный элемент, кто знает. А ещё там в двух местах стоит a[n], а не a[i]. А ещё не проинициализирована сумма sum. Итого:
Цитата(max29 @  7.5.2016,  13:13 Найти цитируемый пост)
    int n;
    cout<<"Vvedite kol-vo elementov";
    cin>>n;
    int i, ineg;
    float sum = 0, *a=new float[n];
    cout<<"Vvedite elementi massiva"<<endl;
    for(i=0; i<n; i++)cin>>a[i];
    ineg = n; // зависит от задачи
    for(i=0; i<n; i++)
        if ( a[ i ] < 0 ){ ineg=i; break; }
    for(sum=0; i=ineg+1; i<n, i++)
        sum += a[ i ];
    cout<<"Summa :"<<sum<<endl;
    system("pause");
    return 0;



И всё же, три прохода по массиву делать не обязательно (первый - при вводе, второй - при определении ineg, третий - при суммировании).


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
max29
Дата 7.5.2016, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 16.4.2016

Репутация: нет
Всего: нет



Благодарю за ответ.
Вы объяснили мне но !..... Меня всё же смущает строка 5, а зачем надо присваивать  "а" адрес массива? (т.е. по адресу "а" присвоить массив с "n" значениями так?)
Или вместе с адресом,----"а"----присваивается и значение находящиеся по этому адресу?

Это сообщение отредактировал(а) max29 - 7.5.2016, 15:41
PM MAIL   Вверх
feodorv
Дата 7.5.2016, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(max29 @  7.5.2016,  13:54 Найти цитируемый пост)
т.е. по адресу "а" присвоить массив с "n" значениями так?

Нет)))

Объявляется переменная типа указатель на float:
Цитата(feodorv @  7.5.2016,  13:40 Найти цитируемый пост)
float *a;
И уже этой переменной присваивается адрес выделенного в памяти процесса массива из n элементов:
Цитата(feodorv @  7.5.2016,  13:40 Найти цитируемый пост)
a = new float[n];
Когда объявление переменной объединяется с присваиванием, получается инициализация:
Цитата(max29 @  7.5.2016,  13:13 Найти цитируемый пост)
float *a=new float[n];
Здесь совсем нет такого:
Код
float *a;
*a = new float[n];
 smile 



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
max29
Дата 7.5.2016, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 16.4.2016

Репутация: нет
Всего: нет



Кажись понял   smile 

Это сообщение отредактировал(а) max29 - 7.5.2016, 15:54
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0695 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.