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

помогите найти ошибку в программе - C++

Восстановить пароль Регистрация
 
nemesises
0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 42
07.11.2011, 22:02     помогите найти ошибку в программе #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
#include <cstdlib>
#include "CMatrix.h"
#include <conio.h>
 
//Руссификация
ostream& operator<<(ostream &stream,char* s){
    for(char* ps=s; *ps; ps++){
        if(*ps=='ё')
            stream<<char(241);
        else if(*ps=='Ё')
            stream<<char(240);
        else if(*ps>=-64 && *ps<=-17)           
            stream<<char(*ps+64+128);
        else if(*ps<0)
            stream<<char(*ps+64+176);
        else
            stream<<*ps;
    }
    return stream;
}
 
int main()
{
    int i,m;
    bool bRand = false;
    CMatrix matr;
    do
    {
        bRand = false;
        cout<<"Введите число строк в матрице : ";
        cin>>m;
        cout<<"Y/N Програмная генерация матрицы/Ручной ввод\n";
        if(toupper(getch()) == 'Y')
            bRand = true;
        if(!matr.SetMatrix(m,bRand))
            cout<<"Ошибка ввода матрицы\n";
        else
        {
            cout<<"Ввод окончен\n";
            cout<<"\tИсходная матрица\n";
            m = matr.GetNumRows();
            for(i = 0; i < m; i++)
                matr.ShowRow(i);
            cout<<"Удаление строк с преобладающим числом ненулевых єлементов\n";
            if(!matr.RemNonZeroRows())
                cout<<"В матрице удалены все строки\n";
            else
            {
                m = matr.GetNumRows();
                cout<<"\tМатрица после удаления строк\n";
                for(i = 0; i < m; i++)
                    matr.ShowRow(i);
            }
        }
        cout<<"Нажмите Y для нового ввода\n";
        matr.CleanUp();
    }
    while(toupper(getch()) == 'Y');
    system("pause");
    return 0;}
 Комментарий модератора 
Используйте теги форматирования кода!


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

при рэндомном вводе и таком вводе невсегда получается всё норм, пожалуйста выручайте прога нужна на завтра!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
07.11.2011, 22:15     помогите найти ошибку в программе #2
Цитата Сообщение от nemesises Посмотреть сообщение
#include "CMatrix.h"
в студию. оформляйте код тегами
nemesises
0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 42
07.11.2011, 22:17  [ТС]     помогите найти ошибку в программе #3
всмысле?
Xind
275 / 148 / 7
Регистрация: 05.11.2011
Сообщений: 425
Записей в блоге: 1
07.11.2011, 22:19     помогите найти ошибку в программе #4
Неужели в таком виде удобнее читать код?!

Добавлено через 1 минуту
Цитата Сообщение от nemesises Посмотреть сообщение
всмысле?
Содержимое файлика CMatrix.h сюда тоже впишите.
nemesises
0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 42
07.11.2011, 22:21  [ТС]     помогите найти ошибку в программе #5
только в таком остался

Добавлено через 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
#include <iostream> //cout cin
#include <cstdlib>  //srand rand system
#include <iomanip>  //setw
#include <ctime>    //time
using namespace std; 
 
class CMatrix 
{ 
private :
    int ** _matrix;//Указатель на 2-мерній массив 
    int _m;//содержит число строк квадратной матрицы
    int _n;//содержит число столбцов квадратной матрицы
public : 
 
    CMatrix(); //Конструктор по умолчанию 
    ~CMatrix();//Деструктор 
    void CleanUp();//Функция очистки 
    bool SetMatrix(int m, bool bRand);
    bool IsZeroRow(int i);//Проверяет преобладают ли в строке 0
    bool DeleteRow(int i);//Удаляет из матрицы i строку
    bool RemNonZeroRows();//Удаляет из матрицы строки с IsZeroRow == false
    void ShowRow(int i);  //Выводит на экран i строку
    int GetNumRows();//Возвращает число строк в матрице
    int GetNumCols();//Возвращает число столбцов в матрице
}; 
 
CMatrix::CMatrix() 
{ 
    _matrix = NULL;
    _m = -1;
    _n = -1;
} 
 
CMatrix::~CMatrix() 
{ 
    if(_matrix) 
        CleanUp();
} 
 
void CMatrix::CleanUp()//Функция очистки 
{ 
    int i; 
    if(_matrix) 
    { 
        for(i = _m - 1; 0 <= i; i--) 
            delete [] _matrix[i];//Чистим память под i-строку 
        delete [] _matrix; 
    } 
    _matrix = NULL;
    _m = -1;
    _n = -1;
} 
 
bool CMatrix::SetMatrix(int m, bool bRand) 
{ 
    int i = 0, j = 0; 
    if(0 < (_m = m)) 
    { 
        if(bRand) 
            srand(time(NULL)); 
        //Выделяем память указатели на строки матрицы
        _matrix = new int *[(_n = _m)]; 
        for(i = 0; i < _m; i++) 
        { 
            //выделяем память под строку
            _matrix[i] = new int[_n]; 
            for(j = 0; j < _n; j++) 
            { 
                if(!bRand) 
                { 
                    cout<<"matr["<<i + 1<<"]["<<j + 1<<"] = "; 
                    cin>>_matrix[i][j]; 
                } 
                else 
                { 
                    _matrix[i][j] = (rand()%2 - 1); 
                    /*if(_matrix[i][j] < 0) 
                        _matrix[i][j] = 0; */
                } 
            } 
        }
    } 
    else 
        _m = -1; 
    return (0 == (_m - i)*(_n - j)) ? true : false; 
} 
 
bool CMatrix::IsZeroRow(int i)
{
    int j,nZero = -1;
    if(_matrix && i < _m)
    for(nZero = 0, j = 0; j < _n; j++)
    {
        if(_matrix[i][j] == 0)
            nZero++;
    }
    return (((_m - nZero) <= nZero) ? true : false);
}
 
bool CMatrix::DeleteRow(int i)//Удаляет из матрицы i строку
{
    int j;
    if(_matrix && i < _m)
    //Поднимаем строки на 1-ну вверх
    for( ; i < _m - 1; i++)
    for(j = 0; j < _n; j++)
        _matrix[i][j] = _matrix[i + 1][j];
    delete [] _matrix[i];//Даже если i == _m - 1 то просто удалим последнюю строку
    //Если из матрицы удалили все строки
    //то возврат ложь
    return (0 < (_m--)) ? true : false;
}
 
bool CMatrix::RemNonZeroRows()
{
    bool bRet = true;int i;
    if(_matrix && 0 < _m)
    {
        for(i = 0; i < _m && bRet; i++)
        {
            if(!IsZeroRow(i))
                bRet = DeleteRow(i);
        }
    }
    //Если в окажется что удалили все строки матрицы вернём ложь
    return bRet;
}
 
void CMatrix::ShowRow(int i)
{
    int j;
    if(_matrix && i < _m)
    for(j = 0; j < _n; j++)
        cout<<setw(3)<<_matrix[i][j]<<" ";
    cout<<"\n";
}
 
int CMatrix::GetNumRows()
{
    int ret = -1;
    if(_matrix && 0 < _m)
        ret = _m;
    return ret;
}
 
int CMatrix::GetNumCols()
{
    int ret = -1;
    if(_matrix && 0 < _n)
        ret = _n;
    return ret;
}
 Комментарий модератора 
Используйте теги форматирования кода!


вот вроде он
Xind
07.11.2011, 22:21
  #6

Не по теме:

Диск форматнули?

nemesises
0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 42
07.11.2011, 22:22  [ТС]     помогите найти ошибку в программе #7
уже кинул
вроде тот
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
07.11.2011, 22:42     помогите найти ошибку в программе #8
Цитата Сообщение от nemesises Посмотреть сообщение
при рэндомном вводе и таком вводе невсегда получается всё норм, пожалуйста выручайте прога нужна на завтра!
опишите подробней что и как
nemesises
0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 42
07.11.2011, 23:17  [ТС]     помогите найти ошибку в программе #9
он невсегда удаляет те строки в которых число элементов ненулевых больше нулевых
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
08.11.2011, 00:41     помогите найти ошибку в программе #10
C++
1
2
3
4
5
6
7
8
9
10
11
bool CMatrix::IsZeroRow(int i)
{
        int j, nZero = 0;
        if(_matrix && i < _m)
        for(j = 0; j < _n; j++)
        {
                if(_matrix[i][j] == 0)
                        nZero++;
        }
        return (_n % 2) ? (_n / 2 < nZero) : (_n / 2 <= nZero);
}
Добавлено через 2 минуты
ну естественно что строки без нулей не удаляются вообще. В том смысле что так и должно быть.

Добавлено через 9 минут
и еще тут поправил
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool CMatrix::RemNonZeroRows()
{
        bool bRet = true;int i;
        if(_matrix && 0 < _m)
        {
                for(i = 0; i < _m; i++)
                {
                        if(!IsZeroRow(i))
                                bRet = DeleteRow(i);
                }
        }
        //Если в окажется что удалили все строки матрицы вернём ложь
        return bRet;
}
Добавлено через 11 минут
еще вот так писать нет смысла.
C++
1
return (((_m - nZero) <= nZero) ? true : false);
то же самое
C++
1
return ( (_m - nZero) <= nZero );
Добавлено через 5 минут
и это ерунда какая-то
C++
1
if(_matrix && 0 < _m)
оно же
C++
1
if( 0  < _m )
nemesises
0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 42
08.11.2011, 19:24  [ТС]     помогите найти ошибку в программе #11
я компилирую выбивает ошибки

Добавлено через 44 секунды
[Linker error] undefined reference to `WinMain@16'
ld returned 1 exit status
E:\Cpp\Dev-Cpp\Makefile.win [Build Error] [Project1343545.exe] Error 1


эти
делаю через Dev-C++
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
08.11.2011, 20:43     помогите найти ошибку в программе #12
чепуха, вы что-то не туда скопипастили, выложите код. вот тест. ld возвращает 1 при нарушении кучи, из теста видно что с выделением и уничтожением памяти все в порядке.
valgrind ./temp
deadman@gnomik:~/documents/projects/temp/bin/Debug$ valgrind ./temp
==14399== Memcheck, a memory error detector
==14399== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==14399== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==14399== Command: ./temp
==14399==
Введите число строк в матрице : 5
Y/N Програмная генерация матрицы/Ручной ввод
Y
Ввод окончен
Исходная матрица
0 -1 0 -1 -1
-1 -1 0 -1 -1
-1 0 -1 0 0
0 0 -1 0 -1
-1 0 -1 -1 0
Удаление строк с преобладающим числом ненулевых єлементов
Матрица после удаления строк
-1 -1 0 -1 -1
-1 0 -1 0 0
0 0 -1 0 -1
Нажмите Y для нового ввода
==14399==
==14399== HEAP SUMMARY:
==14399== in use at exit: 0 bytes in 0 blocks
==14399== total heap usage: 6 allocs, 6 frees, 120 bytes allocated
==14399==
==14399== All heap blocks were freed -- no leaks are possible
==14399==
==14399== For counts of detected and suppressed errors, rerun with: -v
==14399== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 18 from 7)

так же подумайте как поменять алгоритм удаления строки, потому что, как видно из теста, в случае если 2 смежные строки подпадают под критерий удаления, то вторая не проверяется. Она перемещается на место первой и таким образом "выскальззывает" от проверки на наличие признаков удаления.
вот готовый голова.
Добавлено через 4 минуты
CMATRIX_HPP
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
#ifndef CMATRIX_HPP_INCLUDED
#define CMATRIX_HPP_INCLUDED
#include <iostream> //cout cin
#include <cstdlib>  //srand rand system
#include <iomanip>  //setw
#include <ctime>    //time
using namespace std;
 
class CMatrix
{
private :
        int ** _matrix;//Указатель на 2-мерній массив
        int _m;//содержит число строк квадратной матрицы
        int _n;//содержит число столбцов квадратной матрицы
public :
 
        CMatrix(); //Конструктор по умолчанию
        ~CMatrix();//Деструктор
        void CleanUp();//Функция очистки
        bool SetMatrix(int m, bool bRand);
        bool IsZeroRow(int i);//Проверяет преобладают ли в строке 0
        bool DeleteRow(int i);//Удаляет из матрицы i строку
        bool RemNonZeroRows();//Удаляет из матрицы строки с IsZeroRow == false
        void ShowRow(int i);  //Выводит на экран i строку
        int GetNumRows();//Возвращает число строк в матрице
        int GetNumCols();//Возвращает число столбцов в матрице
};
 
CMatrix::CMatrix()
{
        _matrix = NULL;
        _m = -1;
        _n = -1;
}
 
CMatrix::~CMatrix()
{
        if(_matrix)
                CleanUp();
}
 
void CMatrix::CleanUp()//Функция очистки
{
        int i;
        if(_matrix)
        {
                for(i = _m - 1; 0 <= i; i--)
                        delete [] _matrix[i];//Чистим память под i-строку
                delete [] _matrix;
        }
        _matrix = NULL;
        _m = -1;
        _n = -1;
}
 
bool CMatrix::SetMatrix(int m, bool bRand)
{
        int i = 0, j = 0;
        if(0 < (_m = m))
        {
                if(bRand)
                        srand(time(NULL));
                //Выделяем память указатели на строки матрицы
                _matrix = new int *[(_n = _m)];
                for(i = 0; i < _m; i++)
                {
                        //выделяем память под строку
                        _matrix[i] = new int[_n];
                        for(j = 0; j < _n; j++)
                        {
                                if(!bRand)
                                {
                                        cout<<"matr["<<i + 1<<"]["<<j + 1<<"] = ";
                                        cin>>_matrix[i][j];
                                }
                                else
                                {
                                        _matrix[i][j] = (rand()%2 - 1);
                                        /*if(_matrix[i][j] < 0)
                                                _matrix[i][j] = 0; */
                                }
                        }
                }
        }
        else
                _m = -1;
        return (0 == (_m - i)*(_n - j)) ? true : false;
}
 
bool CMatrix::IsZeroRow(int i)
{
        int j, nZero = 0;
        if(_matrix && i < _m)
        for(j = 0; j < _n; j++)
        {
                if(_matrix[i][j] == 0)
                        nZero++;
        }
        return (_n % 2) ? (_n / 2 < nZero) : (_n / 2 <= nZero);
}
 
bool CMatrix::DeleteRow(int i)//Удаляет из матрицы i строку
{
        int j;
        if(_matrix && i < _m)
        //Поднимаем строки на 1-ну вверх
        for( ; i < _m - 1; i++)
        for(j = 0; j < _n; j++)
                _matrix[i][j] = _matrix[i + 1][j];
        delete [] _matrix[i];//Даже если i == _m - 1 то просто удалим последнюю строку
        //Если из матрицы удалили все строки
        //то возврат ложь
        return (0 < (_m--)) ? true : false;
}
 
bool CMatrix::RemNonZeroRows()
{
        bool bRet = true;int i;
        if(_matrix && 0 < _m)
        {
                for(i = 0; i < _m; i++)
                {
                        if(!IsZeroRow(i)){
                                bRet = DeleteRow(i);
                                --i;
                        }
                }
        }
        //Если в окажется что удалили все строки матрицы вернём ложь
        return bRet;
}
 
void CMatrix::ShowRow(int i)
{
        int j;
        if(_matrix && i < _m)
        for(j = 0; j < _n; j++)
                cout<<setw(3)<<_matrix[i][j]<<" ";
        cout<<"\n";
}
 
int CMatrix::GetNumRows()
{
        int ret = -1;
        if(_matrix && 0 < _m)
                ret = _m;
        return ret;
}
 
int CMatrix::GetNumCols()
{
        int ret = -1;
        if(_matrix && 0 < _n)
                ret = _n;
        return ret;
}
 
 
#endif // CMATRIX_HPP_INCLUDED


Добавлено через 41 минуту
кстати я когда последний раз редактировал. то запустил программу с параметром 5000, сейчас пришлось прервать выполнение, а то проц поплавится... повод подумать над оптимизацией, или вообще замене алгоритма.
nemesises
0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 42
08.11.2011, 21:22  [ТС]     помогите найти ошибку в программе #13
этот код который вы скинули насколько я понял уже отредактированый?
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
08.11.2011, 22:40     помогите найти ошибку в программе #14
Цитата Сообщение от nemesises Посмотреть сообщение
этот код который вы скинули насколько я понял уже отредактированый?
можно даже смело компилировать. только обратить внимание на то, что файл зовется CMatrix.hpp, и ничто не мешает его оредактировать в CMatrix.h
nemesises
0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 42
09.11.2011, 21:54  [ТС]     помогите найти ошибку в программе #15
но тут нету main
он ведь не сможет запустить
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
09.11.2011, 22:49     помогите найти ошибку в программе #16
Цитата Сообщение от nemesises Посмотреть сообщение
но тут нету main
он ведь не сможет запустить
не мочте голову, вам кто-то написал программу, тут ее довели до ума, а вы даже не удосужитесь открыть книгу и почитать самые азы.
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
09.11.2011, 22:57     помогите найти ошибку в программе #17
Цитата Сообщение от nemesises Посмотреть сообщение
но тут нету main
он ведь не сможет запустить
тут нету main?! какой ужас! ведь в каждом .hpp должно быть по main'у
просто используй тот main, который есть, а вместо своего cmatrix.h используй содержание этого :
Цитата Сообщение от alkagolik Посмотреть сообщение
так же подумайте как поменять алгоритм удаления строки, потому что, как видно из теста, в случае если 2 смежные строки подпадают под критерий удаления, то вторая не проверяется. Она перемещается на место первой и таким образом "выскальззывает" от проверки на наличие признаков удаления.
вот готовый голова.
Добавлено через 4 минуты
CMATRIX_HPP
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
09.11.2011, 23:03     помогите найти ошибку в программе #18
Цитата Сообщение от BRcr Посмотреть сообщение
так же подумайте как поменять алгоритм удаления строки, потому что, как видно из теста, в случае если 2 смежные строки подпадают под критерий удаления, то вторая не проверяется. Она перемещается на место первой и таким образом "выскальззывает" от проверки на наличие признаков удаления.
я и это подправил. хедер готовый до конца.
nemesises
0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 42
09.11.2011, 23:12  [ТС]     помогите найти ошибку в программе #19
не, всё равно он не делает что надо

Добавлено через 4 минуты
тю сорри не то открыл, всё заработало, спасибо
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2011, 23:14     помогите найти ошибку в программе
Еще ссылки по теме:

C++ Помогите найти ошибку в программе
C++ Помогите найти ошибку в программе сортировки массива
C++ Помогите найти ошибку в программе

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

Или воспользуйтесь поиском по форуму:
nemesises
0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 42
09.11.2011, 23:14  [ТС]     помогите найти ошибку в программе #20
та я с майном завтыкал просто
Yandex
Объявления
09.11.2011, 23:14     помогите найти ошибку в программе
Ответ Создать тему
Опции темы

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