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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
VD17
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 17
#1

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

06.02.2013, 15:02. Просмотров 575. Ответов 6
Метки нет (Все метки)

Здравствуйте люди.Помогите понять как работают фнкции в программе(см. ниже). Учусь по книге Стефана Девидса С++ для чайников 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;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2013, 15:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не могу понять как работает программа (C++):

Не могу понять, как работает программа - C++
Здравствуйте, непонятны некоторые функции программы. Спасибо. #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;cstring&gt; ...

Массивы. Не могу понять как работает программа - C++
Здравствуйте. Я как и многие в этом разделе новичок. У меня возникли трудности в понимании данной программы #include &lt;iostream&gt; ...

Программа проверки числа на простоту. Не могу понять как она работает. - C++
У меня в учебнике есть программа, она правильно работает, но я не могу понять каким образом она это делает. int i, j; ...

не могу понять почему не работает программа - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;clocale&gt; #include &lt;cmath&gt; using namespace std; int main () { setlocale...

Не могу понять почему не работает программа - C++
int f,x,a,b,c; cin&gt;&gt;x; if (x&gt;0) {f=pow(-x,4); cout&lt;&lt;f;} else {f=x+92; cout&lt;&lt;f;} if (x==0) {f=0;

Не могу понять, почему программа неправильно работает! - C++
Изучаю С++ по Страуструпу Б. - Программирование. Принципы и практика использования C++. Есть задание: 9. Вычислите сумму введенных...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
abit
263 / 261 / 33
Регистрация: 03.02.2013
Сообщений: 730
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
это не индекс, а число элементов в массиве
2
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;
0
abit
263 / 261 / 33
Регистрация: 03.02.2013
Сообщений: 730
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 в этом контексте не существует), сбросить буфер, вывести всё в консоль, перевести строчку

и зачем это надо?
2
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 секунды
А так я все понял.Хотел просто разобраться во всем, как и что работает. Хочу стать таким же квалифицированным как и вы.Спасибо.
0
abit
263 / 261 / 33
Регистрация: 03.02.2013
Сообщений: 730
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 )))
}
2
VD17
0 / 0 / 0
Регистрация: 06.02.2013
Сообщений: 17
07.02.2013, 18:04  [ТС] #7
Большое спасибо abit.Вы мне очень помогли. Я не мог читать дальше не поняв программу массивов. Видно автор книги не имеет ни малейшего представления в педагогической сфере. Он просто глотает многие факты и мне приходиться искать в интернете. Но я не собираюсь останавливаться на его книге.А па какой книге учитесь вы? Буду задавать вопросы на этом форуме по ходу учебы. Я так счастлив что существую такие форумы и что самое главное - люди готовые помочь. Благодарю от всей души.

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

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

Добавлено через 1 час 49 минут
Если не инициализировать переменную i в новых математических скобках, то она унаследует значение из верхних скобок.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2013, 18:04
Привет! Вот еще темы с ответами:

Не могу понять почему программа работает не правильно! - C++
Задание: Программа находит в строке 1 символ который не входит во 2 заданную строку. Помогите исправить ошибку. ...

Не могу понять почему программа работает некорректно (односвязные списки) - C++
Построить однонаправленный список чисел. Затем исключить из него все повторы чисел, оставить каждое число в списке в единственном...

Не могу понять, как работает проверка на нечётность - C++
Программа призвана выводить на консоль элементы массива с нечётными значениями. Проверка на нечётность здесь весьма нетрадиционна....

Не могу понять, как работает побитовый сдвиг - C++
Есть вот такой код: int invar, wv1, wv2, et, yt, resv; invar = 14; wv1 = invar &gt;&gt; 4; printf(&quot;%i\n&quot;, wv1); wv1 = wv1 &lt;&lt; 28; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.02.2013, 18:04
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru