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

Представление кода в виде функции - C++

Восстановить пароль Регистрация
 
samarcs
 Аватар для samarcs
0 / 0 / 0
Регистрация: 01.08.2012
Сообщений: 82
29.12.2012, 23:04     Представление кода в виде функции #1
Столкнулся с проблемой, сделал код в виде функций, все запускается и вроде бы работает, но как введу значения жму Enter и программа просто виснет. В чем может быть проблема? Компилятор все норм компилит.
Исходный:
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include <tchar.h>
#include <iostream.h>
#include <math.h>
//---------------------------------------------------------------------------
/*
6. Найти максимальный элемент из положительных элементов массива,
и элементов, не кратных числу 7.
*/
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
        //Описание данных
    int amax,a[10],i,k,j,x[10],y[10],n_max,S;
 
 
        //Ввод массива
    cout<<"Enter a:"<<endl;
    for (i=0; i < 10; i++)
        cin>>a[i];
 
        //Формирование нового массива из положительных и не кратных 7.
    k=0; j=0;
    for(i=0; i<10; i++)
      {
         if(a[i]>0 && a[i]%7!=0)
            x[j++]=a[i];
 
      }
    if (j!=0)
 
    {   //Вывод нового массива
    cout<<"NoviiMassiv="<<endl;
    for(i=0;i<j;i++)
        {
            cout<<"  "<<x[i];
        }
 
    cout<<endl;
        //Поиск максимального элемента в новом массиве
    amax=x[0];  n_max=0;
 
    for (i=0; i < j; i++)
          if(amax<x[i])
            {
                amax=x[i];
                n_max=i;
 
            }
 
    cout<<"amax="<<amax<<endl;
 
    }
    else cout<<"Net kratnix"<<endl;
            //Формирование нового массива из отрицательных.
    k=0;
    for(i=0; i<10; i++)
      {
         if(a[i]<0)
            y[k++]=a[i];
 
      }
    if(k!=0)
    {
            //Вывод нового массива отрицательных чисел
    cout<<"MassivOtritsatelnih="<<endl;
    for(i=0;i<k;i++)
        {
            cout<<"  "<<y[i];
        }
 
    cout<<endl;
 
 
            //Поиск суммы элементов нового массива
   S=0; i=0;
   for(;i<k;)
   {
        S+=y[i], i++;
   }
            //Вывод результата
        cout<<"Summa="<<S<<endl;
 
   }
   else cout<<"Net otricatelnih"<<endl;
   system("pause");
    return 0;
}
//---------------------------------------------------------------------------
В виде функции:
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include <tchar.h>
#include <iostream.h>
#include <math.h>
//---------------------------------------------------------------------------
 
#pragma argsused
//Прототипы
void cinA (int *a);
void getM (int *&x);
void newArray (int *a, int *x, int &j);
void getArray (int *x, int j);
void poiskMax (int amax, int *x, int &j);
void newOtrArray (int *a, int *y, int &k);
void getOtrArray (int *y, int k);
void SummArray (int &S, int k, int *y);
 
void cinA (int *a)
{
    int i;
        cout<<"Enter a:"<<endl;
    for (i=0; i < 10; i++)
        cin>>a[i];
}
 
void getM (int *&x)
{
    x=new int[10];
}
 
void newArray (int *a, int *x, int &j)
{
    int i;
    j=0;
    for(i=0; i<10; i++)
      {
         if(a[i]>0 && a[i]%7!=0)
            x[j++]=a[i];
 
      }
}
 
void getArray (int *x, int j)
{
 
    //Вывод нового массива
    cout<<"NoviiMassiv="<<endl;
    int i;
    for(i=0;i<j;i++)
        {
            cout<<"  "<<x[i];
        }
 
    cout<<endl;
}
 
void poiskMax (int amax, int *x, int &j)
{
    amax=x[0];
    int i;
    for (i=0; i < j; i++)
          if(amax<x[i])
            {
                amax=x[i];
            }
 
    cout<<"amax="<<amax<<endl;
}
 
void newOtrArray (int *a, int *y, int &k)
{
    k=0;
    int i;
    for(i=0; i<10; i++)
      {
         if(a[i]<0)
            y[k++]=a[i];
 
      }
}
 
void getOtrArray (int *y, int k)
{
    cout<<"MassivOtritsatelnih="<<endl;
    int i;
    for(i=0;i<k;i++)
        {
            cout<<"  "<<y[i];
        }
 
    cout<<endl;
 
}
 
void SummArray (int &S, int k, int *y)
{
   int i;
   S=0; i=0;
   for(;i<k;)
   {
        S+=y[i], i++;
   }
            //Вывод результата
        cout<<"Summa="<<S<<endl;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    int *a;
    cinA (a);
    int *x;
    getM (x);
    int j;
    newArray (a, x, j);
    getArray (x, j);
    int amax;
    poiskMax (amax, x, j);
    int *y;
    int k;
    newOtrArray (a, y, k);
    getOtrArray (y, k);
    int S;
    SummArray (S, k, y);
    system("pause");
}
//---------------------------------------------------------------------------
Даже в голову ничего не лезет, предрасполагаю что что-то с указателями) сейчас сижу перечитываю главу про указатели(
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
UserAK
70 / 70 / 4
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
29.12.2012, 23:42     Представление кода в виде функции #2
если ты 1 раз вводишь и жмёшь ентер, то оно не виснет, а просто ждёт ещё 9 значений, ты же в цикле запрашиваешь
Nagdiel
 Аватар для Nagdiel
114 / 114 / 3
Регистрация: 23.12.2012
Сообщений: 195
29.12.2012, 23:46     Представление кода в виде функции #3
по факту функция cinA работает с неинициализированным указателем
UserAK
70 / 70 / 4
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
29.12.2012, 23:55     Представление кода в виде функции #4
у тебя много переменных не инициализированы, как вообще это может работать?
samarcs
 Аватар для samarcs
0 / 0 / 0
Регистрация: 01.08.2012
Сообщений: 82
30.12.2012, 00:18  [ТС]     Представление кода в виде функции #5
работает) только в исходном виде, а в функции просто даже не знаю как правильно переводить, с переменными не могу разобрать
norin
18 / 16 / 3
Регистрация: 10.03.2011
Сообщений: 52
30.12.2012, 00:19     Представление кода в виде функции #6
Проблема тут:
113 int *a; // объявлен указатель, но память под массив не выделена
114 cinA (a); // в функции предполагается что память под массив уже(!) выделена и едёт простое заполнение массива числами

Можно выделить память до вызова функции:
C++
1
2
3
4
5
6
7
8
...
void cinA (int * a, int  n); 
....
int n = 10; // или ввод n с клавиатуры 
int* a = new int[n]; // объявляем указатель, выделяем память 
cinA (a, n); // до этого переделали cinA(---),
//так что бы она принимала два аргумента: указатель на массив и его размерность
....
Можно так:
C++
1
2
3
4
5
6
7
8
9
10
int * cinA (int  n)
{
int * a = new int[n];
....
return a; // возвращаем указатель на сформированный в функции массив
}
....
int n = 10; // или ввод n с клавиатуры 
int* a = cinA (n);  
....
Последний вариант предпочтительней.
UserAK
70 / 70 / 4
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
30.12.2012, 00:23     Представление кода в виде функции #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    int *a = new int[10];
    cinA (a);
    int *x = new int[10];
    getM (x);
    int j(0);
    newArray (a, x, j);
    getArray (x, j);
    int amax(0);
    poiskMax (amax, x, j);
    int *y = new int[10];
    int k(0);
    newOtrArray (a, y, k);
    getOtrArray (y, k);
    int S(0);
    SummArray (S, k, y);
    system("pause");
Добавлено через 1 минуту
и во всех функциях принимай параметры по ссылке

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
//Прототипы
void cinA (int *a);
void getM (int *x);
void newArray (int *a, int *x, int &j);
void getArray (int *x, int &j);
void poiskMax (int amax, int *x, int &j);
void newOtrArray (int *a, int *y, int &k);
void getOtrArray (int *y, int &k);
void SummArray (int &S, int &k, int *y);
norin
18 / 16 / 3
Регистрация: 10.03.2011
Сообщений: 52
30.12.2012, 00:25     Представление кода в виде функции #8
А ещё столько числ в коде это не есть хорошо это я о размерности массива.
UserAK
70 / 70 / 4
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
30.12.2012, 00:30     Представление кода в виде функции #9
да ещё, желательно удалять динамические переменные и массивы.
можно например так:
C++
1
2
3
4
    system("pause");
    delete[]a;
    delete[]x;
    delete[]y;
Добавлено через 3 минуты
насчёт много чисел.
можешь заменить их одной констаной.
например так
C++
1
2
3
4
const int array_size = 10;
int *a = new int[array_size];
int *x = new int[array_size];
int *y = new int[array_size];
samarcs
 Аватар для samarcs
0 / 0 / 0
Регистрация: 01.08.2012
Сообщений: 82
30.12.2012, 00:32  [ТС]     Представление кода в виде функции #10
Спасибо всем огромное!!! Помогли очень) буду учить сейчас тему функций) иначе выгонят точно из универаXD
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2012, 00:34     Представление кода в виде функции
Еще ссылки по теме:

C++ Представление числа N в виде всевозможных сумм K
C++ Вернуть текстовое представление уравнения в виде строки
Представление числа в 16-ричном виде C++

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

Или воспользуйтесь поиском по форуму:
UserAK
70 / 70 / 4
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
30.12.2012, 00:34     Представление кода в виде функции #11
вообще главное, чтоб было понятно самому и желательно другим :)
а с числами в коде компилятор разберётся ;)
Yandex
Объявления
30.12.2012, 00:34     Представление кода в виде функции
Ответ Создать тему
Опции темы

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