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

Не могу понять как работает программа - C++

Восстановить пароль Регистрация
 
VD17
 Аватар для VD17
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 17
06.02.2013, 15:02     Не могу понять как работает программа #1
Здравствуйте люди.Помогите понять как работают фнкции в программе(см. ниже). Учусь по книге Стефана Девидса С++ для чайников 4-е и 5-е издания читаю паралельно чтоб минимум ошибок было в коде.В частности не могу понять как работает функция sumArray( откуда взялся sizeOfArray)и функция displayArray что делает тоже не могу понять. Обьясните для чайников. Учил функции, но все равно не могу понять всего. В массиве inputValue используется индекс numberOfValue, а для чего и откуда индекс i, ведь его заменяет numberОfValue. Извините.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// ArrayDemo — демонстрирует использование
// массивов. Считывает последовательность
// целых чисел и отображает их по порядку
#include <stdio.h>
#include <conio.h>
#include <iostream>
 
using namespace std;
 
// объявления прототипов функций
int sumArray(int integerArray[], int sizeOfloatArray);
void displayArray(int integerArray[], int sizeOfloatArray);
int main(int nArg, char* pszArgs[])
{
// Описываем счетчик цикла
int nAccumulator = 0;
cout << "Эта программа суммирует числа,"
<< " введенные пользователем\п";
cout << "Цикл прерывается, когда"
<< " пользователь вводит"
<< " отрицательное число\n";
 
// Cохраняем числа в массиве
int inputValues[128];
int numberOfValues = 0;
for (numberOfValues = 0; numberOfValues < 128; numberOfValues++)
{
// ввод очередного числа
int integerValue;
cout << "Введите следующее число: ";
cin >> integerValue;
 
// если оно отрицательное...
if (integerValue < 0)
{
// ...тогда выходим из цикла
break;
}
// ...иначе сохраняем число в массиве
inputValues[numberOfValues] = integerValue;
}
// теперь выводим значения и их сумму
displayArray(inputValues, numberOfValues);
cout << "Сумма введенных чисел равна "
     << sumArray(inputValues, numberOfValues)
     << endl;
 
    // Пауза для того,чтобы посмотреть
    // на результат работы программы
    system("PAUSE");
    return 0;
}
// displayArray — отображает элементы массива
// integerArray длиной sizeOfloatArray
void displayArray(int integerArray[], int sizeOfArray)
{
cout << "В массиве хранятся"
     << " следующие значения:\n";
for (int i = 0; i < sizeOfArray; i++)
    {
         cout.width(3);
          cout  << i << ": " << integerArray[i] << endl;
     }
     cout << endl;
}
// sumArray — возвращает сумму элементов
// целочисленного массива
int sumArray(int integerArray[], int sizeOfArray)
{
       int accumulator = 0;
       for (int i = 0; i < sizeOfArray; i++)
       {
            accumulator += integerArray[i];
       }
       return accumulator;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
06.02.2013, 16:03     Не могу понять как работает программа #2
1) sizeOfArray у вас передаётся в функцию (int sumArray(int integerArray[], int sizeOfArray)) как внешний параметр, а туда он суётся в main, вызов - происходит здесь :
C++
1
2
3
cout << "Сумма введенных чисел равна "
     << sumArray(inputValues, numberOfValues)
     << endl;
и при входе в вункцию создаётся временная переменная sizеOfArray и туда помещается копия numberOfValues

2)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// displayArray — отображает элементы массива
// integerArray длиной sizeOfloatArray
void displayArray(int integerArray[], int sizeOfArray)
{
cout << "В массиве хранятся"
     << " следующие значения:\n";
for (int i = 0; i < sizeOfArray; i++)
    {
         cout.width(3);
          cout  << i << ": " << integerArray[i] << endl;
     }
     cout << endl;
}
как и написанно отображает на экран элементы массива
стоит цикл от начального элемента, до конца массива
cout.width(3); задаёт ширину потока (чтобы цифры хоть-как-то форматировались, а не сливались в едином экстазе)
cout << i << ": " << integerArray[i] << endl; - посылает в выходной поток сперва значение счётчика i (из инварианта цикла), потом значение элемента из массива с порядковым номером i, потом манипулятор endl, который сбрасывает буфер потока, выводит содержимое буфера в консоль и переводит строку

Добавлено через 5 минут
индекс numberOfValue
это не индекс, а число элементов в массиве
VD17
 Аватар для VD17
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 17
06.02.2013, 19:35  [ТС]     Не могу понять как работает программа #3
Большое спаcибо abit! Тяжелая задача для начинающего, но я понял благодаря вам. Большое спасибо.

Добавлено через 2 часа 26 минут
А зачем выполнять for (int i = 0; i < sizeOfArray; i++), в каждой функции ведь это уже сделано в функцие main() , это что то типа повтора итерации или как?

Добавлено через 14 минут
А зачем выполнять for (int i = 0; i < sizeOfArray; i++), в каждой функции ведь это уже сделано в функцие main() , это что то типа повтора итерации или как?
Ведь можно написать функцию вот так

C++
1
2
3
4
5
6
7
void displayArray (int integerArray, int sizeOfArray)
{
size
cout.width(3);
couth << sizeOfArray " : " <<  integerArray[i] << endl;
}
cout << endl;
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
06.02.2013, 21:36     Не могу понять как работает программа #4
Цитата Сообщение от VD17 Посмотреть сообщение
А зачем выполнять for (int i = 0; i < sizeOfArray; i++), в каждой функции ведь это уже сделано в функцие main() , это что то типа повтора итерации или как?
должно быть вы не поняли тему массивов и тему циклов... а я тут с вам о каких-то инвариантах цикла рассуждаю )))

смотрите... массив состоит из набора элементов, в вашем случае он определён как
C++
1
int inputValues[128];
эта строчка означает следующее - выделить память достаточную, чтобы хранить 128 элементов типа int, тип int - это по соглашению С++ целые числа (как отрицательные так и положительные), размер памяти для одного элемента int - зависит от конкретной среды С++, в обычных компьютерах на современных С++ средах обычно это 4 байта, соответственно эта строка означает зарезервировать 4*128 байт в памяти и вернуть указатель на начало этой области в переменную inputValues... все... т.е. по адресу inputValues[0] хранится первый элемент, по InputValues[1] - второй и т.д. до inputValuse[127]

здесь они выделили столько много памяти видимо, чтобы не посвящать вас в динамически-распределяемую память, считают что 128 элеметнов хватит на любой случай

далее...

sizeOfArray - это, подчеркну!!!, количество РЕАЛЬНО забитых элементов... т.е. явно предполагается не все 128 забьёте

а теперь переходим к вашему вопросу

C++
1
 for (int i = 0; i < sizeOfArray; i++)
для этого разберём что это значит...
здесь через int i = 0 содаётся временная локальная переменная под именем i, в которую передаётся значение 0, сразу после выполнения цикла переменная i будет уничтожена, и больше к ней не обратиться... вообще... далее на каждой итерации цикла i прибавляется на единицу, до тех пор пока i не будет равно sizeOfArray (что это такое, написал выше)
это относительно этой строки

зачем это делается?
чтобы перебрать все доступные элементы в массиве, но просто так перебирать - понятно смысла нет, поэтому основная цель - выполнить над ними (элементами массива) какие-то действия...

в первом случае :
C++
1
2
3
4
5
6
for (int i = 0; i < sizeOfArray; i++)
    {
         cout.width(3);
          cout  << i << ": " << integerArray[i] << endl;
     }
     cout << endl;
выполняется действие (cout << i << ": " << integerArray[i] << endl, которое выводит поэлементно все элементы в консоль

во втором случае
C++
1
accumulator += integerArray[i];
находится сумма всех элементов (так же поэлементно обходится массив и каждый элемент суммируется в accumulator, i после цикла, каждый раз разрушается, напоминаю...

теперь поглядим на ваш вопрос
C++
1
couth << sizeOfArray " : " <<  integerArray[i] << endl;
во первых не couth а cout

но не суть)
эта строчка означает одно -
послать в поток вывода КОЛИЧЕСТВО ЭЛЕМЕНТОВ (sizeOfArray), затем знак :, затем ОДИН элемент этого массива с несуществующим индексом (i в этом контексте не существует), сбросить буфер, вывести всё в консоль, перевести строчку

и зачем это надо?
VD17
 Аватар для VD17
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 17
07.02.2013, 00:19  [ТС]     Не могу понять как работает программа #5
Бльшое спасибо за все. Я хотел сделать вот так но не получилось.Я только начал учиться.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include "stdafx.h"
#include <cstdio>
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
//обьявление прототипов функций
int sumArray(int integerArray[], int sizeOfloatArray);
int displayArray(int integerArray[], int sizeOfloatArray);
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
// Описываем счетчик цикла
int nAccumulator = 0;
cout << "Эта программа суммирует числа,"
     << " введенный пользователем.\n";
cout << "Цикл прерываеться, когда"
     << " пользователь вводит"
     << " отрицательное значение\n";
 
// Сохраняем числа в массиве
int inputValues[128];
int numberOfValues = 0;
for (numberOfValues = 0; numberOfValues < 128; numberOfValues++)
                    {
                    // Ввод очередного числа
                    int integerValue;
                    cout << "Введите следующее число: ";
                    cin >> integerValue;
 
                    // Если оно отрицательно...
                    if (integerValue < 0)
                    {
                    // ...тогда выходим из цикла
                    break;
                    }
                    // ... иначе сохраняем в массиве
                    inputValues[numberOfValues] = integerValue;
                    {
                    // Теперь выводим значение
                displayArray(inputValues, numberOfValues);
                     }
                }
                
    // Пауза для того, чтобы посмотреть 
    // на результат работы
    system("PAUSE");
    return 0;
}
// displayArray — отображает элэменты массива
// integerArray длинной sizeOfloatArray
int displayArray(int integerArray[], int sizeOfArray)
                      {
                            int accumulator = 0;
                            for (int i = 0; i < sizeOfArray; i++)
                            {
                            cout << "В массиве храняться"
                                 << " следующие значения:\n";
                            }
                            {
                            cout.width(3);
                            cout  << i << ": " << integerArray[i] << endl;
                            {
                            int integerArray[i];
                            for (int i = 0; i < sizeOfArray; i++)
                            
                                cout << endl;
                            }
                            cout << "Сумма введенных чисел равна ";
                            accumulator += integerArray[i];
                           
                           
                            
                                  return accumulator;
                                  }          
                                  }
Добавлено через 54 секунды
А так я все понял.Хотел просто разобраться во всем, как и что работает. Хочу стать таким же квалифицированным как и вы.Спасибо.
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
07.02.2013, 00:53     Не могу понять как работает программа #6
Цитата Сообщение от VD17 Посмотреть сообщение
Бльшое спасибо за все. Я хотел сделать вот так но не получилось.Я только начал учиться.
Добавлено через 54 секунды
А так я все понял.Хотел просто разобраться во всем, как и что работает. Хочу стать таким же квалифицированным как и вы.Спасибо.
я не знаю в чём вы там пишите и по каким книжкам учитесь...
я вообще C++ изучаю меньше месяца, но точно скажу, что в стандарте языка такого нет, что вы тут понаписали... что за среда вообще?

теперь к вашему коду, обратите внимание на эти строчки:

C++
1
2
3
4
5
6
7
8
9
for (int i = 0; i < sizeOfArray; i++)
                            {
                            cout << "В массиве храняться"
                                 << " следующие значения:\n";
                            }
                            {
                            cout.width(3);
                            cout  << i << ": " << integerArray[i] << endl;
                            {
здесь i разрушится после
C++
1
2
3
4
5
for (int i = 0; i < sizeOfArray; i++)
                            {
                            cout << "В массиве храняться"
                                 << " следующие значения:\n";
                            }
всё...
тут
C++
1
2
3
4
                            {
                            cout.width(3);
                            cout  << i << ": " << integerArray[i] << endl;
                            {
уже никакой i нет...
сперва поймите этот момент, о чём я писал в предыдущем посте...

потом переходите к самим циклам... но поймите, что в этой области видимости уже нет i... возможно у меня тяжёлый язык для понимания...

вот набросал вам программу чтобы это понять, посмотрите на её вывод, порассуждайте над ней, чтобы понять что такое области видимости переменных, прежде чем рваться дальше

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <string>
 
using namespace std;
 
int main ()
{
    int i = 0; // объявлем i как число, равное 0
    cout << i << endl; // да, это так...
    {
        cout << i << endl; // да, всё ещё так
        int i = 10; // перегужаем i как тоже число, но = 10
        cout << i << endl; // хорошо, это 10
        {
            string i = "asd"; //а перегрузим i как строку asd
            cout << i << endl; // получилось )
        }
        // ТУТ НАША ПЕРЕГУЗКА i как строка приказала долго жить:
        cout << i << endl; // снова число 10
        // т.к. область видимости i как строки была уничтожена по выходу за }
        // почему? потому что она была определена в { до этого и её область
        // видимости была только до след закрывающей } этой скобки
        //снова закроем
    }
    // посмотрим что имеем
    cout << i << endl;// так... и 10-ка куда-то делась... вернулись к первеначальному 0
    // по аналогии почему разрушился string порассуждайте куда делось 10 )))
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2013, 18:04     Не могу понять как работает программа
Еще ссылки по теме:

Не могу понять, как работает побитовый сдвиг C++
Не могу понять, как работает проверка на нечётность C++
C++ Не могу понять, как работает программа

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

Или воспользуйтесь поиском по форуму:
VD17
 Аватар для VD17
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 17
07.02.2013, 18:04  [ТС]     Не могу понять как работает программа #7
Большое спасибо abit.Вы мне очень помогли. Я не мог читать дальше не поняв программу массивов. Видно автор книги не имеет ни малейшего представления в педагогической сфере. Он просто глотает многие факты и мне приходиться искать в интернете. Но я не собираюсь останавливаться на его книге.А па какой книге учитесь вы? Буду задавать вопросы на этом форуме по ходу учебы. Я так счастлив что существую такие форумы и что самое главное - люди готовые помочь. Благодарю от всей души.

Добавлено через 4 минуты
Сейчас буду разбирать вашу программу.

Добавлено через 3 часа 6 минут
Понял, но не знаю как объяснить.С каждыми новыми математическими скобками можно объявить новую локальную переменную, при выходе во внешние скобки переменная возвращает унаследованные в ней значение.Если что то не понял подправьте пожалуйста.Мне нужно немного опыта

Добавлено через 1 час 49 минут
Если не инициализировать переменную i в новых математических скобках, то она унаследует значение из верхних скобок.
Yandex
Объявления
07.02.2013, 18:04     Не могу понять как работает программа
Ответ Создать тему
Опции темы

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