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

Очень нужен совет где найти ошибки в программе - C++

Восстановить пароль Регистрация
 
Candace
0 / 0 / 0
Регистрация: 21.02.2013
Сообщений: 8
13.03.2013, 20:06     Очень нужен совет где найти ошибки в программе #1
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
//Obrabotka rezulitatov sessii s ispolizovaniem functii
#include<iostream>
#include<iomanip>
#include<string.h>
#include<assert.h>
#include<conio.h>
#include<cstdlib>
 
using namespace std;
 
void MemoryAllocation(int,int,char**,int**,float *,float *);//Prototip funk. dinamiceskogo videlenie pameati  
void Inputdata(char**,int**,int,int);//Prototip funktii vvod dannih
void StudSortirovka(char**,float*,int);//Prototip funk. sortirovka studentov po uspevaemosti 
void ExSortirovka(int,float*);//Prototip funktii sortirovki distiplin 
void Avball(int**,float*,int,int);//Prototip fun . vicislenie srednego balla kajdogo studenta 
void Avexball(int**,float*,int ,int);//Prototip funk. vicisleniea srednego bala po distipline
void OsvobojdeniePam(int,int,char**,int**,float *,float *);//Prototip funktii osvobojdeniea pameati
 
void main(){
    char**fio={0};
    int** stball=0;
    float* stavball=0;
    float*exavball=0;
    unsigned int ex;
    unsigned int nstud;
    bool flag=false;
    
    do{
    cout<<"Vvedite kolicestvo studentov"<<endl;
    cin>>nstud;
    if(!cin.good())
    { 
        cout<<"Error"<<endl;
        cin.clear();
        cin.ignore(255,'\n');
    }
    else flag=true;}while(!flag);
    flag=false;
    do{
    cout<<"Vvedite kolicestvo examenov"<<endl;
    cin>>ex;
    if(!cin.good())
    {
        cout<<"Error"<<endl;
        cin.clear();
        cin.ignore(255,'\n');
    }
    else flag=true;
    }while(!flag);
    
    MemoryAllocation(nstud,ex,fio,stball,stavball,exavball);
    Avball(stball,stavball,nstud,ex);
    Avexball(stball,exavball,nstud,ex);
    StudSortirovka(fio,stavball,nstud);
    ExSortirovka(ex,exavball);
    OsvobojdeniePam(nstud,ex,fio,stball,stavball,exavball);
 
    system("pause");
    return ;
}
//Opredelenie funktii 
void MemoryAllocation(int nstud,int ex ,char**fio,int**stball,float*stavball,float*exavball)
{
    //Videlenie pameati dlea familii studentov i proverka na ee nalicie
    fio=new char*[nstud];
    if(fio==NULL)
    {
       cout<<"Not enough memory"<<endl;
       exit(1);
    }
    for(int i=0 ; i<nstud;i++)
        if(fio[i]==NULL)
        {
        cout<<"Not enough memory"<<endl;
        exit(1);
        }
    
    //Videlenie pameati dlea otsenok studentov i proverka na ee nalicie
    stball=new int*[nstud];
    if(stball==NULL)
    {
      cout<<"Not enough memory"<<endl;
       exit(1);
    }
    for(int i=0 ; i<ex;i++)
        if(stball[i]==NULL)
        {
         cout<<"Not enough memory"<<endl;
         exit(1);
        }
    //Videlenie pameati pod srednii ball studentov
        stavball=new float [nstud];
        if(stavball==NULL)
        {
          cout<<"Not enough memory"<<endl;
          exit(1);
        }
    //Videlenie pameati pod srednii ball po distipline
        exavball=new float [ex];
        if(exavball==NULL)
        {
          cout<<"Not enough memory"<<endl;
          exit(1);
        }
        
    Inputdata(fio,stball,nstud,ex);
}
 //Opredelenie Funktii vvoda dannih
void Inputdata(char**fio1,int**stball1 ,int nstud1,int ex1 )
{   
    
    bool flag=false;
    do
    {
    cout<<"Vvedite imea studenta"<<endl;
    for(int i=0 ; i<nstud1 ;i++)
    {
        cin>>fio1[i];
        if(!cin.good())
        {
            cout<<"Error"<<endl;
            cin.clear();
            cin.ignore(255,'\n');
        }
        else flag=true;
    }}while(!flag);
    
    for(int i=0;i<nstud1;i++)
     {   flag=false;
      do{
         cout<<"Vvedite otsenki studenta"<<endl;
         for(int j=0;j<ex1;j++)
         {
            cin>>stball1[i][j];
            if(!cin.good())
            { 
                cout<<"Error"<<endl;
                cin.clear();
                cin.ignore(255,'\n');
             }
            else flag=true;
         }}while(!flag);
       }
    cout<<"Familii studentov i ih otsenki"<<endl;
    for(int g=0;g<nstud1;g++)
    {
        cout<<setw(15)<<setiosflags(ios::right)<<fio1[g]<<'  ';
        for(int v=0;v<ex1;v++)
            cout<<setw(3)<<stball1[g][v]<<' ';
        cout<<endl;
    }
    
    }
//Opredelenie Funktii vicisleniea srednego bala studentov 
void Avball(int**stball1,float*stavball1,int nstud,int ex)
{
 
    for(int i=0;i<nstud ;i++)
    {
        int sum=0;
        for(int j=0 ; j<ex ; j++)
            sum+=stball1[i][j];
        stavball1[i]=sum/ex;
    }
}
//Opredelenie funktii vicisleniea srednego bala po distipline
void Avexball(int**stball1,float*exavball,int nstud,int ex)
{  
    for(int i=0; i<ex;i++)
    {
        int sum=0;
        for(int j=0 ; j<nstud ; j++)
            sum+=stball1[i][j];
        exavball[i]=sum/nstud;
    }
}
//Opredelenie funktii sortirovki studentov po sr balu i vivod na ekran
void StudSortirovka(char**fio,float*stavball,int nstud)
{
    for(int k=0 ;k<nstud;k++)
        for(int i=0 ; i<nstud-1;i++)
            if(stavball[i]<stavball[i+1])
            { float tmp=0;
               char*tmp1={0};
              tmp=stavball[i];
              tmp1=fio[i];
              stavball[i]=stavball[i+1];
              fio[i]=fio[i+1];
              stavball[i+1]=tmp;
              fio[i+1]=tmp1;
             }
    for(int d=0; d<nstud ;d++)
        cout<<setw(15)<<setiosflags(ios::right)<<fio[d]<<setiosflags(ios::left|ios::showpoint)<<setprecision(2)<<setw(6)<<stavball[d]<<endl;
}
//Opredelenie funktii sortirovki po disciplinam i vivod na ekran
void ExSortirovka(int ex,float*exavball)
{
    for(int i=0;i<ex;i++)
        for(int j=0;j<ex-1;j++)
            if(exavball[j]<exavball[j+1])
            {
                float tmp3=0;
                tmp3=exavball[i];
                exavball[i]=exavball[i+1];
                exavball[i+1]=tmp3;
            }
    cout<<"Sortirovka distiplin po ubivaniu srednego bala za distiplinu"<<endl;
    for (int d=1;d<=ex;d++)
        cout<<setw(5)<<ex<<setiosflags(ios::showpoint)<<setprecision(2)<<exavball[d]<<endl;
 
}
//Opredelenie funktii osvobojdeniea pameati
void OsvobojdeniePam(int nstud,int ex,char** fio,int**stball,float *stavball,float *exavball)
{
     for(int i=0; i<nstud;i++)
         delete [] fio[i];
     delete [] fio;
     for(int j=0;j<ex;j++)
         delete [] stball[j];
     delete [] stball;
     delete [] stavball;
     delete [] exavball ;
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2013, 20:06     Очень нужен совет где найти ошибки в программе
Посмотрите здесь:

C++ Нужен совет в программе!
C++ Помогите найти ошибки в программе
Помогите найти ошибки в программе. C++
Нужен совет по исправлению ошибки в функции C++
C++ Подскажите, где ошибки в программе
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
14.03.2013, 00:02     Очень нужен совет где найти ошибки в программе #2
В первой же функции(остальное не смотрел)
Цитата Сообщение от Candace Посмотреть сообщение
void MemoryAllocation(int nstud,int ex ,char**fio,int**stball,float*stavball,float*exavball)
{
* * //Videlenie pameati dlea familii studentov i proverka na ee nalicie
* * fio=new char*[nstud];
* * if(fio==NULL)
* * {
* * * *cout<<"Not enough memory"<<endl;
* * * *exit(1);
* * }
* * for(int i=0 ; i<nstud;i++)
* * * * if(fio[i]==NULL)
* * * * {
* * * * cout<<"Not enough memory"<<endl;
* * * * exit(1);
* * * * }
.//..
}
1) fio, stball, stavball, exavball это копии тех переменных, что находятся в функции main. Присваивая им возвращаемые с помощью new адреса, вы никак не влияете на переменные с аналогичными именами в main.
2) по умолчанию, new не возвращает NULL в случае нехватки памяти, а генерирует исключение. Для того чтобы он вернул NULL, после слова new в скобках пишется слово nothrow.
3) проверки в цикле for вообще не имеют смысла(и здесь и далее)
Исправленный вариант может выглядеть приблизительно так
C++
1
2
3
4
5
6
7
8
9
10
11
void MemoryAllocation(int nstud, int ex, char**& fio, int**& stball, float*& stavball, float*& exavball)
{
    //Videlenie pameati dlea familii studentov i proverka na ee nalicie
    fio = new (nothrow) char* [nstud];
    if(fio == NULL)
    {
        cout << "Not enough memory" << endl;
        exit(1);
    }
//...
}
Candace
0 / 0 / 0
Регистрация: 21.02.2013
Сообщений: 8
14.03.2013, 11:25  [ТС]     Очень нужен совет где найти ошибки в программе #3
насчёт проверки на наличие памяти согласна но насчёт переменных это ведь указатели содержащие адреса и все изменения в функции непосредственно выполняются по этим адресам
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
14.03.2013, 12:57     Очень нужен совет где найти ошибки в программе #4
Цитата Сообщение от Candace Посмотреть сообщение
насчёт проверки на наличие памяти согласна но насчёт переменных это ведь указатели содержащие адреса и все изменения в функции непосредственно выполняются по этим адресам
так указатели на что??? У тебя в функции изменяется значение самого указателя, а не данных по нему.
нужно различать, что такое fio, что такое *fio и что такое **fio - это принципиально разные вещи.
Сколько бы "звёздочек" ни стояло в объявлении указателя, при изменении его значения (т.е. без разыменования) он ведёт себя точно также как и любая переменная - передаётся в функцию в виде копии, например.
Candace
0 / 0 / 0
Регистрация: 21.02.2013
Сообщений: 8
14.03.2013, 13:46  [ТС]     Очень нужен совет где найти ошибки в программе #5
"И вот тут до неё дошло(((" т.е. получается независимо от типа аргумента только в том случае если он передан по ссылке он имеет непосредственный доступ к оригиналу
Yandex
Объявления
14.03.2013, 13:46     Очень нужен совет где найти ошибки в программе
Ответ Создать тему
Опции темы

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