Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Одномерные динамические массивы.


Автор: max29 7.5.2016, 13:13
Вот программа:
Код

    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 

Автор: feodorv 7.5.2016, 13:40
Цитата(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, третий - при суммировании).

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

Автор: feodorv 7.5.2016, 15:44
Цитата(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 

Автор: max29 7.5.2016, 15:53
Кажись понял   smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)